diff --git a/.gitignore b/.gitignore index bf491ec3c2..41084c45cd 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,8 @@ file/* local/* _darcs/* logs/* +log/* +run/* config.php .htaccess httpd.conf @@ -27,3 +29,4 @@ php.log .DS_Store nbproject *.mo + diff --git a/CONFIGURE b/CONFIGURE new file mode 100644 index 0000000000..c5fac78730 --- /dev/null +++ b/CONFIGURE @@ -0,0 +1,870 @@ +Configuration options +===================== + +The main configuration file for StatusNet (excepting configurations for +dependency software) is config.php in your StatusNet directory. If you +edit any other file in the directory, like lib/default.php (where most +of the defaults are defined), you will lose your configuration options +in any upgrade, and you will wish that you had been more careful. + +Starting with version 0.9.0, a Web based configuration panel has been +added to StatusNet. The preferred method for changing config options is +to use this panel. + +A command-line script, setconfig.php, can be used to set individual +configuration options. It's in the scripts/ directory. + +Starting with version 0.7.1, you can put config files in the +/etc/statusnet/ directory on your server, if it exists. Config files +will be included in this order: + +* /etc/statusnet/statusnet.php - server-wide config +* /etc/statusnet/.php - for a virtual host +* /etc/statusnet/_.php - for a path +* INSTALLDIR/config.php - for a particular implementation + +Almost all configuration options are made through a two-dimensional +associative array, cleverly named $config. A typical configuration +line will be: + + $config['section']['option'] = value; + +For brevity, the following documentation describes each section and +option. + +site +---- + +This section is a catch-all for site-wide variables. + +name: the name of your site, like 'YourCompany Microblog'. +server: the server part of your site's URLs, like 'example.net'. +path: The path part of your site's URLs, like 'statusnet' or '' + (installed in root). +fancy: whether or not your site uses fancy URLs (see Fancy URLs + section above). Default is false. +logfile: full path to a file for StatusNet to save logging + information to. You may want to use this if you don't have + access to syslog. +logdebug: whether to log additional debug info like backtraces on + hard errors. Default false. +locale_path: full path to the directory for locale data. Unless you + store all your locale data in one place, you probably + don't need to use this. +language: default language for your site. Defaults to US English. + Note that this is overridden if a user is logged in and has + selected a different language. It is also overridden if the + user is NOT logged in, but their browser requests a different + langauge. Since pretty much everybody's browser requests a + language, that means that changing this setting has little or + no effect in practice. +languages: A list of languages supported on your site. Typically you'd + only change this if you wanted to disable support for one + or another language: + "unset($config['site']['languages']['de'])" will disable + support for German. +theme: Theme for your site (see Theme section). Two themes are + provided by default: 'default' and 'stoica' (the one used by + Identi.ca). It's appreciated if you don't use the 'stoica' theme + except as the basis for your own. +email: contact email address for your site. By default, it's extracted + from your Web server environment; you may want to customize it. +broughtbyurl: name of an organization or individual who provides the + service. Each page will include a link to this name in the + footer. A good way to link to the blog, forum, wiki, + corporate portal, or whoever is making the service available. +broughtby: text used for the "brought by" link. +timezone: default timezone for message display. Users can set their + own time zone. Defaults to 'UTC', which is a pretty good default. +closed: If set to 'true', will disallow registration on your site. + This is a cheap way to restrict accounts to only one + individual or group; just register the accounts you want on + the service, *then* set this variable to 'true'. +inviteonly: If set to 'true', will only allow registration if the user + was invited by an existing user. +private: If set to 'true', anonymous users will be redirected to the + 'login' page. Also, API methods that normally require no + authentication will require it. Note that this does not turn + off registration; use 'closed' or 'inviteonly' for the + behaviour you want. +notice: A plain string that will appear on every page. A good place + to put introductory information about your service, or info about + upgrades and outages, or other community info. Any HTML will + be escaped. +logo: URL of an image file to use as the logo for the site. Overrides + the logo in the theme, if any. +ssllogo: URL of an image file to use as the logo on SSL pages. If unset, + theme logo is used instead. +ssl: Whether to use SSL and https:// URLs for some or all pages. + Possible values are 'always' (use it for all pages), 'never' + (don't use it for any pages), or 'sometimes' (use it for + sensitive pages that include passwords like login and registration, + but not for regular pages). Default to 'never'. +sslserver: use an alternate server name for SSL URLs, like + 'secure.example.org'. You should be careful to set cookie + parameters correctly so that both the SSL server and the + "normal" server can access the session cookie and + preferably other cookies as well. +shorturllength: ignored. See 'url' section below. +dupelimit: minimum time allowed for one person to say the same thing + twice. Default 60s. Anything lower is considered a user + or UI error. +textlimit: default max size for texts in the site. Defaults to 0 (no limit). + Can be fine-tuned for notices, messages, profile bios and group descriptions. + +db +-- + +This section is a reference to the configuration options for +DB_DataObject (see ). The ones that you may want to +set are listed below for clarity. + +database: a DSN (Data Source Name) for your StatusNet database. This is + in the format 'protocol://username:password@hostname/databasename', + where 'protocol' is 'mysql' or 'mysqli' (or possibly 'postgresql', if you + really know what you're doing), 'username' is the username, + 'password' is the password, and etc. +ini_yourdbname: if your database is not named 'statusnet', you'll need + to set this to point to the location of the + statusnet.ini file. Note that the real name of your database + should go in there, not literally 'yourdbname'. +db_driver: You can try changing this to 'MDB2' to use the other driver + type for DB_DataObject, but note that it breaks the OpenID + libraries, which only support PEAR::DB. +debug: On a database error, you may get a message saying to set this + value to 5 to see debug messages in the browser. This breaks + just about all pages, and will also expose the username and + password +quote_identifiers: Set this to true if you're using postgresql. +type: either 'mysql' or 'postgresql' (used for some bits of + database-type-specific SQL in the code). Defaults to mysql. +mirror: you can set this to an array of DSNs, like the above + 'database' value. If it's set, certain read-only actions will + use a random value out of this array for the database, rather + than the one in 'database' (actually, 'database' is overwritten). + You can offload a busy DB server by setting up MySQL replication + and adding the slaves to this array. Note that if you want some + requests to go to the 'database' (master) server, you'll need + to include it in this array, too. +utf8: whether to talk to the database in UTF-8 mode. This is the default + with new installations, but older sites may want to turn it off + until they get their databases fixed up. See "UTF-8 database" + above for details. +schemacheck: when to let plugins check the database schema to add + tables or update them. Values can be 'runtime' (default) + or 'script'. 'runtime' can be costly (plugins check the + schema on every hit, adding potentially several db + queries, some quite long), but not everyone knows how to + run a script. If you can, set this to 'script' and run + scripts/checkschema.php whenever you install or upgrade a + plugin. + +syslog +------ + +By default, StatusNet sites log error messages to the syslog facility. +(You can override this using the 'logfile' parameter described above). + +appname: The name that StatusNet uses to log messages. By default it's + "statusnet", but if you have more than one installation on the + server, you may want to change the name for each instance so + you can track log messages more easily. +priority: level to log at. Currently ignored. +facility: what syslog facility to used. Defaults to LOG_USER, only + reset if you know what syslog is and have a good reason + to change it. + +queue +----- + +You can configure the software to queue time-consuming tasks, like +sending out SMS email or XMPP messages, for off-line processing. See +'Queues and daemons' above for how to set this up. + +enabled: Whether to uses queues. Defaults to false. +subsystem: Which kind of queueserver to use. Values include "db" for + our hacked-together database queuing (no other server + required) and "stomp" for a stomp server. +stomp_server: "broker URI" for stomp server. Something like + "tcp://hostname:61613". More complicated ones are + possible; see your stomp server's documentation for + details. +queue_basename: a root name to use for queues (stomp only). Typically + something like '/queue/sitename/' makes sense. If running + multiple instances on the same server, make sure that + either this setting or $config['site']['nickname'] are + unique for each site to keep them separate. + +stomp_username: username for connecting to the stomp server; defaults + to null. +stomp_password: password for connecting to the stomp server; defaults + to null. + +stomp_persistent: keep items across queue server restart, if enabled. + Under ActiveMQ, the server configuration determines if and how + persistent storage is actually saved. + + If using a message queue server other than ActiveMQ, you may + need to disable this if it does not support persistence. + +stomp_transactions: use transactions to aid in error detection. + A broken transaction will be seen quickly, allowing a message + to be redelivered immediately if a daemon crashes. + + If using a message queue server other than ActiveMQ, you may + need to disable this if it does not support transactions. + +stomp_acks: send acknowledgements to aid in flow control. + An acknowledgement of successful processing tells the server + we're ready for more and can help keep things moving smoothly. + + This should *not* be turned off when running with ActiveMQ, but + if using another message queue server that does not support + acknowledgements you might need to disable this. + +softlimit: an absolute or relative "soft memory limit"; daemons will + restart themselves gracefully when they find they've hit + this amount of memory usage. Defaults to 90% of PHP's global + memory_limit setting. + +inboxes: delivery of messages to receiver's inboxes can be delayed to + queue time for best interactive performance on the sender. + This may however be annoyingly slow when using the DB queues, + so you can set this to false if it's causing trouble. + +breakout: for stomp, individual queues are by default grouped up for + best scalability. If some need to be run by separate daemons, + etc they can be manually adjusted here. + + Default will share all queues for all sites within each group. + Specify as / or //, + using nickname identifier as site. + + 'main/distrib' separate "distrib" queue covering all sites + 'xmpp/xmppout/mysite' separate "xmppout" queue covering just 'mysite' + +max_retries: for stomp, drop messages after N failed attempts to process. + Defaults to 10. + +dead_letter_dir: for stomp, optional directory to dump data on failed + queue processing events after discarding them. + +stomp_no_transactions: for stomp, the server does not support transactions, + so do not try to user them. This is needed for http://www.morbidq.com/. + +stomp_no_acks: for stomp, the server does not support acknowledgements. + so do not try to user them. This is needed for http://www.morbidq.com/. + +license +------- + +The default license to use for your users notices. The default is the +Creative Commons Attribution 3.0 license, which is probably the right +choice for any public site. Note that some other servers will not +accept notices if you apply a stricter license than this. + +type: one of 'cc' (for Creative Commons licenses), 'allrightsreserved' + (default copyright), or 'private' (for private and confidential + information). +owner: for 'allrightsreserved' or 'private', an assigned copyright + holder (for example, an employer for a private site). If + not specified, will be attributed to 'contributors'. +url: URL of the license, used for links. +title: Title for the license, like 'Creative Commons Attribution 3.0'. +image: A button shown on each page for the license. + +mail +---- + +This is for configuring out-going email. We use PEAR's Mail module, +see: http://pear.php.net/manual/en/package.mail.mail.factory.php + +backend: the backend to use for mail, one of 'mail', 'sendmail', and + 'smtp'. Defaults to PEAR's default, 'mail'. +params: if the mail backend requires any parameters, you can provide + them in an associative array. + +nickname +-------- + +This is for configuring nicknames in the service. + +blacklist: an array of strings for usernames that may not be + registered. A default array exists for strings that are + used by StatusNet (e.g. 'doc', 'main', 'avatar', 'theme') + but you may want to add others if you have other software + installed in a subdirectory of StatusNet or if you just + don't want certain words used as usernames. +featured: an array of nicknames of 'featured' users of the site. + Can be useful to draw attention to well-known users, or + interesting people, or whatever. + +avatar +------ + +For configuring avatar access. + +dir: Directory to look for avatar files and to put them into. + Defaults to avatar subdirectory of install directory; if + you change it, make sure to change path, too. +path: Path to avatars. Defaults to path for avatar subdirectory, + but you can change it if you wish. Note that this will + be included with the avatar server, too. +server: If set, defines another server where avatars are stored in the + root directory. Note that the 'avatar' subdir still has to be + writeable. You'd typically use this to split HTTP requests on + the client to speed up page loading, either with another + virtual server or with an NFS or SAMBA share. Clients + typically only make 2 connections to a single server at a + time , so this can parallelize the job. + Defaults to null. +ssl: Whether to access avatars using HTTPS. Defaults to null, meaning + to guess based on site-wide SSL settings. + +public +------ + +For configuring the public stream. + +localonly: If set to true, only messages posted by users of this + service (rather than other services, filtered through OStatus) + are shown in the public stream. Default true. +blacklist: An array of IDs of users to hide from the public stream. + Useful if you have someone making excessive Twitterfeed posts + to the site, other kinds of automated posts, testing bots, etc. +autosource: Sources of notices that are from automatic posters, and thus + should be kept off the public timeline. Default empty. + +theme +----- + +server: Like avatars, you can speed up page loading by pointing the + theme file lookup to another server (virtual or real). + Defaults to NULL, meaning to use the site server. +dir: Directory where theme files are stored. Used to determine + whether to show parts of a theme file. Defaults to the theme + subdirectory of the install directory. +path: Path part of theme URLs, before the theme name. Relative to the + theme server. It may make sense to change this path when upgrading, + (using version numbers as the path) to make sure that all files are + reloaded by caching clients or proxies. Defaults to null, + which means to use the site path + '/theme'. +ssl: Whether to use SSL for theme elements. Default is null, which means + guess based on site SSL settings. +sslserver: SSL server to use when page is HTTPS-encrypted. If + unspecified, site ssl server and so on will be used. +sslpath: If sslserver if defined, path to use when page is HTTPS-encrypted. + +javascript +---------- + +server: You can speed up page loading by pointing the + theme file lookup to another server (virtual or real). + Defaults to NULL, meaning to use the site server. +path: Path part of Javascript URLs. Defaults to null, + which means to use the site path + '/js/'. +ssl: Whether to use SSL for JavaScript files. Default is null, which means + guess based on site SSL settings. +sslserver: SSL server to use when page is HTTPS-encrypted. If + unspecified, site ssl server and so on will be used. +sslpath: If sslserver if defined, path to use when page is HTTPS-encrypted. +bustframes: If true, all web pages will break out of framesets. If false, + can comfortably live in a frame or iframe... probably. Default + to true. + +xmpp +---- + +For configuring the XMPP sub-system. + +enabled: Whether to accept and send messages by XMPP. Default false. +server: server part of XMPP ID for update user. +port: connection port for clients. Default 5222, which you probably + shouldn't need to change. +user: username for the client connection. Users will receive messages + from 'user'@'server'. +resource: a unique identifier for the connection to the server. This + is actually used as a prefix for each XMPP component in the system. +password: password for the user account. +host: some XMPP domains are served by machines with a different + hostname. (For example, @gmail.com GTalk users connect to + talk.google.com). Set this to the correct hostname if that's the + case with your server. +encryption: Whether to encrypt the connection between StatusNet and the + XMPP server. Defaults to true, but you can get + considerably better performance turning it off if you're + connecting to a server on the same machine or on a + protected network. +debug: if turned on, this will make the XMPP library blurt out all of + the incoming and outgoing messages as XML stanzas. Use as a + last resort, and never turn it on if you don't have queues + enabled, since it will spit out sensitive data to the browser. +public: an array of JIDs to send _all_ notices to. This is useful for + participating in third-party search and archiving services. + +invite +------ + +For configuring invites. + +enabled: Whether to allow users to send invites. Default true. + +tag +--- + +Miscellaneous tagging stuff. + +dropoff: Decay factor for tag listing, in seconds. + Defaults to exponential decay over ten days; you can twiddle + with it to try and get better results for your site. + +popular +------- + +Settings for the "popular" section of the site. + +dropoff: Decay factor for popularity listing, in seconds. + Defaults to exponential decay over ten days; you can twiddle + with it to try and get better results for your site. + +daemon +------ + +For daemon processes. + +piddir: directory that daemon processes should write their PID file + (process ID) to. Defaults to /var/run/, which is where this + stuff should usually go on Unix-ish systems. +user: If set, the daemons will try to change their effective user ID + to this user before running. Probably a good idea, especially if + you start the daemons as root. Note: user name, like 'daemon', + not 1001. +group: If set, the daemons will try to change their effective group ID + to this named group. Again, a name, not a numerical ID. + +memcached +--------- + +You can get a significant boost in performance by caching some +database data in memcached . + +enabled: Set to true to enable. Default false. +server: a string with the hostname of the memcached server. Can also + be an array of hostnames, if you've got more than one server. +base: memcached uses key-value pairs to store data. We build long, + funny-looking keys to make sure we don't have any conflicts. The + base of the key is usually a simplified version of the site name + (like "Identi.ca" => "identica"), but you can overwrite this if + you need to. You can safely ignore it if you only have one + StatusNet site using your memcached server. +port: Port to connect to; defaults to 11211. + +emailpost +--------- + +For post-by-email. + +enabled: Whether to enable post-by-email. Defaults to true. You will + also need to set up maildaemon.php. + +sms +--- + +For SMS integration. + +enabled: Whether to enable SMS integration. Defaults to true. Queues + should also be enabled. + +integration +----------- + +A catch-all for integration with other systems. + +taguri: base for tag:// URIs. Defaults to site-server + ',2009'. + +inboxes +------- + +For notice inboxes. + +enabled: No longer used. If you set this to something other than true, + StatusNet will no longer run. + +throttle +-------- + +For notice-posting throttles. + +enabled: Whether to throttle posting. Defaults to false. +count: Each user can make this many posts in 'timespan' seconds. So, if count + is 100 and timespan is 3600, then there can be only 100 posts + from a user every hour. +timespan: see 'count'. + +profile +------- + +Profile management. + +biolimit: max character length of bio; 0 means no limit; null means to use + the site text limit default. +backup: whether users can backup their own profiles. Defaults to true. +restore: whether users can restore their profiles from backup files. Defaults + to true. +delete: whether users can delete their own accounts. Defaults to false. +move: whether users can move their accounts to another server. Defaults + to true. + +newuser +------- + +Options with new users. + +default: nickname of a user account to automatically subscribe new + users to. Typically this would be system account for e.g. + service updates or announcements. Users are able to unsub + if they want. Default is null; no auto subscribe. +welcome: nickname of a user account that sends welcome messages to new + users. Can be the same as 'default' account, although on + busy servers it may be a good idea to keep that one just for + 'urgent' messages. Default is null; no message. + +If either of these special user accounts are specified, the users should +be created before the configuration is updated. + +snapshot +-------- + +The software will, by default, send statistical snapshots about the +local installation to a stats server on the status.net Web site. This +data is used by the developers to prioritize development decisions. No +identifying data about users or organizations is collected. The data +is available to the public for review. Participating in this survey +helps StatusNet developers take your needs into account when updating +the software. + +run: string indicating when to run the statistics. Values can be 'web' + (run occasionally at Web time), 'cron' (run from a cron script), + or 'never' (don't ever run). If you set it to 'cron', remember to + schedule the script to run on a regular basis. +frequency: if run value is 'web', how often to report statistics. + Measured in Web hits; depends on how active your site is. + Default is 10000 -- that is, one report every 10000 Web hits, + on average. +reporturl: URL to post statistics to. Defaults to StatusNet developers' + report system, but if they go evil or disappear you may + need to update this to another value. Note: if you + don't want to report stats, it's much better to + set 'run' to 'never' than to set this value to something + nonsensical. + +attachments +----------- + +The software lets users upload files with their notices. You can configure +the types of accepted files by mime types and a trio of quota options: +per file, per user (total), per user per month. + +We suggest the use of the pecl file_info extension to handle mime type +detection. + +supported: an array of mime types you accept to store and distribute, + like 'image/gif', 'video/mpeg', 'audio/mpeg', etc. Make sure you + setup your server to properly recognize the types you want to + support. +uploads: false to disable uploading files with notices (true by default). +filecommand: The required MIME_Type library may need to use the 'file' + command. It tries the one in the Web server's path, but if + you're having problems with uploads, try setting this to the + correct value. Note: 'file' must accept '-b' and '-i' options. + +For quotas, be sure you've set the upload_max_filesize and post_max_size +in php.ini to be large enough to handle your upload. In httpd.conf +(if you're using apache), check that the LimitRequestBody directive isn't +set too low (it's optional, so it may not be there at all). + +file_quota: maximum size for a single file upload in bytes. A user can send + any amount of notices with attachments as long as each attachment + is smaller than file_quota. +user_quota: total size in bytes a user can store on this server. Each user + can store any number of files as long as their total size does + not exceed the user_quota. +monthly_quota: total size permitted in the current month. This is the total + size in bytes that a user can upload each month. +dir: directory accessible to the Web process where uploads should go. + Defaults to the 'file' subdirectory of the install directory, which + should be writeable by the Web user. +server: server name to use when creating URLs for uploaded files. + Defaults to null, meaning to use the default Web server. Using + a virtual server here can speed up Web performance. +path: URL path, relative to the server, to find files. Defaults to + main path + '/file/'. +ssl: whether to use HTTPS for file URLs. Defaults to null, meaning to + guess based on other SSL settings. +filecommand: command to use for determining the type of a file. May be + skipped if fileinfo extension is installed. Defaults to + '/usr/bin/file'. +sslserver: if specified, this server will be used when creating HTTPS + URLs. Otherwise, the site SSL server will be used, with /file/ path. +sslpath: if this and the sslserver are specified, this path will be used + when creating HTTPS URLs. Otherwise, the attachments|path value + will be used. + +group +----- + +Options for group functionality. + +maxaliases: maximum number of aliases a group can have. Default 3. Set + to 0 or less to prevent aliases in a group. +desclimit: maximum number of characters to allow in group descriptions. + null (default) means to use the site-wide text limits. 0 + means no limit. +addtag: Whether to add a tag for the group nickname for every group post + (pre-1.0.x behaviour). Defaults to false. + +oembed +-------- + +oEmbed endpoint for multimedia attachments (links in posts). Will also +work as 'oohembed' for backwards compatibility. + +endpoint: oohembed endpoint using http://oohembed.com/ software. Defaults to + 'http://oohembed.com/oohembed/'. +order: Array of methods to check for OEmbed data. Methods include 'built-in' + (use a built-in function to simulate oEmbed for some sites), + 'well-known' (use well-known public oEmbed endpoints), + 'discovery' (discover using headers in HTML), 'service' (use + a third-party service, like oohembed or embed.ly. Default is + array('built-in', 'well-known', 'service', 'discovery'). Note that very + few sites implement oEmbed; 'discovery' is going to fail 99% of the + time. + +search +------ + +Some stuff for search. + +type: type of search. Ignored if PostgreSQL or Sphinx are enabled. Can either + be 'fulltext' or 'like' (default). The former is faster and more efficient + but requires the lame old MyISAM engine for MySQL. The latter + will work with InnoDB but could be miserably slow on large + systems. We'll probably add another type sometime in the future, + with our own indexing system (maybe like MediaWiki's). + +sessions +-------- + +Session handling. + +handle: boolean. Whether we should register our own PHP session-handling + code (using the database and memcache if enabled). Defaults to false. + Setting this to true makes some sense on large or multi-server + sites, but it probably won't hurt for smaller ones, either. +debug: whether to output debugging info for session storage. Can help + with weird session bugs, sometimes. Default false. + +background +---------- + +Users can upload backgrounds for their pages; this section defines +their use. + +server: the server to use for background. Using a separate (even + virtual) server for this can speed up load times. Default is + null; same as site server. +dir: directory to write backgrounds too. Default is '/background/' + subdir of install dir. +path: path to backgrounds. Default is sub-path of install path; note + that you may need to change this if you change site-path too. +sslserver: SSL server to use when page is HTTPS-encrypted. If + unspecified, site ssl server and so on will be used. +sslpath: If sslserver if defined, path to use when page is HTTPS-encrypted. + +ping +---- + +Using the "XML-RPC Ping" method initiated by weblogs.com, the site can +notify third-party servers of updates. + +notify: an array of URLs for ping endpoints. Default is the empty + array (no notification). + +design +------ + +Default design (colors and background) for the site. Actual appearance +depends on the theme. Null values mean to use the theme defaults. + +backgroundcolor: Hex color of the site background. +contentcolor: Hex color of the content area background. +sidebarcolor: Hex color of the sidebar background. +textcolor: Hex color of all non-link text. +linkcolor: Hex color of all links. +backgroundimage: Image to use for the background. +disposition: Flags for whether or not to tile the background image. + +notice +------ + +Configuration options specific to notices. + +contentlimit: max length of the plain-text content of a notice. + Default is null, meaning to use the site-wide text limit. + 0 means no limit. +defaultscope: default scope for notices. If null, the default + scope depends on site/private. It's 1 if the site is private, + 0 otherwise. Set this value to override. + +message +------- + +Configuration options specific to messages. + +contentlimit: max length of the plain-text content of a message. + Default is null, meaning to use the site-wide text limit. + 0 means no limit. + +logincommand +------------ + +Configuration options for the login command. + +disabled: whether to enable this command. If enabled, users who send + the text 'login' to the site through any channel will + receive a link to login to the site automatically in return. + Possibly useful for users who primarily use an XMPP or SMS + interface and can't be bothered to remember their site + password. Note that the security implications of this are + pretty serious and have not been thoroughly tested. You + should enable it only after you've convinced yourself that + it is safe. Default is 'false'. + +singleuser +---------- + +If an installation has only one user, this can simplify a lot of the +interface. It also makes the user's profile the root URL. + +enabled: Whether to run in "single user mode". Default false. +nickname: nickname of the single user. If no nickname is specified, + the site owner account will be used (if present). + +robotstxt +--------- + +We put out a default robots.txt file to guide the processing of +Web crawlers. See http://www.robotstxt.org/ for more information +on the format of this file. + +crawldelay: if non-empty, this value is provided as the Crawl-Delay: + for the robots.txt file. see http://ur1.ca/l5a0 + for more information. Default is zero, no explicit delay. +disallow: Array of (virtual) directories to disallow. Default is 'main', + 'search', 'message', 'settings', 'admin'. Ignored when site + is private, in which case the entire site ('/') is disallowed. + +api +--- + +Options for the Twitter-like API. + +realm: HTTP Basic Auth realm (see http://tools.ietf.org/html/rfc2617 + for details). Some third-party tools like ping.fm want this to be + 'Identi.ca API', so set it to that if you want to. default = null, + meaning 'something based on the site name'. + +nofollow +-------- + +We optionally put 'rel="nofollow"' on some links in some pages. The +following configuration settings let you fine-tune how or when things +are nofollowed. See http://en.wikipedia.org/wiki/Nofollow for more +information on what 'nofollow' means. + +subscribers: whether to nofollow links to subscribers on the profile + and personal pages. Default is true. +members: links to members on the group page. Default true. +peopletag: links to people listed in the peopletag page. Default true. +external: external links in notices. One of three values: 'sometimes', + 'always', 'never'. If 'sometimes', then external links are not + nofollowed on profile, notice, and favorites page. Default is + 'sometimes'. + +url +--- + +Everybody loves URL shorteners. These are some options for fine-tuning +how and when the server shortens URLs. + +shortener: URL shortening service to use by default. Users can override + individually. 'ur1.ca' by default. +maxlength: If an URL is strictly longer than this limit, it will be + shortened. Note that the URL shortener service may return an + URL longer than this limit. Defaults to 25. Users can + override. If set to 0, all URLs will be shortened. +maxnoticelength: If a notice is strictly longer than this limit, all + URLs in the notice will be shortened. Users can override. + -1 means the text limit for notices. + +router +------ + +We use a router class for mapping URLs to code. This section controls +how that router works. + +cache: whether to cache the router in memcache (or another caching + mechanism). Defaults to true, but may be set to false for + developers (who might be actively adding pages, so won't want the + router cached) or others who see strange behavior. You're unlikely + to need this unless you're a developer. + +http +---- + +Settings for the HTTP client. + +ssl_cafile: location of the CA file for SSL. If not set, won't verify + SSL peers. Default unset. +curl: Use cURL for doing HTTP calls. You must + have the PHP curl extension installed for this to work. +proxy_host: Host to use for proxying HTTP requests. If unset, doesn't + do any HTTP proxy stuff. Default unset. +proxy_port: Port to use to connect to HTTP proxy host. Default null. +proxy_user: Username to use for authenticating to the HTTP proxy. Default null. +proxy_password: Password to use for authenticating to the HTTP proxy. Default null. +proxy_auth_scheme: Scheme to use for authenticating to the HTTP proxy. Default null. + +plugins +------- + +default: associative array mapping plugin name to array of arguments. To disable + a default plugin, unset its value in this array. +locale_path: path for finding plugin locale files. In the plugin's directory + by default. +server: Server to find static files for a plugin when the page is plain old HTTP. + Defaults to site/server (same as pages). Use this to move plugin CSS and + JS files to a CDN. +sslserver: Server to find static files for a plugin when the page is HTTPS. Defaults + to site/server (same as pages). Use this to move plugin CSS and JS files + to a CDN. +path: Path to the plugin files. defaults to site/path + '/plugins/'. Expects that + each plugin will have a subdirectory at plugins/NameOfPlugin. Change this + if you're using a CDN. +sslpath: Path to use on the SSL server. Same as plugins/path. + +performance +----------- + +high: if you need high performance, or if you're seeing bad + performance, set this to true. It will turn off some high-intensity code from + the site. + +oldschool +--------- + +enabled: enable certain old-style user settings options, like stream-only mode, + conversation trees, and nicknames in streams. Off by default, and + may not be well supported in future versions. + + diff --git a/EVENTS.txt b/EVENTS.txt index 0a9759c246..49940e467f 100644 --- a/EVENTS.txt +++ b/EVENTS.txt @@ -1418,3 +1418,41 @@ StartShowInvitationSuccess: Right before showing invitations success msg EndShowInvitationSuccess: After showing invitations success msg - $action: invitation action +StartUpgrade: when starting a site upgrade + +EndUpgrade: when ending a site upgrade; good place to do your own upgrades + +HaveIMPlugin: is there an IM plugin loaded? +- &$haveIMPlugin: set me to true if you're loaded! + +StartShowNoticeOptionItems: Before showing first controls in a notice list item; inside the div +- $nli: NoticeListItem being shown + +EndShowNoticeOptionItems: After showing last controls in a notice list item; inside the div +- $nli: NoticeListItem being shown + +StartNoticeInScope: Before checking if a notice should be visible to a user +- $notice: The notice to check +- $profile: The profile to check for scope +- &$bResult: The boolean result; fill this in if you want to skip + +EndNoticeInScope: After checking if a notice should be visible to a user +- $notice: The notice to check +- $profile: The profile to check for scope +- &$bResult: The boolean result; overwrite this if you so desire + +StartNoticeListPrefill: Before pre-filling a list of notices with extra data +- &$notices: Notices to be pre-filled +- $avatarSize: The avatar size for the list + +EndNoticeListPrefill: After pre-filling a list of notices with extra data +- &$notices: Notices that were pre-filled +- &$profiles: Profiles that were pre-filled +- $avatarSize: The avatar size for the list + +OtherAccountProfiles: Hook to add account profiles to a user account profile block +- $profile: the Profile being shown +- &$others: Modifiable array of profile info arrays. Each one has the following fields: + href: link to the profile + text: text for the profile + image: mini image for the profile diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000000..2508acd7e5 --- /dev/null +++ b/INSTALL @@ -0,0 +1,516 @@ +Prerequisites +============= + +The following software packages are *required* for this software to +run correctly. + +- PHP 5.2.3+. It may be possible to run this software on earlier + versions of PHP, but many of the functions used are only available + in PHP 5.2 or above. 5.2.6 or later is needed for XMPP background + daemons on 64-bit platforms. PHP 5.3.x should work correctly in this + release, but problems with some plugins are possible. +- MySQL 5.x. The StatusNet database is stored, by default, in a MySQL + server. It has been primarily tested on 5.x servers, although it may + be possible to install on earlier (or later!) versions. The server + *must* support the MyISAM storage engine -- the default for most + MySQL servers -- *and* the InnoDB storage engine. +- A Web server. Preferably, you should have Apache 2.2.x with the + mod_rewrite extension installed and enabled. + +Your PHP installation must include the following PHP extensions: + +- Curl. This is for fetching files by HTTP. +- XMLWriter. This is for formatting XML and HTML output. +- MySQL. For accessing the database. +- GD. For scaling down avatar images. +- mbstring. For handling Unicode (UTF-8) encoded strings. + +For some functionality, you will also need the following extensions: + +- Memcache. A client for the memcached server, which caches database + information in volatile memory. This is important for adequate + performance on high-traffic sites. You will also need a memcached + server to store the data in. +- Mailparse. Efficient parsing of email requires this extension. + Submission by email or SMS-over-email uses this extension. +- Sphinx Search. A client for the sphinx server, an alternative + to MySQL or Postgresql fulltext search. You will also need a + Sphinx server to serve the search queries. +- bcmath or gmp. For Salmon signatures (part of OStatus). Needed + if you have OStatus configured. +- gettext. For multiple languages. Default on many PHP installs; + will be emulated if not present. + +You will almost definitely get 2-3 times better performance from your +site if you install a PHP bytecode cache/accelerator. Some well-known +examples are: eaccelerator, Turck mmcache, xcache, apc. Zend Optimizer +is a proprietary accelerator installed on some hosting sites. + +External libraries +------------------ + +A number of external PHP libraries are used to provide basic +functionality and optional functionality for your system. For your +convenience, they are available in the "extlib" directory of this +package, and you do not have to download and install them. However, +you may want to keep them up-to-date with the latest upstream version, +and the URLs are listed here for your convenience. + +- DB_DataObject http://pear.php.net/package/DB_DataObject +- Validate http://pear.php.net/package/Validate +- OpenID from OpenIDEnabled (not the PEAR version!). We decided + to use the openidenabled.com version since it's more widely + implemented, and seems to be better supported. + http://openidenabled.com/php-openid/ +- PEAR DB. Although this is an older data access system (new + packages should probably use PHP DBO), the OpenID libraries + depend on PEAR DB so we use it here, too. DB_DataObject can + also use PEAR MDB2, which may give you better performance + but won't work with OpenID. + http://pear.php.net/package/DB +- OAuth.php from http://oauth.googlecode.com/svn/code/php/ +- markdown.php from http://michelf.com/projects/php-markdown/ +- PEAR Mail, for sending out mail notifications + http://pear.php.net/package/Mail +- PEAR Net_SMTP, if you use the SMTP factory for notifications + http://pear.php.net/package/Net_SMTP +- PEAR Net_Socket, if you use the SMTP factory for notifications + http://pear.php.net/package/Net_Socket +- XMPPHP, the follow-up to Class.Jabber.php. Probably the best XMPP + library available for PHP. http://xmpphp.googlecode.com/. Note that + as of this writing the version of this library that is available in + the extlib directory is *significantly different* from the upstream + version (patches have been submitted). Upgrading to the upstream + version may render your StatusNet site unable to send or receive XMPP + messages. +- Facebook library. Used for the Facebook application. +- PEAR Validate is used for URL and email validation. +- Console_GetOpt for parsing command-line options. + predecessor to OStatus. +- HTTP_Request2, a library for making HTTP requests. +- PEAR Net_URL2 is an HTTP_Request2 dependency. + +A design goal of StatusNet is that the basic Web functionality should +work on even the most restrictive commercial hosting services. +However, additional functionality, such as receiving messages by +Jabber/GTalk, require that you be able to run long-running processes +on your account. In addition, posting by email or from SMS require +that you be able to install a mail filter in your mail server. + +Installation +============ + +Installing the basic StatusNet Web component is relatively easy, +especially if you've previously installed PHP/MySQL packages. + +1. Unpack the tarball you downloaded on your Web server. Usually a + command like this will work: + + tar zxf statusnet-1.1.1.tar.gz + + ...which will make a statusnet-1.1.1 subdirectory in your current + directory. (If you don't have shell access on your Web server, you + may have to unpack the tarball on your local computer and FTP the + files to the server.) + +2. Move the tarball to a directory of your choosing in your Web root + directory. Usually something like this will work: + + mv statusnet-1.1.1 /var/www/statusnet + + This will make your StatusNet instance available in the statusnet path of + your server, like "http://example.net/statusnet". "microblog" or + "statusnet" might also be good path names. If you know how to + configure virtual hosts on your web server, you can try setting up + "http://micro.example.net/" or the like. + +3. Make your target directory writeable by the Web server. + + chmod a+w /var/www/statusnet/ + + On some systems, this will probably work: + + chgrp www-data /var/www/statusnet/ + chmod g+w /var/www/statusnet/ + + If your Web server runs as another user besides "www-data", try + that user's default group instead. As a last resort, you can create + a new group like "statusnet" and add the Web server's user to the group. + +4. You should also take this moment to make your avatar, background, and + file subdirectories writeable by the Web server. An insecure way to do + this is: + + chmod a+w /var/www/statusnet/avatar + chmod a+w /var/www/statusnet/background + chmod a+w /var/www/statusnet/file + + You can also make the avatar, background, and file directories + writeable by the Web server group, as noted above. + +5. Create a database to hold your microblog data. Something like this + should work: + + mysqladmin -u "username" --password="password" create statusnet + + Note that StatusNet must have its own database; you can't share the + database with another program. You can name it whatever you want, + though. + + (If you don't have shell access to your server, you may need to use + a tool like PHPAdmin to create a database. Check your hosting + service's documentation for how to create a new MySQL database.) + +6. Create a new database account that StatusNet will use to access the + database. If you have shell access, this will probably work from the + MySQL shell: + + GRANT ALL on statusnet.* + TO 'statusnetuser'@'localhost' + IDENTIFIED BY 'statusnetpassword'; + + You should change 'statusnetuser' and 'statusnetpassword' to your preferred new + username and password. You may want to test logging in to MySQL as + this new user. + +7. In a browser, navigate to the StatusNet install script; something like: + + http://yourserver.example.com/statusnet/install.php + + Enter the database connection information and your site name. The + install program will configure your site and install the initial, + almost-empty database. + +8. You should now be able to navigate to your microblog's main directory + and see the "Public Timeline", which will be empty. If not, magic + has happened! You can now register a new user, post some notices, + edit your profile, etc. However, you may want to wait to do that stuff + if you think you can set up "fancy URLs" (see below), since some + URLs are stored in the database. + +Fancy URLs +---------- + +By default, StatusNet will use URLs that include the main PHP program's +name in them. For example, a user's home profile might be +found at: + + http://example.org/statusnet/index.php/statusnet/fred + +On certain systems that don't support this kind of syntax, they'll +look like this: + + http://example.org/statusnet/index.php?p=statusnet/fred + +It's possible to configure the software so it looks like this instead: + + http://example.org/statusnet/fred + +These "fancy URLs" are more readable and memorable for users. To use +fancy URLs, you must either have Apache 2.x with .htaccess enabled and +mod_rewrite enabled, -OR- know how to configure "url redirection" in +your server. + +1. Copy the htaccess.sample file to .htaccess in your StatusNet + directory. Note: if you have control of your server's httpd.conf or + similar configuration files, it can greatly improve performance to + import the .htaccess file into your conf file instead. If you're + not sure how to do it, you may save yourself a lot of headache by + just leaving the .htaccess file. + +2. Change the "RewriteBase" in the new .htaccess file to be the URL path + to your StatusNet installation on your server. Typically this will + be the path to your StatusNet directory relative to your Web root. + +3. Add or uncomment or change a line in your config.php file so it says: + + $config['site']['fancy'] = true; + +You should now be able to navigate to a "fancy" URL on your server, +like: + + http://example.net/statusnet/main/register + +If you changed your HTTP server configuration, you may need to restart +the server first. + +If it doesn't work, double-check that AllowOverride for the StatusNet +directory is 'All' in your Apache configuration file. This is usually +/etc/httpd.conf, /etc/apache/httpd.conf, or (on Debian and Ubuntu) +/etc/apache2/sites-available/default. See the Apache documentation for +.htaccess files for more details: + + http://httpd.apache.org/docs/2.2/howto/htaccess.html + +Also, check that mod_rewrite is installed and enabled: + + http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html + +Sphinx +------ + +To use a Sphinx server to search users and notices, you'll need to +enable the SphinxSearch plugin. Add to your config.php: + + addPlugin('SphinxSearch'); + $config['sphinx']['server'] = 'searchhost.local'; + +You also need to install, compile and enable the sphinx pecl extension for +php on the client side, which itself depends on the sphinx development files. + +See plugins/SphinxSearch/README for more details and server setup. + +SMS +--- + +StatusNet supports a cheap-and-dirty system for sending update messages +to mobile phones and for receiving updates from the mobile. Instead of +sending through the SMS network itself, which is costly and requires +buy-in from the wireless carriers, it simply piggybacks on the email +gateways that many carriers provide to their customers. So, SMS +configuration is essentially email configuration. + +Each user sends to a made-up email address, which they keep a secret. +Incoming email that is "From" the user's SMS email address, and "To" +the users' secret email address on the site's domain, will be +converted to a notice and stored in the DB. + +For this to work, there *must* be a domain or sub-domain for which all +(or most) incoming email can pass through the incoming mail filter. + +1. Run the SQL script carrier.sql in your StatusNet database. This will + usually work: + + mysql -u "statusnetuser" --password="statusnetpassword" statusnet < db/carrier.sql + + This will populate your database with a list of wireless carriers + that support email SMS gateways. + +2. Make sure the maildaemon.php file is executable: + + chmod +x scripts/maildaemon.php + + Note that "daemon" is kind of a misnomer here; the script is more + of a filter than a daemon. + +2. Edit /etc/aliases on your mail server and add the following line: + + *: /path/to/statusnet/scripts/maildaemon.php + +3. Run whatever code you need to to update your aliases database. For + many mail servers (Postfix, Exim, Sendmail), this should work: + + newaliases + + You may need to restart your mail server for the new database to + take effect. + +4. Set the following in your config.php file: + + $config['mail']['domain'] = 'yourdomain.example.net'; + +At this point, post-by-email and post-by-SMS-gateway should work. Note +that if your mail server is on a different computer from your email +server, you'll need to have a full installation of StatusNet, a working +config.php, and access to the StatusNet database from the mail server. + +XMPP +---- + +XMPP (eXtended Message and Presence Protocol, ) is the +instant-messenger protocol that drives Jabber and GTalk IM. You can +distribute messages via XMPP using the system below; however, you +need to run the XMPP incoming daemon to allow incoming messages as +well. + +1. You may want to strongly consider setting up your own XMPP server. + Ejabberd, OpenFire, and JabberD are all Open Source servers. + Jabber, Inc. provides a high-performance commercial server. + +2. You must register a Jabber ID (JID) with your new server. It helps + to choose a name like "update@example.com" or "notice" or something + similar. Alternately, your "update JID" can be registered on a + publicly-available XMPP service, like jabber.org or GTalk. + + StatusNet will not register the JID with your chosen XMPP server; + you need to do this manually, with an XMPP client like Gajim, + Telepathy, or Pidgin.im. + +3. Configure your site's XMPP variables, as described below in the + configuration section. + +On a default installation, your site can broadcast messages using +XMPP. Users won't be able to post messages using XMPP unless you've +got the XMPP daemon running. See 'Queues and daemons' below for how +to set that up. Also, once you have a sizable number of users, sending +a lot of SMS, OStatus, and XMPP messages whenever someone posts a message +can really slow down your site; it may cause posting to timeout. + +NOTE: stream_select(), a crucial function for network programming, is +broken on PHP 5.2.x less than 5.2.6 on amd64-based servers. We don't +work around this bug in StatusNet; current recommendation is to move +off of amd64 to another server. + +Public feed +----------- + +You can send *all* messages from your social networking site to a +third-party service using XMPP. This can be useful for providing +search, indexing, bridging, or other cool services. + +To configure a downstream site to receive your public stream, add +their "JID" (Jabber ID) to your config.php as follows: + + $config['xmpp']['public'][] = 'downstream@example.net'; + +(Don't miss those square brackets at the end.) Note that your XMPP +broadcasting must be configured as mentioned above. Although you can +send out messages at "Web time", high-volume sites should strongly +consider setting up queues and daemons. + +Queues and daemons +------------------ + +Some activities that StatusNet needs to do, like broadcast OStatus, SMS, +and XMPP messages, can be 'queued' and done by off-line bots instead. +For this to work, you must be able to run long-running offline +processes, either on your main Web server or on another server you +control. (Your other server will still need all the above +prerequisites, with the exception of Apache.) Installing on a separate +server is probably a good idea for high-volume sites. + +1. You'll need the "CLI" (command-line interface) version of PHP + installed on whatever server you use. + +2. If you're using a separate server for queues, install StatusNet + somewhere on the server. You don't need to worry about the + .htaccess file, but make sure that your config.php file is close + to, or identical to, your Web server's version. + +3. In your config.php files (both the Web server and the queues + server!), set the following variable: + + $config['queue']['enabled'] = true; + + You may also want to look at the 'daemon' section of this file for + more daemon options. Note that if you set the 'user' and/or 'group' + options, you'll need to create that user and/or group by hand. + They're not created automatically. + +4. On the queues server, run the command scripts/startdaemons.sh. + +This will run the queue handlers: + +* queuedaemon.php - polls for queued items for inbox processing and + pushing out to OStatus, SMS, XMPP, etc. +* xmppdaemon.php - listens for new XMPP messages from users and stores + them as notices in the database; also pulls queued XMPP output from + queuedaemon.php to push out to clients. + +These two daemons will automatically restart in most cases of failure +including memory leaks (if a memory_limit is set), but may still die +or behave oddly if they lose connections to the XMPP or queue servers. + +Additional daemons may be also started by this script for certain +plugins, such as the Twitter bridge. + +It may be a good idea to use a daemon-monitoring service, like 'monit', +to check their status and keep them running. + +All the daemons write their process IDs (pids) to /var/run/ by +default. This can be useful for starting, stopping, and monitoring the +daemons. + +Since version 0.8.0, it's now possible to use a STOMP server instead of +our kind of hacky home-grown DB-based queue solution. This is strongly +recommended for best response time, especially when using XMPP. + +See the "queues" config section below for how to configure to use STOMP. +As of this writing, the software has been tested with ActiveMQ 5.3. + +Themes +------ + +Older themes (version 0.9.x and below) no longer work with StatusNet +1.0.x, due to major changes in the site layout. We ship with three new +themes for this version, 'neo', 'neo-blue' and 'neo-light'. + +As of right now, your ability to change the theme is site-wide; users +can't choose their own theme. Additionally, the only thing you can +change in the theme is CSS stylesheets and some image files; you can't +change the HTML output, like adding or removing menu items. + +You can choose a theme using the $config['site']['theme'] element in +the config.php file. See below for details. + +You can add your own theme by making a sub-directory of the 'theme' +subdirectory with the name of your theme. Each theme can have the +following files: + +display.css: a CSS2 file for "default" styling for all browsers. +ie6.css: a CSS2 file for override styling for fixing up Internet + Explorer 6. +ie7.css: a CSS2 file for override styling for fixing up Internet + Explorer 7. +logo.png: a logo image for the site. +default-avatar-profile.png: a 96x96 pixel image to use as the avatar for + users who don't upload their own. +default-avatar-stream.png: Ditto, but 48x48. For streams of notices. +default-avatar-mini.png: Ditto ditto, but 24x24. For subscriptions + listing on profile pages. + +You may want to start by copying the files from the default theme to +your own directory. + +Translation +----------- + +Translations in StatusNet use the gettext system . +Theoretically, you can add your own sub-directory to the locale/ +subdirectory to add a new language to your system. You'll need to +compile the ".po" files into ".mo" files, however. + +Contributions of translation information to StatusNet are very easy: +you can use the Web interface at translatewiki.net to add one +or a few or lots of new translations -- or even new languages. You can +also download more up-to-date .po files there, if you so desire. + +For info on helping with translations, see http://status.net/wiki/Translations + +Backups +------- + +There is no built-in system for doing backups in StatusNet. You can make +backups of a working StatusNet system by backing up the database and +the Web directory. To backup the database use mysqldump +and to backup the Web directory, try tar. + +Private +------- + +The administrator can set the "private" flag for a site so that it's +not visible to non-logged-in users. (This is the default for new installs of version 1.0!) + +This might be useful for workgroups who want to share a social +networking site for project management, but host it on a public +server. + +Total privacy is attempted but not guaranteed or ensured. Private sites +currently don't work well with OStatus federation. + +Access to file attachments can also be restricted to logged-in users only. + +1. Add a directory outside the web root where your file uploads will be + stored. Usually a command like this will work: + + mkdir /var/www/statusnet-files + +2. Make the file uploads directory writeable by the web server. An + insecure way to do this is: + + chmod a+x /var/www/statusnet-files + +3. Tell StatusNet to use this directory for file uploads. Add a line + like this to your config.php: + + $config['attachments']['dir'] = '/var/www/statusnet-files'; diff --git a/PLUGINS.txt b/PLUGINS.txt new file mode 100644 index 0000000000..79533b96de --- /dev/null +++ b/PLUGINS.txt @@ -0,0 +1,44 @@ +Plugins +======= + +Beginning with the 0.7.x branch, StatusNet has supported a simple but +powerful plugin architecture. Important events in the code are named, +like 'StartNoticeSave', and other software can register interest +in those events. When the events happen, the other software is called +and has a choice of accepting or rejecting the events. + +In the simplest case, you can add a function to config.php and use the +Event::addHandler() function to hook an event: + + function AddGoogleLink($action) + { + $action->menuItem('http://www.google.com/', _('Google'), _('Search engine')); + return true; + } + + Event::addHandler('EndPrimaryNav', 'AddGoogleLink'); + +This adds a menu item to the end of the main navigation menu. You can +see the list of existing events, and parameters that handlers must +implement, in EVENTS.txt. + +The Plugin class in lib/plugin.php makes it easier to write more +complex plugins. Sub-classes can just create methods named +'onEventName', where 'EventName' is the name of the event (case +matters!). These methods will be automatically registered as event +handlers by the Plugin constructor (which you must call from your own +class's constructor). + +Several example plugins are included in the plugins/ directory. You +can enable a plugin with the following line in config.php: + + addPlugin('Example', array('param1' => 'value1', + 'param2' => 'value2')); + +This will look for and load files named 'ExamplePlugin.php' or +'Example/ExamplePlugin.php' either in the plugins/ directory (for +plugins that ship with StatusNet) or in the local/ directory (for +plugins you write yourself or that you get from somewhere else) or +local/plugins/. + +Plugins are documented in their own directories. diff --git a/README b/README index 74ef138a2a..3999bffbce 100644 --- a/README +++ b/README @@ -2,24 +2,35 @@ README ------ -StatusNet 0.9.7 "World Leader Pretend" -17 March 2011 +StatusNet 1.1.1 +16 July 2013 -This is the README file for StatusNet, the Open Source microblogging -platform. It includes installation instructions, descriptions of -options you can set, warnings, tips, and general info for -administrators. Information on using StatusNet can be found in the -"doc" subdirectory or in the "help" section on-line. +This is the README file for StatusNet, the Open Source social +networking platform. It includes general information about the +software and the project. + +Some other files to review: + +- INSTALL: instructions on how to install the software. +- UPGRADE: upgrading from earlier versions +- CONFIGURE: configuration options in gruesome detail. +- PLUGINS.txt: how to install and configure plugins. +- EVENTS.txt: events supported by the plugin system +- COPYING: full text of the software license + +Information on using StatusNet can be found in the "doc" subdirectory +or in the "help" section on-line. About ===== -StatusNet is a Free and Open Source microblogging platform. It helps -people in a community, company or group to exchange short (140 -characters, by default) messages over the Web. Users can choose which -people to "follow" and receive only their friends' or colleagues' -status messages. It provides a similar service to sites like Twitter, -Google Buzz, or Yammer. +StatusNet is a Free and Open Source social networking platform. It +helps people in a community, company or group to exchange short status +updates, do polls, announce events, or other social activities (and +you can add more!). Users can choose which people to "follow" and +receive only their friends' or colleagues' status messages. It +provides a similar service to sites like Twitter, Google+, Facebook or +Yammer, but is much more awesome. With a little work, status messages can be sent to mobile phones, instant messenger programs (GTalk/Jabber), and specially-designed @@ -96,1590 +107,19 @@ for additional terms. New this version ================ -This is a security, bug and feature release since version 0.9.6 released on -23 October 2010. +This is a security fix and bug fix release since 1.1.0, +released 2 July 2012. All 1.1.0 sites should upgrade to this version. -For best compatibility with client software and site federation, and a -lot of bug fixes, it is highly recommended that all public sites -upgrade to the new version. Upgrades require new database indexes for -best performance; see Upgrade below. +It includes the following changes: -Notable changes this version: +- Fixes for SQL injection errors in profile lists. +- Improved ActivityStreams JSON representation of activities and objects. +- Upgrade to the Twitter 1.1 API. +- More robust handling of errors in distribution. +- Fix error in OStatus subscription for remote groups. +- Fix error in XMPP distribution. -- GroupPrivateMessage plugin lets users send private messages - to a group. (Similar to "private groups" on Yammer.) -- Support for Twitter streaming API in Twitter bridge plugin -- Support for a new Activity Streams-based API using AtomPub, allowing - richer API data. See http://status.net/wiki/AtomPub for details. -- Unified Facebook plugin, replacing previous Facebook application - and Facebook Connect plugin. -- A plugin to send out a daily summary email to network users. -- In-line thumbnails of some attachments (video, images) and oEmbed objects. -- Local copies of remote profiles to let moderators manage OStatus users. -- Upgrade upstream JS, minify everything. -- Allow pushing plugin JS, CSS, and static files to a CDN. -- Configurable nickname rules. -- Better support for bit.ly URL shortener. -- InProcessCache plugin for additional caching on top of memcached. -- Support for Activity Streams JSON feeds on many streams. -- User-initiated backup and restore of account data in Activity Streams - format. -- Bookmark plugin for making del.icio.us-like social bookmarking sites, - including del.icio.us backup file import. Supports OStatus. -- SQLProfile plugin to tune SQL queries. -- Better sorting on timelines to support restored or imported data. -- Hundreds of translations from http://translatewiki.net/ -- Hundreds of performance tunings, bug fixes, and UI improvements. -- Remove deprecated data from Activity Streams Atom output, to the - extent possible. -- NewMenu plugin for new layout of menu items. -- Experimental support for moving an account from one server to - another, using new AtomPub API. - -A full changelog is available at http://status.net/wiki/StatusNet_0.9.7. - -Prerequisites -============= - -The following software packages are *required* for this software to -run correctly. - -- PHP 5.2.3+. It may be possible to run this software on earlier - versions of PHP, but many of the functions used are only available - in PHP 5.2 or above. 5.2.6 or later is needed for XMPP background - daemons on 64-bit platforms. PHP 5.3.x should work correctly in this - release, but problems with some plugins are possible. -- MySQL 5.x. The StatusNet database is stored, by default, in a MySQL - server. It has been primarily tested on 5.x servers, although it may - be possible to install on earlier (or later!) versions. The server - *must* support the MyISAM storage engine -- the default for most - MySQL servers -- *and* the InnoDB storage engine. -- A Web server. Preferably, you should have Apache 2.2.x with the - mod_rewrite extension installed and enabled. - -Your PHP installation must include the following PHP extensions: - -- Curl. This is for fetching files by HTTP. -- XMLWriter. This is for formatting XML and HTML output. -- MySQL. For accessing the database. -- GD. For scaling down avatar images. -- mbstring. For handling Unicode (UTF-8) encoded strings. - -For some functionality, you will also need the following extensions: - -- Memcache. A client for the memcached server, which caches database - information in volatile memory. This is important for adequate - performance on high-traffic sites. You will also need a memcached - server to store the data in. -- Mailparse. Efficient parsing of email requires this extension. - Submission by email or SMS-over-email uses this extension. -- Sphinx Search. A client for the sphinx server, an alternative - to MySQL or Postgresql fulltext search. You will also need a - Sphinx server to serve the search queries. -- bcmath or gmp. For Salmon signatures (part of OStatus). Needed - if you have OStatus configured. -- gettext. For multiple languages. Default on many PHP installs; - will be emulated if not present. - -You will almost definitely get 2-3 times better performance from your -site if you install a PHP bytecode cache/accelerator. Some well-known -examples are: eaccelerator, Turck mmcache, xcache, apc. Zend Optimizer -is a proprietary accelerator installed on some hosting sites. - -External libraries ------------------- - -A number of external PHP libraries are used to provide basic -functionality and optional functionality for your system. For your -convenience, they are available in the "extlib" directory of this -package, and you do not have to download and install them. However, -you may want to keep them up-to-date with the latest upstream version, -and the URLs are listed here for your convenience. - -- DB_DataObject http://pear.php.net/package/DB_DataObject -- Validate http://pear.php.net/package/Validate -- OpenID from OpenIDEnabled (not the PEAR version!). We decided - to use the openidenabled.com version since it's more widely - implemented, and seems to be better supported. - http://openidenabled.com/php-openid/ -- PEAR DB. Although this is an older data access system (new - packages should probably use PHP DBO), the OpenID libraries - depend on PEAR DB so we use it here, too. DB_DataObject can - also use PEAR MDB2, which may give you better performance - but won't work with OpenID. - http://pear.php.net/package/DB -- OAuth.php from http://oauth.googlecode.com/svn/code/php/ -- markdown.php from http://michelf.com/projects/php-markdown/ -- PEAR Mail, for sending out mail notifications - http://pear.php.net/package/Mail -- PEAR Net_SMTP, if you use the SMTP factory for notifications - http://pear.php.net/package/Net_SMTP -- PEAR Net_Socket, if you use the SMTP factory for notifications - http://pear.php.net/package/Net_Socket -- XMPPHP, the follow-up to Class.Jabber.php. Probably the best XMPP - library available for PHP. http://xmpphp.googlecode.com/. Note that - as of this writing the version of this library that is available in - the extlib directory is *significantly different* from the upstream - version (patches have been submitted). Upgrading to the upstream - version may render your StatusNet site unable to send or receive XMPP - messages. -- Facebook library. Used for the Facebook application. -- PEAR Validate is used for URL and email validation. -- Console_GetOpt for parsing command-line options. -- libomb. a library for implementing OpenMicroBlogging 0.1, the - predecessor to OStatus. -- HTTP_Request2, a library for making HTTP requests. -- PEAR Net_URL2 is an HTTP_Request2 dependency. - -A design goal of StatusNet is that the basic Web functionality should -work on even the most restrictive commercial hosting services. -However, additional functionality, such as receiving messages by -Jabber/GTalk, require that you be able to run long-running processes -on your account. In addition, posting by email or from SMS require -that you be able to install a mail filter in your mail server. - -Installation -============ - -Installing the basic StatusNet Web component is relatively easy, -especially if you've previously installed PHP/MySQL packages. - -1. Unpack the tarball you downloaded on your Web server. Usually a - command like this will work: - - tar zxf statusnet-0.9.7.tar.gz - - ...which will make a statusnet-0.9.7 subdirectory in your current - directory. (If you don't have shell access on your Web server, you - may have to unpack the tarball on your local computer and FTP the - files to the server.) - -2. Move the tarball to a directory of your choosing in your Web root - directory. Usually something like this will work: - - mv statusnet-0.9.7 /var/www/statusnet - - This will make your StatusNet instance available in the statusnet path of - your server, like "http://example.net/statusnet". "microblog" or - "statusnet" might also be good path names. If you know how to - configure virtual hosts on your web server, you can try setting up - "http://micro.example.net/" or the like. - -3. Make your target directory writeable by the Web server. - - chmod a+w /var/www/statusnet/ - - On some systems, this will probably work: - - chgrp www-data /var/www/statusnet/ - chmod g+w /var/www/statusnet/ - - If your Web server runs as another user besides "www-data", try - that user's default group instead. As a last resort, you can create - a new group like "statusnet" and add the Web server's user to the group. - -4. You should also take this moment to make your avatar, background, and - file subdirectories writeable by the Web server. An insecure way to do - this is: - - chmod a+w /var/www/statusnet/avatar - chmod a+w /var/www/statusnet/background - chmod a+w /var/www/statusnet/file - - You can also make the avatar, background, and file directories - writeable by the Web server group, as noted above. - -5. Create a database to hold your microblog data. Something like this - should work: - - mysqladmin -u "username" --password="password" create statusnet - - Note that StatusNet must have its own database; you can't share the - database with another program. You can name it whatever you want, - though. - - (If you don't have shell access to your server, you may need to use - a tool like PHPAdmin to create a database. Check your hosting - service's documentation for how to create a new MySQL database.) - -6. Create a new database account that StatusNet will use to access the - database. If you have shell access, this will probably work from the - MySQL shell: - - GRANT ALL on statusnet.* - TO 'statusnetuser'@'localhost' - IDENTIFIED BY 'statusnetpassword'; - - You should change 'statusnetuser' and 'statusnetpassword' to your preferred new - username and password. You may want to test logging in to MySQL as - this new user. - -7. In a browser, navigate to the StatusNet install script; something like: - - http://yourserver.example.com/statusnet/install.php - - Enter the database connection information and your site name. The - install program will configure your site and install the initial, - almost-empty database. - -8. You should now be able to navigate to your microblog's main directory - and see the "Public Timeline", which will be empty. If not, magic - has happened! You can now register a new user, post some notices, - edit your profile, etc. However, you may want to wait to do that stuff - if you think you can set up "fancy URLs" (see below), since some - URLs are stored in the database. - -Fancy URLs ----------- - -By default, StatusNet will use URLs that include the main PHP program's -name in them. For example, a user's home profile might be -found at: - - http://example.org/statusnet/index.php/statusnet/fred - -On certain systems that don't support this kind of syntax, they'll -look like this: - - http://example.org/statusnet/index.php?p=statusnet/fred - -It's possible to configure the software so it looks like this instead: - - http://example.org/statusnet/fred - -These "fancy URLs" are more readable and memorable for users. To use -fancy URLs, you must either have Apache 2.x with .htaccess enabled and -mod_rewrite enabled, -OR- know how to configure "url redirection" in -your server. - -1. Copy the htaccess.sample file to .htaccess in your StatusNet - directory. Note: if you have control of your server's httpd.conf or - similar configuration files, it can greatly improve performance to - import the .htaccess file into your conf file instead. If you're - not sure how to do it, you may save yourself a lot of headache by - just leaving the .htaccess file. - -2. Change the "RewriteBase" in the new .htaccess file to be the URL path - to your StatusNet installation on your server. Typically this will - be the path to your StatusNet directory relative to your Web root. - -3. Add or uncomment or change a line in your config.php file so it says: - - $config['site']['fancy'] = true; - -You should now be able to navigate to a "fancy" URL on your server, -like: - - http://example.net/statusnet/main/register - -If you changed your HTTP server configuration, you may need to restart -the server first. - -If it doesn't work, double-check that AllowOverride for the StatusNet -directory is 'All' in your Apache configuration file. This is usually -/etc/httpd.conf, /etc/apache/httpd.conf, or (on Debian and Ubuntu) -/etc/apache2/sites-available/default. See the Apache documentation for -.htaccess files for more details: - - http://httpd.apache.org/docs/2.2/howto/htaccess.html - -Also, check that mod_rewrite is installed and enabled: - - http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html - -Sphinx ------- - -To use a Sphinx server to search users and notices, you'll need to -enable the SphinxSearch plugin. Add to your config.php: - - addPlugin('SphinxSearch'); - $config['sphinx']['server'] = 'searchhost.local'; - -You also need to install, compile and enable the sphinx pecl extension for -php on the client side, which itself depends on the sphinx development files. - -See plugins/SphinxSearch/README for more details and server setup. - -SMS ---- - -StatusNet supports a cheap-and-dirty system for sending update messages -to mobile phones and for receiving updates from the mobile. Instead of -sending through the SMS network itself, which is costly and requires -buy-in from the wireless carriers, it simply piggybacks on the email -gateways that many carriers provide to their customers. So, SMS -configuration is essentially email configuration. - -Each user sends to a made-up email address, which they keep a secret. -Incoming email that is "From" the user's SMS email address, and "To" -the users' secret email address on the site's domain, will be -converted to a notice and stored in the DB. - -For this to work, there *must* be a domain or sub-domain for which all -(or most) incoming email can pass through the incoming mail filter. - -1. Run the SQL script carrier.sql in your StatusNet database. This will - usually work: - - mysql -u "statusnetuser" --password="statusnetpassword" statusnet < db/carrier.sql - - This will populate your database with a list of wireless carriers - that support email SMS gateways. - -2. Make sure the maildaemon.php file is executable: - - chmod +x scripts/maildaemon.php - - Note that "daemon" is kind of a misnomer here; the script is more - of a filter than a daemon. - -2. Edit /etc/aliases on your mail server and add the following line: - - *: /path/to/statusnet/scripts/maildaemon.php - -3. Run whatever code you need to to update your aliases database. For - many mail servers (Postfix, Exim, Sendmail), this should work: - - newaliases - - You may need to restart your mail server for the new database to - take effect. - -4. Set the following in your config.php file: - - $config['mail']['domain'] = 'yourdomain.example.net'; - -At this point, post-by-email and post-by-SMS-gateway should work. Note -that if your mail server is on a different computer from your email -server, you'll need to have a full installation of StatusNet, a working -config.php, and access to the StatusNet database from the mail server. - -XMPP ----- - -XMPP (eXtended Message and Presence Protocol, ) is the -instant-messenger protocol that drives Jabber and GTalk IM. You can -distribute messages via XMPP using the system below; however, you -need to run the XMPP incoming daemon to allow incoming messages as -well. - -1. You may want to strongly consider setting up your own XMPP server. - Ejabberd, OpenFire, and JabberD are all Open Source servers. - Jabber, Inc. provides a high-performance commercial server. - -2. You must register a Jabber ID (JID) with your new server. It helps - to choose a name like "update@example.com" or "notice" or something - similar. Alternately, your "update JID" can be registered on a - publicly-available XMPP service, like jabber.org or GTalk. - - StatusNet will not register the JID with your chosen XMPP server; - you need to do this manually, with an XMPP client like Gajim, - Telepathy, or Pidgin.im. - -3. Configure your site's XMPP variables, as described below in the - configuration section. - -On a default installation, your site can broadcast messages using -XMPP. Users won't be able to post messages using XMPP unless you've -got the XMPP daemon running. See 'Queues and daemons' below for how -to set that up. Also, once you have a sizable number of users, sending -a lot of SMS, OMB, and XMPP messages whenever someone posts a message -can really slow down your site; it may cause posting to timeout. - -NOTE: stream_select(), a crucial function for network programming, is -broken on PHP 5.2.x less than 5.2.6 on amd64-based servers. We don't -work around this bug in StatusNet; current recommendation is to move -off of amd64 to another server. - -Public feed ------------ - -You can send *all* messages from your microblogging site to a -third-party service using XMPP. This can be useful for providing -search, indexing, bridging, or other cool services. - -To configure a downstream site to receive your public stream, add -their "JID" (Jabber ID) to your config.php as follows: - - $config['xmpp']['public'][] = 'downstream@example.net'; - -(Don't miss those square brackets at the end.) Note that your XMPP -broadcasting must be configured as mentioned above. Although you can -send out messages at "Web time", high-volume sites should strongly -consider setting up queues and daemons. - -Queues and daemons ------------------- - -Some activities that StatusNet needs to do, like broadcast OStatus, SMS, -and XMPP messages, can be 'queued' and done by off-line bots instead. -For this to work, you must be able to run long-running offline -processes, either on your main Web server or on another server you -control. (Your other server will still need all the above -prerequisites, with the exception of Apache.) Installing on a separate -server is probably a good idea for high-volume sites. - -1. You'll need the "CLI" (command-line interface) version of PHP - installed on whatever server you use. - -2. If you're using a separate server for queues, install StatusNet - somewhere on the server. You don't need to worry about the - .htaccess file, but make sure that your config.php file is close - to, or identical to, your Web server's version. - -3. In your config.php files (both the Web server and the queues - server!), set the following variable: - - $config['queue']['enabled'] = true; - - You may also want to look at the 'daemon' section of this file for - more daemon options. Note that if you set the 'user' and/or 'group' - options, you'll need to create that user and/or group by hand. - They're not created automatically. - -4. On the queues server, run the command scripts/startdaemons.sh. - -This will run the queue handlers: - -* queuedaemon.php - polls for queued items for inbox processing and - pushing out to OStatus, SMS, XMPP, etc. -* xmppdaemon.php - listens for new XMPP messages from users and stores - them as notices in the database; also pulls queued XMPP output from - queuedaemon.php to push out to clients. - -These two daemons will automatically restart in most cases of failure -including memory leaks (if a memory_limit is set), but may still die -or behave oddly if they lose connections to the XMPP or queue servers. - -Additional daemons may be also started by this script for certain -plugins, such as the Twitter bridge. - -It may be a good idea to use a daemon-monitoring service, like 'monit', -to check their status and keep them running. - -All the daemons write their process IDs (pids) to /var/run/ by -default. This can be useful for starting, stopping, and monitoring the -daemons. - -Since version 0.8.0, it's now possible to use a STOMP server instead of -our kind of hacky home-grown DB-based queue solution. This is strongly -recommended for best response time, especially when using XMPP. - -See the "queues" config section below for how to configure to use STOMP. -As of this writing, the software has been tested with ActiveMQ 5.3. - -Themes ------- - -There are two themes shipped with this version of StatusNet: "identica", -which is what the Identi.ca site uses, and "default", which is a good -basis for other sites. - -As of right now, your ability to change the theme is site-wide; users -can't choose their own theme. Additionally, the only thing you can -change in the theme is CSS stylesheets and some image files; you can't -change the HTML output, like adding or removing menu items. - -You can choose a theme using the $config['site']['theme'] element in -the config.php file. See below for details. - -You can add your own theme by making a sub-directory of the 'theme' -subdirectory with the name of your theme. Each theme can have the -following files: - -display.css: a CSS2 file for "default" styling for all browsers. -ie6.css: a CSS2 file for override styling for fixing up Internet - Explorer 6. -ie7.css: a CSS2 file for override styling for fixing up Internet - Explorer 7. -logo.png: a logo image for the site. -default-avatar-profile.png: a 96x96 pixel image to use as the avatar for - users who don't upload their own. -default-avatar-stream.png: Ditto, but 48x48. For streams of notices. -default-avatar-mini.png: Ditto ditto, but 24x24. For subscriptions - listing on profile pages. - -You may want to start by copying the files from the default theme to -your own directory. - -NOTE: the HTML generated by StatusNet changed *radically* between -version 0.6.x and 0.7.x. Older themes will need signification -modification to use the new output format. - -Translation ------------ - -Translations in StatusNet use the gettext system . -Theoretically, you can add your own sub-directory to the locale/ -subdirectory to add a new language to your system. You'll need to -compile the ".po" files into ".mo" files, however. - -Contributions of translation information to StatusNet are very easy: -you can use the Web interface at translatewiki.net to add one -or a few or lots of new translations -- or even new languages. You can -also download more up-to-date .po files there, if you so desire. - -For info on helping with translations, see http://status.net/wiki/Translations - -Backups -------- - -There is no built-in system for doing backups in StatusNet. You can make -backups of a working StatusNet system by backing up the database and -the Web directory. To backup the database use mysqldump -and to backup the Web directory, try tar. - -Private -------- - -The administrator can set the "private" flag for a site so that it's -not visible to non-logged-in users. This might be useful for -workgroups who want to share a microblogging site for project -management, but host it on a public server. - -Total privacy is not guaranteed or ensured. Also, privacy is -all-or-nothing for a site; you can't have some accounts or notices -private, and others public. The interaction of private sites -with OStatus is undefined. - -Access to file attachments can also be restricted to logged-in users only. -1. Add a directory outside the web root where your file uploads will be - stored. Usually a command like this will work: - - mkdir /var/www/statusnet-files - -2. Make the file uploads directory writeable by the web server. An - insecure way to do this is: - - chmod a+x /var/www/statusnet-files - -3. Tell StatusNet to use this directory for file uploads. Add a line - like this to your config.php: - - $config['attachments']['dir'] = '/var/www/statusnet-files'; - -Upgrading -========= - -IMPORTANT NOTE: StatusNet 0.7.4 introduced a fix for some -incorrectly-stored international characters ("UTF-8"). For new -installations, it will now store non-ASCII characters correctly. -However, older installations will have the incorrect storage, and will -consequently show up "wrong" in browsers. See below for how to deal -with this situation. - -If you've been using StatusNet 0.7, 0.6, 0.5 or lower, or if you've -been tracking the "git" version of the software, you will probably -want to upgrade and keep your existing data. There is no automated -upgrade procedure in StatusNet 0.9.7. Try these step-by-step -instructions; read to the end first before trying them. - -0. Download StatusNet and set up all the prerequisites as if you were - doing a new install. -1. Make backups of both your database and your Web directory. UNDER NO - CIRCUMSTANCES should you try to do an upgrade without a known-good - backup. You have been warned. -2. Shut down Web access to your site, either by turning off your Web - server or by redirecting all pages to a "sorry, under maintenance" - page. -3. Shut down XMPP access to your site, typically by shutting down the - xmppdaemon.php process and all other daemons that you're running. - If you've got "monit" or "cron" automatically restarting your - daemons, make sure to turn that off, too. -4. Shut down SMS and email access to your site. The easy way to do - this is to comment out the line piping incoming email to your - maildaemon.php file, and running something like "newaliases". -5. Once all writing processes to your site are turned off, make a - final backup of the Web directory and database. -6. Move your StatusNet directory to a backup spot, like "statusnet.bak". -7. Unpack your StatusNet 0.9.7 tarball and move it to "statusnet" or - wherever your code used to be. -8. Copy the config.php file and the contents of the avatar/, background/, - file/, and local/ subdirectories from your old directory to your new - directory. -9. Copy htaccess.sample to .htaccess in the new directory. Change the - RewriteBase to use the correct path. -10. Rebuild the database. - - NOTE: this step is destructive and cannot be - reversed. YOU CAN EASILY DESTROY YOUR SITE WITH THIS STEP. Don't - do it without a known-good backup! - - If your database is at version 0.8.0 or higher in the 0.8.x line, you can run a - special upgrade script: - - mysql -u -p db/08to09.sql - - If you are upgrading from any 0.9.x version like 0.9.6, run this script: - - mysql -u -p db/096to097.sql - - Despite the name, it should work for any 0.9.x branch. - - Otherwise, go to your StatusNet directory and AFTER YOU MAKE A - BACKUP run the rebuilddb.sh script like this: - - ./scripts/rebuilddb.sh rootuser rootpassword database db/statusnet.sql - - Here, rootuser and rootpassword are the username and password for a - user who can drop and create databases as well as tables; typically - that's _not_ the user StatusNet runs as. Note that rebuilddb.sh drops - your database and rebuilds it; if there is an error you have no - database. Make sure you have a backup. - For PostgreSQL databases there is an equivalent, rebuilddb_psql.sh, - which operates slightly differently. Read the documentation in that - script before running it. -11. Use mysql or psql client to log into your database and make sure that - the notice, user, profile, subscription etc. tables are non-empty. -12. Turn back on the Web server, and check that things still work. -13. Turn back on XMPP bots and email maildaemon. Note that the XMPP - bots have changed since version 0.5; see above for details. - -If you're upgrading from very old versions, you may want to look at -the fixup_* scripts in the scripts directories. These will store some -precooked data in the DB. All upgraders should check out the inboxes -options below. - -NOTE: the database definition file, laconica.ini, has been renamed to -statusnet.ini (since this is the recommended database name). If you -have a line in your config.php pointing to the old name, you'll need -to update it. - -NOTE: the 1.0.0 version of StatusNet changed the URLs for all admin -panels from /admin/* to /panel/*. This now allows the (popular) -username 'admin', but blocks the considerably less popular username -'panel'. If you have an existing user named 'panel', you should rename -them before upgrading. - -Notice inboxes --------------- - -Notice inboxes are now required. If you don't have inboxes enabled, -StatusNet will no longer run. - -UTF-8 Database --------------- - -StatusNet 0.7.4 introduced a fix for some incorrectly-stored -international characters ("UTF-8"). This fix is not -backwards-compatible; installations from before 0.7.4 will show -non-ASCII characters of old notices incorrectly. This section explains -what to do. - -0. You can disable the new behaviour by setting the 'db''utf8' config - option to "false". You should only do this until you're ready to - convert your DB to the new format. -1. When you're ready to convert, you can run the fixup_utf8.php script - in the scripts/ subdirectory. If you've had the "new behaviour" - enabled (probably a good idea), you can give the ID of the first - "new" notice as a parameter, and only notices before that one will - be converted. Notices are converted in reverse chronological order, - so the most recent (and visible) ones will be converted first. The - script should work whether or not you have the 'db''utf8' config - option enabled. -2. When you're ready, set $config['db']['utf8'] to true, so that - new notices will be stored correctly. - -Configuration options -===================== - -The main configuration file for StatusNet (excepting configurations for -dependency software) is config.php in your StatusNet directory. If you -edit any other file in the directory, like lib/default.php (where most -of the defaults are defined), you will lose your configuration options -in any upgrade, and you will wish that you had been more careful. - -Starting with version 0.9.0, a Web based configuration panel has been -added to StatusNet. The preferred method for changing config options is -to use this panel. - -A command-line script, setconfig.php, can be used to set individual -configuration options. It's in the scripts/ directory. - -Starting with version 0.7.1, you can put config files in the -/etc/statusnet/ directory on your server, if it exists. Config files -will be included in this order: - -* /etc/statusnet/statusnet.php - server-wide config -* /etc/statusnet/.php - for a virtual host -* /etc/statusnet/_.php - for a path -* INSTALLDIR/config.php - for a particular implementation - -Almost all configuration options are made through a two-dimensional -associative array, cleverly named $config. A typical configuration -line will be: - - $config['section']['option'] = value; - -For brevity, the following documentation describes each section and -option. - -site ----- - -This section is a catch-all for site-wide variables. - -name: the name of your site, like 'YourCompany Microblog'. -server: the server part of your site's URLs, like 'example.net'. -path: The path part of your site's URLs, like 'statusnet' or '' - (installed in root). -fancy: whether or not your site uses fancy URLs (see Fancy URLs - section above). Default is false. -logfile: full path to a file for StatusNet to save logging - information to. You may want to use this if you don't have - access to syslog. -logdebug: whether to log additional debug info like backtraces on - hard errors. Default false. -locale_path: full path to the directory for locale data. Unless you - store all your locale data in one place, you probably - don't need to use this. -language: default language for your site. Defaults to US English. - Note that this is overridden if a user is logged in and has - selected a different language. It is also overridden if the - user is NOT logged in, but their browser requests a different - langauge. Since pretty much everybody's browser requests a - language, that means that changing this setting has little or - no effect in practice. -languages: A list of languages supported on your site. Typically you'd - only change this if you wanted to disable support for one - or another language: - "unset($config['site']['languages']['de'])" will disable - support for German. -theme: Theme for your site (see Theme section). Two themes are - provided by default: 'default' and 'stoica' (the one used by - Identi.ca). It's appreciated if you don't use the 'stoica' theme - except as the basis for your own. -email: contact email address for your site. By default, it's extracted - from your Web server environment; you may want to customize it. -broughtbyurl: name of an organization or individual who provides the - service. Each page will include a link to this name in the - footer. A good way to link to the blog, forum, wiki, - corporate portal, or whoever is making the service available. -broughtby: text used for the "brought by" link. -timezone: default timezone for message display. Users can set their - own time zone. Defaults to 'UTC', which is a pretty good default. -closed: If set to 'true', will disallow registration on your site. - This is a cheap way to restrict accounts to only one - individual or group; just register the accounts you want on - the service, *then* set this variable to 'true'. -inviteonly: If set to 'true', will only allow registration if the user - was invited by an existing user. -private: If set to 'true', anonymous users will be redirected to the - 'login' page. Also, API methods that normally require no - authentication will require it. Note that this does not turn - off registration; use 'closed' or 'inviteonly' for the - behaviour you want. -notice: A plain string that will appear on every page. A good place - to put introductory information about your service, or info about - upgrades and outages, or other community info. Any HTML will - be escaped. -logo: URL of an image file to use as the logo for the site. Overrides - the logo in the theme, if any. -ssllogo: URL of an image file to use as the logo on SSL pages. If unset, - theme logo is used instead. -ssl: Whether to use SSL and https:// URLs for some or all pages. - Possible values are 'always' (use it for all pages), 'never' - (don't use it for any pages), or 'sometimes' (use it for - sensitive pages that include passwords like login and registration, - but not for regular pages). Default to 'never'. -sslserver: use an alternate server name for SSL URLs, like - 'secure.example.org'. You should be careful to set cookie - parameters correctly so that both the SSL server and the - "normal" server can access the session cookie and - preferably other cookies as well. -shorturllength: ignored. See 'url' section below. -dupelimit: minimum time allowed for one person to say the same thing - twice. Default 60s. Anything lower is considered a user - or UI error. -textlimit: default max size for texts in the site. Defaults to 140. - 0 means no limit. Can be fine-tuned for notices, messages, - profile bios and group descriptions. - -db --- - -This section is a reference to the configuration options for -DB_DataObject (see ). The ones that you may want to -set are listed below for clarity. - -database: a DSN (Data Source Name) for your StatusNet database. This is - in the format 'protocol://username:password@hostname/databasename', - where 'protocol' is 'mysql' or 'mysqli' (or possibly 'postgresql', if you - really know what you're doing), 'username' is the username, - 'password' is the password, and etc. -ini_yourdbname: if your database is not named 'statusnet', you'll need - to set this to point to the location of the - statusnet.ini file. Note that the real name of your database - should go in there, not literally 'yourdbname'. -db_driver: You can try changing this to 'MDB2' to use the other driver - type for DB_DataObject, but note that it breaks the OpenID - libraries, which only support PEAR::DB. -debug: On a database error, you may get a message saying to set this - value to 5 to see debug messages in the browser. This breaks - just about all pages, and will also expose the username and - password -quote_identifiers: Set this to true if you're using postgresql. -type: either 'mysql' or 'postgresql' (used for some bits of - database-type-specific SQL in the code). Defaults to mysql. -mirror: you can set this to an array of DSNs, like the above - 'database' value. If it's set, certain read-only actions will - use a random value out of this array for the database, rather - than the one in 'database' (actually, 'database' is overwritten). - You can offload a busy DB server by setting up MySQL replication - and adding the slaves to this array. Note that if you want some - requests to go to the 'database' (master) server, you'll need - to include it in this array, too. -utf8: whether to talk to the database in UTF-8 mode. This is the default - with new installations, but older sites may want to turn it off - until they get their databases fixed up. See "UTF-8 database" - above for details. -schemacheck: when to let plugins check the database schema to add - tables or update them. Values can be 'runtime' (default) - or 'script'. 'runtime' can be costly (plugins check the - schema on every hit, adding potentially several db - queries, some quite long), but not everyone knows how to - run a script. If you can, set this to 'script' and run - scripts/checkschema.php whenever you install or upgrade a - plugin. - -syslog ------- - -By default, StatusNet sites log error messages to the syslog facility. -(You can override this using the 'logfile' parameter described above). - -appname: The name that StatusNet uses to log messages. By default it's - "statusnet", but if you have more than one installation on the - server, you may want to change the name for each instance so - you can track log messages more easily. -priority: level to log at. Currently ignored. -facility: what syslog facility to used. Defaults to LOG_USER, only - reset if you know what syslog is and have a good reason - to change it. - -queue ------ - -You can configure the software to queue time-consuming tasks, like -sending out SMS email or XMPP messages, for off-line processing. See -'Queues and daemons' above for how to set this up. - -enabled: Whether to uses queues. Defaults to false. -subsystem: Which kind of queueserver to use. Values include "db" for - our hacked-together database queuing (no other server - required) and "stomp" for a stomp server. -stomp_server: "broker URI" for stomp server. Something like - "tcp://hostname:61613". More complicated ones are - possible; see your stomp server's documentation for - details. -queue_basename: a root name to use for queues (stomp only). Typically - something like '/queue/sitename/' makes sense. If running - multiple instances on the same server, make sure that - either this setting or $config['site']['nickname'] are - unique for each site to keep them separate. - -stomp_username: username for connecting to the stomp server; defaults - to null. -stomp_password: password for connecting to the stomp server; defaults - to null. - -stomp_persistent: keep items across queue server restart, if enabled. - Under ActiveMQ, the server configuration determines if and how - persistent storage is actually saved. - - If using a message queue server other than ActiveMQ, you may - need to disable this if it does not support persistence. - -stomp_transactions: use transactions to aid in error detection. - A broken transaction will be seen quickly, allowing a message - to be redelivered immediately if a daemon crashes. - - If using a message queue server other than ActiveMQ, you may - need to disable this if it does not support transactions. - -stomp_acks: send acknowledgements to aid in flow control. - An acknowledgement of successful processing tells the server - we're ready for more and can help keep things moving smoothly. - - This should *not* be turned off when running with ActiveMQ, but - if using another message queue server that does not support - acknowledgements you might need to disable this. - -softlimit: an absolute or relative "soft memory limit"; daemons will - restart themselves gracefully when they find they've hit - this amount of memory usage. Defaults to 90% of PHP's global - memory_limit setting. - -inboxes: delivery of messages to receiver's inboxes can be delayed to - queue time for best interactive performance on the sender. - This may however be annoyingly slow when using the DB queues, - so you can set this to false if it's causing trouble. - -breakout: for stomp, individual queues are by default grouped up for - best scalability. If some need to be run by separate daemons, - etc they can be manually adjusted here. - - Default will share all queues for all sites within each group. - Specify as / or //, - using nickname identifier as site. - - 'main/distrib' separate "distrib" queue covering all sites - 'xmpp/xmppout/mysite' separate "xmppout" queue covering just 'mysite' - -max_retries: for stomp, drop messages after N failed attempts to process. - Defaults to 10. - -dead_letter_dir: for stomp, optional directory to dump data on failed - queue processing events after discarding them. - -stomp_no_transactions: for stomp, the server does not support transactions, - so do not try to user them. This is needed for http://www.morbidq.com/. - -stomp_no_acks: for stomp, the server does not support acknowledgements. - so do not try to user them. This is needed for http://www.morbidq.com/. - -license -------- - -The default license to use for your users notices. The default is the -Creative Commons Attribution 3.0 license, which is probably the right -choice for any public site. Note that some other servers will not -accept notices if you apply a stricter license than this. - -type: one of 'cc' (for Creative Commons licenses), 'allrightsreserved' - (default copyright), or 'private' (for private and confidential - information). -owner: for 'allrightsreserved' or 'private', an assigned copyright - holder (for example, an employer for a private site). If - not specified, will be attributed to 'contributors'. -url: URL of the license, used for links. -title: Title for the license, like 'Creative Commons Attribution 3.0'. -image: A button shown on each page for the license. - -mail ----- - -This is for configuring out-going email. We use PEAR's Mail module, -see: http://pear.php.net/manual/en/package.mail.mail.factory.php - -backend: the backend to use for mail, one of 'mail', 'sendmail', and - 'smtp'. Defaults to PEAR's default, 'mail'. -params: if the mail backend requires any parameters, you can provide - them in an associative array. - -nickname --------- - -This is for configuring nicknames in the service. - -blacklist: an array of strings for usernames that may not be - registered. A default array exists for strings that are - used by StatusNet (e.g. 'doc', 'main', 'avatar', 'theme') - but you may want to add others if you have other software - installed in a subdirectory of StatusNet or if you just - don't want certain words used as usernames. -featured: an array of nicknames of 'featured' users of the site. - Can be useful to draw attention to well-known users, or - interesting people, or whatever. - -avatar ------- - -For configuring avatar access. - -dir: Directory to look for avatar files and to put them into. - Defaults to avatar subdirectory of install directory; if - you change it, make sure to change path, too. -path: Path to avatars. Defaults to path for avatar subdirectory, - but you can change it if you wish. Note that this will - be included with the avatar server, too. -server: If set, defines another server where avatars are stored in the - root directory. Note that the 'avatar' subdir still has to be - writeable. You'd typically use this to split HTTP requests on - the client to speed up page loading, either with another - virtual server or with an NFS or SAMBA share. Clients - typically only make 2 connections to a single server at a - time , so this can parallelize the job. - Defaults to null. -ssl: Whether to access avatars using HTTPS. Defaults to null, meaning - to guess based on site-wide SSL settings. - -public ------- - -For configuring the public stream. - -localonly: If set to true, only messages posted by users of this - service (rather than other services, filtered through OMB) - are shown in the public stream. Default true. -blacklist: An array of IDs of users to hide from the public stream. - Useful if you have someone making excessive Twitterfeed posts - to the site, other kinds of automated posts, testing bots, etc. -autosource: Sources of notices that are from automatic posters, and thus - should be kept off the public timeline. Default empty. - -theme ------ - -server: Like avatars, you can speed up page loading by pointing the - theme file lookup to another server (virtual or real). - Defaults to NULL, meaning to use the site server. -dir: Directory where theme files are stored. Used to determine - whether to show parts of a theme file. Defaults to the theme - subdirectory of the install directory. -path: Path part of theme URLs, before the theme name. Relative to the - theme server. It may make sense to change this path when upgrading, - (using version numbers as the path) to make sure that all files are - reloaded by caching clients or proxies. Defaults to null, - which means to use the site path + '/theme'. -ssl: Whether to use SSL for theme elements. Default is null, which means - guess based on site SSL settings. -sslserver: SSL server to use when page is HTTPS-encrypted. If - unspecified, site ssl server and so on will be used. -sslpath: If sslserver if defined, path to use when page is HTTPS-encrypted. - -javascript ----------- - -server: You can speed up page loading by pointing the - theme file lookup to another server (virtual or real). - Defaults to NULL, meaning to use the site server. -path: Path part of Javascript URLs. Defaults to null, - which means to use the site path + '/js/'. -ssl: Whether to use SSL for JavaScript files. Default is null, which means - guess based on site SSL settings. -sslserver: SSL server to use when page is HTTPS-encrypted. If - unspecified, site ssl server and so on will be used. -sslpath: If sslserver if defined, path to use when page is HTTPS-encrypted. -bustframes: If true, all web pages will break out of framesets. If false, - can comfortably live in a frame or iframe... probably. Default - to true. - -xmpp ----- - -For configuring the XMPP sub-system. - -enabled: Whether to accept and send messages by XMPP. Default false. -server: server part of XMPP ID for update user. -port: connection port for clients. Default 5222, which you probably - shouldn't need to change. -user: username for the client connection. Users will receive messages - from 'user'@'server'. -resource: a unique identifier for the connection to the server. This - is actually used as a prefix for each XMPP component in the system. -password: password for the user account. -host: some XMPP domains are served by machines with a different - hostname. (For example, @gmail.com GTalk users connect to - talk.google.com). Set this to the correct hostname if that's the - case with your server. -encryption: Whether to encrypt the connection between StatusNet and the - XMPP server. Defaults to true, but you can get - considerably better performance turning it off if you're - connecting to a server on the same machine or on a - protected network. -debug: if turned on, this will make the XMPP library blurt out all of - the incoming and outgoing messages as XML stanzas. Use as a - last resort, and never turn it on if you don't have queues - enabled, since it will spit out sensitive data to the browser. -public: an array of JIDs to send _all_ notices to. This is useful for - participating in third-party search and archiving services. - -invite ------- - -For configuring invites. - -enabled: Whether to allow users to send invites. Default true. - -tag ---- - -Miscellaneous tagging stuff. - -dropoff: Decay factor for tag listing, in seconds. - Defaults to exponential decay over ten days; you can twiddle - with it to try and get better results for your site. - -popular -------- - -Settings for the "popular" section of the site. - -dropoff: Decay factor for popularity listing, in seconds. - Defaults to exponential decay over ten days; you can twiddle - with it to try and get better results for your site. - -daemon ------- - -For daemon processes. - -piddir: directory that daemon processes should write their PID file - (process ID) to. Defaults to /var/run/, which is where this - stuff should usually go on Unix-ish systems. -user: If set, the daemons will try to change their effective user ID - to this user before running. Probably a good idea, especially if - you start the daemons as root. Note: user name, like 'daemon', - not 1001. -group: If set, the daemons will try to change their effective group ID - to this named group. Again, a name, not a numerical ID. - -memcached ---------- - -You can get a significant boost in performance by caching some -database data in memcached . - -enabled: Set to true to enable. Default false. -server: a string with the hostname of the memcached server. Can also - be an array of hostnames, if you've got more than one server. -base: memcached uses key-value pairs to store data. We build long, - funny-looking keys to make sure we don't have any conflicts. The - base of the key is usually a simplified version of the site name - (like "Identi.ca" => "identica"), but you can overwrite this if - you need to. You can safely ignore it if you only have one - StatusNet site using your memcached server. -port: Port to connect to; defaults to 11211. - -emailpost ---------- - -For post-by-email. - -enabled: Whether to enable post-by-email. Defaults to true. You will - also need to set up maildaemon.php. - -sms ---- - -For SMS integration. - -enabled: Whether to enable SMS integration. Defaults to true. Queues - should also be enabled. - -integration ------------ - -A catch-all for integration with other systems. - -taguri: base for tag:// URIs. Defaults to site-server + ',2009'. - -inboxes -------- - -For notice inboxes. - -enabled: No longer used. If you set this to something other than true, - StatusNet will no longer run. - -throttle --------- - -For notice-posting throttles. - -enabled: Whether to throttle posting. Defaults to false. -count: Each user can make this many posts in 'timespan' seconds. So, if count - is 100 and timespan is 3600, then there can be only 100 posts - from a user every hour. -timespan: see 'count'. - -profile -------- - -Profile management. - -biolimit: max character length of bio; 0 means no limit; null means to use - the site text limit default. -backup: whether users can backup their own profiles. Defaults to true. -restore: whether users can restore their profiles from backup files. Defaults - to true. -delete: whether users can delete their own accounts. Defaults to false. -move: whether users can move their accounts to another server. Defaults - to true. - -newuser -------- - -Options with new users. - -default: nickname of a user account to automatically subscribe new - users to. Typically this would be system account for e.g. - service updates or announcements. Users are able to unsub - if they want. Default is null; no auto subscribe. -welcome: nickname of a user account that sends welcome messages to new - users. Can be the same as 'default' account, although on - busy servers it may be a good idea to keep that one just for - 'urgent' messages. Default is null; no message. - -If either of these special user accounts are specified, the users should -be created before the configuration is updated. - -snapshot --------- - -The software will, by default, send statistical snapshots about the -local installation to a stats server on the status.net Web site. This -data is used by the developers to prioritize development decisions. No -identifying data about users or organizations is collected. The data -is available to the public for review. Participating in this survey -helps StatusNet developers take your needs into account when updating -the software. - -run: string indicating when to run the statistics. Values can be 'web' - (run occasionally at Web time), 'cron' (run from a cron script), - or 'never' (don't ever run). If you set it to 'cron', remember to - schedule the script to run on a regular basis. -frequency: if run value is 'web', how often to report statistics. - Measured in Web hits; depends on how active your site is. - Default is 10000 -- that is, one report every 10000 Web hits, - on average. -reporturl: URL to post statistics to. Defaults to StatusNet developers' - report system, but if they go evil or disappear you may - need to update this to another value. Note: if you - don't want to report stats, it's much better to - set 'run' to 'never' than to set this value to something - nonsensical. - -attachments ------------ - -The software lets users upload files with their notices. You can configure -the types of accepted files by mime types and a trio of quota options: -per file, per user (total), per user per month. - -We suggest the use of the pecl file_info extension to handle mime type -detection. - -supported: an array of mime types you accept to store and distribute, - like 'image/gif', 'video/mpeg', 'audio/mpeg', etc. Make sure you - setup your server to properly recognize the types you want to - support. -uploads: false to disable uploading files with notices (true by default). -filecommand: The required MIME_Type library may need to use the 'file' - command. It tries the one in the Web server's path, but if - you're having problems with uploads, try setting this to the - correct value. Note: 'file' must accept '-b' and '-i' options. - -For quotas, be sure you've set the upload_max_filesize and post_max_size -in php.ini to be large enough to handle your upload. In httpd.conf -(if you're using apache), check that the LimitRequestBody directive isn't -set too low (it's optional, so it may not be there at all). - -file_quota: maximum size for a single file upload in bytes. A user can send - any amount of notices with attachments as long as each attachment - is smaller than file_quota. -user_quota: total size in bytes a user can store on this server. Each user - can store any number of files as long as their total size does - not exceed the user_quota. -monthly_quota: total size permitted in the current month. This is the total - size in bytes that a user can upload each month. -dir: directory accessible to the Web process where uploads should go. - Defaults to the 'file' subdirectory of the install directory, which - should be writeable by the Web user. -server: server name to use when creating URLs for uploaded files. - Defaults to null, meaning to use the default Web server. Using - a virtual server here can speed up Web performance. -path: URL path, relative to the server, to find files. Defaults to - main path + '/file/'. -ssl: whether to use HTTPS for file URLs. Defaults to null, meaning to - guess based on other SSL settings. -filecommand: command to use for determining the type of a file. May be - skipped if fileinfo extension is installed. Defaults to - '/usr/bin/file'. -sslserver: if specified, this server will be used when creating HTTPS - URLs. Otherwise, the site SSL server will be used, with /file/ path. -sslpath: if this and the sslserver are specified, this path will be used - when creating HTTPS URLs. Otherwise, the attachments|path value - will be used. - -group ------ - -Options for group functionality. - -maxaliases: maximum number of aliases a group can have. Default 3. Set - to 0 or less to prevent aliases in a group. -desclimit: maximum number of characters to allow in group descriptions. - null (default) means to use the site-wide text limits. 0 - means no limit. -addtag: Whether to add a tag for the group nickname for every group post - (pre-1.0.x behaviour). Defaults to false. - -oembed --------- - -oEmbed endpoint for multimedia attachments (links in posts). Will also -work as 'oohembed' for backwards compatibility. - -endpoint: oohembed endpoint using http://oohembed.com/ software. Defaults to - 'http://oohembed.com/oohembed/'. -order: Array of methods to check for OEmbed data. Methods include 'built-in' - (use a built-in function to simulate oEmbed for some sites), - 'well-known' (use well-known public oEmbed endpoints), - 'discovery' (discover using headers in HTML), 'service' (use - a third-party service, like oohembed or embed.ly. Default is - array('built-in', 'well-known', 'service', 'discovery'). Note that very - few sites implement oEmbed; 'discovery' is going to fail 99% of the - time. - -search ------- - -Some stuff for search. - -type: type of search. Ignored if PostgreSQL or Sphinx are enabled. Can either - be 'fulltext' (default) or 'like'. The former is faster and more efficient - but requires the lame old MyISAM engine for MySQL. The latter - will work with InnoDB but could be miserably slow on large - systems. We'll probably add another type sometime in the future, - with our own indexing system (maybe like MediaWiki's). - -sessions --------- - -Session handling. - -handle: boolean. Whether we should register our own PHP session-handling - code (using the database and memcache if enabled). Defaults to false. - Setting this to true makes some sense on large or multi-server - sites, but it probably won't hurt for smaller ones, either. -debug: whether to output debugging info for session storage. Can help - with weird session bugs, sometimes. Default false. - -background ----------- - -Users can upload backgrounds for their pages; this section defines -their use. - -server: the server to use for background. Using a separate (even - virtual) server for this can speed up load times. Default is - null; same as site server. -dir: directory to write backgrounds too. Default is '/background/' - subdir of install dir. -path: path to backgrounds. Default is sub-path of install path; note - that you may need to change this if you change site-path too. -sslserver: SSL server to use when page is HTTPS-encrypted. If - unspecified, site ssl server and so on will be used. -sslpath: If sslserver if defined, path to use when page is HTTPS-encrypted. - -ping ----- - -Using the "XML-RPC Ping" method initiated by weblogs.com, the site can -notify third-party servers of updates. - -notify: an array of URLs for ping endpoints. Default is the empty - array (no notification). - -design ------- - -Default design (colors and background) for the site. Actual appearance -depends on the theme. Null values mean to use the theme defaults. - -backgroundcolor: Hex color of the site background. -contentcolor: Hex color of the content area background. -sidebarcolor: Hex color of the sidebar background. -textcolor: Hex color of all non-link text. -linkcolor: Hex color of all links. -backgroundimage: Image to use for the background. -disposition: Flags for whether or not to tile the background image. - -notice ------- - -Configuration options specific to notices. - -contentlimit: max length of the plain-text content of a notice. - Default is null, meaning to use the site-wide text limit. - 0 means no limit. -defaultscope: default scope for notices. Defaults to 0; set to - 1 to keep notices private to this site by default. - -message -------- - -Configuration options specific to messages. - -contentlimit: max length of the plain-text content of a message. - Default is null, meaning to use the site-wide text limit. - 0 means no limit. - -logincommand ------------- - -Configuration options for the login command. - -disabled: whether to enable this command. If enabled, users who send - the text 'login' to the site through any channel will - receive a link to login to the site automatically in return. - Possibly useful for users who primarily use an XMPP or SMS - interface and can't be bothered to remember their site - password. Note that the security implications of this are - pretty serious and have not been thoroughly tested. You - should enable it only after you've convinced yourself that - it is safe. Default is 'false'. - -singleuser ----------- - -If an installation has only one user, this can simplify a lot of the -interface. It also makes the user's profile the root URL. - -enabled: Whether to run in "single user mode". Default false. -nickname: nickname of the single user. If no nickname is specified, - the site owner account will be used (if present). - -robotstxt ---------- - -We put out a default robots.txt file to guide the processing of -Web crawlers. See http://www.robotstxt.org/ for more information -on the format of this file. - -crawldelay: if non-empty, this value is provided as the Crawl-Delay: - for the robots.txt file. see http://ur1.ca/l5a0 - for more information. Default is zero, no explicit delay. -disallow: Array of (virtual) directories to disallow. Default is 'main', - 'search', 'message', 'settings', 'admin'. Ignored when site - is private, in which case the entire site ('/') is disallowed. - -api ---- - -Options for the Twitter-like API. - -realm: HTTP Basic Auth realm (see http://tools.ietf.org/html/rfc2617 - for details). Some third-party tools like ping.fm want this to be - 'Identi.ca API', so set it to that if you want to. default = null, - meaning 'something based on the site name'. - -nofollow --------- - -We optionally put 'rel="nofollow"' on some links in some pages. The -following configuration settings let you fine-tune how or when things -are nofollowed. See http://en.wikipedia.org/wiki/Nofollow for more -information on what 'nofollow' means. - -subscribers: whether to nofollow links to subscribers on the profile - and personal pages. Default is true. -members: links to members on the group page. Default true. -peopletag: links to people listed in the peopletag page. Default true. -external: external links in notices. One of three values: 'sometimes', - 'always', 'never'. If 'sometimes', then external links are not - nofollowed on profile, notice, and favorites page. Default is - 'sometimes'. - -url ---- - -Everybody loves URL shorteners. These are some options for fine-tuning -how and when the server shortens URLs. - -shortener: URL shortening service to use by default. Users can override - individually. 'ur1.ca' by default. -maxlength: If an URL is strictly longer than this limit, it will be - shortened. Note that the URL shortener service may return an - URL longer than this limit. Defaults to 25. Users can - override. If set to 0, all URLs will be shortened. -maxnoticelength: If a notice is strictly longer than this limit, all - URLs in the notice will be shortened. Users can override. - -1 means the text limit for notices. - -router ------- - -We use a router class for mapping URLs to code. This section controls -how that router works. - -cache: whether to cache the router in memcache (or another caching - mechanism). Defaults to true, but may be set to false for - developers (who might be actively adding pages, so won't want the - router cached) or others who see strange behavior. You're unlikely - to need this unless you're a developer. - -http ----- - -Settings for the HTTP client. - -ssl_cafile: location of the CA file for SSL. If not set, won't verify - SSL peers. Default unset. -curl: Use cURL for doing HTTP calls. You must - have the PHP curl extension installed for this to work. -proxy_host: Host to use for proxying HTTP requests. If unset, doesn't - do any HTTP proxy stuff. Default unset. -proxy_port: Port to use to connect to HTTP proxy host. Default null. -proxy_user: Username to use for authenticating to the HTTP proxy. Default null. -proxy_password: Password to use for authenticating to the HTTP proxy. Default null. -proxy_auth_scheme: Scheme to use for authenticating to the HTTP proxy. Default null. - -plugins -------- - -default: associative array mapping plugin name to array of arguments. To disable - a default plugin, unset its value in this array. -locale_path: path for finding plugin locale files. In the plugin's directory - by default. -server: Server to find static files for a plugin when the page is plain old HTTP. - Defaults to site/server (same as pages). Use this to move plugin CSS and - JS files to a CDN. -sslserver: Server to find static files for a plugin when the page is HTTPS. Defaults - to site/server (same as pages). Use this to move plugin CSS and JS files - to a CDN. -path: Path to the plugin files. defaults to site/path + '/plugins/'. Expects that - each plugin will have a subdirectory at plugins/NameOfPlugin. Change this - if you're using a CDN. -sslpath: Path to use on the SSL server. Same as plugins/path. - -Plugins -======= - -Beginning with the 0.7.x branch, StatusNet has supported a simple but -powerful plugin architecture. Important events in the code are named, -like 'StartNoticeSave', and other software can register interest -in those events. When the events happen, the other software is called -and has a choice of accepting or rejecting the events. - -In the simplest case, you can add a function to config.php and use the -Event::addHandler() function to hook an event: - - function AddGoogleLink($action) - { - $action->menuItem('http://www.google.com/', _('Google'), _('Search engine')); - return true; - } - - Event::addHandler('EndPrimaryNav', 'AddGoogleLink'); - -This adds a menu item to the end of the main navigation menu. You can -see the list of existing events, and parameters that handlers must -implement, in EVENTS.txt. - -The Plugin class in lib/plugin.php makes it easier to write more -complex plugins. Sub-classes can just create methods named -'onEventName', where 'EventName' is the name of the event (case -matters!). These methods will be automatically registered as event -handlers by the Plugin constructor (which you must call from your own -class's constructor). - -Several example plugins are included in the plugins/ directory. You -can enable a plugin with the following line in config.php: - - addPlugin('Example', array('param1' => 'value1', - 'param2' => 'value2')); - -This will look for and load files named 'ExamplePlugin.php' or -'Example/ExamplePlugin.php' either in the plugins/ directory (for -plugins that ship with StatusNet) or in the local/ directory (for -plugins you write yourself or that you get from somewhere else) or -local/plugins/. - -Plugins are documented in their own directories. +A full changelog is available at http://status.net/wiki/StatusNet_1.1.1. Troubleshooting =============== @@ -1693,32 +133,6 @@ repository (see below), and you get a compilation error ("unexpected T_STRING") in the browser, check to see that you don't have any conflicts in your code. -If you upgraded to StatusNet 0.9.x without reading the "Notice -inboxes" section above, and all your users' 'Personal' tabs are empty, -read the "Notice inboxes" section above. - -Myths -===== - -These are some myths you may see on the Web about StatusNet. -Documentation from the core team about StatusNet has been pretty -sparse, so some backtracking and guesswork resulted in some incorrect -assumptions. - -- "Set $config['db']['debug'] = 5 to debug the database." This is an - extremely bad idea. It's a tool built into DB_DataObject that will - emit oodles of print lines directly to the browser of your users. - Among these lines will be your database username and password. Do - not enable this option on a production Web site for any reason. - -- "Edit dataobject.ini with the following settings..." dataobject.ini - is a development file for the DB_DataObject framework and is not - used by the running software. It was removed from the StatusNet - distribution because its presence was confusing. Do not bother - configuring dataobject.ini, and do not put your database username - and password into the file on a production Web server; unscrupulous - persons may try to read it to get your passwords. - Unstable version ================ @@ -1753,11 +167,12 @@ There are several ways to get more information about StatusNet. Feedback ======== -* Microblogging messages to http://support.status.net/ are very welcome. -* The microblogging group http://identi.ca/group/statusnet is a good +* Messages to http://support.status.net/ are very welcome. +* The group http://identi.ca/group/statusnet is a good place to discuss the software. * StatusNet has a bug tracker for any defects you may find, or ideas for - making things better. http://status.net/bugs + making things better. http://status.net/open-source/issues +* The StatusNet forum is at http://forum.status.net/. Credits ======= diff --git a/UPGRADE b/UPGRADE new file mode 100644 index 0000000000..2ae96e0dae --- /dev/null +++ b/UPGRADE @@ -0,0 +1,117 @@ +Upgrading +========= + +If you've been using StatusNet 1.0 or lower, or if you've +been tracking the "git" version of the software, you will probably +want to upgrade and keep your existing data. Try these step-by-step +instructions; read to the end first before trying them. + +0. Download StatusNet and set up all the prerequisites as if you were + doing a new install. +1. Make backups of both your database and your Web directory. UNDER NO + CIRCUMSTANCES should you try to do an upgrade without a known-good + backup. You have been warned. +2. Shut down Web access to your site, either by turning off your Web + server or by redirecting all pages to a "sorry, under maintenance" + page. +3. Shut down XMPP access to your site, typically by shutting down the + xmppdaemon.php process and all other daemons that you're running. + If you've got "monit" or "cron" automatically restarting your + daemons, make sure to turn that off, too. +4. Shut down SMS and email access to your site. The easy way to do + this is to comment out the line piping incoming email to your + maildaemon.php file, and running something like "newaliases". +5. Once all writing processes to your site are turned off, make a + final backup of the Web directory and database. +6. Move your StatusNet directory to a backup spot, like "statusnet.bak". +7. Unpack your StatusNet 1.1.1 tarball and move it to "statusnet" or + wherever your code used to be. +8. Copy the config.php file and the contents of the avatar/, background/, + file/, and local/ subdirectories from your old directory to your new + directory. +9. Copy htaccess.sample to .htaccess in the new directory. Change the + RewriteBase to use the correct path. +10. Upgrade the database. + + NOTE: this step is destructive and cannot be + reversed. YOU CAN EASILY DESTROY YOUR SITE WITH THIS STEP. Don't + do it without a known-good backup! + + In your new StatusNet 1.1.1 directory and AFTER YOU MAKE A + BACKUP run the upgrade.php script like this: + + php ./scripts/upgrade.php + +11. Use mysql or psql client to log into your database and make sure that + the notice, user, profile, subscription etc. tables are non-empty. +12. Turn back on the Web server, and check that things still work. +13. Turn back on XMPP bots and email maildaemon. + +NOTE: the 1.0.0 version of StatusNet changed the URLs for all admin +panels from /admin/* to /panel/*. This now allows the (popular) +username 'admin', but blocks the considerably less popular username +'panel'. If you have an existing user named 'panel', you should rename +them before upgrading. + +UTF-8 Database +-------------- + +If you are upgrading from a 0.8.x or 0.9.x version, you can safely +skip this section. + +StatusNet 0.7.4 introduced a fix for some incorrectly-stored +international characters ("UTF-8"). This fix is not +backwards-compatible; installations from before 0.7.4 will show +non-ASCII characters of old notices incorrectly. This section explains +what to do. + +0. You can disable the new behaviour by setting the 'db''utf8' config + option to "false". You should only do this until you're ready to + convert your DB to the new format. +1. When you're ready to convert, you can run the fixup_utf8.php script + in the scripts/ subdirectory. If you've had the "new behaviour" + enabled (probably a good idea), you can give the ID of the first + "new" notice as a parameter, and only notices before that one will + be converted. Notices are converted in reverse chronological order, + so the most recent (and visible) ones will be converted first. The + script should work whether or not you have the 'db''utf8' config + option enabled. +2. When you're ready, set $config['db']['utf8'] to true, so that + new notices will be stored correctly. + +Older versions +============== + +IMPORTANT NOTE: StatusNet 0.7.4 introduced a fix for some +incorrectly-stored international characters ("UTF-8"). For new +installations, it will now store non-ASCII characters correctly. +However, older installations will have the incorrect storage, and will +consequently show up "wrong" in browsers. See below for how to deal +with this situation. + +NOTE: the database definition file, laconica.ini, has been renamed to +statusnet.ini (since this is the recommended database name). If you +have a line in your config.php pointing to the old name, you'll need +to update it. + +Note that the XMPP bots have changed since version 0.5; see above for +details. + +Privacy +======= + +With StatusNet 1.0, our default install profile is for private sites. + +If you did not specify the privacy level of your site previously, it +was public. Now, it's private. + +If you upgrade a public site, you will need to reset the privacy +level. You can do this in your config.php: + + $config['site']['private'] = false; + +...or with setconfig.php in the db: + + php setconfig.php site private false + +...or with the site admin panel. diff --git a/actions/accessadminpanel.php b/actions/accessadminpanel.php index 027c69c5e5..55fc349f25 100644 --- a/actions/accessadminpanel.php +++ b/actions/accessadminpanel.php @@ -187,9 +187,9 @@ class AccessAdminPanelForm extends AdminForm */ function formActions() { - // TRANS: Title for button to save access settings in site admin panel. - $title = _('Save access settings'); - // TRANS: Tooltip for button to save access settings in site admin panel. + // TRANS: Button title to save access settings in site admin panel. + $title = _('Save access settings.'); + // TRANS: Button text to save access settings in site admin panel. $this->out->submit('submit', _m('BUTTON', 'Save'), 'submit', null, $title); } } diff --git a/actions/addpeopletag.php b/actions/addpeopletag.php index 1e130e27e8..a661104d5c 100644 --- a/actions/addpeopletag.php +++ b/actions/addpeopletag.php @@ -111,18 +111,6 @@ class AddpeopletagAction extends Action return false; } - // OMB 0.1 doesn't have a mechanism for local-server- - // originated tag. - - $omb01 = Remote_profile::staticGet('id', $tagged_id); - - if (!empty($omb01)) { - // TRANS: Client error displayed when trying to add an OMB 0.1 remote profile to a list. - $this->clientError(_('You cannot list an OMB 0.1 '. - 'remote profile with this action.')); - return false; - } - return true; } diff --git a/actions/all.php b/actions/all.php index 2e53691636..1d9509f6db 100644 --- a/actions/all.php +++ b/actions/all.php @@ -1,7 +1,7 @@ user, Profile::current()); + $user = common_current_user(); + + if (!empty($user) && $user->streamModeOnly()) { + $stream = new InboxNoticeStream($this->user, Profile::current()); + } else { + $stream = new ThreadingInboxNoticeStream($this->user, Profile::current()); + } $this->notice = $stream->getNotices(($this->page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1); @@ -85,7 +91,7 @@ class AllAction extends ProfileAction function title() { $user = common_current_user(); - if ($user->id == $this->user->id) { + if (!empty($user) && $user->id == $this->user->id) { // TRANS: Title of a user's own start page. return _('Home timeline'); } else { @@ -99,6 +105,15 @@ class AllAction extends ProfileAction function getFeeds() { return array( + new Feed(Feed::JSON, + common_local_url( + 'ApiTimelineFriends', array( + 'format' => 'as', + 'id' => $this->user->nickname + ) + ), + // TRANS: %s is user nickname. + sprintf(_('Feed for friends of %s (Activity Streams JSON)'), $this->user->nickname)), new Feed(Feed::RSS1, common_local_url( 'allrss', array( @@ -145,7 +160,7 @@ class AllAction extends ProfileAction $message .= sprintf(_('You can try to [nudge %1$s](../%2$s) from their profile or [post something to them](%%%%action.newnotice%%%%?status_textarea=%3$s).'), $this->user->nickname, $this->user->nickname, '@' . $this->user->nickname); } } else { - // TRANS: Encoutagement displayed on empty timeline user pages for anonymous users. + // TRANS: Encouragement displayed on empty timeline user pages for anonymous users. // TRANS: %s is a user nickname. This message contains Markdown links. Keep "](" together. $message .= sprintf(_('Why not [register an account](%%%%action.register%%%%) and then nudge %s or post a notice to them.'), $this->user->nickname); } @@ -167,7 +182,11 @@ class AllAction extends ProfileAction $profile = $current_user->getProfile(); } - $nl = new ThreadedNoticeList($this->notice, $this, $profile); + if (!empty($current_user) && $current_user->streamModeOnly()) { + $nl = new NoticeList($this->notice, $this); + } else { + $nl = new ThreadedNoticeList($this->notice, $this, $profile); + } $cnt = $nl->show(); @@ -186,12 +205,29 @@ class AllAction extends ProfileAction function showSections() { - $ibs = new InviteButtonSection($this); - $ibs->show(); - $pop = new PopularNoticeSection($this); - $pop->show(); - // $pop = new InboxTagCloudSection($this, $this->user); - // $pop->show(); + // Show invite button, as long as site isn't closed, and + // we have a logged in user. + if (common_config('invite', 'enabled') && !common_config('site', 'closed') && common_logged_in()) { + if (!common_config('site', 'private')) { + $ibs = new InviteButtonSection( + $this, + // TRANS: Button text for inviting more users to the StatusNet instance. + // TRANS: Less business/enterprise-oriented language for public sites. + _m('BUTTON', 'Send invite') + ); + } else { + $ibs = new InviteButtonSection($this); + } + $ibs->show(); + } + // XXX: make this a little more convenient + + if (!common_config('performance', 'high')) { + $pop = new PopularNoticeSection($this, Profile::current()); + $pop->show(); + $pop = new InboxTagCloudSection($this, $this->user); + $pop->show(); + } } } diff --git a/actions/apiaccountupdateprofilebackgroundimage.php b/actions/apiaccountupdateprofilebackgroundimage.php deleted file mode 100644 index bb0cef52a4..0000000000 --- a/actions/apiaccountupdateprofilebackgroundimage.php +++ /dev/null @@ -1,215 +0,0 @@ -. - * - * @category API - * @package StatusNet - * @author Zach Copley - * @copyright 2009 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ - -if (!defined('STATUSNET')) { - exit(1); -} - -require_once INSTALLDIR . '/lib/apiauth.php'; - -/** - * Update the authenticating user's profile background image - * - * @category API - * @package StatusNet - * @author Zach Copley - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ -class ApiAccountUpdateProfileBackgroundImageAction extends ApiAuthAction -{ - var $tile = false; - - /** - * Take arguments for running - * - * @param array $args $_REQUEST args - * - * @return boolean success flag - * - */ - function prepare($args) - { - parent::prepare($args); - - $this->user = $this->auth_user; - $this->tile = $this->arg('tile'); - - return true; - } - - /** - * Handle the request - * - * Check whether the credentials are valid and output the result - * - * @param array $args $_REQUEST data (unused) - * - * @return void - */ - function handle($args) - { - parent::handle($args); - - if ($_SERVER['REQUEST_METHOD'] != 'POST') { - $this->clientError( - // TRANS: Client error. POST is a HTTP command. It should not be translated. - _('This method requires a POST.'), - 400, $this->format - ); - return; - } - - if (!in_array($this->format, array('xml', 'json'))) { - $this->clientError( - // TRANS: Client error displayed when coming across a non-supported API method. - _('API method not found.'), - 404, - $this->format - ); - return; - } - - // Workaround for PHP returning empty $_POST and $_FILES when POST - // length > post_max_size in php.ini - - if (empty($_FILES) - && empty($_POST) - && ($_SERVER['CONTENT_LENGTH'] > 0) - ) { - // TRANS: Client error displayed when the number of bytes in a POST request exceeds a limit. - // TRANS: %s is the number of bytes of the CONTENT_LENGTH. - $msg = _m('The server was unable to handle that much POST data (%s byte) due to its current configuration.', - 'The server was unable to handle that much POST data (%s bytes) due to its current configuration.', - intval($_SERVER['CONTENT_LENGTH'])); - - $this->clientError(sprintf($msg, $_SERVER['CONTENT_LENGTH'])); - return; - } - - if (empty($this->user)) { - // TRANS: Client error when user not found updating a profile background image. - $this->clientError(_('No such user.'), 404, $this->format); - return; - } - - $design = $this->user->getDesign(); - - // XXX: This is kinda gross, but before we can add a background - // img we have to make sure there's a Design because design ID - // is part of the img filename. - - if (empty($design)) { - $this->user->query('BEGIN'); - - // save new design - $design = new Design(); - $id = $design->insert(); - - if (empty($id)) { - common_log_db_error($id, 'INSERT', __FILE__); - // TRANS: Client error displayed when saving design settings fails because of an empty id. - $this->clientError(_('Unable to save your design settings.')); - return; - } - - $original = clone($this->user); - $this->user->design_id = $id; - $result = $this->user->update($original); - - if (empty($result)) { - common_log_db_error($original, 'UPDATE', __FILE__); - // TRANS: Client error displayed when saving design settings fails because of an empty result. - $this->clientError(_('Unable to save your design settings.')); - $this->user->query('ROLLBACK'); - return; - } - - $this->user->query('COMMIT'); - } - - // Okay, now get the image and add it to the design - - try { - $imagefile = ImageFile::fromUpload('image'); - } catch (Exception $e) { - $this->clientError($e->getMessage(), 400, $this->format); - return; - } - - $filename = Design::filename( - $design->id, - image_type_to_extension($imagefile->type), - common_timestamp() - ); - - $filepath = Design::path($filename); - - move_uploaded_file($imagefile->filepath, $filepath); - - // delete any old backround img laying around - - if (isset($design->backgroundimage)) { - @unlink(Design::path($design->backgroundimage)); - } - - $original = clone($design); - $design->backgroundimage = $filename; - $design->setDisposition(true, false, ($this->tile == 'true')); - - $result = $design->update($original); - - if ($result === false) { - common_log_db_error($design, 'UPDATE', __FILE__); - // TRANS: Error displayed when updating design settings fails. - $this->showForm(_('Could not update your design.')); - return; - } - - $profile = $this->user->getProfile(); - - if (empty($profile)) { - // TRANS: Error message displayed when referring to a user without a profile. - $this->clientError(_('User has no profile.')); - return; - } - - $twitter_user = $this->twitterUserArray($profile, true); - - if ($this->format == 'xml') { - $this->initDocument('xml'); - $this->showTwitterXmlUser($twitter_user, 'user', true); - $this->endDocument('xml'); - } elseif ($this->format == 'json') { - $this->initDocument('json'); - $this->showJsonObjects($twitter_user); - $this->endDocument('json'); - } - } -} diff --git a/actions/apiaccountupdateprofilecolors.php b/actions/apiaccountupdateprofilecolors.php deleted file mode 100644 index 4fa85c6877..0000000000 --- a/actions/apiaccountupdateprofilecolors.php +++ /dev/null @@ -1,242 +0,0 @@ -. - * - * @category API - * @package StatusNet - * @author Zach Copley - * @copyright 2009-2010 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ - -if (!defined('STATUSNET')) { - exit(1); -} - -require_once INSTALLDIR . '/lib/apiauth.php'; - -/** - * Sets one or more hex values that control the color scheme of the - * authenticating user's design - * - * @category API - * @package StatusNet - * @author Zach Copley - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ -class ApiAccountUpdateProfileColorsAction extends ApiAuthAction -{ - var $profile_background_color = null; - var $profile_text_color = null; - var $profile_link_color = null; - var $profile_sidebar_fill_color = null; - var $profile_sidebar_border_color = null; - - /** - * Take arguments for running - * - * @param array $args $_REQUEST args - * - * @return boolean success flag - */ - function prepare($args) - { - parent::prepare($args); - - $this->user = $this->auth_user; - - $this->profile_background_color - = $this->trimmed('profile_background_color'); - $this->profile_text_color - = $this->trimmed('profile_text_color'); - $this->profile_link_color - = $this->trimmed('profile_link_color'); - $this->profile_sidebar_fill_color - = $this->trimmed('profile_sidebar_fill_color'); - - // XXX: we don't support changing the sidebar border color - // in our designs. - - $this->profile_sidebar_border_color - = $this->trimmed('profile_sidebar_border_color'); - - // XXX: Unlike Twitter, we do allow people to change the 'content color' - - $this->profile_content_color = $this->trimmed('profile_content_color'); - - return true; - } - - /** - * Handle the request - * - * Try to save the user's colors in her design. Create a new design - * if the user doesn't already have one. - * - * @param array $args $_REQUEST data (unused) - * - * @return void - */ - function handle($args) - { - parent::handle($args); - - if ($_SERVER['REQUEST_METHOD'] != 'POST') { - $this->clientError( - // TRANS: Client error. POST is a HTTP command. It should not be translated. - _('This method requires a POST.'), - 400, $this->format - ); - return; - } - - if (!in_array($this->format, array('xml', 'json'))) { - $this->clientError( - // TRANS: Client error displayed when coming across a non-supported API method. - _('API method not found.'), - 404, - $this->format - ); - return; - } - - $design = $this->user->getDesign(); - - if (!empty($design)) { - $original = clone($design); - - try { - $this->setColors($design); - } catch (WebColorException $e) { - $this->clientError($e->getMessage(), 400, $this->format); - return false; - } - - $result = $design->update($original); - - if ($result === false) { - common_log_db_error($design, 'UPDATE', __FILE__); - // TRANS: Client error displayed when a database error occurs updating profile colours. - $this->clientError(_('Could not update your design.')); - return; - } - } else { - $this->user->query('BEGIN'); - - // save new design - $design = new Design(); - - try { - $this->setColors($design); - } catch (WebColorException $e) { - $this->clientError($e->getMessage(), 400, $this->format); - return false; - } - - $id = $design->insert(); - - if (empty($id)) { - common_log_db_error($id, 'INSERT', __FILE__); - // TRANS: Client error displayed when a database error occurs inserting profile colours. - $this->clientError(_('Unable to save your design settings.')); - return; - } - - $original = clone($this->user); - $this->user->design_id = $id; - $result = $this->user->update($original); - - if (empty($result)) { - common_log_db_error($original, 'UPDATE', __FILE__); - // TRANS: Client error displayed when a database error occurs updating profile colours. - $this->clientError(_('Unable to save your design settings.')); - $this->user->query('ROLLBACK'); - return; - } - - $this->user->query('COMMIT'); - } - - $profile = $this->user->getProfile(); - - if (empty($profile)) { - // TRANS: Error message displayed when referring to a user without a profile. - $this->clientError(_('User has no profile.')); - return; - } - - $twitter_user = $this->twitterUserArray($profile, true); - - if ($this->format == 'xml') { - $this->initDocument('xml'); - $this->showTwitterXmlUser($twitter_user, 'user', true); - $this->endDocument('xml'); - } elseif ($this->format == 'json') { - $this->initDocument('json'); - $this->showJsonObjects($twitter_user); - $this->endDocument('json'); - } - } - - /** - * Sets the user's design colors based on the request parameters - * - * @param Design $design the user's Design - * - * @return void - */ - function setColors($design) - { - $bgcolor = empty($this->profile_background_color) ? - null : new WebColor($this->profile_background_color); - $tcolor = empty($this->profile_text_color) ? - null : new WebColor($this->profile_text_color); - $sbcolor = empty($this->profile_sidebar_fill_color) ? - null : new WebColor($this->profile_sidebar_fill_color); - $lcolor = empty($this->profile_link_color) ? - null : new WebColor($this->profile_link_color); - $ccolor = empty($this->profile_content_color) ? - null : new WebColor($this->profile_content_color); - - if (!empty($bgcolor)) { - $design->backgroundcolor = $bgcolor->intValue(); - } - - if (!empty($ccolor)) { - $design->contentcolor = $ccolor->intValue(); - } - - if (!empty($sbcolor)) { - $design->sidebarcolor = $sbcolor->intValue(); - } - - if (!empty($tcolor)) { - $design->textcolor = $tcolor->intValue(); - } - - if (!empty($lcolor)) { - $design->linkcolor = $lcolor->intValue(); - } - - return true; - } -} diff --git a/actions/apiconversation.php b/actions/apiconversation.php new file mode 100644 index 0000000000..504787b9a2 --- /dev/null +++ b/actions/apiconversation.php @@ -0,0 +1,238 @@ +. + * + * @category API + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + // This check helps protect against security problems; + // your code file can't be executed directly from the web. + exit(1); +} + +require_once INSTALLDIR . '/lib/apiauth.php'; + +/** + * Show a stream of notices in a particular conversation + * + * @category API + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ +class ApiconversationAction extends ApiAuthAction +{ + protected $conversation = null; + protected $notices = null; + + /** + * For initializing members of the class. + * + * @param array $argarray misc. arguments + * + * @return boolean true + */ + function prepare($argarray) + { + parent::prepare($argarray); + + $convId = $this->trimmed('id'); + + if (empty($convId)) { + // TRANS: Client exception thrown when no conversation ID is given. + throw new ClientException(_('No conversation ID.')); + } + + $this->conversation = Conversation::staticGet('id', $convId); + + if (empty($this->conversation)) { + // TRANS: Client exception thrown when referring to a non-existing conversation ID (%d). + throw new ClientException(sprintf(_('No conversation with ID %d.'), $convId), + 404); + } + + $profile = Profile::current(); + + $stream = new ConversationNoticeStream($convId, $profile); + + $notice = $stream->getNotices(($this->page-1) * $this->count, + $this->count, + $this->since_id, + $this->max_id); + + $this->notices = $notice->fetchAll(); + + return true; + } + + /** + * Handler method + * + * @param array $argarray is ignored since it's now passed in in prepare() + * + * @return void + */ + function handle($argarray=null) + { + $sitename = common_config('site', 'name'); + // TRANS: Title for conversion timeline. + $title = _m('TITLE', 'Conversation'); + $id = common_local_url('apiconversation', array('id' => $this->conversation->id, 'format' => $this->format)); + $link = common_local_url('conversation', array('id' => $this->conversation->id)); + + $self = $id; + + switch($this->format) { + case 'xml': + $this->showXmlTimeline($this->notices); + break; + case 'rss': + $this->showRssTimeline( + $this->notices, + $title, + $link, + null, + null, + null, + $self + ); + break; + case 'atom': + + header('Content-Type: application/atom+xml; charset=utf-8'); + + $atom = new AtomNoticeFeed($this->auth_user); + + $atom->setId($id); + $atom->setTitle($title); + $atom->setUpdated('now'); + + $atom->addLink($link); + $atom->setSelfLink($self); + + $atom->addEntryFromNotices($this->notices); + $this->raw($atom->getString()); + + break; + case 'json': + $this->showJsonTimeline($this->notices); + break; + case 'as': + header('Content-Type: ' . ActivityStreamJSONDocument::CONTENT_TYPE); + $doc = new ActivityStreamJSONDocument($this->auth_user); + $doc->setTitle($title); + $doc->addLink($link, 'alternate', 'text/html'); + $doc->addItemsFromNotices($this->notices); + $this->raw($doc->asString()); + break; + default: + // TRANS: Client error displayed when coming across a non-supported API method. + $this->clientError(_('API method not found.'), $code = 404); + break; + } + } + + /** + * Return true if read only. + * + * MAY override + * + * @param array $args other arguments + * + * @return boolean is read only action? + */ + function isReadOnly($args) + { + if ($_SERVER['REQUEST_METHOD'] == 'GET' || + $_SERVER['REQUEST_METHOD'] == 'HEAD') { + return true; + } else { + return false; + } + } + + /** + * Return last modified, if applicable. + * + * MAY override + * + * @return string last modified http header + */ + function lastModified() + { + if (!empty($this->notices) && (count($this->notices) > 0)) { + return strtotime($this->notices[0]->created); + } + + return null; + } + + /** + * Return etag, if applicable. + * + * MAY override + * + * @return string etag http header + */ + function etag() + { + if (!empty($this->notices) && (count($this->notices) > 0)) { + + $last = count($this->notices) - 1; + + return '"' . implode( + ':', + array($this->arg('action'), + common_user_cache_hash($this->auth_user), + common_language(), + $this->user->id, + strtotime($this->notices[0]->created), + strtotime($this->notices[$last]->created)) + ) + . '"'; + } + + return null; + } + + /** + * Does this require authentication? + * + * @return boolean true if delete, else false + */ + function requiresAuth() + { + if ($_SERVER['REQUEST_METHOD'] == 'GET' || + $_SERVER['REQUEST_METHOD'] == 'HEAD') { + return false; + } else { + return true; + } + } +} diff --git a/actions/apifavoritecreate.php b/actions/apifavoritecreate.php index b890d4af69..3f639159cc 100644 --- a/actions/apifavoritecreate.php +++ b/actions/apifavoritecreate.php @@ -65,6 +65,12 @@ class ApiFavoriteCreateAction extends ApiAuthAction $this->user = $this->auth_user; $this->notice = Notice::staticGet($this->arg('id')); + if ($this->notice->repeat_of != '' ) { + common_log(LOG_DEBUG, 'Trying to Fave '.$this->notice->id.', repeat of '.$this->notice->repeat_of); + common_log(LOG_DEBUG, 'Will Fave '.$this->notice->repeat_of.' instead'); + $real_notice_id = $this->notice->repeat_of; + $this->notice = Notice::staticGet($real_notice_id); + } return true; } diff --git a/actions/apifavoritedestroy.php b/actions/apifavoritedestroy.php index db121ac882..59ca5c96df 100644 --- a/actions/apifavoritedestroy.php +++ b/actions/apifavoritedestroy.php @@ -65,6 +65,12 @@ class ApiFavoriteDestroyAction extends ApiAuthAction $this->user = $this->auth_user; $this->notice = Notice::staticGet($this->arg('id')); + if ($this->notice->repeat_of != '' ) { + common_log(LOG_DEBUG, 'Trying to unFave '.$this->notice->id); + common_log(LOG_DEBUG, 'Will unFave '.$this->notice->repeat_of.' instead'); + $real_notice_id = $this->notice->repeat_of; + $this->notice = Notice::staticGet($real_notice_id); + } return true; } diff --git a/actions/apioauthauthorize.php b/actions/apioauthauthorize.php index d76ae060f2..1755c36be3 100644 --- a/actions/apioauthauthorize.php +++ b/actions/apioauthauthorize.php @@ -22,7 +22,7 @@ * @category API * @package StatusNet * @author Zach Copley - * @copyright 2010 StatusNet, Inc. + * @copyright 2010-2011 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ @@ -35,7 +35,7 @@ require_once INSTALLDIR . '/lib/apioauth.php'; require_once INSTALLDIR . '/lib/info.php'; /** - * Authorize an Oputh request token + * Authorize an OAuth request token * * @category API * @package StatusNet @@ -196,12 +196,6 @@ class ApiOauthAuthorizeAction extends Action ) ); - // XXX: Make sure we have a oauth_token_association table. The table - // is now in the main schema, but because it is being added with - // a point release, it's unlikely to be there. This code can be - // removed as of 1.0. - $this->ensureOauthTokenAssociationTable(); - $tokenAssoc = new Oauth_token_association(); $tokenAssoc->profile_id = $user->id; @@ -295,30 +289,6 @@ class ApiOauthAuthorizeAction extends Action } } - // XXX Remove this function when we hit 1.0 - function ensureOauthTokenAssociationTable() - { - $schema = Schema::get(); - - $reqTokenCols = array( - new ColumnDef('profile_id', 'integer', null, true, 'PRI'), - new ColumnDef('application_id', 'integer', null, true, 'PRI'), - new ColumnDef('token', 'varchar', 255, true, 'PRI'), - new ColumnDef('created', 'datetime', null, false), - new ColumnDef( - 'modified', - 'timestamp', - null, - false, - null, - 'CURRENT_TIMESTAMP', - 'on update CURRENT_TIMESTAMP' - ) - ); - - $schema->ensureTable('oauth_token_association', $reqTokenCols); - } - /** * Show body - override to add a special CSS class for the authorize * page's "desktop mode" (minimal display) diff --git a/actions/apisearchatom.php b/actions/apisearchatom.php index 32ff918da3..075a4df83d 100644 --- a/actions/apisearchatom.php +++ b/actions/apisearchatom.php @@ -92,8 +92,6 @@ class ApiSearchAtomAction extends ApiPrivateAuthAction */ function prepare($args) { - common_debug("in apisearchatom prepare()"); - parent::prepare($args); $this->query = $this->trimmed('q'); diff --git a/actions/apisearchjson.php b/actions/apisearchjson.php index dd442b7f24..612dbdda5c 100644 --- a/actions/apisearchjson.php +++ b/actions/apisearchjson.php @@ -63,8 +63,6 @@ class ApiSearchJSONAction extends ApiPrivateAuthAction */ function prepare($args) { - common_debug("apisearchjson prepare()"); - parent::prepare($args); $this->query = $this->trimmed('q'); @@ -91,6 +89,12 @@ class ApiSearchJSONAction extends ApiPrivateAuthAction $this->since_id = $this->trimmed('since_id'); $this->geocode = $this->trimmed('geocode'); + if (!empty($this->auth_user)) { + $this->auth_profile = $this->auth_user->getProfile(); + } else { + $this->auth_profile = null; + } + return true; } @@ -114,20 +118,27 @@ class ApiSearchJSONAction extends ApiPrivateAuthAction */ function showResults() { - // TODO: Support search operators like from: and to:, boolean, etc. - - $notice = new Notice(); - - // lcase it for comparison $q = strtolower($this->query); - $search_engine = $notice->getSearchEngine('notice'); - $search_engine->set_sort_mode('chron'); - $search_engine->limit(($this->page - 1) * $this->rpp, $this->rpp + 1, true); - if (false === $search_engine->query($q)) { - $cnt = 0; + // TODO: Support search operators like from: and to:, boolean, etc. + + if (preg_match('/^#([\pL\pN_\-\.]{1,64})$/ue', $q)) { + $stream = new TagNoticeStream(substr($q, 1), $this->auth_profile); + } else if ($this->isAnURL($q)) { + $canon = File_redirection::_canonUrl($q); + $file = File::staticGet('url', $canon); + if (!empty($file)) { + $stream = new FileNoticeStream($file, $this->auth_profile); + } } else { - $cnt = $notice->find(); + $stream = new SearchNoticeStream($q, $this->auth_profile); + } + + if (empty($stream)) { + // XXX: This is hackish, but need some simple way to say "There's no results" + $notice = new ArrayWrapper(array()); + } else { + $notice = $stream->getNotices(($this->page - 1) * $this->rpp, $this->rpp + 1); } // TODO: max_id, lang, geocode @@ -139,6 +150,47 @@ class ApiSearchJSONAction extends ApiPrivateAuthAction $this->endDocument('json'); } + function isAnURL($q) { + $regex = '#^'. + '(?:^|[\s\<\>\(\)\[\]\{\}\\\'\\\";]+)(?![\@\!\#])'. + '('. + '(?:'. + '(?:'. //Known protocols + '(?:'. + '(?:(?:https?|ftps?|mms|rtsp|gopher|news|nntp|telnet|wais|file|prospero|webcal|irc)://)'. + '|'. + '(?:(?:mailto|aim|tel|xmpp):)'. + ')'. + '(?:[\pN\pL\-\_\+\%\~]+(?::[\pN\pL\-\_\+\%\~]+)?\@)?'. //user:pass@ + '(?:'. + '(?:'. + '\[[\pN\pL\-\_\:\.]+(?auth_user->shortenlinks($this->status); - - if (Notice::contentTooLong($status_shortened)) { - // Note: Twitter truncates anything over 140, flags the status - // as "truncated." - - $this->clientError( - sprintf( - // TRANS: Client error displayed exceeding the maximum notice length. - // TRANS: %d is the maximum length for a notice. - _m('That\'s too long. Maximum notice size is %d character.', - 'That\'s too long. Maximum notice size is %d characters.', - Notice::maxContent()), - Notice::maxContent() - ), - 406, - $this->format - ); - - return; - } + /* Do not call shortenlinks until the whole notice has been build */ // Check for commands $inter = new CommandInterpreter(); - $cmd = $inter->handle_command($this->auth_user, $status_shortened); + $cmd = $inter->handle_command($this->auth_user, $this->status); if ($cmd) { if ($this->supported($cmd)) { @@ -299,23 +279,32 @@ class ApiStatusesUpdateAction extends ApiAuthAction } if (isset($upload)) { - $status_shortened .= ' ' . $upload->shortUrl(); + $this->status .= ' ' . $upload->shortUrl(); - if (Notice::contentTooLong($status_shortened)) { - $upload->delete(); - // TRANS: Client error displayed exceeding the maximum notice length. - // TRANS: %d is the maximum lenth for a notice. - $msg = _m('Maximum notice size is %d character, including attachment URL.', - 'Maximum notice size is %d characters, including attachment URL.', - Notice::maxContent()); - $this->clientError( - sprintf($msg, Notice::maxContent()), - 400, - $this->format - ); - } + /* Do not call shortenlinks until the whole notice has been build */ } + /* Do call shortenlinks here & check notice length since notice is about to be saved & sent */ + $status_shortened = $this->auth_user->shortenlinks($this->status); + + if (Notice::contentTooLong($status_shortened)) { + if (isset($upload)) { + $upload->delete(); + } + // TRANS: Client error displayed exceeding the maximum notice length. + // TRANS: %d is the maximum lenth for a notice. + $msg = _m('Maximum notice size is %d character, including attachment URL.', + 'Maximum notice size is %d characters, including attachment URL.', + Notice::maxContent()); + /* Use HTTP 413 error code (Request Entity Too Large) + * instead of basic 400 for better understanding + */ + $this->clientError(sprintf($msg, Notice::maxContent()), + 413, + $this->format); + } + + $content = html_entity_decode($status_shortened, ENT_NOQUOTES, 'UTF-8'); $options = array('reply_to' => $reply_to); diff --git a/actions/apitimelinefavorites.php b/actions/apitimelinefavorites.php index 2c962b450a..e2cb7c2ee2 100644 --- a/actions/apitimelinefavorites.php +++ b/actions/apitimelinefavorites.php @@ -170,7 +170,7 @@ class ApiTimelineFavoritesAction extends ApiBareAuthAction $this->showJsonTimeline($this->notices); break; case 'as': - header('Content-Type: application/json; charset=utf-8'); + header('Content-Type: ' . ActivityStreamJSONDocument::CONTENT_TYPE); $doc = new ActivityStreamJSONDocument($this->auth_user); $doc->setTitle($title); $doc->addLink($link,'alternate', 'text/html'); diff --git a/actions/apitimelinefriends.php b/actions/apitimelinefriends.php index 279265a30e..591baccfcc 100644 --- a/actions/apitimelinefriends.php +++ b/actions/apitimelinefriends.php @@ -266,16 +266,15 @@ class ApiTimelineFriendsAction extends ApiBareAuthAction $this->showJsonTimeline($this->notices); break; case 'as': - header('Content-Type: application/json; charset=utf-8'); - $doc = new ActivityStreamJSONDocument($this->auth_user); - $doc->setTitle($title); - $doc->addLink($link,'alternate', 'text/html'); + header('Content-Type: ' . ActivityStreamJSONDocument::CONTENT_TYPE); + $doc = new ActivityStreamJSONDocument($this->auth_user, $title); + $doc->addLink($link, 'alternate', 'text/html'); $doc->addItemsFromNotices($this->notices); $this->raw($doc->asString()); break; default: // TRANS: Client error displayed when coming across a non-supported API method. - $this->clientError(_('API method not found.'), $code = 404); + $this->clientError(_('API method not found.'), 404); break; } } @@ -289,7 +288,13 @@ class ApiTimelineFriendsAction extends ApiBareAuthAction { $notices = array(); - $stream = new InboxNoticeStream($this->user); + $profile = null; + + if (isset($this->auth_user)) { + $profile = $this->auth_user->getProfile(); + } + + $stream = new InboxNoticeStream($this->user, $profile); $notice = $stream->getNotices(($this->page-1) * $this->count, $this->count, diff --git a/actions/apitimelinegroup.php b/actions/apitimelinegroup.php index 3fc930fa08..5a0ea60c7e 100644 --- a/actions/apitimelinegroup.php +++ b/actions/apitimelinegroup.php @@ -106,10 +106,8 @@ class ApiTimelineGroupAction extends ApiPrivateAuthAction $self = $this->getSelfUri(); - $link = common_local_url( - 'ApiTimelineGroup', - array('nickname' => $this->group->nickname) - ); + $link = common_local_url('showgroup', + array('nickname' => $this->group->nickname)); switch($this->format) { case 'xml': @@ -135,7 +133,7 @@ class ApiTimelineGroupAction extends ApiPrivateAuthAction $this->showJsonTimeline($this->notices); break; case 'as': - header('Content-Type: application/json; charset=utf-8'); + header('Content-Type: ' . ActivityStreamJSONDocument::CONTENT_TYPE); $doc = new ActivityStreamJSONDocument($this->auth_user); $doc->setTitle($atom->title); $doc->addLink($link, 'alternate', 'text/html'); diff --git a/actions/apitimelinehome.php b/actions/apitimelinehome.php index 3c18a5b0bf..22c6cc5f94 100644 --- a/actions/apitimelinehome.php +++ b/actions/apitimelinehome.php @@ -169,7 +169,7 @@ class ApiTimelineHomeAction extends ApiBareAuthAction $this->showJsonTimeline($this->notices); break; case 'as': - header('Content-Type: application/json; charset=utf-8'); + header('Content-Type: ' . ActivityStreamJSONDocument::CONTENT_TYPE); $doc = new ActivityStreamJSONDocument($this->auth_user); $doc->setTitle($title); $doc->addLink($link, 'alternate', 'text/html'); @@ -192,7 +192,13 @@ class ApiTimelineHomeAction extends ApiBareAuthAction { $notices = array(); - $stream = new InboxNoticeStream($this->user); + $profile = null; + + if (isset($this->auth_user)) { + $profile = $this->auth_user->getProfile(); + } + + $stream = new InboxNoticeStream($this->user, $profile); $notice = $stream->getNotices(($this->page-1) * $this->count, $this->count, diff --git a/actions/apitimelinementions.php b/actions/apitimelinementions.php index ecd2a1a0e6..07fbdf0b67 100644 --- a/actions/apitimelinementions.php +++ b/actions/apitimelinementions.php @@ -170,7 +170,7 @@ class ApiTimelineMentionsAction extends ApiBareAuthAction $this->showJsonTimeline($this->notices); break; case 'as': - header('Content-Type: application/json; charset=utf-8'); + header('Content-Type: ' . ActivityStreamJSONDocument::CONTENT_TYPE); $doc = new ActivityStreamJSONDocument($this->auth_user); $doc->setTitle($title); $doc->addLink($link, 'alternate', 'text/html'); @@ -193,10 +193,18 @@ class ApiTimelineMentionsAction extends ApiBareAuthAction { $notices = array(); - $notice = $this->user->getReplies( - ($this->page - 1) * $this->count, $this->count, - $this->since_id, $this->max_id - ); + if (empty($this->auth_user)) { + $profile = null; + } else { + $profile = $this->auth_user->getProfile(); + } + + $stream = new ReplyNoticeStream($this->user->id, $profile); + + $notice = $stream->getNotices(($this->page - 1) * $this->count, + $this->count, + $this->since_id, + $this->max_id); while ($notice->fetch()) { $notices[] = clone($notice); diff --git a/actions/apitimelinepublic.php b/actions/apitimelinepublic.php index a786aa15cc..b82e01aafe 100644 --- a/actions/apitimelinepublic.php +++ b/actions/apitimelinepublic.php @@ -235,7 +235,7 @@ class ApiTimelinePublicAction extends ApiPrivateAuthAction $this->showJsonTimeline($this->notices); break; case 'as': - header('Content-Type: application/json; charset=utf-8'); + header('Content-Type: ' . ActivityStreamJSONDocument::CONTENT_TYPE); $doc = new ActivityStreamJSONDocument($this->auth_user); $doc->setTitle($title); $doc->addLink($link, 'alternate', 'text/html'); @@ -258,14 +258,18 @@ class ApiTimelinePublicAction extends ApiPrivateAuthAction { $notices = array(); - $notice = Notice::publicStream( - ($this->page - 1) * $this->count, $this->count, $this->since_id, - $this->max_id - ); + $profile = ($this->auth_user) ? $this->auth_user->getProfile() : null; - while ($notice->fetch()) { - $notices[] = clone($notice); - } + $stream = new PublicNoticeStream($profile); + + $notice = $stream->getNotices(($this->page - 1) * $this->count, + $this->count, + $this->since_id, + $this->max_id); + + $notices = $notice->fetchAll(); + + NoticeList::prefill($notices); return $notices; } diff --git a/actions/apitimelineretweetedtome.php b/actions/apitimelineretweetedtome.php index ef943f4f88..2ea84f16e3 100644 --- a/actions/apitimelineretweetedtome.php +++ b/actions/apitimelineretweetedtome.php @@ -138,7 +138,7 @@ class ApiTimelineRetweetedToMeAction extends ApiAuthAction break; case 'as': - header('Content-Type: application/json; charset=utf-8'); + header('Content-Type: ' . ActivityStreamJSONDocument::CONTENT_TYPE); $doc = new ActivityStreamJSONDocument($this->auth_user); $doc->setTitle($title); $doc->addLink($link, 'alternate', 'text/html'); diff --git a/actions/apitimelineretweetsofme.php b/actions/apitimelineretweetsofme.php index d38e730ac6..d01db87b93 100644 --- a/actions/apitimelineretweetsofme.php +++ b/actions/apitimelineretweetsofme.php @@ -115,7 +115,15 @@ class ApiTimelineRetweetsOfMeAction extends ApiAuthAction array('nickname' => $this->auth_user->nickname) ); - $strm = $this->auth_user->repeatsOfMe($offset, $limit, $this->since_id, $this->max_id); + // This is a really bad query for some reason + + if (!common_config('performance', 'high')) { + $strm = $this->auth_user->repeatsOfMe($offset, $limit, $this->since_id, $this->max_id); + } else { + $strm = new Notice(); + $strm->whereAdd('0 = 1'); + $strm->find(); + } switch ($this->format) { case 'xml': @@ -137,7 +145,7 @@ class ApiTimelineRetweetsOfMeAction extends ApiAuthAction $this->raw($atom->getString()); break; case 'as': - header('Content-Type: application/json; charset=utf-8'); + header('Content-Type: ' . ActivityStreamJSONDocument::CONTENT_TYPE); $doc = new ActivityStreamJSONDocument($this->auth_user); $doc->setTitle($title); $doc->addLink($link, 'alternate', 'text/html'); diff --git a/actions/apitimelinetag.php b/actions/apitimelinetag.php index 6c3b135ed9..31e18cf8ee 100644 --- a/actions/apitimelinetag.php +++ b/actions/apitimelinetag.php @@ -153,7 +153,7 @@ class ApiTimelineTagAction extends ApiPrivateAuthAction $this->showJsonTimeline($this->notices); break; case 'as': - header('Content-Type: application/json; charset=utf-8'); + header('Content-Type: ' . ActivityStreamJSONDocument::CONTENT_TYPE); $doc = new ActivityStreamJSONDocument($this->auth_user); $doc->setTitle($title); $doc->addLink($link, 'alternate', 'text/html'); diff --git a/actions/apitimelineuser.php b/actions/apitimelineuser.php index b0681c191a..62d0a5e0d5 100644 --- a/actions/apitimelineuser.php +++ b/actions/apitimelineuser.php @@ -202,7 +202,7 @@ class ApiTimelineUserAction extends ApiBareAuthAction $this->showJsonTimeline($this->notices); break; case 'as': - header('Content-Type: application/json; charset=utf-8'); + header('Content-Type: ' . ActivityStreamJSONDocument::CONTENT_TYPE); $doc = new ActivityStreamJSONDocument($this->auth_user); $doc->setTitle($atom->title); $doc->addLink($link, 'alternate', 'text/html'); @@ -447,7 +447,7 @@ class ApiTimelineUserAction extends ApiBareAuthAction } else { $group = User_group::staticGet('uri', $uri); if (!empty($group)) { - $options['groups'][] = $uri; + $options['groups'][] = $group->id; } else { // @fixme: hook for discovery here common_log(LOG_WARNING, sprintf('AtomPub post with unknown attention URI %s', $uri)); diff --git a/actions/approvesub.php b/actions/approvesub.php index be07b6e877..5fbb2149bd 100644 --- a/actions/approvesub.php +++ b/actions/approvesub.php @@ -73,6 +73,7 @@ class ApprovesubAction extends Action if (empty($this->request)) { // TRANS: Client error displayed trying to approve subscription for a non-existing request. + // TRANS: %s is a user nickname. $this->clientError(sprintf(_('%s is not in the moderation queue for your subscriptions.'), $this->profile->nickname), 403); } diff --git a/actions/attachment.php b/actions/attachment.php index 22018ab043..f149ca19d9 100644 --- a/actions/attachment.php +++ b/actions/attachment.php @@ -173,7 +173,9 @@ class AttachmentAction extends Action function showSections() { $ns = new AttachmentNoticeSection($this); $ns->show(); - $atcs = new AttachmentTagCloudSection($this); - $atcs->show(); + if (!common_config('performance', 'high')) { + $atcs = new AttachmentTagCloudSection($this); + $atcs->show(); + } } } diff --git a/actions/blockedfromgroup.php b/actions/blockedfromgroup.php index dd916b170a..caf3911d7d 100644 --- a/actions/blockedfromgroup.php +++ b/actions/blockedfromgroup.php @@ -40,7 +40,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class BlockedfromgroupAction extends GroupDesignAction +class BlockedfromgroupAction extends GroupAction { var $page = null; @@ -122,12 +122,6 @@ class BlockedfromgroupAction extends GroupDesignAction _('A list of the users blocked from joining this group.')); } - function showObjectNav() - { - $nav = new GroupNav($this, $this->group); - $nav->show(); - } - function showContent() { $offset = ($this->page-1) * PROFILES_PER_PAGE; diff --git a/actions/conversation.php b/actions/conversation.php index f33d267d35..aa2539d213 100644 --- a/actions/conversation.php +++ b/actions/conversation.php @@ -123,13 +123,49 @@ class ConversationAction extends Action */ function showContent() { - $tnl = new FullThreadedNoticeList($this->notices, $this, $this->userProfile); + $user = common_current_user(); - $cnt = $tnl->show(); + if (!empty($user) && $user->conversationTree()) { + $nl = new ConversationTree($this->notices, $this); + } else { + $nl = new FullThreadedNoticeList($this->notices, $this, $this->userProfile); + } + + $cnt = $nl->show(); } function isReadOnly() { return true; } + + function getFeeds() + { + + return array(new Feed(Feed::JSON, + common_local_url('apiconversation', + array( + 'id' => $this->id, + 'format' => 'as')), + // TRANS: Title for link to notice feed. + // TRANS: %s is a user nickname. + _('Conversation feed (Activity Streams JSON)')), + new Feed(Feed::RSS2, + common_local_url('apiconversation', + array( + 'id' => $this->id, + 'format' => 'rss')), + // TRANS: Title for link to notice feed. + // TRANS: %s is a user nickname. + _('Conversation feed (RSS 2.0)')), + new Feed(Feed::ATOM, + common_local_url('apiconversation', + array( + 'id' => $this->id, + 'format' => 'atom')), + // TRANS: Title for link to notice feed. + // TRANS: %s is a user nickname. + _('Conversation feed (Activity Streams JSON)'))); + } } + diff --git a/actions/deleteaccount.php b/actions/deleteaccount.php index 614519d474..8b80c6c6f2 100644 --- a/actions/deleteaccount.php +++ b/actions/deleteaccount.php @@ -320,6 +320,6 @@ class DeleteAccountForm extends Form 'submit', null, // TRANS: Button title for user account deletion. - _('Permanently delete your account')); + _('Permanently delete your account.')); } } diff --git a/actions/designadminpanel.php b/actions/designadminpanel.php deleted file mode 100644 index a77b842fe3..0000000000 --- a/actions/designadminpanel.php +++ /dev/null @@ -1,738 +0,0 @@ -. - * - * @category Settings - * @package StatusNet - * @author Evan Prodromou - * @author Zach Copley - * @author Sarven Capadisli - * @copyright 2008-2009 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ - -if (!defined('STATUSNET')) { - exit(1); -} - -/** - * Administer design settings - * - * @category Admin - * @package StatusNet - * @author Evan Prodromou - * @author Zach Copley - * @author Sarven Capadisli - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ -class DesignadminpanelAction extends AdminPanelAction -{ - /* The default site design */ - var $design = null; - - /** - * Returns the page title - * - * @return string page title - */ - function title() - { - // TRANS: Message used as title for design settings for the site. - return _('Design'); - } - - /** - * Instructions for using this form. - * - * @return string instructions - */ - function getInstructions() - { - // TRANS: Instructions for design adminsitration panel. - return _('Design settings for this StatusNet site'); - } - - /** - * Get the default design and show the design admin panel form - * - * @return void - */ - function showForm() - { - $this->design = Design::siteDesign(); - $form = new DesignAdminPanelForm($this); - $form->show(); - return; - } - - /** - * Save settings from the form - * - * @return void - */ - function saveSettings() - { - if ($this->arg('save')) { - $this->saveDesignSettings(); - } else if ($this->arg('defaults')) { - $this->restoreDefaults(); - } else { - // TRANS: Client error displayed when the submitted form contains unexpected data. - $this->clientError(_('Unexpected form submission.')); - } - } - - /** - * Save the new design settings - * - * @return void - */ - function saveDesignSettings() - { - // Workaround for PHP returning empty $_POST and $_FILES when POST - // length > post_max_size in php.ini - - if (empty($_FILES) - && empty($_POST) - && ($_SERVER['CONTENT_LENGTH'] > 0) - ) { - // TRANS: Client error displayed when the number of bytes in a POST request exceeds a limit. - // TRANS: %s is the number of bytes of the CONTENT_LENGTH. - $msg = _m('The server was unable to handle that much POST data (%s byte) due to its current configuration.', - 'The server was unable to handle that much POST data (%s bytes) due to its current configuration.', - intval($_SERVER['CONTENT_LENGTH'])); - $this->clientException(sprintf($msg, $_SERVER['CONTENT_LENGTH'])); - return; - } - - // check for file uploads - - $bgimage = $this->saveBackgroundImage(); - $customTheme = $this->saveCustomTheme(); - - $oldtheme = common_config('site', 'theme'); - if ($customTheme) { - // This feels pretty hacky :D - $this->args['theme'] = $customTheme; - $themeChanged = true; - } else { - $themeChanged = ($this->trimmed('theme') != $oldtheme); - } - - static $settings = array('theme', 'logo', 'ssllogo'); - - $values = array(); - - foreach ($settings as $setting) { - $values[$setting] = $this->trimmed($setting); - } - - $this->validate($values); - - $config = new Config(); - - $config->query('BEGIN'); - - if ($themeChanged) { - // If the theme has changed, reset custom colors and let them pick - // up the new theme's defaults. - $colors = array('background', 'content', 'sidebar', 'text', 'link'); - foreach ($colors as $colorKey) { - // Clear from global config so we see defaults on this page... - $GLOBALS['config']['design'][$colorKey . 'color'] = false; - - // And remove old settings from DB... - $this->deleteSetting('design', $colorKey . 'color'); - } - } else { - // Only save colors from the form if the theme has not changed. - // - // @fixme a future more ajaxy form should allow theme switch - // and color customization in one step. - - $bgcolor = new WebColor($this->trimmed('design_background')); - $ccolor = new WebColor($this->trimmed('design_content')); - $sbcolor = new WebColor($this->trimmed('design_sidebar')); - $tcolor = new WebColor($this->trimmed('design_text')); - $lcolor = new WebColor($this->trimmed('design_links')); - - Config::save('design', 'backgroundcolor', $bgcolor->intValue()); - Config::save('design', 'contentcolor', $ccolor->intValue()); - Config::save('design', 'sidebarcolor', $sbcolor->intValue()); - Config::save('design', 'textcolor', $tcolor->intValue()); - Config::save('design', 'linkcolor', $lcolor->intValue()); - } - - $onoff = $this->arg('design_background-image_onoff'); - - $on = false; - $off = false; - - if ($onoff == 'on') { - $on = true; - } else { - $off = true; - } - - $tile = $this->boolean('design_background-image_repeat'); - - // Hack to use Design's bit setter - $scratch = new Design(); - $scratch->setDisposition($on, $off, $tile); - - Config::save('design', 'disposition', $scratch->disposition); - - foreach ($settings as $setting) { - Config::save('site', $setting, $values[$setting]); - } - - if (isset($bgimage)) { - Config::save('design', 'backgroundimage', $bgimage); - } - - if (common_config('custom_css', 'enabled')) { - $css = $this->arg('css'); - if ($css != common_config('custom_css', 'css')) { - Config::save('custom_css', 'css', $css); - } - } - - $config->query('COMMIT'); - } - - /** - * Restore the default design - * - * @return void - */ - function restoreDefaults() - { - $this->deleteSetting('site', 'logo'); - $this->deleteSetting('site', 'ssllogo'); - $this->deleteSetting('site', 'theme'); - - $settings = array( - 'theme', 'backgroundimage', 'backgroundcolor', 'contentcolor', - 'sidebarcolor', 'textcolor', 'linkcolor', 'disposition' - ); - - foreach ($settings as $setting) { - $this->deleteSetting('design', $setting); - } - - // XXX: Should we restore the default dir settings, etc.? --Z - - // XXX: I can't get it to show the new settings without forcing - // this terrible reload -- FIX ME! - common_redirect(common_local_url('designadminpanel'), 303); - } - - /** - * Save the background image if the user uploaded one - * - * @return string $filename the filename of the image - */ - function saveBackgroundImage() - { - $filename = null; - if (isset($_FILES['design_background-image_file']['error']) && - $_FILES['design_background-image_file']['error'] == - UPLOAD_ERR_OK) { - - $filepath = null; - - try { - $imagefile = - ImageFile::fromUpload('design_background-image_file'); - } catch (Exception $e) { - $this->clientError('Unable to save background image.'); - return; - } - - // Note: site design background image has a special filename - - $filename = Design::filename('site-design-background', - image_type_to_extension($imagefile->type), - common_timestamp()); - - $filepath = Design::path($filename); - - move_uploaded_file($imagefile->filepath, $filepath); - - // delete any old backround img laying around - - if (isset($this->design->backgroundimage)) { - @unlink(Design::path($design->backgroundimage)); - } - - return $filename; - } - } - - /** - * Save the custom theme if the user uploaded one. - * - * @return mixed custom theme name, if succesful, or null if no theme upload. - * @throws ClientException for invalid theme archives - * @throws ServerException if trouble saving the theme files - */ - function saveCustomTheme() - { - if (common_config('theme_upload', 'enabled') && - $_FILES['design_upload_theme']['error'] == UPLOAD_ERR_OK) { - - $upload = ThemeUploader::fromUpload('design_upload_theme'); - $basedir = common_config('local', 'dir'); - if (empty($basedir)) { - $basedir = INSTALLDIR . '/local'; - } - $name = 'custom'; // @todo allow multiples, custom naming? - $outdir = $basedir . '/theme/' . $name; - $upload->extract($outdir); - return $name; - } else { - return null; - } - } - - /** - * Attempt to validate setting values - * - * @return void - */ - function validate(&$values) - { - if (!empty($values['logo']) && - !Validate::uri($values['logo'], array('allowed_schemes' => array('http', 'https')))) { - // TRANS: Client error displayed when a logo URL does is not valid. - $this->clientError(_('Invalid logo URL.')); - } - - if (!empty($values['ssllogo']) && - !Validate::uri($values['ssllogo'], array('allowed_schemes' => array('https')))) { - // TRANS: Client error displayed when an SSL logo URL is invalid. - $this->clientError(_('Invalid SSL logo URL.')); - } - - if (!in_array($values['theme'], Theme::listAvailable())) { - // TRANS: Client error displayed when a theme is submitted through the form that is not in the theme list. - // TRANS: %s is the chosen unavailable theme. - $this->clientError(sprintf(_('Theme not available: %s.'), $values['theme'])); - } - } - - /** - * Add the Farbtastic stylesheet - * - * @return void - */ - function showStylesheets() - { - parent::showStylesheets(); - $this->cssLink('js/farbtastic/farbtastic.css',null,'screen, projection, tv'); - } - - /** - * Add the Farbtastic scripts - * - * @return void - */ - function showScripts() - { - parent::showScripts(); - - $this->script('farbtastic/farbtastic.js'); - $this->script('userdesign.go.js'); - - $this->autofocus('design_background-image_file'); - } - -} - -class DesignAdminPanelForm extends AdminForm -{ - - /** - * ID of the form - * - * @return int ID of the form - */ - function id() - { - return 'form_design_admin_panel'; - } - - /** - * class of the form - * - * @return string class of the form - */ - function formClass() - { - return 'form_settings'; - } - - /** - * HTTP method used to submit the form - * - * For image data we need to send multipart/form-data - * so we set that here too - * - * @return string the method to use for submitting - */ - function method() - { - $this->enctype = 'multipart/form-data'; - - return 'post'; - } - - /** - * Action of the form - * - * @return string URL of the action - */ - function action() - { - return common_local_url('designadminpanel'); - } - - /** - * Data elements of the form - * - * @return void - */ - function formData() - { - $this->showLogo(); - $this->showTheme(); - $this->showBackground(); - $this->showColors(); - $this->showAdvanced(); - } - - function showLogo() - { - $this->out->elementStart('fieldset', array('id' => 'settings_design_logo')); - // TRANS: Fieldset legend for form to change logo. - $this->out->element('legend', null, _('Change logo')); - - $this->out->elementStart('ul', 'form_data'); - - $this->li(); - $this->input('logo', - // TRANS: Field label for StatusNet site logo. - _('Site logo'), - // TRANS: Title for field label for StatusNet site logo. - 'Logo for the site (full URL).'); - $this->unli(); - - $this->li(); - $this->input('ssllogo', - // TRANS: Field label for SSL StatusNet site logo. - _('SSL logo'), - // TRANS: Title for field label for SSL StatusNet site logo. - 'Logo to show on SSL pages.'); - $this->unli(); - - $this->out->elementEnd('ul'); - - $this->out->elementEnd('fieldset'); - - } - - function showTheme() - { - $this->out->elementStart('fieldset', array('id' => 'settings_design_theme')); - // TRANS: Fieldset legend for form change StatusNet site's theme. - $this->out->element('legend', null, _('Change theme')); - - $this->out->elementStart('ul', 'form_data'); - - $themes = Theme::listAvailable(); - - // XXX: listAvailable() can return an empty list if you - // screw up your settings, so just in case: - - if (empty($themes)) { - $themes = array('default', 'default'); - } - - asort($themes); - $themes = array_combine($themes, $themes); - - $this->li(); - // TRANS: Field label for dropdown to choose site theme. - $this->out->dropdown('theme', _('Site theme'), - // TRANS: Title for field label for dropdown to choose site theme. - $themes, _('Theme for the site.'), - false, $this->value('theme')); - $this->unli(); - - if (common_config('theme_upload', 'enabled')) { - $this->li(); - // TRANS: Field label for uploading a cutom theme. - $this->out->element('label', array('for' => 'design_upload_theme'), _('Custom theme')); - $this->out->element('input', array('id' => 'design_upload_theme', - 'name' => 'design_upload_theme', - 'type' => 'file')); - // TRANS: Form instructions for uploading a cutom StatusNet theme. - $this->out->element('p', 'form_guide', _('You can upload a custom StatusNet theme as a .ZIP archive.')); - $this->unli(); - } - - $this->out->elementEnd('ul'); - - $this->out->elementEnd('fieldset'); - } - - function showBackground() - { - $design = $this->out->design; - - $this->out->elementStart('fieldset', array('id' => - 'settings_design_background-image')); - // TRANS: Fieldset legend for theme background image. - $this->out->element('legend', null, _('Change background image')); - $this->out->elementStart('ul', 'form_data'); - - $this->li(); - $this->out->element('input', array('name' => 'MAX_FILE_SIZE', - 'type' => 'hidden', - 'id' => 'MAX_FILE_SIZE', - 'value' => ImageFile::maxFileSizeInt())); - $this->out->element('label', array('for' => 'design_background-image_file'), - // TRANS: Field label for background image on theme designer page. - _('Background')); - $this->out->element('input', array('name' => 'design_background-image_file', - 'type' => 'file', - 'id' => 'design_background-image_file')); - $this->out->element('p', 'form_guide', - // TRANS: Form guide for background image upload form on theme designer page. - sprintf(_('You can upload a background image for the site. ' . - 'The maximum file size is %1$s.'), ImageFile::maxFileSize())); - $this->unli(); - - if (!empty($design->backgroundimage)) { - - $this->out->elementStart('li', array('id' => - 'design_background-image_onoff')); - - $this->out->element('img', array('src' => - Design::url($design->backgroundimage))); - - $attrs = array('name' => 'design_background-image_onoff', - 'type' => 'radio', - 'id' => 'design_background-image_on', - 'class' => 'radio', - 'value' => 'on'); - - if ($design->disposition & BACKGROUND_ON) { - $attrs['checked'] = 'checked'; - } - - $this->out->element('input', $attrs); - - $this->out->element('label', array('for' => 'design_background-image_on', - 'class' => 'radio'), - // TRANS: Used as radio button label to add a background image. - _('On')); - - $attrs = array('name' => 'design_background-image_onoff', - 'type' => 'radio', - 'id' => 'design_background-image_off', - 'class' => 'radio', - 'value' => 'off'); - - if ($design->disposition & BACKGROUND_OFF) { - $attrs['checked'] = 'checked'; - } - - $this->out->element('input', $attrs); - - $this->out->element('label', array('for' => 'design_background-image_off', - 'class' => 'radio'), - // TRANS: Used as radio button label to not add a background image. - _('Off')); - // TRANS: Form guide for turning background image on or off on theme designer page. - $this->out->element('p', 'form_guide', _('Turn background image on or off.')); - $this->unli(); - - $this->li(); - $this->out->checkbox('design_background-image_repeat', - // TRANS: Checkbox label to title background image on theme designer page. - _('Tile background image'), - ($design->disposition & BACKGROUND_TILE) ? true : false); - $this->unli(); - } - - $this->out->elementEnd('ul'); - $this->out->elementEnd('fieldset'); - } - - function showColors() - { - $design = $this->out->design; - - $this->out->elementStart('fieldset', array('id' => 'settings_design_color')); - // TRANS: Fieldset legend for theme colors. - $this->out->element('legend', null, _('Change colors')); - - $this->out->elementStart('ul', 'form_data'); - - try { - // @fixme avoid loop unrolling in non-performance-critical contexts like this - - $bgcolor = new WebColor($design->backgroundcolor); - - $this->li(); - // TRANS: Field label for background color selector. - $this->out->element('label', array('for' => 'swatch-1'), _('Background')); - $this->out->element('input', array('name' => 'design_background', - 'type' => 'text', - 'id' => 'swatch-1', - 'class' => 'swatch', - 'maxlength' => '7', - 'size' => '7', - 'value' => '')); - $this->unli(); - - $ccolor = new WebColor($design->contentcolor); - - $this->li(); - // TRANS: Field label for content color selector. - $this->out->element('label', array('for' => 'swatch-2'), _('Content')); - $this->out->element('input', array('name' => 'design_content', - 'type' => 'text', - 'id' => 'swatch-2', - 'class' => 'swatch', - 'maxlength' => '7', - 'size' => '7', - 'value' => '')); - $this->unli(); - - $sbcolor = new WebColor($design->sidebarcolor); - - $this->li(); - // TRANS: Field label for sidebar color selector. - $this->out->element('label', array('for' => 'swatch-3'), _('Sidebar')); - $this->out->element('input', array('name' => 'design_sidebar', - 'type' => 'text', - 'id' => 'swatch-3', - 'class' => 'swatch', - 'maxlength' => '7', - 'size' => '7', - 'value' => '')); - $this->unli(); - - $tcolor = new WebColor($design->textcolor); - - $this->li(); - // TRANS: Field label for text color selector. - $this->out->element('label', array('for' => 'swatch-4'), _('Text')); - $this->out->element('input', array('name' => 'design_text', - 'type' => 'text', - 'id' => 'swatch-4', - 'class' => 'swatch', - 'maxlength' => '7', - 'size' => '7', - 'value' => '')); - $this->unli(); - - $lcolor = new WebColor($design->linkcolor); - - $this->li(); - // TRANS: Field label for link color selector. - $this->out->element('label', array('for' => 'swatch-5'), _('Links')); - $this->out->element('input', array('name' => 'design_links', - 'type' => 'text', - 'id' => 'swatch-5', - 'class' => 'swatch', - 'maxlength' => '7', - 'size' => '7', - 'value' => '')); - $this->unli(); - - } catch (WebColorException $e) { - // @fixme normalize them individually! - common_log(LOG_ERR, 'Bad color values in site design: ' . - $e->getMessage()); - } - - $this->out->elementEnd('fieldset'); - - $this->out->elementEnd('ul'); - } - - function showAdvanced() - { - if (common_config('custom_css', 'enabled')) { - $this->out->elementStart('fieldset', array('id' => 'settings_design_advanced')); - // TRANS: Fieldset legend for advanced theme design settings. - $this->out->element('legend', null, _('Advanced')); - $this->out->elementStart('ul', 'form_data'); - - $this->li(); - // TRANS: Field label for custom CSS. - $this->out->element('label', array('for' => 'css'), _('Custom CSS')); - $this->out->element('textarea', array('name' => 'css', - 'id' => 'css', - 'cols' => '50', - 'rows' => '10'), - strval(common_config('custom_css', 'css'))); - $this->unli(); - - $this->out->elementEnd('fieldset'); - $this->out->elementEnd('ul'); - } - } - - /** - * Action elements - * - * @return void - */ - - function formActions() - { - // TRANS: Button text for resetting theme settings. - $this->out->submit('defaults', _m('BUTTON','Use defaults'), 'submit form_action-default', - // TRANS: Title for button for resetting theme settings. - 'defaults', _('Restore default designs.')); - - $this->out->element('input', array('id' => 'settings_design_reset', - 'type' => 'reset', - // TRANS: Button text for resetting theme settings. - 'value' => 'Reset', - 'class' => 'submit form_action-primary', - // TRANS: Title for button for resetting theme settings. - 'title' => _('Reset back to default.'))); - - $this->out->submit('save', - // TRANS: Button text for saving theme settings. - _m('BUTTON','Save'), - 'submit form_action-secondary', - 'save', - // TRANS: Title for button for saving theme settings. - _('Save design.')); - } -} diff --git a/actions/doc.php b/actions/doc.php index 95f76fb9dd..c26b290902 100644 --- a/actions/doc.php +++ b/actions/doc.php @@ -162,4 +162,72 @@ class DocAction extends Action Event::handle('EndLoadDoc', array($this->title, &$this->output)); } } + + function showLocalNav() + { + $menu = new DocNav($this); + $menu->show(); + } +} + +class DocNav extends Menu +{ + function show() + { + $stub = new HomeStubNav($this->action); + $this->submenu(_m('MENU','Home'), $stub); + + $docs = new DocListNav($this->action); + $this->submenu(_m('MENU','Docs'), $docs); + } +} + +class DocListNav extends Menu +{ + function getItems() + { + $items = array(); + + if (Event::handle('StartDocsMenu', array(&$items))) { + + $items = array(array('doc', + array('title' => 'help'), + _m('MENU', 'Help'), + _('Getting started'), + 'nav_doc_help'), + array('doc', + array('title' => 'about'), + _m('MENU', 'About'), + _('About this site'), + 'nav_doc_about'), + array('doc', + array('title' => 'faq'), + _m('MENU', 'FAQ'), + _('Frequently asked questions'), + 'nav_doc_faq'), + array('doc', + array('title' => 'contact'), + _m('MENU', 'Contact'), + _('Contact info'), + 'nav_doc_contact'), + array('doc', + array('title' => 'tags'), + _m('MENU', 'Tags'), + _('Using tags'), + 'nav_doc_tags'), + array('doc', + array('title' => 'groups'), + _m('MENU', 'Groups'), + _('Using groups'), + 'nav_doc_groups'), + array('doc', + array('title' => 'api'), + _m('MENU', 'API'), + _('RESTful API'), + 'nav_doc_api')); + + Event::handle('EndDocsMenu', array(&$items)); + } + return $items; + } } diff --git a/actions/editapplication.php b/actions/editapplication.php index 02fae3eb49..2ba5f6b313 100644 --- a/actions/editapplication.php +++ b/actions/editapplication.php @@ -22,7 +22,7 @@ * @category Applications * @package StatusNet * @author Zach Copley - * @copyright 2008-2009 StatusNet, Inc. + * @copyright 2008-2011 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ @@ -42,7 +42,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class EditApplicationAction extends OwnerDesignAction +class EditApplicationAction extends Action { var $msg = null; var $owner = null; diff --git a/actions/editgroup.php b/actions/editgroup.php index e46b1481d0..7439b9d030 100644 --- a/actions/editgroup.php +++ b/actions/editgroup.php @@ -23,8 +23,8 @@ * @package StatusNet * @author Evan Prodromou * @author Sarven Capadisli - * @author Zach Copley - * @copyright 2008-2009 StatusNet, Inc. + * @author Zach Copley + * @copyright 2008-2011 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ @@ -45,7 +45,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class EditgroupAction extends GroupDesignAction +class EditgroupAction extends GroupAction { var $msg; @@ -139,12 +139,6 @@ class EditgroupAction extends GroupDesignAction $this->showPage(); } - function showObjectNav() - { - $nav = new GroupNav($this, $this->group); - $nav->show(); - } - function showContent() { $form = new GroupEditForm($this, $this->group); @@ -165,7 +159,7 @@ class EditgroupAction extends GroupDesignAction function showScripts() { parent::showScripts(); - $this->autofocus('nickname'); + $this->autofocus('newnickname'); } function trySave() @@ -179,7 +173,7 @@ class EditgroupAction extends GroupDesignAction if (Event::handle('StartGroupSaveForm', array($this))) { - $nickname = Nickname::normalize($this->trimmed('nickname')); + $nickname = Nickname::normalize($this->trimmed('newnickname')); $fullname = $this->trimmed('fullname'); $homepage = $this->trimmed('homepage'); $description = $this->trimmed('description'); diff --git a/actions/editpeopletag.php b/actions/editpeopletag.php index 115049f7ab..546d9910ba 100644 --- a/actions/editpeopletag.php +++ b/actions/editpeopletag.php @@ -40,7 +40,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { * @link http://status.net/ */ -class EditpeopletagAction extends OwnerDesignAction +class EditpeopletagAction extends Action { var $msg, $confirm, $confirm_args=array(); @@ -71,7 +71,11 @@ class EditpeopletagAction extends OwnerDesignAction } $id = $this->arg('id'); - $tagger_arg = $this->arg('tagger'); + if (common_config('singleuser', 'enabled')) { + $tagger_arg = User::singleUserNickname(); + } else { + $tagger_arg = $this->arg('tagger'); + } $tag_arg = $this->arg('tag'); $tagger = common_canonical_nickname($tagger_arg); @@ -293,7 +297,7 @@ class EditpeopletagAction extends OwnerDesignAction if (!$result) { common_log_db_error($this->group, 'UPDATE', __FILE__); - // TRANS: TRANS: Server error displayed when updating a list fails. + // TRANS: Server error displayed when updating a list fails. $this->serverError(_('Could not update list.')); } diff --git a/actions/favorited.php b/actions/favorited.php index 17c2a58c94..ff4a99cd60 100644 --- a/actions/favorited.php +++ b/actions/favorited.php @@ -172,11 +172,8 @@ class FavoritedAction extends Action */ function showContent() { - $pop = new Popularity(); - $pop->offset = ($this->page - 1) * NOTICES_PER_PAGE; - $pop->limit = NOTICES_PER_PAGE; - $pop->expiry = 600; - $notice = $pop->getNotices(); + $stream = new PopularNoticeStream(Profile::current()); + $notice = $stream->getNotices(($this->page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE+1); $nl = new NoticeList($notice, $this); diff --git a/actions/groupdesignsettings.php b/actions/groupdesignsettings.php deleted file mode 100644 index 798064d16c..0000000000 --- a/actions/groupdesignsettings.php +++ /dev/null @@ -1,319 +0,0 @@ -. - * - * @category Settings - * @package StatusNet - * @author Sarven Capadisli - * @author Zach Copley - * @copyright 2008-2009 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} - -require_once INSTALLDIR . '/lib/designsettings.php'; - -/** - * Set a group's design - * - * Saves a design for a given group - * - * @category Settings - * @package StatusNet - * @author Zach Copley - * @author Sarven Capadisli - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ -class GroupDesignSettingsAction extends DesignSettingsAction -{ - var $group = null; - - /** - * Sets the right action for the form, and passes request args into - * the base action - * - * @param array $args misc. arguments - * - * @return boolean true - */ - function prepare($args) - { - parent::prepare($args); - - if (!common_logged_in()) { - // TRANS: Client error displayed trying to change group design settings while not logged in. - $this->clientError(_('You must be logged in to edit a group.')); - return false; - } - - $nickname_arg = $this->trimmed('nickname'); - $nickname = common_canonical_nickname($nickname_arg); - - // Permanent redirect on non-canonical nickname - - if ($nickname_arg != $nickname) { - $args = array('nickname' => $nickname); - common_redirect(common_local_url('groupdesignsettings', $args), 301); - return false; - } - - if (!$nickname) { - // TRANS: Client error displayed trying to change group design settings without providing a group nickname. - $this->clientError(_('No nickname.'), 404); - return false; - } - - $groupid = $this->trimmed('groupid'); - - if ($groupid) { - $this->group = User_group::staticGet('id', $groupid); - } else { - $local = Local_group::staticGet('nickname', $nickname); - if ($local) { - $this->group = User_group::staticGet('id', $local->group_id); - } - } - - if (!$this->group) { - // TRANS: Client error displayed trying to change group design settings while providing a nickname for a non-existing group. - $this->clientError(_('No such group.'), 404); - return false; - } - - $cur = common_current_user(); - - if (!$cur->isAdmin($this->group)) { - // TRANS: Client error displayed trying to change group design settings without being a (group) admin. - $this->clientError(_('You must be an admin to edit the group.'), 403); - return false; - } - - $this->submitaction = common_local_url('groupdesignsettings', - array('nickname' => $this->group->nickname)); - - return true; - } - - /** - * A design for this action - * - * if the group attribute has been set, returns that group's - * design. - * - * @return Design a design object to use - */ - function getDesign() - { - - if (empty($this->group)) { - return null; - } - - return $this->group->getDesign(); - } - - /** - * Title of the page - * - * @return string Title of the page - */ - - function title() - { - // TRANS: Title group design settings page. - return _('Group design'); - } - - /** - * Instructions for use - * - * @return instructions for use - */ - function getInstructions() - { - // TRANS: Instructions for group design settings page. - return _('Customize the way your group looks ' . - 'with a background image and a colour palette of your choice.'); - } - - /** - * Override to show group nav stuff - * - * @return nothing - */ - function showObjectNav() - { - $nav = new GroupNav($this, $this->group); - $nav->show(); - } - - /** - * Override to show default nav stuff - * - * @return nothing - */ - function showLocalNav() - { - Action::showLocalNav(); - } - - /** - * Get the design we want to edit - * - * @return Design - */ - function getWorkingDesign() - { - $design = null; - - if (isset($this->group)) { - $design = $this->group->getDesign(); - } - - return $design; - } - - /** - * Content area of the page - * - * Shows a form for changing the design - * - * @return void - */ - function showContent() - { - $design = $this->getWorkingDesign(); - - if (empty($design)) { - $design = Design::siteDesign(); - } - - $this->showDesignForm($design); - } - - /** - * Save or update the group's design settings - * - * @return void - */ - function saveDesign() - { - try { - $bgcolor = new WebColor($this->trimmed('design_background')); - $ccolor = new WebColor($this->trimmed('design_content')); - $sbcolor = new WebColor($this->trimmed('design_sidebar')); - $tcolor = new WebColor($this->trimmed('design_text')); - $lcolor = new WebColor($this->trimmed('design_links')); - } catch (WebColorException $e) { - $this->showForm($e->getMessage()); - return; - } - - $onoff = $this->arg('design_background-image_onoff'); - - $on = false; - $off = false; - $tile = false; - - if ($onoff == 'on') { - $on = true; - } else { - $off = true; - } - - $repeat = $this->boolean('design_background-image_repeat'); - - if ($repeat) { - $tile = true; - } - - $design = $this->group->getDesign(); - - if (!empty($design)) { - // update design - - $original = clone($design); - - $design->backgroundcolor = $bgcolor->intValue(); - $design->contentcolor = $ccolor->intValue(); - $design->sidebarcolor = $sbcolor->intValue(); - $design->textcolor = $tcolor->intValue(); - $design->linkcolor = $lcolor->intValue(); - - $design->setDisposition($on, $off, $tile); - - $result = $design->update($original); - - if ($result === false) { - common_log_db_error($design, 'UPDATE', __FILE__); - // TRANS: Form validation error displayed when group design settings could not be updated because of an application issue. - $this->showForm(_('Unable to update your design settings.')); - return; - } - } else { - $this->group->query('BEGIN'); - - // save new design - - $design = new Design(); - - $design->backgroundcolor = $bgcolor->intValue(); - $design->contentcolor = $ccolor->intValue(); - $design->sidebarcolor = $sbcolor->intValue(); - $design->textcolor = $tcolor->intValue(); - $design->linkcolor = $lcolor->intValue(); - - $design->setDisposition($on, $off, $tile); - - $id = $design->insert(); - - if (empty($id)) { - common_log_db_error($id, 'INSERT', __FILE__); - // TRANS: Form validation error displayed when group design settings could not be saved because of an application issue. - $this->showForm(_('Unable to save your design settings.')); - return; - } - - $original = clone($this->group); - $this->group->design_id = $id; - $result = $this->group->update($original); - - if (empty($result)) { - common_log_db_error($original, 'UPDATE', __FILE__); - // TRANS: Form validation error displayed when group design settings could not be saved because of an application issue. - $this->showForm(_('Unable to save your design settings.')); - $this->group->query('ROLLBACK'); - return; - } - - $this->group->query('COMMIT'); - } - - $this->saveBackgroundImage($design); - - // TRANS: Form text to confirm saved group design settings. - $this->showForm(_('Design preferences saved.'), true); - } -} diff --git a/actions/grouplogo.php b/actions/grouplogo.php index a6694cd837..46ce274274 100644 --- a/actions/grouplogo.php +++ b/actions/grouplogo.php @@ -23,7 +23,7 @@ * @package StatusNet * @author Evan Prodromou * @author Zach Copley - * @copyright 2008-2009 StatusNet, Inc. + * @copyright 2008-2011 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ @@ -49,7 +49,7 @@ define('MAX_ORIGINAL', 480); * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class GrouplogoAction extends GroupDesignAction +class GrouplogoAction extends GroupAction { var $mode = null; var $imagefile = null; @@ -457,10 +457,4 @@ class GrouplogoAction extends GroupDesignAction $this->autofocus('avatarfile'); } - - function showObjectNav() - { - $nav = new GroupNav($this, $this->group); - $nav->show(); - } } diff --git a/actions/groupmembers.php b/actions/groupmembers.php index 2bb35ceddc..52979101fd 100644 --- a/actions/groupmembers.php +++ b/actions/groupmembers.php @@ -43,7 +43,7 @@ require_once INSTALLDIR.'/lib/publicgroupnav.php'; * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class GroupmembersAction extends GroupDesignAction +class GroupmembersAction extends GroupAction { var $page = null; @@ -55,44 +55,9 @@ class GroupmembersAction extends GroupDesignAction function prepare($args) { parent::prepare($args); + $this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1; - $nickname_arg = $this->arg('nickname'); - $nickname = common_canonical_nickname($nickname_arg); - - // Permanent redirect on non-canonical nickname - - if ($nickname_arg != $nickname) { - $args = array('nickname' => $nickname); - if ($this->page != 1) { - $args['page'] = $this->page; - } - common_redirect(common_local_url('groupmembers', $args), 301); - return false; - } - - if (!$nickname) { - // TRANS: Client error displayed when trying to view group members without providing a group nickname. - $this->clientError(_('No nickname.'), 404); - return false; - } - - $local = Local_group::staticGet('nickname', $nickname); - - if (!$local) { - // TRANS: Client error displayed when trying to view group members for a non-existing group. - $this->clientError(_('No such group.'), 404); - return false; - } - - $this->group = User_group::staticGet('id', $local->group_id); - - if (!$this->group) { - // TRANS: Client error displayed when trying to view group members for an object that is not a group. - $this->clientError(_('No such group.'), 404); - return false; - } - return true; } @@ -125,12 +90,6 @@ class GroupmembersAction extends GroupDesignAction _('A list of the users in this group.')); } - function showObjectNav() - { - $nav = new GroupNav($this, $this->group); - $nav->show(); - } - function showContent() { $offset = ($this->page-1) * PROFILES_PER_PAGE; @@ -145,8 +104,6 @@ class GroupmembersAction extends GroupDesignAction $cnt = $member_list->show(); } - $members->free(); - $this->pagination($this->page > 1, $cnt > PROFILES_PER_PAGE, $this->page, 'groupmembers', array('nickname' => $this->group->nickname)); diff --git a/actions/groupqueue.php b/actions/groupqueue.php index 7cc32a9c69..4bbf5dcb02 100644 --- a/actions/groupqueue.php +++ b/actions/groupqueue.php @@ -43,7 +43,7 @@ require_once INSTALLDIR.'/lib/publicgroupnav.php'; * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class GroupqueueAction extends GroupDesignAction +class GroupqueueAction extends GroupAction { var $page = null; @@ -132,12 +132,6 @@ class GroupqueueAction extends GroupDesignAction _('A list of users awaiting approval to join this group.')); } - function showObjectNav() - { - $nav = new GroupNav($this, $this->group); - $nav->show(); - } - function showContent() { $offset = ($this->page-1) * PROFILES_PER_PAGE; diff --git a/actions/hcard.php b/actions/hcard.php deleted file mode 100644 index 6db2972b9d..0000000000 --- a/actions/hcard.php +++ /dev/null @@ -1,121 +0,0 @@ -. - * - * @category Personal - * @package StatusNet - * @author Evan Prodromou - * @copyright 2010 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3 - * @link http://status.net/ - */ - -if (!defined('STATUSNET')) { - exit(1); -} - -/** - * User profile page - * - * @category Personal - * @package StatusNet - * @author Evan Prodromou - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3 - * @link http://status.net/ - */ -class HcardAction extends Action -{ - var $user; - var $profile; - - function prepare($args) - { - parent::prepare($args); - - $nickname_arg = $this->arg('nickname'); - $nickname = common_canonical_nickname($nickname_arg); - - // Permanent redirect on non-canonical nickname - - if ($nickname_arg != $nickname) { - $args = array('nickname' => $nickname); - common_redirect(common_local_url('hcard', $args), 301); - return false; - } - - $this->user = User::staticGet('nickname', $nickname); - - if (!$this->user) { - // TRANS: Client error displayed when trying to get a user hCard for a non-existing user. - $this->clientError(_('No such user.'), 404); - return false; - } - - $this->profile = $this->user->getProfile(); - - if (!$this->profile) { - // TRANS: Error message displayed when referring to a user without a profile. - $this->serverError(_('User has no profile.')); - return false; - } - - return true; - } - - function handle($args) - { - parent::handle($args); - $this->showPage(); - } - - function title() - { - return $this->profile->getBestName(); - } - - function showContent() - { - $up = new ShortUserProfile($this, $this->user, $this->profile); - $up->show(); - } - - function showHeader() - { - return; - } - - function showAside() - { - return; - } - - function showSecondaryNav() - { - return; - } -} - -class ShortUserProfile extends UserProfile -{ - function showEntityActions() - { - return; - } -} diff --git a/actions/hostmeta.php b/actions/hostmeta.php index e921b5ad59..5caf1960cb 100644 --- a/actions/hostmeta.php +++ b/actions/hostmeta.php @@ -59,7 +59,13 @@ class HostMetaAction extends Action Event::handle('EndHostMetaLinks', array(&$xrd->links)); } + // Output Cross-Origin Resource Sharing (CORS) header + if (common_config('discovery', 'cors')) { + header('Access-Control-Allow-Origin: *'); + } + header('Content-type: application/xrd+xml'); + print $xrd->toXML(); } } diff --git a/actions/imsettings.php b/actions/imsettings.php index e809981a3f..809dbd2879 100644 --- a/actions/imsettings.php +++ b/actions/imsettings.php @@ -67,7 +67,7 @@ class ImsettingsAction extends SettingsAction // TRANS: [instant messages] is link text, "(%%doc.im%%)" is the link. // TRANS: the order and formatting of link text and link should remain unchanged. return _('You can send and receive notices through '. - 'instant messaging [instant messages](%%doc.im%%). '. + '[instant messaging](%%doc.im%%). '. 'Configure your addresses and settings below.'); } diff --git a/actions/invite.php b/actions/invite.php index 1bfc9f76d3..75800aa858 100644 --- a/actions/invite.php +++ b/actions/invite.php @@ -20,7 +20,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } // @todo XXX: Add documentation. -class InviteAction extends CurrentUserDesignAction +class InviteAction extends Action { var $mode = null; var $error = null; diff --git a/actions/joingroup.php b/actions/joingroup.php index bb7b835915..fa5968a2c4 100644 --- a/actions/joingroup.php +++ b/actions/joingroup.php @@ -131,6 +131,10 @@ class JoingroupAction extends Action try { $result = $cur->joinGroup($this->group); } catch (Exception $e) { + common_log(LOG_ERR, sprintf("Couldn't join user %s to group %s: '%s'", + $cur->nickname, + $this->group->nickname, + $e->getMessage())); // TRANS: Server error displayed when joining a group failed in the database. // TRANS: %1$s is the joining user's nickname, $2$s is the group nickname for which the join failed. $this->serverError(sprintf(_('Could not join user %1$s to group %2$s.'), diff --git a/actions/leavegroup.php b/actions/leavegroup.php index 9e560b9717..b8aaf83d20 100644 --- a/actions/leavegroup.php +++ b/actions/leavegroup.php @@ -125,6 +125,7 @@ class LeavegroupAction extends Action try { $cur->leaveGroup($this->group); } catch (Exception $e) { + common_log(LOG_ERR, "Error when {$cur->nickname} tried to leave {$this->group->nickname}: " . $e->getMessage()); // TRANS: Server error displayed when leaving a group failed in the database. // TRANS: %1$s is the leaving user's nickname, $2$s is the group nickname for which the leave failed. $this->serverError(sprintf(_('Could not remove user %1$s from group %2$s.'), diff --git a/actions/login.php b/actions/login.php index f774a0ed80..f8a1a5c6a3 100644 --- a/actions/login.php +++ b/actions/login.php @@ -94,8 +94,8 @@ class LoginAction extends Action parent::handle($args); if (common_is_real_login()) { - // TRANS: Client error displayed when trying to log in while already logged in. - $this->clientError(_('Already logged in.')); + $user = common_current_user(); + common_redirect(common_local_url('all', array('nickname' => $user->nickname)), 307); } else if ($_SERVER['REQUEST_METHOD'] == 'POST') { $this->checkLogin(); } else { diff --git a/actions/logout.php b/actions/logout.php index 567d808cd1..4e51271d43 100644 --- a/actions/logout.php +++ b/actions/logout.php @@ -73,7 +73,13 @@ class LogoutAction extends Action } Event::handle('EndLogout', array($this)); - common_redirect(common_local_url('public'), 303); + if (common_config('singleuser', 'enabled')) { + $user = User::singleUser(); + common_redirect(common_local_url('showstream', + array('nickname' => $user->nickname))); + } else { + common_redirect(common_local_url('public'), 303); + } } } diff --git a/actions/newapplication.php b/actions/newapplication.php index 93ef417f63..23525ef321 100644 --- a/actions/newapplication.php +++ b/actions/newapplication.php @@ -42,7 +42,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class NewApplicationAction extends OwnerDesignAction +class NewApplicationAction extends Action { var $msg; @@ -295,6 +295,7 @@ class NewApplicationAction extends OwnerDesignAction $app->uploadLogo(); } catch (Exception $e) { $app->query('ROLLBACK'); + // TRANS: Form validation error messages displayed when uploading an invalid application logo. $this->showForm(_('Invalid image.')); return; } diff --git a/actions/newgroup.php b/actions/newgroup.php index c54e24ed95..cf3125fd87 100644 --- a/actions/newgroup.php +++ b/actions/newgroup.php @@ -122,7 +122,7 @@ class NewgroupAction extends Action { if (Event::handle('StartGroupSaveForm', array($this))) { try { - $nickname = Nickname::normalize($this->trimmed('nickname')); + $nickname = Nickname::normalize($this->trimmed('newnickname')); } catch (NicknameException $e) { $this->showForm($e->getMessage()); } diff --git a/actions/newmessage.php b/actions/newmessage.php index dd7c5357ba..fa1922c4a0 100644 --- a/actions/newmessage.php +++ b/actions/newmessage.php @@ -175,7 +175,7 @@ class NewmessageAction extends Action return; } else if ($user->id == $this->other->id) { // TRANS: Client error displayed trying to send a direct message to self. - $this->clientError(_('Don\'t send a message to yourself; ' . + $this->clientError(_('Do not send a message to yourself; ' . 'just say it to yourself quietly instead.'), 403); return; } diff --git a/actions/oauthappssettings.php b/actions/oauthappssettings.php index a7a4b219a3..c93a0a1580 100644 --- a/actions/oauthappssettings.php +++ b/actions/oauthappssettings.php @@ -31,6 +31,9 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } +require_once INSTALLDIR . '/lib/applicationlist.php'; +require_once INSTALLDIR . '/lib/statusnetoauthstore.php'; + /** * Show a user's registered OAuth applications * diff --git a/actions/oauthconnectionssettings.php b/actions/oauthconnectionssettings.php index 5c66730931..80fac0d509 100644 --- a/actions/oauthconnectionssettings.php +++ b/actions/oauthconnectionssettings.php @@ -32,7 +32,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { } require_once INSTALLDIR . '/lib/applicationlist.php'; -require_once INSTALLDIR . '/lib/apioauthstore.php'; +require_once INSTALLDIR . '/lib/statusnetoauthstore.php'; /** * Show connected OAuth applications diff --git a/actions/oldschoolsettings.php b/actions/oldschoolsettings.php new file mode 100644 index 0000000000..74c6c05cda --- /dev/null +++ b/actions/oldschoolsettings.php @@ -0,0 +1,228 @@ +. + * + * @category Oldschool + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + // This check helps protect against security problems; + // your code file can't be executed directly from the web. + exit(1); +} + +/** + * Old-school settings + * + * @category Oldschool + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +class OldschoolsettingsAction extends SettingsAction +{ + /** + * Title of the page + * + * @return string Title of the page + */ + function title() + { + // TRANS: Page title for profile settings. + return _('Old school UI settings'); + } + + /** + * Instructions for use + * + * @return instructions for use + */ + function getInstructions() + { + // TRANS: Usage instructions for profile settings. + return _('If you like it "the old way", you can set that here.'); + } + + /** + * For initializing members of the class. + * + * @param array $argarray misc. arguments + * + * @return boolean true + */ + + function prepare($argarray) + { + if (!common_config('oldschool', 'enabled')) { + throw new ClientException("Old-school settings not enabled."); + } + parent::prepare($argarray); + return true; + } + + /** + * Handler method + * + * @param array $argarray is ignored since it's now passed in in prepare() + * + * @return void + */ + + function handlePost() + { + $user = common_current_user(); + + $osp = Old_school_prefs::staticGet('user_id', $user->id); + $orig = null; + + if (!empty($osp)) { + $orig = clone($osp); + } else { + $osp = new Old_school_prefs(); + $osp->user_id = $user->id; + $osp->created = common_sql_now(); + } + + $osp->stream_mode_only = $this->boolean('stream_mode_only'); + $osp->conversation_tree = $this->boolean('conversation_tree'); + $osp->stream_nicknames = $this->boolean('stream_nicknames'); + $osp->modified = common_sql_now(); + + if (!empty($orig)) { + $osp->update($orig); + } else { + $osp->insert(); + } + + // TRANS: Confirmation shown when user profile settings are saved. + $this->showForm(_('Settings saved.'), true); + + return; + } + + function showContent() + { + $user = common_current_user(); + $form = new OldSchoolForm($this, $user); + $form->show(); + } +} + +class OldSchoolForm extends Form +{ + var $user; + + function __construct($out, $user) + { + parent::__construct($out); + $this->user = $user; + } + + /** + * Visible or invisible data elements + * + * Display the form fields that make up the data of the form. + * Sub-classes should overload this to show their data. + * + * @return void + */ + + function formData() + { + $this->elementStart('fieldset'); + $this->elementStart('ul', 'form_data'); + $this->elementStart('li'); + $this->checkbox('stream_mode_only', _('Only stream mode (no conversations) in timelines'), + $this->user->streamModeOnly()); + $this->elementEnd('li'); + $this->elementStart('li'); + $this->checkbox('conversation_tree', _('Show conversation page as hierarchical trees'), + $this->user->conversationTree()); + $this->elementEnd('li'); + $this->elementStart('li'); + $this->checkbox('stream_nicknames', _('Show nicknames (not full names) in timelines'), + $this->user->streamNicknames()); + $this->elementEnd('li'); + $this->elementEnd('fieldset'); + $this->elementEnd('ul'); + } + + /** + * Buttons for form actions + * + * Submit and cancel buttons (or whatever) + * Sub-classes should overload this to show their own buttons. + * + * @return void + */ + + function formActions() + { + $this->submit('submit', _('Save')); + } + + /** + * ID of the form + * + * Should be unique on the page. Sub-classes should overload this + * to show their own IDs. + * + * @return int ID of the form + */ + + function id() + { + return 'form_oldschool'; + } + + /** + * Action of the form. + * + * URL to post to. Should be overloaded by subclasses to give + * somewhere to post to. + * + * @return string URL to post to + */ + + function action() + { + return common_local_url('oldschoolsettings'); + } + + /** + * Class of the form. May include space-separated list of multiple classes. + * + * @return string the form's class + */ + + function formClass() + { + return 'form_settings'; + } +} diff --git a/actions/pathsadminpanel.php b/actions/pathsadminpanel.php index 0b4a5ff952..57f82e7995 100644 --- a/actions/pathsadminpanel.php +++ b/actions/pathsadminpanel.php @@ -24,7 +24,7 @@ * @author Evan Prodromou * @author Zach Copley * @author Sarven Capadisli - * @copyright 2008-2010 StatusNet, Inc. + * @copyright 2008-2011 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ @@ -92,7 +92,6 @@ class PathsadminpanelAction extends AdminPanelAction 'site' => array('path', 'locale_path', 'ssl', 'sslserver'), 'theme' => array('server', 'dir', 'path', 'sslserver', 'sslpath'), 'avatar' => array('server', 'dir', 'path'), - 'background' => array('server', 'dir', 'path', 'sslserver', 'sslpath'), 'attachments' => array('server', 'dir', 'path', 'sslserver', 'sslpath') ); @@ -163,14 +162,6 @@ class PathsadminpanelAction extends AdminPanelAction $this->clientError(sprintf(_('Avatar directory not writable: %s.'), $values['avatar']['dir'])); } - // Validate background dir - - if (empty($values['background']['dir']) || !is_writable($values['background']['dir'])) { - // TRANS: Client error in Paths admin panel. - // TRANS: %s is the background directory that could not be written to. - $this->clientError(sprintf(_('Background directory not writable: %s.'), $values['background']['dir'])); - } - // Validate locales dir // XXX: What else do we need to validate for lacales path here? --Z @@ -364,61 +355,7 @@ class PathsAdminPanelForm extends AdminForm $this->out->elementEnd('fieldset'); $this->out->elementStart('fieldset', array('id' => - 'settings_design_background-paths')); - // TRANS: Fieldset legend in Paths admin panel. - $this->out->element('legend', null, _('Backgrounds')); - $this->out->elementStart('ul', 'form_data'); - - $this->li(); - $this->input('server', - // TRANS: Field label in Paths admin panel. - _('Server'), - // TRANS: Tooltip for field label in Paths admin panel. - _('Server for backgrounds.'), - 'background'); - $this->unli(); - - $this->li(); - $this->input('path', - // TRANS: Field label in Paths admin panel. - _('Path'), - // TRANS: Tooltip for field label in Paths admin panel. - _('Web path to backgrounds.'), - 'background'); - $this->unli(); - - $this->li(); - $this->input('sslserver', - // TRANS: Field label in Paths admin panel. - _('SSL server'), - // TRANS: Tooltip for field label in Paths admin panel. - _('Server for backgrounds on SSL pages.'), - 'background'); - $this->unli(); - - $this->li(); - $this->input('sslpath', - // TRANS: Field label in Paths admin panel. - _('SSL path'), - // TRANS: Tooltip for field label in Paths admin panel. - _('Web path to backgrounds on SSL pages.'), - 'background'); - $this->unli(); - - $this->li(); - $this->input('dir', - // TRANS: Field label in Paths admin panel. - _('Directory'), - // TRANS: Tooltip for field label in Paths admin panel. - _('Directory where backgrounds are located.'), - 'background'); - $this->unli(); - - $this->out->elementEnd('ul'); - $this->out->elementEnd('fieldset'); - - $this->out->elementStart('fieldset', array('id' => - 'settings_design_attachments-paths')); + 'settings_attachments-paths')); // TRANS: Fieldset legens in Paths admin panel. $this->out->element('legend', null, _('Attachments')); @@ -516,7 +453,7 @@ class PathsAdminPanelForm extends AdminForm // TRANS: Button text to store form data in the Paths admin panel. $this->out->submit('save', _m('BUTTON','Save'), 'submit', // TRANS: Button title text to store form data in the Paths admin panel. - 'save', _('Save paths')); + 'save', _('Save path settings.')); } /** diff --git a/actions/peopletagged.php b/actions/peopletagged.php index ea25c8675b..6f9748c234 100644 --- a/actions/peopletagged.php +++ b/actions/peopletagged.php @@ -22,7 +22,7 @@ * @category Group * @package StatusNet * @author Shashi Gowda - * @copyright 2008-2009 StatusNet, Inc. + * @copyright 2008-2011 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ @@ -42,7 +42,7 @@ require_once(INSTALLDIR.'/lib/profilelist.php'); * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class PeopletaggedAction extends OwnerDesignAction +class PeopletaggedAction extends Action { var $page = null; var $peopletag = null; @@ -58,7 +58,12 @@ class PeopletaggedAction extends OwnerDesignAction parent::prepare($args); $this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1; - $tagger_arg = $this->arg('tagger'); + if (common_config('singleuser', 'enabled')) { + $tagger_arg = User::singleUserNickname(); + } else { + $tagger_arg = $this->arg('tagger'); + } + $tag_arg = $this->arg('tag'); $tagger = common_canonical_nickname($tagger_arg); $tag = common_canonical_tag($tag_arg); diff --git a/actions/peopletagsbyuser.php b/actions/peopletagsbyuser.php index d348585c90..8ef1a56ee1 100644 --- a/actions/peopletagsbyuser.php +++ b/actions/peopletagsbyuser.php @@ -22,7 +22,7 @@ * @category Personal * @package StatusNet * @author Shashi Gowda - * @copyright 2008-2009 StatusNet, Inc. + * @copyright 2008-2011 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ @@ -33,7 +33,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { require_once INSTALLDIR.'/lib/peopletaglist.php'; -class PeopletagsbyuserAction extends OwnerDesignAction +class PeopletagsbyuserAction extends Action { var $page = null; var $tagger = null; @@ -76,7 +76,12 @@ class PeopletagsbyuserAction extends OwnerDesignAction $this->args['public'] = $this->args['private'] = false; } - $nickname_arg = $this->arg('nickname'); + if (common_config('singleuser', 'enabled')) { + $nickname_arg = User::singleUserNickname(); + } else { + $nickname_arg = $this->arg('nickname'); + } + $nickname = common_canonical_nickname($nickname_arg); // Permanent redirect on non-canonical nickname @@ -213,7 +218,7 @@ class PeopletagsbyuserAction extends OwnerDesignAction '(http://en.wikipedia.org/wiki/Micro-blogging) service ' . 'based on the Free Software [StatusNet](http://status.net/) tool. ' . 'You can easily keep track of what they ' . - 'are doing by subscribing to the tag\'s timeline.' ), $this->tagger->nickname); + 'are doing by subscribing to the list\'s timeline.' ), $this->tagger->nickname); $this->elementStart('div', array('id' => 'anon_notice')); $this->raw(common_markup_to_html($notice)); $this->elementEnd('div'); diff --git a/actions/peopletagsforuser.php b/actions/peopletagsforuser.php index 9883bd3657..d30f7321c1 100644 --- a/actions/peopletagsforuser.php +++ b/actions/peopletagsforuser.php @@ -22,7 +22,7 @@ * @category Personal * @package StatusNet * @author Shashi Gowda - * @copyright 2008-2009 StatusNet, Inc. + * @copyright 2008-2011 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ @@ -33,7 +33,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { require_once INSTALLDIR.'/lib/peopletaglist.php'; -class PeopletagsforuserAction extends OwnerDesignAction +class PeopletagsforuserAction extends Action { var $page = null; var $tagged = null; @@ -58,7 +58,12 @@ class PeopletagsforuserAction extends OwnerDesignAction { parent::prepare($args); - $nickname_arg = $this->arg('nickname'); + if (common_config('singleuser', 'enabled')) { + $nickname_arg = User::singleUserNickname(); + } else { + $nickname_arg = $this->arg('nickname'); + } + $nickname = common_canonical_nickname($nickname_arg); // Permanent redirect on non-canonical nickname @@ -111,7 +116,7 @@ class PeopletagsforuserAction extends OwnerDesignAction '(http://en.wikipedia.org/wiki/Micro-blogging) service ' . 'based on the Free Software [StatusNet](http://status.net/) tool. ' . 'You can easily keep track of what they ' . - 'are doing by subscribing to the tag\'s timeline.' ), $this->tagged->nickname); + 'are doing by subscribing to the list\'s timeline.' ), $this->tagged->nickname); $this->elementStart('div', array('id' => 'anon_notice')); $this->raw(common_markup_to_html($notice)); $this->elementEnd('div'); diff --git a/actions/peopletagsubscribers.php b/actions/peopletagsubscribers.php index ebc3a9f494..1834a7e4ad 100644 --- a/actions/peopletagsubscribers.php +++ b/actions/peopletagsubscribers.php @@ -22,7 +22,7 @@ * @category Group * @package StatusNet * @author Evan Prodromou - * @copyright 2008-2009 StatusNet, Inc. + * @copyright 2008-2011 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ @@ -42,7 +42,7 @@ require_once(INSTALLDIR.'/lib/profilelist.php'); * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class PeopletagsubscribersAction extends OwnerDesignAction +class PeopletagsubscribersAction extends Action { var $page = null; var $peopletag = null; @@ -58,7 +58,12 @@ class PeopletagsubscribersAction extends OwnerDesignAction parent::prepare($args); $this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1; - $tagger_arg = $this->arg('tagger'); + if (common_config('singleuser', 'enabled')) { + $tagger_arg = User::singleUserNickname(); + } else { + $tagger_arg = $this->arg('tagger'); + } + $tag_arg = $this->arg('tag'); $tagger = common_canonical_nickname($tagger_arg); $tag = common_canonical_tag($tag_arg); diff --git a/actions/peopletagsubscriptions.php b/actions/peopletagsubscriptions.php index b65542e074..c497842969 100644 --- a/actions/peopletagsubscriptions.php +++ b/actions/peopletagsubscriptions.php @@ -22,7 +22,7 @@ * @category Personal * @package StatusNet * @author Shashi Gowda - * @copyright 2008-2009 StatusNet, Inc. + * @copyright 2008-2011 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ @@ -33,7 +33,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { require_once INSTALLDIR.'/lib/peopletaglist.php'; -class PeopletagsubscriptionsAction extends OwnerDesignAction +class PeopletagsubscriptionsAction extends Action { var $page = null; var $profile = null; @@ -60,7 +60,12 @@ class PeopletagsubscriptionsAction extends OwnerDesignAction { parent::prepare($args); - $nickname_arg = $this->arg('nickname'); + if (common_config('singleuser', 'enabled')) { + $nickname_arg = User::singleUserNickname(); + } else { + $nickname_arg = $this->arg('nickname'); + } + $nickname = common_canonical_nickname($nickname_arg); // Permanent redirect on non-canonical nickname diff --git a/actions/profilesettings.php b/actions/profilesettings.php index 667fea2cf4..38424ab7af 100644 --- a/actions/profilesettings.php +++ b/actions/profilesettings.php @@ -185,7 +185,7 @@ class ProfilesettingsAction extends SettingsAction $this->checkbox('autosubscribe', // TRANS: Checkbox label in form for profile settings. _('Automatically subscribe to whoever '. - 'subscribes to me (best for non-humans).'), + 'subscribes to me (best for non-humans)'), ($this->arg('autosubscribe')) ? $this->boolean('autosubscribe') : $user->autosubscribe); $this->elementEnd('li'); diff --git a/actions/public.php b/actions/public.php index 90e0e6e259..af2fcff842 100644 --- a/actions/public.php +++ b/actions/public.php @@ -88,14 +88,20 @@ class PublicAction extends Action $this->userProfile = Profile::current(); - $stream = new ThreadingPublicNoticeStream($this->userProfile); + $user = common_current_user(); + + if (!empty($user) && $user->streamModeOnly()) { + $stream = new PublicNoticeStream($this->userProfile); + } else { + $stream = new ThreadingPublicNoticeStream($this->userProfile); + } $this->notice = $stream->getNotices(($this->page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1); if (!$this->notice) { // TRANS: Server error displayed when a public timeline cannot be retrieved. - $this->serverError(_('Could not retrieve public stream.')); + $this->serverError(_('Could not retrieve public timeline.')); return; } @@ -153,6 +159,11 @@ class PublicAction extends Action $this->element('link', array('rel' => 'EditURI', 'type' => 'application/rsd+xml', 'href' => $rsd)); + + if ($this->page != 1) { + $this->element('link', array('rel' => 'canonical', + 'href' => common_local_url('public'))); + } } /** @@ -162,19 +173,24 @@ class PublicAction extends Action */ function getFeeds() { - return array(new Feed(Feed::RSS1, common_local_url('publicrss'), + return array(new Feed(Feed::JSON, + common_local_url('ApiTimelinePublic', + array('format' => 'as')), // TRANS: Link description for public timeline feed. - _('Public Stream Feed (RSS 1.0)')), + _('Public Timeline Feed (Activity Streams JSON)')), + new Feed(Feed::RSS1, common_local_url('publicrss'), + // TRANS: Link description for public timeline feed. + _('Public Timeline Feed (RSS 1.0)')), new Feed(Feed::RSS2, common_local_url('ApiTimelinePublic', array('format' => 'rss')), // TRANS: Link description for public timeline feed. - _('Public Stream Feed (RSS 2.0)')), + _('Public Timeline Feed (RSS 2.0)')), new Feed(Feed::ATOM, common_local_url('ApiTimelinePublic', array('format' => 'atom')), // TRANS: Link description for public timeline feed. - _('Public Stream Feed (Atom)'))); + _('Public Timeline Feed (Atom)'))); } function showEmptyList() @@ -208,7 +224,13 @@ class PublicAction extends Action */ function showContent() { - $nl = new ThreadedNoticeList($this->notice, $this, $this->userProfile); + $user = common_current_user(); + + if (!empty($user) && $user->streamModeOnly()) { + $nl = new NoticeList($this->notice, $this); + } else { + $nl = new ThreadedNoticeList($this->notice, $this, $this->userProfile); + } $cnt = $nl->show(); @@ -222,12 +244,30 @@ class PublicAction extends Action function showSections() { - $ibs = new InviteButtonSection($this); - $ibs->show(); - $pop = new PopularNoticeSection($this); + // Show invite button, as long as site isn't closed, and + // we have a logged in user. + if (common_config('invite', 'enabled') && !common_config('site', 'closed') && common_logged_in()) { + if (!common_config('site', 'private')) { + $ibs = new InviteButtonSection( + $this, + // TRANS: Button text for inviting more users to the StatusNet instance. + // TRANS: Less business/enterprise-oriented language for public sites. + _m('BUTTON', 'Send invite') + ); + } else { + $ibs = new InviteButtonSection($this); + } + $ibs->show(); + } + + $p = Profile::current(); + + $pop = new PopularNoticeSection($this, $p); $pop->show(); - $cloud = new PublicTagCloudSection($this); - $cloud->show(); + if (!common_config('performance', 'high')) { + $cloud = new PublicTagCloudSection($this); + $cloud->show(); + } $feat = new FeaturedUsersSection($this); $feat->show(); } diff --git a/actions/publicpeopletagcloud.php b/actions/publicpeopletagcloud.php deleted file mode 100644 index cb65bbb163..0000000000 --- a/actions/publicpeopletagcloud.php +++ /dev/null @@ -1,182 +0,0 @@ -. - * - * @category Public - * @package StatusNet - * @author Mike Cochrane - * @author Evan Prodromou - * @copyright 2008 Mike Cochrane - * @copyright 2008-2009 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } - -define('TAGS_PER_PAGE', 100); - -/** - * Public tag cloud for notices - * - * @category Personal - * @package StatusNet - * @author Mike Cochrane - * @author Evan Prodromou - * @copyright 2008 Mike Cochrane - * @copyright 2008-2009 StatusNet, Inc. - * @link http://status.net/ - */ -class PublicpeopletagcloudAction extends Action -{ - function isReadOnly($args) - { - return true; - } - - function title() - { - // TRANS: Title for page with public list cloud. - return _('Public list cloud'); - } - - function showPageNotice() - { - $this->element('p', 'instructions', - // TRANS: Page notice for page with public list cloud. - // TRANS: %s is a StatusNet sitename. - sprintf(_('These are largest lists on %s'), - common_config('site', 'name'))); - } - - function showEmptyList() - { - // TRANS: Empty list message on page with public list cloud. - // TRANS: This message contains Markdown links in the form [description](link). - $message = _('No one has [listed](%%doc.tags%%) anyone yet.') . ' '; - - if (common_logged_in()) { - // TRANS: Additional empty list message on page with public list cloud for logged in users. - $message .= _('Be the first to list someone!'); - } - else { - // TRANS: Additional empty list message on page with public list cloud for anonymous users. - // TRANS: This message contains Markdown links in the form [description](link). - $message .= _('Why not [register an account](%%action.register%%) and be the first to list someone!'); - } - - $this->elementStart('div', 'guide'); - $this->raw(common_markup_to_html($message)); - $this->elementEnd('div'); - } - - function showLocalNav() - { - $nav = new PublicGroupNav($this); - $nav->show(); - } - - function handle($args) - { - parent::handle($args); - $this->showPage(); - } - - function showContent() - { - // XXX: cache this - - $tags = new Profile_tag(); - $plist = new Profile_list(); - $plist->private = false; - - $tags->joinAdd($plist); - $tags->selectAdd(); - $tags->selectAdd('profile_tag.tag'); - $tags->selectAdd('count(profile_tag.tag) as weight'); - $tags->groupBy('profile_tag.tag'); - $tags->orderBy('weight DESC'); - - $tags->limit(TAGS_PER_PAGE); - - $cnt = $tags->find(); - - if ($cnt > 0) { - $this->elementStart('div', array('id' => 'tagcloud', - 'class' => 'section')); - - $tw = array(); - $sum = 0; - while ($tags->fetch()) { - $tw[$tags->tag] = $tags->weight; - $sum += $tags->weight; - } - - ksort($tw); - - $this->elementStart('dl'); - // TRANS: DT element on on page with public list cloud. - $this->element('dt', null, _('List cloud')); - $this->elementStart('dd'); - $this->elementStart('ul', 'tags xoxo tag-cloud'); - foreach ($tw as $tag => $weight) { - if ($sum) { - $weightedSum = $weight/$sum; - } else { - $weightedSum = 0.5; - } - $this->showTag($tag, $weight, $weightedSum); - } - $this->elementEnd('ul'); - $this->elementEnd('dd'); - $this->elementEnd('dl'); - $this->elementEnd('div'); - } else { - $this->showEmptyList(); - } - } - - function showTag($tag, $weight, $relative) - { - if ($relative > 0.1) { - $rel = 'tag-cloud-7'; - } else if ($relative > 0.05) { - $rel = 'tag-cloud-6'; - } else if ($relative > 0.02) { - $rel = 'tag-cloud-5'; - } else if ($relative > 0.01) { - $rel = 'tag-cloud-4'; - } else if ($relative > 0.005) { - $rel = 'tag-cloud-3'; - } else if ($relative > 0.002) { - $rel = 'tag-cloud-2'; - } else { - $rel = 'tag-cloud-1'; - } - - $this->elementStart('li', $rel); - - // TRANS: Link title for number of listed people. %d is the number of listed people. - $title = sprintf(_m('1 person listed','%d people listed',$weight),$weight); - $this->element('a', array('href' => common_local_url('peopletag', array('tag' => $tag)), - 'title' => $title), $tag); - $this->elementEnd('li'); - } -} diff --git a/actions/recoverpassword.php b/actions/recoverpassword.php index 47a947dc0c..d8f95b24c3 100644 --- a/actions/recoverpassword.php +++ b/actions/recoverpassword.php @@ -260,7 +260,7 @@ class RecoverpasswordAction extends Action $this->elementStart('li'); // TRANS: Field label for password reset form where the password has to be typed again. $this->password('confirm', _('Confirm'), - // TRANS: Ttile for field label for password reset form where the password has to be typed again. + // TRANS: Title for field label for password reset form where the password has to be typed again. _('Same as password above.')); $this->elementEnd('li'); $this->elementEnd('ul'); @@ -273,108 +273,25 @@ class RecoverpasswordAction extends Action function recoverPassword() { $nore = $this->trimmed('nicknameoremail'); + if (!$nore) { // TRANS: Form instructions for password recovery form. $this->showForm(_('Enter a nickname or email address.')); return; } - $user = User::staticGet('email', common_canonical_email($nore)); - - if (!$user) { - try { - $user = User::staticGet('nickname', common_canonical_nickname($nore)); - } catch (NicknameException $e) { - // invalid - } + try { + User::recoverPassword($nore); + $this->mode = 'sent'; + // TRANS: User notification after an e-mail with instructions was sent from the password recovery form. + $this->msg = _('Instructions for recovering your password ' . + 'have been sent to the email address registered to your ' . + 'account.'); + $this->success = true; + } catch (Exception $e) { + $this->success = false; + $this->msg = $e->getMessage(); } - - // See if it's an unconfirmed email address - - if (!$user) { - // Warning: it may actually be legit to have multiple folks - // who have claimed, but not yet confirmed, the same address. - // We'll only send to the first one that comes up. - $confirm_email = new Confirm_address(); - $confirm_email->address = common_canonical_email($nore); - $confirm_email->address_type = 'email'; - $confirm_email->find(); - if ($confirm_email->fetch()) { - $user = User::staticGet($confirm_email->user_id); - } else { - $confirm_email = null; - } - } else { - $confirm_email = null; - } - - if (!$user) { - // TRANS: Information on password recovery form if no known username or e-mail address was specified. - $this->showForm(_('No user with that email address or username.')); - return; - } - - // Try to get an unconfirmed email address if they used a user name - - if (!$user->email && !$confirm_email) { - $confirm_email = new Confirm_address(); - $confirm_email->user_id = $user->id; - $confirm_email->address_type = 'email'; - $confirm_email->find(); - if (!$confirm_email->fetch()) { - $confirm_email = null; - } - } - - if (!$user->email && !$confirm_email) { - // TRANS: Client error displayed on password recovery form if a user does not have a registered e-mail address. - $this->clientError(_('No registered email address for that user.')); - return; - } - - // Success! We have a valid user and a confirmed or unconfirmed email address - - $confirm = new Confirm_address(); - $confirm->code = common_confirmation_code(128); - $confirm->address_type = 'recover'; - $confirm->user_id = $user->id; - $confirm->address = (!empty($user->email)) ? $user->email : $confirm_email->address; - - if (!$confirm->insert()) { - common_log_db_error($confirm, 'INSERT', __FILE__); - // TRANS: Server error displayed if e-mail address confirmation fails in the database on the password recovery form. - $this->serverError(_('Error saving address confirmation.')); - return; - } - - // @todo FIXME: needs i18n. - $body = "Hey, $user->nickname."; - $body .= "\n\n"; - $body .= 'Someone just asked for a new password ' . - 'for this account on ' . common_config('site', 'name') . '.'; - $body .= "\n\n"; - $body .= 'If it was you, and you want to confirm, use the URL below:'; - $body .= "\n\n"; - $body .= "\t".common_local_url('recoverpassword', - array('code' => $confirm->code)); - $body .= "\n\n"; - $body .= 'If not, just ignore this message.'; - $body .= "\n\n"; - $body .= 'Thanks for your time, '; - $body .= "\n"; - $body .= common_config('site', 'name'); - $body .= "\n"; - - $headers = _mail_prepare_headers('recoverpassword', $user->nickname, $user->nickname); - // TRANS: Subject for password recovery e-mail. - mail_to_user($user, _('Password recovery requested'), $body, $headers, $confirm->address); - - $this->mode = 'sent'; - // TRANS: User notification after an e-mail with instructions was sent from the password recovery form. - $this->msg = _('Instructions for recovering your password ' . - 'have been sent to the email address registered to your ' . - 'account.'); - $this->success = true; $this->showPage(); } diff --git a/actions/removepeopletag.php b/actions/removepeopletag.php index 6943f35ed1..d27175f566 100644 --- a/actions/removepeopletag.php +++ b/actions/removepeopletag.php @@ -112,18 +112,6 @@ class RemovepeopletagAction extends Action return false; } - // OMB 0.1 doesn't have a mechanism for local-server- - // originated tag. - - $omb01 = Remote_profile::staticGet('id', $tagged_id); - - if (!empty($omb01)) { - // TRANS: Client error displayed when trying to (un)list an OMB 0.1 remote profile. - $this->clientError(_('You cannot (un)list an OMB 0.1 '. - 'remote profile with this action.')); - return false; - } - return true; } diff --git a/actions/replies.php b/actions/replies.php index 7ae2d0eb76..86042557dc 100644 --- a/actions/replies.php +++ b/actions/replies.php @@ -22,7 +22,7 @@ * @category Personal * @package StatusNet * @author Evan Prodromou - * @copyright 2008-2009 StatusNet, Inc. + * @copyright 2008-2011 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ @@ -44,7 +44,7 @@ require_once INSTALLDIR.'/lib/feedlist.php'; * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class RepliesAction extends OwnerDesignAction +class RepliesAction extends Action { var $page = null; var $notice; @@ -85,8 +85,11 @@ class RepliesAction extends OwnerDesignAction common_set_returnto($this->selfUrl()); - $this->notice = $this->user->getReplies(($this->page-1) * NOTICES_PER_PAGE, - NOTICES_PER_PAGE + 1); + $stream = new ReplyNoticeStream($this->user->id, + Profile::current()); + + $this->notice = $stream->getNotices(($this->page-1) * NOTICES_PER_PAGE, + NOTICES_PER_PAGE + 1); if($this->page > 1 && $this->notice->N == 0){ // TRANS: Server error when page not found (404) @@ -140,7 +143,16 @@ class RepliesAction extends OwnerDesignAction */ function getFeeds() { - return array(new Feed(Feed::RSS1, + return array(new Feed(Feed::JSON, + common_local_url('ApiTimelineMentions', + array( + 'id' => $this->user->nickname, + 'format' => 'as')), + // TRANS: Link for feed with replies for a user. + // TRANS: %s is a user nickname. + sprintf(_('Replies feed for %s (Activity Streams JSON)'), + $this->user->nickname)), + new Feed(Feed::RSS1, common_local_url('repliesrss', array('nickname' => $this->user->nickname)), // TRANS: Link for feed with replies for a user. diff --git a/actions/restoreaccount.php b/actions/restoreaccount.php index 22f0a8e5da..81c792bd00 100644 --- a/actions/restoreaccount.php +++ b/actions/restoreaccount.php @@ -339,7 +339,7 @@ class RestoreAccountForm extends Form $this->out->elementStart('p', 'instructions'); // TRANS: Form instructions for feed restore. - $this->out->raw(_('You can upload a backed-up stream in '. + $this->out->raw(_('You can upload a backed-up timeline in '. 'Activity Streams format.')); $this->out->elementEnd('p'); diff --git a/actions/showapplication.php b/actions/showapplication.php index c9cdbf1848..adfd17a06c 100644 --- a/actions/showapplication.php +++ b/actions/showapplication.php @@ -22,7 +22,7 @@ * @category Application * @package StatusNet * @author Zach Copley - * @copyright 2008-2009 StatusNet, Inc. + * @copyright 2008-2011 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ @@ -40,7 +40,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class ShowApplicationAction extends OwnerDesignAction +class ShowApplicationAction extends Action { /** * Application to show @@ -251,21 +251,24 @@ class ShowApplicationAction extends OwnerDesignAction $this->elementStart('div', 'entity_data'); // TRANS: Header on the OAuth application page. $this->element('h2', null, _('Application info')); - $this->element('div', - 'entity_consumer_key', - $consumer->consumer_key); - $this->element('div', - 'entity_consumer_secret', - $consumer->consumer_secret); - - $this->element('div', - 'entity_request_token_url', - common_local_url('ApiOauthRequestToken')); - - $this->element('div', 'entity_access_token_url', common_local_url('ApiOauthAccessToken')); - - $this->element('div', 'entity_authorize_url', common_local_url('ApiOauthAuthorize')); + $this->elementStart('dl'); + // TRANS: Field label on application page. + $this->element('dt', null, _('Consumer key')); + $this->element('dd', null, $consumer->consumer_key); + // TRANS: Field label on application page. + $this->element('dt', null, _('Consumer secret')); + $this->element('dd', null, $consumer->consumer_secret); + // TRANS: Field label on application page. + $this->element('dt', null, _('Request token URL')); + $this->element('dd', null, common_local_url('ApiOauthRequestToken')); + // TRANS: Field label on application page. + $this->element('dt', null, _('Access token URL')); + $this->element('dd', null, common_local_url('ApiOauthAccessToken')); + // TRANS: Field label on application page. + $this->element('dt', null, _('Authorize URL')); + $this->element('dd', null, common_local_url('ApiOauthAuthorize')); + $this->elementEnd('dl'); $this->element('p', 'note', // TRANS: Note on the OAuth application page about signature support. diff --git a/actions/showfavorites.php b/actions/showfavorites.php index 67ee914a91..64fa14bc82 100644 --- a/actions/showfavorites.php +++ b/actions/showfavorites.php @@ -22,7 +22,7 @@ * @category Personal * @package StatusNet * @author Evan Prodromou - * @copyright 2008-2009 StatusNet, Inc. + * @copyright 2008-2011 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ @@ -44,7 +44,7 @@ require_once INSTALLDIR.'/lib/feedlist.php'; * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class ShowfavoritesAction extends OwnerDesignAction +class ShowfavoritesAction extends Action { /** User we're getting the faves of */ var $user = null; @@ -165,7 +165,15 @@ class ShowfavoritesAction extends OwnerDesignAction */ function getFeeds() { - return array(new Feed(Feed::RSS1, + return array(new Feed(Feed::JSON, + common_local_url('ApiTimelineFavorites', + array( + 'id' => $this->user->nickname, + 'format' => 'as')), + // TRANS: Feed link text. %s is a username. + sprintf(_('Feed for favorites of %s (Activity Streams JSON)'), + $this->user->nickname)), + new Feed(Feed::RSS1, common_local_url('favoritesrss', array('nickname' => $this->user->nickname)), // TRANS: Feed link text. %s is a username. diff --git a/actions/showgroup.php b/actions/showgroup.php index 5bb90e86dd..10601e58b4 100644 --- a/actions/showgroup.php +++ b/actions/showgroup.php @@ -23,7 +23,7 @@ * @package StatusNet * @author Evan Prodromou * @author Sarven Capadisli - * @copyright 2008-2009 StatusNet, Inc. + * @copyright 2008-2011 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ @@ -35,8 +35,6 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { require_once INSTALLDIR.'/lib/noticelist.php'; require_once INSTALLDIR.'/lib/feedlist.php'; -define('MEMBERS_PER_SECTION', 27); - /** * Group main page * @@ -46,7 +44,7 @@ define('MEMBERS_PER_SECTION', 27); * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class ShowgroupAction extends GroupDesignAction +class ShowgroupAction extends GroupAction { /** page we're viewing. */ var $page = null; @@ -99,56 +97,15 @@ class ShowgroupAction extends GroupDesignAction $this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1; - $nickname_arg = $this->arg('nickname'); - $nickname = common_canonical_nickname($nickname_arg); - - // Permanent redirect on non-canonical nickname - - if ($nickname_arg != $nickname) { - $args = array('nickname' => $nickname); - if ($this->page != 1) { - $args['page'] = $this->page; - } - common_redirect(common_local_url('showgroup', $args), 301); - return false; - } - - if (!$nickname) { - // TRANS: Client error displayed if no nickname argument was given requesting a group page. - $this->clientError(_('No nickname.'), 404); - return false; - } - - $local = Local_group::staticGet('nickname', $nickname); - - if (!$local) { - $alias = Group_alias::staticGet('alias', $nickname); - if ($alias) { - $args = array('id' => $alias->group_id); - if ($this->page != 1) { - $args['page'] = $this->page; - } - common_redirect(common_local_url('groupbyid', $args), 301); - return false; - } else { - common_log(LOG_NOTICE, "Couldn't find local group for nickname '$nickname'"); - // TRANS: Client error displayed if no remote group with a given name was found requesting group page. - $this->clientError(_('No such group.'), 404); - return false; - } - } - - $this->group = User_group::staticGet('id', $local->group_id); - - if (!$this->group) { - // TRANS: Client error displayed if no local group with a given name was found requesting group page. - $this->clientError(_('No such group.'), 404); - return false; - } - $this->userProfile = Profile::current(); - $stream = new ThreadingGroupNoticeStream($this->group, $this->userProfile); + $user = common_current_user(); + + if (!empty($user) && $user->streamModeOnly()) { + $stream = new GroupNoticeStream($this->group, $this->userProfile); + } else { + $stream = new ThreadingGroupNoticeStream($this->group, $this->userProfile); + } $this->notice = $stream->getNotices(($this->page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1); @@ -171,17 +128,6 @@ class ShowgroupAction extends GroupDesignAction $this->showPage(); } - /** - * Local menu - * - * @return void - */ - function showObjectNav() - { - $nav = new GroupNav($this, $this->group); - $nav->show(); - } - /** * Show the page content * @@ -199,7 +145,14 @@ class ShowgroupAction extends GroupDesignAction */ function showGroupNotices() { - $nl = new ThreadedNoticeList($this->notice, $this, $this->userProfile); + $user = common_current_user(); + + if (!empty($user) && $user->streamModeOnly()) { + $nl = new NoticeList($this->notice, $this); + } else { + $nl = new ThreadedNoticeList($this->notice, $this, $this->userProfile); + } + $cnt = $nl->show(); $this->pagination($this->page > 1, @@ -220,7 +173,14 @@ class ShowgroupAction extends GroupDesignAction common_local_url('grouprss', array('nickname' => $this->group->nickname)); - return array(new Feed(Feed::RSS1, + return array(new Feed(Feed::JSON, + common_local_url('ApiTimelineGroup', + array('format' => 'as', + 'id' => $this->group->id)), + // TRANS: Tooltip for feed link. %s is a group nickname. + sprintf(_('Notice feed for %s group (Activity Streams JSON)'), + $this->group->nickname)), + new Feed(Feed::RSS1, common_local_url('grouprss', array('nickname' => $this->group->nickname)), // TRANS: Tooltip for feed link. %s is a group nickname. @@ -248,201 +208,37 @@ class ShowgroupAction extends GroupDesignAction $this->group->nickname))); } - /** - * Fill in the sidebar. - * - * @return void - */ - function showSections() - { - $this->showMembers(); - $this->showStatistics(); - $this->showAdmins(); - $cloud = new GroupTagCloudSection($this, $this->group); - $cloud->show(); - } - - /** - * Show mini-list of members - * - * @return void - */ - function showMembers() - { - $member = $this->group->getMembers(0, MEMBERS_PER_SECTION); - - if (!$member) { - return; - } - - $this->elementStart('div', array('id' => 'entity_members', - 'class' => 'section')); - - if (Event::handle('StartShowGroupMembersMiniList', array($this))) { - - // TRANS: Header for mini list of group members on a group page (h2). - $this->element('h2', null, _('Members')); - - $gmml = new GroupMembersMiniList($member, $this); - $cnt = $gmml->show(); - if ($cnt == 0) { - // TRANS: Description for mini list of group members on a group page when the group has no members. - $this->element('p', null, _('(None)')); - } - - // @todo FIXME: Should be shown if a group has more than 27 members, but I do not see it displayed at - // for example http://identi.ca/group/statusnet. Broken? - if ($cnt > MEMBERS_PER_SECTION) { - $this->element('a', array('href' => common_local_url('groupmembers', - array('nickname' => $this->group->nickname))), - // TRANS: Link to all group members from mini list of group members if group has more than n members. - _('All members')); - } - - Event::handle('EndShowGroupMembersMiniList', array($this)); - } - - $this->elementEnd('div'); - } - - /** - * Show list of admins - * - * @return void - */ - function showAdmins() - { - $adminSection = new GroupAdminSection($this, $this->group); - $adminSection->show(); - } - - /** - * Show some statistics - * - * @return void - */ - function showStatistics() - { - $this->elementStart('div', array('id' => 'entity_statistics', - 'class' => 'section')); - - // TRANS: Header for group statistics on a group page (h2). - $this->element('h2', null, _('Statistics')); - - $this->elementStart('dl'); - - // TRANS: Label for group creation date. - $this->element('dt', null, _m('LABEL','Created')); - $this->element('dd', 'entity_created', date('j M Y', - strtotime($this->group->created))); - // @todo FIXME: i18n issue. This label gets a colon added from somewhere. Should be part of the message. - // TRANS: Label for member count in statistics on group page. - $this->element('dt', null, _m('LABEL','Members')); - $this->element('dd', null, $this->group->getMemberCount()); - $this->elementEnd('dl'); - - $this->elementEnd('div'); - } - function showAnonymousMessage() { if (!(common_config('site','closed') || common_config('site','inviteonly'))) { - // @todo FIXME: use group full name here if available instead of (uglier) primary alias. // TRANS: Notice on group pages for anonymous users for StatusNet sites that accept new registrations. - // TRANS: **%s** is the group alias, %%%%site.name%%%% is the site name, + // TRANS: %s is the group name, %%%%site.name%%%% is the site name, // TRANS: %%%%action.register%%%% is the URL for registration, %%%%doc.help%%%% is a URL to help. // TRANS: This message contains Markdown links. Ensure they are formatted correctly: [Description](link). $m = sprintf(_('**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service ' . 'based on the Free Software [StatusNet](http://status.net/) tool. Its members share ' . 'short messages about their life and interests. '. '[Join now](%%%%action.register%%%%) to become part of this group and many more! ([Read more](%%%%doc.help%%%%))'), - $this->group->nickname); + $this->group->getBestName()); } else { - // @todo FIXME: use group full name here if available instead of (uglier) primary alias. // TRANS: Notice on group pages for anonymous users for StatusNet sites that accept no new registrations. - // TRANS: **%s** is the group alias, %%%%site.name%%%% is the site name, + // TRANS: %s is the group name, %%%%site.name%%%% is the site name, // TRANS: This message contains Markdown links. Ensure they are formatted correctly: [Description](link). $m = sprintf(_('**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service ' . 'based on the Free Software [StatusNet](http://status.net/) tool. Its members share ' . - 'short messages about their life and interests. '), - $this->group->nickname); + 'short messages about their life and interests.'), + $this->group->getBestName()); } $this->elementStart('div', array('id' => 'anon_notice')); $this->raw(common_markup_to_html($m)); $this->elementEnd('div'); } - function noticeFormOptions() + function extraHead() { - $options = parent::noticeFormOptions(); - $cur = common_current_user(); - - if (!empty($cur) && $cur->isMember($this->group)) { - $options['to_group'] = $this->group; + if ($this->page != 1) { + $this->element('link', array('rel' => 'canonical', + 'href' => $this->group->homeUrl())); } - - return $options; } } - -class GroupAdminSection extends ProfileSection -{ - var $group; - - function __construct($out, $group) - { - parent::__construct($out); - $this->group = $group; - } - - function getProfiles() - { - return $this->group->getAdmins(); - } - - function title() - { - // TRANS: Title for list of group administrators on a group page. - return _m('TITLE','Admins'); - } - - function divId() - { - return 'group_admins'; - } - - function moreUrl() - { - return null; - } -} - -class GroupMembersMiniList extends ProfileMiniList -{ - function newListItem($profile) - { - return new GroupMembersMiniListItem($profile, $this->action); - } -} - -class GroupMembersMiniListItem extends ProfileMiniListItem -{ - function linkAttributes() - { - $aAttrs = parent::linkAttributes(); - - if (common_config('nofollow', 'members')) { - $aAttrs['rel'] .= ' nofollow'; - } - - return $aAttrs; - } -} - -class ThreadingGroupNoticeStream extends ThreadingNoticeStream -{ - function __construct($group, $profile) - { - parent::__construct(new GroupNoticeStream($group, $profile)); - } -} \ No newline at end of file diff --git a/actions/shownotice.php b/actions/shownotice.php index ea9041efb5..6055184fcd 100644 --- a/actions/shownotice.php +++ b/actions/shownotice.php @@ -22,7 +22,7 @@ * @category Personal * @package StatusNet * @author Evan Prodromou - * @copyright 2008-2009 StatusNet, Inc. + * @copyright 2008-2011 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ @@ -44,7 +44,7 @@ require_once INSTALLDIR.'/lib/feedlist.php'; * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class ShownoticeAction extends OwnerDesignAction +class ShownoticeAction extends Action { /** * Notice object to show @@ -214,7 +214,7 @@ class ShownoticeAction extends OwnerDesignAction if ($this->boolean('ajax')) { $this->showAjax(); } else { - if ($this->notice->is_local == Notice::REMOTE_OMB) { + if ($this->notice->is_local == Notice::REMOTE) { if (!empty($this->notice->url)) { $target = $this->notice->url; } else if (!empty($this->notice->uri) && preg_match('/^https?:/', $this->notice->uri)) { diff --git a/actions/showprofiletag.php b/actions/showprofiletag.php index d1b0768d23..ec1837f835 100644 --- a/actions/showprofiletag.php +++ b/actions/showprofiletag.php @@ -44,7 +44,11 @@ class ShowprofiletagAction extends Action { parent::prepare($args); - $tagger_arg = $this->arg('tagger'); + if (common_config('singleuser', 'enabled')) { + $tagger_arg = User::singleUserNickname(); + } else { + $tagger_arg = $this->arg('tagger'); + } $tag_arg = $this->arg('tag'); $tagger = common_canonical_nickname($tagger_arg); $tag = common_canonical_tag($tag_arg); @@ -169,7 +173,18 @@ class ShowprofiletagAction extends Action function getFeeds() { #XXX: make these actually work - return array(new Feed(Feed::RSS2, + return array(new Feed(Feed::JSON, + common_local_url( + 'ApiTimelineList', array( + 'user' => $this->tagger->id, + 'id' => $this->peopletag->id, + 'format' => 'as' + ) + ), + // TRANS: Feed title. + // TRANS: %s is tagger's nickname. + sprintf(_('Feed for friends of %s (Activity Streams JSON)'), $this->tagger->nickname)), + new Feed(Feed::RSS2, common_local_url( 'ApiTimelineList', array( 'user' => $this->tagger->id, @@ -339,17 +354,7 @@ class ShowprofiletagAction extends Action } } - if ($cnt > PROFILES_PER_MINILIST) { - $this->elementStart('p'); - $this->element('a', array('href' => common_local_url('profiletagsubscribers', - array('nickname' => $this->tagger->nickname, - 'profiletag' => $this->peopletag->tag)), - 'class' => 'more'), - // TRANS: Link for more "People following tag x" - // TRANS: if there are more than the mini list's maximum. - _('All subscribers')); - $this->elementEnd('p'); - } + // FIXME: link to full list Event::handle('EndShowProfileTagSubscribersMiniList', array($this)); } diff --git a/actions/showstream.php b/actions/showstream.php index fe819d30cf..9e89b1b48c 100644 --- a/actions/showstream.php +++ b/actions/showstream.php @@ -55,6 +55,25 @@ require_once INSTALLDIR.'/lib/feedlist.php'; */ class ShowstreamAction extends ProfileAction { + var $notice; + + function prepare($args) + { + parent::prepare($args); + + $p = Profile::current(); + + if (empty($this->tag)) { + $stream = new ProfileNoticeStream($this->profile, $p); + } else { + $stream = new TaggedProfileNoticeStream($this->profile, $this->tag, $p); + } + + $this->notice = $stream->getNotices(($this->page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1); + + return true; + } + function isReadOnly($args) { return true; @@ -65,11 +84,11 @@ class ShowstreamAction extends ProfileAction $base = $this->profile->getFancyName(); if (!empty($this->tag)) { if ($this->page == 1) { - // TRANS: Page title showing tagged notices in one user's stream. + // TRANS: Page title showing tagged notices in one user's timeline. // TRANS: %1$s is the username, %2$s is the hash tag. return sprintf(_('Notices by %1$s tagged %2$s'), $base, $this->tag); } else { - // TRANS: Page title showing tagged notices in one user's stream. + // TRANS: Page title showing tagged notices in one user's timeline. // TRANS: %1$s is the username, %2$s is the hash tag, %3$d is the page number. return sprintf(_('Notices by %1$s tagged %2$s, page %3$d'), $base, $this->tag, $this->page); } @@ -77,7 +96,7 @@ class ShowstreamAction extends ProfileAction if ($this->page == 1) { return $base; } else { - // TRANS: Extended page title showing tagged notices in one user's stream. + // TRANS: Extended page title showing tagged notices in one user's timeline. // TRANS: %1$s is the username, %2$d is the page number. return sprintf(_('Notices by %1$s, page %2$d'), $base, @@ -92,9 +111,6 @@ class ShowstreamAction extends ProfileAction // For YADIS discovery, we also have a tag - header('X-XRDS-Location: '. common_local_url('xrds', array('nickname' => - $this->user->nickname))); - $this->showPage(); } @@ -127,7 +143,16 @@ class ShowstreamAction extends ProfileAction $this->user->nickname, $this->tag))); } - return array(new Feed(Feed::RSS1, + return array(new Feed(Feed::JSON, + common_local_url('ApiTimelineUser', + array( + 'id' => $this->user->id, + 'format' => 'as')), + // TRANS: Title for link to notice feed. + // TRANS: %s is a user nickname. + sprintf(_('Notice feed for %s (Activity Streams JSON)'), + $this->user->nickname)), + new Feed(Feed::RSS1, common_local_url('userrss', array('nickname' => $this->user->nickname)), // TRANS: Title for link to notice feed. @@ -162,11 +187,6 @@ class ShowstreamAction extends ProfileAction function extraHead() { - // for remote subscriptions etc. - $this->element('meta', array('http-equiv' => 'X-XRDS-Location', - 'content' => common_local_url('xrds', array('nickname' => - $this->user->nickname)))); - if ($this->profile->bio) { $this->element('meta', array('name' => 'description', 'content' => $this->profile->bio)); @@ -192,11 +212,16 @@ class ShowstreamAction extends ProfileAction $this->element('link', array('rel' => 'EditURI', 'type' => 'application/rsd+xml', 'href' => $rsd)); + + if ($this->page != 1) { + $this->element('link', array('rel' => 'canonical', + 'href' => $this->profile->profileurl)); + } } function showEmptyListMessage() { - // TRANS: First sentence of empty list message for a stream. $1%s is a user nickname. + // TRANS: First sentence of empty list message for a timeline. $1%s is a user nickname. $message = sprintf(_('This is the timeline for %1$s, but %1$s hasn\'t posted anything yet.'), $this->user->nickname) . ' '; if (common_logged_in()) { @@ -205,7 +230,7 @@ class ShowstreamAction extends ProfileAction // TRANS: Second sentence of empty list message for a stream for the user themselves. $message .= _('Seen anything interesting recently? You haven\'t posted any notices yet, now would be a good time to start :)'); } else { - // TRANS: Second sentence of empty list message for a non-self stream. %1$s is a user nickname, %2$s is a part of a URL. + // TRANS: Second sentence of empty list message for a non-self timeline. %1$s is a user nickname, %2$s is a part of a URL. // TRANS: This message contains a Markdown link. Keep "](" together. $message .= sprintf(_('You can try to nudge %1$s or [post something to them](%%%%action.newnotice%%%%?status_textarea=%2$s).'), $this->user->nickname, '@' . $this->user->nickname); } @@ -223,13 +248,9 @@ class ShowstreamAction extends ProfileAction function showNotices() { - $notice = empty($this->tag) - ? $this->user->getNotices(($this->page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1) - : $this->user->getTaggedNotices($this->tag, ($this->page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1, 0, 0, null); - $pnl = null; - if (Event::handle('ShowStreamNoticeList', array($notice, $this, &$pnl))) { - $pnl = new ProfileNoticeList($notice, $this); + if (Event::handle('ShowStreamNoticeList', array($this->notice, $this, &$pnl))) { + $pnl = new ProfileNoticeList($this->notice, $this); } $cnt = $pnl->show(); if (0 == $cnt) { @@ -248,17 +269,17 @@ class ShowstreamAction extends ProfileAction function showAnonymousMessage() { if (!(common_config('site','closed') || common_config('site','inviteonly'))) { - // TRANS: Announcement for anonymous users showing a stream if site registrations are open. + // TRANS: Announcement for anonymous users showing a timeline if site registrations are open. // TRANS: This message contains a Markdown link. Keep "](" together. $m = sprintf(_('**%s** has an account on %%%%site.name%%%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service ' . 'based on the Free Software [StatusNet](http://status.net/) tool. ' . '[Join now](%%%%action.register%%%%) to follow **%s**\'s notices and many more! ([Read more](%%%%doc.help%%%%))'), $this->user->nickname, $this->user->nickname); } else { - // TRANS: Announcement for anonymous users showing a stream if site registrations are closed or invite only. + // TRANS: Announcement for anonymous users showing a timeline if site registrations are closed or invite only. // TRANS: This message contains a Markdown link. Keep "](" together. $m = sprintf(_('**%s** has an account on %%%%site.name%%%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service ' . - 'based on the Free Software [StatusNet](http://status.net/) tool. '), + 'based on the Free Software [StatusNet](http://status.net/) tool.'), $this->user->nickname, $this->user->nickname); } $this->elementStart('div', array('id' => 'anon_notice')); @@ -269,8 +290,10 @@ class ShowstreamAction extends ProfileAction function showSections() { parent::showSections(); - $cloud = new PersonalTagCloudSection($this, $this->user); - $cloud->show(); + if (!common_config('performance', 'high')) { + $cloud = new PersonalTagCloudSection($this, $this->user); + $cloud->show(); + } } function noticeFormOptions() diff --git a/actions/siteadminpanel.php b/actions/siteadminpanel.php index 29813ca3b9..bc96a6d73e 100644 --- a/actions/siteadminpanel.php +++ b/actions/siteadminpanel.php @@ -24,7 +24,7 @@ * @author Evan Prodromou * @author Zach Copley * @author Sarven Capadisli - * @copyright 2008-2010 StatusNet, Inc. + * @copyright 2008-2011 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ @@ -88,9 +88,19 @@ class SiteadminpanelAction extends AdminPanelAction function saveSettings() { static $settings = array( - 'site' => array('name', 'broughtby', 'broughtbyurl', - 'email', 'timezone', 'language', - 'site', 'textlimit', 'dupelimit'), + 'site' => array( + 'name', + 'broughtby', + 'broughtbyurl', + 'email', + 'timezone', + 'language', + 'site', + 'textlimit', + 'dupelimit', + 'logo', + 'ssllogo' + ) ); $values = array(); @@ -144,6 +154,19 @@ class SiteadminpanelAction extends AdminPanelAction $this->clientError(_('Not a valid email address.')); } + // Validate logos + if (!empty($values['site']['logo']) && + !Validate::uri($values['site']['logo'], array('allowed_schemes' => array('http', 'https')))) { + // TRANS: Client error displayed when a logo URL is not valid. + $this->clientError(_('Invalid logo URL.')); + } + + if (!empty($values['site']['ssllogo']) && + !Validate::uri($values['site']['ssllogo'], array('allowed_schemes' => array('https')))) { + // TRANS: Client error displayed when a SSL logo URL is invalid. + $this->clientError(_('Invalid SSL logo URL.')); + } + // Validate timezone if (is_null($values['site']['timezone']) || @@ -173,7 +196,7 @@ class SiteadminpanelAction extends AdminPanelAction if (!Validate::number($values['site']['dupelimit'], array('min' => 1))) { // TRANS: Client error displayed trying to save site settings with a text limit below 1. - $this->clientError(_("Dupe limit must be one or more seconds.")); + $this->clientError(_('Dupe limit must be one or more seconds.')); } } } @@ -251,6 +274,8 @@ class SiteAdminPanelForm extends AdminForm $this->out->elementEnd('ul'); $this->out->elementEnd('fieldset'); + $this->showLogo(); + $this->out->elementStart('fieldset', array('id' => 'settings_admin_local')); // TRANS: Fieldset legend on site settings panel. $this->out->element('legend', null, _m('LEGEND','Local')); @@ -277,7 +302,7 @@ class SiteAdminPanelForm extends AdminForm _('Default language'), get_nice_language_list(), // TRANS: Dropdown title on site settings panel. - _('Site language when autodetection from browser settings is not available'), + _('The site language when autodetection from browser settings is not available.'), false, $this->value('language')); $this->unli(); @@ -307,6 +332,35 @@ class SiteAdminPanelForm extends AdminForm $this->out->elementEnd('fieldset'); } + function showLogo() + { + $this->out->elementStart('fieldset', array('id' => 'settings_site_logo')); + // TRANS: Fieldset legend for form to change logo. + $this->out->element('legend', null, _('Logo')); + + $this->out->elementStart('ul', 'form_data'); + + $this->li(); + $this->input('logo', + // TRANS: Field label for StatusNet site logo. + _('Site logo'), + // TRANS: Title for field label for StatusNet site logo. + 'Logo for the site (full URL).'); + $this->unli(); + + $this->li(); + $this->input('ssllogo', + // TRANS: Field label for SSL StatusNet site logo. + _('SSL logo'), + // TRANS: Title for field label for SSL StatusNet site logo. + 'Logo to show on SSL pages (full URL).'); + $this->unli(); + + $this->out->elementEnd('ul'); + + $this->out->elementEnd('fieldset'); + } + /** * Action elements * @@ -320,6 +374,6 @@ class SiteAdminPanelForm extends AdminForm 'submit', null, // TRANS: Button title for saving site settings. - _('Save site settings')); + _('Save the site settings.')); } } diff --git a/actions/sitenoticeadminpanel.php b/actions/sitenoticeadminpanel.php index b1ac441af7..145ae80d07 100644 --- a/actions/sitenoticeadminpanel.php +++ b/actions/sitenoticeadminpanel.php @@ -197,7 +197,7 @@ class SiteNoticeAdminPanelForm extends AdminForm _m('BUTTON','Save'), 'submit', null, - // TRANS: Title for button to save site notice in admin panel. + // TRANS: Button title to save site notice in admin panel. _('Save site notice.') ); } diff --git a/actions/snapshotadminpanel.php b/actions/snapshotadminpanel.php index 9790947071..751b1acd1e 100644 --- a/actions/snapshotadminpanel.php +++ b/actions/snapshotadminpanel.php @@ -252,7 +252,7 @@ class SnapshotAdminPanelForm extends AdminForm _m('BUTTON','Save'), 'submit', null, - // TRANS: Title for button to save snapshot settings. + // TRANS: Button title to save snapshot settings. _('Save snapshot settings.') ); } diff --git a/actions/subscribe.php b/actions/subscribe.php index b8c1cdd8f7..ce1d367cf8 100644 --- a/actions/subscribe.php +++ b/actions/subscribe.php @@ -1,7 +1,7 @@ clientError(_('You cannot subscribe to an OMB 0.1'. - ' remote profile with this action.')); - return false; - } - return true; } diff --git a/actions/subscriptions.php b/actions/subscriptions.php index b4575565b9..e4cb123912 100644 --- a/actions/subscriptions.php +++ b/actions/subscriptions.php @@ -132,9 +132,7 @@ class SubscriptionsAction extends GalleryAction // TRANS: and do not change the URL part. $message = _('You\'re not listening to anyone\'s notices right now, try subscribing to people you know. '. 'Try [people search](%%action.peoplesearch%%), look for members in groups you\'re interested '. - 'in and in our [featured users](%%action.featured%%). '. - 'If you\'re a [Twitter user](%%action.twittersettings%%), you can automatically subscribe to '. - 'people you already follow there.'); + 'in and in our [featured users](%%action.featured%%).'); } else { // TRANS: Subscription list text when looking at the subscriptions for a of a user other // TRANS: than the logged in user that has no subscriptions. %s is the user nickname. diff --git a/actions/tag.php b/actions/tag.php index f3514bef55..e0cb9783d1 100644 --- a/actions/tag.php +++ b/actions/tag.php @@ -23,6 +23,8 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } class TagAction extends Action { var $notice; + var $tag; + var $page; function prepare($args) { @@ -79,7 +81,15 @@ class TagAction extends Action function getFeeds() { - return array(new Feed(Feed::RSS1, + return array(new Feed(Feed::JSON, + common_local_url('ApiTimelineTag', + array('format' => 'as', + 'tag' => $this->tag)), + // TRANS: Link label for feed on "notices with tag" page. + // TRANS: %s is the tag the feed is for. + sprintf(_('Notice feed for tag %s (Activity Streams JSON)'), + $this->tag)), + new Feed(Feed::RSS1, common_local_url('tagrss', array('tag' => $this->tag)), // TRANS: Link label for feed on "notices with tag" page. diff --git a/actions/top.php b/actions/top.php new file mode 100644 index 0000000000..39abe3df26 --- /dev/null +++ b/actions/top.php @@ -0,0 +1,86 @@ +. + * + * @category Top + * @package StatusNet + * @author Evan Prodromou + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + // This check helps protect against security problems; + // your code file can't be executed directly from the web. + exit(1); +} + +/** + * An action to redirect to the top of the site + * + * @category Action + * @package StatusNet + * @author Evan Prodromou + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +class TopAction extends Action +{ + /** + * For initializing members of the class. + * + * @param array $argarray misc. arguments + * + * @return boolean true + */ + + function prepare($argarray) + { + parent::prepare($argarray); + return true; + } + + /** + * Handler method + * + * @param array $argarray is ignored since it's now passed in in prepare() + * + * @return void + */ + + function handle($argarray=null) + { + if (common_config('singleuser', 'enabled')) { + $url = common_local_url('showstream', array('nickname' => User::singleUserNickname())); + } else { + $url = common_local_url('public'); + } + + // XXX: Permanent? I think so. + + common_redirect($url, 301); + + return; + } +} diff --git a/actions/useradminpanel.php b/actions/useradminpanel.php index 19673189f5..1eda1c0c82 100644 --- a/actions/useradminpanel.php +++ b/actions/useradminpanel.php @@ -300,7 +300,7 @@ class UserAdminPanelForm extends AdminForm _m('BUTTON','Save'), 'submit', null, - // TRANS: Title for button to save user settings in user admin panel. + // TRANS: Button title to save user settings in user admin panel. _('Save user settings.')); } } diff --git a/actions/userdesignsettings.php b/actions/userdesignsettings.php deleted file mode 100644 index c83815412a..0000000000 --- a/actions/userdesignsettings.php +++ /dev/null @@ -1,365 +0,0 @@ -. - * - * @category Settings - * @package StatusNet - * @author Sarven Capadisli - * @author Zach Copley - * @copyright 2008-2009 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} - -require_once INSTALLDIR . '/lib/designsettings.php'; - -/** - * Set a user's design - * - * Saves a design for a given user - * - * @category Settings - * @package StatusNet - * @author Zach Copley - * @author Sarven Capadisli - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ -class UserDesignSettingsAction extends DesignSettingsAction -{ - /** - * Sets the right action for the form, and passes request args into - * the base action - * - * @param array $args misc. arguments - * - * @return boolean true - */ - - function prepare($args) - { - parent::prepare($args); - $this->submitaction = common_local_url('userdesignsettings'); - return true; - } - - /** - * Title of the page - * - * @return string Title of the page - */ - function title() - { - // TRANS: Title for profile design page. - return _('Profile design'); - } - - /** - * Instructions for use - * - * @return instructions for use - */ - function getInstructions() - { - // TRANS: Instructions for Profile design page. - return _('Customize the way your profile looks ' . - 'with a background image and a colour palette of your choice.'); - } - - /** - * Get the design we want to edit - * - * @return Design - */ - function getWorkingDesign() - { - $user = common_current_user(); - $design = $user->getDesign(); - return $design; - } - - /** - * Content area of the page - * - * Shows a form for changing the design - * - * @return void - */ - function showContent() - { - $design = $this->getWorkingDesign(); - - if (empty($design)) { - $design = Design::siteDesign(); - } - - $this->showDesignForm($design); - } - - /** - * Shows the design settings form - * - * @param Design $design a working design to show - * - * @return nothing - */ - - function showDesignForm($design) - { - $form = new UserDesignForm($this, $design, $this->submitaction); - $form->show(); - } - - /** - * Save or update the user's design settings - * - * @return void - */ - function saveDesign() - { - $this->saveDesignPreferences(); - - foreach ($this->args as $key => $val) { - if (preg_match('/(#ho|ho)Td.*g/i', $val)) { - $this->sethd(); - return; - } - } - - try { - $bgcolor = new WebColor($this->trimmed('design_background')); - $ccolor = new WebColor($this->trimmed('design_content')); - $sbcolor = new WebColor($this->trimmed('design_sidebar')); - $tcolor = new WebColor($this->trimmed('design_text')); - $lcolor = new WebColor($this->trimmed('design_links')); - } catch (WebColorException $e) { - $this->showForm($e->getMessage()); - return; - } - - $onoff = $this->arg('design_background-image_onoff'); - - $on = false; - $off = false; - $tile = false; - - if ($onoff == 'on') { - $on = true; - } else { - $off = true; - } - - $repeat = $this->boolean('design_background-image_repeat'); - - if ($repeat) { - $tile = true; - } - - $user = common_current_user(); - - $design = $user->getDesign(); - - if (!empty($design)) { - $original = clone($design); - - $design->backgroundcolor = $bgcolor->intValue(); - $design->contentcolor = $ccolor->intValue(); - $design->sidebarcolor = $sbcolor->intValue(); - $design->textcolor = $tcolor->intValue(); - $design->linkcolor = $lcolor->intValue(); - - $design->setDisposition($on, $off, $tile); - - $result = $design->update($original); - - if ($result === false) { - common_log_db_error($design, 'UPDATE', __FILE__); - // TRANS: Form validation error on Profile design page when updating design settings has failed. - $this->showForm(_('Could not update your design.')); - return; - } - // update design - } else { - $user->query('BEGIN'); - - // save new design - $design = new Design(); - - $design->backgroundcolor = $bgcolor->intValue(); - $design->contentcolor = $ccolor->intValue(); - $design->sidebarcolor = $sbcolor->intValue(); - $design->textcolor = $tcolor->intValue(); - $design->linkcolor = $lcolor->intValue(); - - $design->setDisposition($on, $off, $tile); - - $id = $design->insert(); - - if (empty($id)) { - common_log_db_error($id, 'INSERT', __FILE__); - // TRANS: Form validation error on Profile design page when saving design settings has failed. - $this->showForm(_('Unable to save your design settings.')); - return; - } - - $original = clone($user); - $user->design_id = $id; - $result = $user->update($original); - - if (empty($result)) { - common_log_db_error($original, 'UPDATE', __FILE__); - // TRANS: Form validation error on Profile design page when saving design settings has failed. - $this->showForm(_('Unable to save your design settings.')); - $user->query('ROLLBACK'); - return; - } - - $user->query('COMMIT'); - - } - - $this->saveBackgroundImage($design); - - // TRANS: Confirmation message on Profile design page when saving design settings has succeeded. - $this->showForm(_('Design preferences saved.'), true); - } - - /** - * Alternate default colors - * - * @return nothing - */ - function sethd() - { - $user = common_current_user(); - $design = $user->getDesign(); - - $user->query('BEGIN'); - - // alternate colors - $design = new Design(); - - $design->backgroundcolor = 16184329; - $design->contentcolor = 16059904; - $design->sidebarcolor = 16059904; - $design->textcolor = 0; - $design->linkcolor = 16777215; - - $design->setDisposition(false, true, false); - - $id = $design->insert(); - - if (empty($id)) { - common_log_db_error($id, 'INSERT', __FILE__); - // TRANS: Form validation error on Profile design page when saving design settings has failed. - $this->showForm(_('Unable to save your design settings.')); - return; - } - - $original = clone($user); - $user->design_id = $id; - $result = $user->update($original); - - if (empty($result)) { - common_log_db_error($original, 'UPDATE', __FILE__); - // TRANS: Form validation error on Profile design page when updating design settings has failed. - $this->showForm(_('Unable to save your design settings.')); - $user->query('ROLLBACK'); - return; - } - - $user->query('COMMIT'); - - $this->saveBackgroundImage($design); - - // TRANS: Succes message on Profile design page when finding an easter egg. - $this->showForm(_('Enjoy your hotdog!'), true); - } - - function saveDesignPreferences() - { - $viewdesigns = $this->boolean('viewdesigns'); - - $user = common_current_user(); - - $original = clone($user); - - $user->viewdesigns = $viewdesigns; - - $result = $user->update($original); - - if ($result === false) { - common_log_db_error($user, 'UPDATE', __FILE__); - // TRANS: Server exception thrown on Profile design page when updating design settings fails. - throw new ServerException(_('Could not update user.')); - } - } -} - -class UserDesignForm extends DesignForm -{ - function __construct($out, $design, $actionurl) - { - parent::__construct($out, $design, $actionurl); - } - - /** - * Legend of the Form - * - * @return void - */ - function formLegend() - { - // TRANS: Form legend on Profile design page. - $this->out->element('legend', null, _('Design settings')); - } - - /** - * Data elements of the form - * - * @return void - */ - - function formData() - { - $user = common_current_user(); - - $this->out->elementStart('ul', 'form_data'); - $this->out->elementStart('li'); - // TRANS: Checkbox label on Profile design page. - $this->out->checkbox('viewdesigns', _('View profile designs'), - // TRANS: Title for checkbox on Profile design page. - - $user->viewdesigns, _('Show or hide profile designs.')); - $this->out->elementEnd('li'); - $this->out->elementEnd('ul'); - - $this->out->elementEnd('fieldset'); - - $this->out->elementStart('fieldset'); - // TRANS: Form legend on Profile design page for form to choose a background image. - $this->out->element('legend', null, _('Background file')); - - parent::formData(); - } -} diff --git a/actions/usergroups.php b/actions/usergroups.php index 178a3586fd..9d5946b484 100644 --- a/actions/usergroups.php +++ b/actions/usergroups.php @@ -104,7 +104,7 @@ class UsergroupsAction extends ProfileAction return false; } - $this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1; + $this->page = $this->trimmed('page', 1); return true; } diff --git a/actions/userrss.php b/actions/userrss.php index 85ea2fd7fa..99330af57f 100644 --- a/actions/userrss.php +++ b/actions/userrss.php @@ -29,8 +29,6 @@ class UserrssAction extends Rss10Action function prepare($args) { - common_debug("UserrssAction"); - parent::prepare($args); $nickname = $this->trimmed('nickname'); $this->user = User::staticGet('nickname', $nickname); diff --git a/actions/userxrd.php b/actions/userxrd.php index 1d888064d6..6fa738a5c9 100644 --- a/actions/userxrd.php +++ b/actions/userxrd.php @@ -30,6 +30,7 @@ class UserxrdAction extends XrdAction function prepare($args) { parent::prepare($args); + global $config; $this->uri = $this->trimmed('uri'); $this->uri = self::normalize($this->uri); diff --git a/actions/version.php b/actions/version.php index 37555652c7..0461aade5c 100644 --- a/actions/version.php +++ b/actions/version.php @@ -1,7 +1,7 @@ * @author Craig Andrews - * @copyright 2009 Free Software Foundation, Inc http://www.fsf.org + * @copyright 2009-2011 Free Software Foundation, Inc http://www.fsf.org * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3 * @link http://status.net/ */ @@ -149,7 +149,7 @@ class VersionAction extends Action // TRANS: Content part of StatusNet version page. // TRANS: %1$s is the engine name (StatusNet) and %2$s is the StatusNet version. $this->raw(sprintf(_('This site is powered by %1$s version %2$s, '. - 'Copyright 2008-2010 StatusNet, Inc. '. + 'Copyright 2008-2011 StatusNet, Inc. '. 'and contributors.'), XMLStringer::estring('a', array('href' => 'http://status.net/'), // TRANS: Engine name. @@ -160,6 +160,7 @@ class VersionAction extends Action // TRANS: Header for StatusNet contributors section on the version page. $this->element('h2', null, _('Contributors')); + sort($this->contributors); $this->element('p', null, implode(', ', $this->contributors)); // TRANS: Header for StatusNet license section on the version page. @@ -170,14 +171,14 @@ class VersionAction extends Action _('StatusNet is free software: you can redistribute it and/or modify '. 'it under the terms of the GNU Affero General Public License as published by '. 'the Free Software Foundation, either version 3 of the License, or '. - '(at your option) any later version. ')); + '(at your option) any later version.')); $this->element('p', null, // TRANS: Content part of StatusNet version page. _('This program is distributed in the hope that it will be useful, '. 'but WITHOUT ANY WARRANTY; without even the implied warranty of '. 'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the '. - 'GNU Affero General Public License for more details. ')); + 'GNU Affero General Public License for more details.')); $this->elementStart('p'); // TRANS: Content part of StatusNet version page. @@ -277,6 +278,7 @@ class VersionAction extends Action 'mEDI', 'Brett Taylor', 'Brigitte Schuster', - 'Brion Vibber', - 'Siebrand Mazeland'); + 'Brion Vibber (StatusNet)', + 'Siebrand Mazeland', + 'Samantha Doherty (StatusNet)'); } diff --git a/classes/Avatar.php b/classes/Avatar.php index 0b5141ba53..d871d360b6 100644 --- a/classes/Avatar.php +++ b/classes/Avatar.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Avatar extends Memcached_DataObject +class Avatar extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -27,6 +27,37 @@ class Avatar extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + static function pivotGet($keyCol, $keyVals, $otherCols) + { + return Memcached_DataObject::pivotGet('Avatar', $keyCol, $keyVals, $otherCols); + } + + public static function schemaDef() + { + return array( + 'fields' => array( + 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to profile table'), + 'original' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'uploaded by user or generated?'), + 'width' => array('type' => 'int', 'not null' => true, 'description' => 'image width'), + 'height' => array('type' => 'int', 'not null' => true, 'description' => 'image height'), + 'mediatype' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'file type'), + 'filename' => array('type' => 'varchar', 'length' => 255, 'description' => 'local filename, if local'), + 'url' => array('type' => 'varchar', 'length' => 255, 'description' => 'avatar location'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('profile_id', 'width', 'height'), + 'unique keys' => array( + 'avatar_url_key' => array('url'), + ), + 'foreign keys' => array( + 'avatar_profile_id_fkey' => array('profile', array('profile_id' => 'id')), + ), + 'indexes' => array( + 'avatar_profile_id_idx' => array('profile_id'), + ), + ); + } // We clean up the file, too function delete() diff --git a/classes/Config.php b/classes/Config.php index e14730438e..bd191486cb 100644 --- a/classes/Config.php +++ b/classes/Config.php @@ -27,7 +27,7 @@ if (!defined('STATUSNET')) { require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Config extends Memcached_DataObject +class Config extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -43,13 +43,29 @@ class Config extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + public static function schemaDef() + { + return array( + 'fields' => array( + 'section' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'default' => '', 'description' => 'configuration section'), + 'setting' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'default' => '', 'description' => 'configuration setting'), + 'value' => array('type' => 'varchar', 'length' => 255, 'description' => 'configuration value'), + ), + 'primary key' => array('section', 'setting'), + ); + } + const settingsKey = 'config:settings'; static function loadSettings() { - $settings = self::_getSettings(); - if (!empty($settings)) { - self::_applySettings($settings); + try { + $settings = self::_getSettings(); + if (!empty($settings)) { + self::_applySettings($settings); + } + } catch (Exception $e) { + return; } } diff --git a/classes/Confirm_address.php b/classes/Confirm_address.php index 4b9bec64c6..056df836fc 100644 --- a/classes/Confirm_address.php +++ b/classes/Confirm_address.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Confirm_address extends Memcached_DataObject +class Confirm_address extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -26,8 +26,25 @@ class Confirm_address extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE - function sequenceKey() - { return array(false, false); } + public static function schemaDef() + { + return array( + 'fields' => array( + 'code' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'good random code'), + 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user who requested confirmation'), + 'address' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'address (email, xmpp, SMS, etc.)'), + 'address_extra' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'carrier ID, for SMS'), + 'address_type' => array('type' => 'varchar', 'length' => 8, 'not null' => true, 'description' => 'address type ("email", "xmpp", "sms")'), + 'claimed' => array('type' => 'datetime', 'description' => 'date this was claimed for queueing'), + 'sent' => array('type' => 'datetime', 'description' => 'date this was sent for queueing'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('code'), + 'foreign keys' => array( + 'confirm_address_user_id_fkey' => array('user', array('user_id' => 'id')), + ), + ); + } static function getAddress($address, $addressType) { diff --git a/classes/Consumer.php b/classes/Consumer.php index c1090b85a3..1d32d853bd 100644 --- a/classes/Consumer.php +++ b/classes/Consumer.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Consumer extends Memcached_DataObject +class Consumer extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -23,6 +23,22 @@ class Consumer extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + public static function schemaDef() + { + return array( + 'description' => 'OAuth consumer record', + 'fields' => array( + 'consumer_key' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'unique identifier, root URL'), + 'consumer_secret' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'secret value'), + 'seed' => array('type' => 'char', 'length' => 32, 'not null' => true, 'description' => 'seed for new tokens by this consumer'), + + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('consumer_key'), + ); + } + static function generateNew() { $cons = new Consumer(); diff --git a/classes/Conversation.php b/classes/Conversation.php index e029c20ba0..4bad474c73 100755 --- a/classes/Conversation.php +++ b/classes/Conversation.php @@ -29,7 +29,7 @@ require_once INSTALLDIR . '/classes/Memcached_DataObject.php'; -class Conversation extends Memcached_DataObject +class Conversation extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -46,6 +46,22 @@ class Conversation extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + public static function schemaDef() + { + return array( + 'fields' => array( + 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'unique identifier'), + 'uri' => array('type' => 'varchar', 'length' => 225, 'description' => 'URI of the conversation'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('id'), + 'unique keys' => array( + 'conversation_uri_key' => array('uri'), + ), + ); + } + /** * Factory method for creating a new conversation * diff --git a/classes/Deleted_notice.php b/classes/Deleted_notice.php index 64dc85da65..d3f9c0bf7c 100644 --- a/classes/Deleted_notice.php +++ b/classes/Deleted_notice.php @@ -26,7 +26,7 @@ if (!defined('STATUSNET')) { */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Deleted_notice extends Memcached_DataObject +class Deleted_notice extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -43,4 +43,24 @@ class Deleted_notice extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + + public static function schemaDef() + { + return array( + 'fields' => array( + 'id' => array('type' => 'int', 'not null' => true, 'description' => 'identity of notice'), + 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'author of the notice'), + 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier, usually a tag URI'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date the notice record was created'), + 'deleted' => array('type' => 'datetime', 'not null' => true, 'description' => 'date the notice record was created'), + ), + 'primary key' => array('id'), + 'unique keys' => array( + 'deleted_notice_uri_key' => array('uri'), + ), + 'indexes' => array( + 'deleted_notice_profile_id_idx' => array('profile_id'), + ), + ); + } } diff --git a/classes/Design.php b/classes/Design.php deleted file mode 100644 index f4834c714e..0000000000 --- a/classes/Design.php +++ /dev/null @@ -1,243 +0,0 @@ -. - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} - -define('BACKGROUND_ON', 1); -define('BACKGROUND_OFF', 2); -define('BACKGROUND_TILE', 4); - -/** - * Table Definition for design - */ - -require_once INSTALLDIR . '/classes/Memcached_DataObject.php'; -require_once INSTALLDIR . '/lib/webcolor.php'; - -class Design extends Memcached_DataObject -{ - ###START_AUTOCODE - /* the code below is auto generated do not remove the above tag */ - - public $__table = 'design'; // table name - public $id; // int(4) primary_key not_null - public $backgroundcolor; // int(4) - public $contentcolor; // int(4) - public $sidebarcolor; // int(4) - public $textcolor; // int(4) - public $linkcolor; // int(4) - public $backgroundimage; // varchar(255) - public $disposition; // tinyint(1) default_1 - - /* Static get */ - function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Design',$k,$v); } - - /* the code above is auto generated do not remove the tag below */ - ###END_AUTOCODE - - function showCSS($out) - { - $css = ''; - - $bgcolor = Design::toWebColor($this->backgroundcolor); - - if (!empty($bgcolor)) { - $css .= 'body { background-color: #' . $bgcolor->hexValue() . ' }' . "\n"; - } - - $ccolor = Design::toWebColor($this->contentcolor); - - if (!empty($ccolor)) { - $css .= '#content, #site_nav_local_views .current a { background-color: #'; - $css .= $ccolor->hexValue() . '} '."\n"; - } - - $sbcolor = Design::toWebColor($this->sidebarcolor); - - if (!empty($sbcolor)) { - $css .= '#aside_primary { background-color: #'. $sbcolor->hexValue() . ' }' . "\n"; - } - - $tcolor = Design::toWebColor($this->textcolor); - - if (!empty($tcolor)) { - $css .= 'html body { color: #'. $tcolor->hexValue() . ' }'. "\n"; - } - - $lcolor = Design::toWebColor($this->linkcolor); - - if (!empty($lcolor)) { - $css .= 'a { color: #' . $lcolor->hexValue() . ' }' . "\n"; - } - - if (!empty($this->backgroundimage) && - $this->disposition & BACKGROUND_ON) { - - $repeat = ($this->disposition & BACKGROUND_TILE) ? - 'background-repeat:repeat;' : - 'background-repeat:no-repeat;'; - - $css .= 'body { background-image:url(' . - Design::url($this->backgroundimage) . - '); ' . $repeat . ' background-attachment:fixed; }' . "\n"; - } - - if (0 != mb_strlen($css)) { - $out->style($css); - } - } - - static function toWebColor($color) - { - if ($color === null || $color === '') { - return null; - } - - try { - return new WebColor($color); - } catch (WebColorException $e) { - // This shouldn't happen - common_log(LOG_ERR, "Unable to create web color for $color", - __FILE__); - return null; - } - } - - static function filename($id, $extension, $extra=null) - { - return $id . (($extra) ? ('-' . $extra) : '') . $extension; - } - - static function path($filename) - { - $dir = common_config('background', 'dir'); - - if ($dir[strlen($dir)-1] != '/') { - $dir .= '/'; - } - - return $dir . $filename; - } - - static function url($filename) - { - if (StatusNet::isHTTPS()) { - - $sslserver = common_config('background', 'sslserver'); - - if (empty($sslserver)) { - // XXX: this assumes that background dir == site dir + /background/ - // not true if there's another server - if (is_string(common_config('site', 'sslserver')) && - mb_strlen(common_config('site', 'sslserver')) > 0) { - $server = common_config('site', 'sslserver'); - } else if (common_config('site', 'server')) { - $server = common_config('site', 'server'); - } - $path = common_config('site', 'path') . '/background/'; - } else { - $server = $sslserver; - $path = common_config('background', 'sslpath'); - if (empty($path)) { - $path = common_config('background', 'path'); - } - } - - $protocol = 'https'; - - } else { - - $path = common_config('background', 'path'); - - $server = common_config('background', 'server'); - - if (empty($server)) { - $server = common_config('site', 'server'); - } - - $protocol = 'http'; - } - - if ($path[strlen($path)-1] != '/') { - $path .= '/'; - } - - if ($path[0] != '/') { - $path = '/'.$path; - } - - return $protocol.'://'.$server.$path.$filename; - } - - function setDisposition($on, $off, $tile) - { - if ($on) { - $this->disposition |= BACKGROUND_ON; - } else { - $this->disposition &= ~BACKGROUND_ON; - } - - if ($off) { - $this->disposition |= BACKGROUND_OFF; - } else { - $this->disposition &= ~BACKGROUND_OFF; - } - - if ($tile) { - $this->disposition |= BACKGROUND_TILE; - } else { - $this->disposition &= ~BACKGROUND_TILE; - } - } - - /** - * Return a design object based on the configured site design. - * - * @return Design a singleton design object for the site. - */ - - static function siteDesign() - { - static $siteDesign = null; - - if (empty($siteDesign)) { - - $siteDesign = new Design(); - - $attrs = array('backgroundcolor', - 'contentcolor', - 'sidebarcolor', - 'textcolor', - 'linkcolor', - 'backgroundimage', - 'disposition'); - - foreach ($attrs as $attr) { - $val = common_config('design', $attr); - if ($val !== false) { - $siteDesign->$attr = $val; - } - } - } - - return $siteDesign; - } -} diff --git a/classes/Fave.php b/classes/Fave.php index e8fdbffc71..455e7b089c 100644 --- a/classes/Fave.php +++ b/classes/Fave.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Fave extends Memcached_DataObject +class Fave extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -12,6 +12,7 @@ class Fave extends Memcached_DataObject public $__table = 'fave'; // table name public $notice_id; // int(4) primary_key not_null public $user_id; // int(4) primary_key not_null + public $uri; // varchar(255) public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP /* Static get */ @@ -21,6 +22,31 @@ class Fave extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + public static function schemaDef() + { + return array( + 'fields' => array( + 'notice_id' => array('type' => 'int', 'not null' => true, 'description' => 'notice that is the favorite'), + 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user who likes this notice'), + 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier, usually a tag URI'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('notice_id', 'user_id'), + 'unique keys' => array( + 'fave_uri_key' => array('uri'), + ), + 'foreign keys' => array( + 'fave_notice_id_fkey' => array('notice', array('notice_id' => 'id')), + 'fave_user_id_fkey' => array('profile', array('user_id' => 'id')), // note: formerly referenced notice.id, but we can now record remote users' favorites + ), + 'indexes' => array( + 'fave_notice_id_idx' => array('notice_id'), + 'fave_user_id_idx' => array('user_id', 'modified'), + 'fave_modified_idx' => array('modified'), + ), + ); + } + /** * Save a favorite record. * @fixme post-author notification should be moved here @@ -39,12 +65,16 @@ class Fave extends Memcached_DataObject $fave->user_id = $profile->id; $fave->notice_id = $notice->id; - + $fave->modified = common_sql_now(); + $fave->uri = self::newURI($fave->user_id, + $fave->notice_id, + $fave->modified); if (!$fave->insert()) { common_log_db_error($fave, 'INSERT', __FILE__); return false; } - self::blow('fave:by_notice:%d', $fave->notice_id); + self::blow('fave:list-ids:notice_id:%d', $fave->notice_id); + self::blow('popular'); Event::handle('EndFavorNotice', array($profile, $notice)); } @@ -62,7 +92,8 @@ class Fave extends Memcached_DataObject if (Event::handle('StartDisfavorNotice', array($profile, $notice, &$result))) { $result = parent::delete(); - self::blow('fave:by_notice:%d', $this->notice_id); + self::blow('fave:list-ids:notice_id:%d', $this->notice_id); + self::blow('popular'); if ($result) { Event::handle('EndDisfavorNotice', array($profile, $notice)); @@ -93,19 +124,25 @@ class Fave extends Memcached_DataObject function asActivity() { - $notice = Notice::staticGet('id', $this->notice_id); + $notice = Notice::staticGet('id', $this->notice_id); + + if (!$notice) { + throw new Exception("Fave for non-existent notice: " . $this->notice_id); + } + $profile = Profile::staticGet('id', $this->user_id); + if (!$profile) { + throw new Exception("Fave by non-existent profile: " . $this->user_id); + } + $act = new Activity(); $act->verb = ActivityVerb::FAVORITE; // FIXME: rationalize this with URL below - $act->id = TagURI::mint('favor:%d:%d:%s', - $profile->id, - $notice->id, - common_date_iso8601($this->modified)); + $act->id = $this->getURI(); $act->time = strtotime($this->modified); // TRANS: Activity title when marking a notice as favorite. @@ -157,30 +194,20 @@ class Fave extends Memcached_DataObject return $fav; } - /** - * Grab a list of profile who have favored this notice. - * - * @return ArrayWrapper masquerading as a Fave - */ - static function byNotice($noticeId) + function getURI() { - $c = self::memcache(); - $key = Cache::key('fave:by_notice:' . $noticeId); - - $wrapper = $c->get($key); - if (!$wrapper) { - // @fixme caching & scalability! - $fave = new Fave(); - $fave->notice_id = $noticeId; - $fave->find(); - - $list = array(); - while ($fave->fetch()) { - $list[] = clone($fave); - } - $wrapper = new ArrayWrapper($list); - $c->set($key, $wrapper); + if (!empty($this->uri)) { + return $this->uri; + } else { + return self::newURI($this->user_id, $this->notice_id, $this->modified); } - return $wrapper; + } + + static function newURI($profile_id, $notice_id, $modified) + { + return TagURI::mint('favor:%d:%d:%s', + $profile_id, + $notice_id, + common_date_iso8601($modified)); } } diff --git a/classes/File.php b/classes/File.php index 36ffff585c..f3940346b3 100644 --- a/classes/File.php +++ b/classes/File.php @@ -29,7 +29,7 @@ require_once INSTALLDIR.'/classes/File_to_post.php'; /** * Table Definition for file */ -class File extends Memcached_DataObject +class File extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -51,25 +51,30 @@ class File extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE - function isProtected($url) { - return 'http://www.facebook.com/login.php' === $url; + public static function schemaDef() + { + return array( + 'fields' => array( + 'id' => array('type' => 'serial', 'not null' => true), + 'url' => array('type' => 'varchar', 'length' => 255, 'description' => 'destination URL after following redirections'), + 'mimetype' => array('type' => 'varchar', 'length' => 50, 'description' => 'mime type of resource'), + 'size' => array('type' => 'int', 'description' => 'size of resource when available'), + 'title' => array('type' => 'varchar', 'length' => 255, 'description' => 'title of resource when available'), + 'date' => array('type' => 'int', 'description' => 'date of resource according to http query'), + 'protected' => array('type' => 'int', 'description' => 'true when URL is private (needs login)'), + 'filename' => array('type' => 'varchar', 'length' => 255, 'description' => 'if a local file, name of the file'), + + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('id'), + 'unique keys' => array( + 'file_url_key' => array('url'), + ), + ); } - /** - * Get the attachments for a particlar notice. - * - * @param int $post_id - * @return array of File objects - */ - static function getAttachments($post_id) { - $file = new File(); - $query = "select file.* from file join file_to_post on (file_id = file.id) where post_id = " . $file->escape($post_id); - $file = Memcached_DataObject::cachedQuery('File', $query); - $att = array(); - while ($file->fetch()) { - $att[] = clone($file); - } - return $att; + function isProtected($url) { + return 'http://www.facebook.com/login.php' === $url; } /** @@ -80,14 +85,22 @@ class File extends Memcached_DataObject * @return File */ function saveNew(array $redir_data, $given_url) { - $x = new File; - $x->url = $given_url; - if (!empty($redir_data['protected'])) $x->protected = $redir_data['protected']; - if (!empty($redir_data['title'])) $x->title = $redir_data['title']; - if (!empty($redir_data['type'])) $x->mimetype = $redir_data['type']; - if (!empty($redir_data['size'])) $x->size = intval($redir_data['size']); - if (isset($redir_data['time']) && $redir_data['time'] > 0) $x->date = intval($redir_data['time']); - $file_id = $x->insert(); + + // I don't know why we have to keep doing this but I'm adding this last check to avoid + // uniqueness bugs. + + $x = File::staticGet('url', $given_url); + + if (empty($x)) { + $x = new File; + $x->url = $given_url; + if (!empty($redir_data['protected'])) $x->protected = $redir_data['protected']; + if (!empty($redir_data['title'])) $x->title = $redir_data['title']; + if (!empty($redir_data['type'])) $x->mimetype = $redir_data['type']; + if (!empty($redir_data['size'])) $x->size = intval($redir_data['size']); + if (isset($redir_data['time']) && $redir_data['time'] > 0) $x->date = intval($redir_data['time']); + $file_id = $x->insert(); + } $x->saveOembed($redir_data, $given_url); return $x; @@ -187,7 +200,7 @@ class File extends Memcached_DataObject } if (empty($x)) { - $x = File::staticGet($file_id); + $x = File::staticGet('id', $file_id); if (empty($x)) { // @todo FIXME: This could possibly be a clearer message :) // TRANS: Server exception thrown when... Robin thinks something is impossible! @@ -204,13 +217,20 @@ class File extends Memcached_DataObject function isRespectsQuota($user,$fileSize) { if ($fileSize > common_config('attachments', 'file_quota')) { + // TRANS: Message used to be inserted as %2$s in the text "No file may + // TRANS: be larger than %1$d byte and the file you sent was %2$s.". + // TRANS: %1$d is the number of bytes of an uploaded file. + $fileSizeText = sprintf(_m('%1$d byte','%1$d bytes',$fileSize),$fileSize); + + $fileQuota = common_config('attachments', 'file_quota'); // TRANS: Message given if an upload is larger than the configured maximum. - // TRANS: %1$d is the byte limit for uploads, %2$d is the byte count for the uploaded file. - // TRANS: %1$s is used for plural. - return sprintf(_m('No file may be larger than %1$d byte and the file you sent was %2$d bytes. Try to upload a smaller version.', - 'No file may be larger than %1$d bytes and the file you sent was %2$d bytes. Try to upload a smaller version.', - common_config('attachments', 'file_quota')), - common_config('attachments', 'file_quota'), $fileSize); + // TRANS: %1$d (used for plural) is the byte limit for uploads, + // TRANS: %2$s is the proper form of "n bytes". This is the only ways to have + // TRANS: gettext support multiple plurals in the same message, unfortunately... + return sprintf(_m('No file may be larger than %1$d byte and the file you sent was %2$s. Try to upload a smaller version.', + 'No file may be larger than %1$d bytes and the file you sent was %2$s. Try to upload a smaller version.', + $fileQuota), + $fileQuota, $fileSizeText); } $query = "select sum(size) as total from file join file_to_post on file_to_post.file_id = file.id join notice on file_to_post.post_id = notice.id where profile_id = {$user->id} and file.url like '%/notice/%/file'"; diff --git a/classes/File_oembed.php b/classes/File_oembed.php index b7bf3a5dae..ae46e61bd4 100644 --- a/classes/File_oembed.php +++ b/classes/File_oembed.php @@ -26,7 +26,7 @@ require_once INSTALLDIR.'/classes/File_redirection.php'; * Table Definition for file_oembed */ -class File_oembed extends Memcached_DataObject +class File_oembed extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -53,9 +53,30 @@ class File_oembed extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE - function sequenceKey() + public static function schemaDef() { - return array(false, false, false); + return array( + 'fields' => array( + 'file_id' => array('type' => 'int', 'not null' => true, 'description' => 'oEmbed for that URL/file'), + 'version' => array('type' => 'varchar', 'length' => 20, 'description' => 'oEmbed spec. version'), + 'type' => array('type' => 'varchar', 'length' => 20, 'description' => 'oEmbed type: photo, video, link, rich'), + 'mimetype' => array('type' => 'varchar', 'length' => 50, 'description' => 'mime type of resource'), + 'provider' => array('type' => 'varchar', 'length' => 50, 'description' => 'name of this oEmbed provider'), + 'provider_url' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL of this oEmbed provider'), + 'width' => array('type' => 'int', 'description' => 'width of oEmbed resource when available'), + 'height' => array('type' => 'int', 'description' => 'height of oEmbed resource when available'), + 'html' => array('type' => 'text', 'description' => 'html representation of this oEmbed resource when applicable'), + 'title' => array('type' => 'varchar', 'length' => 255, 'description' => 'title of oEmbed resource when available'), + 'author_name' => array('type' => 'varchar', 'length' => 50, 'description' => 'author name for this oEmbed resource'), + 'author_url' => array('type' => 'varchar', 'length' => 255, 'description' => 'author URL for this oEmbed resource'), + 'url' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL for this oEmbed resource when applicable (photo, link)'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('file_id'), + 'foreign keys' => array( + 'file_oembed_file_id_fkey' => array('file', array('file_id' => 'id')), + ), + ); } function _getOembed($url) { diff --git a/classes/File_redirection.php b/classes/File_redirection.php index 74e89db5f2..130d9e7d74 100644 --- a/classes/File_redirection.php +++ b/classes/File_redirection.php @@ -27,7 +27,7 @@ require_once INSTALLDIR.'/classes/File_oembed.php'; * Table Definition for file_redirection */ -class File_redirection extends Memcached_DataObject +class File_redirection extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -45,6 +45,23 @@ class File_redirection extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + public static function schemaDef() + { + return array( + 'fields' => array( + 'url' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'short URL (or any other kind of redirect) for file (id)'), + 'file_id' => array('type' => 'int', 'description' => 'short URL for what URL/file'), + 'redirections' => array('type' => 'int', 'description' => 'redirect count'), + 'httpcode' => array('type' => 'int', 'description' => 'HTTP status code (20x, 30x, etc.)'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('url'), + 'foreign keys' => array( + 'file_redirection_file_id_fkey' => array('file' => array('file_id' => 'id')), + ), + ); + } + static function _commonHttp($url, $redirs) { $request = new HTTPClient($url); $request->setConfig(array( diff --git a/classes/File_thumbnail.php b/classes/File_thumbnail.php index 17bac7f08c..6b3c0b0255 100644 --- a/classes/File_thumbnail.php +++ b/classes/File_thumbnail.php @@ -25,7 +25,7 @@ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; * Table Definition for file_thumbnail */ -class File_thumbnail extends Memcached_DataObject +class File_thumbnail extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -43,9 +43,21 @@ class File_thumbnail extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE - function sequenceKey() + public static function schemaDef() { - return array(false, false, false); + return array( + 'fields' => array( + 'file_id' => array('type' => 'int', 'not null' => true, 'description' => 'thumbnail for what URL/file'), + 'url' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL of thumbnail'), + 'width' => array('type' => 'int', 'description' => 'width of thumbnail'), + 'height' => array('type' => 'int', 'description' => 'height of thumbnail'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('file_id'), + 'foreign keys' => array( + 'file_thumbnail_file_id_fkey' => array('file', array('file_id' => 'id')), + ) + ); } /** diff --git a/classes/File_to_post.php b/classes/File_to_post.php index bcb6771f4f..1a887a7c18 100644 --- a/classes/File_to_post.php +++ b/classes/File_to_post.php @@ -25,7 +25,7 @@ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; * Table Definition for file_to_post */ -class File_to_post extends Memcached_DataObject +class File_to_post extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -41,6 +41,25 @@ class File_to_post extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + public static function schemaDef() + { + return array( + 'fields' => array( + 'file_id' => array('type' => 'int', 'not null' => true, 'description' => 'id of URL/file'), + 'post_id' => array('type' => 'int', 'not null' => true, 'description' => 'id of the notice it belongs to'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('file_id', 'post_id'), + 'foreign keys' => array( + 'file_to_post_file_id_fkey' => array('file', array('file_id' => 'id')), + 'file_to_post_post_id_fkey' => array('notice', array('post_id' => 'id')), + ), + 'indexes' => array( + 'post_id_idx' => array('post_id'), + ), + ); + } + function processNew($file_id, $notice_id) { static $seen = array(); if (empty($seen[$notice_id]) || !in_array($file_id, $seen[$notice_id])) { diff --git a/classes/Foreign_link.php b/classes/Foreign_link.php index 57a10dcedb..e3f0cf1ee6 100644 --- a/classes/Foreign_link.php +++ b/classes/Foreign_link.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Foreign_link extends Memcached_DataObject +class Foreign_link extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -29,6 +29,34 @@ class Foreign_link extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + public static function schemaDef() + { + return array( + 'fields' => array( + 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'link to user on this system, if exists'), + 'foreign_id' => array('type' => 'int', 'size' => 'big', 'unsigned' => true, 'not null' => true, 'description' => 'link to user on foreign service, if exists'), + 'service' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to service'), + 'credentials' => array('type' => 'varchar', 'length' => 255, 'description' => 'authc credentials, typically a password'), + 'noticesync' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 1, 'description' => 'notice synchronization, bit 1 = sync outgoing, bit 2 = sync incoming, bit 3 = filter local replies'), + 'friendsync' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 2, 'description' => 'friend synchronization, bit 1 = sync outgoing, bit 2 = sync incoming'), + 'profilesync' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 1, 'description' => 'profile synchronization, bit 1 = sync outgoing, bit 2 = sync incoming'), + 'last_noticesync' => array('type' => 'datetime', 'description' => 'last time notices were imported'), + 'last_friendsync' => array('type' => 'datetime', 'description' => 'last time friends were imported'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('user_id', 'foreign_id', 'service'), + 'foreign keys' => array( + 'foreign_link_user_id_fkey' => array('user', array('user_id' => 'id')), + 'foreign_link_foreign_id_fkey' => array('foreign_user', array('foreign_id' => 'id', 'service' => 'service')), + 'foreign_link_service_fkey' => array('foreign_service', array('service' => 'id')), + ), + 'indexes' => array( + 'foreign_user_user_id_idx' => array('user_id'), + ), + ); + } + static function getByUserID($user_id, $service) { if (empty($user_id) || empty($service)) { diff --git a/classes/Foreign_service.php b/classes/Foreign_service.php index dd74fd2ca6..8ba73521c1 100644 --- a/classes/Foreign_service.php +++ b/classes/Foreign_service.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Foreign_service extends Memcached_DataObject +class Foreign_service extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -22,4 +22,21 @@ class Foreign_service extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + + public static function schemaDef() + { + return array( + 'fields' => array( + 'id' => array('type' => 'int', 'not null' => true, 'description' => 'numeric key for service'), + 'name' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'name of the service'), + 'description' => array('type' => 'varchar', 'length' => 255, 'description' => 'description'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('id'), + 'unique keys' => array( + 'foreign_service_name_key' => array('name'), + ), + ); + } } diff --git a/classes/Foreign_subscription.php b/classes/Foreign_subscription.php index ec2631238e..99bf3868b5 100644 --- a/classes/Foreign_subscription.php +++ b/classes/Foreign_subscription.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Foreign_subscription extends Memcached_DataObject +class Foreign_subscription extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -21,4 +21,27 @@ class Foreign_subscription extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + + public static function schemaDef() + { + return array( + + 'fields' => array( + 'service' => array('type' => 'int', 'not null' => true, 'description' => 'service where relationship happens'), + 'subscriber' => array('type' => 'int', 'size' => 'big', 'not null' => true, 'description' => 'subscriber on foreign service'), + 'subscribed' => array('type' => 'int', 'size' => 'big', 'not null' => true, 'description' => 'subscribed user'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + ), + 'primary key' => array('service', 'subscriber', 'subscribed'), + 'foreign keys' => array( + 'foreign_subscription_service_fkey' => array('foreign_service', array('service' => 'id')), + 'foreign_subscription_subscriber_fkey' => array('foreign_user', array('subscriber' => 'id', 'service' => 'service')), + 'foreign_subscription_subscribed_fkey' => array('foreign_user', array('subscribed' => 'id', 'service' => 'service')), + ), + 'indexes' => array( + 'foreign_subscription_subscriber_idx' => array('service', 'subscriber'), + 'foreign_subscription_subscribed_idx' => array('service', 'subscribed'), + ), + ); + } } diff --git a/classes/Foreign_user.php b/classes/Foreign_user.php index 82ca749a59..4a41e07f4d 100644 --- a/classes/Foreign_user.php +++ b/classes/Foreign_user.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Foreign_user extends Memcached_DataObject +class Foreign_user extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -23,20 +23,39 @@ class Foreign_user extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE - // XXX: This only returns a 1->1 single obj mapping. Change? Or make - // a getForeignUsers() that returns more than one? --Zach + public static function schemaDef() + { + return array( + 'fields' => array( + 'id' => array('type' => 'int', 'size' => 'big', 'not null' => true, 'description' => 'unique numeric key on foreign service'), + 'service' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to service'), + 'uri' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'identifying URI'), + 'nickname' => array('type' => 'varchar', 'length' => 255, 'description' => 'nickname on foreign service'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('id', 'service'), + 'foreign keys' => array( + 'foreign_user_service_fkey' => array('foreign_service', array('service' => 'id')), + ), + 'unique keys' => array( + 'foreign_user_uri_key' => array('uri'), + ), + ); + } + static function getForeignUser($id, $service) { + $fuser = new Foreign_user(); - $fuser->whereAdd("service = $service"); - $fuser->whereAdd("id = $id"); + + $fuser->id = $id; + $fuser->service = $service; + $fuser->limit(1); - if ($fuser->find()) { - $fuser->fetch(); - return $fuser; - } + $result = $fuser->find(true); - return null; + return empty($result) ? null : $fuser; } static function getByNickname($nickname, $service) diff --git a/classes/Group_alias.php b/classes/Group_alias.php index c5a1895a11..fcf5405547 100644 --- a/classes/Group_alias.php +++ b/classes/Group_alias.php @@ -23,7 +23,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Group_alias extends Memcached_DataObject +class Group_alias extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -38,4 +38,22 @@ class Group_alias extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + + public static function schemaDef() + { + return array( + 'fields' => array( + 'alias' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'additional nickname for the group'), + 'group_id' => array('type' => 'int', 'not null' => true, 'description' => 'group profile is blocked from'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date alias was created'), + ), + 'primary key' => array('alias'), + 'foreign keys' => array( + 'group_alias_group_id_fkey' => array('user_group', array('group_id' => 'id')), + ), + 'indexes' => array( + 'group_alias_group_id_idx' => array('group_id'), + ), + ); + } } diff --git a/classes/Group_block.php b/classes/Group_block.php index 68feaef4de..dc439ba774 100644 --- a/classes/Group_block.php +++ b/classes/Group_block.php @@ -23,7 +23,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Group_block extends Memcached_DataObject +class Group_block extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -40,6 +40,24 @@ class Group_block extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + public static function schemaDef() + { + return array( + 'fields' => array( + 'group_id' => array('type' => 'int', 'not null' => true, 'description' => 'group profile is blocked from'), + 'blocked' => array('type' => 'int', 'not null' => true, 'description' => 'profile that is blocked'), + 'blocker' => array('type' => 'int', 'not null' => true, 'description' => 'user making the block'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date of blocking'), + ), + 'primary key' => array('group_id', 'blocked'), + 'foreign keys' => array( + 'group_block_group_id_fkey' => array('user_group', array('group_id' => 'id')), + 'group_block_blocked_fkey' => array('profile', array('blocked' => 'id')), + 'group_block_blocker_fkey' => array('user', array('blocker' => 'id')), + ), + ); + } + function pkeyGet($kv) { return Memcached_DataObject::pkeyGet('Group_block', $kv); diff --git a/classes/Group_inbox.php b/classes/Group_inbox.php index 8f5c65e594..fe600cbaf8 100644 --- a/classes/Group_inbox.php +++ b/classes/Group_inbox.php @@ -3,7 +3,7 @@ /** * Table Definition for group_inbox */ -class Group_inbox extends Memcached_DataObject +class Group_inbox extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -20,6 +20,28 @@ class Group_inbox extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + public static function schemaDef() + { + return array( + 'description' => 'Many-many table listing notices posted to a given group, or which groups a given notice was posted to.', + 'fields' => array( + 'group_id' => array('type' => 'int', 'not null' => true, 'description' => 'group receiving the message'), + 'notice_id' => array('type' => 'int', 'not null' => true, 'description' => 'notice received'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date the notice was created'), + ), + 'primary key' => array('group_id', 'notice_id'), + 'foreign keys' => array( + 'group_inbox_group_id_fkey' => array('user_group', array('group_id' => 'id')), + 'group_inbox_notice_id_fkey' => array('notice', array('notice_id' => 'id')), + ), + 'indexes' => array( + 'group_inbox_created_idx' => array('created'), + 'group_inbox_notice_id_idx' => array('notice_id'), + 'group_inbox_group_id_created_notice_id_idx' => array('group_id', 'created', 'notice_id'), + ), + ); + } + function pkeyGet($kv) { return Memcached_DataObject::pkeyGet('Group_inbox', $kv); diff --git a/classes/Group_member.php b/classes/Group_member.php index 5385e0f487..d51aa9ff9c 100644 --- a/classes/Group_member.php +++ b/classes/Group_member.php @@ -3,7 +3,7 @@ * Table Definition for group_member */ -class Group_member extends Memcached_DataObject +class Group_member extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -12,6 +12,7 @@ class Group_member extends Memcached_DataObject public $group_id; // int(4) primary_key not_null public $profile_id; // int(4) primary_key not_null public $is_admin; // tinyint(1) + public $uri; // varchar(255) public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -21,6 +22,35 @@ class Group_member extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + public static function schemaDef() + { + return array( + 'fields' => array( + 'group_id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to user_group'), + 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to profile table'), + 'is_admin' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'is this user an admin?'), + 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universal identifier'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('group_id', 'profile_id'), + 'unique keys' => array( + 'group_member_uri_key' => array('uri'), + ), + 'foreign keys' => array( + 'group_member_group_id_fkey' => array('user_group', array('group_id' => 'id')), + 'group_member_profile_id_fkey' => array('profile', array('profile_id' => 'id')), + ), + 'indexes' => array( + // @fixme probably we want a (profile_id, created) index here? + 'group_member_profile_id_idx' => array('profile_id'), + 'group_member_created_idx' => array('created'), + 'group_member_profile_id_created_idx' => array('profile_id', 'created'), + 'group_member_group_id_created_idx' => array('group_id', 'created'), + ), + ); + } + function pkeyGet($kv) { return Memcached_DataObject::pkeyGet('Group_member', $kv); @@ -43,6 +73,7 @@ class Group_member extends Memcached_DataObject $member->group_id = $group_id; $member->profile_id = $profile_id; $member->created = common_sql_now(); + $member->uri = self::newURI($profile_id, $group_id, $member->created); $result = $member->insert(); @@ -130,14 +161,20 @@ class Group_member extends Memcached_DataObject function asActivity() { $member = $this->getMember(); + + if (!$member) { + throw new Exception("No such member: " . $this->profile_id); + } + $group = $this->getGroup(); + if (!$group) { + throw new Exception("No such group: " . $this->group_id); + } + $act = new Activity(); - $act->id = TagURI::mint('join:%d:%d:%s', - $member->id, - $group->id, - common_date_iso8601($this->created)); + $act->id = $this->getURI(); $act->actor = ActivityObject::fromProfile($member); $act->verb = ActivityVerb::JOIN; @@ -171,4 +208,21 @@ class Group_member extends Memcached_DataObject { mail_notify_group_join($this->getGroup(), $this->getMember()); } + + function getURI() + { + if (!empty($this->uri)) { + return $this->uri; + } else { + return self::newURI($this->profile_id, $this->group_id, $this->created); + } + } + + static function newURI($profile_id, $group_id, $created) + { + return TagURI::mint('join:%d:%d:%s', + $profile_id, + $group_id, + common_date_iso8601($created)); + } } diff --git a/classes/Inbox.php b/classes/Inbox.php index 336bba048c..c618ff7aca 100644 --- a/classes/Inbox.php +++ b/classes/Inbox.php @@ -29,7 +29,7 @@ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Inbox extends Memcached_DataObject +class Inbox extends Managed_DataObject { const BOXCAR = 128; const MAX_NOTICES = 1024; @@ -47,9 +47,18 @@ class Inbox extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE - function sequenceKey() + public static function schemaDef() { - return array(false, false, false); + return array( + 'fields' => array( + 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user receiving the notice'), + 'notice_ids' => array('type' => 'blob', 'description' => 'packed list of notice ids'), + ), + 'primary key' => array('user_id'), + 'foreign keys' => array( + 'inbox_user_id_fkey' => array('user', array('user_id' => 'id')), + ), + ); } /** diff --git a/classes/Invitation.php b/classes/Invitation.php index 27ff400883..ae34a31023 100644 --- a/classes/Invitation.php +++ b/classes/Invitation.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Invitation extends Memcached_DataObject +class Invitation extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -30,4 +30,29 @@ class Invitation extends Memcached_DataObject $this->registered_user_id = $user->id; return $this->update($orig); } + + public static function schemaDef() + { + return array( + + 'fields' => array( + 'code' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'random code for an invitation'), + 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'who sent the invitation'), + 'address' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'invitation sent to'), + 'address_type' => array('type' => 'varchar', 'length' => 8, 'not null' => true, 'description' => 'address type ("email", "xmpp", "sms")'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'registered_user_id' => array('type' => 'int', 'not null' => false, 'description' => 'if the invitation is converted, who the new user is'), + ), + 'primary key' => array('code'), + 'foreign keys' => array( + 'invitation_user_id_fkey' => array('user', array('user_id' => 'id')), + 'invitation_registered_user_id_fkey' => array('user', array('registered_user_id' => 'id')), + ), + 'indexes' => array( + 'invitation_address_idx' => array('address', 'address_type'), + 'invitation_user_id_idx' => array('user_id'), + 'invitation_registered_user_id_idx' => array('registered_user_id'), + ), + ); + } } diff --git a/classes/Local_group.php b/classes/Local_group.php index ccd0125cf4..b895103d16 100644 --- a/classes/Local_group.php +++ b/classes/Local_group.php @@ -3,7 +3,7 @@ * Table Definition for local_group */ -class Local_group extends Memcached_DataObject +class Local_group extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -20,15 +20,31 @@ class Local_group extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE - function sequenceKey() + public static function schemaDef() { - return array(false, false, false); + return array( + 'description' => 'Record for a user group on the local site, with some additional info not in user_group', + 'fields' => array( + 'group_id' => array('type' => 'int', 'not null' => true, 'description' => 'group represented'), + 'nickname' => array('type' => 'varchar', 'length' => 64, 'description' => 'group represented'), + + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('group_id'), + 'foreign keys' => array( + 'local_group_group_id_fkey' => array('user_group', array('group_id' => 'id')), + ), + 'unique keys' => array( + 'local_group_nickname_key' => array('nickname'), + ), + ); } function setNickname($nickname) { $this->decache(); - $qry = 'UPDATE local_group set nickname = "'.$nickname.'" where group_id = ' . $this->group_id; + $qry = 'UPDATE local_group set nickname = "'.$this->escape($nickname).'" where group_id = ' . $this->group_id; $result = $this->query($qry); diff --git a/classes/Location_namespace.php b/classes/Location_namespace.php index 5ab95d9ef2..7e12447a41 100644 --- a/classes/Location_namespace.php +++ b/classes/Location_namespace.php @@ -25,7 +25,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Location_namespace extends Memcached_DataObject +class Location_namespace extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -43,4 +43,17 @@ class Location_namespace extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + + public static function schemaDef() + { + return array( + 'fields' => array( + 'id' => array('type' => 'int', 'not null' => true, 'description' => 'identity for this namespace'), + 'description' => array('type' => 'varchar', 'length' => 255, 'description' => 'description of the namespace'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date the record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('id'), + ); + } } diff --git a/classes/Login_token.php b/classes/Login_token.php index 7a9388c947..7049c7c7fe 100644 --- a/classes/Login_token.php +++ b/classes/Login_token.php @@ -23,7 +23,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Login_token extends Memcached_DataObject +class Login_token extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -40,21 +40,24 @@ class Login_token extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE - const TIMEOUT = 120; // seconds after which to timeout the token - - /* - DB_DataObject calculates the sequence key(s) by taking the first key returned by the keys() function. - In this case, the keys() function returns user_id as the first key. user_id is not a sequence, but - DB_DataObject's sequenceKey() will incorrectly think it is. Then, since the sequenceKey() is a numeric - type, but is not set to autoincrement in the database, DB_DataObject will create a _seq table and - manage the sequence itself. This is not the correct behavior for the user_id in this class. - So we override that incorrect behavior, and simply say there is no sequence key. - */ - function sequenceKey() + public static function schemaDef() { - return array(false,false); + return array( + 'fields' => array( + 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user owning this token'), + 'token' => array('type' => 'char', 'length' => 32, 'not null' => true, 'description' => 'token useable for logging in'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('user_id'), + 'foreign keys' => array( + 'login_token_user_id_fkey' => array('user', array('user_id' => 'id')), + ), + ); } + const TIMEOUT = 120; // seconds after which to timeout the token + function makeNew($user) { $login_token = Login_token::staticGet('user_id', $user->id); diff --git a/classes/Managed_DataObject.php b/classes/Managed_DataObject.php index 7263b3e320..1d55537e20 100644 --- a/classes/Managed_DataObject.php +++ b/classes/Managed_DataObject.php @@ -152,4 +152,54 @@ abstract class Managed_DataObject extends Memcached_DataObject return $style; } + + function links() + { + $links = array(); + + $table = call_user_func(array(get_class($this), 'schemaDef')); + + foreach ($table['foreign keys'] as $keyname => $keydef) { + if (count($keydef) == 2 && is_string($keydef[0]) && is_array($keydef[1]) && count($keydef[1]) == 1) { + if (isset($keydef[1][0])) { + $links[$keydef[1][0]] = $keydef[0].':'.$keydef[1][1]; + } + } + } + return $links; + } + + /** + * Return a list of all primary/unique keys / vals that will be used for + * caching. This will understand compound unique keys, which + * Memcached_DataObject doesn't have enough info to handle properly. + * + * @return array of strings + */ + function _allCacheKeys() + { + $table = call_user_func(array(get_class($this), 'schemaDef')); + $ckeys = array(); + + if (!empty($table['unique keys'])) { + $keyNames = $table['unique keys']; + foreach ($keyNames as $idx => $fields) { + $val = array(); + foreach ($fields as $name) { + $val[$name] = self::valueString($this->$name); + } + $ckeys[] = self::multicacheKey($this->tableName(), $val); + } + } + + if (!empty($table['primary key'])) { + $fields = $table['primary key']; + $val = array(); + foreach ($fields as $name) { + $val[$name] = self::valueString($this->$name); + } + $ckeys[] = self::multicacheKey($this->tableName(), $val); + } + return $ckeys; + } } \ No newline at end of file diff --git a/classes/Memcached_DataObject.php b/classes/Memcached_DataObject.php index c361ba8783..54c885e737 100644 --- a/classes/Memcached_DataObject.php +++ b/classes/Memcached_DataObject.php @@ -34,11 +34,12 @@ class Memcached_DataObject extends Safe_DataObject { if (is_null($v)) { $v = $k; - // XXX: HACK! - $i = new $cls; - $keys = $i->keys(); + $keys = self::pkeyCols($cls); + if (count($keys) > 1) { + // FIXME: maybe call pkeyGet() ourselves? + throw new Exception('Use pkeyGet() for compound primary keys'); + } $k = $keys[0]; - unset($i); } $i = Memcached_DataObject::getcached($cls, $k, $v); if ($i === false) { // false == cache miss @@ -65,7 +66,291 @@ class Memcached_DataObject extends Safe_DataObject } /** - * @fixme Should this return false on lookup fail to match staticGet? + * Get multiple items from the database by key + * + * @param string $cls Class to fetch + * @param string $keyCol name of column for key + * @param array $keyVals key values to fetch + * @param boolean $skipNulls return only non-null results? + * + * @return array Array of objects, in order + */ + function multiGet($cls, $keyCol, $keyVals, $skipNulls=true) + { + $result = self::pivotGet($cls, $keyCol, $keyVals); + + $values = array_values($result); + + if ($skipNulls) { + $tmp = array(); + foreach ($values as $value) { + if (!empty($value)) { + $tmp[] = $value; + } + } + $values = $tmp; + } + + return new ArrayWrapper($values); + } + + /** + * Get multiple items from the database by key + * + * @param string $cls Class to fetch + * @param string $keyCol name of column for key + * @param array $keyVals key values to fetch + * @param boolean $otherCols Other columns to hold fixed + * + * @return array Array mapping $keyVals to objects, or null if not found + */ + static function pivotGet($cls, $keyCol, $keyVals, $otherCols = array()) + { + if (is_array($keyCol)) { + foreach ($keyVals as $keyVal) { + $result[implode(',', $keyVal)] = null; + } + } else { + $result = array_fill_keys($keyVals, null); + } + + $toFetch = array(); + + foreach ($keyVals as $keyVal) { + + if (is_array($keyCol)) { + $kv = array_combine($keyCol, $keyVal); + } else { + $kv = array($keyCol => $keyVal); + } + + $kv = array_merge($otherCols, $kv); + + $i = self::multicache($cls, $kv); + + if ($i !== false) { + if (is_array($keyCol)) { + $result[implode(',', $keyVal)] = $i; + } else { + $result[$keyVal] = $i; + } + } else if (!empty($keyVal)) { + $toFetch[] = $keyVal; + } + } + + if (count($toFetch) > 0) { + $i = DB_DataObject::factory($cls); + if (empty($i)) { + // TRANS: Exception thrown when a program code class (%s) cannot be instantiated. + throw new Exception(sprintf(_('Cannot instantiate class %s.'),$cls)); + } + foreach ($otherCols as $otherKeyCol => $otherKeyVal) { + $i->$otherKeyCol = $otherKeyVal; + } + if (is_array($keyCol)) { + $i->whereAdd(self::_inMultiKey($i, $keyCol, $toFetch)); + } else { + $i->whereAddIn($keyCol, $toFetch, $i->columnType($keyCol)); + } + if ($i->find()) { + while ($i->fetch()) { + $copy = clone($i); + $copy->encache(); + if (is_array($keyCol)) { + $vals = array(); + foreach ($keyCol as $k) { + $vals[] = $i->$k; + } + $result[implode(',', $vals)] = $copy; + } else { + $result[$i->$keyCol] = $copy; + } + } + } + + // Save state of DB misses + + foreach ($toFetch as $keyVal) { + $r = null; + if (is_array($keyCol)) { + $r = $result[implode(',', $keyVal)]; + } else { + $r = $result[$keyVal]; + } + if (empty($r)) { + if (is_array($keyCol)) { + $kv = array_combine($keyCol, $keyVal); + } else { + $kv = array($keyCol => $keyVal); + } + $kv = array_merge($otherCols, $kv); + // save the fact that no such row exists + $c = self::memcache(); + if (!empty($c)) { + $ck = self::multicacheKey($cls, $kv); + $c->set($ck, null); + } + } + } + } + + return $result; + } + + static function _inMultiKey($i, $cols, $values) + { + $types = array(); + + foreach ($cols as $col) { + $types[$col] = $i->columnType($col); + } + + $first = true; + + $query = ''; + + foreach ($values as $value) { + if ($first) { + $query .= '( '; + $first = false; + } else { + $query .= ' OR '; + } + $query .= '( '; + $i = 0; + $firstc = true; + foreach ($cols as $col) { + if (!$firstc) { + $query .= ' AND '; + } else { + $firstc = false; + } + switch ($types[$col]) { + case 'string': + case 'datetime': + $query .= sprintf("%s = %s", $col, $i->_quote($value[$i])); + break; + default: + $query .= sprintf("%s = %s", $col, $value[$i]); + break; + } + } + $query .= ') '; + } + + if (!$first) { + $query .= ' )'; + } + + return $query; + } + + static function pkeyCols($cls) + { + $i = DB_DataObject::factory($cls); + if (empty($i)) { + // TRANS: Exception thrown when a program code class (%s) cannot be instantiated. + throw new Exception(sprintf(_('Cannot instantiate class %s.'),$cls)); + } + $types = $i->keyTypes(); + ksort($types); + + $pkey = array(); + + foreach ($types as $key => $type) { + if ($type == 'K' || $type == 'N') { + $pkey[] = $key; + } + } + + return $pkey; + } + + function listGet($cls, $keyCol, $keyVals) + { + $pkeyMap = array_fill_keys($keyVals, array()); + $result = array_fill_keys($keyVals, array()); + + $pkeyCols = self::pkeyCols($cls); + + $toFetch = array(); + $allPkeys = array(); + + // We only cache keys -- not objects! + + foreach ($keyVals as $keyVal) { + $l = self::cacheGet(sprintf("%s:list-ids:%s:%s", strtolower($cls), $keyCol, $keyVal)); + if ($l !== false) { + $pkeyMap[$keyVal] = $l; + foreach ($l as $pkey) { + $allPkeys[] = $pkey; + } + } else { + $toFetch[] = $keyVal; + } + } + + if (count($allPkeys) > 0) { + $keyResults = self::pivotGet($cls, $pkeyCols, $allPkeys); + + foreach ($pkeyMap as $keyVal => $pkeyList) { + foreach ($pkeyList as $pkeyVal) { + $i = $keyResults[implode(',',$pkeyVal)]; + if (!empty($i)) { + $result[$keyVal][] = $i; + } + } + } + } + + if (count($toFetch) > 0) { + $i = DB_DataObject::factory($cls); + if (empty($i)) { + // TRANS: Exception thrown when a program code class (%s) cannot be instantiated. + throw new Exception(sprintf(_('Cannot instantiate class %s.'),$cls)); + } + $i->whereAddIn($keyCol, $toFetch, $i->columnType($keyCol)); + if ($i->find()) { + sprintf("listGet() got {$i->N} results for class $cls key $keyCol"); + while ($i->fetch()) { + $copy = clone($i); + $copy->encache(); + $result[$i->$keyCol][] = $copy; + $pkeyVal = array(); + foreach ($pkeyCols as $pkeyCol) { + $pkeyVal[] = $i->$pkeyCol; + } + $pkeyMap[$i->$keyCol][] = $pkeyVal; + } + } + foreach ($toFetch as $keyVal) { + self::cacheSet(sprintf("%s:list-ids:%s:%s", strtolower($cls), $keyCol, $keyVal), + $pkeyMap[$keyVal]); + } + } + + return $result; + } + + function columnType($columnName) + { + $keys = $this->table(); + if (!array_key_exists($columnName, $keys)) { + throw new Exception('Unknown key column ' . $columnName . ' in ' . join(',', array_keys($keys))); + } + + $def = $keys[$columnName]; + + if ($def & DB_DATAOBJECT_INT) { + return 'integer'; + } else { + return 'string'; + } + } + + /** + * @todo FIXME: Should this return false on lookup fail to match staticGet? */ function pkeyGet($cls, $kv) { @@ -78,7 +363,13 @@ class Memcached_DataObject extends Safe_DataObject return false; } foreach ($kv as $k => $v) { - $i->$k = $v; + if (is_null($v)) { + // XXX: possible SQL injection...? Don't + // pass keys from the browser, eh. + $i->whereAdd("$k is null"); + } else { + $i->$k = $v; + } } if ($i->find(true)) { $i->encache(); @@ -409,7 +700,7 @@ class Memcached_DataObject extends Safe_DataObject continue; } if (in_array($func, $ignoreStatic)) { - continue; // @fixme this shouldn't be needed? + continue; // @todo FIXME: This shouldn't be needed? } $here = get_class($frame['object']) . '->' . $func; break; @@ -552,7 +843,7 @@ class Memcached_DataObject extends Safe_DataObject if (!$dsn) { // TRANS: Exception thrown when database name or Data Source Name could not be found. - throw new Exception(_("No database name or DSN found anywhere.")); + throw new Exception(_('No database name or DSN found anywhere.')); } return $dsn; diff --git a/classes/Message.php b/classes/Message.php index 484d1f724c..7fe626ec57 100644 --- a/classes/Message.php +++ b/classes/Message.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Message extends Memcached_DataObject +class Message extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -27,6 +27,39 @@ class Message extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + public static function schemaDef() + { + return array( + 'fields' => array( + 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'unique identifier'), + 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier'), + 'from_profile' => array('type' => 'int', 'not null' => true, 'description' => 'who the message is from'), + 'to_profile' => array('type' => 'int', 'not null' => true, 'description' => 'who the message is to'), + 'content' => array('type' => 'text', 'description' => 'message content'), + 'rendered' => array('type' => 'text', 'description' => 'HTML version of the content'), + 'url' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL of any attachment (image, video, bookmark, whatever)'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + 'source' => array('type' => 'varchar', 'length' => 32, 'description' => 'source of comment, like "web", "im", or "clientname"'), + ), + 'primary key' => array('id'), + 'unique keys' => array( + 'message_uri_key' => array('uri'), + ), + 'foreign keys' => array( + 'message_from_profile_fkey' => array('profile', array('from_profile' => 'id')), + 'message_to_profile_fkey' => array('profile', array('to_profile' => 'id')), + ), + 'indexes' => array( + // @fixme these are really terrible indexes, since you can only sort on one of them at a time. + // looks like we really need a (to_profile, created) for inbox and a (from_profile, created) for outbox + 'message_from_idx' => array('from_profile'), + 'message_to_idx' => array('to_profile'), + 'message_created_idx' => array('created'), + ), + ); + } + function getFrom() { return Profile::staticGet('id', $this->from_profile); @@ -106,4 +139,82 @@ class Message extends Memcached_DataObject mail_notify_message($this, $from, $to); } + + function getSource() + { + $ns = new Notice_source(); + if (!empty($this->source)) { + switch ($this->source) { + case 'web': + case 'xmpp': + case 'mail': + case 'omb': + case 'system': + case 'api': + $ns->code = $this->source; + break; + default: + $ns = Notice_source::staticGet($this->source); + if (!$ns) { + $ns = new Notice_source(); + $ns->code = $this->source; + $app = Oauth_application::staticGet('name', $this->source); + if ($app) { + $ns->name = $app->name; + $ns->url = $app->source_url; + } + } + break; + } + } + return $ns; + } + + function asActivity() + { + $act = new Activity(); + + if (Event::handle('StartMessageAsActivity', array($this, &$act))) { + + $act->id = TagURI::mint(sprintf('activity:message:%d', $this->id)); + $act->time = strtotime($this->created); + $act->link = $this->url; + + $profile = Profile::staticGet('id', $this->from_profile); + + if (empty($profile)) { + throw new Exception(sprintf("Sender profile not found: %d", $this->from_profile)); + } + + $act->actor = ActivityObject::fromProfile($profile); + $act->actor->extra[] = $profile->profileInfo(null); + + $act->verb = ActivityVerb::POST; + + $act->objects[] = ActivityObject::fromMessage($this); + + $ctx = new ActivityContext(); + + $rprofile = Profile::staticGet('id', $this->to_profile); + + if (empty($rprofile)) { + throw new Exception(sprintf("Receiver profile not found: %d", $this->to_profile)); + } + + $ctx->attention[] = $rprofile->getUri(); + $ctx->attentionType[$rprofile->getUri()] = ActivityObject::PERSON; + + $act->context = $ctx; + + $source = $this->getSource(); + + if ($source) { + $act->generator = ActivityObject::fromNoticeSource($source); + } + + Event::handle('EndMessageAsActivity', array($this, &$act)); + } + + return $act; + } } diff --git a/classes/Nonce.php b/classes/Nonce.php index 93191bd409..0cd9967a08 100644 --- a/classes/Nonce.php +++ b/classes/Nonce.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Nonce extends Memcached_DataObject +class Nonce extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -36,4 +36,21 @@ class Nonce extends Memcached_DataObject { return array('consumer_key,token' => 'token:consumer_key,token'); } + + public static function schemaDef() + { + return array( + 'description' => 'OAuth nonce record', + 'fields' => array( + 'consumer_key' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'unique identifier, root URL'), + 'tok' => array('type' => 'char', 'length' => 32, 'description' => 'buggy old value, ignored'), + 'nonce' => array('type' => 'char', 'length' => 32, 'not null' => true, 'description' => 'nonce'), + 'ts' => array('type' => 'datetime', 'not null' => true, 'description' => 'timestamp sent'), + + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('consumer_key', 'ts', 'nonce'), + ); + } } diff --git a/classes/Notice.php b/classes/Notice.php index 87363158dd..462ce8b53c 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -1,7 +1,7 @@ array( + 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'unique identifier'), + 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'who made the update'), + 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier, usually a tag URI'), + 'content' => array('type' => 'text', 'description' => 'update content', 'collate' => 'utf8_general_ci'), + 'rendered' => array('type' => 'text', 'description' => 'HTML version of the content'), + 'url' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL of any attachment (image, video, bookmark, whatever)'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + 'reply_to' => array('type' => 'int', 'description' => 'notice replied to (usually a guess)'), + 'is_local' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'notice was generated by a user'), + 'source' => array('type' => 'varchar', 'length' => 32, 'description' => 'source of comment, like "web", "im", or "clientname"'), + 'conversation' => array('type' => 'int', 'description' => 'id of root notice in this conversation'), + 'lat' => array('type' => 'numeric', 'precision' => 10, 'scale' => 7, 'description' => 'latitude'), + 'lon' => array('type' => 'numeric', 'precision' => 10, 'scale' => 7, 'description' => 'longitude'), + 'location_id' => array('type' => 'int', 'description' => 'location id if possible'), + 'location_ns' => array('type' => 'int', 'description' => 'namespace for location'), + 'repeat_of' => array('type' => 'int', 'description' => 'notice this is a repeat of'), + 'object_type' => array('type' => 'varchar', 'length' => 255, 'description' => 'URI representing activity streams object type', 'default' => 'http://activitystrea.ms/schema/1.0/note'), + 'verb' => array('type' => 'varchar', 'length' => 255, 'description' => 'URI representing activity streams verb', 'default' => 'http://activitystrea.ms/schema/1.0/post'), + 'scope' => array('type' => 'int', + 'description' => 'bit map for distribution scope; 0 = everywhere; 1 = this server only; 2 = addressees; 4 = followers; null = default'), + ), + 'primary key' => array('id'), + 'unique keys' => array( + 'notice_uri_key' => array('uri'), + ), + 'foreign keys' => array( + 'notice_profile_id_fkey' => array('profile', array('profile_id' => 'id')), + 'notice_reply_to_fkey' => array('notice', array('reply_to' => 'id')), + 'notice_conversation_fkey' => array('conversation', array('conversation' => 'id')), # note... used to refer to notice.id + 'notice_repeat_of_fkey' => array('notice', array('repeat_of' => 'id')), # @fixme: what about repeats of deleted notices? + ), + 'indexes' => array( + 'notice_created_id_is_local_idx' => array('created', 'id', 'is_local'), + 'notice_profile_id_idx' => array('profile_id', 'created', 'id'), + 'notice_repeat_of_created_id_idx' => array('repeat_of', 'created', 'id'), + 'notice_conversation_created_id_idx' => array('conversation', 'created', 'id'), + 'notice_replyto_idx' => array('reply_to') + ) + ); + + if (common_config('search', 'type') == 'fulltext') { + $def['fulltext indexes'] = array('content' => array('content')); + } + + return $def; + } + + function multiGet($kc, $kvs, $skipNulls=true) + { + return Memcached_DataObject::multiGet('Notice', $kc, $kvs, $skipNulls); + } + /* Notice types */ const LOCAL_PUBLIC = 1; - const REMOTE_OMB = 0; + const REMOTE = 0; const LOCAL_NONPUBLIC = -1; const GATEWAY = -2; @@ -101,7 +159,7 @@ class Notice extends Memcached_DataObject function getProfile() { if (is_int($this->_profile) && $this->_profile == -1) { - $this->_profile = Profile::staticGet('id', $this->profile_id); + $this->_setProfile(Profile::staticGet('id', $this->profile_id)); if (empty($this->_profile)) { // TRANS: Server exception thrown when a user profile for a notice cannot be found. @@ -112,6 +170,11 @@ class Notice extends Memcached_DataObject return $this->_profile; } + + function _setProfile($profile) + { + $this->_profile = $profile; + } function delete() { @@ -229,11 +292,11 @@ class Notice extends Memcached_DataObject * string 'created' timestamp of notice; defaults to now * int 'is_local' source/gateway ID, one of: * Notice::LOCAL_PUBLIC - Local, ok to appear in public timeline - * Notice::REMOTE_OMB - Sent from a remote OMB service; + * Notice::REMOTE - Sent from a remote service; * hide from public timeline but show in * local "and friends" timelines * Notice::LOCAL_NONPUBLIC - Local, but hide from public timeline - * Notice::GATEWAY - From another non-OMB service; + * Notice::GATEWAY - From another non-OStatus service; * will not appear in public views * float 'lat' decimal latitude for geolocation * float 'lon' decimal longitude for geolocation @@ -254,6 +317,7 @@ class Notice extends Memcached_DataObject * notice in place of extracting links from content * boolean 'distribute' whether to distribute the notice, default true * string 'object_type' URL of the associated object type (default ActivityObject::NOTE) + * string 'verb' URL of the associated verb (default ActivityVerb::POST) * int 'scope' Scope bitmask; default to SITE_SCOPE on private sites, 0 otherwise * * @fixme tag override @@ -267,10 +331,12 @@ class Notice extends Memcached_DataObject 'reply_to' => null, 'repeat_of' => null, 'scope' => null, - 'distribute' => true); + 'distribute' => true, + 'object_type' => null, + 'verb' => null); - if (!empty($options)) { - $options = $options + $defaults; + if (!empty($options) && is_array($options)) { + $options = array_merge($defaults, $options); extract($options); } else { extract($defaults); @@ -438,6 +504,17 @@ class Notice extends Memcached_DataObject $notice->rendered = common_render_content($final, $notice); } + if (empty($verb)) { + if (!empty($notice->repeat_of)) { + $notice->verb = ActivityVerb::SHARE; + $notice->object_type = ActivityObject::ACTIVITY; + } else { + $notice->verb = ActivityVerb::POST; + } + } else { + $notice->verb = $verb; + } + if (empty($object_type)) { $notice->object_type = (empty($notice->reply_to)) ? ActivityObject::NOTE : ActivityObject::COMMENT; } else { @@ -448,7 +525,7 @@ class Notice extends Memcached_DataObject if (!empty($reply)) { $notice->scope = $reply->scope; } else { - $notice->scope = common_config('notice', 'defaultscope'); + $notice->scope = self::defaultScope(); } } else { $notice->scope = $scope; @@ -567,14 +644,13 @@ class Notice extends Memcached_DataObject $this->blowStream('public'); } - // XXX: Before we were blowing the casche only if the notice id - // was not the root of the conversation. What to do now? - - self::blow('notice:conversation_ids:%d', $this->conversation); - self::blow('conversation::notice_count:%d', $this->conversation); + self::blow('notice:list-ids:conversation:%s', $this->conversation); + self::blow('conversation:notice_count:%d', $this->conversation); if (!empty($this->repeat_of)) { + // XXX: we should probably only use one of these $this->blowStream('notice:repeats:%d', $this->repeat_of); + self::blow('notice:list-ids:repeat_of:%d', $this->repeat_of); } $original = Notice::staticGet('id', $this->repeat_of); @@ -745,62 +821,33 @@ class Notice extends Memcached_DataObject return true; } - function getUploadedAttachment() { - $post = clone $this; - $query = 'select file.url as up, file.id as i from file join file_to_post on file.id = file_id where post_id=' . $post->escape($post->id) . ' and url like "%/notice/%/file"'; - $post->query($query); - $post->fetch(); - if (empty($post->up) || empty($post->i)) { - $ret = false; - } else { - $ret = array($post->up, $post->i); - } - $post->free(); - return $ret; - } - - function hasAttachments() { - $post = clone $this; - $query = "select count(file_id) as n_attachments from file join file_to_post on (file_id = file.id) join notice on (post_id = notice.id) where post_id = " . $post->escape($post->id); - $post->query($query); - $post->fetch(); - $n_attachments = intval($post->n_attachments); - $post->free(); - return $n_attachments; - } - + protected $_attachments = -1; + function attachments() { - $keypart = sprintf('notice:file_ids:%d', $this->id); - - $idstr = self::cacheGet($keypart); - - if ($idstr !== false) { - $ids = explode(',', $idstr); - } else { - $ids = array(); - $f2p = new File_to_post; - $f2p->post_id = $this->id; - if ($f2p->find()) { - while ($f2p->fetch()) { - $ids[] = $f2p->file_id; - } - } - self::cacheSet($keypart, implode(',', $ids)); + if ($this->_attachments != -1) { + return $this->_attachments; } - - $att = array(); - - foreach ($ids as $id) { - $f = File::staticGet('id', $id); - if (!empty($f)) { - $att[] = clone($f); - } + + $f2ps = Memcached_DataObject::listGet('File_to_post', 'post_id', array($this->id)); + + $ids = array(); + + foreach ($f2ps[$this->id] as $f2p) { + $ids[] = $f2p->file_id; } + + $files = Memcached_DataObject::multiGet('File', 'id', $ids); - return $att; + $this->_attachments = $files->fetchAll(); + + return $this->_attachments; } + function _setAttachments($attachments) + { + $this->_attachments = $attachments; + } function publicStream($offset=0, $limit=20, $since_id=0, $max_id=0) { @@ -961,10 +1008,7 @@ class Notice extends Memcached_DataObject $users = $ptag->getUserSubscribers(); foreach ($users as $id) { if (!array_key_exists($id, $ni)) { - $user = User::staticGet('id', $id); - if (!$user->hasBlocked($profile)) { - $ni[$id] = NOTICE_INBOX_SOURCE_PROFILE_TAG; - } + $ni[$id] = NOTICE_INBOX_SOURCE_PROFILE_TAG; } } } @@ -973,23 +1017,30 @@ class Notice extends Memcached_DataObject if (!array_key_exists($recipient, $ni)) { $ni[$recipient] = NOTICE_INBOX_SOURCE_REPLY; } + } - // Exclude any deleted, non-local, or blocking recipients. - $profile = $this->getProfile(); - $originalProfile = null; - if ($this->repeat_of) { - // Check blocks against the original notice's poster as well. - $original = Notice::staticGet('id', $this->repeat_of); - if ($original) { - $originalProfile = $original->getProfile(); - } + // Exclude any deleted, non-local, or blocking recipients. + $profile = $this->getProfile(); + $originalProfile = null; + if ($this->repeat_of) { + // Check blocks against the original notice's poster as well. + $original = Notice::staticGet('id', $this->repeat_of); + if ($original) { + $originalProfile = $original->getProfile(); } - foreach ($ni as $id => $source) { + } + + foreach ($ni as $id => $source) { + try { $user = User::staticGet('id', $id); - if (empty($user) || $user->hasBlocked($profile) || + if (empty($user) || + $user->hasBlocked($profile) || ($originalProfile && $user->hasBlocked($originalProfile))) { unset($ni[$id]); } + } catch (UserNoProfileException $e) { + // User doesn't have a profile; invalid; skip them. + unset($ni[$id]); } } @@ -1322,6 +1373,8 @@ class Notice extends Memcached_DataObject return $reply; } + protected $_replies = -1; + /** * Pull the complete list of @-reply targets for this notice. * @@ -1329,31 +1382,28 @@ class Notice extends Memcached_DataObject */ function getReplies() { - $keypart = sprintf('notice:reply_ids:%d', $this->id); - - $idstr = self::cacheGet($keypart); - - if ($idstr !== false) { - $ids = explode(',', $idstr); - } else { - $ids = array(); - - $reply = new Reply(); - $reply->selectAdd(); - $reply->selectAdd('profile_id'); - $reply->notice_id = $this->id; - - if ($reply->find()) { - while($reply->fetch()) { - $ids[] = $reply->profile_id; - } - } - self::cacheSet($keypart, implode(',', $ids)); + if ($this->_replies != -1) { + return $this->_replies; } + $replyMap = Memcached_DataObject::listGet('Reply', 'notice_id', array($this->id)); + + $ids = array(); + + foreach ($replyMap[$this->id] as $reply) { + $ids[] = $reply->profile_id; + } + + $this->_replies = $ids; + return $ids; } + function _setReplies($replies) + { + $this->_replies = $replies; + } + /** * Pull the complete list of @-reply targets for this notice. * @@ -1361,17 +1411,11 @@ class Notice extends Memcached_DataObject */ function getReplyProfiles() { - $ids = $this->getReplies(); - $profiles = array(); - - foreach ($ids as $id) { - $profile = Profile::staticGet('id', $id); - if (!empty($profile)) { - $profiles[] = $profile; - } - } + $ids = $this->getReplies(); - return $profiles; + $profiles = Profile::multiGet('id', $ids); + + return $profiles->fetchAll(); } /** @@ -1404,6 +1448,9 @@ class Notice extends Memcached_DataObject * * @return array of Group objects */ + + protected $_groups = -1; + function getGroups() { // Don't save groups for repeats @@ -1411,42 +1458,31 @@ class Notice extends Memcached_DataObject if (!empty($this->repeat_of)) { return array(); } + + if ($this->_groups != -1) + { + return $this->_groups; + } + + $gis = Memcached_DataObject::listGet('Group_inbox', 'notice_id', array($this->id)); $ids = array(); - $keypart = sprintf('notice:groups:%d', $this->id); - - $idstr = self::cacheGet($keypart); - - if ($idstr !== false) { - $ids = explode(',', $idstr); - } else { - $gi = new Group_inbox(); - - $gi->selectAdd(); - $gi->selectAdd('group_id'); - - $gi->notice_id = $this->id; - - if ($gi->find()) { - while ($gi->fetch()) { - $ids[] = $gi->group_id; - } - } - - self::cacheSet($keypart, implode(',', $ids)); - } - - $groups = array(); - - foreach ($ids as $id) { - $group = User_group::staticGet('id', $id); - if ($group) { - $groups[] = $group; - } - } - - return $groups; + foreach ($gis[$this->id] as $gi) + { + $ids[] = $gi->group_id; + } + + $groups = User_group::multiGet('id', $ids); + + $this->_groups = $groups->fetchAll(); + + return $this->_groups; + } + + function _setGroups($groups) + { + $this->_groups = $groups; } /** @@ -1457,7 +1493,7 @@ class Notice extends Memcached_DataObject * @return Activity activity object representing this Notice. */ - function asActivity($cur) + function asActivity($cur=null) { $act = self::cacheGet(Cache::codeKey('notice:as-activity:'.$this->id)); @@ -1468,22 +1504,28 @@ class Notice extends Memcached_DataObject if (Event::handle('StartNoticeAsActivity', array($this, &$act))) { + $act->id = TagURI::mint("post:".$this->id); + $act->time = strtotime($this->created); + $act->content = common_xml_safe_str($this->rendered); + $profile = $this->getProfile(); $act->actor = ActivityObject::fromProfile($profile); $act->actor->extra[] = $profile->profileInfo($cur); - $act->verb = ActivityVerb::POST; - $act->objects[] = ActivityObject::fromNotice($this); + + $act->verb = $this->verb; + + if ($this->repeat_of) { + $repeated = Notice::staticGet('id', $this->repeat_of); + if (!empty($repeated)) { + $act->objects[] = $repeated->asActivity($cur); + } + } else { + $act->objects[] = ActivityObject::fromNotice($this); + } // XXX: should this be handled by default processing for object entry? - $act->time = strtotime($this->created); - $act->link = $this->bestUrl(); - - $act->content = common_xml_safe_str($this->rendered); - $act->id = $this->uri; - $act->title = common_xml_safe_str($this->content); - // Categories $tags = $this->getTags(); @@ -1501,9 +1543,9 @@ class Notice extends Memcached_DataObject $attachments = $this->attachments(); foreach ($attachments as $attachment) { - $enclosure = $attachment->getEnclosure(); - if ($enclosure) { - $act->enclosures[] = $enclosure; + // Save local attachments + if (!empty($attachment->filename)) { + $act->attachments[] = ActivityObject::fromFile($attachment); } } @@ -1534,6 +1576,7 @@ class Notice extends Memcached_DataObject $rprofile = Profile::staticGet('id', $id); if (!empty($rprofile)) { $ctx->attention[] = $rprofile->getUri(); + $ctx->attentionType[$rprofile->getUri()] = ActivityObject::PERSON; } } @@ -1541,6 +1584,19 @@ class Notice extends Memcached_DataObject foreach ($groups as $group) { $ctx->attention[] = $group->getUri(); + $ctx->attentionType[$group->getUri()] = ActivityObject::GROUP; + } + + switch ($this->scope) { + case Notice::PUBLIC_SCOPE: + $ctx->attention[] = "http://activityschema.org/collection/public"; + $ctx->attentionType["http://activityschema.org/collection/public"] = ActivityObject::COLLECTION; + break; + case Notice::FOLLOWER_SCOPE: + $surl = common_local_url("subscribers", array('nickname' => $profile->nickname)); + $ctx->attention[] = $surl; + $ctx->attentionType[$surl] = ActivityObject::COLLECTION; + break; } // XXX: deprecated; use ActivityVerb::SHARE instead @@ -1549,12 +1605,20 @@ class Notice extends Memcached_DataObject if (!empty($this->repeat_of)) { $repeat = Notice::staticGet('id', $this->repeat_of); - $ctx->forwardID = $repeat->uri; - $ctx->forwardUrl = $repeat->bestUrl(); + if (!empty($repeat)) { + $ctx->forwardID = $repeat->uri; + $ctx->forwardUrl = $repeat->bestUrl(); + } } $act->context = $ctx; + $source = $this->getSource(); + + if ($source) { + $act->generator = ActivityObject::fromNoticeSource($source); + } + // Source $atom_feed = $profile->getAtomFeed(); @@ -1856,7 +1920,11 @@ class Notice extends Memcached_DataObject } else { $idstr = $cache->get(Cache::key('notice:repeats:'.$this->id)); if ($idstr !== false) { - $ids = explode(',', $idstr); + if (empty($idstr)) { + $ids = array(); + } else { + $ids = explode(',', $idstr); + } } else { $ids = $this->_repeatStreamDirect(100); $cache->set(Cache::key('notice:repeats:'.$this->id), implode(',', $ids)); @@ -1885,18 +1953,7 @@ class Notice extends Memcached_DataObject $notice->limit(0, $limit); } - $ids = array(); - - if ($notice->find()) { - while ($notice->fetch()) { - $ids[] = $notice->id; - } - } - - $notice->free(); - $notice = NULL; - - return $ids; + return $notice->fetchAll('id'); } function locationOptions($lat, $lon, $location_id, $location_ns, $profile = null) @@ -2332,7 +2389,11 @@ class Notice extends Memcached_DataObject $result = self::cacheGet($keypart); if ($result === false) { - $bResult = $this->_inScope($profile); + $bResult = false; + if (Event::handle('StartNoticeInScope', array($this, $profile, &$bResult))) { + $bResult = $this->_inScope($profile); + Event::handle('EndNoticeInScope', array($this, $profile, &$bResult)); + } $result = ($bResult) ? 1 : 0; self::cacheSet($keypart, $result, 0, 300); } @@ -2342,78 +2403,118 @@ class Notice extends Memcached_DataObject protected function _inScope($profile) { + if (!is_null($this->scope)) { + $scope = $this->scope; + } else { + $scope = self::defaultScope(); + } + // If there's no scope, anyone (even anon) is in scope. - if ($this->scope == 0) { - return true; - } + if ($scope == 0) { // Not private - // If there's scope, anon cannot be in scope + return !$this->isHiddenSpam($profile); - if (empty($profile)) { - return false; - } + } else { // Private, somehow - // Author is always in scope + // If there's scope, anon cannot be in scope - if ($this->profile_id == $profile->id) { - return true; - } - - // Only for users on this site - - if ($this->scope & Notice::SITE_SCOPE) { - $user = $profile->getUser(); - if (empty($user)) { + if (empty($profile)) { return false; } - } - // Only for users mentioned in the notice + // Author is always in scope - if ($this->scope & Notice::ADDRESSEE_SCOPE) { - - // XXX: just query for the single reply - - $replies = $this->getReplies(); - - if (!in_array($profile->id, $replies)) { - return false; + if ($this->profile_id == $profile->id) { + return true; } - } - // Only for members of the given group + // Only for users on this site - if ($this->scope & Notice::GROUP_SCOPE) { - - // XXX: just query for the single membership - - $groups = $this->getGroups(); - - $foundOne = false; - - foreach ($groups as $group) { - if ($profile->isMember($group)) { - $foundOne = true; - break; + if ($scope & Notice::SITE_SCOPE) { + $user = $profile->getUser(); + if (empty($user)) { + return false; } } - if (!$foundOne) { - return false; + // Only for users mentioned in the notice + + if ($scope & Notice::ADDRESSEE_SCOPE) { + + $repl = Reply::pkeyGet(array('notice_id' => $this->id, + 'profile_id' => $profile->id)); + + if (empty($repl)) { + return false; + } + } + + // Only for members of the given group + + if ($scope & Notice::GROUP_SCOPE) { + + // XXX: just query for the single membership + + $groups = $this->getGroups(); + + $foundOne = false; + + foreach ($groups as $group) { + if ($profile->isMember($group)) { + $foundOne = true; + break; + } + } + + if (!$foundOne) { + return false; + } + } + + // Only for followers of the author + + $author = null; + + if ($scope & Notice::FOLLOWER_SCOPE) { + + try { + $author = $this->getProfile(); + } catch (Exception $e) { + return false; + } + + if (!Subscription::exists($profile, $author)) { + return false; + } + } + + return !$this->isHiddenSpam($profile); + } + } + + function isHiddenSpam($profile) { + + // Hide posts by silenced users from everyone but moderators. + + if (common_config('notice', 'hidespam')) { + + try { + $author = $this->getProfile(); + } catch(Exception $e) { + // If we can't get an author, keep it hidden. + // XXX: technically not spam, but, whatever. + return true; + } + + if ($author->hasRole(Profile_role::SILENCED)) { + if (empty($profile) || (($profile->id !== $author->id) && (!$profile->hasRight(Right::REVIEWSPAM)))) { + return true; + } } } - // Only for followers of the author - - if ($this->scope & Notice::FOLLOWER_SCOPE) { - $author = $this->getProfile(); - if (!Subscription::exists($profile, $author)) { - return false; - } - } - - return true; + return false; } static function groupsFromText($text, $profile) @@ -2466,8 +2567,197 @@ class Notice extends Memcached_DataObject function __sleep() { $vars = parent::__sleep(); - $skip = array('_original', '_profile'); + $skip = array('_original', '_profile', '_groups', '_attachments', '_faves', '_replies', '_repeats'); return array_diff($vars, $skip); } + + static function defaultScope() + { + $scope = common_config('notice', 'defaultscope'); + if (is_null($scope)) { + if (common_config('site', 'private')) { + $scope = 1; + } else { + $scope = 0; + } + } + return $scope; + } + static function fillProfiles($notices) + { + $map = self::getProfiles($notices); + + foreach ($notices as $notice) { + if (array_key_exists($notice->profile_id, $map)) { + $notice->_setProfile($map[$notice->profile_id]); + } + } + + return array_values($map); + } + + static function getProfiles(&$notices) + { + $ids = array(); + foreach ($notices as $notice) { + $ids[] = $notice->profile_id; + } + + $ids = array_unique($ids); + + return Memcached_DataObject::pivotGet('Profile', 'id', $ids); + } + + static function fillGroups(&$notices) + { + $ids = self::_idsOf($notices); + + $gis = Memcached_DataObject::listGet('Group_inbox', 'notice_id', $ids); + + $gids = array(); + + foreach ($gis as $id => $gi) + { + foreach ($gi as $g) + { + $gids[] = $g->group_id; + } + } + + $gids = array_unique($gids); + + $group = Memcached_DataObject::pivotGet('User_group', 'id', $gids); + + foreach ($notices as $notice) + { + $grps = array(); + $gi = $gis[$notice->id]; + foreach ($gi as $g) { + $grps[] = $group[$g->group_id]; + } + $notice->_setGroups($grps); + } + } + + static function _idsOf(&$notices) + { + $ids = array(); + foreach ($notices as $notice) { + $ids[] = $notice->id; + } + $ids = array_unique($ids); + return $ids; + } + + static function fillAttachments(&$notices) + { + $ids = self::_idsOf($notices); + + $f2pMap = Memcached_DataObject::listGet('File_to_post', 'post_id', $ids); + + $fileIds = array(); + + foreach ($f2pMap as $noticeId => $f2ps) { + foreach ($f2ps as $f2p) { + $fileIds[] = $f2p->file_id; + } + } + + $fileIds = array_unique($fileIds); + + $fileMap = Memcached_DataObject::pivotGet('File', 'id', $fileIds); + + foreach ($notices as $notice) + { + $files = array(); + $f2ps = $f2pMap[$notice->id]; + foreach ($f2ps as $f2p) { + $files[] = $fileMap[$f2p->file_id]; + } + $notice->_setAttachments($files); + } + } + + protected $_faves; + + /** + * All faves of this notice + * + * @return array Array of Fave objects + */ + + function getFaves() + { + if (isset($this->_faves) && is_array($this->_faves)) { + return $this->_faves; + } + $faveMap = Memcached_DataObject::listGet('Fave', 'notice_id', array($this->id)); + $this->_faves = $faveMap[$this->id]; + return $this->_faves; + } + + function _setFaves($faves) + { + $this->_faves = $faves; + } + + static function fillFaves(&$notices) + { + $ids = self::_idsOf($notices); + $faveMap = Memcached_DataObject::listGet('Fave', 'notice_id', $ids); + $cnt = 0; + $faved = array(); + foreach ($faveMap as $id => $faves) { + $cnt += count($faves); + if (count($faves) > 0) { + $faved[] = $id; + } + } + foreach ($notices as $notice) { + $faves = $faveMap[$notice->id]; + $notice->_setFaves($faves); + } + } + + static function fillReplies(&$notices) + { + $ids = self::_idsOf($notices); + $replyMap = Memcached_DataObject::listGet('Reply', 'notice_id', $ids); + foreach ($notices as $notice) { + $replies = $replyMap[$notice->id]; + $ids = array(); + foreach ($replies as $reply) { + $ids[] = $reply->profile_id; + } + $notice->_setReplies($ids); + } + } + + protected $_repeats; + + function getRepeats() + { + if (isset($this->_repeats) && is_array($this->_repeats)) { + return $this->_repeats; + } + $repeatMap = Memcached_DataObject::listGet('Notice', 'repeat_of', array($this->id)); + $this->_repeats = $repeatMap[$this->id]; + return $this->_repeats; + } + + function _setRepeats($repeats) + { + $this->_repeats = $repeats; + } + + static function fillRepeats(&$notices) + { + $ids = self::_idsOf($notices); + $repeatMap = Memcached_DataObject::listGet('Notice', 'repeat_of', $ids); + foreach ($notices as $notice) { + $repeats = $repeatMap[$notice->id]; + $notice->_setRepeats($repeats); + } + } } diff --git a/classes/Notice_inbox.php b/classes/Notice_inbox.php index 47ed6b22db..dcaf2f33b1 100644 --- a/classes/Notice_inbox.php +++ b/classes/Notice_inbox.php @@ -31,7 +31,7 @@ define('NOTICE_INBOX_GC_MAX', 12800); define('NOTICE_INBOX_LIMIT', 1000); define('NOTICE_INBOX_SOFT_LIMIT', 1000); -class Notice_inbox extends Memcached_DataObject +class Notice_inbox extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -49,6 +49,27 @@ class Notice_inbox extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + public static function schemaDef() + { + return array( + 'description' => 'Obsolete; old entries here are converted to packed entries in the inbox table since 0.9', + 'fields' => array( + 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user receiving the message'), + 'notice_id' => array('type' => 'int', 'not null' => true, 'description' => 'notice received'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date the notice was created'), + 'source' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'reason it is in the inbox, 1=subscription'), + ), + 'primary key' => array('user_id', 'notice_id'), + 'foreign keys' => array( + 'notice_inbox_user_id_fkey' => array('user', array('user_id' => 'id')), + 'notice_inbox_notice_id_fkey' => array('notice', array('notice_id' => 'id')), + ), + 'indexes' => array( + 'notice_inbox_notice_id_idx' => array('notice_id'), + ), + ); + } + function stream($user_id, $offset, $limit, $since_id, $max_id, $own=false) { throw new Exception('Notice_inbox no longer used; use Inbox'); diff --git a/classes/Notice_source.php b/classes/Notice_source.php index 43893ebe18..a6649f5fba 100644 --- a/classes/Notice_source.php +++ b/classes/Notice_source.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Notice_source extends Memcached_DataObject +class Notice_source extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -22,4 +22,19 @@ class Notice_source extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + + public static function schemaDef() + { + return array( + 'fields' => array( + 'code' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'source code'), + 'name' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'name of the source'), + 'url' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'url to link to'), + 'notice_id' => array('type' => 'int', 'not null' => true, 'description' => 'date this record was created'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('code'), + ); + } } diff --git a/classes/Notice_tag.php b/classes/Notice_tag.php index 809403a9bd..b9cbcd1069 100644 --- a/classes/Notice_tag.php +++ b/classes/Notice_tag.php @@ -19,7 +19,7 @@ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Notice_tag extends Memcached_DataObject +class Notice_tag extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -36,6 +36,27 @@ class Notice_tag extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + public static function schemaDef() + { + return array( + 'description' => 'Hash tags', + 'fields' => array( + 'tag' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'hash tag associated with this notice'), + 'notice_id' => array('type' => 'int', 'not null' => true, 'description' => 'notice tagged'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + ), + 'primary key' => array('tag', 'notice_id'), + 'foreign keys' => array( + 'notice_tag_notice_id_fkey' => array('notice', array('notice_id' => 'id')), + ), + 'indexes' => array( + 'notice_tag_created_idx' => array('created'), + 'notice_tag_notice_id_idx' => array('notice_id'), + 'notice_tag_tag_created_notice_id_idx' => array('tag', 'created', 'notice_id') + ), + ); + } + static function getStream($tag, $offset=0, $limit=20, $sinceId=0, $maxId=0) { $stream = new TagNoticeStream($tag); diff --git a/classes/Oauth_application.php b/classes/Oauth_application.php index f1d4fb7a6f..15faffe2fb 100644 --- a/classes/Oauth_application.php +++ b/classes/Oauth_application.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Oauth_application extends Memcached_DataObject +class Oauth_application extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -159,4 +159,35 @@ class Oauth_application extends Memcached_DataObject $oauser->application_id = $this->id; $oauser->delete(); } + + public static function schemaDef() + { + return array( + 'description' => 'OAuth application registration record', + 'fields' => array( + 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'unique identifier'), + 'owner' => array('type' => 'int', 'not null' => true, 'description' => 'owner of the application'), + 'consumer_key' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'application consumer key'), + 'name' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'name of the application'), + 'description' => array('type' => 'varchar', 'length' => 255, 'description' => 'description of the application'), + 'icon' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'application icon'), + 'source_url' => array('type' => 'varchar', 'length' => 255, 'description' => 'application homepage - used for source link'), + 'organization' => array('type' => 'varchar', 'length' => 255, 'description' => 'name of the organization running the application'), + 'homepage' => array('type' => 'varchar', 'length' => 255, 'description' => 'homepage for the organization'), + 'callback_url' => array('type' => 'varchar', 'length' => 255, 'description' => 'url to redirect to after authentication'), + 'type' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'type of app, 1 = browser, 2 = desktop'), + 'access_type' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'default access type, bit 1 = read, bit 2 = write'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('id'), + 'unique keys' => array( + 'oauth_application_name_key' => array('name'), // in the long run, we should perhaps not force these unique, and use another source id + ), + 'foreign keys' => array( + 'oauth_application_owner_fkey' => array('profile', array('owner' => 'id')), // Are remote users allowed to create oauth application records? + 'oauth_application_consumer_key_fkey' => array('consumer', array('consumer_key' => 'consumer_key')), + ), + ); + } } diff --git a/classes/Oauth_application_user.php b/classes/Oauth_application_user.php index 834e38d2be..4d25672465 100644 --- a/classes/Oauth_application_user.php +++ b/classes/Oauth_application_user.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Oauth_application_user extends Memcached_DataObject +class Oauth_application_user extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -24,6 +24,25 @@ class Oauth_application_user extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + public static function schemaDef() + { + return array( + 'fields' => array( + 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'user of the application'), + 'application_id' => array('type' => 'int', 'not null' => true, 'description' => 'id of the application'), + 'access_type' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'access type, bit 1 = read, bit 2 = write'), + 'token' => array('type' => 'varchar', 'length' => 255, 'description' => 'request or access token'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('profile_id', 'application_id'), + 'foreign keys' => array( + 'oauth_application_user_profile_id_fkey' => array('profile', array('profile_id' => 'id')), + 'oauth_application_user_application_id_fkey' => array('oauth_application', array('application_id' => 'id')), + ), + ); + } + static function getByUserAndToken($user, $token) { if (empty($user) || empty($token)) { diff --git a/classes/Oauth_token_association.php b/classes/Oauth_token_association.php index 66be22b5d3..17327d4b01 100644 --- a/classes/Oauth_token_association.php +++ b/classes/Oauth_token_association.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR . '/classes/Memcached_DataObject.php'; -class Oauth_token_association extends Memcached_DataObject +class Oauth_token_association extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -39,4 +39,23 @@ class Oauth_token_association extends Memcached_DataObject return empty($result) ? null : $oau; } + + public static function schemaDef() + { + return array( + 'description' => 'Associate an application ID and profile ID with an OAuth token', + 'fields' => array( + 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'associated user'), + 'application_id' => array('type' => 'int', 'not null' => true, 'description' => 'the application'), + 'token' => array('type' => 'varchar', 'length' => '255', 'not null' => true, 'description' => 'token used for this association'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('profile_id', 'application_id', 'token'), + 'foreign keys' => array( + 'oauth_token_association_profile_fkey' => array('profile_id', array('profile' => 'id')), + 'oauth_token_association_application_fkey' => array('application_id', array('application' => 'id')), + ) + ); + } } diff --git a/classes/Old_school_prefs.php b/classes/Old_school_prefs.php new file mode 100644 index 0000000000..29e13ddc74 --- /dev/null +++ b/classes/Old_school_prefs.php @@ -0,0 +1,88 @@ +. + * + * @category UI + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + // This check helps protect against security problems; + // your code file can't be executed directly from the web. + exit(1); +} + +/** + * Separate table for storing UI preferences + * + * @category UI + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +class Old_school_prefs extends Managed_DataObject +{ + public $__table = 'old_school_prefs'; // table name + public $user_id; + public $stream_mode_only; + public $conversation_tree; + public $stream_nicknames; + public $created; + public $modified; + + public static function schemaDef() + { + return array( + 'fields' => array( + 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user who has the preference'), + 'stream_mode_only' => array('type' => 'int', + 'size' => 'tiny', + 'default' => 1, + 'description' => 'No conversation streams'), + 'conversation_tree' => array('type' => 'int', + 'size' => 'tiny', + 'default' => 1, + 'description' => 'Hierarchical tree view for conversations'), + 'stream_nicknames' => array('type' => 'int', + 'size' => 'tiny', + 'default' => 1, + 'description' => 'Show nicknames for authors and addressees in streams'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('user_id'), + 'foreign keys' => array( + 'old_school_prefs_user_id_fkey' => array('user', array('user_id' => 'id')), + ), + ); + } + + function staticGet($k,$v=NULL) { + return Memcached_DataObject::staticGet('Old_school_prefs',$k,$v); + } +} diff --git a/classes/Profile.php b/classes/Profile.php index 2638f745f7..8a5be5f358 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -1,7 +1,7 @@ 'local and remote users have profiles', + 'fields' => array( + 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'unique identifier'), + 'nickname' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'nickname or username', 'collate' => 'utf8_general_ci'), + 'fullname' => array('type' => 'varchar', 'length' => 255, 'description' => 'display name', 'collate' => 'utf8_general_ci'), + 'profileurl' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL, cached so we dont regenerate'), + 'homepage' => array('type' => 'varchar', 'length' => 255, 'description' => 'identifying URL', 'collate' => 'utf8_general_ci'), + 'bio' => array('type' => 'text', 'description' => 'descriptive biography', 'collate' => 'utf8_general_ci'), + 'location' => array('type' => 'varchar', 'length' => 255, 'description' => 'physical location', 'collate' => 'utf8_general_ci'), + 'lat' => array('type' => 'numeric', 'precision' => 10, 'scale' => 7, 'description' => 'latitude'), + 'lon' => array('type' => 'numeric', 'precision' => 10, 'scale' => 7, 'description' => 'longitude'), + 'location_id' => array('type' => 'int', 'description' => 'location id if possible'), + 'location_ns' => array('type' => 'int', 'description' => 'namespace for location'), + + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('id'), + 'indexes' => array( + 'profile_nickname_idx' => array('nickname'), + ) + ); + + // Add a fulltext index + + if (common_config('search', 'type') == 'fulltext') { + $def['fulltext indexes'] = array('nickname' => array('nickname', 'fullname', 'location', 'bio', 'homepage')); + } + + return $def; + } + + function multiGet($keyCol, $keyVals, $skipNulls=true) + { + return parent::multiGet('Profile', $keyCol, $keyVals, $skipNulls); + } + /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE @@ -63,24 +103,61 @@ class Profile extends Memcached_DataObject return $this->_user; } + protected $_avatars; + function getAvatar($width, $height=null) { if (is_null($height)) { $height = $width; } - $avatar = null; + $avatar = $this->_getAvatar($width); - if (Event::handle('StartProfileGetAvatar', array($this, $width, &$avatar))) { - $avatar = Avatar::pkeyGet(array('profile_id' => $this->id, - 'width' => $width, - 'height' => $height)); - Event::handle('EndProfileGetAvatar', array($this, $width, &$avatar)); + if (empty($avatar)) { + + if (Event::handle('StartProfileGetAvatar', array($this, $width, &$avatar))) { + $avatar = Avatar::pkeyGet( + array( + 'profile_id' => $this->id, + 'width' => $width, + 'height' => $height + ) + ); + Event::handle('EndProfileGetAvatar', array($this, $width, &$avatar)); + } + + $this->_fillAvatar($width, $avatar); } return $avatar; } + // XXX: @Fix me gargargar + function _getAvatar($width) + { + if (empty($this->_avatars)) { + $this->_avatars = array(); + } + + // GAR! I cannot figure out where _avatars gets pre-filled with the avatar from + // the previously used profile! Please shoot me now! --Zach + if (array_key_exists($width, $this->_avatars)) { + // Don't return cached avatar unless it's really for this profile + if ($this->_avatars[$width]->profile_id == $this->id) { + return $this->_avatars[$width]; + } + } + + return null; + } + + function _fillAvatar($width, $avatar) + { + //common_debug("Storing avatar of width: {$avatar->width} and profile_id {$avatar->profile_id} in profile {$this->id}."); + $this->_avatars[$width] = $avatar; + + } + function getOriginalAvatar() { $avatar = DB_DataObject::factory('avatar'); @@ -225,9 +302,14 @@ class Profile extends Memcached_DataObject function isMember($group) { - $gm = Group_member::pkeyGet(array('profile_id' => $this->id, - 'group_id' => $group->id)); - return (!empty($gm)); + $groups = $this->getGroups(0, null); + $gs = $groups->fetchAll(); + foreach ($gs as $g) { + if ($group->id == $g->id) { + return true; + } + } + return false; } function isAdmin($group) @@ -268,16 +350,11 @@ class Profile extends Memcached_DataObject self::cacheSet($keypart, implode(',', $ids)); } - $groups = array(); - - foreach ($ids as $id) { - $group = User_group::staticGet('id', $id); - if (!empty($group)) { - $groups[] = $group; - } + if (!is_null($offset) && !is_null($limit)) { + $ids = array_slice($ids, $offset, $limit); } - return new ArrayWrapper($groups); + return User_group::multiGet('id', $ids); } function isTagged($peopletag) @@ -383,41 +460,55 @@ class Profile extends Memcached_DataObject return new ArrayWrapper($lists); } + /** + * Get tags that other people put on this profile, in reverse-chron order + * + * @param (Profile|User) $auth_user Authorized user (used for privacy) + * @param int $offset Offset from latest + * @param int $limit Max number to get + * @param datetime $since_id max date + * @param datetime $max_id min date + * + * @return Profile_list resulting lists + */ + function getOtherTags($auth_user=null, $offset=0, $limit=null, $since_id=0, $max_id=0) { - $lists = new Profile_list(); + $list = new Profile_list(); - $tags = new Profile_tag(); - $tags->tagged = $this->id; + $qry = sprintf('select profile_list.*, unix_timestamp(profile_tag.modified) as "cursor" ' . + 'from profile_tag join profile_list '. + 'on (profile_tag.tagger = profile_list.tagger ' . + ' and profile_tag.tag = profile_list.tag) ' . + 'where profile_tag.tagged = %d ', + $this->id); - $lists->joinAdd($tags); - #@fixme: postgres (round(date_part('epoch', my_date))) - $lists->selectAdd('unix_timestamp(profile_tag.modified) as "cursor"'); if ($auth_user instanceof User || $auth_user instanceof Profile) { - $lists->whereAdd('( ( profile_list.private = false ) ' . - 'OR ( profile_list.tagger = ' . $auth_user->id . ' AND ' . - 'profile_list.private = true ) )'); + $qry .= sprintf('AND ( ( profile_list.private = false ) ' . + 'OR ( profile_list.tagger = %d AND ' . + 'profile_list.private = true ) )', + $auth_user->id); } else { - $lists->private = false; + $qry .= 'AND profile_list.private = 0 '; } - if ($since_id>0) { - $lists->whereAdd('cursor > '.$since_id); + if ($since_id > 0) { + $qry .= sprintf('AND (cursor > %d) ', $since_id); } - if ($max_id>0) { - $lists->whereAdd('cursor <= '.$max_id); + if ($max_id > 0) { + $qry .= sprintf('AND (cursor < %d) ', $max_id); } - if($offset>=0 && !is_null($limit)) { - $lists->limit($offset, $limit); + $qry .= 'ORDER BY profile_tag.modified DESC '; + + if ($offset >= 0 && !is_null($limit)) { + $qry .= sprintf('LIMIT %d OFFSET %d ', $limit, $offset); } - $lists->orderBy('profile_tag.modified DESC'); - $lists->find(); - - return $lists; + $list->query($qry); + return $list; } function getPrivateTags($offset=0, $limit=null, $since_id=0, $max_id=0) @@ -463,7 +554,8 @@ class Profile extends Memcached_DataObject $lists = new Profile_list(); $subs = new Profile_tag_subscription(); - $lists->joinAdd($subs); + $lists->joinAdd('id', 'profile_tag_subscription:profile_tag_id'); + #@fixme: postgres (round(date_part('epoch', my_date))) $lists->selectAdd('unix_timestamp(profile_tag_subscription.created) as "cursor"'); @@ -503,6 +595,8 @@ class Profile extends Memcached_DataObject if (Event::handle('StartJoinGroup', array($group, $this))) { $join = Group_member::join($group->id, $this->id); self::blow('profile:groups:%d', $this->id); + self::blow('group:member_ids:%d', $group->id); + self::blow('group:member_count:%d', $group->id); Event::handle('EndJoinGroup', array($group, $this)); } } @@ -523,6 +617,8 @@ class Profile extends Memcached_DataObject if (Event::handle('StartLeaveGroup', array($group, $this))) { Group_member::leave($group->id, $this->id); self::blow('profile:groups:%d', $this->id); + self::blow('group:member_ids:%d', $group->id); + self::blow('group:member_count:%d', $group->id); Event::handle('EndLeaveGroup', array($group, $this)); } } @@ -590,7 +686,7 @@ class Profile extends Memcached_DataObject $profile = new Profile(); $tagged = array(); - $cnt = $profile->query(sprintf($qry, $this->id, $this->id, $tag)); + $cnt = $profile->query(sprintf($qry, $this->id, $this->id, $profile->escape($tag))); while ($profile->fetch()) { $tagged[] = clone($profile); @@ -728,7 +824,7 @@ class Profile extends Memcached_DataObject $faves = new Fave(); $faves->user_id = $this->id; - $cnt = (int) $faves->count('distinct notice_id'); + $cnt = (int) $faves->count('notice_id'); if (!empty($c)) { $c->set(Cache::key('profile:fave_count:'.$this->id), $cnt); @@ -1047,11 +1143,27 @@ class Profile extends Memcached_DataObject function silence() { $this->grantRole(Profile_role::SILENCED); + if (common_config('notice', 'hidespam')) { + $this->flushVisibility(); + } } function unsilence() { $this->revokeRole(Profile_role::SILENCED); + if (common_config('notice', 'hidespam')) { + $this->flushVisibility(); + } + } + + function flushVisibility() + { + // Get all notices + $stream = new ProfileNoticeStream($this, $this); + $ids = $stream->getNoticeIds(0, CachingNoticeStream::CACHE_WINDOW); + foreach ($ids as $id) { + self::blow('notice:in-scope-for:%d:null', $id); + } } /** @@ -1082,6 +1194,8 @@ class Profile extends Memcached_DataObject case Right::SILENCEUSER: case Right::DELETEUSER: case Right::DELETEGROUP: + case Right::TRAINSPAM: + case Right::REVIEWSPAM: $result = $this->hasRole(Profile_role::MODERATOR); break; case Right::CONFIGURESITE: @@ -1240,13 +1354,8 @@ class Profile extends Memcached_DataObject if (!empty($user)) { $uri = $user->uri; - } else { - // return OMB profile if any - $remote = Remote_profile::staticGet('id', $this->id); - if (!empty($remote)) { - $uri = $remote->uri; - } } + Event::handle('EndGetProfileUri', array($this, &$uri)); } @@ -1291,11 +1400,6 @@ class Profile extends Memcached_DataObject $user = User::staticGet('uri', $uri); if (!empty($user)) { $profile = $user->getProfile(); - } else { - $remote_profile = Remote_profile::staticGet('uri', $uri); - if (!empty($remote_profile)) { - $profile = Profile::staticGet('id', $remote_profile->profile_id); - } } Event::handle('EndGetProfileFromURI', array($uri, $profile)); } @@ -1367,7 +1471,37 @@ class Profile extends Memcached_DataObject function __sleep() { $vars = parent::__sleep(); - $skip = array('_user'); + $skip = array('_user', '_avatars'); return array_diff($vars, $skip); } + + static function fillAvatars(&$profiles, $width) + { + $ids = array(); + foreach ($profiles as $profile) { + if (!empty($profile)) { + $ids[] = $profile->id; + } + } + + $avatars = Avatar::pivotGet('profile_id', $ids, array('width' => $width, + 'height' => $width)); + + foreach ($profiles as $profile) { + if (!empty($profile)) { // ??? + $profile->_fillAvatar($width, $avatars[$profile->id]); + } + } + } + + // Can't seem to find how to fix this. + + function getProfile() + { + return $this; + } + + static function pivotGet($key, $values, $otherCols=array()) { + return Memcached_DataObject::pivotGet('Profile', $key, $values, $otherCols); + } } diff --git a/classes/Profile_block.php b/classes/Profile_block.php index 2d87edaa0a..8506283462 100644 --- a/classes/Profile_block.php +++ b/classes/Profile_block.php @@ -25,7 +25,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Profile_block extends Memcached_DataObject +class Profile_block extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -42,6 +42,22 @@ class Profile_block extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + public static function schemaDef() + { + return array( + 'fields' => array( + 'blocker' => array('type' => 'int', 'not null' => true, 'description' => 'user making the block'), + 'blocked' => array('type' => 'int', 'not null' => true, 'description' => 'profile that is blocked'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date of blocking'), + ), + 'foreign keys' => array( + 'profile_block_blocker_fkey' => array('user', array('blocker' => 'id')), + 'profile_block_blocked_fkey' => array('profile', array('blocked' => 'id')), + ), + 'primary key' => array('blocker', 'blocked'), + ); + } + function get($blocker, $blocked) { return Memcached_DataObject::pkeyGet('Profile_block', diff --git a/classes/Profile_list.php b/classes/Profile_list.php index 17c2ffd4f4..27001978b6 100644 --- a/classes/Profile_list.php +++ b/classes/Profile_list.php @@ -30,7 +30,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Profile_list extends Memcached_DataObject +class Profile_list extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -49,11 +49,46 @@ class Profile_list extends Memcached_DataObject public $subscriber_count; // smallint /* Static get */ - function staticGet($k,$v=NULL) { return DB_DataObject::staticGet('Profile_list',$k,$v); } + function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Profile_list',$k,$v); } /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + public static function schemaDef() + { + return array( + 'fields' => array( + 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'unique identifier'), + 'tagger' => array('type' => 'int', 'not null' => true, 'description' => 'user making the tag'), + 'tag' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'people tag'), + 'description' => array('type' => 'text', 'description' => 'description of the people tag'), + 'private' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'is this tag private'), + + 'created' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date the tag was added'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date the tag was modified'), + + 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universal identifier'), + 'mainpage' => array('type' => 'varchar', 'length' => 255, 'description' => 'page to link to'), + 'tagged_count' => array('type' => 'int', 'default' => 0, 'description' => 'number of people tagged with this tag by this user'), + 'subscriber_count' => array('type' => 'int', 'default' => 0, 'description' => 'number of subscribers to this tag'), + ), + 'primary key' => array('tagger', 'tag'), + 'unique keys' => array( + 'profile_list_id_key' => array('id') + ), + 'foreign keys' => array( + 'profile_list_tagger_fkey' => array('profile', array('tagger' => 'id')), + ), + 'indexes' => array( + 'profile_list_modified_idx' => array('modified'), + 'profile_list_tag_idx' => array('tag'), + 'profile_list_tagger_tag_idx' => array('tagger', 'tag'), + 'profile_list_tagged_count_idx' => array('tagged_count'), + 'profile_list_subscriber_count_idx' => array('subscriber_count'), + ), + ); + } + /** * return a profile_list record, given its tag and tagger. * @@ -185,10 +220,12 @@ class Profile_list extends Memcached_DataObject function getSubscribers($offset=0, $limit=null, $since=0, $upto=0) { $subs = new Profile(); - $sub = new Profile_tag_subscription(); - $sub->profile_tag_id = $this->id; - $subs->joinAdd($sub); + $subs->joinAdd( + array('id', 'profile_tag_subscription:profile_id') + ); + $subs->whereAdd('profile_tag_subscription.profile_tag_id = ' . $this->id); + $subs->selectAdd('unix_timestamp(profile_tag_subscription.' . 'created) as "cursor"'); diff --git a/classes/Profile_role.php b/classes/Profile_role.php index e7aa1f0f06..61ec9ba9df 100644 --- a/classes/Profile_role.php +++ b/classes/Profile_role.php @@ -27,7 +27,7 @@ if (!defined('STATUSNET')) { require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Profile_role extends Memcached_DataObject +class Profile_role extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -43,6 +43,22 @@ class Profile_role extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + public static function schemaDef() + { + return array( + 'fields' => array( + 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'account having the role'), + 'role' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'string representing the role'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date the role was granted'), + ), + 'primary key' => array('profile_id', 'role'), + 'foreign keys' => array( + 'profile_role_profile_id_fkey' => array('profile', array('profile_id' => 'id')), + ), + 'indexes' => array('profile_role_role_created_profile_id_idx' => array('role', 'created', 'profile_id')), + ); + } + function pkeyGet($kv) { return Memcached_DataObject::pkeyGet('Profile_role', $kv); diff --git a/classes/Profile_tag.php b/classes/Profile_tag.php index 9e475e83ec..75cca8c22c 100644 --- a/classes/Profile_tag.php +++ b/classes/Profile_tag.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Profile_tag extends Memcached_DataObject +class Profile_tag extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -22,6 +22,30 @@ class Profile_tag extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + public static function schemaDef() + { + return array( + + 'fields' => array( + 'tagger' => array('type' => 'int', 'not null' => true, 'description' => 'user making the tag'), + 'tagged' => array('type' => 'int', 'not null' => true, 'description' => 'profile tagged'), + 'tag' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'hash tag associated with this notice'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date the tag was added'), + ), + 'primary key' => array('tagger', 'tagged', 'tag'), + 'foreign keys' => array( + 'profile_tag_tagger_fkey' => array('profile', array('tagger' => 'id')), + 'profile_tag_tagged_fkey' => array('profile', array('tagged' => 'id')), + 'profile_tag_tag_fkey' => array('profile_list', array('tag' => 'tag')), + ), + 'indexes' => array( + 'profile_tag_modified_idx' => array('modified'), + 'profile_tag_tagger_tag_idx' => array('tagger', 'tag'), + 'profile_tag_tagged_idx' => array('tagged'), + ), + ); + } + function pkeyGet($kv) { return Memcached_DataObject::pkeyGet('Profile_tag', $kv); } @@ -55,20 +79,17 @@ class Profile_tag extends Memcached_DataObject return $tags; } - $profile_tag = new Profile_tag(); - $profile_list->tagger = $tagger; - $profile_tag->tagged = $tagged; + $qry = 'select profile_list.* from profile_list left join '. + 'profile_tag on (profile_list.tag = profile_tag.tag and '. + 'profile_list.tagger = profile_tag.tagger) where '. + 'profile_tag.tagger = %d and profile_tag.tagged = %d '; + $qry = sprintf($qry, $tagger, $tagged); - $profile_list->selectAdd(); + if (!$include_priv) { + $qry .= ' and profile_list.private = 0'; + } - // only fetch id, tag, mainpage and - // private hoping this will be faster - $profile_list->selectAdd('profile_list.id, ' . - 'profile_list.tag, ' . - 'profile_list.mainpage, ' . - 'profile_list.private'); - $profile_list->joinAdd($profile_tag); - $profile_list->find(); + $profile_list->query($qry); Profile_list::setCache($key, $profile_list); @@ -78,23 +99,26 @@ class Profile_tag extends Memcached_DataObject static function getTagsArray($tagger, $tagged, $auth_user_id=null) { $ptag = new Profile_tag(); - $ptag->tagger = $tagger; - $ptag->tagged = $tagged; - if ($tagger != $auth_user_id) { - $list = new Profile_list(); - $list->private = false; - $ptag->joinAdd($list); - $ptag->selectAdd(); - $ptag->selectAdd('profile_tag.tag'); + $qry = sprintf('select profile_tag.tag '. + 'from profile_tag join profile_list '. + ' on (profile_tag.tagger = profile_list.tagger ' . + ' and profile_tag.tag = profile_list.tag) ' . + 'where profile_tag.tagger = %d ' . + 'and profile_tag.tagged = %d ', + $tagger, $tagged); + + if ($auth_user_id != $tagger) { + $qry .= 'and profile_list.private = 0'; } $tags = array(); - $ptag->find(); + + $ptag->query($qry); + while ($ptag->fetch()) { $tags[] = $ptag->tag; } - $ptag->free(); return $tags; } @@ -169,7 +193,7 @@ class Profile_tag extends Memcached_DataObject if ($profile_list->taggedCount() >= common_config('peopletag', 'maxpeople')) { // TRANS: Client exception thrown when trying to add more people than allowed to a list. throw new ClientException(sprintf(_('You already have %1$d or more people in list %2$s, ' . - 'which is the maximum allowed number.' . + 'which is the maximum allowed number. ' . 'Try unlisting others first.'), common_config('peopletag', 'maxpeople'), $tag)); return false; @@ -260,8 +284,11 @@ class Profile_tag extends Memcached_DataObject 'tag = "%s", tagger = "%s" ' . 'WHERE tag = "%s" ' . 'AND tagger = "%s"'; - $result = $tags->query(sprintf($qry, $new->tag, $new->tagger, - $orig->tag, $orig->tagger)); + $result = $tags->query(sprintf($qry, + $tags->escape($new->tag), + $tags->escape($new->tagger), + $tags->escape($orig->tag), + $tags->escape($orig->tagger))); if (!$result) { common_log_db_error($tags, 'UPDATE', __FILE__); @@ -283,8 +310,8 @@ class Profile_tag extends Memcached_DataObject $profile->query('SELECT profile.* ' . 'FROM profile JOIN profile_tag ' . 'ON profile.id = profile_tag.tagged ' . - 'WHERE profile_tag.tagger = ' . $tagger . ' ' . - 'AND profile_tag.tag = "' . $tag . '" '); + 'WHERE profile_tag.tagger = ' . $profile->escape($tagger) . ' ' . + 'AND profile_tag.tag = "' . $profile->escape($tag) . '" '); $tagged = array(); while ($profile->fetch()) { $tagged[] = clone($profile); diff --git a/classes/Profile_tag_subscription.php b/classes/Profile_tag_subscription.php index 031405f531..ce4a57e870 100644 --- a/classes/Profile_tag_subscription.php +++ b/classes/Profile_tag_subscription.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Profile_tag_subscription extends Memcached_DataObject +class Profile_tag_subscription extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -22,6 +22,29 @@ class Profile_tag_subscription extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + public static function schemaDef() + { + return array( + 'fields' => array( + 'profile_tag_id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to profile_tag'), + 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to profile table'), + + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('profile_tag_id', 'profile_id'), + 'foreign keys' => array( + 'profile_tag_subscription_profile_list_id_fkey' => array('profile_list', array('profile_tag_id' => 'id')), + 'profile_tag_subscription_profile_id_fkey' => array('profile', array('profile_id' => 'id')), + ), + 'indexes' => array( + // @fixme probably we want a (profile_id, created) index here? + 'profile_tag_subscription_profile_id_idx' => array('profile_id'), + 'profile_tag_subscription_created_idx' => array('created'), + ), + ); + } + function pkeyGet($kv) { return Memcached_DataObject::pkeyGet('Profile_tag_subscription', $kv); diff --git a/classes/Queue_item.php b/classes/Queue_item.php index d17e512b96..e34a89d2e3 100644 --- a/classes/Queue_item.php +++ b/classes/Queue_item.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Queue_item extends Memcached_DataObject +class Queue_item extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -22,6 +22,23 @@ class Queue_item extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + public static function schemaDef() + { + return array( + 'fields' => array( + 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'unique identifier'), + 'frame' => array('type' => 'blob', 'not null' => true, 'description' => 'data: object reference or opaque string'), + 'transport' => array('type' => 'varchar', 'length' => 8, 'not null' => true, 'description' => 'queue for what? "email", "xmpp", "sms", "irc", ...'), // @fixme 8 chars is too short; bump up. + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'claimed' => array('type' => 'datetime', 'description' => 'date this item was claimed'), + ), + 'primary key' => array('id'), + 'indexes' => array( + 'queue_item_created_idx' => array('created'), + ), + ); + } + /** * @param mixed $transports name of a single queue or array of queues to pull from * If not specified, checks all queues in the system. diff --git a/classes/Related_group.php b/classes/Related_group.php index c00ad9c44e..67d6ce3fc7 100644 --- a/classes/Related_group.php +++ b/classes/Related_group.php @@ -3,7 +3,7 @@ * Table Definition for related_group */ -class Related_group extends Memcached_DataObject +class Related_group extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -18,4 +18,22 @@ class Related_group extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + + public static function schemaDef() + { + return array( + // @fixme description for related_group? + 'fields' => array( + 'group_id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to user_group'), + 'related_group_id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to user_group'), + + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + ), + 'primary key' => array('group_id', 'related_group_id'), + 'foreign keys' => array( + 'related_group_group_id_fkey' => array('user_group', array('group_id' => 'id')), + 'related_group_related_group_id_fkey' => array('user_group', array('related_group_id' => 'id')), + ), + ); + } } diff --git a/classes/Remember_me.php b/classes/Remember_me.php index 3df7a99831..6523ad8174 100644 --- a/classes/Remember_me.php +++ b/classes/Remember_me.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Remember_me extends Memcached_DataObject +class Remember_me extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -23,8 +23,18 @@ class Remember_me extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE - function sequenceKey() + public static function schemaDef() { - return array(false, false); - } + return array( + 'fields' => array( + 'code' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'good random code'), + 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user who is logged in'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('code'), + 'foreign keys' => array( + 'remember_me_user_id_fkey' => array('user', array('user_id' => 'id')), + ), + ); + } } diff --git a/classes/Remote_profile.php b/classes/Remote_profile.php index 1672e9f956..d59f97ada7 100644 --- a/classes/Remote_profile.php +++ b/classes/Remote_profile.php @@ -24,7 +24,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Remote_profile extends Memcached_DataObject +class Remote_profile extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -54,4 +54,26 @@ class Remote_profile extends Memcached_DataObject throw new Exception(_("Missing profile.")); } } + + public static function schemaDef() + { + return array( + 'description' => 'remote people (OMB)', + 'fields' => array( + 'id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to profile table'), + 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier, usually a tag URI'), + 'postnoticeurl' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL we use for posting notices'), + 'updateprofileurl' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL we use for updates to this profile'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('id'), + 'unique keys' => array( + 'remote_profile_uri_key' => array('uri'), + ), + 'foreign keys' => array( + 'remote_profile_id_fkey' => array('profile', array('id' => 'id')), + ), + ); + } } diff --git a/classes/Reply.php b/classes/Reply.php index 9ba623ba3f..f2c308fac4 100644 --- a/classes/Reply.php +++ b/classes/Reply.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Reply extends Memcached_DataObject +class Reply extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -22,6 +22,34 @@ class Reply extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + public static function schemaDef() + { + return array( + 'fields' => array( + 'notice_id' => array('type' => 'int', 'not null' => true, 'description' => 'notice that is the reply'), + 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'profile replied to'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + 'replied_id' => array('type' => 'int', 'description' => 'notice replied to (not used, see notice.reply_to)'), + ), + 'primary key' => array('notice_id', 'profile_id'), + 'foreign keys' => array( + 'reply_notice_id_fkey' => array('notice', array('notice_id' => 'id')), + 'reply_profile_id_fkey' => array('profile', array('profile_id' => 'id')), + ), + 'indexes' => array( + 'reply_notice_id_idx' => array('notice_id'), + 'reply_profile_id_idx' => array('profile_id'), + 'reply_replied_id_idx' => array('replied_id'), + 'reply_profile_id_modified_notice_id_idx' => array('profile_id', 'modified', 'notice_id') + ), + ); + } + + function pkeyGet($kv) + { + return Memcached_DataObject::pkeyGet('Reply',$kv); + } + /** * Wrapper for record insertion to update related caches */ diff --git a/classes/Schema_version.php b/classes/Schema_version.php index 6b464c6d1d..4a3f939e93 100644 --- a/classes/Schema_version.php +++ b/classes/Schema_version.php @@ -3,7 +3,7 @@ * Table Definition for schema_version */ -class Schema_version extends Memcached_DataObject +class Schema_version extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -19,4 +19,17 @@ class Schema_version extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + + public static function schemaDef() + { + return array( + 'description' => 'To avoid checking database structure all the time, we store a checksum of the expected schema info for each table here. If it has not changed since the last time we checked the table, we can leave it as is.', + 'fields' => array( + 'table_name' => array('type' => 'varchar', 'length' => '64', 'not null' => true, 'description' => 'Table name'), + 'checksum' => array('type' => 'varchar', 'length' => '64', 'not null' => true, 'description' => 'Checksum of schema array; a mismatch indicates we should check the table more thoroughly.'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('table_name'), + ); + } } diff --git a/classes/Session.php b/classes/Session.php index 166b89815a..1a924b7964 100644 --- a/classes/Session.php +++ b/classes/Session.php @@ -23,7 +23,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Session extends Memcached_DataObject +class Session extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -40,6 +40,22 @@ class Session extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + public static function schemaDef() + { + return array( + 'fields' => array( + 'id' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'session ID'), + 'session_data' => array('type' => 'text', 'description' => 'session data'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('id'), + 'indexes' => array( + 'session_modified_idx' => array('modified'), + ), + ); + } + static function logdeb($msg) { if (common_config('sessions', 'debug')) { diff --git a/classes/Sms_carrier.php b/classes/Sms_carrier.php index 500cb4f043..08d83f08f2 100644 --- a/classes/Sms_carrier.php +++ b/classes/Sms_carrier.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Sms_carrier extends Memcached_DataObject +class Sms_carrier extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -27,4 +27,21 @@ class Sms_carrier extends Memcached_DataObject { return sprintf($this->email_pattern, $sms); } + + public static function schemaDef() + { + return array( + 'fields' => array( + 'id' => array('type' => 'int', 'not null' => true, 'description' => 'primary key for SMS carrier'), + 'name' => array('type' => 'varchar', 'length' => 64, 'description' => 'name of the carrier'), + 'email_pattern' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'sprintf pattern for making an email address from a phone number'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('id'), + 'unique keys' => array( + 'sms_carrier_name_key' => array('name'), + ), + ); + } } diff --git a/classes/Status_network.php b/classes/Status_network.php index c3acacf595..b7a7e1c0a7 100644 --- a/classes/Status_network.php +++ b/classes/Status_network.php @@ -56,8 +56,9 @@ class Status_network extends Safe_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE - static $cache = null; - static $cacheInitialized = false; + // XXX: made public so Status_network_tag can eff with it + public static $cache = null; + public static $cacheInitialized = false; static $base = null; static $wildcard = null; @@ -91,12 +92,18 @@ class Status_network extends Safe_DataObject // or a single-process script which is switching // configurations. $persist = php_sapi_name() != 'cli' || self::$cacheInitialized; - if (is_array($servers)) { - foreach($servers as $server) { - self::$cache->addServer($server, 11211, $persist); + if (!is_array($servers)) { + $servers = array($servers); + } + foreach($servers as $server) { + $parts = explode(':', $server); + $server = $parts[0]; + if (count($parts) > 1) { + $port = $parts[1]; + } else { + $port = 11211; } - } else { - self::$cache->addServer($servers, 11211, $persist); + self::$cache->addServer($server, $port, $persist); } self::$cacheInitialized = true; } diff --git a/classes/Status_network_tag.php b/classes/Status_network_tag.php index 00ff0d8520..4a7c3b51ff 100644 --- a/classes/Status_network_tag.php +++ b/classes/Status_network_tag.php @@ -111,8 +111,10 @@ class Status_network_tag extends Safe_DataObject function decache() { $key = 'status_network_tags:' . $this->site_id; - if (Status_network::$cache) { - Status_network::$cache->delete($key); + if (Status_network::$cache || Status_network::$cacheInitialized) { + // FIXME: this was causing errors, so I'm hiding them. + // I'm a big chicken and lazy. + @Status_network::$cache->delete($key); } } diff --git a/classes/Subscription.php b/classes/Subscription.php index 8af414b3a7..70ccd724be 100644 --- a/classes/Subscription.php +++ b/classes/Subscription.php @@ -24,7 +24,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Subscription extends Memcached_DataObject +class Subscription extends Managed_DataObject { const CACHE_WINDOW = 201; const FORCE = true; @@ -39,9 +39,36 @@ class Subscription extends Memcached_DataObject public $sms; // tinyint(1) default_1 public $token; // varchar(255) public $secret; // varchar(255) + public $uri; // varchar(255) public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP + public static function schemaDef() + { + return array( + 'fields' => array( + 'subscriber' => array('type' => 'int', 'not null' => true, 'description' => 'profile listening'), + 'subscribed' => array('type' => 'int', 'not null' => true, 'description' => 'profile being listened to'), + 'jabber' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'deliver jabber messages'), + 'sms' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'deliver sms messages'), + 'token' => array('type' => 'varchar', 'length' => 255, 'description' => 'authorization token'), + 'secret' => array('type' => 'varchar', 'length' => 255, 'description' => 'token secret'), + 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('subscriber', 'subscribed'), + 'unique keys' => array( + 'subscription_uri_key' => array('uri'), + ), + 'indexes' => array( + 'subscription_subscriber_idx' => array('subscriber', 'created'), + 'subscription_subscribed_idx' => array('subscribed', 'created'), + 'subscription_token_idx' => array('token'), + ), + ); + } + /* Static get */ function staticGet($k,$v=null) { return Memcached_DataObject::staticGet('Subscription',$k,$v); } @@ -138,6 +165,9 @@ class Subscription extends Memcached_DataObject $sub->jabber = 1; $sub->sms = 1; $sub->created = common_sql_now(); + $sub->uri = self::newURI($sub->subscriber, + $sub->subscribed, + $sub->created); $result = $sub->insert(); @@ -198,29 +228,6 @@ class Subscription extends Memcached_DataObject assert(!empty($sub)); - // @todo: move this block to EndSubscribe handler for - // OMB plugin when it exists. - - if (!empty($sub->token)) { - - $token = new Token(); - - $token->tok = $sub->token; - - if ($token->find(true)) { - - $result = $token->delete(); - - if (!$result) { - common_log_db_error($token, 'DELETE', __FILE__); - // TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server. - throw new Exception(_('Could not delete subscription OMB token.')); - } - } else { - common_log(LOG_ERR, "Couldn't find credentials with token {$token->tok}"); - } - } - $result = $sub->delete(); if (!$result) { @@ -255,16 +262,21 @@ class Subscription extends Memcached_DataObject $subscriber = Profile::staticGet('id', $this->subscriber); $subscribed = Profile::staticGet('id', $this->subscribed); + if (empty($subscriber)) { + throw new Exception(sprintf(_('No profile for the subscriber: %d'), $this->subscriber)); + } + + if (empty($subscribed)) { + throw new Exception(sprintf(_('No profile for the subscribed: %d'), $this->subscribed)); + } + $act = new Activity(); $act->verb = ActivityVerb::FOLLOW; // XXX: rationalize this with the URL - $act->id = TagURI::mint('follow:%d:%d:%s', - $subscriber->id, - $subscribed->id, - common_date_iso8601($this->created)); + $act->id = $this->getURI(); $act->time = strtotime($this->created); // TRANS: Activity title when subscribing to another person. @@ -427,4 +439,21 @@ class Subscription extends Memcached_DataObject return $result; } + + function getURI() + { + if (!empty($this->uri)) { + return $this->uri; + } else { + return self::newURI($this->subscriber, $this->subscribed, $this->created); + } + } + + static function newURI($subscriber_id, $subscribed_id, $created) + { + return TagURI::mint('follow:%d:%d:%s', + $subscriber_id, + $subscribed_id, + common_date_iso8601($created)); + } } diff --git a/classes/Token.php b/classes/Token.php index a129d1fd11..8a6b46bbbb 100644 --- a/classes/Token.php +++ b/classes/Token.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Token extends Memcached_DataObject +class Token extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -26,4 +26,26 @@ class Token extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + public static function schemaDef() + { + return array( + 'description' => 'OAuth token record', + 'fields' => array( + 'consumer_key' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'unique identifier, root URL'), + 'tok' => array('type' => 'char', 'length' => 32, 'not null' => true, 'description' => 'identifying value'), + 'secret' => array('type' => 'char', 'length' => 32, 'not null' => true, 'description' => 'secret value'), + 'type' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 0, 'description' => 'request or access'), + 'state' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'for requests, 0 = initial, 1 = authorized, 2 = used'), + 'verifier' => array('type' => 'varchar', 'length' => 255, 'description' => 'verifier string for OAuth 1.0a'), + 'verified_callback' => array('type' => 'varchar', 'length' => 255, 'description' => 'verified callback URL for OAuth 1.0a'), + + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('consumer_key', 'tok'), + 'foreign keys' => array( + 'token_consumer_key_fkey' => array('consumer', array('consumer_key'=> 'consumer_key')), + ), + ); + } } diff --git a/classes/User.php b/classes/User.php index 9f79549327..e8aaaf6a10 100644 --- a/classes/User.php +++ b/classes/User.php @@ -28,7 +28,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; require_once 'Validate.php'; -class User extends Memcached_DataObject +class User extends Managed_DataObject { const SUBSCRIBE_POLICY_OPEN = 0; const SUBSCRIBE_POLICY_MODERATE = 1; @@ -61,8 +61,6 @@ class User extends Memcached_DataObject public $subscribe_policy; // tinyint(1) public $urlshorteningservice; // varchar(50) default_ur1.ca public $inboxed; // tinyint(1) - public $design_id; // int(4) - public $viewdesigns; // tinyint(1) default_1 public $private_stream; // tinyint(1) default_0 public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -73,6 +71,58 @@ class User extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + public static function schemaDef() + { + return array( + 'description' => 'local users', + 'fields' => array( + 'id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to profile table'), + 'nickname' => array('type' => 'varchar', 'length' => 64, 'description' => 'nickname or username, duped in profile'), + 'password' => array('type' => 'varchar', 'length' => 255, 'description' => 'salted password, can be null for OpenID users'), + 'email' => array('type' => 'varchar', 'length' => 255, 'description' => 'email address for password recovery etc.'), + 'incomingemail' => array('type' => 'varchar', 'length' => 255, 'description' => 'email address for post-by-email'), + 'emailnotifysub' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Notify by email of subscriptions'), + 'emailnotifyfav' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Notify by email of favorites'), + 'emailnotifynudge' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Notify by email of nudges'), + 'emailnotifymsg' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Notify by email of direct messages'), + 'emailnotifyattn' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Notify by email of @-replies'), + 'emailmicroid' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'whether to publish email microid'), + 'language' => array('type' => 'varchar', 'length' => 50, 'description' => 'preferred language'), + 'timezone' => array('type' => 'varchar', 'length' => 50, 'description' => 'timezone'), + 'emailpost' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Post by email'), + 'sms' => array('type' => 'varchar', 'length' => 64, 'description' => 'sms phone number'), + 'carrier' => array('type' => 'int', 'description' => 'foreign key to sms_carrier'), + 'smsnotify' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'whether to send notices to SMS'), + 'smsreplies' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'whether to send notices to SMS on replies'), + 'smsemail' => array('type' => 'varchar', 'length' => 255, 'description' => 'built from sms and carrier'), + 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier, usually a tag URI'), + 'autosubscribe' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'automatically subscribe to users who subscribe to us'), + 'subscribe_policy' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => '0 = anybody can subscribe; 1 = require approval'), + 'urlshorteningservice' => array('type' => 'varchar', 'length' => 50, 'default' => 'internal', 'description' => 'service to use for auto-shortening URLs'), + 'inboxed' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'has an inbox been created for this user?'), + 'private_stream' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'whether to limit all notices to followers only'), + + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('id'), + 'unique keys' => array( + 'user_nickname_key' => array('nickname'), + 'user_email_key' => array('email'), + 'user_incomingemail_key' => array('incomingemail'), + 'user_sms_key' => array('sms'), + 'user_uri_key' => array('uri'), + ), + 'foreign keys' => array( + 'user_id_fkey' => array('profile', array('id' => 'id')), + 'user_carrier_fkey' => array('sms_carrier', array('carrier' => 'id')), + ), + 'indexes' => array( + 'user_smsemail_idx' => array('smsemail'), + ), + ); + } + protected $_profile = -1; /** @@ -293,7 +343,6 @@ class User extends Memcached_DataObject $user->emailmicroid = 1; $user->emailpost = 1; $user->jabbermicroid = 1; - $user->viewdesigns = 1; $user->created = common_sql_now(); @@ -687,7 +736,7 @@ class User extends Memcached_DataObject $profile = new Profile(); - $cnt = $profile->query(sprintf($qry, $this->id, $tag)); + $cnt = $profile->query(sprintf($qry, $this->id, $profile->escape($tag))); return $profile; } @@ -709,16 +758,11 @@ class User extends Memcached_DataObject $profile = new Profile(); - $profile->query(sprintf($qry, $this->id, $tag)); + $profile->query(sprintf($qry, $this->id, $profile->escape($tag))); return $profile; } - function getDesign() - { - return Design::staticGet('id', $this->design_id); - } - function hasRight($right) { $profile = $this->getProfile(); @@ -937,7 +981,7 @@ class User extends Memcached_DataObject return $user->nickname; } catch (Exception $e) { if (common_config('singleuser', 'enabled') && common_config('singleuser', 'nickname')) { - common_log(LOG_WARN, "Warning: code attempting to pull single-user nickname when the account does not exist. If this is not setup time, this is probably a bug."); + common_log(LOG_WARNING, "Warning: code attempting to pull single-user nickname when the account does not exist. If this is not setup time, this is probably a bug."); return common_config('singleuser', 'nickname'); } throw $e; @@ -1008,4 +1052,163 @@ class User extends Memcached_DataObject $skip = array('_profile'); return array_diff($vars, $skip); } + + static function recoverPassword($nore) + { + $user = User::staticGet('email', common_canonical_email($nore)); + + if (!$user) { + try { + $user = User::staticGet('nickname', common_canonical_nickname($nore)); + } catch (NicknameException $e) { + // invalid + } + } + + // See if it's an unconfirmed email address + + if (!$user) { + // Warning: it may actually be legit to have multiple folks + // who have claimed, but not yet confirmed, the same address. + // We'll only send to the first one that comes up. + $confirm_email = new Confirm_address(); + $confirm_email->address = common_canonical_email($nore); + $confirm_email->address_type = 'email'; + $confirm_email->find(); + if ($confirm_email->fetch()) { + $user = User::staticGet($confirm_email->user_id); + } else { + $confirm_email = null; + } + } else { + $confirm_email = null; + } + + if (!$user) { + // TRANS: Information on password recovery form if no known username or e-mail address was specified. + throw new ClientException(_('No user with that email address or username.')); + return; + } + + // Try to get an unconfirmed email address if they used a user name + + if (!$user->email && !$confirm_email) { + $confirm_email = new Confirm_address(); + $confirm_email->user_id = $user->id; + $confirm_email->address_type = 'email'; + $confirm_email->find(); + if (!$confirm_email->fetch()) { + $confirm_email = null; + } + } + + if (!$user->email && !$confirm_email) { + // TRANS: Client error displayed on password recovery form if a user does not have a registered e-mail address. + throw new ClientException(_('No registered email address for that user.')); + return; + } + + // Success! We have a valid user and a confirmed or unconfirmed email address + + $confirm = new Confirm_address(); + $confirm->code = common_confirmation_code(128); + $confirm->address_type = 'recover'; + $confirm->user_id = $user->id; + $confirm->address = (!empty($user->email)) ? $user->email : $confirm_email->address; + + if (!$confirm->insert()) { + common_log_db_error($confirm, 'INSERT', __FILE__); + // TRANS: Server error displayed if e-mail address confirmation fails in the database on the password recovery form. + throw new ServerException(_('Error saving address confirmation.')); + return; + } + + // @todo FIXME: needs i18n. + $body = "Hey, $user->nickname."; + $body .= "\n\n"; + $body .= 'Someone just asked for a new password ' . + 'for this account on ' . common_config('site', 'name') . '.'; + $body .= "\n\n"; + $body .= 'If it was you, and you want to confirm, use the URL below:'; + $body .= "\n\n"; + $body .= "\t".common_local_url('recoverpassword', + array('code' => $confirm->code)); + $body .= "\n\n"; + $body .= 'If not, just ignore this message.'; + $body .= "\n\n"; + $body .= 'Thanks for your time, '; + $body .= "\n"; + $body .= common_config('site', 'name'); + $body .= "\n"; + + $headers = _mail_prepare_headers('recoverpassword', $user->nickname, $user->nickname); + // TRANS: Subject for password recovery e-mail. + mail_to_user($user, _('Password recovery requested'), $body, $headers, $confirm->address); + } + + function streamModeOnly() + { + if (common_config('oldschool', 'enabled')) { + $osp = Old_school_prefs::staticGet('user_id', $this->id); + if (!empty($osp)) { + return $osp->stream_mode_only; + } + } + + return false; + } + + function conversationTree() + { + if (common_config('oldschool', 'enabled')) { + $osp = Old_school_prefs::staticGet('user_id', $this->id); + if (!empty($osp)) { + return $osp->conversation_tree; + } + } + + return false; + } + + function streamNicknames() + { + if (common_config('oldschool', 'enabled')) { + $osp = Old_school_prefs::staticGet('user_id', $this->id); + if (!empty($osp)) { + return $osp->stream_nicknames; + } + } + return false; + } + + function registrationActivity() + { + $profile = $this->getProfile(); + + $service = new ActivityObject(); + + $service->type = ActivityObject::SERVICE; + $service->title = common_config('site', 'name'); + $service->link = common_root_url(); + $service->id = $service->link; + + $act = new Activity(); + + $act->actor = ActivityObject::fromProfile($profile); + $act->verb = ActivityVerb::JOIN; + + $act->objects[] = $service; + + $act->id = TagURI::mint('user:register:%d', + $this->id); + + $act->time = strtotime($this->created); + + $act->title = _("Register"); + + $act->content = sprintf(_('%1$s joined %2$s.'), + $profile->getBestName(), + $service->title); + return $act; + } } diff --git a/classes/User_group.php b/classes/User_group.php index 75de535bd1..406537dd8a 100644 --- a/classes/User_group.php +++ b/classes/User_group.php @@ -3,10 +3,11 @@ * Table Definition for user_group */ -class User_group extends Memcached_DataObject +class User_group extends Managed_DataObject { const JOIN_POLICY_OPEN = 0; const JOIN_POLICY_MODERATE = 1; + const CACHE_WINDOW = 201; ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -22,7 +23,6 @@ class User_group extends Memcached_DataObject public $homepage_logo; // varchar(255) public $stream_logo; // varchar(255) public $mini_logo; // varchar(255) - public $design_id; // int(4) public $created; // datetime not_null default_0000-00-00%2000%3A00%3A00 public $modified; // timestamp not_null default_CURRENT_TIMESTAMP public $uri; // varchar(255) unique_key @@ -34,10 +34,50 @@ class User_group extends Memcached_DataObject function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('User_group',$k,$v); } + + function multiGet($keyCol, $keyVals, $skipNulls=true) + { + return parent::multiGet('User_group', $keyCol, $keyVals, $skipNulls); + } /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + public static function schemaDef() + { + return array( + 'fields' => array( + 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'unique identifier'), + + 'nickname' => array('type' => 'varchar', 'length' => 64, 'description' => 'nickname for addressing'), + 'fullname' => array('type' => 'varchar', 'length' => 255, 'description' => 'display name'), + 'homepage' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL, cached so we dont regenerate'), + 'description' => array('type' => 'text', 'description' => 'group description'), + 'location' => array('type' => 'varchar', 'length' => 255, 'description' => 'related physical location, if any'), + + 'original_logo' => array('type' => 'varchar', 'length' => 255, 'description' => 'original size logo'), + 'homepage_logo' => array('type' => 'varchar', 'length' => 255, 'description' => 'homepage (profile) size logo'), + 'stream_logo' => array('type' => 'varchar', 'length' => 255, 'description' => 'stream-sized logo'), + 'mini_logo' => array('type' => 'varchar', 'length' => 255, 'description' => 'mini logo'), + + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + + 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universal identifier'), + 'mainpage' => array('type' => 'varchar', 'length' => 255, 'description' => 'page for group info to link to'), + 'join_policy' => array('type' => 'int', 'size' => 'tiny', 'description' => '0=open; 1=requires admin approval'), + 'force_scope' => array('type' => 'int', 'size' => 'tiny', 'description' => '0=never,1=sometimes,-1=always'), + ), + 'primary key' => array('id'), + 'unique keys' => array( + 'user_group_uri_key' => array('uri'), + ), + 'indexes' => array( + 'user_group_nickname_idx' => array('nickname'), + ), + ); + } + function defaultLogo($size) { static $sizenames = array(AVATAR_PROFILE_SIZE => 'profile', @@ -102,27 +142,52 @@ class User_group extends Memcached_DataObject return !in_array($nickname, $blacklist); } - function getMembers($offset=0, $limit=null) - { - $qry = - 'SELECT profile.* ' . - 'FROM profile JOIN group_member '. - 'ON profile.id = group_member.profile_id ' . - 'WHERE group_member.group_id = %d ' . - 'ORDER BY group_member.created DESC '; + function getMembers($offset=0, $limit=null) { + $ids = null; + if (is_null($limit) || $offset + $limit > User_group::CACHE_WINDOW) { + $ids = $this->getMemberIDs($offset, + $limit); + } else { + $key = sprintf('group:member_ids:%d', $this->id); + $window = self::cacheGet($key); + if ($window === false) { + $window = $this->getMemberIDs(0, + User_group::CACHE_WINDOW); + self::cacheSet($key, $window); + } - if ($limit != null) { - if (common_config('db','type') == 'pgsql') { - $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset; - } else { - $qry .= ' LIMIT ' . $offset . ', ' . $limit; + $ids = array_slice($window, + $offset, + $limit); + } + + return Profile::multiGet('id', $ids); + } + + function getMemberIDs($offset=0, $limit=null) + { + $gm = new Group_member(); + + $gm->selectAdd(); + $gm->selectAdd('profile_id'); + + $gm->group_id = $this->id; + + $gm->orderBy('created DESC'); + + if (!is_null($limit)) { + $gm->limit($offset, $limit); + } + + $ids = array(); + + if ($gm->find()) { + while ($gm->fetch()) { + $ids[] = $gm->profile_id; } } - $members = new Profile(); - - $members->query(sprintf($qry, $this->id)); - return $members; + return $ids; } /** @@ -157,17 +222,44 @@ class User_group extends Memcached_DataObject function getMemberCount() { - // XXX: WORM cache this + $key = sprintf("group:member_count:%d", $this->id); - $members = $this->getMembers(); - $member_count = 0; + $cnt = self::cacheGet($key); - /** $member->count() doesn't work. */ - while ($members->fetch()) { - $member_count++; + if (is_integer($cnt)) { + return (int) $cnt; } - return $member_count; + $mem = new Group_member(); + $mem->group_id = $this->id; + + // XXX: why 'distinct'? + + $cnt = (int) $mem->count('distinct profile_id'); + + self::cacheSet($key, $cnt); + + return $cnt; + } + + function getBlockedCount() + { + // XXX: WORM cache this + + $block = new Group_block(); + $block->group_id = $this->id; + + return $block->count(); + } + + function getQueueCount() + { + // XXX: WORM cache this + + $queue = new Group_join_queue(); + $queue->group_id = $this->id; + + return $queue->count(); } function getAdmins($offset=0, $limit=null) @@ -339,11 +431,6 @@ class User_group extends Memcached_DataObject return null; } - function getDesign() - { - return Design::staticGet('id', $this->design_id); - } - function getUserMembers() { // XXX: cache this @@ -495,6 +582,18 @@ class User_group extends Memcached_DataObject // MAGICALLY put fields into current scope // @fixme kill extract(); it makes debugging absurdly hard + $defaults = array('nickname' => null, + 'fullname' => null, + 'homepage' => null, + 'description' => null, + 'location' => null, + 'uri' => null, + 'mainpage' => null, + 'aliases' => array(), + 'userid' => null); + + $fields = array_merge($defaults, $fields); + extract($fields); $group = new User_group(); diff --git a/classes/User_im_prefs.php b/classes/User_im_prefs.php index 75be8969e0..90df216c54 100644 --- a/classes/User_im_prefs.php +++ b/classes/User_im_prefs.php @@ -29,7 +29,7 @@ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class User_im_prefs extends Memcached_DataObject +class User_im_prefs extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -56,39 +56,28 @@ class User_im_prefs extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE - /* - DB_DataObject calculates the sequence key(s) by taking the first key returned by the keys() function. - In this case, the keys() function returns user_id as the first key. user_id is not a sequence, but - DB_DataObject's sequenceKey() will incorrectly think it is. Then, since the sequenceKey() is a numeric - type, but is not set to autoincrement in the database, DB_DataObject will create a _seq table and - manage the sequence itself. This is not the correct behavior for the user_id in this class. - So we override that incorrect behavior, and simply say there is no sequence key. - */ - function sequenceKey() + public static function schemaDef() { - return array(false,false); - } - - /** - * We have two compound keys with unique constraints: - * (transport, user_id) which is our primary key, and - * (transport, screenname) which is an additional constraint. - * - * Currently there's not a way to represent that second key - * in the general keys list, so we're adding it here to the - * list of keys to use for caching, ensuring that it gets - * cleared as well when we change. - * - * @return array of cache keys - */ - function _allCacheKeys() - { - $ukeys = 'transport,screenname'; - $uvals = $this->transport . ',' . $this->screenname; - - $ckeys = parent::_allCacheKeys(); - $ckeys[] = $this->cacheKey($this->tableName(), $ukeys, $uvals); - return $ckeys; + return array( + 'fields' => array( + 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user'), + 'screenname' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'screenname on this service'), + 'transport' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'transport (ex xmpp, aim)'), + 'notify' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 0, 'description' => 'Notify when a new notice is sent'), + 'replies' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 0, 'description' => 'Send replies from people not subscribed to'), + 'microid' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 1, 'description' => 'Publish a MicroID'), + 'updatefrompresence' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 0, 'description' => 'Send replies from people not subscribed to.'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('user_id', 'transport'), + 'unique keys' => array( + 'transport_screenname_key' => array('transport', 'screenname'), + ), + 'foreign keys' => array( + 'user_im_prefs_user_id_fkey' => array('user', array('user_id' => 'id')), + ), + ); } } diff --git a/classes/User_location_prefs.php b/classes/User_location_prefs.php index bd6029f97c..060ef41e83 100644 --- a/classes/User_location_prefs.php +++ b/classes/User_location_prefs.php @@ -29,7 +29,7 @@ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class User_location_prefs extends Memcached_DataObject +class User_location_prefs extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -46,8 +46,19 @@ class User_location_prefs extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE - function sequenceKey() + public static function schemaDef() { - return array(false, false, false); + return array( + 'fields' => array( + 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user who has the preference'), + 'share_location' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Whether to share location data'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('user_id'), + 'foreign keys' => array( + 'user_location_prefs_user_id_fkey' => array('user', array('user_id' => 'id')), + ), + ); } } diff --git a/classes/User_urlshortener_prefs.php b/classes/User_urlshortener_prefs.php index e0f85af012..f71adc9736 100755 --- a/classes/User_urlshortener_prefs.php +++ b/classes/User_urlshortener_prefs.php @@ -21,7 +21,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } -class User_urlshortener_prefs extends Memcached_DataObject +class User_urlshortener_prefs extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -40,9 +40,23 @@ class User_urlshortener_prefs extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE - function sequenceKey() + public static function schemaDef() { - return array(false, false, false); + return array( + 'fields' => array( + 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user'), + 'urlshorteningservice' => array('type' => 'varchar', 'length' => 50, 'default' => 'internal', 'description' => 'service to use for auto-shortening URLs'), + 'maxurllength' => array('type' => 'int', 'not null' => true, 'description' => 'urls greater than this length will be shortened, 0 = always, null = never'), + 'maxnoticelength' => array('type' => 'int', 'not null' => true, 'description' => 'notices with content greater than this value will have all urls shortened, 0 = always, null = never'), + + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('user_id'), + 'foreign keys' => array( + 'user_urlshortener_prefs_user_id_fkey' => array('user', array('user_id' => 'id')), + ), + ); } static function maxUrlLength($user) diff --git a/classes/User_username.php b/classes/User_username.php index ae7785cc9f..652e7bd141 100644 --- a/classes/User_username.php +++ b/classes/User_username.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class User_username extends Memcached_DataObject +class User_username extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ diff --git a/classes/statusnet.ini b/classes/statusnet.ini deleted file mode 100644 index c5c126a133..0000000000 --- a/classes/statusnet.ini +++ /dev/null @@ -1,720 +0,0 @@ -[avatar] -profile_id = 129 -original = 17 -width = 129 -height = 129 -mediatype = 130 -filename = 2 -url = 2 -created = 142 -modified = 384 - -[avatar__keys] -profile_id = K -width = K -height = K -url = U - -[config] -section = 130 -setting = 130 -value = 2 - -[config__keys] -section = K -setting = K - -[confirm_address] -code = 130 -user_id = 129 -address = 130 -address_extra = 130 -address_type = 130 -claimed = 14 -sent = 14 -modified = 384 - -[confirm_address__keys] -code = K - -[consumer] -consumer_key = 130 -consumer_secret = 130 -seed = 130 -created = 142 -modified = 384 - -[consumer__keys] -consumer_key = K - -[conversation] -id = 129 -uri = 2 -created = 142 -modified = 384 - -[conversation__keys] -id = N -uri = U - -[deleted_notice] -id = 129 -profile_id = 129 -uri = 2 -created = 142 -deleted = 142 - -[deleted_notice__keys] -id = K -uri = U - -[design] -id = 129 -backgroundcolor = 1 -contentcolor = 1 -sidebarcolor = 1 -textcolor = 1 -linkcolor = 1 -backgroundimage = 2 -disposition = 17 - -[design__keys] -id = N - -[fave] -notice_id = 129 -user_id = 129 -modified = 384 - -[fave__keys] -notice_id = K -user_id = K - -[file] -id = 129 -url = 2 -mimetype = 2 -size = 1 -title = 2 -date = 1 -protected = 1 -filename = 2 -modified = 384 - -[file__keys] -id = N -url = U - -[file_oembed] -file_id = 129 -version = 2 -type = 2 -mimetype = 2 -provider = 2 -provider_url = 2 -width = 1 -height = 1 -html = 34 -title = 2 -author_name = 2 -author_url = 2 -url = 2 -modified = 384 - -[file_oembed__keys] -file_id = K - -[file_redirection] -url = 130 -file_id = 1 -redirections = 1 -httpcode = 1 -modified = 384 - -[file_redirection__keys] -url = K - -[file_thumbnail] -file_id = 129 -url = 2 -width = 1 -height = 1 -modified = 384 - -[file_thumbnail__keys] -file_id = K -url = U - -[file_to_post] -file_id = 129 -post_id = 129 -modified = 384 - -[file_to_post__keys] -file_id = K -post_id = K - -[foreign_link] -user_id = 129 -foreign_id = 129 -service = 129 -credentials = 2 -noticesync = 145 -friendsync = 145 -profilesync = 145 -last_noticesync = 14 -last_friendsync = 14 -created = 142 -modified = 384 - -[foreign_link__keys] -user_id = K -foreign_id = K -service = K - -[foreign_service] -id = 129 -name = 130 -description = 2 -created = 142 -modified = 384 - -[foreign_service__keys] -id = K -name = U - -[foreign_subscription] -service = 129 -subscriber = 129 -subscribed = 129 -created = 142 - -[foreign_subscription__keys] -service = K -subscriber = K -subscribed = K - -[foreign_user] -id = 129 -service = 129 -uri = 130 -nickname = 2 -created = 142 -modified = 384 - -[foreign_user__keys] -id = K -service = K -uri = U - -[group_alias] -alias = 130 -group_id = 129 -modified = 384 - -[group_alias__keys] -alias = K - -[group_block] -group_id = 129 -blocked = 129 -blocker = 129 -modified = 384 - -[group_block__keys] -group_id = K -blocked = K - -[group_inbox] -group_id = 129 -notice_id = 129 -created = 142 - -[group_inbox__keys] -group_id = K -notice_id = K - -[group_member] -group_id = 129 -profile_id = 129 -is_admin = 17 -created = 142 -modified = 384 - -[group_member__keys] -group_id = K -profile_id = K - -[inbox] -user_id = 129 -notice_ids = 66 - -[inbox__keys] -user_id = K - -[invitation] -code = 130 -user_id = 129 -address = 130 -address_type = 130 -created = 142 -registered_user_id = 1 - -[invitation__keys] -code = K - -[local_group] -group_id = 129 -nickname = 2 -created = 142 -modified = 384 - -[local_group__keys] -group_id = K -nickname = U - -[location_namespace] -id = 129 -description = 2 -created = 142 -modified = 384 - -[location_namespace__keys] -id = K - -[login_token] -user_id = 129 -token = 130 -created = 142 -modified = 384 - -[login_token__keys] -user_id = K - -[message] -id = 129 -uri = 2 -from_profile = 129 -to_profile = 129 -content = 34 -rendered = 34 -url = 2 -created = 142 -modified = 384 -source = 2 - -[message__keys] -id = N - -[nonce] -consumer_key = 130 -tok = 2 -nonce = 130 -ts = 142 -created = 142 -modified = 384 - -[nonce__keys] -consumer_key = K -nonce = K -ts = K - -[notice] -id = 129 -profile_id = 129 -uri = 2 -content = 34 -rendered = 34 -url = 2 -created = 142 -modified = 384 -reply_to = 1 -is_local = 17 -source = 2 -conversation = 1 -lat = 1 -lon = 1 -location_id = 1 -location_ns = 1 -repeat_of = 1 -object_type = 2 -scope = 1 - -[notice__keys] -id = N - -[notice_inbox] -user_id = 129 -notice_id = 129 -created = 142 -source = 17 - -[notice_inbox__keys] -user_id = K -notice_id = K - -[notice_source] -code = 130 -name = 130 -url = 130 -created = 142 -modified = 384 - -[notice_source__keys] -code = K - -[notice_tag] -tag = 130 -notice_id = 129 -created = 142 - -[notice_tag__keys] -tag = K -notice_id = K - -[oauth_application] -id = 129 -owner = 129 -consumer_key = 130 -name = 130 -description = 2 -icon = 130 -source_url = 2 -organization = 2 -homepage = 2 -callback_url = 2 -type = 17 -access_type = 17 -created = 142 -modified = 384 - -[oauth_application__keys] -id = N -name = U - -[oauth_application_user] -profile_id = 129 -application_id = 129 -access_type = 17 -token = 2 -created = 142 -modified = 384 - -[oauth_application_user__keys] -profile_id = K -application_id = K - -[oauth_token_association] -profile_id = 129 -application_id = 129 -token = 130 -created = 142 -modified = 384 - -[oauth_token_association__keys] -profile_id = K -application_id = K -token = K - -[profile] -id = 129 -nickname = 130 -fullname = 2 -profileurl = 2 -homepage = 2 -bio = 34 -location = 2 -lat = 1 -lon = 1 -location_id = 1 -location_ns = 1 -created = 142 -modified = 384 - -[profile__keys] -id = N - -[profile_block] -blocker = 129 -blocked = 129 -modified = 384 - -[profile_block__keys] -blocker = K -blocked = K - -[profile_role] -profile_id = 129 -role = 130 -created = 142 - -[profile_role__keys] -profile_id = K -role = K - -[profile_tag] -tagger = 129 -tagged = 129 -tag = 130 -modified = 384 - -[profile_tag__keys] -tagger = K -tagged = K -tag = K - -[profile_list] -id = 129 -tagger = 129 -tag = 130 -description = 34 -private = 17 -created = 142 -modified = 384 -uri = 130 -mainpage = 130 -tagged_count = 129 -subscriber_count = 129 - -[profile_list__keys] -id = U -tagger = K -tag = K - -[profile_tag_subscription] -profile_tag_id = 129 -profile_id = 129 -created = 142 -modified = 384 - -[profile_tag_subscription__keys] -profile_tag_id = K -profile_id = K - -[queue_item] -id = 129 -frame = 194 -transport = 130 -created = 142 -claimed = 14 - -[queue_item__keys] -id = N - -[related_group] -group_id = 129 -related_group_id = 129 -created = 142 - -[related_group__keys] -group_id = K -related_group_id = K - -[remember_me] -code = 130 -user_id = 129 -modified = 384 - -[remember_me__keys] -code = K - -[remote_profile] -id = 129 -uri = 2 -postnoticeurl = 2 -updateprofileurl = 2 -created = 142 -modified = 384 - -[remote_profile__keys] -id = K -uri = U - -[reply] -notice_id = 129 -profile_id = 129 -modified = 142 -;modified = 384 ; skipping the mysql_timestamp mode so we can override its setting -replied_id = 1 - -[reply__keys] -notice_id = K -profile_id = K - -[schema_version] -table_name = 130 -checksum = 130 -modified = 384 - -[schema_version__keys] -table_name = K - -[session] -id = 130 -session_data = 34 -created = 142 -modified = 384 - -[session__keys] -id = K - -[sms_carrier] -id = 129 -name = 2 -email_pattern = 130 -created = 142 -modified = 384 - -[sms_carrier__keys] -id = K -name = U - -[subscription] -subscriber = 129 -subscribed = 129 -jabber = 17 -sms = 17 -token = 2 -secret = 2 -created = 142 -modified = 384 - -[subscription__keys] -subscriber = K -subscribed = K - -[token] -consumer_key = 130 -tok = 130 -secret = 130 -type = 145 -state = 17 -verifier = 2 -verified_callback = 2 -created = 142 -modified = 384 - -[token__keys] -consumer_key = K -tok = K - -[user] -id = 129 -nickname = 2 -password = 2 -email = 2 -incomingemail = 2 -emailnotifysub = 17 -emailnotifyfav = 17 -emailnotifynudge = 17 -emailnotifymsg = 17 -emailnotifyattn = 17 -emailmicroid = 17 -language = 2 -timezone = 2 -emailpost = 17 -sms = 2 -carrier = 1 -smsnotify = 17 -smsreplies = 17 -smsemail = 2 -uri = 2 -autosubscribe = 17 -subscribe_policy = 17 -urlshorteningservice = 2 -inboxed = 17 -design_id = 1 -viewdesigns = 17 -private_stream = 17 -created = 142 -modified = 384 - -[user__keys] -id = K -nickname = U -email = U -incomingemail = U -sms = U -uri = U - -[user_group] -id = 129 -nickname = 2 -fullname = 2 -homepage = 2 -description = 34 -location = 2 -original_logo = 2 -homepage_logo = 2 -stream_logo = 2 -mini_logo = 2 -design_id = 1 -created = 142 -modified = 384 -uri = 2 -mainpage = 2 -join_policy = 1 -force_scope = 1 - -[user_group__keys] -id = N - -[user_openid] -canonical = 130 -display = 130 -user_id = 129 -created = 142 -modified = 384 - -[user_openid__keys] -canonical = K -display = U - -[user_openid_trustroot] -trustroot = 130 -user_id = 129 -created = 142 -modified = 384 - -[user_openid__keys] -trustroot = K -user_id = K - -[user_location_prefs] -user_id = 129 -share_location = 17 -created = 142 -modified = 384 - -[user_location_prefs__keys] -user_id = K - -[user_im_prefs] -user_id = 129 -screenname = 130 -transport = 130 -notify = 17 -replies = 17 -microid = 17 -updatefrompresence = 17 -created = 142 -modified = 384 - -[user_im_prefs__keys] -user_id = K -transport = K -; There's another unique index on (transport, screenname) -; but we have no way to represent a compound index other than -; the primary key in here. To ensure proper cache purging, -; we need to tweak the class. - -[user_urlshortener_prefs] -user_id = 129 -urlshorteningservice = 2 -maxurllength = 129 -maxnoticelength = 129 -created = 142 -modified = 384 - -[user_urlshortener_prefs__keys] -user_id = K diff --git a/classes/statusnet.links.ini b/classes/statusnet.links.ini deleted file mode 100644 index 17a8c40085..0000000000 --- a/classes/statusnet.links.ini +++ /dev/null @@ -1,74 +0,0 @@ -[avatar] -profile_id = profile:id - -[user] -id = profile:id -carrier = sms_carrier:id - -[remote_profile] -id = profile:id - -[notice] -profile_id = profile:id -reply_to = notice:id -profile_id = profile_tag:tagged - -[reply] -notice_id = notice:id -profile_id = profile:id - -[token] -consumer_key = consumer:consumer_key - -; Compatibility hack for PHP 5.3 -; This entry has been moved to the class definition, as commas are no longer -; considered valid in keys, causing parse_ini_file() to reject the whole file. -;[nonce] -;consumer_key,token = token:consumer_key,token - -[confirm_address] -user_id = user:id - -[remember_me] -user_id = user:id - -[queue_item] -notice_id = notice:id - -[subscription] -subscriber = profile:id -subscribed = profile:id - -[fave] -notice_id = notice:id -user_id = user:id - -[file_oembed] -file_id = file:id - -[file_redirection] -file_id = file:id - -[file_thumbnail] -file_id = file:id - -[file_to_post] -file_id = file:id -post_id = notice:id - -[profile_list] -tagger = profile:id - -[profile_tag] -tagger = profile:id -tagged = profile:id -; in class definition: -;tag,tagger = profile_list:tag,tagger - -[profile_list] -tagger = profile:id - -[profile_tag_subscription] -profile_tag_id = profile_list:id -profile_id = profile:id - diff --git a/config.php.sample b/config.php.sample deleted file mode 100644 index 5378ad973d..0000000000 --- a/config.php.sample +++ /dev/null @@ -1,303 +0,0 @@ - 'localhost', -// 'port' => 25, -// ); - -// exponential decay factor for tags, default 10 days -// raise this if traffic is slow, lower it if it's fast -// $config['tag']['dropoff'] = 86400.0 * 10; - -// exponential decay factor for popular (most favorited notices) -// default 10 days -- similar to tag dropoff -// $config['popular']['dropoff'] = 86400.0 * 10; - -// optionally show non-local messages in public timeline -// $config['public']['localonly'] = false; - -// hide certain users from public pages, by ID -// $config['public']['blacklist'][] = 123; -// $config['public']['blacklist'][] = 2307; - -// Mark certain notice sources as automatic and thus not -// appropriate for public feed -// $config['public]['autosource'][] = 'twitterfeed'; -// $config['public]['autosource'][] = 'rssdent'; -// $config['public]['autosource'][] = 'Ping.Fm'; -// $config['public]['autosource'][] = 'HelloTxt'; -// $config['public]['autosource'][] = 'Updating.Me'; - -// Do notice broadcasts offline -// If you use this, you must run the six offline daemons in the -// background. See the README for details. -// $config['queue']['enabled'] = true; - -// Queue subsystem -// subsystems: internal (default) or stomp -// using stomp requires an external message queue server -// $config['queue']['subsystem'] = 'stomp'; -// $config['queue']['stomp_server'] = 'tcp://localhost:61613'; -// use different queue_basename for each statusnet instance managed by the server -// $config['queue']['queue_basename'] = '/queue/statusnet/'; - -// The following customise the behaviour of the various daemons: -// $config['daemon']['piddir'] = '/var/run'; -// $config['daemon']['user'] = false; -// $config['daemon']['group'] = false; - -// For installations with high traffic, statusnet can use MemCached to cache -// frequently requested information. Only enable the following if you have -// MemCached up and running: -// $config['memcached']['enabled'] = false; -// $config['memcached']['server'] = 'localhost'; -// $config['memcached']['port'] = 11211; - -// People tags -// Maximum number of tags a user can create: -// $config['peopletag']['maxtags'] = 100; -// Maximum number of people can have the same tag by the same user -// $config['peopletag']['maxpeople'] = 500; -// Types of users one can tag. -// Everyone. -// $config['peopletag']['allow_tagging']['all'] = true; -// Local only. -// $config['peopletag']['allow_tagging']['local'] = true; -// Subscriptions / Subscribers only (including remote) -// $config['peopletag']['allow_tagging']['subs'] = true; -// Remote. -// $config['peopletag']['allow_tagging']['remote'] = true; -// Examples: -// The following set of options allows tagging local users and -// remote subscribers / subscription. -// $config['peopletag']['allow_tagging']['all'] = false; -// $config['peopletag']['allow_tagging']['local'] = true; -// $config['peopletag']['allow_tagging']['subs'] = true; -// Or: -// $config['peopletag']['allow_tagging'] = array('local' => true, 'subs' =>true); - -// Disable post-by-email -// $config['emailpost']['enabled'] = false; - -// Disable SMS -// $config['sms']['enabled'] = false; - -// Twitter integration source attribute. Note: default is StatusNet -// $config['integration']['source'] = 'StatusNet'; - -// Enable bidirectional Twitter bridge -// -// NOTE: if you enable this you must also set $config['avatar']['path'] -// -// $config['twitterimport']['enabled'] = true; - -// Twitter OAuth settings. Documentation is at http://apiwiki.twitter.com/OAuth-FAQ -// $config['twitter']['consumer_key'] = 'YOURKEY'; -// $config['twitter']['consumer_secret'] = 'YOURSECRET'; - -// Edit throttling. Off by default. If turned on, you can only post 20 notices -// every 10 minutes. Admins may want to play with the settings to minimize inconvenience for -// real users without getting uncontrollable floods from spammers or runaway bots. - -// $config['throttle']['enabled'] = true; -// $config['throttle']['count'] = 100; -// $config['throttle']['timespan'] = 3600; - -// Config section for the built-in Facebook application -// $config['facebook']['apikey'] = 'APIKEY'; -// $config['facebook']['secret'] = 'SECRET'; - -// Add Google Analytics -// require_once('plugins/GoogleAnalyticsPlugin.php'); -// $ga = new GoogleAnalyticsPlugin('your secret code'); - -// Use Templating (template: /tpl/index.php) -// require_once('plugins/TemplatePlugin.php'); -// $tpl = new TemplatePlugin(); - -// Don't allow saying the same thing more than once per hour -// $config['site']['dupelimit'] = 3600; -// Don't enforce the dupe limit -// $config['site']['dupelimit'] = -1; - -// Base string for minting Tag URIs in Atom feeds. Defaults to -// "yourserver,2009". This needs to be configured properly for your Atom -// feeds to validate. See: http://www.faqs.org/rfcs/rfc4151.html and -// http://taguri.org/ Examples: -// $config['integration']['taguri'] = 'example.net,2008'; -// $config['integration']['taguri'] = 'admin@example.net,2009-03-09' - -// Don't use SSL -// $config['site']['ssl'] = 'never'; -// Use SSL only for sensitive pages (like login, password change) -// $config['site']['ssl'] = 'sometimes'; -// Use SSL for all pages -// $config['site']['ssl'] = 'always'; - -// Use a different hostname for SSL-encrypted pages -// $config['site']['sslserver'] = 'secure.example.org'; - -// Indent HTML and XML -// Enable (default) for easier to read markup for developers, -// disable to save some bandwidth. -// $config['site']['indent'] = true; - -// If you have a lot of status networks on the same server, you can -// store the site data in a database and switch as follows -// Status_network::setupDB('localhost', 'statusnet', 'statuspass', 'statusnet'); -// if (!Status_network::setupSite($_server, $_path)) { -// print "Error\n"; -// exit(1); -// } - -// How often to send snapshots; in # of web hits. Ideally, -// try to do this once per month (that is, make this equal to number -// of hits per month) -// $config['snapshot']['frequency'] = 10000; -// If you don't want to report statistics to the central server, uncomment. -// $config['snapshot']['run'] = 'never'; -// If you want to report statistics in a cron job instead. -// $config['snapshot']['run'] = 'cron'; - -// Support for file uploads (attachments), -// select supported mimetypes and quotas (in bytes) -// $config['attachments']['supported'] = array('image/png', 'application/ogg'); -// $config['attachments']['supported'] = true; //allow all file types to be uploaded - -// $config['attachments']['file_quota'] = 5000000; -// $config['attachments']['user_quota'] = 50000000; -// $config['attachments']['monthly_quota'] = 15000000; -// $config['attachments']['uploads'] = true; -// $config['attachments']['path'] = "/file/"; //ignored if site is private -// $config['attachments']['dir'] = INSTALLDIR . '/file/'; - -// $config['oohembed']['endpoint'] = 'http://oohembed.com/oohembed/'; diff --git a/db/074to080.sql b/db/074to080.sql deleted file mode 100644 index e3631e214a..0000000000 --- a/db/074to080.sql +++ /dev/null @@ -1,121 +0,0 @@ -alter table user - add column design_id integer comment 'id of a design' references design(id), - add column viewdesigns tinyint default 1 comment 'whether to view user-provided designs'; - -alter table notice add column - conversation integer comment 'id of root notice in this conversation' references notice (id), - add index notice_conversation_idx (conversation); - -alter table foreign_user - modify column id bigint not null comment 'unique numeric key on foreign service'; - -alter table foreign_link - modify column foreign_id bigint unsigned comment 'link to user on foreign service, if exists'; - -alter table user_group - add column design_id integer comment 'id of a design' references design(id); - -create table file ( - id integer primary key auto_increment, - url varchar(255) comment 'destination URL after following redirections', - mimetype varchar(50) comment 'mime type of resource', - size integer comment 'size of resource when available', - title varchar(255) comment 'title of resource when available', - date integer(11) comment 'date of resource according to http query', - protected integer(1) comment 'true when URL is private (needs login)', - filename varchar(255) comment 'if a local file, name of the file', - modified timestamp comment 'date this record was modified', - - unique(url) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci; - -create table file_oembed ( - file_id integer primary key comment 'oEmbed for that URL/file' references file (id), - version varchar(20) comment 'oEmbed spec. version', - type varchar(20) comment 'oEmbed type: photo, video, link, rich', - provider varchar(50) comment 'name of this oEmbed provider', - provider_url varchar(255) comment 'URL of this oEmbed provider', - width integer comment 'width of oEmbed resource when available', - height integer comment 'height of oEmbed resource when available', - html text comment 'html representation of this oEmbed resource when applicable', - title varchar(255) comment 'title of oEmbed resource when available', - author_name varchar(50) comment 'author name for this oEmbed resource', - author_url varchar(255) comment 'author URL for this oEmbed resource', - url varchar(255) comment 'URL for this oEmbed resource when applicable (photo, link)', - modified timestamp comment 'date this record was modified' - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci; - -create table file_redirection ( - - url varchar(255) primary key comment 'short URL (or any other kind of redirect) for file (id)', - file_id integer comment 'short URL for what URL/file' references file (id), - redirections integer comment 'redirect count', - httpcode integer comment 'HTTP status code (20x, 30x, etc.)', - modified timestamp comment 'date this record was modified' - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table file_thumbnail ( - - file_id integer primary key comment 'thumbnail for what URL/file' references file (id), - url varchar(255) comment 'URL of thumbnail', - width integer comment 'width of thumbnail', - height integer comment 'height of thumbnail', - modified timestamp comment 'date this record was modified', - - unique(url) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table file_to_post ( - - file_id integer comment 'id of URL/file' references file (id), - post_id integer comment 'id of the notice it belongs to' references notice (id), - modified timestamp comment 'date this record was modified', - - constraint primary key (file_id, post_id) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table design ( - id integer primary key auto_increment comment 'design ID', - backgroundcolor integer comment 'main background color', - contentcolor integer comment 'content area background color', - sidebarcolor integer comment 'sidebar background color', - textcolor integer comment 'text color', - linkcolor integer comment 'link color', - backgroundimage varchar(255) comment 'background image, if any', - disposition tinyint default 1 comment 'bit 1 = hide background image, bit 2 = display background image, bit 4 = tile background image' -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table group_block ( - group_id integer not null comment 'group profile is blocked from' references user_group (id), - blocked integer not null comment 'profile that is blocked' references profile (id), - blocker integer not null comment 'user making the block' references user (id), - modified timestamp comment 'date of blocking', - - constraint primary key (group_id, blocked) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table group_alias ( - - alias varchar(64) primary key comment 'additional nickname for the group', - group_id integer not null comment 'group profile is blocked from' references user_group (id), - modified timestamp comment 'date alias was created', - - index group_alias_group_id_idx (group_id) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table session ( - - id varchar(32) primary key comment 'session ID', - session_data text comment 'session data', - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified', - - index session_modified_idx (modified) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - diff --git a/db/074to080_pg.sql b/db/074to080_pg.sql deleted file mode 100644 index 0a7171ae56..0000000000 --- a/db/074to080_pg.sql +++ /dev/null @@ -1,108 +0,0 @@ -BEGIN; -create sequence design_seq; -create table design ( - id bigint default nextval('design_seq') /* comment 'design ID'*/, - backgroundcolor integer /* comment 'main background color'*/ , - contentcolor integer /*comment 'content area background color'*/ , - sidebarcolor integer /*comment 'sidebar background color'*/ , - textcolor integer /*comment 'text color'*/ , - linkcolor integer /*comment 'link color'*/, - backgroundimage varchar(255) /*comment 'background image, if any'*/, - disposition int default 1 /*comment 'bit 1 = hide background image, bit 2 = display background image, bit 4 = tile background image'*/, - primary key (id) -); -alter table "user" - add column design_id integer references design(id); -alter table "user" - add column viewdesigns integer default 1; - -alter table notice add column - conversation integer references notice (id); - -create index notice_conversation_idx on notice(conversation); - -alter table foreign_user - alter column id TYPE bigint; - -alter table foreign_user alter column id set not null; - -alter table foreign_link - alter column foreign_id TYPE bigint; - -alter table user_group - add column design_id integer; - -/*attachments and URLs stuff */ -create sequence file_seq; -create table file ( - id bigint default nextval('file_seq') primary key /* comment 'unique identifier' */, - url varchar(255) unique, - mimetype varchar(50), - size integer, - title varchar(255), - date integer, - protected integer, - filename text /* comment 'if a local file, name of the file' */, - modified timestamp default CURRENT_TIMESTAMP /* comment 'date this record was modified'*/ -); - -create sequence file_oembed_seq; -create table file_oembed ( - file_id bigint default nextval('file_oembed_seq') primary key /* comment 'unique identifier' */, - version varchar(20), - type varchar(20), - provider varchar(50), - provider_url varchar(255), - width integer, - height integer, - html text, - title varchar(255), - author_name varchar(50), - author_url varchar(255), - url varchar(255) -); - -create sequence file_redirection_seq; -create table file_redirection ( - url varchar(255) primary key, - file_id bigint, - redirections integer, - httpcode integer -); - -create sequence file_thumbnail_seq; -create table file_thumbnail ( - file_id bigint primary key, - url varchar(255) unique, - width integer, - height integer -); -create sequence file_to_post_seq; -create table file_to_post ( - file_id bigint, - post_id bigint, - - primary key (file_id, post_id) -); - - -create table group_block ( - group_id integer not null /* comment 'group profile is blocked from' */ references user_group (id), - blocked integer not null /* comment 'profile that is blocked' */references profile (id), - blocker integer not null /* comment 'user making the block'*/ references "user" (id), - modified timestamp /* comment 'date of blocking'*/ , - - primary key (group_id, blocked) -); - -create table group_alias ( - - alias varchar(64) /* comment 'additional nickname for the group'*/ , - group_id integer not null /* comment 'group profile is blocked from'*/ references user_group (id), - modified timestamp /* comment 'date alias was created'*/, - primary key (alias) - -); -create index group_alias_group_id_idx on group_alias (group_id); - -COMMIT; \ No newline at end of file diff --git a/db/08to09.sql b/db/08to09.sql deleted file mode 100644 index ba6f382005..0000000000 --- a/db/08to09.sql +++ /dev/null @@ -1,190 +0,0 @@ -alter table notice - modify column content text comment 'update content', - add column lat decimal(10,7) comment 'latitude', - add column lon decimal(10,7) comment 'longitude', - add column location_id integer comment 'location id if possible', - add column location_ns integer comment 'namespace for location', - add column repeat_of integer comment 'notice this is a repeat of' references notice (id), - drop index notice_profile_id_idx, - add index notice_profile_id_idx (profile_id,created,id), - add index notice_repeatof_idx (repeat_of); - -alter table message - modify column content text comment 'message content'; - -alter table profile - modify column bio text comment 'descriptive biography', - add column lat decimal(10,7) comment 'latitude', - add column lon decimal(10,7) comment 'longitude', - add column location_id integer comment 'location id if possible', - add column location_ns integer comment 'namespace for location'; - -alter table user_group - modify column description text comment 'group description'; - -alter table file_oembed - add column mimetype varchar(50) comment 'mime type of resource'; - -alter table fave - drop index fave_user_id_idx, - add index fave_user_id_idx (user_id,modified); - -alter table subscription - drop index subscription_subscriber_idx, - add index subscription_subscriber_idx (subscriber,created), - drop index subscription_subscribed_idx, - add index subscription_subscribed_idx (subscribed,created); - -create table deleted_notice ( - - id integer primary key comment 'identity of notice', - profile_id integer not null comment 'author of the notice', - uri varchar(255) unique key comment 'universally unique identifier, usually a tag URI', - created datetime not null comment 'date the notice record was created', - deleted datetime not null comment 'date the notice record was created', - - index deleted_notice_profile_id_idx (profile_id) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table config ( - - section varchar(32) comment 'configuration section', - setting varchar(32) comment 'configuration setting', - value varchar(255) comment 'configuration value', - - constraint primary key (section, setting) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table profile_role ( - - profile_id integer not null comment 'account having the role' references profile (id), - role varchar(32) not null comment 'string representing the role', - created datetime not null comment 'date the role was granted', - - constraint primary key (profile_id, role) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table location_namespace ( - - id integer primary key comment 'identity for this namespace', - description varchar(255) comment 'description of the namespace', - created datetime not null comment 'date the record was created', - modified timestamp comment 'date this record was modified' - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table login_token ( - user_id integer not null comment 'user owning this token' references user (id), - token char(32) not null comment 'token useable for logging in', - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified', - - constraint primary key (user_id) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table user_location_prefs ( - user_id integer not null comment 'user who has the preference' references user (id), - share_location tinyint default 1 comment 'Whether to share location data', - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified', - - constraint primary key (user_id) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table queue_item_new ( - id integer auto_increment primary key comment 'unique identifier', - frame blob not null comment 'data: object reference or opaque string', - transport varchar(8) not null comment 'queue for what? "email", "jabber", "sms", "irc", ...', - created datetime not null comment 'date this record was created', - claimed datetime comment 'date this item was claimed', - - index queue_item_created_idx (created) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -insert into queue_item_new (frame,transport,created,claimed) - select notice_id,transport,created,claimed from queue_item; -alter table queue_item rename to queue_item_old; -alter table queue_item_new rename to queue_item; - -alter table consumer - add consumer_secret varchar(255) not null comment 'secret value'; - -alter table token - add verifier varchar(255) comment 'verifier string for OAuth 1.0a', - add verified_callback varchar(255) comment 'verified callback URL for OAuth 1.0a'; - -create table oauth_application ( - id integer auto_increment primary key comment 'unique identifier', - owner integer not null comment 'owner of the application' references profile (id), - consumer_key varchar(255) not null comment 'application consumer key' references consumer (consumer_key), - name varchar(255) not null comment 'name of the application', - description varchar(255) comment 'description of the application', - icon varchar(255) not null comment 'application icon', - source_url varchar(255) comment 'application homepage - used for source link', - organization varchar(255) comment 'name of the organization running the application', - homepage varchar(255) comment 'homepage for the organization', - callback_url varchar(255) comment 'url to redirect to after authentication', - type tinyint default 0 comment 'type of app, 1 = browser, 2 = desktop', - access_type tinyint default 0 comment 'default access type, bit 1 = read, bit 2 = write', - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified' -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table oauth_application_user ( - profile_id integer not null comment 'user of the application' references profile (id), - application_id integer not null comment 'id of the application' references oauth_application (id), - access_type tinyint default 0 comment 'access type, bit 1 = read, bit 2 = write, bit 3 = revoked', - token varchar(255) comment 'request or access token', - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified', - constraint primary key (profile_id, application_id) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table inbox ( - - user_id integer not null comment 'user receiving the notice' references user (id), - notice_ids blob comment 'packed list of notice ids', - - constraint primary key (user_id) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table conversation ( - id integer auto_increment primary key comment 'unique identifier', - uri varchar(225) unique comment 'URI of the conversation', - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified' -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - --- stub entry to push the autoincrement past existing notice ids -insert into conversation (id,created) - select max(id)+1, now() from notice; - -alter table user_group - add uri varchar(255) unique key comment 'universal identifier', - add mainpage varchar(255) comment 'page for group info to link to', - drop index nickname; - -create table local_group ( - - group_id integer primary key comment 'group represented' references user_group (id), - nickname varchar(64) unique key comment 'group represented', - - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified' - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -insert into local_group (group_id, nickname, created) - select id, nickname, created from user_group; - -alter table file_to_post - add index post_id_idx (post_id); - -alter table group_inbox - add index group_inbox_notice_id_idx (notice_id); - diff --git a/db/08to09_pg.sql b/db/08to09_pg.sql deleted file mode 100644 index d3eb644437..0000000000 --- a/db/08to09_pg.sql +++ /dev/null @@ -1,140 +0,0 @@ --- SQL commands to update an 0.8.x version of Laconica --- to 0.9.x. - ---these are just comments -/* -alter table notice - modify column content text comment 'update content'; - -alter table message - modify column content text comment 'message content'; - -alter table profile - modify column bio text comment 'descriptive biography'; - -alter table user_group - modify column description text comment 'group description'; -*/ - -alter table file_oembed - add column mimetype varchar(50) /*comment 'mime type of resource'*/; - -create table config ( - - section varchar(32) /* comment 'configuration section'*/, - setting varchar(32) /* comment 'configuration setting'*/, - value varchar(255) /* comment 'configuration value'*/, - - primary key (section, setting) - -); - -create table profile_role ( - - profile_id integer not null /* comment 'account having the role'*/ references profile (id), - role varchar(32) not null /* comment 'string representing the role'*/, - created timestamp /* not null comment 'date the role was granted'*/, - - primary key (profile_id, role) - -); - -create table location_namespace ( - - id integer /*comment 'identity for this namespace'*/, - description text /* comment 'description of the namespace'*/ , - created integer not null /*comment 'date the record was created*/ , - /* modified timestamp comment 'date this record was modified',*/ - primary key (id) - -); - -create table login_token ( - user_id integer not null /* comment 'user owning this token'*/ references "user" (id), - token char(32) not null /* comment 'token useable for logging in'*/, - created timestamp not null DEFAULT CURRENT_TIMESTAMP /* comment 'date this record was created'*/, - modified timestamp /* comment 'date this record was modified'*/, - - primary key (user_id) -); - -DROP index fave_user_id_idx; -CREATE index fave_user_id_idx on fave (user_id,modified); - -DROP index subscription_subscriber_idx; -CREATE index subscription_subscriber_idx ON subscription (subscriber,created); - -DROP index subscription_subscribed_idx; -CREATE index subscription_subscribed_idx ON subscription (subscribed,created); - -DROP index notice_profile_id_idx; -CREATE index notice_profile_id_idx ON notice (profile_id,created,id); - -ALTER TABLE notice ADD COLUMN lat decimal(10, 7) /* comment 'latitude'*/; -ALTER TABLE notice ADD COLUMN lon decimal(10,7) /* comment 'longitude'*/; -ALTER TABLE notice ADD COLUMN location_id integer /* comment 'location id if possible'*/ ; -ALTER TABLE notice ADD COLUMN location_ns integer /* comment 'namespace for location'*/; -ALTER TABLE notice ADD COLUMN repeat_of integer /* comment 'notice this is a repeat of' */ references notice (id); - -ALTER TABLE profile ADD COLUMN lat decimal(10,7) /*comment 'latitude'*/ ; -ALTER TABLE profile ADD COLUMN lon decimal(10,7) /*comment 'longitude'*/; -ALTER TABLE profile ADD COLUMN location_id integer /* comment 'location id if possible'*/; -ALTER TABLE profile ADD COLUMN location_ns integer /* comment 'namespace for location'*/; - -ALTER TABLE consumer add COLUMN consumer_secret varchar(255) not null ; /*comment 'secret value'*/ - -ALTER TABLE token ADD COLUMN verifier varchar(255); /* comment 'verifier string for OAuth 1.0a',*/ -ALTER TABLE token ADD COLUMN verified_callback varchar(255); /* comment 'verified callback URL for OAuth 1.0a',*/ - -create table queue_item_new ( - id serial /* comment 'unique identifier'*/, - frame bytea not null /* comment 'data: object reference or opaque string'*/, - transport varchar(8) not null /*comment 'queue for what? "email", "jabber", "sms", "irc", ...'*/, - created timestamp not null default CURRENT_TIMESTAMP /*comment 'date this record was created'*/, - claimed timestamp /*comment 'date this item was claimed'*/, - PRIMARY KEY (id) -); - -insert into queue_item_new (frame,transport,created,claimed) - select ('0x' || notice_id::text)::bytea,transport,created,claimed from queue_item; -alter table queue_item rename to queue_item_old; -alter table queue_item_new rename to queue_item; - -ALTER TABLE confirm_address ALTER column sent set default CURRENT_TIMESTAMP; - -create table user_location_prefs ( - user_id integer not null /*comment 'user who has the preference'*/ references "user" (id), - share_location int default 1 /* comment 'Whether to share location data'*/, - created timestamp not null /*comment 'date this record was created'*/, - modified timestamp /* comment 'date this record was modified'*/, - - primary key (user_id) -); - -create table inbox ( - - user_id integer not null /* comment 'user receiving the notice' */ references "user" (id), - notice_ids bytea /* comment 'packed list of notice ids' */, - - primary key (user_id) - -); - -create table user_location_prefs ( - user_id integer not null /*comment 'user who has the preference'*/ references "user" (id), - share_location int default 1 /* comment 'Whether to share location data'*/, - created timestamp not null /*comment 'date this record was created'*/, - modified timestamp /* comment 'date this record was modified'*/, - - primary key (user_id) -); - -create table inbox ( - - user_id integer not null /* comment 'user receiving the notice' */ references "user" (id), - notice_ids bytea /* comment 'packed list of notice ids' */, - - primary key (user_id) - -); - diff --git a/db/095topeopletags.sql b/db/095topeopletags.sql deleted file mode 100644 index e193b98156..0000000000 --- a/db/095topeopletags.sql +++ /dev/null @@ -1,4 +0,0 @@ -/* populate people tags metadata */ - -insert into profile_list (tagger, tag, modified, description, private) - select distinct tagger, tag, modified, null, false from profile_tag; diff --git a/db/096to097.sql b/db/096to097.sql deleted file mode 100644 index 209a3a8811..0000000000 --- a/db/096to097.sql +++ /dev/null @@ -1,26 +0,0 @@ --- Add indexes for sorting changes in 0.9.7 - --- Allows sorting public timeline, api/statuses/repeats, and conversations by timestamp efficiently -alter table notice - add index notice_created_id_is_local_idx (created,id,is_local), - - add index notice_repeat_of_created_id_idx (repeat_of, created, id), - drop index notice_repeatof_idx, - - add index notice_conversation_created_id_idx (conversation, created, id), - drop index notice_conversation_idx; - --- Allows sorting tag-filtered public timeline by timestamp efficiently -alter table notice_tag add index notice_tag_tag_created_notice_id_idx (tag, created, notice_id); - --- Needed for sorting reply/mentions timelines -alter table reply add index reply_profile_id_modified_notice_id_idx (profile_id, modified, notice_id); - --- Needed for sorting group messages by timestamp -alter table group_inbox add index group_inbox_group_id_created_notice_id_idx (group_id, created, notice_id); - --- Helps make some reverse role lookups more efficient if there's a lot of assigned accounts -alter table profile_role add index profile_role_role_created_profile_id_idx (role, created, profile_id); - --- Fix for sorting a user's group memberships by order joined -alter table group_member add index group_member_profile_id_created_idx (profile_id, created); diff --git a/db/beta5tobeta6.sql b/db/beta5tobeta6.sql deleted file mode 100644 index e9dff17efe..0000000000 --- a/db/beta5tobeta6.sql +++ /dev/null @@ -1,28 +0,0 @@ -alter table oauth_application - modify column name varchar(255) not null unique key comment 'name of the application', - modify column access_type tinyint default 0 comment 'access type, bit 1 = read, bit 2 = write'; - -alter table user_group -add column uri varchar(255) unique key comment 'universal identifier', -add column mainpage varchar(255) comment 'page for group info to link to', -drop index nickname; - -create table conversation ( - id integer auto_increment primary key comment 'unique identifier', - uri varchar(225) unique comment 'URI of the conversation', - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified' -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table local_group ( - group_id integer primary key comment 'group represented' references user_group (id), - nickname varchar(64) unique key comment 'group represented', - - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified' - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -insert into local_group (group_id, nickname, created) -select id, nickname, created from user_group; - diff --git a/db/core.php b/db/core.php index 626672bf5f..bf8cae3c4b 100644 --- a/db/core.php +++ b/db/core.php @@ -29,1084 +29,66 @@ * double-check what we've been doing on postgres? */ -$schema['profile'] = array( - 'description' => 'local and remote users have profiles', - 'fields' => array( - 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'unique identifier'), - 'nickname' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'nickname or username'), - 'fullname' => array('type' => 'varchar', 'length' => 255, 'description' => 'display name'), - 'profileurl' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL, cached so we dont regenerate'), - 'homepage' => array('type' => 'varchar', 'length' => 255, 'description' => 'identifying URL'), - 'bio' => array('type' => 'text', 'description' => 'descriptive biography'), - 'location' => array('type' => 'varchar', 'length' => 255, 'description' => 'physical location'), - 'lat' => array('type' => 'numeric', 'precision' => 10, 'scale' => 7, 'description' => 'latitude'), - 'lon' => array('type' => 'numeric', 'precision' => 10, 'scale' => 7, 'description' => 'longitude'), - 'location_id' => array('type' => 'int', 'description' => 'location id if possible'), - 'location_ns' => array('type' => 'int', 'description' => 'namespace for location'), - - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('id'), - 'indexes' => array( - 'profile_nickname_idx' => array('nickname'), - ), - 'fulltext indexes' => array( - 'nickname' => array('nickname', 'fullname', 'location', 'bio', 'homepage') - ), +$classes = array('Schema_version', + 'Profile', + 'Avatar', + 'Sms_carrier', + 'User', + 'Remote_profile', + 'Subscription', + 'Group_join_queue', + 'Subscription_queue', + 'Oauth_token_association', + 'Notice', + 'Notice_source', + 'Reply', + 'Fave', + 'Consumer', + 'Token', + 'Nonce', + 'Oauth_application', + 'Oauth_application_user', + 'Confirm_address', + 'Remember_me', + 'Queue_item', + 'Notice_tag', + 'Foreign_service', + 'Foreign_user', + 'Foreign_link', + 'Foreign_subscription', + 'Invitation', + 'Message', + // 'Notice_inbox', + 'Profile_tag', + 'Profile_list', + 'Profile_tag_subscription', + 'Profile_block', + 'User_group', + 'Related_group', + 'Group_inbox', + 'Group_member', + 'File', + 'File_oembed', + 'File_redirection', + 'File_thumbnail', + 'File_to_post', + 'Group_block', + 'Group_alias', + 'Session', + 'Deleted_notice', + 'Config', + 'Profile_role', + 'Location_namespace', + 'Login_token', + 'User_location_prefs', + 'Inbox', + 'User_im_prefs', + 'Conversation', + 'Local_group', + 'User_urlshortener_prefs', + 'Old_school_prefs', ); -$schema['avatar'] = array( - 'fields' => array( - 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to profile table'), - 'original' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'uploaded by user or generated?'), - 'width' => array('type' => 'int', 'not null' => true, 'description' => 'image width'), - 'height' => array('type' => 'int', 'not null' => true, 'description' => 'image height'), - 'mediatype' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'file type'), - 'filename' => array('type' => 'varchar', 'length' => 255, 'description' => 'local filename, if local'), - 'url' => array('type' => 'varchar', 'length' => 255, 'description' => 'avatar location'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('profile_id', 'width', 'height'), - 'unique keys' => array( - 'avatar_url_key' => array('url'), - ), - 'foreign keys' => array( - 'avatar_profile_id_fkey' => array('profile', array('profile_id' => 'id')), - ), - 'indexes' => array( - 'avatar_profile_id_idx' => array('profile_id'), - ), -); - -$schema['sms_carrier'] = array( - 'fields' => array( - 'id' => array('type' => 'int', 'not null' => true, 'description' => 'primary key for SMS carrier'), - 'name' => array('type' => 'varchar', 'length' => 64, 'description' => 'name of the carrier'), - 'email_pattern' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'sprintf pattern for making an email address from a phone number'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('id'), - 'unique keys' => array( - 'sms_carrier_name_key' => array('name'), - ), -); - -$schema['user'] = array( - 'description' => 'local users', - 'fields' => array( - 'id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to profile table'), - 'nickname' => array('type' => 'varchar', 'length' => 64, 'description' => 'nickname or username, duped in profile'), - 'password' => array('type' => 'varchar', 'length' => 255, 'description' => 'salted password, can be null for OpenID users'), - 'email' => array('type' => 'varchar', 'length' => 255, 'description' => 'email address for password recovery etc.'), - 'incomingemail' => array('type' => 'varchar', 'length' => 255, 'description' => 'email address for post-by-email'), - 'emailnotifysub' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Notify by email of subscriptions'), - 'emailnotifyfav' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Notify by email of favorites'), - 'emailnotifynudge' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Notify by email of nudges'), - 'emailnotifymsg' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Notify by email of direct messages'), - 'emailnotifyattn' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Notify by email of @-replies'), - 'emailmicroid' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'whether to publish email microid'), - 'language' => array('type' => 'varchar', 'length' => 50, 'description' => 'preferred language'), - 'timezone' => array('type' => 'varchar', 'length' => 50, 'description' => 'timezone'), - 'emailpost' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Post by email'), - 'sms' => array('type' => 'varchar', 'length' => 64, 'description' => 'sms phone number'), - 'carrier' => array('type' => 'int', 'description' => 'foreign key to sms_carrier'), - 'smsnotify' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'whether to send notices to SMS'), - 'smsreplies' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'whether to send notices to SMS on replies'), - 'smsemail' => array('type' => 'varchar', 'length' => 255, 'description' => 'built from sms and carrier'), - 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier, usually a tag URI'), - 'autosubscribe' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'automatically subscribe to users who subscribe to us'), - 'subscribe_policy' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => '0 = anybody can subscribe; 1 = require approval'), - 'urlshorteningservice' => array('type' => 'varchar', 'length' => 50, 'default' => 'internal', 'description' => 'service to use for auto-shortening URLs'), - 'inboxed' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'has an inbox been created for this user?'), - 'design_id' => array('type' => 'int', 'description' => 'id of a design'), - 'viewdesigns' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'whether to view user-provided designs'), - 'private_stream' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'whether to limit all notices to followers only'), - - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('id'), - 'unique keys' => array( - 'user_nickname_key' => array('nickname'), - 'user_email_key' => array('email'), - 'user_incomingemail_key' => array('incomingemail'), - 'user_sms_key' => array('sms'), - 'user_uri_key' => array('uri'), - ), - 'foreign keys' => array( - 'user_id_fkey' => array('profile', array('id' => 'id')), - 'user_carrier_fkey' => array('sms_carrier', array('carrier' => 'id')), - 'user_design_id_fkey' => array('design', array('design_id' => 'id')), - ), - 'indexes' => array( - 'user_smsemail_idx' => array('smsemail'), - ), -); - -$schema['remote_profile'] = array( - 'description' => 'remote people (OMB)', - 'fields' => array( - 'id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to profile table'), - 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier, usually a tag URI'), - 'postnoticeurl' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL we use for posting notices'), - 'updateprofileurl' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL we use for updates to this profile'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('id'), - 'unique keys' => array( - 'remote_profile_uri_key' => array('uri'), - ), - 'foreign keys' => array( - 'remote_profile_id_fkey' => array('profile', array('id' => 'id')), - ), -); - -$schema['subscription'] = array( - 'fields' => array( - 'subscriber' => array('type' => 'int', 'not null' => true, 'description' => 'profile listening'), - 'subscribed' => array('type' => 'int', 'not null' => true, 'description' => 'profile being listened to'), - 'jabber' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'deliver jabber messages'), - 'sms' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'deliver sms messages'), - 'token' => array('type' => 'varchar', 'length' => 255, 'description' => 'authorization token'), - 'secret' => array('type' => 'varchar', 'length' => 255, 'description' => 'token secret'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('subscriber', 'subscribed'), - 'indexes' => array( - 'subscription_subscriber_idx' => array('subscriber', 'created'), - 'subscription_subscribed_idx' => array('subscribed', 'created'), - 'subscription_token_idx' => array('token'), - ), -); - -$schema['notice'] = array( - 'fields' => array( - 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'unique identifier'), - 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'who made the update'), - 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier, usually a tag URI'), - 'content' => array('type' => 'text', 'description' => 'update content'), - 'rendered' => array('type' => 'text', 'description' => 'HTML version of the content'), - 'url' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL of any attachment (image, video, bookmark, whatever)'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - 'reply_to' => array('type' => 'int', 'description' => 'notice replied to (usually a guess)'), - 'is_local' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'notice was generated by a user'), - 'source' => array('type' => 'varchar', 'length' => 32, 'description' => 'source of comment, like "web", "im", or "clientname"'), - 'conversation' => array('type' => 'int', 'description' => 'id of root notice in this conversation'), - 'lat' => array('type' => 'numeric', 'precision' => 10, 'scale' => 7, 'description' => 'latitude'), - 'lon' => array('type' => 'numeric', 'precision' => 10, 'scale' => 7, 'description' => 'longitude'), - 'location_id' => array('type' => 'int', 'description' => 'location id if possible'), - 'location_ns' => array('type' => 'int', 'description' => 'namespace for location'), - 'repeat_of' => array('type' => 'int', 'description' => 'notice this is a repeat of'), - 'object_type' => array('type' => 'varchar', 'length' => 255, 'description' => 'URI representing activity streams object type', 'default' => 'http://activitystrea.ms/schema/1.0/note'), - 'scope' => array('type' => 'int', - 'default' => '1', - 'description' => 'bit map for distribution scope; 0 = everywhere; 1 = this server only; 2 = addressees; 4 = followers'), - ), - 'primary key' => array('id'), - 'unique keys' => array( - 'notice_uri_key' => array('uri'), - ), - 'foreign keys' => array( - 'notice_profile_id_fkey' => array('profile', array('profile_id' => 'id')), - 'notice_reply_to_fkey' => array('notice', array('reply_to' => 'id')), - 'notice_conversation_fkey' => array('conversation', array('conversation' => 'id')), # note... used to refer to notice.id - 'notice_repeat_of_fkey' => array('notice', array('repeat_of' => 'id')), # @fixme: what about repeats of deleted notices? - ), - 'indexes' => array( - 'notice_profile_id_idx' => array('profile_id', 'created', 'id'), - 'notice_conversation_idx' => array('conversation'), - 'notice_created_idx' => array('created'), - 'notice_replyto_idx' => array('reply_to'), - 'notice_repeatof_idx' => array('repeat_of'), - ), - 'fulltext indexes' => array( - 'content' => array('content'), - ) -); - -$schema['notice_source'] = array( - 'fields' => array( - 'code' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'source code'), - 'name' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'name of the source'), - 'url' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'url to link to'), - 'notice_id' => array('type' => 'int', 'not null' => true, 'description' => 'date this record was created'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('code'), -); - -$schema['reply'] = array( - 'fields' => array( - 'notice_id' => array('type' => 'int', 'not null' => true, 'description' => 'notice that is the reply'), - 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'profile replied to'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - 'replied_id' => array('type' => 'int', 'description' => 'notice replied to (not used, see notice.reply_to)'), - ), - 'primary key' => array('notice_id', 'profile_id'), - 'foreign keys' => array( - 'reply_notice_id_fkey' => array('notice', array('notice_id' => 'id')), - 'reply_profile_id_fkey' => array('profile', array('profile_id' => 'id')), - ), - 'indexes' => array( - 'reply_notice_id_idx' => array('notice_id'), - 'reply_profile_id_idx' => array('profile_id'), - 'reply_replied_id_idx' => array('replied_id'), - ), -); - -$schema['fave'] = array( - 'fields' => array( - 'notice_id' => array('type' => 'int', 'not null' => true, 'description' => 'notice that is the favorite'), - 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user who likes this notice'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('notice_id', 'user_id'), - 'foreign keys' => array( - 'fave_notice_id_fkey' => array('notice', array('notice_id' => 'id')), - 'fave_user_id_fkey' => array('profile', array('user_id' => 'id')), // note: formerly referenced notice.id, but we can now record remote users' favorites - ), - 'indexes' => array( - 'fave_notice_id_idx' => array('notice_id'), - 'fave_user_id_idx' => array('user_id', 'modified'), - 'fave_modified_idx' => array('modified'), - ), -); - -/* tables for OAuth */ - -$schema['consumer'] = array( - 'description' => 'OAuth consumer record', - 'fields' => array( - 'consumer_key' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'unique identifier, root URL'), - 'consumer_secret' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'secret value'), - 'seed' => array('type' => 'char', 'length' => 32, 'not null' => true, 'description' => 'seed for new tokens by this consumer'), - - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('consumer_key'), -); - -$schema['token'] = array( - 'description' => 'OAuth token record', - 'fields' => array( - 'consumer_key' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'unique identifier, root URL'), - 'tok' => array('type' => 'char', 'length' => 32, 'not null' => true, 'description' => 'identifying value'), - 'secret' => array('type' => 'char', 'length' => 32, 'not null' => true, 'description' => 'secret value'), - 'type' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 0, 'description' => 'request or access'), - 'state' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'for requests, 0 = initial, 1 = authorized, 2 = used'), - 'verifier' => array('type' => 'varchar', 'length' => 255, 'description' => 'verifier string for OAuth 1.0a'), - 'verified_callback' => array('type' => 'varchar', 'length' => 255, 'description' => 'verified callback URL for OAuth 1.0a'), - - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('consumer_key', 'tok'), - 'foreign keys' => array( - 'token_consumer_key_fkey' => array('consumer', array('consumer_key'=> 'consumer_key')), - ), -); - -$schema['nonce'] = array( - 'description' => 'OAuth nonce record', - 'fields' => array( - 'consumer_key' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'unique identifier, root URL'), - 'tok' => array('type' => 'char', 'length' => 32, 'description' => 'buggy old value, ignored'), - 'nonce' => array('type' => 'char', 'length' => 32, 'not null' => true, 'description' => 'nonce'), - 'ts' => array('type' => 'datetime', 'not null' => true, 'description' => 'timestamp sent'), - - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('consumer_key', 'ts', 'nonce'), -); - -$schema['oauth_application'] = array( - 'description' => 'OAuth application registration record', - 'fields' => array( - 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'unique identifier'), - 'owner' => array('type' => 'int', 'not null' => true, 'description' => 'owner of the application'), - 'consumer_key' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'application consumer key'), - 'name' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'name of the application'), - 'description' => array('type' => 'varchar', 'length' => 255, 'description' => 'description of the application'), - 'icon' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'application icon'), - 'source_url' => array('type' => 'varchar', 'length' => 255, 'description' => 'application homepage - used for source link'), - 'organization' => array('type' => 'varchar', 'length' => 255, 'description' => 'name of the organization running the application'), - 'homepage' => array('type' => 'varchar', 'length' => 255, 'description' => 'homepage for the organization'), - 'callback_url' => array('type' => 'varchar', 'length' => 255, 'description' => 'url to redirect to after authentication'), - 'type' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'type of app, 1 = browser, 2 = desktop'), - 'access_type' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'default access type, bit 1 = read, bit 2 = write'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('id'), - 'unique keys' => array( - 'oauth_application_name_key' => array('name'), // in the long run, we should perhaps not force these unique, and use another source id - ), - 'foreign keys' => array( - 'oauth_application_owner_fkey' => array('profile', array('owner' => 'id')), // Are remote users allowed to create oauth application records? - 'oauth_application_consumer_key_fkey' => array('consumer', array('consumer_key' => 'consumer_key')), - ), -); - -$schema['oauth_application_user'] = array( - 'fields' => array( - 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'user of the application'), - 'application_id' => array('type' => 'int', 'not null' => true, 'description' => 'id of the application'), - 'access_type' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'access type, bit 1 = read, bit 2 = write'), - 'token' => array('type' => 'varchar', 'length' => 255, 'description' => 'request or access token'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('profile_id', 'application_id'), - 'foreign keys' => array( - 'oauth_application_user_profile_id_fkey' => array('profile', array('profile_id' => 'id')), - 'oauth_application_user_application_id_fkey' => array('oauth_application', array('application_id' => 'id')), - ), -); - -/* These are used by JanRain OpenID library */ - -$schema['oid_associations'] = array( - 'fields' => array( - 'server_url' => array('type' => 'blob', 'not null' => true), - 'handle' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'default' => ''), // character set latin1, - 'secret' => array('type' => 'blob'), - 'issued' => array('type' => 'int'), - 'lifetime' => array('type' => 'int'), - 'assoc_type' => array('type' => 'varchar', 'length' => 64), - ), - 'primary key' => array(array('server_url', 255), 'handle'), -); - -$schema['oid_nonces'] = array( - 'fields' => array( - 'server_url' => array('type' => 'varchar', 'length' => 2047), - 'timestamp' => array('type' => 'int'), - 'salt' => array('type' => 'char', 'length' => 40), - ), - 'unique keys' => array( - 'oid_nonces_server_url_timestamp_salt_key' => array(array('server_url', 255), 'timestamp', 'salt'), - ), -); - -$schema['confirm_address'] = array( - 'fields' => array( - 'code' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'good random code'), - 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user who requested confirmation'), - 'address' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'address (email, xmpp, SMS, etc.)'), - 'address_extra' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'carrier ID, for SMS'), - 'address_type' => array('type' => 'varchar', 'length' => 8, 'not null' => true, 'description' => 'address type ("email", "xmpp", "sms")'), - 'claimed' => array('type' => 'datetime', 'description' => 'date this was claimed for queueing'), - 'sent' => array('type' => 'datetime', 'description' => 'date this was sent for queueing'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('code'), - 'foreign keys' => array( - 'confirm_address_user_id_fkey' => array('user', array('user_id' => 'id')), - ), -); - -$schema['remember_me'] = array( - 'fields' => array( - 'code' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'good random code'), - 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user who is logged in'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('code'), - 'foreign keys' => array( - 'remember_me_user_id_fkey' => array('user', array('user_id' => 'id')), - ), -); - -$schema['queue_item'] = array( - 'fields' => array( - 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'unique identifier'), - 'frame' => array('type' => 'blob', 'not null' => true, 'description' => 'data: object reference or opaque string'), - 'transport' => array('type' => 'varchar', 'length' => 8, 'not null' => true, 'description' => 'queue for what? "email", "xmpp", "sms", "irc", ...'), // @fixme 8 chars is too short; bump up. - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'claimed' => array('type' => 'datetime', 'description' => 'date this item was claimed'), - ), - 'primary key' => array('id'), - 'indexes' => array( - 'queue_item_created_idx' => array('created'), - ), -); - -$schema['notice_tag'] = array( - 'description' => 'Hash tags', - 'fields' => array( - 'tag' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'hash tag associated with this notice'), - 'notice_id' => array('type' => 'int', 'not null' => true, 'description' => 'notice tagged'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - ), - 'primary key' => array('tag', 'notice_id'), - 'foreign keys' => array( - 'notice_tag_notice_id_fkey' => array('notice', array('notice_id' => 'id')), - ), - 'indexes' => array( - 'notice_tag_created_idx' => array('created'), - 'notice_tag_notice_id_idx' => array('notice_id'), - ), -); - -/* Synching with foreign services */ - -$schema['foreign_service'] = array( - 'fields' => array( - 'id' => array('type' => 'int', 'not null' => true, 'description' => 'numeric key for service'), - 'name' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'name of the service'), - 'description' => array('type' => 'varchar', 'length' => 255, 'description' => 'description'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('id'), - 'unique keys' => array( - 'foreign_service_name_key' => array('name'), - ), -); - -$schema['foreign_user'] = array( - 'fields' => array( - 'id' => array('type' => 'int', 'size' => 'big', 'not null' => true, 'description' => 'unique numeric key on foreign service'), - 'service' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to service'), - 'uri' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'identifying URI'), - 'nickname' => array('type' => 'varchar', 'length' => 255, 'description' => 'nickname on foreign service'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('id', 'service'), - 'foreign keys' => array( - 'foreign_user_service_fkey' => array('foreign_service', array('service' => 'id')), - ), - 'unique keys' => array( - 'foreign_user_uri_key' => array('uri'), - ), -); - -$schema['foreign_link'] = array( - 'fields' => array( - 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'link to user on this system, if exists'), - 'foreign_id' => array('type' => 'int', 'size' => 'big', 'unsigned' => true, 'not null' => true, 'description' => 'link to user on foreign service, if exists'), - 'service' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to service'), - 'credentials' => array('type' => 'varchar', 'length' => 255, 'description' => 'authc credentials, typically a password'), - 'noticesync' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 1, 'description' => 'notice synchronization, bit 1 = sync outgoing, bit 2 = sync incoming, bit 3 = filter local replies'), - 'friendsync' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 2, 'description' => 'friend synchronization, bit 1 = sync outgoing, bit 2 = sync incoming'), - 'profilesync' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 1, 'description' => 'profile synchronization, bit 1 = sync outgoing, bit 2 = sync incoming'), - 'last_noticesync' => array('type' => 'datetime', 'description' => 'last time notices were imported'), - 'last_friendsync' => array('type' => 'datetime', 'description' => 'last time friends were imported'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('user_id', 'foreign_id', 'service'), - 'foreign keys' => array( - 'foreign_link_user_id_fkey' => array('user', array('user_id' => 'id')), - 'foreign_link_foreign_id_fkey' => array('foreign_user', array('foreign_id' => 'id', 'service' => 'service')), - 'foreign_link_service_fkey' => array('foreign_service', array('service' => 'id')), - ), - 'indexes' => array( - 'foreign_user_user_id_idx' => array('user_id'), - ), -); - -$schema['foreign_subscription'] = array( - 'fields' => array( - 'service' => array('type' => 'int', 'not null' => true, 'description' => 'service where relationship happens'), - 'subscriber' => array('type' => 'int', 'size' => 'big', 'not null' => true, 'description' => 'subscriber on foreign service'), - 'subscribed' => array('type' => 'int', 'size' => 'big', 'not null' => true, 'description' => 'subscribed user'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - ), - 'primary key' => array('service', 'subscriber', 'subscribed'), - 'foreign keys' => array( - 'foreign_subscription_service_fkey' => array('foreign_service', array('service' => 'id')), - 'foreign_subscription_subscriber_fkey' => array('foreign_user', array('subscriber' => 'id', 'service' => 'service')), - 'foreign_subscription_subscribed_fkey' => array('foreign_user', array('subscribed' => 'id', 'service' => 'service')), - ), - 'indexes' => array( - 'foreign_subscription_subscriber_idx' => array('service', 'subscriber'), - 'foreign_subscription_subscribed_idx' => array('service', 'subscribed'), - ), -); - -$schema['invitation'] = array( - 'fields' => array( - 'code' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'random code for an invitation'), - 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'who sent the invitation'), - 'address' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'invitation sent to'), - 'address_type' => array('type' => 'varchar', 'length' => 8, 'not null' => true, 'description' => 'address type ("email", "xmpp", "sms")'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'registered_user_id' => array('type' => 'int', 'not null' => false, 'description' => 'if the invitation is converted, who the new user is'), - ), - 'primary key' => array('code'), - 'foreign keys' => array( - 'invitation_user_id_fkey' => array('user', array('user_id' => 'id')), - 'invitation_registered_user_id_fkey' => array('user', array('registered_user_id' => 'id')), - ), - 'indexes' => array( - 'invitation_address_idx' => array('address', 'address_type'), - 'invitation_user_id_idx' => array('user_id'), - 'invitation_registered_user_id_idx' => array('registered_user_id'), - ), -); - -$schema['message'] = array( - 'fields' => array( - 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'unique identifier'), - 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier'), - 'from_profile' => array('type' => 'int', 'not null' => true, 'description' => 'who the message is from'), - 'to_profile' => array('type' => 'int', 'not null' => true, 'description' => 'who the message is to'), - 'content' => array('type' => 'text', 'description' => 'message content'), - 'rendered' => array('type' => 'text', 'description' => 'HTML version of the content'), - 'url' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL of any attachment (image, video, bookmark, whatever)'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - 'source' => array('type' => 'varchar', 'length' => 32, 'description' => 'source of comment, like "web", "im", or "clientname"'), - ), - 'primary key' => array('id'), - 'unique keys' => array( - 'message_uri_key' => array('uri'), - ), - 'foreign keys' => array( - 'message_from_profile_fkey' => array('profile', array('from_profile' => 'id')), - 'message_to_profile_fkey' => array('profile', array('to_profile' => 'id')), - ), - 'indexes' => array( - // @fixme these are really terrible indexes, since you can only sort on one of them at a time. - // looks like we really need a (to_profile, created) for inbox and a (from_profile, created) for outbox - 'message_from_idx' => array('from_profile'), - 'message_to_idx' => array('to_profile'), - 'message_created_idx' => array('created'), - ), -); - -$schema['notice_inbox'] = array( - 'description' => 'Obsolete; old entries here are converted to packed entries in the inbox table since 0.9', - 'fields' => array( - 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user receiving the message'), - 'notice_id' => array('type' => 'int', 'not null' => true, 'description' => 'notice received'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date the notice was created'), - 'source' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'reason it is in the inbox, 1=subscription'), - ), - 'primary key' => array('user_id', 'notice_id'), - 'foreign keys' => array( - 'notice_inbox_user_id_fkey' => array('user', array('user_id' => 'id')), - 'notice_inbox_notice_id_fkey' => array('notice', array('notice_id' => 'id')), - ), - 'indexes' => array( - 'notice_inbox_notice_id_idx' => array('notice_id'), - ), -); - -$schema['profile_tag'] = array( - 'fields' => array( - 'tagger' => array('type' => 'int', 'not null' => true, 'description' => 'user making the tag'), - 'tagged' => array('type' => 'int', 'not null' => true, 'description' => 'profile tagged'), - 'tag' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'hash tag associated with this notice'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date the tag was added'), - ), - 'primary key' => array('tagger', 'tagged', 'tag'), - 'foreign keys' => array( - 'profile_tag_tagger_fkey' => array('profile', array('tagger' => 'id')), - 'profile_tag_tagged_fkey' => array('profile', array('tagged' => 'id')), - 'profile_tag_tag_fkey' => array('profile_list', array('tag' => 'tag')), - ), - 'indexes' => array( - 'profile_tag_modified_idx' => array('modified'), - 'profile_tag_tagger_tag_idx' => array('tagger', 'tag'), - 'profile_tag_tagged_idx' => array('tagged'), - ), -); - -$schema['profile_list'] = array( - 'fields' => array( - 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'unique identifier'), - 'tagger' => array('type' => 'int', 'not null' => true, 'description' => 'user making the tag'), - 'tag' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'people tag'), - 'description' => array('type' => 'text', 'description' => 'description of the people tag'), - 'private' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'is this tag private'), - - 'created' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date the tag was added'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date the tag was modified'), - - 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universal identifier'), - 'mainpage' => array('type' => 'varchar', 'length' => 255, 'description' => 'page to link to'), - 'tagged_count' => array('type' => 'int', 'default' => 0, 'description' => 'number of people tagged with this tag by this user'), - 'subscriber_count' => array('type' => 'int', 'default' => 0, 'description' => 'number of subscribers to this tag'), - ), - 'primary key' => array('tagger', 'tag'), - 'unique keys' => array( - 'profile_list_id_key' => array('id') - ), - 'foreign keys' => array( - 'profile_list_tagger_fkey' => array('profile', array('tagger' => 'id')), - ), - 'indexes' => array( - 'profile_list_modified_idx' => array('modified'), - 'profile_list_tag_idx' => array('tag'), - 'profile_list_tagger_tag_idx' => array('tagger', 'tag'), - 'profile_list_tagged_count_idx' => array('tagged_count'), - 'profile_list_subscriber_count_idx' => array('subscriber_count'), - ), -); - -$schema['profile_tag_inbox'] = array( - 'description' => 'Many-many table listing notices associated with people tags.', - 'fields' => array( - 'profile_tag_id' => array('type' => 'int', 'not null' => true, 'description' => 'people tag receiving the message'), - 'notice_id' => array('type' => 'int', 'not null' => true, 'description' => 'notice received'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date the notice was created'), - ), - 'primary key' => array('profile_tag_id', 'notice_id'), - 'foreign keys' => array( - 'profile_tag_inbox_profile_list_id_fkey' => array('profile_list', array('profile_tag_id' => 'id')), - 'profile_tag_inbox_notice_id_fkey' => array('notice', array('notice_id' => 'id')), - ), - 'indexes' => array( - 'profile_tag_inbox_created_idx' => array('created'), - 'profile_tag_inbox_profile_tag_id_idx' => array('profile_tag_id'), - ), -); - -$schema['profile_tag_subscription'] = array( - 'fields' => array( - 'profile_tag_id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to profile_tag'), - 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to profile table'), - - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('profile_tag_id', 'profile_id'), - 'foreign keys' => array( - 'profile_tag_subscription_profile_list_id_fkey' => array('profile_list', array('profile_tag_id' => 'id')), - 'profile_tag_subscription_profile_id_fkey' => array('profile', array('profile_id' => 'id')), - ), - 'indexes' => array( - // @fixme probably we want a (profile_id, created) index here? - 'profile_tag_subscription_profile_id_idx' => array('profile_id'), - 'profile_tag_subscription_created_idx' => array('created'), - ), -); - -$schema['profile_block'] = array( - 'fields' => array( - 'blocker' => array('type' => 'int', 'not null' => true, 'description' => 'user making the block'), - 'blocked' => array('type' => 'int', 'not null' => true, 'description' => 'profile that is blocked'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date of blocking'), - ), - 'foreign keys' => array( - 'profile_block_blocker_fkey' => array('user', array('blocker' => 'id')), - 'profile_block_blocked_fkey' => array('profile', array('blocked' => 'id')), - ), - 'primary key' => array('blocker', 'blocked'), -); - -$schema['user_group'] = array( - 'fields' => array( - 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'unique identifier'), - - 'nickname' => array('type' => 'varchar', 'length' => 64, 'description' => 'nickname for addressing'), - 'fullname' => array('type' => 'varchar', 'length' => 255, 'description' => 'display name'), - 'homepage' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL, cached so we dont regenerate'), - 'description' => array('type' => 'text', 'description' => 'group description'), - 'location' => array('type' => 'varchar', 'length' => 255, 'description' => 'related physical location, if any'), - - 'original_logo' => array('type' => 'varchar', 'length' => 255, 'description' => 'original size logo'), - 'homepage_logo' => array('type' => 'varchar', 'length' => 255, 'description' => 'homepage (profile) size logo'), - 'stream_logo' => array('type' => 'varchar', 'length' => 255, 'description' => 'stream-sized logo'), - 'mini_logo' => array('type' => 'varchar', 'length' => 255, 'description' => 'mini logo'), - 'design_id' => array('type' => 'int', 'description' => 'id of a design'), - - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - - 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universal identifier'), - 'mainpage' => array('type' => 'varchar', 'length' => 255, 'description' => 'page for group info to link to'), - 'join_policy' => array('type' => 'int', 'size' => 'tiny', 'description' => '0=open; 1=requires admin approval'), - 'force_scope' => array('type' => 'int', 'size' => 'tiny', 'description' => '0=never,1=sometimes,-1=always'), - ), - 'primary key' => array('id'), - 'unique keys' => array( - 'user_group_uri_key' => array('uri'), - ), - 'foreign keys' => array( - 'user_group_design_id_fkey' => array('design', array('design_id' => 'id')), - ), - 'indexes' => array( - 'user_group_nickname_idx' => array('nickname'), - ), -); - -$schema['group_member'] = array( - 'fields' => array( - 'group_id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to user_group'), - 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to profile table'), - 'is_admin' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'is this user an admin?'), - - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('group_id', 'profile_id'), - 'foreign keys' => array( - 'group_member_group_id_fkey' => array('user_group', array('group_id' => 'id')), - 'group_member_profile_id_fkey' => array('profile', array('profile_id' => 'id')), - ), - 'indexes' => array( - // @fixme probably we want a (profile_id, created) index here? - 'group_member_profile_id_idx' => array('profile_id'), - 'group_member_created_idx' => array('created'), - ), -); - -$schema['related_group'] = array( - // @fixme description for related_group? - 'fields' => array( - 'group_id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to user_group'), - 'related_group_id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to user_group'), - - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - ), - 'primary key' => array('group_id', 'related_group_id'), - 'foreign keys' => array( - 'related_group_group_id_fkey' => array('user_group', array('group_id' => 'id')), - 'related_group_related_group_id_fkey' => array('user_group', array('related_group_id' => 'id')), - ), -); - -$schema['group_inbox'] = array( - 'description' => 'Many-many table listing notices posted to a given group, or which groups a given notice was posted to.', - 'fields' => array( - 'group_id' => array('type' => 'int', 'not null' => true, 'description' => 'group receiving the message'), - 'notice_id' => array('type' => 'int', 'not null' => true, 'description' => 'notice received'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date the notice was created'), - ), - 'primary key' => array('group_id', 'notice_id'), - 'foreign keys' => array( - 'group_inbox_group_id_fkey' => array('user_group', array('group_id' => 'id')), - 'group_inbox_notice_id_fkey' => array('notice', array('notice_id' => 'id')), - ), - 'indexes' => array( - 'group_inbox_created_idx' => array('created'), - 'group_inbox_notice_id_idx' => array('notice_id'), - ), -); - -$schema['file'] = array( - 'fields' => array( - 'id' => array('type' => 'serial', 'not null' => true), - 'url' => array('type' => 'varchar', 'length' => 255, 'description' => 'destination URL after following redirections'), - 'mimetype' => array('type' => 'varchar', 'length' => 50, 'description' => 'mime type of resource'), - 'size' => array('type' => 'int', 'description' => 'size of resource when available'), - 'title' => array('type' => 'varchar', 'length' => 255, 'description' => 'title of resource when available'), - 'date' => array('type' => 'int', 'description' => 'date of resource according to http query'), - 'protected' => array('type' => 'int', 'description' => 'true when URL is private (needs login)'), - 'filename' => array('type' => 'varchar', 'length' => 255, 'description' => 'if a local file, name of the file'), - - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('id'), - 'unique keys' => array( - 'file_url_key' => array('url'), - ), -); - -$schema['file_oembed'] = array( - 'fields' => array( - 'file_id' => array('type' => 'int', 'not null' => true, 'description' => 'oEmbed for that URL/file'), - 'version' => array('type' => 'varchar', 'length' => 20, 'description' => 'oEmbed spec. version'), - 'type' => array('type' => 'varchar', 'length' => 20, 'description' => 'oEmbed type: photo, video, link, rich'), - 'mimetype' => array('type' => 'varchar', 'length' => 50, 'description' => 'mime type of resource'), - 'provider' => array('type' => 'varchar', 'length' => 50, 'description' => 'name of this oEmbed provider'), - 'provider_url' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL of this oEmbed provider'), - 'width' => array('type' => 'int', 'description' => 'width of oEmbed resource when available'), - 'height' => array('type' => 'int', 'description' => 'height of oEmbed resource when available'), - 'html' => array('type' => 'text', 'description' => 'html representation of this oEmbed resource when applicable'), - 'title' => array('type' => 'varchar', 'length' => 255, 'description' => 'title of oEmbed resource when available'), - 'author_name' => array('type' => 'varchar', 'length' => 50, 'description' => 'author name for this oEmbed resource'), - 'author_url' => array('type' => 'varchar', 'length' => 255, 'description' => 'author URL for this oEmbed resource'), - 'url' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL for this oEmbed resource when applicable (photo, link)'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('file_id'), - 'foreign keys' => array( - 'file_oembed_file_id_fkey' => array('file', array('file_id' => 'id')), - ), -); - -$schema['file_redirection'] = array( - 'fields' => array( - 'url' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'short URL (or any other kind of redirect) for file (id)'), - 'file_id' => array('type' => 'int', 'description' => 'short URL for what URL/file'), - 'redirections' => array('type' => 'int', 'description' => 'redirect count'), - 'httpcode' => array('type' => 'int', 'description' => 'HTTP status code (20x, 30x, etc.)'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('url'), - 'foreign keys' => array( - 'file_redirection_file_id_fkey' => array('file' => array('file_id' => 'id')), - ), -); - -$schema['file_thumbnail'] = array( - 'fields' => array( - 'file_id' => array('type' => 'int', 'not null' => true, 'description' => 'thumbnail for what URL/file'), - 'url' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL of thumbnail'), - 'width' => array('type' => 'int', 'description' => 'width of thumbnail'), - 'height' => array('type' => 'int', 'description' => 'height of thumbnail'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('file_id'), - 'foreign keys' => array( - 'file_thumbnail_file_id_fkey' => array('file', array('file_id' => 'id')), - ), - 'unique keys' => array( - 'file_thumbnail_url_key' => array('url'), - ), -); - -$schema['file_to_post'] = array( - 'fields' => array( - 'file_id' => array('type' => 'int', 'not null' => true, 'description' => 'id of URL/file'), - 'post_id' => array('type' => 'int', 'not null' => true, 'description' => 'id of the notice it belongs to'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('file_id', 'post_id'), - 'foreign keys' => array( - 'file_to_post_file_id_fkey' => array('file', array('file_id' => 'id')), - 'file_to_post_post_id_fkey' => array('notice', array('post_id' => 'id')), - ), - 'indexes' => array( - 'post_id_idx' => array('post_id'), - ), -); - -$schema['design'] = array( - 'fields' => array( - 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'design ID'), - 'backgroundcolor' => array('type' => 'int', 'description' => 'main background color'), - 'contentcolor' => array('type' => 'int', 'description' => 'content area background color'), - 'sidebarcolor' => array('type' => 'int', 'description' => 'sidebar background color'), - 'textcolor' => array('type' => 'int', 'description' => 'text color'), - 'linkcolor' => array('type' => 'int', 'description' => 'link color'), - 'backgroundimage' => array('type' => 'varchar', 'length' => 255, 'description' => 'background image, if any'), - 'disposition' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'bit 1 = hide background image, bit 2 = display background image, bit 4 = tile background image'), - ), - 'primary key' => array('id'), -); - -$schema['group_block'] = array( - 'fields' => array( - 'group_id' => array('type' => 'int', 'not null' => true, 'description' => 'group profile is blocked from'), - 'blocked' => array('type' => 'int', 'not null' => true, 'description' => 'profile that is blocked'), - 'blocker' => array('type' => 'int', 'not null' => true, 'description' => 'user making the block'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date of blocking'), - ), - 'primary key' => array('group_id', 'blocked'), - 'foreign keys' => array( - 'group_block_group_id_fkey' => array('user_group', array('group_id' => 'id')), - 'group_block_blocked_fkey' => array('profile', array('blocked' => 'id')), - 'group_block_blocker_fkey' => array('user', array('blocker' => 'id')), - ), -); - -$schema['group_alias'] = array( - 'fields' => array( - 'alias' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'additional nickname for the group'), - 'group_id' => array('type' => 'int', 'not null' => true, 'description' => 'group profile is blocked from'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date alias was created'), - ), - 'primary key' => array('alias'), - 'foreign keys' => array( - 'group_alias_group_id_fkey' => array('user_group', array('group_id' => 'id')), - ), - 'indexes' => array( - 'group_alias_group_id_idx' => array('group_id'), - ), -); - -$schema['session'] = array( - 'fields' => array( - 'id' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'session ID'), - 'session_data' => array('type' => 'text', 'description' => 'session data'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('id'), - 'indexes' => array( - 'session_modified_idx' => array('modified'), - ), -); - -$schema['deleted_notice'] = array( - 'fields' => array( - 'id' => array('type' => 'int', 'not null' => true, 'description' => 'identity of notice'), - 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'author of the notice'), - 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier, usually a tag URI'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date the notice record was created'), - 'deleted' => array('type' => 'datetime', 'not null' => true, 'description' => 'date the notice record was created'), - ), - 'primary key' => array('id'), - 'unique keys' => array( - 'deleted_notice_uri_key' => array('uri'), - ), - 'indexes' => array( - 'deleted_notice_profile_id_idx' => array('profile_id'), - ), -); - -$schema['config'] = array( - 'fields' => array( - 'section' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'default' => '', 'description' => 'configuration section'), - 'setting' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'default' => '', 'description' => 'configuration setting'), - 'value' => array('type' => 'varchar', 'length' => 255, 'description' => 'configuration value'), - ), - 'primary key' => array('section', 'setting'), -); - -$schema['profile_role'] = array( - 'fields' => array( - 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'account having the role'), - 'role' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'string representing the role'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date the role was granted'), - ), - 'primary key' => array('profile_id', 'role'), - 'foreign keys' => array( - 'profile_role_profile_id_fkey' => array('profile', array('profile_id' => 'id')), - ), -); - -$schema['location_namespace'] = array( - 'fields' => array( - 'id' => array('type' => 'int', 'not null' => true, 'description' => 'identity for this namespace'), - 'description' => array('type' => 'varchar', 'length' => 255, 'description' => 'description of the namespace'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date the record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('id'), -); - -$schema['login_token'] = array( - 'fields' => array( - 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user owning this token'), - 'token' => array('type' => 'char', 'length' => 32, 'not null' => true, 'description' => 'token useable for logging in'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('user_id'), - 'foreign keys' => array( - 'login_token_user_id_fkey' => array('user', array('user_id' => 'id')), - ), -); - -$schema['user_location_prefs'] = array( - 'fields' => array( - 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user who has the preference'), - 'share_location' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Whether to share location data'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('user_id'), - 'foreign keys' => array( - 'user_location_prefs_user_id_fkey' => array('user', array('user_id' => 'id')), - ), -); - -$schema['inbox'] = array( - 'fields' => array( - 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user receiving the notice'), - 'notice_ids' => array('type' => 'blob', 'description' => 'packed list of notice ids'), - ), - 'primary key' => array('user_id'), - 'foreign keys' => array( - 'inbox_user_id_fkey' => array('user', array('user_id' => 'id')), - ), -); - -// @fixme possibly swap this for a more general prefs table? -$schema['user_im_prefs'] = array( - 'fields' => array( - 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user'), - 'screenname' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'screenname on this service'), - 'transport' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'transport (ex xmpp, aim)'), - 'notify' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 0, 'description' => 'Notify when a new notice is sent'), - 'replies' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 0, 'description' => 'Send replies from people not subscribed to'), - 'microid' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 1, 'description' => 'Publish a MicroID'), - 'updatefrompresence' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 0, 'description' => 'Send replies from people not subscribed to.'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('user_id', 'transport'), - 'unique keys' => array( - 'transport_screenname_key' => array('transport', 'screenname'), - ), - 'foreign keys' => array( - 'user_im_prefs_user_id_fkey' => array('user', array('user_id' => 'id')), - ), -); - -$schema['conversation'] = array( - 'fields' => array( - 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'unique identifier'), - 'uri' => array('type' => 'varchar', 'length' => 225, 'description' => 'URI of the conversation'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('id'), - 'unique keys' => array( - 'conversation_uri_key' => array('uri'), - ), -); - -$schema['local_group'] = array( - 'description' => 'Record for a user group on the local site, with some additional info not in user_group', - 'fields' => array( - 'group_id' => array('type' => 'int', 'not null' => true, 'description' => 'group represented'), - 'nickname' => array('type' => 'varchar', 'length' => 64, 'description' => 'group represented'), - - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('group_id'), - 'foreign keys' => array( - 'local_group_group_id_fkey' => array('user_group', array('group_id' => 'id')), - ), - 'unique keys' => array( - 'local_group_nickname_key' => array('nickname'), - ), -); - -$schema['user_urlshortener_prefs'] = array( - 'fields' => array( - 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user'), - 'urlshorteningservice' => array('type' => 'varchar', 'length' => 50, 'default' => 'internal', 'description' => 'service to use for auto-shortening URLs'), - 'maxurllength' => array('type' => 'int', 'not null' => true, 'description' => 'urls greater than this length will be shortened, 0 = always, null = never'), - 'maxnoticelength' => array('type' => 'int', 'not null' => true, 'description' => 'notices with content greater than this value will have all urls shortened, 0 = always, null = never'), - - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('user_id'), - 'foreign keys' => array( - 'user_urlshortener_prefs_user_id_fkey' => array('user', array('user_id' => 'id')), - ), -); - -$schema['schema_version'] = array( - 'description' => 'To avoid checking database structure all the time, we store a checksum of the expected schema info for each table here. If it has not changed since the last time we checked the table, we can leave it as is.', - 'fields' => array( - 'table_name' => array('type' => 'varchar', 'length' => '64', 'not null' => true, 'description' => 'Table name'), - 'checksum' => array('type' => 'varchar', 'length' => '64', 'not null' => true, 'description' => 'Checksum of schema array; a mismatch indicates we should check the table more thoroughly.'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('table_name'), -); - -$schema['group_join_queue'] = Group_join_queue::schemaDef(); - -$schema['subscription_queue'] = Subscription_queue::schemaDef(); +foreach ($classes as $cls) { + $schema[strtolower($cls)] = call_user_func(array($cls, 'schemaDef')); +} diff --git a/db/innodb.sql b/db/innodb.sql deleted file mode 100644 index f3ab6cd690..0000000000 --- a/db/innodb.sql +++ /dev/null @@ -1,2 +0,0 @@ -alter table profile drop index nickname, engine=InnoDB; -alter table notice drop index content, engine=InnoDB; diff --git a/db/rc2torc3.sql b/db/rc2torc3.sql deleted file mode 100644 index 886b9adf22..0000000000 --- a/db/rc2torc3.sql +++ /dev/null @@ -1,17 +0,0 @@ -create table user_location_prefs ( - user_id integer not null comment 'user who has the preference' references user (id), - share_location tinyint default 1 comment 'Whether to share location data', - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified', - - constraint primary key (user_id) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table inbox ( - - user_id integer not null comment 'user receiving the notice' references user (id), - notice_ids blob comment 'packed list of notice ids', - - constraint primary key (user_id) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; diff --git a/db/rc3torc4.sql b/db/rc3torc4.sql deleted file mode 100644 index 917c1f1c41..0000000000 --- a/db/rc3torc4.sql +++ /dev/null @@ -1,50 +0,0 @@ -create table queue_item_new ( - id integer auto_increment primary key comment 'unique identifier', - frame blob not null comment 'data: object reference or opaque string', - transport varchar(8) not null comment 'queue for what? "email", "jabber", "sms", "irc", ...', - created datetime not null comment 'date this record was created', - claimed datetime comment 'date this item was claimed', - - index queue_item_created_idx (created) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -insert into queue_item_new (frame,transport,created,claimed) - select notice_id,transport,created,claimed from queue_item; -alter table queue_item rename to queue_item_old; -alter table queue_item_new rename to queue_item; - -alter table consumer - add consumer_secret varchar(255) not null comment 'secret value'; - -alter table token - add verifier varchar(255) comment 'verifier string for OAuth 1.0a', - add verified_callback varchar(255) comment 'verified callback URL for OAuth 1.0a'; - -create table oauth_application ( - id integer auto_increment primary key comment 'unique identifier', - owner integer not null comment 'owner of the application' references profile (id), - consumer_key varchar(255) not null comment 'application consumer key' references consumer (consumer_key), - name varchar(255) not null comment 'name of the application', - description varchar(255) comment 'description of the application', - icon varchar(255) not null comment 'application icon', - source_url varchar(255) comment 'application homepage - used for source link', - organization varchar(255) comment 'name of the organization running the application', - homepage varchar(255) comment 'homepage for the organization', - callback_url varchar(255) comment 'url to redirect to after authentication', - type tinyint default 0 comment 'type of app, 1 = browser, 2 = desktop', - access_type tinyint default 0 comment 'default access type, bit 1 = read, bit 2 = write', - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified' -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table oauth_application_user ( - profile_id integer not null comment 'user of the application' references profile (id), - application_id integer not null comment 'id of the application' references oauth_application (id), - access_type tinyint default 0 comment 'access type, bit 1 = read, bit 2 = write, bit 3 = revoked', - token varchar(255) comment 'request or access token', - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified', - constraint primary key (profile_id, application_id) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - diff --git a/db/site_093to094.sql b/db/site_093to094.sql deleted file mode 100644 index 30cea31dfa..0000000000 --- a/db/site_093to094.sql +++ /dev/null @@ -1,13 +0,0 @@ -alter table status_network - drop primary key, - add column site_id integer auto_increment primary key first, - add unique key (nickname); - -create table status_network_tag ( - site_id integer comment 'unique id', - tag varchar(64) comment 'tag name', - created datetime not null comment 'date the record was created', - - constraint primary key (site_id, tag) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci; - diff --git a/db/statusnet.sql b/db/statusnet.sql deleted file mode 100644 index 29a555948b..0000000000 --- a/db/statusnet.sql +++ /dev/null @@ -1,759 +0,0 @@ -/* local and remote users have profiles */ - -create table profile ( - - id integer auto_increment primary key comment 'unique identifier', - nickname varchar(64) not null comment 'nickname or username', - fullname varchar(255) comment 'display name', - profileurl varchar(255) comment 'URL, cached so we dont regenerate', - homepage varchar(255) comment 'identifying URL', - bio text comment 'descriptive biography', - location varchar(255) comment 'physical location', - lat decimal(10,7) comment 'latitude', - lon decimal(10,7) comment 'longitude', - location_id integer comment 'location id if possible', - location_ns integer comment 'namespace for location', - - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified', - - index profile_nickname_idx (nickname), - FULLTEXT(nickname, fullname, location, bio, homepage) -) ENGINE=MyISAM CHARACTER SET utf8 COLLATE utf8_general_ci; - -create table avatar ( - profile_id integer not null comment 'foreign key to profile table' references profile (id), - original boolean default false comment 'uploaded by user or generated?', - width integer not null comment 'image width', - height integer not null comment 'image height', - mediatype varchar(32) not null comment 'file type', - filename varchar(255) null comment 'local filename, if local', - url varchar(255) unique key comment 'avatar location', - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified', - - constraint primary key (profile_id, width, height), - index avatar_profile_id_idx (profile_id) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table sms_carrier ( - id integer primary key comment 'primary key for SMS carrier', - name varchar(64) unique key comment 'name of the carrier', - email_pattern varchar(255) not null comment 'sprintf pattern for making an email address from a phone number', - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified' -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -/* local users */ - -create table user ( - - id integer primary key comment 'foreign key to profile table' references profile (id), - nickname varchar(64) unique key comment 'nickname or username, duped in profile', - password varchar(255) comment 'salted password, can be null for OpenID users', - email varchar(255) unique key comment 'email address for password recovery etc.', - incomingemail varchar(255) unique key comment 'email address for post-by-email', - emailnotifysub tinyint default 1 comment 'Notify by email of subscriptions', - emailnotifyfav tinyint default 1 comment 'Notify by email of favorites', - emailnotifynudge tinyint default 1 comment 'Notify by email of nudges', - emailnotifymsg tinyint default 1 comment 'Notify by email of direct messages', - emailnotifyattn tinyint default 1 comment 'Notify by email of @-replies', - emailmicroid tinyint default 1 comment 'whether to publish email microid', - language varchar(50) comment 'preferred language', - timezone varchar(50) comment 'timezone', - emailpost tinyint default 1 comment 'Post by email', - sms varchar(64) unique key comment 'sms phone number', - carrier integer comment 'foreign key to sms_carrier' references sms_carrier (id), - smsnotify tinyint default 0 comment 'whether to send notices to SMS', - smsreplies tinyint default 0 comment 'whether to send notices to SMS on replies', - smsemail varchar(255) comment 'built from sms and carrier', - uri varchar(255) unique key comment 'universally unique identifier, usually a tag URI', - autosubscribe tinyint default 0 comment 'automatically subscribe to users who subscribe to us', - urlshorteningservice varchar(50) default 'ur1.ca' comment 'service to use for auto-shortening URLs', - inboxed tinyint default 0 comment 'has an inbox been created for this user?', - design_id integer comment 'id of a design' references design(id), - viewdesigns tinyint default 1 comment 'whether to view user-provided designs', - - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified', - - index user_smsemail_idx (smsemail) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci; - -/* remote people */ - -create table remote_profile ( - id integer primary key comment 'foreign key to profile table' references profile (id), - uri varchar(255) unique key comment 'universally unique identifier, usually a tag URI', - postnoticeurl varchar(255) comment 'URL we use for posting notices', - updateprofileurl varchar(255) comment 'URL we use for updates to this profile', - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified' -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table subscription ( - subscriber integer not null comment 'profile listening', - subscribed integer not null comment 'profile being listened to', - jabber tinyint default 1 comment 'deliver jabber messages', - sms tinyint default 1 comment 'deliver sms messages', - token varchar(255) comment 'authorization token', - secret varchar(255) comment 'token secret', - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified', - - constraint primary key (subscriber, subscribed), - index subscription_subscriber_idx (subscriber, created), - index subscription_subscribed_idx (subscribed, created), - index subscription_token_idx (token) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table notice ( - id integer auto_increment primary key comment 'unique identifier', - profile_id integer not null comment 'who made the update' references profile (id), - uri varchar(255) unique key comment 'universally unique identifier, usually a tag URI', - content text comment 'update content', - rendered text comment 'HTML version of the content', - url varchar(255) comment 'URL of any attachment (image, video, bookmark, whatever)', - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified', - reply_to integer comment 'notice replied to (usually a guess)' references notice (id), - is_local tinyint default 0 comment 'notice was generated by a user', - source varchar(32) comment 'source of comment, like "web", "im", or "clientname"', - conversation integer comment 'id of root notice in this conversation' references notice (id), - lat decimal(10,7) comment 'latitude', - lon decimal(10,7) comment 'longitude', - location_id integer comment 'location id if possible', - location_ns integer comment 'namespace for location', - repeat_of integer comment 'notice this is a repeat of' references notice (id), - - -- For public timeline... - index notice_created_id_is_local_idx (created,id,is_local), - - -- For profile timelines... - index notice_profile_id_idx (profile_id,created,id), - - -- For api/statuses/repeats... - index notice_repeat_of_created_id_idx (repeat_of, created, id), - - -- For conversation views - index notice_conversation_created_id_idx (conversation, created, id), - - -- Are these needed/used? - index notice_replyto_idx (reply_to), - - FULLTEXT(content) -) ENGINE=MyISAM CHARACTER SET utf8 COLLATE utf8_general_ci; - -create table notice_source ( - code varchar(32) primary key not null comment 'source code', - name varchar(255) not null comment 'name of the source', - url varchar(255) not null comment 'url to link to', - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified' -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table reply ( - notice_id integer not null comment 'notice that is the reply' references notice (id), - profile_id integer not null comment 'profile replied to' references profile (id), - modified timestamp not null comment 'date this record was modified', - replied_id integer comment 'notice replied to (not used, see notice.reply_to)', - - constraint primary key (notice_id, profile_id), - index reply_notice_id_idx (notice_id), - index reply_profile_id_idx (profile_id), - index reply_replied_id_idx (replied_id), - - -- Needed for sorting reply/mentions timelines - index reply_profile_id_modified_notice_id_idx (profile_id, modified, notice_id) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table fave ( - notice_id integer not null comment 'notice that is the favorite' references notice (id), - user_id integer not null comment 'user who likes this notice' references user (id), - modified timestamp not null comment 'date this record was modified', - - constraint primary key (notice_id, user_id), - index fave_notice_id_idx (notice_id), - index fave_user_id_idx (user_id,modified), - index fave_modified_idx (modified) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -/* tables for OAuth */ - -create table consumer ( - consumer_key varchar(255) primary key comment 'unique identifier, root URL', - consumer_secret varchar(255) not null comment 'secret value', - seed char(32) not null comment 'seed for new tokens by this consumer', - - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified' -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table token ( - consumer_key varchar(255) not null comment 'unique identifier, root URL' references consumer (consumer_key), - tok char(32) not null comment 'identifying value', - secret char(32) not null comment 'secret value', - type tinyint not null default 0 comment 'request or access', - state tinyint default 0 comment 'for requests, 0 = initial, 1 = authorized, 2 = used', - verifier varchar(255) comment 'verifier string for OAuth 1.0a', - verified_callback varchar(255) comment 'verified callback URL for OAuth 1.0a', - - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified', - - constraint primary key (consumer_key, tok) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table nonce ( - consumer_key varchar(255) not null comment 'unique identifier, root URL', - tok char(32) null comment 'buggy old value, ignored', - nonce char(32) not null comment 'nonce', - ts datetime not null comment 'timestamp sent', - - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified', - - constraint primary key (consumer_key, ts, nonce) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table oauth_application ( - id integer auto_increment primary key comment 'unique identifier', - owner integer not null comment 'owner of the application' references profile (id), - consumer_key varchar(255) not null comment 'application consumer key' references consumer (consumer_key), - name varchar(255) not null unique key comment 'name of the application', - description varchar(255) comment 'description of the application', - icon varchar(255) not null comment 'application icon', - source_url varchar(255) comment 'application homepage - used for source link', - organization varchar(255) comment 'name of the organization running the application', - homepage varchar(255) comment 'homepage for the organization', - callback_url varchar(255) comment 'url to redirect to after authentication', - type tinyint default 0 comment 'type of app, 1 = browser, 2 = desktop', - access_type tinyint default 0 comment 'default access type, bit 1 = read, bit 2 = write', - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified' -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table oauth_application_user ( - profile_id integer not null comment 'user of the application' references profile (id), - application_id integer not null comment 'id of the application' references oauth_application (id), - access_type tinyint default 0 comment 'access type, bit 1 = read, bit 2 = write', - token varchar(255) comment 'request or access token', - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified', - constraint primary key (profile_id, application_id) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table oauth_token_association ( - profile_id integer not null comment 'user of the application' references profile (id), - application_id integer not null comment 'id of the application' references oauth_application (id), - token varchar(255) comment 'request or access token', - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified', - constraint primary key (profile_id, application_id, token) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -/* These are used by JanRain OpenID library */ - -create table oid_associations ( - server_url BLOB, - handle VARCHAR(255) character set latin1, - secret BLOB, - issued INTEGER, - lifetime INTEGER, - assoc_type VARCHAR(64), - PRIMARY KEY (server_url(255), handle) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table oid_nonces ( - server_url VARCHAR(2047), - timestamp INTEGER, - salt CHAR(40), - UNIQUE (server_url(255), timestamp, salt) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table confirm_address ( - code varchar(32) not null primary key comment 'good random code', - user_id integer not null comment 'user who requested confirmation' references user (id), - address varchar(255) not null comment 'address (email, xmpp, SMS, etc.)', - address_extra varchar(255) not null comment 'carrier ID, for SMS', - address_type varchar(8) not null comment 'address type ("email", "xmpp", "sms")', - claimed datetime comment 'date this was claimed for queueing', - sent datetime comment 'date this was sent for queueing', - modified timestamp comment 'date this record was modified' -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table remember_me ( - code varchar(32) not null primary key comment 'good random code', - user_id integer not null comment 'user who is logged in' references user (id), - modified timestamp comment 'date this record was modified' -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table queue_item ( - id integer auto_increment primary key comment 'unique identifier', - frame blob not null comment 'data: object reference or opaque string', - transport varchar(8) not null comment 'queue for what? "email", "xmpp", "sms", "irc", ...', - created datetime not null comment 'date this record was created', - claimed datetime comment 'date this item was claimed', - - index queue_item_created_idx (created) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -/* Hash tags */ -create table notice_tag ( - tag varchar( 64 ) not null comment 'hash tag associated with this notice', - notice_id integer not null comment 'notice tagged' references notice (id), - created datetime not null comment 'date this record was created', - - constraint primary key (tag, notice_id), - index notice_tag_created_idx (created), - index notice_tag_notice_id_idx (notice_id), - - -- For sorting tag-filtered public timeline - index notice_tag_tag_created_notice_id_idx (tag, created, notice_id) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -/* Synching with foreign services */ - -create table foreign_service ( - id int not null primary key comment 'numeric key for service', - name varchar(32) not null unique key comment 'name of the service', - description varchar(255) comment 'description', - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified' -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table foreign_user ( - id bigint not null comment 'unique numeric key on foreign service', - service int not null comment 'foreign key to service' references foreign_service(id), - uri varchar(255) not null unique key comment 'identifying URI', - nickname varchar(255) comment 'nickname on foreign service', - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified', - - constraint primary key (id, service) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table foreign_link ( - user_id int comment 'link to user on this system, if exists' references user (id), - foreign_id bigint unsigned comment 'link to user on foreign service, if exists' references foreign_user(id), - service int not null comment 'foreign key to service' references foreign_service(id), - credentials varchar(255) comment 'authc credentials, typically a password', - noticesync tinyint not null default 1 comment 'notice synchronization, bit 1 = sync outgoing, bit 2 = sync incoming, bit 3 = filter local replies', - friendsync tinyint not null default 2 comment 'friend synchronization, bit 1 = sync outgoing, bit 2 = sync incoming', - profilesync tinyint not null default 1 comment 'profile synchronization, bit 1 = sync outgoing, bit 2 = sync incoming', - last_noticesync datetime default null comment 'last time notices were imported', - last_friendsync datetime default null comment 'last time friends were imported', - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified', - - constraint primary key (user_id, foreign_id, service), - index foreign_user_user_id_idx (user_id) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table foreign_subscription ( - service int not null comment 'service where relationship happens' references foreign_service(id), - subscriber int not null comment 'subscriber on foreign service' references foreign_user (id), - subscribed int not null comment 'subscribed user' references foreign_user (id), - created datetime not null comment 'date this record was created', - - constraint primary key (service, subscriber, subscribed), - index foreign_subscription_subscriber_idx (subscriber), - index foreign_subscription_subscribed_idx (subscribed) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table invitation ( - code varchar(32) not null primary key comment 'random code for an invitation', - user_id int not null comment 'who sent the invitation' references user (id), - address varchar(255) not null comment 'invitation sent to', - address_type varchar(8) not null comment 'address type ("email", "xmpp", "sms")', - created datetime not null comment 'date this record was created', - - index invitation_address_idx (address, address_type), - index invitation_user_id_idx (user_id) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table message ( - id integer auto_increment primary key comment 'unique identifier', - uri varchar(255) unique key comment 'universally unique identifier', - from_profile integer not null comment 'who the message is from' references profile (id), - to_profile integer not null comment 'who the message is to' references profile (id), - content text comment 'message content', - rendered text comment 'HTML version of the content', - url varchar(255) comment 'URL of any attachment (image, video, bookmark, whatever)', - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified', - source varchar(32) comment 'source of comment, like "web", "im", or "clientname"', - - index message_from_idx (from_profile), - index message_to_idx (to_profile), - index message_created_idx (created) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci; - -create table notice_inbox ( - user_id integer not null comment 'user receiving the message' references user (id), - notice_id integer not null comment 'notice received' references notice (id), - created datetime not null comment 'date the notice was created', - source tinyint default 1 comment 'reason it is in the inbox, 1=subscription', - - constraint primary key (user_id, notice_id), - index notice_inbox_notice_id_idx (notice_id) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table profile_tag ( - tagger integer not null comment 'user making the tag' references profile (id), - tagged integer not null comment 'profile tagged' references profile (id), - tag varchar(64) not null comment 'hash tag associated with this notice', - modified timestamp comment 'date the tag was added', - - constraint primary key (tagger, tagged, tag), - index profile_tag_modified_idx (modified), - index profile_tag_tagger_tag_idx (tagger, tag), - index profile_tag_tagged_idx (tagged) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -/* people tag metadata */ -create table profile_list ( - id integer auto_increment unique key comment 'unique identifier', - tagger integer not null comment 'user making the tag' references profile (id), - tag varchar(64) not null comment 'hash tag', - description text comment 'description for the tag', - private tinyint(1) default 0 comment 'is this list private', - - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified', - - uri varchar(255) unique key comment 'universal identifier', - mainpage varchar(255) comment 'page for tag info info to link to', - tagged_count smallint not null default 0 comment 'number of people tagged', - subscriber_count smallint not null default 0 comment 'number of people subscribing', - - constraint primary key (tagger, tag), - index profile_list_tag_idx (tag), - index profile_list_tagged_count_idx (tagged_count), - index profile_list_modified_idx (modified), - index profile_list_subscriber_count_idx (subscriber_count) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table profile_tag_inbox ( - profile_tag_id integer not null comment 'peopletag receiving the message' references profile_tag (id), - notice_id integer not null comment 'notice received' references notice (id), - created datetime not null comment 'date the notice was created', - - constraint primary key (profile_tag_id, notice_id), - index profile_tag_inbox_created_idx (created), - index profile_tag_inbox_notice_id_idx (notice_id) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table profile_tag_subscription ( - profile_tag_id integer not null comment 'foreign key to profile_tag' references profile_list (id), - - profile_id integer not null comment 'foreign key to profile table' references profile (id), - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified', - - constraint primary key (profile_tag_id, profile_id), - index profile_tag_subscription_profile_id_idx (profile_id), - index profile_tag_subscription_created_idx (created) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table profile_block ( - blocker integer not null comment 'user making the block' references user (id), - blocked integer not null comment 'profile that is blocked' references profile (id), - modified timestamp comment 'date of blocking', - - constraint primary key (blocker, blocked) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table user_group ( - id integer auto_increment primary key comment 'unique identifier', - - nickname varchar(64) comment 'nickname for addressing', - fullname varchar(255) comment 'display name', - homepage varchar(255) comment 'URL, cached so we dont regenerate', - description text comment 'group description', - location varchar(255) comment 'related physical location, if any', - - original_logo varchar(255) comment 'original size logo', - homepage_logo varchar(255) comment 'homepage (profile) size logo', - stream_logo varchar(255) comment 'stream-sized logo', - mini_logo varchar(255) comment 'mini logo', - design_id integer comment 'id of a design' references design(id), - - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified', - - uri varchar(255) unique key comment 'universal identifier', - mainpage varchar(255) comment 'page for group info to link to', - - index user_group_nickname_idx (nickname) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci; - -create table group_member ( - group_id integer not null comment 'foreign key to user_group' references user_group (id), - profile_id integer not null comment 'foreign key to profile table' references profile (id), - is_admin boolean default false comment 'is this user an admin?', - - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified', - - constraint primary key (group_id, profile_id), - index group_member_profile_id_idx (profile_id), - index group_member_created_idx (created), - - -- To pull up a list of someone's groups in order joined - index group_member_profile_id_created_idx (profile_id, created) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table related_group ( - group_id integer not null comment 'foreign key to user_group' references user_group (id), - related_group_id integer not null comment 'foreign key to user_group' references user_group (id), - - created datetime not null comment 'date this record was created', - - constraint primary key (group_id, related_group_id) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table group_inbox ( - group_id integer not null comment 'group receiving the message' references user_group (id), - notice_id integer not null comment 'notice received' references notice (id), - created datetime not null comment 'date the notice was created', - - constraint primary key (group_id, notice_id), - index group_inbox_created_idx (created), - index group_inbox_notice_id_idx (notice_id), - - -- Needed for sorting group messages by timestamp - index group_inbox_group_id_created_notice_id_idx (group_id, created, notice_id) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table file ( - - id integer primary key auto_increment, - url varchar(255) comment 'destination URL after following redirections', - mimetype varchar(50) comment 'mime type of resource', - size integer comment 'size of resource when available', - title varchar(255) comment 'title of resource when available', - date integer(11) comment 'date of resource according to http query', - protected integer(1) comment 'true when URL is private (needs login)', - filename varchar(255) comment 'if a local file, name of the file', - - modified timestamp comment 'date this record was modified', - - unique(url) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci; - -create table file_oembed ( - file_id integer primary key comment 'oEmbed for that URL/file' references file (id), - version varchar(20) comment 'oEmbed spec. version', - type varchar(20) comment 'oEmbed type: photo, video, link, rich', - mimetype varchar(50) comment 'mime type of resource', - provider varchar(50) comment 'name of this oEmbed provider', - provider_url varchar(255) comment 'URL of this oEmbed provider', - width integer comment 'width of oEmbed resource when available', - height integer comment 'height of oEmbed resource when available', - html text comment 'html representation of this oEmbed resource when applicable', - title varchar(255) comment 'title of oEmbed resource when available', - author_name varchar(50) comment 'author name for this oEmbed resource', - author_url varchar(255) comment 'author URL for this oEmbed resource', - url varchar(255) comment 'URL for this oEmbed resource when applicable (photo, link)', - modified timestamp comment 'date this record was modified' - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci; - -create table file_redirection ( - - url varchar(255) primary key comment 'short URL (or any other kind of redirect) for file (id)', - file_id integer comment 'short URL for what URL/file' references file (id), - redirections integer comment 'redirect count', - httpcode integer comment 'HTTP status code (20x, 30x, etc.)', - modified timestamp comment 'date this record was modified' - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table file_thumbnail ( - - file_id integer primary key comment 'thumbnail for what URL/file' references file (id), - url varchar(255) comment 'URL of thumbnail', - width integer comment 'width of thumbnail', - height integer comment 'height of thumbnail', - modified timestamp comment 'date this record was modified', - - unique(url) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table file_to_post ( - - file_id integer comment 'id of URL/file' references file (id), - post_id integer comment 'id of the notice it belongs to' references notice (id), - modified timestamp comment 'date this record was modified', - - constraint primary key (file_id, post_id), - index post_id_idx (post_id) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table design ( - id integer primary key auto_increment comment 'design ID', - backgroundcolor integer comment 'main background color', - contentcolor integer comment 'content area background color', - sidebarcolor integer comment 'sidebar background color', - textcolor integer comment 'text color', - linkcolor integer comment 'link color', - backgroundimage varchar(255) comment 'background image, if any', - disposition tinyint default 1 comment 'bit 1 = hide background image, bit 2 = display background image, bit 4 = tile background image' -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table group_block ( - group_id integer not null comment 'group profile is blocked from' references user_group (id), - blocked integer not null comment 'profile that is blocked' references profile (id), - blocker integer not null comment 'user making the block' references user (id), - modified timestamp comment 'date of blocking', - - constraint primary key (group_id, blocked) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table group_alias ( - - alias varchar(64) primary key comment 'additional nickname for the group', - group_id integer not null comment 'group profile is blocked from' references user_group (id), - modified timestamp comment 'date alias was created', - - index group_alias_group_id_idx (group_id) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table session ( - - id varchar(32) primary key comment 'session ID', - session_data text comment 'session data', - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified', - - index session_modified_idx (modified) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table deleted_notice ( - - id integer primary key comment 'identity of notice', - profile_id integer not null comment 'author of the notice', - uri varchar(255) unique key comment 'universally unique identifier, usually a tag URI', - created datetime not null comment 'date the notice record was created', - deleted datetime not null comment 'date the notice record was created', - - index deleted_notice_profile_id_idx (profile_id) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table config ( - - section varchar(32) comment 'configuration section', - setting varchar(32) comment 'configuration setting', - value varchar(255) comment 'configuration value', - - constraint primary key (section, setting) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table profile_role ( - - profile_id integer not null comment 'account having the role' references profile (id), - role varchar(32) not null comment 'string representing the role', - created datetime not null comment 'date the role was granted', - - constraint primary key (profile_id, role), - index profile_role_role_created_profile_id_idx (role, created, profile_id) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table location_namespace ( - - id integer primary key comment 'identity for this namespace', - description varchar(255) comment 'description of the namespace', - created datetime not null comment 'date the record was created', - modified timestamp comment 'date this record was modified' - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table login_token ( - user_id integer not null comment 'user owning this token' references user (id), - token char(32) not null comment 'token useable for logging in', - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified', - - constraint primary key (user_id) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table user_location_prefs ( - user_id integer not null comment 'user who has the preference' references user (id), - share_location tinyint default 1 comment 'Whether to share location data', - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified', - - constraint primary key (user_id) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table inbox ( - - user_id integer not null comment 'user receiving the notice' references user (id), - notice_ids blob comment 'packed list of notice ids', - - constraint primary key (user_id) - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table user_im_prefs ( - user_id integer not null comment 'user' references user (id), - screenname varchar(255) not null comment 'screenname on this service', - transport varchar(255) not null comment 'transport (ex xmpp, aim)', - notify tinyint(1) not null default 0 comment 'Notify when a new notice is sent', - replies tinyint(1) not null default 0 comment 'Send replies from people not subscribed to', - microid tinyint(1) not null default 1 comment 'Publish a MicroID', - updatefrompresence tinyint(1) not null default 0 comment 'Send replies from people not subscribed to.', - created timestamp not null DEFAULT CURRENT_TIMESTAMP comment 'date this record was created', - modified timestamp comment 'date this record was modified', - - constraint primary key (user_id, transport), - constraint unique key `transport_screenname_key` ( `transport` , `screenname` ) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table conversation ( - id integer auto_increment primary key comment 'unique identifier', - uri varchar(225) unique comment 'URI of the conversation', - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified' -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table local_group ( - - group_id integer primary key comment 'group represented' references user_group (id), - nickname varchar(64) unique key comment 'group represented', - - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified' - -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; - -create table user_urlshortener_prefs ( - - user_id integer not null comment 'user' references user (id), - urlshorteningservice varchar(50) default 'ur1.ca' comment 'service to use for auto-shortening URLs', - maxurllength integer not null comment 'urls greater than this length will be shortened, 0 = always, null = never', - maxnoticelength integer not null comment 'notices with content greater than this value will have all urls shortened, 0 = always, null = never', - - created datetime not null comment 'date this record was created', - modified timestamp comment 'date this record was modified', - - constraint primary key (user_id) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; diff --git a/db/statusnet_pg.sql b/db/statusnet_pg.sql deleted file mode 100644 index fe0758de89..0000000000 --- a/db/statusnet_pg.sql +++ /dev/null @@ -1,649 +0,0 @@ -/* local and remote users have profiles */ -create sequence profile_seq; -create table profile ( - id bigint default nextval('profile_seq') primary key /* comment 'unique identifier' */, - nickname varchar(64) not null /* comment 'nickname or username' */, - fullname varchar(255) /* comment 'display name' */, - profileurl varchar(255) /* comment 'URL, cached so we dont regenerate' */, - homepage varchar(255) /* comment 'identifying URL' */, - bio varchar(140) /* comment 'descriptive biography' */, - location varchar(255) /* comment 'physical location' */, - lat decimal(10,7) /* comment 'latitude'*/ , - lon decimal(10,7) /* comment 'longitude'*/ , - location_id integer /* comment 'location id if possible'*/ , - location_ns integer /* comment 'namespace for location'*/ , - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */, - - textsearch tsvector -); -create index profile_nickname_idx on profile using btree(nickname); - -create table avatar ( - profile_id integer not null /* comment 'foreign key to profile table' */ references profile (id) , - original integer default 0 /* comment 'uploaded by user or generated?' */, - width integer not null /* comment 'image width' */, - height integer not null /* comment 'image height' */, - mediatype varchar(32) not null /* comment 'file type' */, - filename varchar(255) null /* comment 'local filename, if local' */, - url varchar(255) unique /* comment 'avatar location' */, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */, - - primary key(profile_id, width, height) -); -create index avatar_profile_id_idx on avatar using btree(profile_id); - -create sequence sms_carrier_seq; -create table sms_carrier ( - id bigint default nextval('sms_carrier_seq') primary key /* comment 'primary key for SMS carrier' */, - name varchar(64) unique /* comment 'name of the carrier' */, - email_pattern varchar(255) not null /* comment 'sprintf pattern for making an email address from a phone number' */, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified ' */ -); - -create sequence design_seq; -create table design ( - id bigint default nextval('design_seq') /* comment 'design ID'*/, - backgroundcolor integer /* comment 'main background color'*/ , - contentcolor integer /*comment 'content area background color'*/ , - sidebarcolor integer /*comment 'sidebar background color'*/ , - textcolor integer /*comment 'text color'*/ , - linkcolor integer /*comment 'link color'*/, - backgroundimage varchar(255) /*comment 'background image, if any'*/, - disposition int default 1 /*comment 'bit 1 = hide background image, bit 2 = display background image, bit 4 = tile background image'*/, - primary key (id) -); - -/* local users */ - -create table "user" ( - id integer primary key /* comment 'foreign key to profile table' */ references profile (id) , - nickname varchar(64) unique /* comment 'nickname or username, duped in profile' */, - password varchar(255) /* comment 'salted password, can be null for OpenID users' */, - email varchar(255) unique /* comment 'email address for password recovery etc.' */, - incomingemail varchar(255) unique /* comment 'email address for post-by-email' */, - emailnotifysub integer default 1 /* comment 'Notify by email of subscriptions' */, - emailnotifyfav integer default 1 /* comment 'Notify by email of favorites' */, - emailnotifynudge integer default 1 /* comment 'Notify by email of nudges' */, - emailnotifymsg integer default 1 /* comment 'Notify by email of direct messages' */, - emailnotifyattn integer default 1 /* command 'Notify by email of @-replies' */, - emailmicroid integer default 1 /* comment 'whether to publish email microid' */, - language varchar(50) /* comment 'preferred language' */, - timezone varchar(50) /* comment 'timezone' */, - emailpost integer default 1 /* comment 'Post by email' */, - jabber varchar(255) unique /* comment 'jabber ID for notices' */, - jabbernotify integer default 0 /* comment 'whether to send notices to jabber' */, - jabberreplies integer default 0 /* comment 'whether to send notices to jabber on replies' */, - jabbermicroid integer default 1 /* comment 'whether to publish xmpp microid' */, - updatefrompresence integer default 0 /* comment 'whether to record updates from Jabber presence notices' */, - sms varchar(64) unique /* comment 'sms phone number' */, - carrier integer /* comment 'foreign key to sms_carrier' */ references sms_carrier (id) , - smsnotify integer default 0 /* comment 'whether to send notices to SMS' */, - smsreplies integer default 0 /* comment 'whether to send notices to SMS on replies' */, - smsemail varchar(255) /* comment 'built from sms and carrier' */, - uri varchar(255) unique /* comment 'universally unique identifier, usually a tag URI' */, - autosubscribe integer default 0 /* comment 'automatically subscribe to users who subscribe to us' */, - urlshorteningservice varchar(50) default 'ur1.ca' /* comment 'service to use for auto-shortening URLs' */, - inboxed integer default 0 /* comment 'has an inbox been created for this user?' */, - design_id integer /* comment 'id of a design' */references design(id), - viewdesigns integer default 1 /* comment 'whether to view user-provided designs'*/, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */ - -); -create index user_smsemail_idx on "user" using btree(smsemail); - -/* remote people */ - -create table remote_profile ( - id integer primary key /* comment 'foreign key to profile table' */ references profile (id) , - uri varchar(255) unique /* comment 'universally unique identifier, usually a tag URI' */, - postnoticeurl varchar(255) /* comment 'URL we use for posting notices' */, - updateprofileurl varchar(255) /* comment 'URL we use for updates to this profile' */, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */ -); - -create table subscription ( - subscriber integer not null /* comment 'profile listening' */, - subscribed integer not null /* comment 'profile being listened to' */, - jabber integer default 1 /* comment 'deliver jabber messages' */, - sms integer default 1 /* comment 'deliver sms messages' */, - token varchar(255) /* comment 'authorization token' */, - secret varchar(255) /* comment 'token secret' */, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */, - - primary key (subscriber, subscribed) -); -create index subscription_subscriber_idx on subscription using btree(subscriber,created); -create index subscription_subscribed_idx on subscription using btree(subscribed,created); - -create sequence notice_seq; -create table notice ( - - id bigint default nextval('notice_seq') primary key /* comment 'unique identifier' */, - profile_id integer not null /* comment 'who made the update' */ references profile (id) , - uri varchar(255) unique /* comment 'universally unique identifier, usually a tag URI' */, - content varchar(140) /* comment 'update content' */, - rendered text /* comment 'HTML version of the content' */, - url varchar(255) /* comment 'URL of any attachment (image, video, bookmark, whatever)' */, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */, - reply_to integer /* comment 'notice replied to (usually a guess)' */ references notice (id) , - is_local integer default 0 /* comment 'notice was generated by a user' */, - source varchar(32) /* comment 'source of comment, like "web", "im", or "clientname"' */, - conversation integer /*id of root notice in this conversation' */ references notice (id), - lat decimal(10,7) /* comment 'latitude'*/ , - lon decimal(10,7) /* comment 'longitude'*/ , - location_id integer /* comment 'location id if possible'*/ , - location_ns integer /* comment 'namespace for location'*/ , - repeat_of integer /* comment 'notice this is a repeat of' */ references notice (id) - -/* FULLTEXT(content) */ -); - -create index notice_profile_id_idx on notice using btree(profile_id,created,id); -create index notice_created_idx on notice using btree(created); - -create table notice_source ( - code varchar(32) primary key not null /* comment 'source code' */, - name varchar(255) not null /* comment 'name of the source' */, - url varchar(255) not null /* comment 'url to link to' */, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */ -); - -create table reply ( - - notice_id integer not null /* comment 'notice that is the reply' */ references notice (id) , - profile_id integer not null /* comment 'profile replied to' */ references profile (id) , - modified timestamp /* comment 'date this record was modified' */, - replied_id integer /* comment 'notice replied to (not used, see notice.reply_to)' */, - - primary key (notice_id, profile_id) - -); -create index reply_notice_id_idx on reply using btree(notice_id); -create index reply_profile_id_idx on reply using btree(profile_id); -create index reply_replied_id_idx on reply using btree(replied_id); - -create table fave ( - - notice_id integer not null /* comment 'notice that is the favorite' */ references notice (id), - user_id integer not null /* comment 'user who likes this notice' */ references "user" (id) , - modified timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was modified' */, - primary key (notice_id, user_id) - -); -create index fave_notice_id_idx on fave using btree(notice_id); -create index fave_user_id_idx on fave using btree(user_id,modified); -create index fave_modified_idx on fave using btree(modified); - -/* tables for OAuth */ - -create table consumer ( - consumer_key varchar(255) primary key /* comment 'unique identifier, root URL' */, - consumer_secret varchar(255) not null /* comment 'secret value', */, - seed char(32) not null /* comment 'seed for new tokens by this consumer' */, - - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */ -); - -create table token ( - consumer_key varchar(255) not null /* comment 'unique identifier, root URL' */ references consumer (consumer_key), - tok char(32) not null /* comment 'identifying value' */, - secret char(32) not null /* comment 'secret value' */, - type integer not null default 0 /* comment 'request or access' */, - state integer default 0 /* comment 'for requests 0 = initial, 1 = authorized, 2 = used' */, - - verifier varchar(255) /*comment 'verifier string for OAuth 1.0a'*/, - verified_callback varchar(255) /*comment 'verified callback URL for OAuth 1.0a'*/, - - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */, - - primary key (consumer_key, tok) -); - -create table nonce ( - consumer_key varchar(255) not null /* comment 'unique identifier, root URL' */, - tok char(32) /* comment 'buggy old value, ignored' */, - nonce char(32) null /* comment 'buggy old value, ignored */, - ts integer not null /* comment 'timestamp sent' values are epoch, and only used internally */, - - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */, - - primary key (consumer_key, ts, nonce) -); - -create sequence oauth_application_seq; -create table oauth_application ( - id bigint default nextval('oauth_application_seq') primary key /* comment 'unique identifier' */, - owner integer not null /* comment 'owner of the application' */ references profile (id), - consumer_key varchar(255) not null /* comment 'application consumer key' */ references consumer (consumer_key), - name varchar(255) unique not null /* comment 'name of the application' */, - description varchar(255) /* comment 'description of the application' */, - icon varchar(255) not null /* comment 'application icon' */, - source_url varchar(255) /* comment 'application homepage - used for source link' */, - organization varchar(255) /* comment 'name of the organization running the application' */, - homepage varchar(255) /* comment 'homepage for the organization' */, - callback_url varchar(255) /* comment 'url to redirect to after authentication' */, - "type" integer default 0 /* comment 'type of app, 1 = browser, 2 = desktop' */, - access_type integer default 0 /* comment 'default access type, bit 1 = read, bit 2 = write' */, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */ -); - -create table oauth_application_user ( - profile_id integer not null /* 'user of the application' */ references profile (id), - application_id integer not null /* 'id of the application' */ references oauth_application (id), - access_type integer default 0 /* 'access type, bit 1 = read, bit 2 = write' */, - token varchar(255) /* 'request or access token' */, - created timestamp not null default CURRENT_TIMESTAMP /* 'date this record was created' */, - modified timestamp /* 'date this record was modified' */, - primary key (profile_id, application_id) -); - -/* These are used by JanRain OpenID library */ - -create table oid_associations ( - server_url varchar(2047), - handle varchar(255), - secret bytea, - issued integer, - lifetime integer, - assoc_type varchar(64), - primary key (server_url, handle) -); - -create table oid_nonces ( - server_url varchar(2047), - "timestamp" integer, - salt character(40), - unique (server_url, "timestamp", salt) -); - -create table confirm_address ( - code varchar(32) not null primary key /* comment 'good random code' */, - user_id integer not null /* comment 'user who requested confirmation' */ references "user" (id), - address varchar(255) not null /* comment 'address (email, Jabber, SMS, etc.)' */, - address_extra varchar(255) not null default '' /* comment 'carrier ID, for SMS' */, - address_type varchar(8) not null /* comment 'address type ("email", "jabber", "sms")' */, - claimed timestamp /* comment 'date this was claimed for queueing' */, - sent timestamp default CURRENT_TIMESTAMP /* comment 'date this was sent for queueing' */, - modified timestamp /* comment 'date this record was modified' */ -); - -create table remember_me ( - code varchar(32) not null primary key /* comment 'good random code' */, - user_id integer not null /* comment 'user who is logged in' */ references "user" (id), - modified timestamp /* comment 'date this record was modified' */ -); - -create table queue_item ( - id serial /* comment 'unique identifier'*/, - frame bytea not null /* comment 'data: object reference or opaque string'*/, - transport varchar(8) not null /*comment 'queue for what? "email", "jabber", "sms", "irc", ...'*/, - created timestamp not null default CURRENT_TIMESTAMP /*comment 'date this record was created'*/, - claimed timestamp /*comment 'date this item was claimed'*/, - PRIMARY KEY (id) -); -create index queue_item_created_idx on queue_item using btree(created); - -/* Hash tags */ -create table notice_tag ( - tag varchar( 64 ) not null /* comment 'hash tag associated with this notice' */, - notice_id integer not null /* comment 'notice tagged' */ references notice (id) , - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - - primary key (tag, notice_id) -); -create index notice_tag_created_idx on notice_tag using btree(created); - -/* Synching with foreign services */ - -create table foreign_service ( - id int not null primary key /* comment 'numeric key for service' */, - name varchar(32) not null unique /* comment 'name of the service' */, - description varchar(255) /* comment 'description' */, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */ -); - -create table foreign_user ( - id int not null unique /* comment 'unique numeric key on foreign service' */, - service int not null /* comment 'foreign key to service' */ references foreign_service(id) , - uri varchar(255) not null unique /* comment 'identifying URI' */, - nickname varchar(255) /* comment 'nickname on foreign service' */, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */, - - primary key (id, service) -); - -create table foreign_link ( - user_id int /* comment 'link to user on this system, if exists' */ references "user" (id), - foreign_id int /* comment 'link' */ references foreign_user (id), - service int not null /* comment 'foreign key to service' */ references foreign_service (id), - credentials varchar(255) /* comment 'authc credentials, typically a password' */, - noticesync int not null default 1 /* comment 'notice synchronisation, bit 1 = sync outgoing, bit 2 = sync incoming, bit 3 = filter local replies' */, - friendsync int not null default 2 /* comment 'friend synchronisation, bit 1 = sync outgoing, bit 2 = sync incoming */, - profilesync int not null default 1 /* comment 'profile synchronization, bit 1 = sync outgoing, bit 2 = sync incoming' */, - last_noticesync timestamp default null /* comment 'last time notices were imported' */, - last_friendsync timestamp default null /* comment 'last time friends were imported' */, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */, - - primary key (user_id,foreign_id,service) -); -create index foreign_user_user_id_idx on foreign_link using btree(user_id); - -create table foreign_subscription ( - service int not null /* comment 'service where relationship happens' */ references foreign_service(id) , - subscriber int not null /* comment 'subscriber on foreign service' */ , - subscribed int not null /* comment 'subscribed user' */ , - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - - primary key (service, subscriber, subscribed) -); -create index foreign_subscription_subscriber_idx on foreign_subscription using btree(subscriber); -create index foreign_subscription_subscribed_idx on foreign_subscription using btree(subscribed); - -create table invitation ( - code varchar(32) not null primary key /* comment 'random code for an invitation' */, - user_id int not null /* comment 'who sent the invitation' */ references "user" (id), - address varchar(255) not null /* comment 'invitation sent to' */, - address_type varchar(8) not null /* comment 'address type ("email", "jabber", "sms") '*/, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */ - -); -create index invitation_address_idx on invitation using btree(address,address_type); -create index invitation_user_id_idx on invitation using btree(user_id); - -create sequence message_seq; -create table message ( - - id bigint default nextval('message_seq') primary key /* comment 'unique identifier' */, - uri varchar(255) unique /* comment 'universally unique identifier' */, - from_profile integer not null /* comment 'who the message is from' */ references profile (id), - to_profile integer not null /* comment 'who the message is to' */ references profile (id), - content varchar(140) /* comment 'message content' */, - rendered text /* comment 'HTML version of the content' */, - url varchar(255) /* comment 'URL of any attachment (image, video, bookmark, whatever)' */, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */, - source varchar(32) /* comment 'source of comment, like "web", "im", or "clientname"' */ - -); -create index message_from_idx on message using btree(from_profile); -create index message_to_idx on message using btree(to_profile); -create index message_created_idx on message using btree(created); - -create table notice_inbox ( - - user_id integer not null /* comment 'user receiving the message' */ references "user" (id), - notice_id integer not null /* comment 'notice received' */ references notice (id), - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date the notice was created' */, - source integer default 1 /* comment 'reason it is in the inbox: 1=subscription' */, - - primary key (user_id, notice_id) -); -create index notice_inbox_notice_id_idx on notice_inbox using btree(notice_id); - -create table profile_tag ( - tagger integer not null /* comment 'user making the tag' */ references "user" (id), - tagged integer not null /* comment 'profile tagged' */ references profile (id), - tag varchar(64) not null /* comment 'hash tag associated with this notice' */, - modified timestamp /* comment 'date the tag was added' */, - - primary key (tagger, tagged, tag) -); -create index profile_tag_modified_idx on profile_tag using btree(modified); -create index profile_tag_tagger_tag_idx on profile_tag using btree(tagger,tag); - -create table profile_block ( - - blocker integer not null /* comment 'user making the block' */ references "user" (id), - blocked integer not null /* comment 'profile that is blocked' */ references profile (id), - modified timestamp /* comment 'date of blocking' */, - - primary key (blocker, blocked) - -); - -create sequence user_group_seq; -create table user_group ( - - id bigint default nextval('user_group_seq') primary key /* comment 'unique identifier' */, - - nickname varchar(64) unique /* comment 'nickname for addressing' */, - fullname varchar(255) /* comment 'display name' */, - homepage varchar(255) /* comment 'URL, cached so we dont regenerate' */, - description varchar(140) /* comment 'descriptive biography' */, - location varchar(255) /* comment 'related physical location, if any' */, - - original_logo varchar(255) /* comment 'original size logo' */, - homepage_logo varchar(255) /* comment 'homepage (profile) size logo' */, - stream_logo varchar(255) /* comment 'stream-sized logo' */, - mini_logo varchar(255) /* comment 'mini logo' */, - design_id integer /*comment 'id of a design' */ references design(id), - - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */ - -); -create index user_group_nickname_idx on user_group using btree(nickname); - -create table group_member ( - - group_id integer not null /* comment 'foreign key to user_group' */ references user_group (id), - profile_id integer not null /* comment 'foreign key to profile table' */ references profile (id), - is_admin integer default 0 /* comment 'is this user an admin?' */, - - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */, - - primary key (group_id, profile_id) -); - -create table related_group ( - - group_id integer not null /* comment 'foreign key to user_group' */ references user_group (id) , - related_group_id integer not null /* comment 'foreign key to user_group' */ references user_group (id), - - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - - primary key (group_id, related_group_id) - -); - -create table group_inbox ( - group_id integer not null /* comment 'group receiving the message' references user_group (id) */, - notice_id integer not null /* comment 'notice received' references notice (id) */, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date the notice was created' */, - primary key (group_id, notice_id) -); -create index group_inbox_created_idx on group_inbox using btree(created); - -/*attachments and URLs stuff */ -create sequence file_seq; -create table file ( - id bigint default nextval('file_seq') primary key /* comment 'unique identifier' */, - url varchar(255) unique, - mimetype varchar(50), - size integer, - title varchar(255), - date integer, - protected integer, - filename text /* comment 'if a local file, name of the file' */, - modified timestamp default CURRENT_TIMESTAMP /* comment 'date this record was modified'*/ -); - -create sequence file_oembed_seq; -create table file_oembed ( - file_id bigint default nextval('file_oembed_seq') primary key /* comment 'unique identifier' */, - version varchar(20), - type varchar(20), - mimetype varchar(50), - provider varchar(50), - provider_url varchar(255), - width integer, - height integer, - html text, - title varchar(255), - author_name varchar(50), - author_url varchar(255), - url varchar(255) -); - -create sequence file_redirection_seq; -create table file_redirection ( - url varchar(255) primary key, - file_id bigint, - redirections integer, - httpcode integer -); - -create sequence file_thumbnail_seq; -create table file_thumbnail ( - file_id bigint primary key, - url varchar(255) unique, - width integer, - height integer -); - -create sequence file_to_post_seq; -create table file_to_post ( - file_id bigint, - post_id bigint, - - primary key (file_id, post_id) -); - -create table group_block ( - group_id integer not null /* comment 'group profile is blocked from' */ references user_group (id), - blocked integer not null /* comment 'profile that is blocked' */references profile (id), - blocker integer not null /* comment 'user making the block'*/ references "user" (id), - modified timestamp /* comment 'date of blocking'*/ , - - primary key (group_id, blocked) -); - -create table group_alias ( - - alias varchar(64) /* comment 'additional nickname for the group'*/ , - group_id integer not null /* comment 'group profile is blocked from'*/ references user_group (id), - modified timestamp /* comment 'date alias was created'*/, - primary key (alias) - -); -create index group_alias_group_id_idx on group_alias (group_id); - -create table session ( - - id varchar(32) primary key /* comment 'session ID'*/, - session_data text /* comment 'session data'*/, - created timestamp not null DEFAULT CURRENT_TIMESTAMP /* comment 'date this record was created'*/, - modified integer DEFAULT extract(epoch from CURRENT_TIMESTAMP) /* comment 'date this record was modified'*/ -); - -create index session_modified_idx on session (modified); - -create table deleted_notice ( - - id integer primary key /* comment 'identity of notice'*/ , - profile_id integer /* not null comment 'author of the notice'*/, - uri varchar(255) unique /* comment 'universally unique identifier, usually a tag URI'*/, - created timestamp not null /* comment 'date the notice record was created'*/ , - deleted timestamp not null DEFAULT CURRENT_TIMESTAMP /* comment 'date the notice record was created'*/ -); - -CREATE index deleted_notice_profile_id_idx on deleted_notice (profile_id); - -/* Textsearch stuff */ - -create index textsearch_idx on profile using gist(textsearch); -create index noticecontent_idx on notice using gist(to_tsvector('english',content)); -create trigger textsearchupdate before insert or update on profile for each row -execute procedure tsvector_update_trigger(textsearch, 'pg_catalog.english', nickname, fullname, location, bio, homepage); - -create table config ( - - section varchar(32) /* comment 'configuration section'*/, - setting varchar(32) /* comment 'configuration setting'*/, - value varchar(255) /* comment 'configuration value'*/, - - primary key (section, setting) - -); - -create table profile_role ( - - profile_id integer not null /* comment 'account having the role'*/ references profile (id), - role varchar(32) not null /* comment 'string representing the role'*/, - created timestamp /* not null comment 'date the role was granted'*/, - - primary key (profile_id, role) - -); - -create table location_namespace ( - - id integer /*comment 'identity for this namespace'*/, - description text /* comment 'description of the namespace'*/ , - created integer not null /*comment 'date the record was created*/ , - /* modified timestamp comment 'date this record was modified',*/ - primary key (id) - -); - -create table login_token ( - user_id integer not null /* comment 'user owning this token'*/ references "user" (id), - token char(32) not null /* comment 'token useable for logging in'*/, - created timestamp not null DEFAULT CURRENT_TIMESTAMP /* comment 'date this record was created'*/, - modified timestamp /* comment 'date this record was modified'*/, - - primary key (user_id) -); - -create table user_location_prefs ( - user_id integer not null /* comment 'user who has the preference' */ references "user" (id), - share_location integer default 1 /* comment 'Whether to share location data' */, - created timestamp not null DEFAULT CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */, - - primary key (user_id) -); - -create table inbox ( - - user_id integer not null /* comment 'user receiving the notice' */ references "user" (id), - notice_ids bytea /* comment 'packed list of notice ids' */, - - primary key (user_id) - -); - -create sequence conversation_seq; -create table conversation ( - id bigint default nextval('conversation_seq') primary key /* comment 'unique identifier' */, - uri varchar(225) unique /* comment 'URI of the conversation' */, - created timestamp not null DEFAULT CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */ -); - -create table local_group ( - - group_id integer primary key /* comment 'group represented' */ references user_group (id), - nickname varchar(64) unique /* comment 'group represented' */, - - created timestamp not null DEFAULT CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */ - -); - diff --git a/doc-src/badge b/doc-src/badge deleted file mode 100644 index 98cdcfce27..0000000000 --- a/doc-src/badge +++ /dev/null @@ -1,69 +0,0 @@ - - - - -Install the %%site.name%% badge on your blog or web site to show the latest updates -from you and your friends! - - - - - -Things to try --------------- - -* Click an avatar and the badge will refresh with that user's timeline -* Click a nickname to open a user's profile in your browser -* Click a notice's timestamp to view the notice in your browser -* @-replies and #tags are live links - -## Installation instructions - -Copy and paste the following JavaScript into an HTML page where -you want the badge to show up. Substitute your own ID in the user -parameter. - -
-	<script type="text/javascript" src="http://identi.ca/js/identica-badge.js">
-	{
-	   "user":"kentbrew",
-	   "server":"identi.ca",
-	   "headerText":" and friends"
-	}
-	</script>
-
-
- - - -Valid parameters for the badge: -------------------------------- - -* user : defaults to 7000 (@kentbrew) -* headerText : defaults to empty -* height : defaults to 350px -* width : defaults to 300px -* background : defaults to #193441. If you set evenBackground, oddBackground, - and headerBackground, you won't see it at all. -* border : defaults to 1px solid black -* userColor : defaults to whatever link color is set to on your page -* headerBackground : defaults to transparent -* headerColor : defaults to white -* evenBackground : defaults to #fff -* oddBackground : defaults to #eee -* thumbnailBorder : 1px solid black -* thumbnailSize : defaults to 24px -* padding : defaults to 3px -* server : defaults to identi.ca - -Licence -------- - -Identi.ca badge by [Kent Brewster](http://kentbrewster.com/identica-badge/). -Licenced under [CC-BY-SA-3](http://kentbrewster.com/rights-and-permissions/). diff --git a/doc-src/bookmarklet b/doc-src/bookmarklet deleted file mode 100644 index 0b77bf45a7..0000000000 --- a/doc-src/bookmarklet +++ /dev/null @@ -1,9 +0,0 @@ - - - - -A bookmarklet is a small piece of javascript code used as a bookmark. This one will let you post to %%site.name%% simply by selecting some text on a page and pressing the bookmarklet. - -Drag-and-drop the following link to your bookmarks bar or right-click it and add it to your browser favorites to keep it handy. - -Post to %%site.name%% diff --git a/doc-src/contact b/doc-src/contact index 75c3aa8364..4b31439c42 100644 --- a/doc-src/contact +++ b/doc-src/contact @@ -5,14 +5,6 @@ There are a number of options for getting in contact with responsible people for %%site.name%%. -Post a notice -------------- - -If you have a question about how to do something, just post a notice -with your question. People here like to answer messages. Watch the -[public timeline](%%action.public%%) for answers; they'll usually start -with "@" plus your user name. - Bugs ---- @@ -25,4 +17,10 @@ Email You can reach the responsible party for this server at [%%site.email%%](mailto:%%site.email%%). +Post a notice +------------- + +If you have a question about how to do something, just post a notice +with your question. Watch your inbox [public timeline](%%action.top%%) +for answers. diff --git a/doc-src/groups b/doc-src/groups index 5ff09600ef..823e5b16be 100644 --- a/doc-src/groups +++ b/doc-src/groups @@ -4,7 +4,8 @@ Users on %%site.name%% can create *groups* that other users can join. Groups can be a great way to share information and entertainment with -a group of people who have a common interest or background. +a group of people who have a common interest or background; who work +together on a team; or who have a particular knowledge or skill. You can find out about groups on the server on the [Groups](%%action.groups%%) page. You can join a group by clicking on @@ -13,16 +14,16 @@ the "Join" button either in the group list or on the group's home page. Starting a new group -------------------- -If you want, you can start a new group for friends and people with -common interests. Note that all groups are free for anyone to join. +You can start a new group for friends and colleagues. Note that all +groups are free for anyone to join. To start a new group, use the [new group](%%action.newgroup%%) tool and fill out the form. Describe your group as best you can if you want people to be able to find it. When choosing the nickname for your group, try to keep it short. The -nickname is included in every message to and from the group, so the -less chars the better. Try using acronyms for organizations, or +nickname is sometimes included in messages to and from the group, so +the less chars the better. Try using acronyms for organizations, or airport codes for places (like 'pdx' instead of 'portland'). Sending messages to a group @@ -33,14 +34,22 @@ anywhere in the message. If you have more than one group named, the notice will go to each group. Only members can send notices to a group, and groups do not respond to direct messages (DMs). +You can also select the group from the "To:" drop down when posting. + +You can make a group message private by clicking the "private" button +before posting. + Receiving messages ------------------ New group messages will appear in your inbox, and will also come to your phone or IM client if you've set them up to receive notices. -Remote groups -------------- +Private groups +-------------- -While it's technically possible, this version of StatusNet does not -support remote group membership. +The administrator can make a group private. For a private group, all +notices will marked as private for group members only. Also, +administrators will have to approve all new members to the group. + +Private groups are visible in the group directory. diff --git a/doc-src/help b/doc-src/help index 92d5d05afa..4bb9cd33a2 100644 --- a/doc-src/help +++ b/doc-src/help @@ -2,38 +2,18 @@ -%%site.name%% is a **microblogging service**. Users post short (%%site.textlimit%% -character) notices which are broadcast to their friends and fans using -the Web, RSS, or instant messages. +%%site.name%% is a **social service**. Users can post short +(%%site.textlimit%% character) status messages which are broadcast to +their friends and colleagues on the service and (optionally) onto the Web. + +You can also broadcast other types of data, like bookmarks, event +invitations, polls, and questions. If you'd like to try it out, first [register](%%action.register%%) a new account. -Then, on the [public timeline](%%action.public%%), enter your message into +Then, on the [public timeline](%%action.top%%), enter your message into the textbox at the top of the page, and click "Send". It will go out on the -public timeline and to anyone who is subscribed to your notices (probably nobody, -at first). +public timeline and to anyone who is subscribed to your notices. To subscribe to other people's notifications, go to their profile page and click the "subscribe" button. They'll get a notice that you're now -subscribed to their notifications, and, who knows?, they might subscribe -back. - -More help ---------- - -Here are some documents that you might find helpful in understanding -%%site.name%% and how to use it. - -* [About](%%doc.about%%) - an overview of the service -* [FAQ](%%doc.faq%%) - frequently-asked questions about %%site.name%% -* [Contact](%%doc.contact%%) - who to contact with questions about the service -* [IM](%%doc.im%%) - using the instant-message (IM) features of %%site.name%% -* [SMS](%%doc.sms%%) - tying your cellphone to %%site.name%% -* [Tags](%%doc.tags%%) - different ways to use tagging -* [Groups](%%doc.groups%%) - joining together in groups -* [Lists](%%doc.lists%%) - organize your contacts -* [OpenMicroBlogging](%%doc.openmublog%%) - subscribing to remote users -* [Privacy](%%doc.privacy%%) - %%site.name%%'s privacy policy -* [Source](%%doc.source%%) - How to get the StatusNet source code -* [Badge](%%doc.badge%%) - How to put a StatusNet badge on your blog or homepage -* [Bookmarklet](%%doc.bookmarklet%%) - Bookmarklet for posting Web pages -* [API](%%doc.api%%) - API for use by external clients +subscribed to their notifications. diff --git a/doc-src/lists b/doc-src/lists deleted file mode 100644 index b2e93aa853..0000000000 --- a/doc-src/lists +++ /dev/null @@ -1,73 +0,0 @@ - - - - -%%site.name%% supports -[tags](http://en.wikipedia.org/wiki/Tag_(metadata)) to help you -organize your activities here. You can use tags for people and for -notices. - -Tagging a notice ----------------- - -You can tag a notice using a *hashtag*; a # character followed by -letters and numbers as well as '.', '-', and '_'. Note that accented -latin characters are not supported, and non-roman scripts are right out. - -The HTML for the notice will link to a stream of all the other notices -with that tag. This can be a great way to keep track of a conversation. - -The most popular current tags on the site can be found in the [public -tag cloud](%%action.publictagcloud%%). Their size shows their -popularity and recency. - -Tagging yourself ----------------- - -You can also add tags for yourself on your [profile -settings](%%action.profilesettings%%) page or by using the edit tags -button on your profile page. Use single words to -describe yourself, your experiences and your interest. The tags will -become links on your profile page to a list of all the users on the -site who use that same tag. It can be a nice way to find people who -are related to you geographically or who have a common interest. - -Tagging others --------------- - -You can also tag other users by using the edit tags button next to -their profile. Such tags are called *people tags*. Once you have -created a people tag, you can add or remove users from it using the -tag's edit form. This makes it easy to organize your subscriptions -into groups and sort through them separately. Also, it will let -you create custom lists of people that others can subscribe to. - -You can also send a notice "to the attention of" your subscribers -whom you've marked with a particular tag (note: *not* people who've -marked themselves with that tag). "@#family hello" will send a -notice to all your subscribers you've marked with the tag 'family'. - -Private and public people tags ------------------------------- - -A private people tag is only visible to the creator, it cannot be -subscribed to, but the timeline can be viewed. To create a new -private prepend a '.' to the tag in the tags editing box. To set -an existing public tag as private or vice-versa, go to the tag's -edit page. - -The most used public tags are displayed in the -[public people tag cloud](%%action.publicpeopletagcloud%%). Their -size shows their frequency of use. - -Remote people tags ------------------- - -You can even [tag remote users](%%action.profilesettings%%). Just -enter the remote profile's URI and click on the "Fetch" button to -fetch the profile, you can then add tags and save them. - -Subscribing to the timeline of a people tag on another server also -works. Just copy the URL of the people tag's timeline page to the -[OStatus subscription](%%action.ostatussub%%) form. - diff --git a/doc-src/openmublog b/doc-src/openmublog deleted file mode 100644 index 267ad6e7c4..0000000000 --- a/doc-src/openmublog +++ /dev/null @@ -1,29 +0,0 @@ - - - - -[OpenMicroBlogging](http://openmicroblogging.org/) is a protocol that -lets users of one [microblogging](http://en.wikipedia.org/wiki/microblogging) service -subscribe to notices by users of another service. The protocol, based on -[OAuth](http://oauth.net/), is open and free, and doesn't depend on any -central authority to maintain the federated microblogs. - -The [StatusNet](http://status.net/) software that runs %%site.name%% supports -OpenMicroBlogging 0.1. Anyone can make a new installation of StatusNet on their -own servers, and users of that new installation can subscribe to notices from -%%site.name%%. - -Remote subscription -------------------- - -If you have an account on a remote site that supports OpenMicroBlogging, and you -want to subscribe to the notices of a user on this site, click on the "Subscribe" -link under their avatar on their profile page. This should take you to the -[remote subscription](%%action.remotesubscribe%%) page. Make sure that you've got the -right nickname registered, and enter your profile URL on the other microblogging -service. - -You'll be taken to your microblogging service, where you'll be asked to confirm the -subscription. When you confirm, your service will receive new notifications from -the user on %%site.name%%, and your service will forward them to you (using IM, SMS, -the Web, or whatever else). diff --git a/doc-src/tags b/doc-src/tags index b2e93aa853..8f42b5b752 100644 --- a/doc-src/tags +++ b/doc-src/tags @@ -17,10 +17,6 @@ latin characters are not supported, and non-roman scripts are right out. The HTML for the notice will link to a stream of all the other notices with that tag. This can be a great way to keep track of a conversation. -The most popular current tags on the site can be found in the [public -tag cloud](%%action.publictagcloud%%). Their size shows their -popularity and recency. - Tagging yourself ---------------- @@ -55,19 +51,3 @@ subscribed to, but the timeline can be viewed. To create a new private prepend a '.' to the tag in the tags editing box. To set an existing public tag as private or vice-versa, go to the tag's edit page. - -The most used public tags are displayed in the -[public people tag cloud](%%action.publicpeopletagcloud%%). Their -size shows their frequency of use. - -Remote people tags ------------------- - -You can even [tag remote users](%%action.profilesettings%%). Just -enter the remote profile's URI and click on the "Fetch" button to -fetch the profile, you can then add tags and save them. - -Subscribing to the timeline of a people tag on another server also -works. Just copy the URL of the people tag's timeline page to the -[OStatus subscription](%%action.ostatussub%%) form. - diff --git a/doc-src/tos b/doc-src/tos index 8d5bac57fc..e54da049b7 100644 --- a/doc-src/tos +++ b/doc-src/tos @@ -14,7 +14,7 @@ particular, make sure that none of the prohibited items listed below appear in your notice stream or get linked to from your notice stream (things like spam, viruses, or hate content). -You can review our [Public Stream](%%action.public%%) to get a sense +You can review our [Public Stream](%%action.top%%) to get a sense of the types of notices that are welcome on our service (or not!). If you find a %%site.name%% account that you believe violates our terms of service, please check our [Contact](%%doc.contact%%) documentation. diff --git a/extlib/HTTP/Request2.php b/extlib/HTTP/Request2.php index e06bb86bca..60beeaf2ef 100644 --- a/extlib/HTTP/Request2.php +++ b/extlib/HTTP/Request2.php @@ -1,12 +1,12 @@ + * Copyright (c) 2008-2011, Alexey Borzov * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -37,7 +37,7 @@ * @package HTTP_Request2 * @author Alexey Borzov * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Request2.php 278226 2009-04-03 21:32:48Z avb $ + * @version SVN: $Id: Request2.php 308735 2011-02-27 20:31:28Z avb $ * @link http://pear.php.net/package/HTTP_Request2 */ @@ -48,16 +48,16 @@ require_once 'Net/URL2.php'; /** * Exception class for HTTP_Request2 package - */ + */ require_once 'HTTP/Request2/Exception.php'; /** - * Class representing a HTTP request + * Class representing a HTTP request message * * @category HTTP * @package HTTP_Request2 * @author Alexey Borzov - * @version Release: 0.4.1 + * @version Release: 2.0.0RC1 * @link http://tools.ietf.org/html/rfc2616#section-5 */ class HTTP_Request2 implements SplSubject @@ -78,7 +78,7 @@ class HTTP_Request2 implements SplSubject /**#@-*/ /**#@+ - * Constants for HTTP authentication schemes + * Constants for HTTP authentication schemes * * @link http://tools.ietf.org/html/rfc2617 */ @@ -95,7 +95,7 @@ class HTTP_Request2 implements SplSubject /** * Regular expression used to check for invalid symbols in cookie strings * @link http://pear.php.net/bugs/bug.php?id=15630 - * @link http://cgi.netscape.com/newsref/std/cookie_spec.html + * @link http://web.archive.org/web/20080331104521/http://cgi.netscape.com/newsref/std/cookie_spec.html */ const REGEXP_INVALID_COOKIE = '/[\s,;]/'; @@ -164,7 +164,11 @@ class HTTP_Request2 implements SplSubject 'ssl_local_cert' => null, 'ssl_passphrase' => null, - 'digest_compat_ie' => false + 'digest_compat_ie' => false, + + 'follow_redirects' => false, + 'max_redirects' => 5, + 'strict_redirects' => false ); /** @@ -191,7 +195,7 @@ class HTTP_Request2 implements SplSubject protected $postParams = array(); /** - * Array of file uploads (for multipart/form-data POST requests) + * Array of file uploads (for multipart/form-data POST requests) * @var array */ protected $uploads = array(); @@ -202,11 +206,16 @@ class HTTP_Request2 implements SplSubject */ protected $adapter; + /** + * Cookie jar to persist cookies between requests + * @var HTTP_Request2_CookieJar + */ + protected $cookieJar = null; /** * Constructor. Can set request URL, method and configuration array. * - * Also sets a default value for User-Agent header. + * Also sets a default value for User-Agent header. * * @param string|Net_Url2 Request URL * @param string Request method @@ -214,14 +223,14 @@ class HTTP_Request2 implements SplSubject */ public function __construct($url = null, $method = self::METHOD_GET, array $config = array()) { + $this->setConfig($config); if (!empty($url)) { $this->setUrl($url); } if (!empty($method)) { $this->setMethod($method); } - $this->setConfig($config); - $this->setHeader('user-agent', 'HTTP_Request2/0.4.1 ' . + $this->setHeader('user-agent', 'HTTP_Request2/2.0.0RC1 ' . '(http://pear.php.net/package/http_request2) ' . 'PHP/' . phpversion()); } @@ -235,15 +244,20 @@ class HTTP_Request2 implements SplSubject * * @param string|Net_URL2 Request URL * @return HTTP_Request2 - * @throws HTTP_Request2_Exception + * @throws HTTP_Request2_LogicException */ public function setUrl($url) { if (is_string($url)) { - $url = new Net_URL2($url); + $url = new Net_URL2( + $url, array(Net_URL2::OPTION_USE_BRACKETS => $this->config['use_brackets']) + ); } if (!$url instanceof Net_URL2) { - throw new HTTP_Request2_Exception('Parameter is not a valid HTTP URL'); + throw new HTTP_Request2_LogicException( + 'Parameter is not a valid HTTP URL', + HTTP_Request2_Exception::INVALID_ARGUMENT + ); } // URL contains username / password? if ($url->getUserinfo()) { @@ -275,13 +289,16 @@ class HTTP_Request2 implements SplSubject * * @param string * @return HTTP_Request2 - * @throws HTTP_Request2_Exception if the method name is invalid + * @throws HTTP_Request2_LogicException if the method name is invalid */ public function setMethod($method) { // Method name should be a token: http://tools.ietf.org/html/rfc2616#section-5.1.1 if (preg_match(self::REGEXP_INVALID_TOKEN, $method)) { - throw new HTTP_Request2_Exception("Invalid request method '{$method}'"); + throw new HTTP_Request2_LogicException( + "Invalid request method '{$method}'", + HTTP_Request2_Exception::INVALID_ARGUMENT + ); } $this->method = $method; @@ -306,7 +323,7 @@ class HTTP_Request2 implements SplSubject *
  • 'adapter' - adapter to use (string)
  • *
  • 'connect_timeout' - Connection timeout in seconds (integer)
  • *
  • 'timeout' - Total number of seconds a request can take. - * Use 0 for no limit, should be greater than + * Use 0 for no limit, should be greater than * 'connect_timeout' if set (integer)
  • *
  • 'use_brackets' - Whether to append [] to array variable names (bool)
  • *
  • 'protocol_version' - HTTP Version to use, '1.0' or '1.1' (string)
  • @@ -324,7 +341,7 @@ class HTTP_Request2 implements SplSubject * certificate matches host name (bool) *
  • 'ssl_cafile' - Cerificate Authority file to verify the peer * with (use with 'ssl_verify_peer') (string)
  • - *
  • 'ssl_capath' - Directory holding multiple Certificate + *
  • 'ssl_capath' - Directory holding multiple Certificate * Authority files (string)
  • *
  • 'ssl_local_cert' - Name of a file containing local cerificate (string)
  • *
  • 'ssl_passphrase' - Passphrase with which local certificate @@ -332,13 +349,19 @@ class HTTP_Request2 implements SplSubject *
  • 'digest_compat_ie' - Whether to imitate behaviour of MSIE 5 and 6 * in using URL without query string in digest * authentication (boolean)
  • + *
  • 'follow_redirects' - Whether to automatically follow HTTP Redirects (boolean)
  • + *
  • 'max_redirects' - Maximum number of redirects to follow (integer)
  • + *
  • 'strict_redirects' - Whether to keep request method on redirects via status 301 and + * 302 (true, needed for compatibility with RFC 2616) + * or switch to GET (false, needed for compatibility with most + * browsers) (boolean)
  • * * * @param string|array configuration parameter name or array * ('parameter name' => 'parameter value') * @param mixed parameter value if $nameOrConfig is not an array * @return HTTP_Request2 - * @throws HTTP_Request2_Exception If the parameter is unknown + * @throws HTTP_Request2_LogicException If the parameter is unknown */ public function setConfig($nameOrConfig, $value = null) { @@ -349,8 +372,9 @@ class HTTP_Request2 implements SplSubject } else { if (!array_key_exists($nameOrConfig, $this->config)) { - throw new HTTP_Request2_Exception( - "Unknown configuration parameter '{$nameOrConfig}'" + throw new HTTP_Request2_LogicException( + "Unknown configuration parameter '{$nameOrConfig}'", + HTTP_Request2_Exception::INVALID_ARGUMENT ); } $this->config[$nameOrConfig] = $value; @@ -363,17 +387,18 @@ class HTTP_Request2 implements SplSubject * Returns the value(s) of the configuration parameter(s) * * @param string parameter name - * @return mixed value of $name parameter, array of all configuration + * @return mixed value of $name parameter, array of all configuration * parameters if $name is not given - * @throws HTTP_Request2_Exception If the parameter is unknown + * @throws HTTP_Request2_LogicException If the parameter is unknown */ public function getConfig($name = null) { if (null === $name) { return $this->config; } elseif (!array_key_exists($name, $this->config)) { - throw new HTTP_Request2_Exception( - "Unknown configuration parameter '{$name}'" + throw new HTTP_Request2_LogicException( + "Unknown configuration parameter '{$name}'", + HTTP_Request2_Exception::INVALID_ARGUMENT ); } return $this->config[$name]; @@ -386,7 +411,7 @@ class HTTP_Request2 implements SplSubject * @param string password * @param string authentication scheme * @return HTTP_Request2 - */ + */ public function setAuth($user, $password = '', $scheme = self::AUTH_BASIC) { if (empty($user)) { @@ -419,13 +444,13 @@ class HTTP_Request2 implements SplSubject * Sets request header(s) * * The first parameter may be either a full header string 'header: value' or - * header name. In the former case $value parameter is ignored, in the latter + * header name. In the former case $value parameter is ignored, in the latter * the header's value will either be set to $value or the header will be * removed if $value is null. The first parameter can also be an array of * headers, in that case method will be called recursively. * * Note that headers are treated case insensitively as per RFC 2616. - * + * * * $req->setHeader('Foo: Bar'); // sets the value of 'Foo' header to 'Bar' * $req->setHeader('FoO', 'Baz'); // sets the value of 'Foo' header to 'Baz' @@ -435,18 +460,21 @@ class HTTP_Request2 implements SplSubject * * @param string|array header name, header string ('Header: value') * or an array of headers - * @param string|null header value, header will be removed if null + * @param string|array|null header value if $name is not an array, + * header will be removed if value is null + * @param bool whether to replace previous header with the + * same name or append to its value * @return HTTP_Request2 - * @throws HTTP_Request2_Exception + * @throws HTTP_Request2_LogicException */ - public function setHeader($name, $value = null) + public function setHeader($name, $value = null, $replace = true) { if (is_array($name)) { foreach ($name as $k => $v) { if (is_string($k)) { - $this->setHeader($k, $v); + $this->setHeader($k, $v, $replace); } else { - $this->setHeader($v); + $this->setHeader($v, null, $replace); } } } else { @@ -455,17 +483,30 @@ class HTTP_Request2 implements SplSubject } // Header name should be a token: http://tools.ietf.org/html/rfc2616#section-4.2 if (preg_match(self::REGEXP_INVALID_TOKEN, $name)) { - throw new HTTP_Request2_Exception("Invalid header name '{$name}'"); + throw new HTTP_Request2_LogicException( + "Invalid header name '{$name}'", + HTTP_Request2_Exception::INVALID_ARGUMENT + ); } // Header names are case insensitive anyway $name = strtolower($name); if (null === $value) { unset($this->headers[$name]); + } else { - $this->headers[$name] = $value; + if (is_array($value)) { + $value = implode(', ', array_map('trim', $value)); + } elseif (is_string($value)) { + $value = trim($value); + } + if (!isset($this->headers[$name]) || $replace) { + $this->headers[$name] = $value; + } else { + $this->headers[$name] .= ', ' . $value; + } } } - + return $this; } @@ -483,21 +524,39 @@ class HTTP_Request2 implements SplSubject } /** - * Appends a cookie to "Cookie:" header + * Adds a cookie to the request + * + * If the request does not have a CookieJar object set, this method simply + * appends a cookie to "Cookie:" header. + * + * If a CookieJar object is available, the cookie is stored in that object. + * Data from request URL will be used for setting its 'domain' and 'path' + * parameters, 'expires' and 'secure' will be set to null and false, + * respectively. If you need further control, use CookieJar's methods. * * @param string cookie name * @param string cookie value * @return HTTP_Request2 - * @throws HTTP_Request2_Exception + * @throws HTTP_Request2_LogicException + * @see setCookieJar() */ public function addCookie($name, $value) { - $cookie = $name . '=' . $value; - if (preg_match(self::REGEXP_INVALID_COOKIE, $cookie)) { - throw new HTTP_Request2_Exception("Invalid cookie: '{$cookie}'"); + if (!empty($this->cookieJar)) { + $this->cookieJar->store(array('name' => $name, 'value' => $value), + $this->url); + + } else { + $cookie = $name . '=' . $value; + if (preg_match(self::REGEXP_INVALID_COOKIE, $cookie)) { + throw new HTTP_Request2_LogicException( + "Invalid cookie: '{$cookie}'", + HTTP_Request2_Exception::INVALID_ARGUMENT + ); + } + $cookies = empty($this->headers['cookie'])? '': $this->headers['cookie'] . '; '; + $this->setHeader('cookie', $cookies . $cookie); } - $cookies = empty($this->headers['cookie'])? '': $this->headers['cookie'] . '; '; - $this->setHeader('cookie', $cookies . $cookie); return $this; } @@ -505,24 +564,32 @@ class HTTP_Request2 implements SplSubject /** * Sets the request body * - * @param string Either a string with the body or filename containing body + * If you provide file pointer rather than file name, it should support + * fstat() and rewind() operations. + * + * @param string|resource|HTTP_Request2_MultipartBody Either a string + * with the body or filename containing body or pointer to + * an open file or object with multipart body data * @param bool Whether first parameter is a filename * @return HTTP_Request2 - * @throws HTTP_Request2_Exception + * @throws HTTP_Request2_LogicException */ public function setBody($body, $isFilename = false) { - if (!$isFilename) { - $this->body = (string)$body; - } else { - if (!($fp = @fopen($body, 'rb'))) { - throw new HTTP_Request2_Exception("Cannot open file {$body}"); + if (!$isFilename && !is_resource($body)) { + if (!$body instanceof HTTP_Request2_MultipartBody) { + $this->body = (string)$body; + } else { + $this->body = $body; } - $this->body = $fp; + } else { + $fileData = $this->fopenWrapper($body, empty($this->headers['content-type'])); + $this->body = $fileData['fp']; if (empty($this->headers['content-type'])) { - $this->setHeader('content-type', self::detectMimeType($body)); + $this->setHeader('content-type', $fileData['type']); } } + $this->postParams = $this->uploads = array(); return $this; } @@ -534,10 +601,10 @@ class HTTP_Request2 implements SplSubject */ public function getBody() { - if (self::METHOD_POST == $this->method && + if (self::METHOD_POST == $this->method && (!empty($this->postParams) || !empty($this->uploads)) ) { - if ('application/x-www-form-urlencoded' == $this->headers['content-type']) { + if (0 === strpos($this->headers['content-type'], 'application/x-www-form-urlencoded')) { $body = http_build_query($this->postParams, '', '&'); if (!$this->getConfig('use_brackets')) { $body = preg_replace('/%5B\d+%5D=/', '=', $body); @@ -545,7 +612,7 @@ class HTTP_Request2 implements SplSubject // support RFC 3986 by not encoding '~' symbol (request #15368) return str_replace('%7E', '~', $body); - } elseif ('multipart/form-data' == $this->headers['content-type']) { + } elseif (0 === strpos($this->headers['content-type'], 'multipart/form-data')) { require_once 'HTTP/Request2/MultipartBody.php'; return new HTTP_Request2_MultipartBody( $this->postParams, $this->uploads, $this->getConfig('use_brackets') @@ -564,25 +631,28 @@ class HTTP_Request2 implements SplSubject * If you just want to send the contents of a file as the body of HTTP * request you should use setBody() method. * + * If you provide file pointers rather than file names, they should support + * fstat() and rewind() operations. + * * @param string name of file-upload field - * @param mixed full name of local file - * @param string filename to send in the request + * @param string|resource|array full name of local file, pointer to + * open file or an array of files + * @param string filename to send in the request * @param string content-type of file being uploaded * @return HTTP_Request2 - * @throws HTTP_Request2_Exception + * @throws HTTP_Request2_LogicException */ public function addUpload($fieldName, $filename, $sendFilename = null, $contentType = null) { if (!is_array($filename)) { - if (!($fp = @fopen($filename, 'rb'))) { - throw new HTTP_Request2_Exception("Cannot open file {$filename}"); - } + $fileData = $this->fopenWrapper($filename, empty($contentType)); $this->uploads[$fieldName] = array( - 'fp' => $fp, - 'filename' => empty($sendFilename)? basename($filename): $sendFilename, - 'size' => filesize($filename), - 'type' => empty($contentType)? self::detectMimeType($filename): $contentType + 'fp' => $fileData['fp'], + 'filename' => !empty($sendFilename)? $sendFilename + :(is_string($filename)? basename($filename): 'anonymous.blob') , + 'size' => $fileData['size'], + 'type' => empty($contentType)? $fileData['type']: $contentType ); } else { $fps = $names = $sizes = $types = array(); @@ -590,13 +660,12 @@ class HTTP_Request2 implements SplSubject if (!is_array($f)) { $f = array($f); } - if (!($fp = @fopen($f[0], 'rb'))) { - throw new HTTP_Request2_Exception("Cannot open file {$f[0]}"); - } - $fps[] = $fp; - $names[] = empty($f[1])? basename($f[0]): $f[1]; - $sizes[] = filesize($f[0]); - $types[] = empty($f[2])? self::detectMimeType($f[0]): $f[2]; + $fileData = $this->fopenWrapper($f[0], empty($f[2])); + $fps[] = $fileData['fp']; + $names[] = !empty($f[1])? $f[1] + :(is_string($f[0])? basename($f[0]): 'anonymous.blob'); + $sizes[] = $fileData['size']; + $types[] = empty($f[2])? $fileData['type']: $f[2]; } $this->uploads[$fieldName] = array( 'fp' => $fps, 'filename' => $names, 'size' => $sizes, 'type' => $types @@ -703,8 +772,10 @@ class HTTP_Request2 implements SplSubject *
  • 'disconnect' - after disconnection from server
  • *
  • 'sentHeaders' - after sending the request headers, * data is the headers sent (string)
  • - *
  • 'sentBodyPart' - after sending a part of the request body, + *
  • 'sentBodyPart' - after sending a part of the request body, * data is the length of that part (int)
  • + *
  • 'sentBody' - after sending the whole request body, + * data is request body length (int)
  • *
  • 'receivedHeaders' - after receiving the response headers, * data is HTTP_Request2_Response object
  • *
  • 'receivedBodyPart' - after receiving a part of the response @@ -738,7 +809,7 @@ class HTTP_Request2 implements SplSubject * * @param string|HTTP_Request2_Adapter * @return HTTP_Request2 - * @throws HTTP_Request2_Exception + * @throws HTTP_Request2_LogicException */ public function setAdapter($adapter) { @@ -751,19 +822,67 @@ class HTTP_Request2 implements SplSubject include_once str_replace('_', DIRECTORY_SEPARATOR, $adapter) . '.php'; } if (!class_exists($adapter, false)) { - throw new HTTP_Request2_Exception("Class {$adapter} not found"); + throw new HTTP_Request2_LogicException( + "Class {$adapter} not found", + HTTP_Request2_Exception::MISSING_VALUE + ); } } $adapter = new $adapter; } if (!$adapter instanceof HTTP_Request2_Adapter) { - throw new HTTP_Request2_Exception('Parameter is not a HTTP request adapter'); + throw new HTTP_Request2_LogicException( + 'Parameter is not a HTTP request adapter', + HTTP_Request2_Exception::INVALID_ARGUMENT + ); } $this->adapter = $adapter; return $this; } + /** + * Sets the cookie jar + * + * A cookie jar is used to maintain cookies across HTTP requests and + * responses. Cookies from jar will be automatically added to the request + * headers based on request URL. + * + * @param HTTP_Request2_CookieJar|bool Existing CookieJar object, true to + * create a new one, false to remove + */ + public function setCookieJar($jar = true) + { + if (!class_exists('HTTP_Request2_CookieJar', false)) { + require_once 'HTTP/Request2/CookieJar.php'; + } + + if ($jar instanceof HTTP_Request2_CookieJar) { + $this->cookieJar = $jar; + } elseif (true === $jar) { + $this->cookieJar = new HTTP_Request2_CookieJar(); + } elseif (!$jar) { + $this->cookieJar = null; + } else { + throw new HTTP_Request2_LogicException( + 'Invalid parameter passed to setCookieJar()', + HTTP_Request2_Exception::INVALID_ARGUMENT + ); + } + + return $this; + } + + /** + * Returns current CookieJar object or null if none + * + * @return HTTP_Request2_CookieJar|null + */ + public function getCookieJar() + { + return $this->cookieJar; + } + /** * Sends the request and returns the response * @@ -773,20 +892,25 @@ class HTTP_Request2 implements SplSubject public function send() { // Sanity check for URL - if (!$this->url instanceof Net_URL2) { - throw new HTTP_Request2_Exception('No URL given'); - } elseif (!$this->url->isAbsolute()) { - throw new HTTP_Request2_Exception('Absolute URL required'); - } elseif (!in_array(strtolower($this->url->getScheme()), array('https', 'http'))) { - throw new HTTP_Request2_Exception('Not a HTTP URL'); + if (!$this->url instanceof Net_URL2 + || !$this->url->isAbsolute() + || !in_array(strtolower($this->url->getScheme()), array('https', 'http')) + ) { + throw new HTTP_Request2_LogicException( + 'HTTP_Request2 needs an absolute HTTP(S) request URL, ' + . ($this->url instanceof Net_URL2 + ? 'none' : "'" . $this->url->__toString() . "'") + . ' given', + HTTP_Request2_Exception::INVALID_ARGUMENT + ); } if (empty($this->adapter)) { $this->setAdapter($this->getConfig('adapter')); } // magic_quotes_runtime may break file uploads and chunked response - // processing; see bug #4543 - if ($magicQuotes = ini_get('magic_quotes_runtime')) { - ini_set('magic_quotes_runtime', false); + // processing; see bug #4543. Don't use ini_get() here; see bug #16440. + if ($magicQuotes = get_magic_quotes_runtime()) { + set_magic_quotes_runtime(false); } // force using single byte encoding if mbstring extension overloads // strlen() and substr(); see bug #1781, bug #10605 @@ -801,7 +925,7 @@ class HTTP_Request2 implements SplSubject } // cleanup in either case (poor man's "finally" clause) if ($magicQuotes) { - ini_set('magic_quotes_runtime', true); + set_magic_quotes_runtime(true); } if (!empty($oldEncoding)) { mb_internal_encoding($oldEncoding); @@ -813,6 +937,53 @@ class HTTP_Request2 implements SplSubject return $response; } + /** + * Wrapper around fopen()/fstat() used by setBody() and addUpload() + * + * @param string|resource file name or pointer to open file + * @param bool whether to try autodetecting MIME type of file, + * will only work if $file is a filename, not pointer + * @return array array('fp' => file pointer, 'size' => file size, 'type' => MIME type) + * @throws HTTP_Request2_LogicException + */ + protected function fopenWrapper($file, $detectType = false) + { + if (!is_string($file) && !is_resource($file)) { + throw new HTTP_Request2_LogicException( + "Filename or file pointer resource expected", + HTTP_Request2_Exception::INVALID_ARGUMENT + ); + } + $fileData = array( + 'fp' => is_string($file)? null: $file, + 'type' => 'application/octet-stream', + 'size' => 0 + ); + if (is_string($file)) { + $track = @ini_set('track_errors', 1); + if (!($fileData['fp'] = @fopen($file, 'rb'))) { + $e = new HTTP_Request2_LogicException( + $php_errormsg, HTTP_Request2_Exception::READ_ERROR + ); + } + @ini_set('track_errors', $track); + if (isset($e)) { + throw $e; + } + if ($detectType) { + $fileData['type'] = self::detectMimeType($file); + } + } + if (!($stat = fstat($fileData['fp']))) { + throw new HTTP_Request2_LogicException( + "fstat() call failed", HTTP_Request2_Exception::READ_ERROR + ); + } + $fileData['size'] = $stat['size']; + + return $fileData; + } + /** * Tries to detect MIME type of a file * @@ -825,12 +996,12 @@ class HTTP_Request2 implements SplSubject */ protected static function detectMimeType($filename) { - // finfo extension from PECL available + // finfo extension from PECL available if (function_exists('finfo_open')) { if (!isset(self::$_fileinfoDb)) { self::$_fileinfoDb = @finfo_open(FILEINFO_MIME); } - if (self::$_fileinfoDb) { + if (self::$_fileinfoDb) { $info = finfo_file(self::$_fileinfoDb, $filename); } } diff --git a/extlib/HTTP/Request2/Adapter.php b/extlib/HTTP/Request2/Adapter.php index 39b092b346..2cabbf897b 100644 --- a/extlib/HTTP/Request2/Adapter.php +++ b/extlib/HTTP/Request2/Adapter.php @@ -6,7 +6,7 @@ * * LICENSE: * - * Copyright (c) 2008, 2009, Alexey Borzov + * Copyright (c) 2008-2011, Alexey Borzov * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -37,7 +37,7 @@ * @package HTTP_Request2 * @author Alexey Borzov * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Adapter.php 274684 2009-01-26 23:07:27Z avb $ + * @version SVN: $Id: Adapter.php 308322 2011-02-14 13:58:03Z avb $ * @link http://pear.php.net/package/HTTP_Request2 */ @@ -50,13 +50,13 @@ require_once 'HTTP/Request2/Response.php'; * Base class for HTTP_Request2 adapters * * HTTP_Request2 class itself only defines methods for aggregating the request - * data, all actual work of sending the request to the remote server and + * data, all actual work of sending the request to the remote server and * receiving its response is performed by adapters. * * @category HTTP * @package HTTP_Request2 * @author Alexey Borzov - * @version Release: 0.4.1 + * @version Release: 2.0.0RC1 */ abstract class HTTP_Request2_Adapter { @@ -109,8 +109,8 @@ abstract class HTTP_Request2_Adapter /** * Calculates length of the request body, adds proper headers * - * @param array associative array of request headers, this method will - * add proper 'Content-Length' and 'Content-Type' headers + * @param array associative array of request headers, this method will + * add proper 'Content-Length' and 'Content-Type' headers * to this array (or remove them if not needed) */ protected function calculateRequestLength(&$headers) @@ -133,13 +133,15 @@ abstract class HTTP_Request2_Adapter if (in_array($this->request->getMethod(), self::$bodyDisallowed) || 0 == $this->contentLength ) { - unset($headers['content-type']); // No body: send a Content-Length header nonetheless (request #12900), // but do that only for methods that require a body (bug #14740) if (in_array($this->request->getMethod(), self::$bodyRequired)) { $headers['content-length'] = 0; } else { unset($headers['content-length']); + // if the method doesn't require a body and doesn't have a + // body, don't send a Content-Type header. (request #16799) + unset($headers['content-type']); } } else { if (empty($headers['content-type'])) { diff --git a/extlib/HTTP/Request2/Adapter/Curl.php b/extlib/HTTP/Request2/Adapter/Curl.php index 4d4de0dcc7..fecfbd7abc 100644 --- a/extlib/HTTP/Request2/Adapter/Curl.php +++ b/extlib/HTTP/Request2/Adapter/Curl.php @@ -6,7 +6,7 @@ * * LICENSE: * - * Copyright (c) 2008, 2009, Alexey Borzov + * Copyright (c) 2008-2011, Alexey Borzov * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -37,7 +37,7 @@ * @package HTTP_Request2 * @author Alexey Borzov * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Curl.php 278226 2009-04-03 21:32:48Z avb $ + * @version SVN: $Id: Curl.php 310800 2011-05-06 07:29:56Z avb $ * @link http://pear.php.net/package/HTTP_Request2 */ @@ -52,7 +52,7 @@ require_once 'HTTP/Request2/Adapter.php'; * @category HTTP * @package HTTP_Request2 * @author Alexey Borzov - * @version Release: 0.4.1 + * @version Release: 2.0.0RC1 */ class HTTP_Request2_Adapter_Curl extends HTTP_Request2_Adapter { @@ -79,6 +79,46 @@ class HTTP_Request2_Adapter_Curl extends HTTP_Request2_Adapter 'ssl_passphrase' => CURLOPT_SSLCERTPASSWD ); + /** + * Mapping of CURLE_* constants to Exception subclasses and error codes + * @var array + */ + protected static $errorMap = array( + CURLE_UNSUPPORTED_PROTOCOL => array('HTTP_Request2_MessageException', + HTTP_Request2_Exception::NON_HTTP_REDIRECT), + CURLE_COULDNT_RESOLVE_PROXY => array('HTTP_Request2_ConnectionException'), + CURLE_COULDNT_RESOLVE_HOST => array('HTTP_Request2_ConnectionException'), + CURLE_COULDNT_CONNECT => array('HTTP_Request2_ConnectionException'), + // error returned from write callback + CURLE_WRITE_ERROR => array('HTTP_Request2_MessageException', + HTTP_Request2_Exception::NON_HTTP_REDIRECT), + CURLE_OPERATION_TIMEOUTED => array('HTTP_Request2_MessageException', + HTTP_Request2_Exception::TIMEOUT), + CURLE_HTTP_RANGE_ERROR => array('HTTP_Request2_MessageException'), + CURLE_SSL_CONNECT_ERROR => array('HTTP_Request2_ConnectionException'), + CURLE_LIBRARY_NOT_FOUND => array('HTTP_Request2_LogicException', + HTTP_Request2_Exception::MISCONFIGURATION), + CURLE_FUNCTION_NOT_FOUND => array('HTTP_Request2_LogicException', + HTTP_Request2_Exception::MISCONFIGURATION), + CURLE_ABORTED_BY_CALLBACK => array('HTTP_Request2_MessageException', + HTTP_Request2_Exception::NON_HTTP_REDIRECT), + CURLE_TOO_MANY_REDIRECTS => array('HTTP_Request2_MessageException', + HTTP_Request2_Exception::TOO_MANY_REDIRECTS), + CURLE_SSL_PEER_CERTIFICATE => array('HTTP_Request2_ConnectionException'), + CURLE_GOT_NOTHING => array('HTTP_Request2_MessageException'), + CURLE_SSL_ENGINE_NOTFOUND => array('HTTP_Request2_LogicException', + HTTP_Request2_Exception::MISCONFIGURATION), + CURLE_SSL_ENGINE_SETFAILED => array('HTTP_Request2_LogicException', + HTTP_Request2_Exception::MISCONFIGURATION), + CURLE_SEND_ERROR => array('HTTP_Request2_MessageException'), + CURLE_RECV_ERROR => array('HTTP_Request2_MessageException'), + CURLE_SSL_CERTPROBLEM => array('HTTP_Request2_LogicException', + HTTP_Request2_Exception::INVALID_ARGUMENT), + CURLE_SSL_CIPHER => array('HTTP_Request2_ConnectionException'), + CURLE_SSL_CACERT => array('HTTP_Request2_ConnectionException'), + CURLE_BAD_CONTENT_ENCODING => array('HTTP_Request2_MessageException'), + ); + /** * Response being received * @var HTTP_Request2_Response @@ -110,6 +150,26 @@ class HTTP_Request2_Adapter_Curl extends HTTP_Request2_Adapter */ protected $lastInfo; + /** + * Creates a subclass of HTTP_Request2_Exception from curl error data + * + * @param resource curl handle + * @return HTTP_Request2_Exception + */ + protected static function wrapCurlError($ch) + { + $nativeCode = curl_errno($ch); + $message = 'Curl error: ' . curl_error($ch); + if (!isset(self::$errorMap[$nativeCode])) { + return new HTTP_Request2_Exception($message, 0, $nativeCode); + } else { + $class = self::$errorMap[$nativeCode][0]; + $code = empty(self::$errorMap[$nativeCode][1]) + ? 0 : self::$errorMap[$nativeCode][1]; + return new $class($message, $code, $nativeCode); + } + } + /** * Sends request to the remote server and returns its response * @@ -120,7 +180,9 @@ class HTTP_Request2_Adapter_Curl extends HTTP_Request2_Adapter public function sendRequest(HTTP_Request2 $request) { if (!extension_loaded('curl')) { - throw new HTTP_Request2_Exception('cURL extension not available'); + throw new HTTP_Request2_LogicException( + 'cURL extension not available', HTTP_Request2_Exception::MISCONFIGURATION + ); } $this->request = $request; @@ -131,24 +193,30 @@ class HTTP_Request2_Adapter_Curl extends HTTP_Request2_Adapter try { if (false === curl_exec($ch = $this->createCurlHandle())) { - $errorMessage = 'Error sending request: #' . curl_errno($ch) . - ' ' . curl_error($ch); + $e = self::wrapCurlError($ch); } } catch (Exception $e) { } - $this->lastInfo = curl_getinfo($ch); - curl_close($ch); + if (isset($ch)) { + $this->lastInfo = curl_getinfo($ch); + curl_close($ch); + } + + $response = $this->response; + unset($this->request, $this->requestBody, $this->response); if (!empty($e)) { throw $e; - } elseif (!empty($errorMessage)) { - throw new HTTP_Request2_Exception($errorMessage); + } + + if ($jar = $request->getCookieJar()) { + $jar->addCookiesFromResponse($response, $request->getUrl()); } if (0 < $this->lastInfo['size_download']) { - $this->request->setLastEvent('receivedBody', $this->response); + $request->setLastEvent('receivedBody', $response); } - return $this->response; + return $response; } /** @@ -165,19 +233,16 @@ class HTTP_Request2_Adapter_Curl extends HTTP_Request2_Adapter * Creates a new cURL handle and populates it with data from the request * * @return resource a cURL handle, as created by curl_init() - * @throws HTTP_Request2_Exception + * @throws HTTP_Request2_LogicException */ protected function createCurlHandle() { $ch = curl_init(); curl_setopt_array($ch, array( - // setup callbacks - CURLOPT_READFUNCTION => array($this, 'callbackReadBody'), + // setup write callbacks CURLOPT_HEADERFUNCTION => array($this, 'callbackWriteHeader'), CURLOPT_WRITEFUNCTION => array($this, 'callbackWriteBody'), - // disallow redirects - CURLOPT_FOLLOWLOCATION => false, // buffer size CURLOPT_BUFFERSIZE => $this->request->getConfig('buffer_size'), // connection timeout @@ -188,6 +253,27 @@ class HTTP_Request2_Adapter_Curl extends HTTP_Request2_Adapter CURLOPT_URL => $this->request->getUrl()->getUrl() )); + // set up redirects + if (!$this->request->getConfig('follow_redirects')) { + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); + } else { + if (!@curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true)) { + throw new HTTP_Request2_LogicException( + 'Redirect support in curl is unavailable due to open_basedir or safe_mode setting', + HTTP_Request2_Exception::MISCONFIGURATION + ); + } + curl_setopt($ch, CURLOPT_MAXREDIRS, $this->request->getConfig('max_redirects')); + // limit redirects to http(s), works in 5.2.10+ + if (defined('CURLOPT_REDIR_PROTOCOLS')) { + curl_setopt($ch, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS); + } + // works in 5.3.2+, http://bugs.php.net/bug.php?id=49571 + if ($this->request->getConfig('strict_redirects') && defined('CURLOPT_POSTREDIR')) { + curl_setopt($ch, CURLOPT_POSTREDIR, 3); + } + } + // request timeout if ($timeout = $this->request->getConfig('timeout')) { curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); @@ -210,6 +296,12 @@ class HTTP_Request2_Adapter_Curl extends HTTP_Request2_Adapter case HTTP_Request2::METHOD_POST: curl_setopt($ch, CURLOPT_POST, true); break; + case HTTP_Request2::METHOD_HEAD: + curl_setopt($ch, CURLOPT_NOBODY, true); + break; + case HTTP_Request2::METHOD_PUT: + curl_setopt($ch, CURLOPT_UPLOAD, true); + break; default: curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $this->request->getMethod()); } @@ -217,7 +309,9 @@ class HTTP_Request2_Adapter_Curl extends HTTP_Request2_Adapter // set proxy, if needed if ($host = $this->request->getConfig('proxy_host')) { if (!($port = $this->request->getConfig('proxy_port'))) { - throw new HTTP_Request2_Exception('Proxy port not provided'); + throw new HTTP_Request2_LogicException( + 'Proxy port not provided', HTTP_Request2_Exception::MISSING_VALUE + ); } curl_setopt($ch, CURLOPT_PROXY, $host . ':' . $port); if ($user = $this->request->getConfig('proxy_user')) { @@ -246,13 +340,11 @@ class HTTP_Request2_Adapter_Curl extends HTTP_Request2_Adapter } // set SSL options - if (0 == strcasecmp($this->request->getUrl()->getScheme(), 'https')) { - foreach ($this->request->getConfig() as $name => $value) { - if ('ssl_verify_host' == $name && null !== $value) { - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, $value? 2: 0); - } elseif (isset(self::$sslContextMap[$name]) && null !== $value) { - curl_setopt($ch, self::$sslContextMap[$name], $value); - } + foreach ($this->request->getConfig() as $name => $value) { + if ('ssl_verify_host' == $name && null !== $value) { + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, $value? 2: 0); + } elseif (isset(self::$sslContextMap[$name]) && null !== $value) { + curl_setopt($ch, self::$sslContextMap[$name], $value); } } @@ -262,6 +354,12 @@ class HTTP_Request2_Adapter_Curl extends HTTP_Request2_Adapter $headers['accept-encoding'] = ''; } + if (($jar = $this->request->getCookieJar()) + && ($cookies = $jar->getMatching($this->request->getUrl(), true)) + ) { + $headers['cookie'] = (empty($headers['cookie'])? '': $headers['cookie'] . '; ') . $cookies; + } + // set headers having special cURL keys foreach (self::$headerMap as $name => $option) { if (isset($headers[$name])) { @@ -271,6 +369,9 @@ class HTTP_Request2_Adapter_Curl extends HTTP_Request2_Adapter } $this->calculateRequestLength($headers); + if (isset($headers['content-length'])) { + $this->workaroundPhpBug47204($ch, $headers); + } // set headers not having special keys $headersFmt = array(); @@ -283,13 +384,50 @@ class HTTP_Request2_Adapter_Curl extends HTTP_Request2_Adapter return $ch; } + /** + * Workaround for PHP bug #47204 that prevents rewinding request body + * + * The workaround consists of reading the entire request body into memory + * and setting it as CURLOPT_POSTFIELDS, so it isn't recommended for large + * file uploads, use Socket adapter instead. + * + * @param resource cURL handle + * @param array Request headers + */ + protected function workaroundPhpBug47204($ch, &$headers) + { + // no redirects, no digest auth -> probably no rewind needed + if (!$this->request->getConfig('follow_redirects') + && (!($auth = $this->request->getAuth()) + || HTTP_Request2::AUTH_DIGEST != $auth['scheme']) + ) { + curl_setopt($ch, CURLOPT_READFUNCTION, array($this, 'callbackReadBody')); + + // rewind may be needed, read the whole body into memory + } else { + if ($this->requestBody instanceof HTTP_Request2_MultipartBody) { + $this->requestBody = $this->requestBody->__toString(); + + } elseif (is_resource($this->requestBody)) { + $fp = $this->requestBody; + $this->requestBody = ''; + while (!feof($fp)) { + $this->requestBody .= fread($fp, 16384); + } + } + // curl hangs up if content-length is present + unset($headers['content-length']); + curl_setopt($ch, CURLOPT_POSTFIELDS, $this->requestBody); + } + } + /** * Callback function called by cURL for reading the request body * * @param resource cURL handle * @param resource file descriptor (not used) * @param integer maximum length of data to return - * @return string part of the request body, up to $length bytes + * @return string part of the request body, up to $length bytes */ protected function callbackReadBody($ch, $fd, $length) { @@ -336,6 +474,19 @@ class HTTP_Request2_Adapter_Curl extends HTTP_Request2_Adapter 'sentHeaders', curl_getinfo($ch, CURLINFO_HEADER_OUT) ); } + $upload = curl_getinfo($ch, CURLINFO_SIZE_UPLOAD); + // if body wasn't read by a callback, send event with total body size + if ($upload > $this->position) { + $this->request->setLastEvent( + 'sentBodyPart', $upload - $this->position + ); + $this->position = $upload; + } + if ($upload && (!$this->eventSentHeaders + || $this->response->getStatus() >= 200) + ) { + $this->request->setLastEvent('sentBody', $upload); + } $this->eventSentHeaders = true; // we'll need a new response object if ($this->eventReceivedHeaders) { @@ -344,7 +495,9 @@ class HTTP_Request2_Adapter_Curl extends HTTP_Request2_Adapter } } if (empty($this->response)) { - $this->response = new HTTP_Request2_Response($string, false); + $this->response = new HTTP_Request2_Response( + $string, false, curl_getinfo($ch, CURLINFO_EFFECTIVE_URL) + ); } else { $this->response->parseHeaderLine($string); if ('' == trim($string)) { @@ -352,6 +505,27 @@ class HTTP_Request2_Adapter_Curl extends HTTP_Request2_Adapter if (200 <= $this->response->getStatus()) { $this->request->setLastEvent('receivedHeaders', $this->response); } + + if ($this->request->getConfig('follow_redirects') && $this->response->isRedirect()) { + $redirectUrl = new Net_URL2($this->response->getHeader('location')); + + // for versions lower than 5.2.10, check the redirection URL protocol + if (!defined('CURLOPT_REDIR_PROTOCOLS') && $redirectUrl->isAbsolute() + && !in_array($redirectUrl->getScheme(), array('http', 'https')) + ) { + return -1; + } + + if ($jar = $this->request->getCookieJar()) { + $jar->addCookiesFromResponse($this->response, $this->request->getUrl()); + if (!$redirectUrl->isAbsolute()) { + $redirectUrl = $this->request->getUrl()->resolve($redirectUrl); + } + if ($cookies = $jar->getMatching($redirectUrl, true)) { + curl_setopt($ch, CURLOPT_COOKIE, $cookies); + } + } + } $this->eventReceivedHeaders = true; } } @@ -368,10 +542,13 @@ class HTTP_Request2_Adapter_Curl extends HTTP_Request2_Adapter */ protected function callbackWriteBody($ch, $string) { - // cURL calls WRITEFUNCTION callback without calling HEADERFUNCTION if + // cURL calls WRITEFUNCTION callback without calling HEADERFUNCTION if // response doesn't start with proper HTTP status line (see bug #15716) if (empty($this->response)) { - throw new HTTP_Request2_Exception("Malformed response: {$string}"); + throw new HTTP_Request2_MessageException( + "Malformed response: {$string}", + HTTP_Request2_Exception::MALFORMED_RESPONSE + ); } if ($this->request->getConfig('store_body')) { $this->response->appendBody($string); diff --git a/extlib/HTTP/Request2/Adapter/Mock.php b/extlib/HTTP/Request2/Adapter/Mock.php index 89688003b2..c99defb899 100644 --- a/extlib/HTTP/Request2/Adapter/Mock.php +++ b/extlib/HTTP/Request2/Adapter/Mock.php @@ -6,7 +6,7 @@ * * LICENSE: * - * Copyright (c) 2008, 2009, Alexey Borzov + * Copyright (c) 2008-2011, Alexey Borzov * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -37,7 +37,7 @@ * @package HTTP_Request2 * @author Alexey Borzov * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Mock.php 274406 2009-01-23 18:01:57Z avb $ + * @version SVN: $Id: Mock.php 308322 2011-02-14 13:58:03Z avb $ * @link http://pear.php.net/package/HTTP_Request2 */ @@ -55,31 +55,31 @@ require_once 'HTTP/Request2/Adapter.php'; * * $mock = new HTTP_Request2_Adapter_Mock(); * $mock->addResponse("HTTP/1.1 ... "); - * + * * $request = new HTTP_Request2(); * $request->setAdapter($mock); - * + * * // This will return the response set above * $response = $req->send(); - * + * * * @category HTTP * @package HTTP_Request2 * @author Alexey Borzov - * @version Release: 0.4.1 + * @version Release: 2.0.0RC1 */ class HTTP_Request2_Adapter_Mock extends HTTP_Request2_Adapter { /** * A queue of responses to be returned by sendRequest() - * @var array + * @var array */ protected $responses = array(); /** * Returns the next response from the queue built by addResponse() * - * If the queue is empty will return default empty response with status 400, + * If the queue is empty it will return default empty response with status 400, * if an Exception object was added to the queue it will be thrown. * * @param HTTP_Request2 @@ -93,7 +93,7 @@ class HTTP_Request2_Adapter_Mock extends HTTP_Request2_Adapter if ($response instanceof HTTP_Request2_Response) { return $response; } else { - // rethrow the exception, + // rethrow the exception $class = get_class($response); $message = $response->getMessage(); $code = $response->getCode(); @@ -108,7 +108,7 @@ class HTTP_Request2_Adapter_Mock extends HTTP_Request2_Adapter * Adds response to the queue * * @param mixed either a string, a pointer to an open file, - * a HTTP_Request2_Response or Exception object + * an instance of HTTP_Request2_Response or Exception * @throws HTTP_Request2_Exception */ public function addResponse($response) @@ -135,7 +135,7 @@ class HTTP_Request2_Adapter_Mock extends HTTP_Request2_Adapter public static function createResponseFromString($str) { $parts = preg_split('!(\r?\n){2}!m', $str, 2); - $headerLines = explode("\n", $parts[0]); + $headerLines = explode("\n", $parts[0]); $response = new HTTP_Request2_Response(array_shift($headerLines)); foreach ($headerLines as $headerLine) { $response->parseHeaderLine($headerLine); diff --git a/extlib/HTTP/Request2/Adapter/Socket.php b/extlib/HTTP/Request2/Adapter/Socket.php index ff44d49594..05cc4c715b 100644 --- a/extlib/HTTP/Request2/Adapter/Socket.php +++ b/extlib/HTTP/Request2/Adapter/Socket.php @@ -6,7 +6,7 @@ * * LICENSE: * - * Copyright (c) 2008, 2009, Alexey Borzov + * Copyright (c) 2008-2011, Alexey Borzov * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -37,7 +37,7 @@ * @package HTTP_Request2 * @author Alexey Borzov * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Socket.php 279760 2009-05-03 10:46:42Z avb $ + * @version SVN: $Id: Socket.php 309921 2011-04-03 16:43:02Z avb $ * @link http://pear.php.net/package/HTTP_Request2 */ @@ -55,13 +55,13 @@ require_once 'HTTP/Request2/Adapter.php'; * @category HTTP * @package HTTP_Request2 * @author Alexey Borzov - * @version Release: 0.4.1 + * @version Release: 2.0.0RC1 */ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter { /** * Regular expression for 'token' rule from RFC 2616 - */ + */ const REGEXP_TOKEN = '[^\x00-\x1f\x7f-\xff()<>@,;:\\\\"/\[\]?={}\s]+'; /** @@ -79,11 +79,11 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter /** * Data for digest authentication scheme * - * The keys for the array are URL prefixes. + * The keys for the array are URL prefixes. * - * The values are associative arrays with data (realm, nonce, nonce-count, - * opaque...) needed for digest authentication. Stored here to prevent making - * duplicate requests to digest-protected resources after we have already + * The values are associative arrays with data (realm, nonce, nonce-count, + * opaque...) needed for digest authentication. Stored here to prevent making + * duplicate requests to digest-protected resources after we have already * received the challenge. * * @var array @@ -110,18 +110,28 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter protected $proxyChallenge; /** - * Global timeout, exception will be raised if request continues past this time + * Sum of start time and global timeout, exception will be thrown if request continues past this time * @var integer */ - protected $timeout = null; + protected $deadline = null; /** * Remaining length of the current chunk, when reading chunked response * @var integer * @see readChunked() - */ + */ protected $chunkLength = 0; + /** + * Remaining amount of redirections to follow + * + * Starts at 'max_redirects' configuration parameter and is reduced on each + * subsequent redirect. An Exception will be thrown once it reaches zero. + * + * @var integer + */ + protected $redirectCountdown = null; + /** * Sends request to the remote server and returns its response * @@ -132,33 +142,38 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter public function sendRequest(HTTP_Request2 $request) { $this->request = $request; - $keepAlive = $this->connect(); - $headers = $this->prepareHeaders(); - // Use global request timeout if given, see feature requests #5735, #8964 + // Use global request timeout if given, see feature requests #5735, #8964 if ($timeout = $request->getConfig('timeout')) { - $this->timeout = time() + $timeout; + $this->deadline = time() + $timeout; } else { - $this->timeout = null; + $this->deadline = null; } try { + $keepAlive = $this->connect(); + $headers = $this->prepareHeaders(); if (false === @fwrite($this->socket, $headers, strlen($headers))) { - throw new HTTP_Request2_Exception('Error writing request'); + throw new HTTP_Request2_MessageException('Error writing request'); } // provide request headers to the observer, see request #7633 $this->request->setLastEvent('sentHeaders', $headers); $this->writeBody(); - if ($this->timeout && time() > $this->timeout) { - throw new HTTP_Request2_Exception( - 'Request timed out after ' . - $request->getConfig('timeout') . ' second(s)' + if ($this->deadline && time() > $this->deadline) { + throw new HTTP_Request2_MessageException( + 'Request timed out after ' . + $request->getConfig('timeout') . ' second(s)', + HTTP_Request2_Exception::TIMEOUT ); } $response = $this->readResponse(); + if ($jar = $request->getCookieJar()) { + $jar->addCookiesFromResponse($response, $request->getUrl()); + } + if (!$this->canKeepAlive($keepAlive, $response)) { $this->disconnect(); } @@ -178,10 +193,21 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter } catch (Exception $e) { $this->disconnect(); + } + + unset($this->request, $this->requestBody); + + if (!empty($e)) { + $this->redirectCountdown = null; throw $e; } - return $response; + if (!$request->getConfig('follow_redirects') || !$response->isRedirect()) { + $this->redirectCountdown = null; + return $response; + } else { + return $this->handleRedirect($request, $response); + } } /** @@ -202,7 +228,10 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter if ($host = $this->request->getConfig('proxy_host')) { if (!($port = $this->request->getConfig('proxy_port'))) { - throw new HTTP_Request2_Exception('Proxy port not provided'); + throw new HTTP_Request2_LogicException( + 'Proxy port not provided', + HTTP_Request2_Exception::MISSING_VALUE + ); } $proxy = true; } else { @@ -212,25 +241,27 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter } if ($tunnel && !$proxy) { - throw new HTTP_Request2_Exception( - "Trying to perform CONNECT request without proxy" + throw new HTTP_Request2_LogicException( + "Trying to perform CONNECT request without proxy", + HTTP_Request2_Exception::MISSING_VALUE ); } if ($secure && !in_array('ssl', stream_get_transports())) { - throw new HTTP_Request2_Exception( - 'Need OpenSSL support for https:// requests' + throw new HTTP_Request2_LogicException( + 'Need OpenSSL support for https:// requests', + HTTP_Request2_Exception::MISCONFIGURATION ); } // RFC 2068, section 19.7.1: A client MUST NOT send the Keep-Alive // connection token to a proxy server... - if ($proxy && !$secure && + if ($proxy && !$secure && !empty($headers['connection']) && 'Keep-Alive' == $headers['connection'] ) { $this->request->setHeader('connection'); } - $keepAlive = ('1.1' == $this->request->getConfig('protocol_version') && + $keepAlive = ('1.1' == $this->request->getConfig('protocol_version') && empty($headers['connection'])) || (!empty($headers['connection']) && 'Keep-Alive' == $headers['connection']); @@ -278,21 +309,27 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter $context = stream_context_create(); foreach ($options as $name => $value) { if (!stream_context_set_option($context, 'ssl', $name, $value)) { - throw new HTTP_Request2_Exception( + throw new HTTP_Request2_LogicException( "Error setting SSL context option '{$name}'" ); } } + $track = @ini_set('track_errors', 1); $this->socket = @stream_socket_client( $remote, $errno, $errstr, $this->request->getConfig('connect_timeout'), STREAM_CLIENT_CONNECT, $context ); if (!$this->socket) { - throw new HTTP_Request2_Exception( - "Unable to connect to {$remote}. Error #{$errno}: {$errstr}" + $e = new HTTP_Request2_ConnectionException( + "Unable to connect to {$remote}. Error: " + . (empty($errstr)? $php_errormsg: $errstr), 0, $errno ); } + @ini_set('track_errors', $track); + if (isset($e)) { + throw $e; + } $this->request->setLastEvent('connect', $remote); self::$sockets[$socketKey] =& $this->socket; } @@ -320,7 +357,7 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter $response = $connect->send(); // Need any successful (2XX) response if (200 > $response->getStatus() || 300 <= $response->getStatus()) { - throw new HTTP_Request2_Exception( + throw new HTTP_Request2_ConnectionException( 'Failed to connect via HTTPS proxy. Proxy response: ' . $response->getStatus() . ' ' . $response->getReasonPhrase() ); @@ -328,10 +365,10 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter $this->socket = $donor->socket; $modes = array( - STREAM_CRYPTO_METHOD_TLS_CLIENT, + STREAM_CRYPTO_METHOD_TLS_CLIENT, STREAM_CRYPTO_METHOD_SSLv3_CLIENT, STREAM_CRYPTO_METHOD_SSLv23_CLIENT, - STREAM_CRYPTO_METHOD_SSLv2_CLIENT + STREAM_CRYPTO_METHOD_SSLv2_CLIENT ); foreach ($modes as $mode) { @@ -339,7 +376,7 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter return; } } - throw new HTTP_Request2_Exception( + throw new HTTP_Request2_ConnectionException( 'Failed to enable secure connection when connecting through proxy' ); } @@ -347,7 +384,7 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter /** * Checks whether current connection may be reused or should be closed * - * @param boolean whether connection could be persistent + * @param boolean whether connection could be persistent * in the first place * @param HTTP_Request2_Response response object to check * @return boolean @@ -361,8 +398,11 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter return true; } - $lengthKnown = 'chunked' == strtolower($response->getHeader('transfer-encoding')) || - null !== $response->getHeader('content-length'); + $lengthKnown = 'chunked' == strtolower($response->getHeader('transfer-encoding')) + || null !== $response->getHeader('content-length') + // no body possible for such responses, see also request #17031 + || HTTP_Request2::METHOD_HEAD == $this->request->getMethod() + || in_array($response->getStatus(), array(204, 304)); $persistent = 'keep-alive' == strtolower($response->getHeader('connection')) || (null === $response->getHeader('connection') && '1.1' == $response->getVersion()); @@ -381,6 +421,66 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter } } + /** + * Handles HTTP redirection + * + * This method will throw an Exception if redirect to a non-HTTP(S) location + * is attempted, also if number of redirects performed already is equal to + * 'max_redirects' configuration parameter. + * + * @param HTTP_Request2 Original request + * @param HTTP_Request2_Response Response containing redirect + * @return HTTP_Request2_Response Response from a new location + * @throws HTTP_Request2_Exception + */ + protected function handleRedirect(HTTP_Request2 $request, + HTTP_Request2_Response $response) + { + if (is_null($this->redirectCountdown)) { + $this->redirectCountdown = $request->getConfig('max_redirects'); + } + if (0 == $this->redirectCountdown) { + $this->redirectCountdown = null; + // Copying cURL behaviour + throw new HTTP_Request2_MessageException ( + 'Maximum (' . $request->getConfig('max_redirects') . ') redirects followed', + HTTP_Request2_Exception::TOO_MANY_REDIRECTS + ); + } + $redirectUrl = new Net_URL2( + $response->getHeader('location'), + array(Net_URL2::OPTION_USE_BRACKETS => $request->getConfig('use_brackets')) + ); + // refuse non-HTTP redirect + if ($redirectUrl->isAbsolute() + && !in_array($redirectUrl->getScheme(), array('http', 'https')) + ) { + $this->redirectCountdown = null; + throw new HTTP_Request2_MessageException( + 'Refusing to redirect to a non-HTTP URL ' . $redirectUrl->__toString(), + HTTP_Request2_Exception::NON_HTTP_REDIRECT + ); + } + // Theoretically URL should be absolute (see http://tools.ietf.org/html/rfc2616#section-14.30), + // but in practice it is often not + if (!$redirectUrl->isAbsolute()) { + $redirectUrl = $request->getUrl()->resolve($redirectUrl); + } + $redirect = clone $request; + $redirect->setUrl($redirectUrl); + if (303 == $response->getStatus() || (!$request->getConfig('strict_redirects') + && in_array($response->getStatus(), array(301, 302))) + ) { + $redirect->setMethod(HTTP_Request2::METHOD_GET); + $redirect->setBody(''); + } + + if (0 < $this->redirectCountdown) { + $this->redirectCountdown--; + } + return $this->sendRequest($redirect); + } + /** * Checks whether another request should be performed with server digest auth * @@ -389,7 +489,7 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter * - auth credentials should be set in the request object * - response should contain WWW-Authenticate header with digest challenge * - there is either no challenge stored for this URL or new challenge - * contains stale=true parameter (in other case we probably just failed + * contains stale=true parameter (in other case we probably just failed * due to invalid username / password) * * The method stores challenge values in $challenges static property @@ -453,7 +553,7 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter * - proxy auth credentials should be set in the request object * - response should contain Proxy-Authenticate header with digest challenge * - there is either no challenge stored for this proxy or new challenge - * contains stale=true parameter (in other case we probably just failed + * contains stale=true parameter (in other case we probably just failed * due to invalid username / password) * * The method stores challenge values in $challenges static property @@ -489,7 +589,7 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter * Extracts digest method challenge from (WWW|Proxy)-Authenticate header value * * There is a problem with implementation of RFC 2617: several of the parameters - * here are defined as quoted-string and thus may contain backslash escaped + * are defined as quoted-string there and thus may contain backslash escaped * double quotes (RFC 2616, section 2.2). However, RFC 2617 defines unq(X) as * just value of quoted-string X without surrounding quotes, it doesn't speak * about removing backslash escaping. @@ -501,17 +601,17 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter * - Squid allows (manually escaped) quotes there, but it is impossible to * authorize with either escaped or unescaped quotes used in digest, * probably it can't parse the response (?) - * - Both IE and Firefox display realm value with backslashes in + * - Both IE and Firefox display realm value with backslashes in * the password popup and apparently use the same value for digest * * HTTP_Request2 follows IE and Firefox (and hopefully RFC 2617) in - * quoted-string handling, unfortunately that means failure to authorize + * quoted-string handling, unfortunately that means failure to authorize * sometimes * * @param string value of WWW-Authenticate or Proxy-Authenticate header * @return mixed associative array with challenge parameters, false if * no challenge is present in header value - * @throws HTTP_Request2_Exception in case of unsupported challenge parameters + * @throws HTTP_Request2_NotImplementedException in case of unsupported challenge parameters */ protected function parseDigestChallenge($headerValue) { @@ -537,23 +637,23 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter } } // we only support qop=auth - if (!empty($paramsAry['qop']) && + if (!empty($paramsAry['qop']) && !in_array('auth', array_map('trim', explode(',', $paramsAry['qop']))) ) { - throw new HTTP_Request2_Exception( + throw new HTTP_Request2_NotImplementedException( "Only 'auth' qop is currently supported in digest authentication, " . "server requested '{$paramsAry['qop']}'" ); } // we only support algorithm=MD5 if (!empty($paramsAry['algorithm']) && 'MD5' != $paramsAry['algorithm']) { - throw new HTTP_Request2_Exception( + throw new HTTP_Request2_NotImplementedException( "Only 'MD5' algorithm is currently supported in digest authentication, " . "server requested '{$paramsAry['algorithm']}'" ); } - return $paramsAry; + return $paramsAry; } /** @@ -562,7 +662,7 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter * @param array challenge to update * @param string value of [Proxy-]Authentication-Info header * @todo validate server rspauth response - */ + */ protected function updateChallenge(&$challenge, $headerValue) { $authParam = '!(' . self::REGEXP_TOKEN . ')\\s*=\\s*(' . @@ -593,10 +693,10 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter * @param array digest challenge parameters * @return string value of [Proxy-]Authorization request header * @link http://tools.ietf.org/html/rfc2617#section-3.2.2 - */ + */ protected function createDigestResponse($user, $password, $url, &$challenge) { - if (false !== ($q = strpos($url, '?')) && + if (false !== ($q = strpos($url, '?')) && $this->request->getConfig('digest_compat_ie') ) { $url = substr($url, 0, $q); @@ -621,7 +721,7 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter 'nonce="' . $challenge['nonce'] . '", ' . 'uri="' . $url . '", ' . 'response="' . $digest . '"' . - (!empty($challenge['opaque'])? + (!empty($challenge['opaque'])? ', opaque="' . $challenge['opaque'] . '"': '') . (!empty($challenge['qop'])? @@ -635,7 +735,7 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter * @param array request headers * @param string request host (needed for digest authentication) * @param string request URL (needed for digest authentication) - * @throws HTTP_Request2_Exception + * @throws HTTP_Request2_NotImplementedException */ protected function addAuthorizationHeader(&$headers, $requestHost, $requestUrl) { @@ -644,7 +744,7 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter } switch ($auth['scheme']) { case HTTP_Request2::AUTH_BASIC: - $headers['authorization'] = + $headers['authorization'] = 'Basic ' . base64_encode($auth['user'] . ':' . $auth['password']); break; @@ -657,7 +757,7 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter foreach (array_keys(self::$challenges) as $key) { if ($key == substr($fullUrl, 0, strlen($key))) { $headers['authorization'] = $this->createDigestResponse( - $auth['user'], $auth['password'], + $auth['user'], $auth['password'], $requestUrl, self::$challenges[$key] ); $this->serverChallenge =& self::$challenges[$key]; @@ -667,7 +767,7 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter break; default: - throw new HTTP_Request2_Exception( + throw new HTTP_Request2_NotImplementedException( "Unknown HTTP authentication scheme '{$auth['scheme']}'" ); } @@ -678,7 +778,7 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter * * @param array request headers * @param string request URL (needed for digest authentication) - * @throws HTTP_Request2_Exception + * @throws HTTP_Request2_NotImplementedException */ protected function addProxyAuthorizationHeader(&$headers, $requestUrl) { @@ -711,7 +811,7 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter break; default: - throw new HTTP_Request2_Exception( + throw new HTTP_Request2_NotImplementedException( "Unknown HTTP authentication scheme '" . $this->request->getConfig('proxy_auth_scheme') . "'" ); @@ -762,6 +862,11 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter ) { $headers['accept-encoding'] = 'gzip, deflate'; } + if (($jar = $this->request->getCookieJar()) + && ($cookies = $jar->getMatching($this->request->getUrl(), true)) + ) { + $headers['cookie'] = (empty($headers['cookie'])? '': $headers['cookie'] . '; ') . $cookies; + } $this->addAuthorizationHeader($headers, $host, $requestUrl); $this->addProxyAuthorizationHeader($headers, $requestUrl); @@ -779,7 +884,7 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter /** * Sends the request body * - * @throws HTTP_Request2_Exception + * @throws HTTP_Request2_MessageException */ protected function writeBody() { @@ -800,12 +905,13 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter $str = $this->requestBody->read($bufferSize); } if (false === @fwrite($this->socket, $str, strlen($str))) { - throw new HTTP_Request2_Exception('Error writing request'); + throw new HTTP_Request2_MessageException('Error writing request'); } // Provide the length of written string to the observer, request #7630 $this->request->setLastEvent('sentBodyPart', strlen($str)); - $position += strlen($str); + $position += strlen($str); } + $this->request->setLastEvent('sentBody', $this->contentLength); } /** @@ -819,7 +925,9 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter $bufferSize = $this->request->getConfig('buffer_size'); do { - $response = new HTTP_Request2_Response($this->readLine($bufferSize), true); + $response = new HTTP_Request2_Response( + $this->readLine($bufferSize), true, $this->request->getUrl() + ); do { $headerLine = $this->readLine($bufferSize); $response->parseHeaderLine($headerLine); @@ -880,28 +988,30 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter } /** - * Reads until either the end of the socket or a newline, whichever comes first + * Reads until either the end of the socket or a newline, whichever comes first * - * Strips the trailing newline from the returned data, handles global - * request timeout. Method idea borrowed from Net_Socket PEAR package. + * Strips the trailing newline from the returned data, handles global + * request timeout. Method idea borrowed from Net_Socket PEAR package. * * @param int buffer size to use for reading * @return Available data up to the newline (not including newline) - * @throws HTTP_Request2_Exception In case of timeout + * @throws HTTP_Request2_MessageException In case of timeout */ protected function readLine($bufferSize) { $line = ''; while (!feof($this->socket)) { - if ($this->timeout) { - stream_set_timeout($this->socket, max($this->timeout - time(), 1)); + if ($this->deadline) { + stream_set_timeout($this->socket, max($this->deadline - time(), 1)); } $line .= @fgets($this->socket, $bufferSize); $info = stream_get_meta_data($this->socket); - if ($info['timed_out'] || $this->timeout && time() > $this->timeout) { - throw new HTTP_Request2_Exception( - 'Request timed out after ' . - $this->request->getConfig('timeout') . ' second(s)' + if ($info['timed_out'] || $this->deadline && time() > $this->deadline) { + $reason = $this->deadline + ? 'after ' . $this->request->getConfig('timeout') . ' second(s)' + : 'due to default_socket_timeout php.ini setting'; + throw new HTTP_Request2_MessageException( + "Request timed out {$reason}", HTTP_Request2_Exception::TIMEOUT ); } if (substr($line, -1) == "\n") { @@ -916,19 +1026,21 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter * * @param int Reads up to this number of bytes * @return Data read from socket - * @throws HTTP_Request2_Exception In case of timeout + * @throws HTTP_Request2_MessageException In case of timeout */ protected function fread($length) { - if ($this->timeout) { - stream_set_timeout($this->socket, max($this->timeout - time(), 1)); + if ($this->deadline) { + stream_set_timeout($this->socket, max($this->deadline - time(), 1)); } $data = fread($this->socket, $length); $info = stream_get_meta_data($this->socket); - if ($info['timed_out'] || $this->timeout && time() > $this->timeout) { - throw new HTTP_Request2_Exception( - 'Request timed out after ' . - $this->request->getConfig('timeout') . ' second(s)' + if ($info['timed_out'] || $this->deadline && time() > $this->deadline) { + $reason = $this->deadline + ? 'after ' . $this->request->getConfig('timeout') . ' second(s)' + : 'due to default_socket_timeout php.ini setting'; + throw new HTTP_Request2_MessageException( + "Request timed out {$reason}", HTTP_Request2_Exception::TIMEOUT ); } return $data; @@ -939,7 +1051,7 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter * * @param int buffer size to use for reading * @return string - * @throws HTTP_Request2_Exception + * @throws HTTP_Request2_MessageException */ protected function readChunked($bufferSize) { @@ -947,8 +1059,9 @@ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter if (0 == $this->chunkLength) { $line = $this->readLine($bufferSize); if (!preg_match('/^([0-9a-f]+)/i', $line, $matches)) { - throw new HTTP_Request2_Exception( - "Cannot decode chunked response, invalid chunk length '{$line}'" + throw new HTTP_Request2_MessageException( + "Cannot decode chunked response, invalid chunk length '{$line}'", + HTTP_Request2_Exception::DECODE_ERROR ); } else { $this->chunkLength = hexdec($matches[1]); diff --git a/extlib/HTTP/Request2/CookieJar.php b/extlib/HTTP/Request2/CookieJar.php new file mode 100644 index 0000000000..af7534f18d --- /dev/null +++ b/extlib/HTTP/Request2/CookieJar.php @@ -0,0 +1,499 @@ + + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * The names of the authors may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @category HTTP + * @package HTTP_Request2 + * @author Alexey Borzov + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @version SVN: $Id: CookieJar.php 308629 2011-02-24 17:34:24Z avb $ + * @link http://pear.php.net/package/HTTP_Request2 + */ + +/** Class representing a HTTP request message */ +require_once 'HTTP/Request2.php'; + +/** + * Stores cookies and passes them between HTTP requests + * + * @category HTTP + * @package HTTP_Request2 + * @author Alexey Borzov + * @version Release: @package_version@ + */ +class HTTP_Request2_CookieJar implements Serializable +{ + /** + * Array of stored cookies + * + * The array is indexed by domain, path and cookie name + * .example.com + * / + * some_cookie => cookie data + * /subdir + * other_cookie => cookie data + * .example.org + * ... + * + * @var array + */ + protected $cookies = array(); + + /** + * Whether session cookies should be serialized when serializing the jar + * @var bool + */ + protected $serializeSession = false; + + /** + * Whether Public Suffix List should be used for domain matching + * @var bool + */ + protected $useList = true; + + /** + * Array with Public Suffix List data + * @var array + * @link http://publicsuffix.org/ + */ + protected static $psl = array(); + + /** + * Class constructor, sets various options + * + * @param bool Controls serializing session cookies, see {@link serializeSessionCookies()} + * @param bool Controls using Public Suffix List, see {@link usePublicSuffixList()} + */ + public function __construct($serializeSessionCookies = false, $usePublicSuffixList = true) + { + $this->serializeSessionCookies($serializeSessionCookies); + $this->usePublicSuffixList($usePublicSuffixList); + } + + /** + * Returns current time formatted in ISO-8601 at UTC timezone + * + * @return string + */ + protected function now() + { + $dt = new DateTime(); + $dt->setTimezone(new DateTimeZone('UTC')); + return $dt->format(DateTime::ISO8601); + } + + /** + * Checks cookie array for correctness, possibly updating its 'domain', 'path' and 'expires' fields + * + * The checks are as follows: + * - cookie array should contain 'name' and 'value' fields; + * - name and value should not contain disallowed symbols; + * - 'expires' should be either empty parseable by DateTime; + * - 'domain' and 'path' should be either not empty or an URL where + * cookie was set should be provided. + * - if $setter is provided, then document at that URL should be allowed + * to set a cookie for that 'domain'. If $setter is not provided, + * then no domain checks will be made. + * + * 'expires' field will be converted to ISO8601 format from COOKIE format, + * 'domain' and 'path' will be set from setter URL if empty. + * + * @param array cookie data, as returned by {@link HTTP_Request2_Response::getCookies()} + * @param Net_URL2 URL of the document that sent Set-Cookie header + * @return array Updated cookie array + * @throws HTTP_Request2_LogicException + * @throws HTTP_Request2_MessageException + */ + protected function checkAndUpdateFields(array $cookie, Net_URL2 $setter = null) + { + if ($missing = array_diff(array('name', 'value'), array_keys($cookie))) { + throw new HTTP_Request2_LogicException( + "Cookie array should contain 'name' and 'value' fields", + HTTP_Request2_Exception::MISSING_VALUE + ); + } + if (preg_match(HTTP_Request2::REGEXP_INVALID_COOKIE, $cookie['name'])) { + throw new HTTP_Request2_LogicException( + "Invalid cookie name: '{$cookie['name']}'", + HTTP_Request2_Exception::INVALID_ARGUMENT + ); + } + if (preg_match(HTTP_Request2::REGEXP_INVALID_COOKIE, $cookie['value'])) { + throw new HTTP_Request2_LogicException( + "Invalid cookie value: '{$cookie['value']}'", + HTTP_Request2_Exception::INVALID_ARGUMENT + ); + } + $cookie += array('domain' => '', 'path' => '', 'expires' => null, 'secure' => false); + + // Need ISO-8601 date @ UTC timezone + if (!empty($cookie['expires']) + && !preg_match('/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\+0000$/', $cookie['expires']) + ) { + try { + $dt = new DateTime($cookie['expires']); + $dt->setTimezone(new DateTimeZone('UTC')); + $cookie['expires'] = $dt->format(DateTime::ISO8601); + } catch (Exception $e) { + throw new HTTP_Request2_LogicException($e->getMessage()); + } + } + + if (empty($cookie['domain']) || empty($cookie['path'])) { + if (!$setter) { + throw new HTTP_Request2_LogicException( + 'Cookie misses domain and/or path component, cookie setter URL needed', + HTTP_Request2_Exception::MISSING_VALUE + ); + } + if (empty($cookie['domain'])) { + if ($host = $setter->getHost()) { + $cookie['domain'] = $host; + } else { + throw new HTTP_Request2_LogicException( + 'Setter URL does not contain host part, can\'t set cookie domain', + HTTP_Request2_Exception::MISSING_VALUE + ); + } + } + if (empty($cookie['path'])) { + $path = $setter->getPath(); + $cookie['path'] = empty($path)? '/': substr($path, 0, strrpos($path, '/') + 1); + } + } + + if ($setter && !$this->domainMatch($setter->getHost(), $cookie['domain'])) { + throw new HTTP_Request2_MessageException( + "Domain " . $setter->getHost() . " cannot set cookies for " + . $cookie['domain'] + ); + } + + return $cookie; + } + + /** + * Stores a cookie in the jar + * + * @param array cookie data, as returned by {@link HTTP_Request2_Response::getCookies()} + * @param Net_URL2 URL of the document that sent Set-Cookie header + * @throws HTTP_Request2_Exception + */ + public function store(array $cookie, Net_URL2 $setter = null) + { + $cookie = $this->checkAndUpdateFields($cookie, $setter); + + if (strlen($cookie['value']) + && (is_null($cookie['expires']) || $cookie['expires'] > $this->now()) + ) { + if (!isset($this->cookies[$cookie['domain']])) { + $this->cookies[$cookie['domain']] = array(); + } + if (!isset($this->cookies[$cookie['domain']][$cookie['path']])) { + $this->cookies[$cookie['domain']][$cookie['path']] = array(); + } + $this->cookies[$cookie['domain']][$cookie['path']][$cookie['name']] = $cookie; + + } elseif (isset($this->cookies[$cookie['domain']][$cookie['path']][$cookie['name']])) { + unset($this->cookies[$cookie['domain']][$cookie['path']][$cookie['name']]); + } + } + + /** + * Adds cookies set in HTTP response to the jar + * + * @param HTTP_Request2_Response response + * @param Net_URL2 original request URL, needed for setting + * default domain/path + */ + public function addCookiesFromResponse(HTTP_Request2_Response $response, Net_URL2 $setter) + { + foreach ($response->getCookies() as $cookie) { + $this->store($cookie, $setter); + } + } + + /** + * Returns all cookies matching a given request URL + * + * The following checks are made: + * - cookie domain should match request host + * - cookie path should be a prefix for request path + * - 'secure' cookies will only be sent for HTTPS requests + * + * @param Net_URL2 + * @param bool Whether to return cookies as string for "Cookie: " header + * @return array + */ + public function getMatching(Net_URL2 $url, $asString = false) + { + $host = $url->getHost(); + $path = $url->getPath(); + $secure = 0 == strcasecmp($url->getScheme(), 'https'); + + $matched = $ret = array(); + foreach (array_keys($this->cookies) as $domain) { + if ($this->domainMatch($host, $domain)) { + foreach (array_keys($this->cookies[$domain]) as $cPath) { + if (0 === strpos($path, $cPath)) { + foreach ($this->cookies[$domain][$cPath] as $name => $cookie) { + if (!$cookie['secure'] || $secure) { + $matched[$name][strlen($cookie['path'])] = $cookie; + } + } + } + } + } + } + foreach ($matched as $cookies) { + krsort($cookies); + $ret = array_merge($ret, $cookies); + } + if (!$asString) { + return $ret; + } else { + $str = ''; + foreach ($ret as $c) { + $str .= (empty($str)? '': '; ') . $c['name'] . '=' . $c['value']; + } + return $str; + } + } + + /** + * Returns all cookies stored in a jar + * + * @return array + */ + public function getAll() + { + $cookies = array(); + foreach (array_keys($this->cookies) as $domain) { + foreach (array_keys($this->cookies[$domain]) as $path) { + foreach ($this->cookies[$domain][$path] as $name => $cookie) { + $cookies[] = $cookie; + } + } + } + return $cookies; + } + + /** + * Sets whether session cookies should be serialized when serializing the jar + * + * @param boolean + */ + public function serializeSessionCookies($serialize) + { + $this->serializeSession = (bool)$serialize; + } + + /** + * Sets whether Public Suffix List should be used for restricting cookie-setting + * + * Without PSL {@link domainMatch()} will only prevent setting cookies for + * top-level domains like '.com' or '.org'. However, it will not prevent + * setting a cookie for '.co.uk' even though only third-level registrations + * are possible in .uk domain. + * + * With the List it is possible to find the highest level at which a domain + * may be registered for a particular top-level domain and consequently + * prevent cookies set for '.co.uk' or '.msk.ru'. The same list is used by + * Firefox, Chrome and Opera browsers to restrict cookie setting. + * + * Note that PSL is licensed differently to HTTP_Request2 package (refer to + * the license information in public-suffix-list.php), so you can disable + * its use if this is an issue for you. + * + * @param boolean + * @link http://publicsuffix.org/learn/ + */ + public function usePublicSuffixList($useList) + { + $this->useList = (bool)$useList; + } + + /** + * Returns string representation of object + * + * @return string + * @see Serializable::serialize() + */ + public function serialize() + { + $cookies = $this->getAll(); + if (!$this->serializeSession) { + for ($i = count($cookies) - 1; $i >= 0; $i--) { + if (empty($cookies[$i]['expires'])) { + unset($cookies[$i]); + } + } + } + return serialize(array( + 'cookies' => $cookies, + 'serializeSession' => $this->serializeSession, + 'useList' => $this->useList + )); + } + + /** + * Constructs the object from serialized string + * + * @param string string representation + * @see Serializable::unserialize() + */ + public function unserialize($serialized) + { + $data = unserialize($serialized); + $now = $this->now(); + $this->serializeSessionCookies($data['serializeSession']); + $this->usePublicSuffixList($data['useList']); + foreach ($data['cookies'] as $cookie) { + if (!empty($cookie['expires']) && $cookie['expires'] <= $now) { + continue; + } + if (!isset($this->cookies[$cookie['domain']])) { + $this->cookies[$cookie['domain']] = array(); + } + if (!isset($this->cookies[$cookie['domain']][$cookie['path']])) { + $this->cookies[$cookie['domain']][$cookie['path']] = array(); + } + $this->cookies[$cookie['domain']][$cookie['path']][$cookie['name']] = $cookie; + } + } + + /** + * Checks whether a cookie domain matches a request host. + * + * The method is used by {@link store()} to check for whether a document + * at given URL can set a cookie with a given domain attribute and by + * {@link getMatching()} to find cookies matching the request URL. + * + * @param string request host + * @param string cookie domain + * @return bool match success + */ + public function domainMatch($requestHost, $cookieDomain) + { + if ($requestHost == $cookieDomain) { + return true; + } + // IP address, we require exact match + if (preg_match('/^(?:\d{1,3}\.){3}\d{1,3}$/', $requestHost)) { + return false; + } + if ('.' != $cookieDomain[0]) { + $cookieDomain = '.' . $cookieDomain; + } + // prevents setting cookies for '.com' and similar domains + if (!$this->useList && substr_count($cookieDomain, '.') < 2 + || $this->useList && !self::getRegisteredDomain($cookieDomain) + ) { + return false; + } + return substr('.' . $requestHost, -strlen($cookieDomain)) == $cookieDomain; + } + + /** + * Removes subdomains to get the registered domain (the first after top-level) + * + * The method will check Public Suffix List to find out where top-level + * domain ends and registered domain starts. It will remove domain parts + * to the left of registered one. + * + * @param string domain name + * @return string|bool registered domain, will return false if $domain is + * either invalid or a TLD itself + */ + public static function getRegisteredDomain($domain) + { + $domainParts = explode('.', ltrim($domain, '.')); + + // load the list if needed + if (empty(self::$psl)) { + $path = '@data_dir@' . DIRECTORY_SEPARATOR . 'HTTP_Request2'; + if (0 === strpos($path, '@' . 'data_dir@')) { + $path = realpath(dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' + . DIRECTORY_SEPARATOR . 'data'); + } + self::$psl = include_once $path . DIRECTORY_SEPARATOR . 'public-suffix-list.php'; + } + + if (!($result = self::checkDomainsList($domainParts, self::$psl))) { + // known TLD, invalid domain name + return false; + } + + // unknown TLD + if (!strpos($result, '.')) { + // fallback to checking that domain "has at least two dots" + if (2 > ($count = count($domainParts))) { + return false; + } + return $domainParts[$count - 2] . '.' . $domainParts[$count - 1]; + } + return $result; + } + + /** + * Recursive helper method for {@link getRegisteredDomain()} + * + * @param array remaining domain parts + * @param mixed node in {@link HTTP_Request2_CookieJar::$psl} to check + * @return string|null concatenated domain parts, null in case of error + */ + protected static function checkDomainsList(array $domainParts, $listNode) + { + $sub = array_pop($domainParts); + $result = null; + + if (!is_array($listNode) || is_null($sub) + || array_key_exists('!' . $sub, $listNode) + ) { + return $sub; + + } elseif (array_key_exists($sub, $listNode)) { + $result = self::checkDomainsList($domainParts, $listNode[$sub]); + + } elseif (array_key_exists('*', $listNode)) { + $result = self::checkDomainsList($domainParts, $listNode['*']); + + } else { + return $sub; + } + + return (strlen($result) > 0) ? ($result . '.' . $sub) : null; + } +} +?> \ No newline at end of file diff --git a/extlib/HTTP/Request2/Exception.php b/extlib/HTTP/Request2/Exception.php index bfef7d6c22..530c23b9ce 100644 --- a/extlib/HTTP/Request2/Exception.php +++ b/extlib/HTTP/Request2/Exception.php @@ -1,12 +1,12 @@ + * Copyright (c) 2008-2011, Alexey Borzov * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -37,7 +37,7 @@ * @package HTTP_Request2 * @author Alexey Borzov * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Exception.php 273003 2009-01-07 19:28:22Z avb $ + * @version SVN: $Id: Exception.php 308629 2011-02-24 17:34:24Z avb $ * @link http://pear.php.net/package/HTTP_Request2 */ @@ -47,16 +47,114 @@ require_once 'PEAR/Exception.php'; /** - * Exception class for HTTP_Request2 package - * - * Such a class is required by the Exception RFC: - * http://pear.php.net/pepr/pepr-proposal-show.php?id=132 + * Base exception class for HTTP_Request2 package * * @category HTTP * @package HTTP_Request2 - * @version Release: 0.4.1 + * @version Release: 2.0.0RC1 + * @link http://pear.php.net/pepr/pepr-proposal-show.php?id=132 */ class HTTP_Request2_Exception extends PEAR_Exception { + /** An invalid argument was passed to a method */ + const INVALID_ARGUMENT = 1; + /** Some required value was not available */ + const MISSING_VALUE = 2; + /** Request cannot be processed due to errors in PHP configuration */ + const MISCONFIGURATION = 3; + /** Error reading the local file */ + const READ_ERROR = 4; + + /** Server returned a response that does not conform to HTTP protocol */ + const MALFORMED_RESPONSE = 10; + /** Failure decoding Content-Encoding or Transfer-Encoding of response */ + const DECODE_ERROR = 20; + /** Operation timed out */ + const TIMEOUT = 30; + /** Number of redirects exceeded 'max_redirects' configuration parameter */ + const TOO_MANY_REDIRECTS = 40; + /** Redirect to a protocol other than http(s):// */ + const NON_HTTP_REDIRECT = 50; + + /** + * Native error code + * @var int + */ + private $_nativeCode; + + /** + * Constructor, can set package error code and native error code + * + * @param string exception message + * @param int package error code, one of class constants + * @param int error code from underlying PHP extension + */ + public function __construct($message = null, $code = null, $nativeCode = null) + { + parent::__construct($message, $code); + $this->_nativeCode = $nativeCode; + } + + /** + * Returns error code produced by underlying PHP extension + * + * For Socket Adapter this may contain error number returned by + * stream_socket_client(), for Curl Adapter this will contain error number + * returned by curl_errno() + * + * @return integer + */ + public function getNativeCode() + { + return $this->_nativeCode; + } } + +/** + * Exception thrown in case of missing features + * + * @category HTTP + * @package HTTP_Request2 + * @version Release: 2.0.0RC1 + */ +class HTTP_Request2_NotImplementedException extends HTTP_Request2_Exception {} + +/** + * Exception that represents error in the program logic + * + * This exception usually implies a programmer's error, like passing invalid + * data to methods or trying to use PHP extensions that weren't installed or + * enabled. Usually exceptions of this kind will be thrown before request even + * starts. + * + * The exception will usually contain a package error code. + * + * @category HTTP + * @package HTTP_Request2 + * @version Release: 2.0.0RC1 + */ +class HTTP_Request2_LogicException extends HTTP_Request2_Exception {} + +/** + * Exception thrown when connection to a web or proxy server fails + * + * The exception will not contain a package error code, but will contain + * native error code, as returned by stream_socket_client() or curl_errno(). + * + * @category HTTP + * @package HTTP_Request2 + * @version Release: 2.0.0RC1 + */ +class HTTP_Request2_ConnectionException extends HTTP_Request2_Exception {} + +/** + * Exception thrown when sending or receiving HTTP message fails + * + * The exception may contain both package error code and native error code. + * + * @category HTTP + * @package HTTP_Request2 + * @version Release: 2.0.0RC1 + */ +class HTTP_Request2_MessageException extends HTTP_Request2_Exception {} ?> \ No newline at end of file diff --git a/extlib/HTTP/Request2/MultipartBody.php b/extlib/HTTP/Request2/MultipartBody.php index d8afd8344c..a7bd948baf 100644 --- a/extlib/HTTP/Request2/MultipartBody.php +++ b/extlib/HTTP/Request2/MultipartBody.php @@ -6,7 +6,7 @@ * * LICENSE: * - * Copyright (c) 2008, 2009, Alexey Borzov + * Copyright (c) 2008-2011, Alexey Borzov * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -37,7 +37,7 @@ * @package HTTP_Request2 * @author Alexey Borzov * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: MultipartBody.php 287306 2009-08-14 15:22:52Z avb $ + * @version SVN: $Id: MultipartBody.php 308322 2011-02-14 13:58:03Z avb $ * @link http://pear.php.net/package/HTTP_Request2 */ @@ -50,7 +50,7 @@ * @category HTTP * @package HTTP_Request2 * @author Alexey Borzov - * @version Release: 0.4.1 + * @version Release: 2.0.0RC1 * @link http://tools.ietf.org/html/rfc1867 */ class HTTP_Request2_MultipartBody @@ -172,7 +172,7 @@ class HTTP_Request2_MultipartBody while ($length > 0 && $this->_pos[0] <= $paramCount + $uploadCount) { $oldLength = $length; if ($this->_pos[0] < $paramCount) { - $param = sprintf($this->_headerParam, $boundary, + $param = sprintf($this->_headerParam, $boundary, $this->_params[$this->_pos[0]][0]) . $this->_params[$this->_pos[0]][1] . "\r\n"; $ret .= substr($param, $this->_pos[1], $length); diff --git a/extlib/HTTP/Request2/Observer/Log.php b/extlib/HTTP/Request2/Observer/Log.php index b1a0552780..7865906f65 100644 --- a/extlib/HTTP/Request2/Observer/Log.php +++ b/extlib/HTTP/Request2/Observer/Log.php @@ -6,7 +6,7 @@ * * LICENSE: * - * Copyright (c) 2008, 2009, Alexey Borzov + * Copyright (c) 2008-2011, Alexey Borzov * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -38,19 +38,19 @@ * @author David Jean Louis * @author Alexey Borzov * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Log.php 272593 2009-01-02 16:27:14Z avb $ + * @version SVN: $Id: Log.php 308680 2011-02-25 17:40:17Z avb $ * @link http://pear.php.net/package/HTTP_Request2 */ /** * Exception class for HTTP_Request2 package - */ + */ require_once 'HTTP/Request2/Exception.php'; /** * A debug observer useful for debugging / testing. * - * This observer logs to a log target data corresponding to the various request + * This observer logs to a log target data corresponding to the various request * and response events, it logs by default to php://output but can be configured * to log to a file or via the PEAR Log package. * @@ -87,7 +87,7 @@ require_once 'HTTP/Request2/Exception.php'; * @author David Jean Louis * @author Alexey Borzov * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 0.4.1 + * @version Release: 2.0.0RC1 * @link http://pear.php.net/package/HTTP_Request2 */ class HTTP_Request2_Observer_Log implements SplObserver @@ -109,7 +109,7 @@ class HTTP_Request2_Observer_Log implements SplObserver public $events = array( 'connect', 'sentHeaders', - 'sentBodyPart', + 'sentBody', 'receivedHeaders', 'receivedBody', 'disconnect', @@ -134,7 +134,7 @@ class HTTP_Request2_Observer_Log implements SplObserver } if (is_resource($target) || $target instanceof Log) { $this->target = $target; - } elseif (false === ($this->target = @fopen($target, 'w'))) { + } elseif (false === ($this->target = @fopen($target, 'ab'))) { throw new HTTP_Request2_Exception("Unable to open '{$target}'"); } } @@ -143,7 +143,7 @@ class HTTP_Request2_Observer_Log implements SplObserver // update() {{{ /** - * Called when the request notify us of an event. + * Called when the request notifies us of an event. * * @param HTTP_Request2 $subject The HTTP_Request2 instance * @@ -167,8 +167,8 @@ class HTTP_Request2_Observer_Log implements SplObserver $this->log('> ' . $header); } break; - case 'sentBodyPart': - $this->log('> ' . $event['data']); + case 'sentBody': + $this->log('> ' . $event['data'] . ' byte(s) sent'); break; case 'receivedHeaders': $this->log(sprintf('< HTTP/%s %s %s', @@ -189,12 +189,12 @@ class HTTP_Request2_Observer_Log implements SplObserver break; } } - + // }}} // log() {{{ /** - * Log the given message to the configured target. + * Logs the given message to the configured target. * * @param string $message Message to display * diff --git a/extlib/HTTP/Request2/Response.php b/extlib/HTTP/Request2/Response.php index c7c1021fbb..73e9a5dc82 100644 --- a/extlib/HTTP/Request2/Response.php +++ b/extlib/HTTP/Request2/Response.php @@ -6,7 +6,7 @@ * * LICENSE: * - * Copyright (c) 2008, 2009, Alexey Borzov + * Copyright (c) 2008-2011, Alexey Borzov * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -37,13 +37,13 @@ * @package HTTP_Request2 * @author Alexey Borzov * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Response.php 287948 2009-09-01 17:12:18Z avb $ + * @version SVN: $Id: Response.php 309921 2011-04-03 16:43:02Z avb $ * @link http://pear.php.net/package/HTTP_Request2 */ /** * Exception class for HTTP_Request2 package - */ + */ require_once 'HTTP/Request2/Exception.php'; /** @@ -58,11 +58,11 @@ require_once 'HTTP/Request2/Exception.php'; * $headerLine = read_header_line(); * $response->parseHeaderLine($headerLine); * } while ($headerLine != ''); - * + * * while ($chunk = read_body()) { * $response->appendBody($chunk); * } - * + * * var_dump($response->getHeader(), $response->getCookies(), $response->getBody()); * * @@ -70,7 +70,7 @@ require_once 'HTTP/Request2/Exception.php'; * @category HTTP * @package HTTP_Request2 * @author Alexey Borzov - * @version Release: 0.4.1 + * @version Release: 2.0.0RC1 * @link http://tools.ietf.org/html/rfc2616#section-6 */ class HTTP_Request2_Response @@ -95,6 +95,12 @@ class HTTP_Request2_Response */ protected $reasonPhrase; + /** + * Effective URL (may be different from original request URL in case of redirects) + * @var string + */ + protected $effectiveUrl; + /** * Associative array of response headers * @var array @@ -164,7 +170,7 @@ class HTTP_Request2_Response 305 => 'Use Proxy', 307 => 'Temporary Redirect', - // 4xx: Client Error - The request contains bad syntax or cannot be + // 4xx: Client Error - The request contains bad syntax or cannot be // fulfilled 400 => 'Bad Request', 401 => 'Unauthorized', @@ -200,14 +206,18 @@ class HTTP_Request2_Response /** * Constructor, parses the response status line * - * @param string Response status line (e.g. "HTTP/1.1 200 OK") - * @param bool Whether body is still encoded by Content-Encoding - * @throws HTTP_Request2_Exception if status line is invalid according to spec + * @param string Response status line (e.g. "HTTP/1.1 200 OK") + * @param bool Whether body is still encoded by Content-Encoding + * @param string Effective URL of the response + * @throws HTTP_Request2_MessageException if status line is invalid according to spec */ - public function __construct($statusLine, $bodyEncoded = true) + public function __construct($statusLine, $bodyEncoded = true, $effectiveUrl = null) { if (!preg_match('!^HTTP/(\d\.\d) (\d{3})(?: (.+))?!', $statusLine, $m)) { - throw new HTTP_Request2_Exception("Malformed response: {$statusLine}"); + throw new HTTP_Request2_MessageException( + "Malformed response: {$statusLine}", + HTTP_Request2_Exception::MALFORMED_RESPONSE + ); } $this->version = $m[1]; $this->code = intval($m[2]); @@ -216,13 +226,14 @@ class HTTP_Request2_Response } elseif (!empty(self::$phrases[$this->code])) { $this->reasonPhrase = self::$phrases[$this->code]; } - $this->bodyEncoded = (bool)$bodyEncoded; + $this->bodyEncoded = (bool)$bodyEncoded; + $this->effectiveUrl = (string)$effectiveUrl; } /** * Parses the line from HTTP response filling $headers array * - * The method should be called after reading the line from socket or receiving + * The method should be called after reading the line from socket or receiving * it into cURL callback. Passing an empty string here indicates the end of * response headers and triggers additional processing, so be sure to pass an * empty string in the end. @@ -264,7 +275,7 @@ class HTTP_Request2_Response } $this->lastHeader = $name; - // string + // continuation of a previous header } elseif (preg_match('!^\s+(.+)$!', $headerLine, $m) && $this->lastHeader) { if (!is_array($this->headers[$this->lastHeader])) { $this->headers[$this->lastHeader] .= ' ' . trim($m[1]); @@ -273,13 +284,13 @@ class HTTP_Request2_Response $this->headers[$this->lastHeader][$key] .= ' ' . trim($m[1]); } } - } + } /** * Parses a Set-Cookie header to fill $cookies array * * @param string value of Set-Cookie header - * @link http://cgi.netscape.com/newsref/std/cookie_spec.html + * @link http://web.archive.org/web/20080331104521/http://cgi.netscape.com/newsref/std/cookie_spec.html */ protected function parseCookie($cookieString) { @@ -334,9 +345,22 @@ class HTTP_Request2_Response $this->body .= $bodyChunk; } + /** + * Returns the effective URL of the response + * + * This may be different from the request URL if redirects were followed. + * + * @return string + * @link http://pear.php.net/bugs/bug.php?id=18412 + */ + public function getEffectiveUrl() + { + return $this->effectiveUrl; + } + /** * Returns the status code - * @return integer + * @return integer */ public function getStatus() { @@ -352,6 +376,16 @@ class HTTP_Request2_Response return $this->reasonPhrase; } + /** + * Whether response is a redirect that can be automatically handled by HTTP_Request2 + * @return bool + */ + public function isRedirect() + { + return in_array($this->code, array(300, 301, 302, 303, 307)) + && isset($this->headers['location']); + } + /** * Returns either the named header or all response headers * @@ -388,7 +422,7 @@ class HTTP_Request2_Response */ public function getBody() { - if (!$this->bodyEncoded || + if (0 == strlen($this->body) || !$this->bodyEncoded || !in_array(strtolower($this->getHeader('content-encoding')), array('gzip', 'deflate')) ) { return $this->body; @@ -424,7 +458,7 @@ class HTTP_Request2_Response * Get the HTTP version of the response * * @return string - */ + */ public function getVersion() { return $this->version; @@ -439,7 +473,8 @@ class HTTP_Request2_Response * * @param string gzip-encoded data * @return string decoded data - * @throws HTTP_Request2_Exception + * @throws HTTP_Request2_LogicException + * @throws HTTP_Request2_MessageException * @link http://tools.ietf.org/html/rfc1952 */ public static function decodeGzip($data) @@ -450,15 +485,24 @@ class HTTP_Request2_Response return $data; } if (!function_exists('gzinflate')) { - throw new HTTP_Request2_Exception('Unable to decode body: gzip extension not available'); + throw new HTTP_Request2_LogicException( + 'Unable to decode body: gzip extension not available', + HTTP_Request2_Exception::MISCONFIGURATION + ); } $method = ord(substr($data, 2, 1)); if (8 != $method) { - throw new HTTP_Request2_Exception('Error parsing gzip header: unknown compression method'); + throw new HTTP_Request2_MessageException( + 'Error parsing gzip header: unknown compression method', + HTTP_Request2_Exception::DECODE_ERROR + ); } $flags = ord(substr($data, 3, 1)); if ($flags & 224) { - throw new HTTP_Request2_Exception('Error parsing gzip header: reserved bits are set'); + throw new HTTP_Request2_MessageException( + 'Error parsing gzip header: reserved bits are set', + HTTP_Request2_Exception::DECODE_ERROR + ); } // header is 10 bytes minimum. may be longer, though. @@ -466,45 +510,69 @@ class HTTP_Request2_Response // extra fields, need to skip 'em if ($flags & 4) { if ($length - $headerLength - 2 < 8) { - throw new HTTP_Request2_Exception('Error parsing gzip header: data too short'); + throw new HTTP_Request2_MessageException( + 'Error parsing gzip header: data too short', + HTTP_Request2_Exception::DECODE_ERROR + ); } $extraLength = unpack('v', substr($data, 10, 2)); if ($length - $headerLength - 2 - $extraLength[1] < 8) { - throw new HTTP_Request2_Exception('Error parsing gzip header: data too short'); + throw new HTTP_Request2_MessageException( + 'Error parsing gzip header: data too short', + HTTP_Request2_Exception::DECODE_ERROR + ); } $headerLength += $extraLength[1] + 2; } // file name, need to skip that if ($flags & 8) { if ($length - $headerLength - 1 < 8) { - throw new HTTP_Request2_Exception('Error parsing gzip header: data too short'); + throw new HTTP_Request2_MessageException( + 'Error parsing gzip header: data too short', + HTTP_Request2_Exception::DECODE_ERROR + ); } $filenameLength = strpos(substr($data, $headerLength), chr(0)); if (false === $filenameLength || $length - $headerLength - $filenameLength - 1 < 8) { - throw new HTTP_Request2_Exception('Error parsing gzip header: data too short'); + throw new HTTP_Request2_MessageException( + 'Error parsing gzip header: data too short', + HTTP_Request2_Exception::DECODE_ERROR + ); } $headerLength += $filenameLength + 1; } // comment, need to skip that also if ($flags & 16) { if ($length - $headerLength - 1 < 8) { - throw new HTTP_Request2_Exception('Error parsing gzip header: data too short'); + throw new HTTP_Request2_MessageException( + 'Error parsing gzip header: data too short', + HTTP_Request2_Exception::DECODE_ERROR + ); } $commentLength = strpos(substr($data, $headerLength), chr(0)); if (false === $commentLength || $length - $headerLength - $commentLength - 1 < 8) { - throw new HTTP_Request2_Exception('Error parsing gzip header: data too short'); + throw new HTTP_Request2_MessageException( + 'Error parsing gzip header: data too short', + HTTP_Request2_Exception::DECODE_ERROR + ); } $headerLength += $commentLength + 1; } // have a CRC for header. let's check if ($flags & 2) { if ($length - $headerLength - 2 < 8) { - throw new HTTP_Request2_Exception('Error parsing gzip header: data too short'); + throw new HTTP_Request2_MessageException( + 'Error parsing gzip header: data too short', + HTTP_Request2_Exception::DECODE_ERROR + ); } $crcReal = 0xffff & crc32(substr($data, 0, $headerLength)); $crcStored = unpack('v', substr($data, $headerLength, 2)); if ($crcReal != $crcStored[1]) { - throw new HTTP_Request2_Exception('Header CRC check failed'); + throw new HTTP_Request2_MessageException( + 'Header CRC check failed', + HTTP_Request2_Exception::DECODE_ERROR + ); } $headerLength += 2; } @@ -517,11 +585,20 @@ class HTTP_Request2_Response // don't pass $dataSize to gzinflate, see bugs #13135, #14370 $unpacked = gzinflate(substr($data, $headerLength, -8)); if (false === $unpacked) { - throw new HTTP_Request2_Exception('gzinflate() call failed'); + throw new HTTP_Request2_MessageException( + 'gzinflate() call failed', + HTTP_Request2_Exception::DECODE_ERROR + ); } elseif ($dataSize != strlen($unpacked)) { - throw new HTTP_Request2_Exception('Data size check failed'); + throw new HTTP_Request2_MessageException( + 'Data size check failed', + HTTP_Request2_Exception::DECODE_ERROR + ); } elseif ((0xffffffff & $dataCrc) != (0xffffffff & crc32($unpacked))) { - throw new HTTP_Request2_Exception('Data CRC check failed'); + throw new HTTP_Request2_Exception( + 'Data CRC check failed', + HTTP_Request2_Exception::DECODE_ERROR + ); } return $unpacked; } @@ -531,12 +608,15 @@ class HTTP_Request2_Response * * @param string deflate-encoded data * @return string decoded data - * @throws HTTP_Request2_Exception + * @throws HTTP_Request2_LogicException */ public static function decodeDeflate($data) { if (!function_exists('gzuncompress')) { - throw new HTTP_Request2_Exception('Unable to decode body: gzip extension not available'); + throw new HTTP_Request2_LogicException( + 'Unable to decode body: gzip extension not available', + HTTP_Request2_Exception::MISCONFIGURATION + ); } // RFC 2616 defines 'deflate' encoding as zlib format from RFC 1950, // while many applications send raw deflate stream from RFC 1951. diff --git a/extlib/Net/URL/Mapper.php b/extlib/Net/URL/Mapper.php deleted file mode 100644 index 009c135214..0000000000 --- a/extlib/Net/URL/Mapper.php +++ /dev/null @@ -1,324 +0,0 @@ - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * The names of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category Net - * @package Net_URL_Mapper - * @author Bertrand Mansion - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Mapper.php 232857 2007-03-28 10:23:04Z mansion $ - * @link http://pear.php.net/package/Net_URL_Mapper - */ - -require_once 'Net/URL/Mapper/Path.php'; -require_once 'Net/URL/Mapper/Exception.php'; - -/** - * URL parser and mapper class - * - * This class takes an URL and a configuration and returns formatted data - * about the request according to a configuration parameter - * - * @category Net - * @package Net_URL_Mapper - * @author Bertrand Mansion - * @version Release: @package_version@ - */ -class Net_URL_Mapper -{ - /** - * Array of Net_URL_Mapper instances - * @var array - */ - private static $instances = array(); - - /** - * Mapped paths collection - * @var array - */ - protected $paths = array(); - - /** - * Prefix used for url mapping - * @var string - */ - protected $prefix = ''; - - /** - * Optional scriptname if mod_rewrite is not available - * @var string - */ - protected $scriptname = ''; - - /** - * Mapper instance id - * @var string - */ - protected $id = '__default__'; - - /** - * Class constructor - * Constructor is private, you should use getInstance() instead. - */ - private function __construct() { } - - /** - * Returns a singleton object corresponding to the requested instance id - * @param string Requested instance name - * @return Object Net_URL_Mapper Singleton - */ - public static function getInstance($id = '__default__') - { - if (!isset(self::$instances[$id])) { - $m = new Net_URL_Mapper(); - $m->id = $id; - self::$instances[$id] = $m; - } - return self::$instances[$id]; - } - - /** - * Returns the instance id - * @return string Mapper instance id - */ - public function getId() - { - return $this->id; - } - - /** - * Parses a path and creates a connection - * @param string The path to connect - * @param array Default values for path parts - * @param array Regular expressions for path parts - * @return object Net_URL_Mapper_Path - */ - public function connect($path, $defaults = array(), $rules = array()) - { - $pathObj = new Net_URL_Mapper_Path($path, $defaults, $rules); - $this->addPath($pathObj); - return $pathObj; - } - - /** - * Set the url prefix if needed - * - * Example: using the prefix to differenciate mapper instances - * - * $fr = Net_URL_Mapper::getInstance('fr'); - * $fr->setPrefix('/fr'); - * $en = Net_URL_Mapper::getInstance('en'); - * $en->setPrefix('/en'); - * - * - * @param string URL prefix - */ - public function setPrefix($prefix) - { - $this->prefix = '/'.trim($prefix, '/'); - } - - /** - * Set the scriptname if mod_rewrite not available - * - * Example: will match and generate url like - * - index.php/view/product/1 - * - * $m = Net_URL_Mapper::getInstance(); - * $m->setScriptname('index.php'); - * - * @param string URL prefix - */ - public function setScriptname($scriptname) - { - $this->scriptname = $scriptname; - } - - /** - * Will attempt to match an url with a defined path - * - * If an url corresponds to a path, the resulting values are returned - * in an array. If none is found, null is returned. In case an url is - * matched but its content doesn't validate the path rules, an exception is - * thrown. - * - * @param string URL - * @return array|null array if match found, null otherwise - * @throws Net_URL_Mapper_InvalidException - */ - public function match($url) - { - $nurl = '/'.trim($url, '/'); - - // Remove scriptname if needed - - if (!empty($this->scriptname) && - strpos($nurl, $this->scriptname) === 0) { - $nurl = substr($nurl, strlen($this->scriptname)); - if (empty($nurl)) { - $nurl = '/'; - } - } - - // Remove prefix - - if (!empty($this->prefix)) { - if (strpos($nurl, $this->prefix) !== 0) { - return null; - } - $nurl = substr($nurl, strlen($this->prefix)); - if (empty($nurl)) { - $nurl = '/'; - } - } - - // Remove query string - - if (($pos = strpos($nurl, '?')) !== false) { - $nurl = substr($nurl, 0, $pos); - } - - $paths = array(); - $values = null; - - // Make a list of paths that conform to route format - - foreach ($this->paths as $path) { - $regex = $path->getFormat(); - if (preg_match($regex, $nurl)) { - $paths[] = $path; - } - } - - // Make sure one of the paths found is valid - - foreach ($paths as $path) { - $regex = $path->getRule(); - if (preg_match($regex, $nurl, $matches)) { - $values = $path->getDefaults(); - array_shift($matches); - $clean = array(); - foreach ($matches as $k => $v) { - $v = trim($v, '/'); - if (!is_int($k) && $v !== '') { - $values[$k] = $v; - } - } - break; - } - } - - // A path conforms but does not validate - - if (is_null($values) && !empty($paths)) { - $e = new Net_URL_Mapper_InvalidException('A path was found but is invalid.'); - $e->setPath($paths[0]); - $e->setUrl($url); - throw $e; - } - - return $values; - } - - /** - * Generate an url based on given parameters - * - * Will attempt to find a path definition that matches the given parameters and - * will generate an url based on this path. - * - * @param array Values to be used for the url generation - * @param array Key/value pairs for query string if needed - * @param string Anchor (fragment) if needed - * @return string|false String if a rule was found, false otherwise - */ - public function generate($values = array(), $qstring = array(), $anchor = '') - { - // Use root path if any - - if (empty($values) && isset($this->paths['/'])) { - return $this->scriptname.$this->prefix.$this->paths['/']->generate($values, $qstring, $anchor); - } - - foreach ($this->paths as $path) { - $set = array(); - foreach ($values as $k => $v) { - if ($path->hasKey($k, $v)) { - $set[$k] = $v; - } - } - - if (count($set) == count($values) && - count($set) <= $path->getMaxKeys()) { - - $req = $path->getRequired(); - if (count(array_intersect(array_keys($set), $req)) != count($req)) { - continue; - } - $gen = $path->generate($set, $qstring, $anchor); - return $this->scriptname.$this->prefix.$gen; - } - } - return false; - } - - /** - * Returns defined paths - * @return array Array of paths - */ - public function getPaths() - { - return $this->paths; - } - - /** - * Reset all paths - * This is probably only useful for testing - */ - public function reset() - { - $this->paths = array(); - $this->prefix = ''; - } - - /** - * Add a new path to the mapper - * @param object Net_URL_Mapper_Path object - */ - public function addPath(Net_URL_Mapper_Path $path) - { - $this->paths[$path->getPath()] = $path; - } - -} -?> \ No newline at end of file diff --git a/extlib/Net/URL/Mapper/Exception.php b/extlib/Net/URL/Mapper/Exception.php deleted file mode 100644 index 1915ad9782..0000000000 --- a/extlib/Net/URL/Mapper/Exception.php +++ /dev/null @@ -1,104 +0,0 @@ - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * The names of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category Net - * @package Net_URL_Mapper - * @author Bertrand Mansion - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Exception.php 232857 2007-03-28 10:23:04Z mansion $ - * @link http://pear.php.net/package/Net_URL_Mapper - */ - -/** - * Base class for exceptions in PEAR - */ -require_once 'PEAR/Exception.php'; - -/** - * Base class for exceptions in Net_URL_Mapper package - * - * Such a base class is required by the Exception RFC: - * http://pear.php.net/pepr/pepr-proposal-show.php?id=132 - * It will rarely be thrown directly, its specialized subclasses will be - * thrown most of the time. - * - * @category Net - * @package Net_URL_Mapper - * @version Release: @package_version@ - */ -class Net_URL_Mapper_Exception extends PEAR_Exception -{ -} - -/** - * Exception thrown when a path is invalid - * - * A path can conform to a given structure, but contain invalid parameters. - * - * $m = Net_URL_Mapper::getInstance(); - * $m->connect('hi/:name', null, array('name'=>'[a-z]+')); - * $m->match('/hi/FOXY'); // Will throw the exception - * - * - * @category Net - * @package Net_URL_Mapper - * @version Release: @package_version@ - */ -class Net_URL_Mapper_InvalidException extends Net_URL_Mapper_Exception -{ - protected $path; - protected $url; - - public function setPath($path) - { - $this->path = $path; - } - - public function getPath() - { - return $this->path; - } - - public function setUrl($url) - { - $this->url = $url; - } - - public function getUrl() - { - return $this->url; - } -} -?> \ No newline at end of file diff --git a/extlib/Net/URL/Mapper/Part.php b/extlib/Net/URL/Mapper/Part.php deleted file mode 100644 index 087c368eea..0000000000 --- a/extlib/Net/URL/Mapper/Part.php +++ /dev/null @@ -1,142 +0,0 @@ - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * The names of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category Net - * @package Net_URL_Mapper - * @author Bertrand Mansion - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Part.php 232857 2007-03-28 10:23:04Z mansion $ - * @link http://pear.php.net/package/Net_URL_Mapper - */ - -abstract class Net_URL_Mapper_Part -{ - protected $defaults; - protected $rule; - protected $public; - protected $type; - protected $required = false; - - /** - * Part name if dynamic or content, generated from path - * @var string - */ - public $content; - - const DYNAMIC = 1; - const WILDCARD = 2; - const FIXED = 3; - - public function __construct($content, $path) - { - $this->content = $content; - $this->path = $path; - } - - public function setRule($rule) - { - $this->rule = $rule; - } - - abstract public function getFormat(); - - abstract public function getRule(); - - public function addSlash($str) - { - $str = trim($str, '/'); - if (($pos = strpos($this->path, '/')) !== false) { - if ($pos == 0) { - $str = '/'.$str; - } else { - $str .= '/'; - } - } - return $str; - } - - public function addSlashRegex($str) - { - $str = trim($str, '/'); - if (($pos = strpos($this->path, '/')) !== false) { - if ($pos == 0) { - $str = '\/'.$str; - } else { - $str .= '\/'; - } - } - if (!$this->isRequired()) { - $str = '('.$str.'|)'; - } - return $str; - } - - public function setDefaults($defaults) - { - $this->defaults = (string)$defaults; - } - - public function getType() - { - return $this->type; - } - - public function accept($visitor, $method = null) - { - $args = func_get_args(); - $visitor->$method($this, $args); - } - - public function setRequired($required) - { - $this->required = $required; - } - - public function isRequired() - { - return $this->required; - } - - abstract public function generate($value = null); - - public function match($value) - { - $rule = $this->getRule(); - return preg_match('/^'.$rule.'$/', $this->addSlash($value)); - } - -} - -?> \ No newline at end of file diff --git a/extlib/Net/URL/Mapper/Part/Dynamic.php b/extlib/Net/URL/Mapper/Part/Dynamic.php deleted file mode 100644 index 914afa4211..0000000000 --- a/extlib/Net/URL/Mapper/Part/Dynamic.php +++ /dev/null @@ -1,81 +0,0 @@ - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * The names of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category Net - * @package Net_URL_Mapper - * @author Bertrand Mansion - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Dynamic.php 232857 2007-03-28 10:23:04Z mansion $ - * @link http://pear.php.net/package/Net_URL_Mapper - */ - -require_once 'Net/URL/Mapper/Part.php'; - -class Net_URL_Mapper_Part_Dynamic extends Net_URL_Mapper_Part -{ - - public function __construct($content, $path) - { - $this->type = Net_URL_Mapper_Part::DYNAMIC; - $this->setRequired(true); - parent::__construct($content, $path); - } - - public function getFormat() - { - return $this->addSlashRegex('[^\/]+'); - } - - public function getRule() - { - if (!empty($this->rule)) { - return '(?P<'.$this->content.'>'.$this->addSlashRegex($this->rule).')'; - } - return '(?P<'.$this->content.'>'.$this->addSlashRegex('[^\/]+').')'; - } - - public function generate($value = null) - { - if (is_array($value) && isset($value[$this->content])) { - $val = $value[$this->content]; - } elseif (!is_array($value) && !is_null($value)) { - $val = $value; - } else { - $val = $this->defaults; - } - return $this->addSlash(urlencode($val)); - } -} -?> \ No newline at end of file diff --git a/extlib/Net/URL/Mapper/Part/Fixed.php b/extlib/Net/URL/Mapper/Part/Fixed.php deleted file mode 100644 index 7d94973eac..0000000000 --- a/extlib/Net/URL/Mapper/Part/Fixed.php +++ /dev/null @@ -1,70 +0,0 @@ - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * The names of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category Net - * @package Net_URL_Mapper - * @author Bertrand Mansion - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Fixed.php 232857 2007-03-28 10:23:04Z mansion $ - * @link http://pear.php.net/package/Net_URL_Mapper - */ - -require_once 'Net/URL/Mapper/Part.php'; - -class Net_URL_Mapper_Part_Fixed extends Net_URL_Mapper_Part -{ - - public function __construct($content, $path) - { - $this->type = Net_URL_Mapper_Part::FIXED; - parent::__construct($content, $path); - } - - public function getFormat() - { - return $this->getRule(); - } - - public function getRule() - { - return preg_quote($this->path, '/'); - } - - public function generate($value = null) - { - return $this->path; - } -} -?> \ No newline at end of file diff --git a/extlib/Net/URL/Mapper/Part/Wildcard.php b/extlib/Net/URL/Mapper/Part/Wildcard.php deleted file mode 100644 index 84e29e1306..0000000000 --- a/extlib/Net/URL/Mapper/Part/Wildcard.php +++ /dev/null @@ -1,80 +0,0 @@ - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * The names of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category Net - * @package Net_URL_Mapper - * @author Bertrand Mansion - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Wildcard.php 232857 2007-03-28 10:23:04Z mansion $ - * @link http://pear.php.net/package/Net_URL_Mapper - */ - -require_once 'Net/URL/Mapper/Part.php'; - -class Net_URL_Mapper_Part_Wildcard extends Net_URL_Mapper_Part -{ - - public function __construct($content, $path) - { - $this->type = Net_URL_Mapper_Part::WILDCARD; - $this->setRequired(true); - parent::__construct($content, $path); - } - - public function getFormat() - { - return $this->addSlashRegex('.*');; - } - - public function getRule() - { - return '(?P<'.$this->content.'>'.$this->addSlashRegex('.*').')'; - } - - public function generate($value = null) - { - if (is_array($value) && isset($value[$this->content])) { - $val = $value[$this->content]; - } elseif (!is_array($value) && !is_null($value)) { - $val = $value; - } else { - $val = $this->defaults; - } - return $this->addSlash(str_replace( - array('%2F', '%23'), - array('/', '#'), urlencode($val))); - } -} -?> \ No newline at end of file diff --git a/extlib/Net/URL/Mapper/Path.php b/extlib/Net/URL/Mapper/Path.php deleted file mode 100644 index b459fa1fd3..0000000000 --- a/extlib/Net/URL/Mapper/Path.php +++ /dev/null @@ -1,451 +0,0 @@ - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * The names of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category Net - * @package Net_URL_Mapper - * @author Bertrand Mansion - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Path.php 296456 2010-03-20 00:41:08Z kguest $ - * @link http://pear.php.net/package/Net_URL_Mapper - */ - -require_once 'Net/URL.php'; -require_once 'Net/URL/Mapper/Part/Dynamic.php'; -require_once 'Net/URL/Mapper/Part/Wildcard.php'; -require_once 'Net/URL/Mapper/Part/Fixed.php'; - -class Net_URL_Mapper_Path -{ - private $path = ''; - private $N = 0; - public $token; - public $value; - private $line = 1; - private $state = 1; - - - protected $alias; - protected $rules = array(); - protected $defaults = array(); - protected $parts = array(); - protected $rule; - protected $format; - protected $minKeys; - protected $maxKeys; - protected $fixed = true; - protected $required; - - public function __construct($path = '', $defaults = array(), $rules = array()) - { - $this->path = '/'.trim(Net_URL::resolvePath($path), '/'); - $this->setDefaults($defaults); - $this->setRules($rules); - - try { - $this->parsePath(); - } catch (Exception $e) { - // The path could not be parsed correctly, treat it as fixed - $this->fixed = true; - $part = self::createPart(Net_URL_Mapper_Part::FIXED, $this->path, $this->path); - $this->parts = array($part); - } - $this->getRequired(); - } - - /** - * Called when the object is serialized - * Make sure we do not store too much info when the object is serialized - * and call the regular expressions generator functions so that they will - * not need to be generated again on wakeup. - * - * @return array Name of properties to store when serialized - */ - public function __sleep() - { - $this->getFormat(); - $this->getRule(); - return array('alias', 'path', 'defaults', 'rule', 'format', - 'parts', 'minKeys', 'maxKeys', 'fixed', 'required'); - } - - public function getPath() - { - return $this->path; - } - - protected function parsePath() - { - while ($this->yylex()) { } - } - - /** - * Get the path alias - * Path aliases can be used instead of full path - * @return null|string - */ - public function getAlias() - { - return $this->alias; - } - - /** - * Set the path name - * @param string Set the path name - * @see getAlias() - */ - public function setAlias($alias) - { - $this->alias = $alias; - return $this; - } - - /** - * Get the path parts default values - * @return null|array - */ - public function getDefaults() - { - return $this->defaults; - } - - /** - * Set the path parts default values - * @param array Associative array with format partname => value - */ - public function setDefaults($defaults) - { - if (is_array($defaults)) { - $this->defaults = $defaults; - } else { - $this->defaults = array(); - } - } - - /** - * Set the path parts default values - * @param array Associative array with format partname => value - */ - public function setRules($rules) - { - if (is_array($rules)) { - $this->rules = $rules; - } else { - $this->rules = array(); - } - } - - /** - * Returns the regular expression used to match this path - * @return string PERL Regular expression - */ - public function getRule() - { - if (is_null($this->rule)) { - $this->rule = '/^'; - foreach ($this->parts as $path => $part) { - $this->rule .= $part->getRule(); - } - $this->rule .= '$/'; - } - return $this->rule; - } - - public function getFormat() - { - if (is_null($this->format)) { - $this->format = '/^'; - foreach ($this->parts as $path => $part) { - $this->format .= $part->getFormat(); - } - $this->format .= '$/'; - } - return $this->format; - } - - protected function addPart($part) - { - if (array_key_exists($part->content, $this->defaults)) { - $part->setRequired(false); - $part->setDefaults($this->defaults[$part->content]); - } - if (isset($this->rules[$part->content])) { - $part->setRule($this->rules[$part->content]); - } - $this->rule = null; - if ($part->getType() != Net_URL_Mapper_Part::FIXED) { - $this->fixed = false; - $this->parts[$part->content] = $part; - } else { - $this->parts[] = $part; - } - return $part; - } - - public static function createPart($type, $content, $path) - { - switch ($type) { - case Net_URL_Mapper_Part::DYNAMIC: - return new Net_URL_Mapper_Part_Dynamic($content, $path); - break; - case Net_URL_Mapper_Part::WILDCARD: - return new Net_URL_Mapper_Part_Wildcard($content, $path); - break; - default: - return new Net_URL_Mapper_Part_Fixed($content, $path); - } - } - - /** - * Checks whether the path contains the given part by name - * If value parameter is given, the part also checks if the - * given value conforms to the part rule. - * @param string Part name - * @param mixed The value to check against - */ - public function hasKey($partName, $value = null) - { - if (array_key_exists($partName, $this->parts)) { - if (!is_null($value) && $value !== false) { - return $this->parts[$partName]->match($value); - } else { - return true; - } - } elseif (array_key_exists($partName, $this->defaults) && - $value == $this->defaults[$partName]) { - return true; - } - return false; - } - - public function generate($values = array(), $qstring = array(), $anchor = '') - { - $path = ''; - foreach ($this->parts as $part) { - $path .= $part->generate($values); - } - $path = '/'.trim(Net_URL::resolvePath($path), '/'); - if (!empty($qstring)) { - if(strpos($path, '?') === false) { - $path .= '?'; - } else { - $path .= '&'; - } - $path .= http_build_query($qstring); - } - if (!empty($anchor)) { - $path .= '#'.ltrim($anchor, '#'); - } - return $path; - } - - public function getRequired() - { - if (!isset($this->required)) { - $req = array(); - foreach ($this->parts as $part) { - if ($part->isRequired()) { - $req[] = $part->content; - } - } - $this->required = $req; - } - return $this->required; - } - - public function getMaxKeys() - { - if (is_null($this->maxKeys)) { - $this->maxKeys = count($this->required); - $this->maxKeys += count($this->defaults); - } - return $this->maxKeys; - } - - - - - private $_yy_state = 1; - private $_yy_stack = array(); - - function yylex() - { - return $this->{'yylex' . $this->_yy_state}(); - } - - function yypushstate($state) - { - array_push($this->_yy_stack, $this->_yy_state); - $this->_yy_state = $state; - } - - function yypopstate() - { - $this->_yy_state = array_pop($this->_yy_stack); - } - - function yybegin($state) - { - $this->_yy_state = $state; - } - - - - function yylex1() - { - $tokenMap = array ( - 1 => 1, - 3 => 1, - 5 => 1, - 7 => 1, - 9 => 1, - ); - if ($this->N >= strlen($this->path)) { - return false; // end of input - } - $yy_global_pattern = "/^(\/?:\/?\\(([a-zA-Z0-9_]+)\\))|^(\/?\\*\/?\\(([a-zA-Z0-9_]+)\\))|^(\/?:([a-zA-Z0-9_]+))|^(\/?\\*([a-zA-Z0-9_]+))|^(\/?([^\/:*]+))/"; - - do { - if (preg_match($yy_global_pattern, substr($this->path, $this->N), $yymatches)) { - $yysubmatches = $yymatches; - $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns - if (!count($yymatches)) { - throw new Exception('Error: lexing failed because a rule matched' . - 'an empty string. Input "' . substr($this->path, - $this->N, 5) . '... state START'); - } - next($yymatches); // skip global match - $this->token = key($yymatches); // token number - if ($tokenMap[$this->token]) { - // extract sub-patterns for passing to lex function - $yysubmatches = array_slice($yysubmatches, $this->token + 1, - $tokenMap[$this->token]); - } else { - $yysubmatches = array(); - } - $this->value = current($yymatches); // token value - $r = $this->{'yy_r1_' . $this->token}($yysubmatches); - if ($r === null) { - $this->N += strlen($this->value); - $this->line += substr_count("\n", $this->value); - // accept this token - return true; - } elseif ($r === true) { - // we have changed state - // process this token in the new state - return $this->yylex(); - } elseif ($r === false) { - $this->N += strlen($this->value); - $this->line += substr_count("\n", $this->value); - if ($this->N >= strlen($this->path)) { - return false; // end of input - } - // skip this token - continue; - } else { $yy_yymore_patterns = array( - 1 => "^(\/?\\*\/?\\(([a-zA-Z0-9_]+)\\))|^(\/?:([a-zA-Z0-9_]+))|^(\/?\\*([a-zA-Z0-9_]+))|^(\/?([^\/:*]+))", - 3 => "^(\/?:([a-zA-Z0-9_]+))|^(\/?\\*([a-zA-Z0-9_]+))|^(\/?([^\/:*]+))", - 5 => "^(\/?\\*([a-zA-Z0-9_]+))|^(\/?([^\/:*]+))", - 7 => "^(\/?([^\/:*]+))", - 9 => "", - ); - - // yymore is needed - do { - if (!strlen($yy_yymore_patterns[$this->token])) { - throw new Exception('cannot do yymore for the last token'); - } - if (preg_match($yy_yymore_patterns[$this->token], - substr($this->path, $this->N), $yymatches)) { - $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns - next($yymatches); // skip global match - $this->token = key($yymatches); // token number - $this->value = current($yymatches); // token value - $this->line = substr_count("\n", $this->value); - } - } while ($this->{'yy_r1_' . $this->token}() !== null); - // accept - $this->N += strlen($this->value); - $this->line += substr_count("\n", $this->value); - return true; - } - } else { - throw new Exception('Unexpected input at line' . $this->line . - ': ' . $this->path[$this->N]); - } - break; - } while (true); - } // end function - - - const START = 1; - function yy_r1_1($yy_subpatterns) - { - - $c = $yy_subpatterns[0]; - $part = self::createPart(Net_URL_Mapper_Part::DYNAMIC, $c, $this->value); - $this->addPart($part); - } - function yy_r1_3($yy_subpatterns) - { - - $c = $yy_subpatterns[0]; - $part = self::createPart(Net_URL_Mapper_Part::WILDCARD, $c, $this->value); - $this->addPart($part); - } - function yy_r1_5($yy_subpatterns) - { - - $c = $yy_subpatterns[0]; - $part = self::createPart(Net_URL_Mapper_Part::DYNAMIC, $c, $this->value); - $this->addPart($part); - } - function yy_r1_7($yy_subpatterns) - { - - $c = $yy_subpatterns[0]; - $part = self::createPart(Net_URL_Mapper_Part::WILDCARD, $c, $this->value); - $this->addPart($part); - } - function yy_r1_9($yy_subpatterns) - { - - $c = $yy_subpatterns[0]; - $part = self::createPart(Net_URL_Mapper_Part::FIXED, $c, $this->value); - $this->addPart($part); - } - -} - -?> diff --git a/extlib/Net/URL/Mapper/Path.plex b/extlib/Net/URL/Mapper/Path.plex deleted file mode 100644 index c5ef1f88ea..0000000000 --- a/extlib/Net/URL/Mapper/Path.plex +++ /dev/null @@ -1,334 +0,0 @@ - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * The names of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category Net - * @package Net_URL_Mapper - * @author Bertrand Mansion - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Path.plex 283937 2009-07-12 11:37:21Z mansion $ - * @link http://pear.php.net/package/Net_URL_Mapper - */ - -require_once 'Net/URL/Mapper/Part/Dynamic.php'; -require_once 'Net/URL/Mapper/Part/Wildcard.php'; -require_once 'Net/URL/Mapper/Part/Fixed.php'; - -class Net_URL_Mapper_Path -{ - private $path = ''; - private $N = 0; - public $token; - public $value; - private $line = 1; - private $state = 1; - - - protected $alias; - protected $rules = array(); - protected $defaults = array(); - protected $parts = array(); - protected $rule; - protected $format; - protected $minKeys; - protected $maxKeys; - protected $fixed = true; - protected $required; - - public function __construct($path = '', $defaults = array(), $rules = array()) - { - $this->path = '/'.trim(Net_URL::resolvePath($path), '/'); - $this->setDefaults($defaults); - $this->setRules($rules); - - try { - $this->parsePath(); - } catch (Exception $e) { - // The path could not be parsed correctly, treat it as fixed - $this->fixed = true; - $part = self::createPart(Net_URL_Mapper_Part::FIXED, $this->path, $this->path); - $this->parts = array($part); - } - $this->getRequired(); - } - - /** - * Called when the object is serialized - * Make sure we do not store too much info when the object is serialized - * and call the regular expressions generator functions so that they will - * not need to be generated again on wakeup. - * - * @return array Name of properties to store when serialized - */ - public function __sleep() - { - $this->getFormat(); - $this->getRule(); - return array('alias', 'path', 'defaults', 'rule', 'format', - 'parts', 'minKeys', 'maxKeys', 'fixed', 'required'); - } - - public function getPath() - { - return $this->path; - } - - protected function parsePath() - { - while ($this->yylex()) { } - } - - /** - * Get the path alias - * Path aliases can be used instead of full path - * @return null|string - */ - public function getAlias() - { - return $this->alias; - } - - /** - * Set the path name - * @param string Set the path name - * @see getAlias() - */ - public function setAlias($alias) - { - $this->alias = $alias; - return $this; - } - - /** - * Get the path parts default values - * @return null|array - */ - public function getDefaults() - { - return $this->defaults; - } - - /** - * Set the path parts default values - * @param array Associative array with format partname => value - */ - public function setDefaults($defaults) - { - if (is_array($defaults)) { - $this->defaults = $defaults; - } else { - $this->defaults = array(); - } - } - - /** - * Set the path parts default values - * @param array Associative array with format partname => value - */ - public function setRules($rules) - { - if (is_array($rules)) { - $this->rules = $rules; - } else { - $this->rules = array(); - } - } - - /** - * Returns the regular expression used to match this path - * @return string PERL Regular expression - */ - public function getRule() - { - if (is_null($this->rule)) { - $this->rule = '/^'; - foreach ($this->parts as $path => $part) { - $this->rule .= $part->getRule(); - } - $this->rule .= '$/'; - } - return $this->rule; - } - - public function getFormat() - { - if (is_null($this->format)) { - $this->format = '/^'; - foreach ($this->parts as $path => $part) { - $this->format .= $part->getFormat(); - } - $this->format .= '$/'; - } - return $this->format; - } - - protected function addPart($part) - { - if (array_key_exists($part->content, $this->defaults)) { - $part->setRequired(false); - $part->setDefaults($this->defaults[$part->content]); - } - if (isset($this->rules[$part->content])) { - $part->setRule($this->rules[$part->content]); - } - $this->rule = null; - if ($part->getType() != Net_URL_Mapper_Part::FIXED) { - $this->fixed = false; - $this->parts[$part->content] = $part; - } else { - $this->parts[] = $part; - } - return $part; - } - - public static function createPart($type, $content, $path) - { - switch ($type) { - case Net_URL_Mapper_Part::DYNAMIC: - return new Net_URL_Mapper_Part_Dynamic($content, $path); - break; - case Net_URL_Mapper_Part::WILDCARD: - return new Net_URL_Mapper_Part_Wildcard($content, $path); - break; - default: - return new Net_URL_Mapper_Part_Fixed($content, $path); - } - } - - /** - * Checks whether the path contains the given part by name - * If value parameter is given, the part also checks if the - * given value conforms to the part rule. - * @param string Part name - * @param mixed The value to check against - */ - public function hasKey($partName, $value = null) - { - if (array_key_exists($partName, $this->parts)) { - if (!is_null($value) && $value !== false) { - return $this->parts[$partName]->match($value); - } else { - return true; - } - } elseif (array_key_exists($partName, $this->defaults) && - $value == $this->defaults[$partName]) { - return true; - } - return false; - } - - public function generate($values = array(), $qstring = array(), $anchor = '') - { - $path = ''; - foreach ($this->parts as $part) { - $path .= $part->generate($values); - } - $path = '/'.trim(Net_URL::resolvePath($path), '/'); - if (!empty($qstring)) { - $path .= '?'.http_build_query($qstring); - } - if (!empty($anchor)) { - $path .= '#'.ltrim($anchor, '#'); - } - return $path; - } - - public function getRequired() - { - if (!isset($this->required)) { - $req = array(); - foreach ($this->parts as $part) { - if ($part->isRequired()) { - $req[] = $part->content; - } - } - $this->required = $req; - } - return $this->required; - } - - public function getMaxKeys() - { - if (is_null($this->maxKeys)) { - $this->maxKeys = count($this->required); - $this->maxKeys += count($this->defaults); - } - return $this->maxKeys; - } - - - -/*!lex2php -%input $this->path -%counter $this->N -%token $this->token -%value $this->value -%line $this->line -static = /\/?([^\/:\*]+)/ -variable = /([a-zA-Z0-9_]+)/ -dynamic = /\/?:/ -wildcard = @/?\*@ -grouping = /\/?\(([a-zA-Z0-9_]+)\)/ -*/ -/*!lex2php -%statename START -dynamic grouping { - $c = $yy_subpatterns[0]; - $part = self::createPart(Net_URL_Mapper_Part::DYNAMIC, $c, $this->value); - $this->addPart($part); -} -wildcard grouping { - $c = $yy_subpatterns[0]; - $part = self::createPart(Net_URL_Mapper_Part::WILDCARD, $c, $this->value); - $this->addPart($part); -} -dynamic variable { - $c = $yy_subpatterns[0]; - $part = self::createPart(Net_URL_Mapper_Part::DYNAMIC, $c, $this->value); - $this->addPart($part); -} -wildcard variable { - $c = $yy_subpatterns[0]; - $part = self::createPart(Net_URL_Mapper_Part::WILDCARD, $c, $this->value); - $this->addPart($part); -} -static { - $c = $yy_subpatterns[0]; - $part = self::createPart(Net_URL_Mapper_Part::FIXED, $c, $this->value); - $this->addPart($part); -} -*/ -} - -?> \ No newline at end of file diff --git a/index.php b/index.php index 3534739bfa..1566399fa2 100644 --- a/index.php +++ b/index.php @@ -49,21 +49,29 @@ $action = null; function getPath($req) { + $p = null; + if ((common_config('site', 'fancy') || !array_key_exists('PATH_INFO', $_SERVER)) && array_key_exists('p', $req) ) { - return $req['p']; + $p = $req['p']; } else if (array_key_exists('PATH_INFO', $_SERVER)) { $path = $_SERVER['PATH_INFO']; $script = $_SERVER['SCRIPT_NAME']; if (substr($path, 0, mb_strlen($script)) == $script) { - return substr($path, mb_strlen($script)); + $p = substr($path, mb_strlen($script) + 1); } else { - return $path; + $p = $path; } } else { - return null; + $p = null; } + + // Trim all initial '/' + + $p = ltrim($p, '/'); + + return $p; } /** @@ -116,15 +124,13 @@ function handleError($error) common_config('site', 'name'), common_config('site', 'email') ); - } else { - // TRANS: Error message. - $msg = _('An important error occured, probably related to email setup. '. - 'Check logfiles for more info.' - ); - } - $dac = new DBErrorAction($msg, 500); - $dac->showPage(); + $dac = new DBErrorAction($msg, 500); + $dac->showPage(); + } else { + $sac = new ServerErrorAction($error->getMessage(), 500, $error); + $sac->showPage(); + } } catch (Exception $e) { // TRANS: Error message. diff --git a/install.php b/install.php index 9b0d19882c..f44999285a 100644 --- a/install.php +++ b/install.php @@ -248,6 +248,21 @@ class WebInstaller extends Installer
  • +
    + Site profile +
      +
    • + + +

      Initial access settings for your site

      +
    • +
    +
    @@ -284,7 +299,7 @@ STR; /** * Read and validate input data. * May output side effects. - * + * * @return boolean success */ function prepare() @@ -304,6 +319,8 @@ STR; $this->adminEmail = $post->string('admin_email'); $this->adminUpdates = $post->string('admin_updates'); + $this->siteProfile = $post->string('site_profile'); + $this->server = $_SERVER['HTTP_HOST']; $this->path = substr(dirname($_SERVER['PHP_SELF']), 1); @@ -315,12 +332,16 @@ STR; if (!$this->validateAdmin()) { $fail = true; } - + if ($this->adminPass != $adminPass2) { $this->updateStatus("Administrator passwords do not match. Did you mistype?", true); $fail = true; } - + + if (!$this->validateSiteProfile()) { + $fail = true; + } + return !$fail; } @@ -335,10 +356,11 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" Install StatusNet - + + - + @@ -347,22 +369,34 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    +
    +
    + +
    +
    + diff --git a/js/userdesign.go.js b/js/userdesign.go.js index eb4dece095..f6c696759d 100644 --- a/js/userdesign.go.js +++ b/js/userdesign.go.js @@ -2,7 +2,7 @@ * * @package StatusNet * @author Sarven Capadisli - * @copyright 2009 StatusNet, Inc. + * @copyright 2009-2011 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ @@ -16,7 +16,7 @@ $(document).ready(function() { $(E).val(rgb2hex($('#content').css('background-color'))); break; case 3: - $(E).val(rgb2hex($('#aside_primary').css('background-color'))); + $(E).val(rgb2hex($('#aside_primary_wrapper, #site_nav_local_views_wrapper').css('background-color'))); break; case 4: $(E).val(rgb2hex($('html body').css('color'))); @@ -45,10 +45,10 @@ $(document).ready(function() { $('body').css({'background-color':C}); break; case 2: - $('#content, #site_nav_local_views .current a').css({'background-color':C}); + $('#content').css({'background-color':C}); break; case 3: - $('#aside_primary').css({'background-color':C}); + $('#aside_primary_wrapper, #site_nav_local_views_wrapper').css({'background-color':C}); break; case 4: $('html body').css({'color':C}); diff --git a/js/util.js b/js/util.js index 979415c639..c22802651a 100644 --- a/js/util.js +++ b/js/util.js @@ -638,13 +638,23 @@ var SN = { // StatusNet // Find the notice we're replying to... var id = $($('.notice_id', notice)[0]).text(); var parentNotice = notice; + var stripForm = true; // strip a couple things out of reply forms that are inline // Find the threaded replies view we'll be adding to... var list = notice.closest('.notices'); - if (list.hasClass('threaded-replies')) { + if (list.closest('.old-school').length) { + // We're replying to an old-school conversation thread; + // use the old-style ping into the top form. + SN.U.switchInputFormTab("status") + replyForm = $('#input_form_status').find('form'); + stripForm = false; + } else if (list.hasClass('threaded-replies')) { // We're replying to a reply; use reply form on the end of this list. // We'll add our form at the end of this; grab the root notice. parentNotice = list.closest('.notice'); + + // See if the form's already open... + var replyForm = $('.notice-reply-form', list); } else { // We're replying to a parent notice; pull its threaded list // and we'll add on the end of it. Will add if needed. @@ -658,18 +668,21 @@ var SN = { // StatusNet SN.U.NoticeInlineReplyPlaceholder(notice); } } - } - // See if the form's already open... - var replyForm = $('.notice-reply-form', list); + // See if the form's already open... + var replyForm = $('.notice-reply-form', list); + } var nextStep = function() { // Override...? replyForm.find('input[name=inreplyto]').val(id); - replyForm.find('#notice_to').attr('disabled', 'disabled').hide(); - replyForm.find('#notice_private').attr('disabled', 'disabled').hide(); - replyForm.find('label[for=notice_to]').hide(); - replyForm.find('label[for=notice_private]').hide(); + if (stripForm) { + // Don't do this for old-school reply form, as they don't come back! + replyForm.find('#notice_to').attr('disabled', 'disabled').hide(); + replyForm.find('#notice_private').attr('disabled', 'disabled').hide(); + replyForm.find('label[for=notice_to]').hide(); + replyForm.find('label[for=notice_private]').hide(); + } // Set focus... var text = replyForm.find('textarea'); @@ -1422,7 +1435,15 @@ var SN = { // StatusNet SN.Init.NoticeFormSetup(form); }) .find('.notice_data-text').focus(); - } + }, + + showMoreMenuItems: function(menuid) { + $('#'+menuid+' .more_link').remove(); + var selector = '#'+menuid+' .extended_menu'; + var extended = $(selector); + extended.removeClass('extended_menu'); + return void(0); + } }, Init: { diff --git a/js/util.min.js b/js/util.min.js index 1dd11c2852..78e0c89841 100644 --- a/js/util.min.js +++ b/js/util.min.js @@ -1 +1 @@ -var SN={C:{I:{CounterBlackout:false,MaxLength:140,PatternUsername:/^[0-9a-zA-Z\-_.]*$/,HTTP20x30x:[200,201,202,203,204,205,206,300,301,302,303,304,305,306,307],NoticeFormMaster:null},S:{Disabled:"disabled",Warning:"warning",Error:"error",Success:"success",Processing:"processing",CommandResult:"command_result",FormNotice:"form_notice",NoticeDataGeo:"notice_data-geo",NoticeDataGeoCookie:"NoticeDataGeo",NoticeDataGeoSelected:"notice_data-geo_selected",StatusNetInstance:"StatusNetInstance"}},messages:{},msg:function(a){if(typeof SN.messages[a]=="undefined"){return"["+a+"]"}else{return SN.messages[a]}},U:{FormNoticeEnhancements:function(b){if(jQuery.data(b[0],"ElementData")===undefined){MaxLength=b.find(".count").text();if(typeof(MaxLength)=="undefined"){MaxLength=SN.C.I.MaxLength}jQuery.data(b[0],"ElementData",{MaxLength:MaxLength});SN.U.Counter(b);NDT=b.find(".notice_data-text:first");NDT.bind("keyup",function(c){SN.U.Counter(b)});var a=function(c){window.setTimeout(function(){SN.U.Counter(b)},50)};NDT.bind("cut",a).bind("paste",a)}else{b.find(".count").text(jQuery.data(b[0],"ElementData").MaxLength)}},Counter:function(d){SN.C.I.FormNoticeCurrent=d;var b=jQuery.data(d[0],"ElementData").MaxLength;if(b<=0){return}var c=b-SN.U.CharacterCount(d);var a=d.find(".count");if(c.toString()!=a.text()){if(!SN.C.I.CounterBlackout||c===0){if(a.text()!=String(c)){a.text(c)}if(c<0){d.addClass(SN.C.S.Warning)}else{d.removeClass(SN.C.S.Warning)}if(!SN.C.I.CounterBlackout){SN.C.I.CounterBlackout=true;SN.C.I.FormNoticeCurrent=d;window.setTimeout("SN.U.ClearCounterBlackout(SN.C.I.FormNoticeCurrent);",500)}}}},CharacterCount:function(a){return a.find(".notice_data-text:first").val().length},ClearCounterBlackout:function(a){SN.C.I.CounterBlackout=false;SN.U.Counter(a)},RewriteAjaxAction:function(a){if(document.location.protocol=="https:"&&a.substr(0,5)=="http:"){return a.replace(/^http:\/\/[^:\/]+/,"https://"+document.location.host)}else{return a}},FormXHR:function(a,b){$.ajax({type:"POST",dataType:"xml",url:SN.U.RewriteAjaxAction(a.attr("action")),data:a.serialize()+"&ajax=1",beforeSend:function(c){a.addClass(SN.C.S.Processing).find(".submit").addClass(SN.C.S.Disabled).attr(SN.C.S.Disabled,SN.C.S.Disabled)},error:function(e,f,d){var c=null;if(e.responseXML){c=$("#error",e.responseXML).text()}alert(c||d||f);a.removeClass(SN.C.S.Processing).find(".submit").removeClass(SN.C.S.Disabled).removeAttr(SN.C.S.Disabled)},success:function(c,d){if(typeof($("form",c)[0])!="undefined"){form_new=document._importNode($("form",c)[0],true);a.replaceWith(form_new);if(b){b()}}else{if(typeof($("p",c)[0])!="undefined"){a.replaceWith(document._importNode($("p",c)[0],true));if(b){b()}}else{alert("Unknown error.")}}}})},FormNoticeXHR:function(b){SN.C.I.NoticeDataGeo={};b.append('');b.attr("action",SN.U.RewriteAjaxAction(b.attr("action")));var c=function(d,e){b.append($('

    ').addClass(d).text(e))};var a=function(){b.find(".form_response").remove()};b.ajaxForm({dataType:"xml",timeout:"60000",beforeSend:function(d){if(b.find(".notice_data-text:first").val()==""){b.addClass(SN.C.S.Warning);return false}b.addClass(SN.C.S.Processing).find(".submit").addClass(SN.C.S.Disabled).attr(SN.C.S.Disabled,SN.C.S.Disabled);SN.U.normalizeGeoData(b);return true},error:function(f,g,e){b.removeClass(SN.C.S.Processing).find(".submit").removeClass(SN.C.S.Disabled).removeAttr(SN.C.S.Disabled,SN.C.S.Disabled);a();if(g=="timeout"){c("error","Sorry! We had trouble sending your notice. The servers are overloaded. Please try again, and contact the site administrator if this problem persists.")}else{var d=SN.U.GetResponseXML(f);if($("."+SN.C.S.Error,d).length>0){b.append(document._importNode($("."+SN.C.S.Error,d)[0],true))}else{if(parseInt(f.status)===0||jQuery.inArray(parseInt(f.status),SN.C.I.HTTP20x30x)>=0){b.resetForm().find(".attach-status").remove();SN.U.FormNoticeEnhancements(b)}else{c("error","(Sorry! We had trouble sending your notice ("+f.status+" "+f.statusText+"). Please report the problem to the site administrator if this happens again.")}}}},success:function(j,f){a();var p=$("#"+SN.C.S.Error,j);if(p.length>0){c("error",p.text())}else{if($("body")[0].id=="bookmarklet"){self.close()}var d=$("#"+SN.C.S.CommandResult,j);if(d.length>0){c("success",d.text())}else{var o=document._importNode($("li",j)[0],true);var k=$("#notices_primary .notices:first");var m=b.closest("li.notice-reply");if(m.length>0){var l=b.closest(".threaded-replies");var n=l.find(".notice-reply-placeholder");m.remove();var e=$(o).attr("id");if($("#"+e).length==0){$(o).insertBefore(n)}else{}n.show()}else{if(k.length>0&&SN.U.belongsOnTimeline(o)){if($("#"+o.id).length===0){var h=b.find("[name=inreplyto]").val();var g="#notices_primary #notice-"+h;if($("body")[0].id=="conversation"){if(h.length>0&&$(g+" .notices").length<1){$(g).append('
      ')}$($(g+" .notices")[0]).append(o)}else{k.prepend(o)}$("#"+o.id).css({display:"none"}).fadeIn(2500);SN.U.NoticeWithAttachment($("#"+o.id));SN.U.switchInputFormTab("placeholder")}}else{c("success",$("title",j).text())}}}b.resetForm();b.find("[name=inreplyto]").val("");b.find(".attach-status").remove();SN.U.FormNoticeEnhancements(b)}},complete:function(d,e){b.removeClass(SN.C.S.Processing).find(".submit").removeAttr(SN.C.S.Disabled).removeClass(SN.C.S.Disabled);b.find("[name=lat]").val(SN.C.I.NoticeDataGeo.NLat);b.find("[name=lon]").val(SN.C.I.NoticeDataGeo.NLon);b.find("[name=location_ns]").val(SN.C.I.NoticeDataGeo.NLNS);b.find("[name=location_id]").val(SN.C.I.NoticeDataGeo.NLID);b.find("[name=notice_data-geo]").attr("checked",SN.C.I.NoticeDataGeo.NDG)}})},FormProfileSearchXHR:function(a){$.ajax({type:"POST",dataType:"xml",url:a.attr("action"),data:a.serialize()+"&ajax=1",beforeSend:function(b){a.addClass(SN.C.S.Processing).find(".submit").addClass(SN.C.S.Disabled).attr(SN.C.S.Disabled,SN.C.S.Disabled)},error:function(c,d,b){alert(b||d)},success:function(d,f){var b=$("#profile_search_results");if(typeof($("ul",d)[0])!="undefined"){var c=document._importNode($("ul",d)[0],true);b.replaceWith(c)}else{var e=$("
    • ").append(document._importNode($("p",d)[0],true));b.html(e)}a.removeClass(SN.C.S.Processing).find(".submit").removeClass(SN.C.S.Disabled).attr(SN.C.S.Disabled,false)}})},FormPeopletagsXHR:function(a){$.ajax({type:"POST",dataType:"xml",url:a.attr("action"),data:a.serialize()+"&ajax=1",beforeSend:function(b){a.find(".submit").addClass(SN.C.S.Processing).addClass(SN.C.S.Disabled).attr(SN.C.S.Disabled,SN.C.S.Disabled)},error:function(c,d,b){alert(b||d)},success:function(d,e){var c=a.parents(".entity_tags");if(typeof($(".entity_tags",d)[0])!="undefined"){var b=document._importNode($(".entity_tags",d)[0],true);$(b).find(".editable").append($('').closest(".notice-options").addClass("opaque");a.find("button.close").click(function(){$(this).remove();a.removeClass("dialogbox").closest(".notice-options").removeClass("opaque");a.find(".submit_dialogbox").remove();a.find(".submit").show();return false})},NoticeAttachments:function(){$(".notice a.attachment").each(function(){SN.U.NoticeWithAttachment($(this).closest(".notice"))})},NoticeWithAttachment:function(b){if(b.find(".attachment").length===0){return}var a=b.find(".attachment.more");if(a.length>0){$(a[0]).click(function(){var c=$(this);c.addClass(SN.C.S.Processing);$.get(c.attr("href")+"/ajax",null,function(d){c.parent(".entry-content").html($(d).find("#attachment_view .entry-content").html())});return false}).attr("title",SN.msg("showmore_tooltip"))}},NoticeDataAttach:function(b){var a=b.find("input[type=file]");a.change(function(f){b.find(".attach-status").remove();var d=$(this).val();if(!d){return false}var c=$('
      ');c.find("code").text(d);c.find("button").click(function(){c.remove();a.val("");return false});b.append(c);if(typeof this.files=="object"){for(var e=0;eg){f=false}if(f){h(c,function(k){var j=$("").attr("title",e).attr("alt",e).attr("src",k).attr("style","height: 120px");d.find(".attach-status").append(j)})}else{var b=$("
      ").text(e);d.find(".attach-status").append(b)}},NoticeLocationAttach:function(a){var e=a.find("[name=lat]");var l=a.find("[name=lon]");var g=a.find("[name=location_ns]").val();var m=a.find("[name=location_id]").val();var b="";var d=a.find("[name=notice_data-geo]");var c=a.find("[name=notice_data-geo]");var k=a.find("label.notice_data-geo");function f(o){k.attr("title",jQuery.trim(k.text())).removeClass("checked");a.find("[name=lat]").val("");a.find("[name=lon]").val("");a.find("[name=location_ns]").val("");a.find("[name=location_id]").val("");a.find("[name=notice_data-geo]").attr("checked",false);$.cookie(SN.C.S.NoticeDataGeoCookie,"disabled",{path:"/"});if(o){a.find(".geo_status_wrapper").removeClass("success").addClass("error");a.find(".geo_status_wrapper .geo_status").text(o)}else{a.find(".geo_status_wrapper").remove()}}function n(o,p){SN.U.NoticeGeoStatus(a,"Looking up place name...");$.getJSON(o,p,function(q){var r,s;if(typeof(q.location_ns)!="undefined"){a.find("[name=location_ns]").val(q.location_ns);r=q.location_ns}if(typeof(q.location_id)!="undefined"){a.find("[name=location_id]").val(q.location_id);s=q.location_id}if(typeof(q.name)=="undefined"){NLN_text=p.lat+";"+p.lon}else{NLN_text=q.name}SN.U.NoticeGeoStatus(a,NLN_text,p.lat,p.lon,q.url);k.attr("title",NoticeDataGeo_text.ShareDisable+" ("+NLN_text+")");a.find("[name=lat]").val(p.lat);a.find("[name=lon]").val(p.lon);a.find("[name=location_ns]").val(r);a.find("[name=location_id]").val(s);a.find("[name=notice_data-geo]").attr("checked",true);var t={NLat:p.lat,NLon:p.lon,NLNS:r,NLID:s,NLN:NLN_text,NLNU:q.url,NDG:true};$.cookie(SN.C.S.NoticeDataGeoCookie,JSON.stringify(t),{path:"/"})})}if(c.length>0){if($.cookie(SN.C.S.NoticeDataGeoCookie)=="disabled"){c.attr("checked",false)}else{c.attr("checked",true)}var h=a.find(".notice_data-geo_wrap");var j=h.attr("data-api");k.attr("title",k.text());c.change(function(){if(c.attr("checked")===true||$.cookie(SN.C.S.NoticeDataGeoCookie)===null){k.attr("title",NoticeDataGeo_text.ShareDisable).addClass("checked");if($.cookie(SN.C.S.NoticeDataGeoCookie)===null||$.cookie(SN.C.S.NoticeDataGeoCookie)=="disabled"){if(navigator.geolocation){SN.U.NoticeGeoStatus(a,"Requesting location from browser...");navigator.geolocation.getCurrentPosition(function(q){a.find("[name=lat]").val(q.coords.latitude);a.find("[name=lon]").val(q.coords.longitude);var r={lat:q.coords.latitude,lon:q.coords.longitude,token:$("#token").val()};n(j,r)},function(q){switch(q.code){case q.PERMISSION_DENIED:f("Location permission denied.");break;case q.TIMEOUT:f("Location lookup timeout.");break}},{timeout:10000})}else{if(e.length>0&&l.length>0){var o={lat:e,lon:l,token:$("#token").val()};n(j,o)}else{f();c.remove();k.remove()}}}else{var p=JSON.parse($.cookie(SN.C.S.NoticeDataGeoCookie));a.find("[name=lat]").val(p.NLat);a.find("[name=lon]").val(p.NLon);a.find("[name=location_ns]").val(p.NLNS);a.find("[name=location_id]").val(p.NLID);a.find("[name=notice_data-geo]").attr("checked",p.NDG);SN.U.NoticeGeoStatus(a,p.NLN,p.NLat,p.NLon,p.NLNU);k.attr("title",NoticeDataGeo_text.ShareDisable+" ("+p.NLN+")").addClass("checked")}}else{f()}}).change()}},NoticeGeoStatus:function(e,a,f,g,c){var h=e.find(".geo_status_wrapper");if(h.length==0){h=$('
      ');h.find("button.close").click(function(){e.find("[name=notice_data-geo]").removeAttr("checked").change();return false});e.append(h)}var b;if(c){b=$("").attr("href",c)}else{b=$("")}b.text(a);if(f||g){var d=f+";"+g;b.attr("title",d);if(!a){b.text(d)}}h.find(".geo_status").empty().append(b)},NewDirectMessage:function(){NDM=$(".entity_send-a-message a");NDM.attr({href:NDM.attr("href")+"&ajax=1"});NDM.bind("click",function(){var a=$(".entity_send-a-message form");if(a.length===0){$(this).addClass(SN.C.S.Processing);$.get(NDM.attr("href"),null,function(b){$(".entity_send-a-message").append(document._importNode($("form",b)[0],true));a=$(".entity_send-a-message .form_notice");SN.U.FormNoticeXHR(a);SN.U.FormNoticeEnhancements(a);a.append('');$(".entity_send-a-message button").click(function(){a.hide();return false});NDM.removeClass(SN.C.S.Processing)})}else{a.show();$(".entity_send-a-message textarea").focus()}return false})},GetFullYear:function(c,d,a){var b=new Date();b.setFullYear(c,d,a);return b},StatusNetInstance:{Set:function(b){var a=SN.U.StatusNetInstance.Get();if(a!==null){b=$.extend(a,b)}$.cookie(SN.C.S.StatusNetInstance,JSON.stringify(b),{path:"/",expires:SN.U.GetFullYear(2029,0,1)})},Get:function(){var a=$.cookie(SN.C.S.StatusNetInstance);if(a!==null){return JSON.parse(a)}return null},Delete:function(){$.cookie(SN.C.S.StatusNetInstance,null)}},belongsOnTimeline:function(b){var a=$("body").attr("id");if(a=="public"){return true}var c=$("#nav_profile a").attr("href");if(c){var d=$(b).find(".vcard.author a.url").attr("href");if(d==c){if(a=="all"||a=="showstream"){return true}}}return false},switchInputFormTab:function(a){$(".input_form_nav_tab.current").removeClass("current");if(a=="placeholder"){$("#input_form_nav_status").addClass("current")}else{$("#input_form_nav_"+a).addClass("current")}var b=$(".input_form.current.nonav");if(b.length>0){return}$(".input_form.current").removeClass("current");$("#input_form_"+a).addClass("current").find(".ajax-notice").each(function(){var c=$(this);SN.Init.NoticeFormSetup(c)}).find(".notice_data-text").focus()}},Init:{NoticeForm:function(){if($("body.user_in").length>0){$("#input_form_placeholder input.placeholder").focus(function(){SN.U.switchInputFormTab("status")});$("body").bind("click",function(g){var d=$("#content .input_forms div.current");if(d.length>0){if($("#content .input_forms").has(g.target).length==0){var a=d.find('textarea, input[type=text], input[type=""]');var c=false;a.each(function(){c=c||$(this).val()});if(!c){SN.U.switchInputFormTab("placeholder")}}}var b=$("li.notice-reply");if(b.length>0){var f=$(g.target);b.each(function(){var k=$(this);if(k.has(g.target).length==0){var h=k.find(".notice_data-text:first");var j=$.trim(h.val());if(j==""||j==h.data("initialText")){var e=k.closest("li.notice");k.remove();e.find("li.notice-reply-placeholder").show()}}})}});$(".input_forms fieldset fieldset label").inFieldLabels({fadeOpacity:0})}},NoticeFormSetup:function(a){if(!a.data("NoticeFormSetup")){SN.U.NoticeLocationAttach(a);SN.U.FormNoticeXHR(a);SN.U.FormNoticeEnhancements(a);SN.U.NoticeDataAttach(a);a.data("NoticeFormSetup",true)}},Notices:function(){if($("body.user_in").length>0){var a=$(".form_notice:first");if(a.length>0){SN.C.I.NoticeFormMaster=document._importNode(a[0],true)}SN.U.NoticeRepeat();SN.U.NoticeReply();SN.U.NoticeInlineReplySetup()}SN.U.NoticeAttachments()},EntityActions:function(){if($("body.user_in").length>0){$(".form_user_subscribe").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_user_unsubscribe").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_group_join").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_group_leave").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_user_nudge").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_peopletag_subscribe").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_peopletag_unsubscribe").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_user_add_peopletag").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_user_remove_peopletag").live("click",function(){SN.U.FormXHR($(this));return false});SN.U.NewDirectMessage()}},ProfileSearch:function(){if($("body.user_in").length>0){$(".form_peopletag_edit_user_search input.submit").live("click",function(){SN.U.FormProfileSearchXHR($(this).parents("form"));return false})}},Login:function(){if(SN.U.StatusNetInstance.Get()!==null){var a=SN.U.StatusNetInstance.Get().Nickname;if(a!==null){$("#form_login #nickname").val(a)}}$("#form_login").bind("submit",function(){SN.U.StatusNetInstance.Set({Nickname:$("#form_login #nickname").val()});return true})},PeopletagAutocomplete:function(b){var a=function(d){return d.split(/\s+/)};var c=function(d){return a(d).pop()};b.live("keydown",function(d){if(d.keyCode===$.ui.keyCode.TAB&&$(this).data("autocomplete").menu.active){d.preventDefault()}}).autocomplete({minLength:0,source:function(e,d){d($.ui.autocomplete.filter(SN.C.PtagACData,c(e.term)))},focus:function(){return false},select:function(e,f){var d=a(this.value);d.pop();d.push(f.item.value);d.push("");this.value=d.join(" ");return false}}).data("autocomplete")._renderItem=function(e,f){var d=''+f.tag+' '+f.mode+''+f.freq+"";return $("
    • ").addClass("mode-"+f.mode).addClass("ptag-ac-line").data("item.autocomplete",f).append(d).appendTo(e)}},PeopleTags:function(){$(".user_profile_tags .editable").append($('').closest(".notice-options").addClass("opaque");a.find("button.close").click(function(){$(this).remove();a.removeClass("dialogbox").closest(".notice-options").removeClass("opaque");a.find(".submit_dialogbox").remove();a.find(".submit").show();return false})},NoticeAttachments:function(){$(".notice a.attachment").each(function(){SN.U.NoticeWithAttachment($(this).closest(".notice"))})},NoticeWithAttachment:function(b){if(b.find(".attachment").length===0){return}var a=b.find(".attachment.more");if(a.length>0){$(a[0]).click(function(){var c=$(this);c.addClass(SN.C.S.Processing);$.get(c.attr("href")+"/ajax",null,function(d){c.parent(".entry-content").html($(d).find("#attachment_view .entry-content").html())});return false}).attr("title",SN.msg("showmore_tooltip"))}},NoticeDataAttach:function(b){var a=b.find("input[type=file]");a.change(function(f){b.find(".attach-status").remove();var d=$(this).val();if(!d){return false}var c=$('
      ');c.find("code").text(d);c.find("button").click(function(){c.remove();a.val("");return false});b.append(c);if(typeof this.files=="object"){for(var e=0;eg){f=false}if(f){h(c,function(k){var j=$("").attr("title",e).attr("alt",e).attr("src",k).attr("style","height: 120px");d.find(".attach-status").append(j)})}else{var b=$("
      ").text(e);d.find(".attach-status").append(b)}},NoticeLocationAttach:function(a){var e=a.find("[name=lat]");var l=a.find("[name=lon]");var g=a.find("[name=location_ns]").val();var m=a.find("[name=location_id]").val();var b="";var d=a.find("[name=notice_data-geo]");var c=a.find("[name=notice_data-geo]");var k=a.find("label.notice_data-geo");function f(o){k.attr("title",jQuery.trim(k.text())).removeClass("checked");a.find("[name=lat]").val("");a.find("[name=lon]").val("");a.find("[name=location_ns]").val("");a.find("[name=location_id]").val("");a.find("[name=notice_data-geo]").attr("checked",false);$.cookie(SN.C.S.NoticeDataGeoCookie,"disabled",{path:"/"});if(o){a.find(".geo_status_wrapper").removeClass("success").addClass("error");a.find(".geo_status_wrapper .geo_status").text(o)}else{a.find(".geo_status_wrapper").remove()}}function n(o,p){SN.U.NoticeGeoStatus(a,"Looking up place name...");$.getJSON(o,p,function(q){var r,s;if(typeof(q.location_ns)!="undefined"){a.find("[name=location_ns]").val(q.location_ns);r=q.location_ns}if(typeof(q.location_id)!="undefined"){a.find("[name=location_id]").val(q.location_id);s=q.location_id}if(typeof(q.name)=="undefined"){NLN_text=p.lat+";"+p.lon}else{NLN_text=q.name}SN.U.NoticeGeoStatus(a,NLN_text,p.lat,p.lon,q.url);k.attr("title",NoticeDataGeo_text.ShareDisable+" ("+NLN_text+")");a.find("[name=lat]").val(p.lat);a.find("[name=lon]").val(p.lon);a.find("[name=location_ns]").val(r);a.find("[name=location_id]").val(s);a.find("[name=notice_data-geo]").attr("checked",true);var t={NLat:p.lat,NLon:p.lon,NLNS:r,NLID:s,NLN:NLN_text,NLNU:q.url,NDG:true};$.cookie(SN.C.S.NoticeDataGeoCookie,JSON.stringify(t),{path:"/"})})}if(c.length>0){if($.cookie(SN.C.S.NoticeDataGeoCookie)=="disabled"){c.attr("checked",false)}else{c.attr("checked",true)}var h=a.find(".notice_data-geo_wrap");var j=h.attr("data-api");k.attr("title",k.text());c.change(function(){if(c.attr("checked")===true||$.cookie(SN.C.S.NoticeDataGeoCookie)===null){k.attr("title",NoticeDataGeo_text.ShareDisable).addClass("checked");if($.cookie(SN.C.S.NoticeDataGeoCookie)===null||$.cookie(SN.C.S.NoticeDataGeoCookie)=="disabled"){if(navigator.geolocation){SN.U.NoticeGeoStatus(a,"Requesting location from browser...");navigator.geolocation.getCurrentPosition(function(q){a.find("[name=lat]").val(q.coords.latitude);a.find("[name=lon]").val(q.coords.longitude);var r={lat:q.coords.latitude,lon:q.coords.longitude,token:$("#token").val()};n(j,r)},function(q){switch(q.code){case q.PERMISSION_DENIED:f("Location permission denied.");break;case q.TIMEOUT:f("Location lookup timeout.");break}},{timeout:10000})}else{if(e.length>0&&l.length>0){var o={lat:e,lon:l,token:$("#token").val()};n(j,o)}else{f();c.remove();k.remove()}}}else{var p=JSON.parse($.cookie(SN.C.S.NoticeDataGeoCookie));a.find("[name=lat]").val(p.NLat);a.find("[name=lon]").val(p.NLon);a.find("[name=location_ns]").val(p.NLNS);a.find("[name=location_id]").val(p.NLID);a.find("[name=notice_data-geo]").attr("checked",p.NDG);SN.U.NoticeGeoStatus(a,p.NLN,p.NLat,p.NLon,p.NLNU);k.attr("title",NoticeDataGeo_text.ShareDisable+" ("+p.NLN+")").addClass("checked")}}else{f()}}).change()}},NoticeGeoStatus:function(e,a,f,g,c){var h=e.find(".geo_status_wrapper");if(h.length==0){h=$('
      ');h.find("button.close").click(function(){e.find("[name=notice_data-geo]").removeAttr("checked").change();return false});e.append(h)}var b;if(c){b=$("").attr("href",c)}else{b=$("")}b.text(a);if(f||g){var d=f+";"+g;b.attr("title",d);if(!a){b.text(d)}}h.find(".geo_status").empty().append(b)},NewDirectMessage:function(){NDM=$(".entity_send-a-message a");NDM.attr({href:NDM.attr("href")+"&ajax=1"});NDM.bind("click",function(){var a=$(".entity_send-a-message form");if(a.length===0){$(this).addClass(SN.C.S.Processing);$.get(NDM.attr("href"),null,function(b){$(".entity_send-a-message").append(document._importNode($("form",b)[0],true));a=$(".entity_send-a-message .form_notice");SN.U.FormNoticeXHR(a);SN.U.FormNoticeEnhancements(a);a.append('');$(".entity_send-a-message button").click(function(){a.hide();return false});NDM.removeClass(SN.C.S.Processing)})}else{a.show();$(".entity_send-a-message textarea").focus()}return false})},GetFullYear:function(c,d,a){var b=new Date();b.setFullYear(c,d,a);return b},StatusNetInstance:{Set:function(b){var a=SN.U.StatusNetInstance.Get();if(a!==null){b=$.extend(a,b)}$.cookie(SN.C.S.StatusNetInstance,JSON.stringify(b),{path:"/",expires:SN.U.GetFullYear(2029,0,1)})},Get:function(){var a=$.cookie(SN.C.S.StatusNetInstance);if(a!==null){return JSON.parse(a)}return null},Delete:function(){$.cookie(SN.C.S.StatusNetInstance,null)}},belongsOnTimeline:function(b){var a=$("body").attr("id");if(a=="public"){return true}var c=$("#nav_profile a").attr("href");if(c){var d=$(b).find(".vcard.author a.url").attr("href");if(d==c){if(a=="all"||a=="showstream"){return true}}}return false},switchInputFormTab:function(a){$(".input_form_nav_tab.current").removeClass("current");if(a=="placeholder"){$("#input_form_nav_status").addClass("current")}else{$("#input_form_nav_"+a).addClass("current")}var b=$(".input_form.current.nonav");if(b.length>0){return}$(".input_form.current").removeClass("current");$("#input_form_"+a).addClass("current").find(".ajax-notice").each(function(){var c=$(this);SN.Init.NoticeFormSetup(c)}).find(".notice_data-text").focus()},showMoreMenuItems:function(c){$("#"+c+" .more_link").remove();var b="#"+c+" .extended_menu";var a=$(b);a.removeClass("extended_menu");return void (0)}},Init:{NoticeForm:function(){if($("body.user_in").length>0){$("#input_form_placeholder input.placeholder").focus(function(){SN.U.switchInputFormTab("status")});$("body").bind("click",function(g){var d=$("#content .input_forms div.current");if(d.length>0){if($("#content .input_forms").has(g.target).length==0){var a=d.find('textarea, input[type=text], input[type=""]');var c=false;a.each(function(){c=c||$(this).val()});if(!c){SN.U.switchInputFormTab("placeholder")}}}var b=$("li.notice-reply");if(b.length>0){var f=$(g.target);b.each(function(){var k=$(this);if(k.has(g.target).length==0){var h=k.find(".notice_data-text:first");var j=$.trim(h.val());if(j==""||j==h.data("initialText")){var e=k.closest("li.notice");k.remove();e.find("li.notice-reply-placeholder").show()}}})}});$(".input_forms fieldset fieldset label").inFieldLabels({fadeOpacity:0})}},NoticeFormSetup:function(a){if(!a.data("NoticeFormSetup")){SN.U.NoticeLocationAttach(a);SN.U.FormNoticeXHR(a);SN.U.FormNoticeEnhancements(a);SN.U.NoticeDataAttach(a);a.data("NoticeFormSetup",true)}},Notices:function(){if($("body.user_in").length>0){var a=$(".form_notice:first");if(a.length>0){SN.C.I.NoticeFormMaster=document._importNode(a[0],true)}SN.U.NoticeRepeat();SN.U.NoticeReply();SN.U.NoticeInlineReplySetup()}SN.U.NoticeAttachments()},EntityActions:function(){if($("body.user_in").length>0){$(".form_user_subscribe").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_user_unsubscribe").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_group_join").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_group_leave").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_user_nudge").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_peopletag_subscribe").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_peopletag_unsubscribe").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_user_add_peopletag").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_user_remove_peopletag").live("click",function(){SN.U.FormXHR($(this));return false});SN.U.NewDirectMessage()}},ProfileSearch:function(){if($("body.user_in").length>0){$(".form_peopletag_edit_user_search input.submit").live("click",function(){SN.U.FormProfileSearchXHR($(this).parents("form"));return false})}},Login:function(){if(SN.U.StatusNetInstance.Get()!==null){var a=SN.U.StatusNetInstance.Get().Nickname;if(a!==null){$("#form_login #nickname").val(a)}}$("#form_login").bind("submit",function(){SN.U.StatusNetInstance.Set({Nickname:$("#form_login #nickname").val()});return true})},PeopletagAutocomplete:function(b){var a=function(d){return d.split(/\s+/)};var c=function(d){return a(d).pop()};b.live("keydown",function(d){if(d.keyCode===$.ui.keyCode.TAB&&$(this).data("autocomplete").menu.active){d.preventDefault()}}).autocomplete({minLength:0,source:function(e,d){d($.ui.autocomplete.filter(SN.C.PtagACData,c(e.term)))},focus:function(){return false},select:function(e,f){var d=a(this.value);d.pop();d.push(f.item.value);d.push("");this.value=d.join(" ");return false}}).data("autocomplete")._renderItem=function(e,f){var d=''+f.tag+' '+f.mode+''+f.freq+"";return $("
    • ").addClass("mode-"+f.mode).addClass("ptag-ac-line").data("item.autocomplete",f).append(d).appendTo(e)}},PeopleTags:function(){$(".user_profile_tags .editable").append($('
    • ');$("#realtime_pause").text(SN.msg("realtime_pause")).attr("title",SN.msg("realtime_pause_tooltip")).bind("click",function(){RealtimeUpdate.removeNoticesHover();RealtimeUpdate.showPlay();return false})},showPlay:function(){RealtimeUpdate.setPause(true);$("#realtime_playpause").remove();$("#realtime_actions").prepend('
    • ');$("#realtime_play").text(SN.msg("realtime_play")).attr("title",SN.msg("realtime_play_tooltip")).bind("click",function(){RealtimeUpdate.showPause();return false})},setPause:function(a){RealtimeUpdate._paused=a;if(typeof(localStorage)!="undefined"){localStorage.setItem("RealtimeUpdate_paused",RealtimeUpdate._paused)}},showQueuedNotices:function(){$.each(RealtimeUpdate._queuedNotices,function(a,b){RealtimeUpdate.insertNoticeItem(b)});RealtimeUpdate._queuedNotices=[];RealtimeUpdate.removeQueuedCounter()},updateQueuedCounter:function(){$("#realtime_playpause #queued_counter").html("("+RealtimeUpdate._queuedNotices.length+")")},removeQueuedCounter:function(){$("#realtime_playpause #queued_counter").empty()},addNoticesHover:function(){$("#notices_primary .notices").hover(function(){if(RealtimeUpdate._paused===false){RealtimeUpdate.showPlay()}},function(){if(RealtimeUpdate._paused===true){RealtimeUpdate.showPause()}})},removeNoticesHover:function(){$("#notices_primary .notices").unbind()},initAddPopup:function(a,b,c){$("#realtime_timeline").append('');$("#realtime_popup").text(SN.msg("realtime_popup")).attr("title",SN.msg("realtime_popup_tooltip")).bind("click",function(){window.open(a,"","toolbar=no,resizable=yes,scrollbars=yes,status=no,menubar=no,personalbar=no,location=no,width=500,height=550");return false})},initPopupWindow:function(){$(".notices .entry-title a, .notices .entry-content a").bind("click",function(){window.open(this.href,"");return false});$("#showstream .entity_profile").css({width:"69%"})}}; \ No newline at end of file +RealtimeUpdate={_userid:0,_showurl:"",_keepaliveurl:"",_closeurl:"",_updatecounter:0,_maxnotices:50,_windowhasfocus:true,_documenttitle:"",_paused:false,_queuedNotices:[],init:function(a,b){RealtimeUpdate._userid=a;RealtimeUpdate._showurl=b;RealtimeUpdate._documenttitle=document.title;$(window).bind("focus",function(){RealtimeUpdate._windowhasfocus=true;RealtimeUpdate._updatecounter=0;RealtimeUpdate.removeWindowCounter()});$(window).bind("blur",function(){$("#notices_primary .notice").removeClass("mark-top");$("#notices_primary .notice:first").addClass("mark-top");RealtimeUpdate._windowhasfocus=false;return false})},receive:function(a){if(RealtimeUpdate.isNoticeVisible(a.id)){return}if(RealtimeUpdate._paused===false){RealtimeUpdate.purgeLastNoticeItem();RealtimeUpdate.insertNoticeItem(a)}else{RealtimeUpdate._queuedNotices.push(a);RealtimeUpdate.updateQueuedCounter()}RealtimeUpdate.updateWindowCounter()},insertNoticeItem:function(a){if(RealtimeUpdate.isNoticeVisible(a.id)){return}RealtimeUpdate.makeNoticeItem(a,function(b){if(RealtimeUpdate.isNoticeVisible(a.id)){return}var c=$(b).attr("id");var d=$("#notices_primary .notices:first");var j=true;var e=d.hasClass("threaded-notices");if(e&&a.in_reply_to_status_id){var g=$("#notice-"+a.in_reply_to_status_id);if(g.length==0){}else{var h=g.closest(".notices");if(h.hasClass("threaded-replies")){g=h.closest(".notice")}d=g.find(".threaded-replies");if(d.length==0){d=$('
        ');g.append(d);SN.U.NoticeInlineReplyPlaceholder(g)}j=false}}var i=$(b);if(j){d.prepend(i)}else{var f=d.find("li.notice-reply-placeholder");if(f.length>0){i.insertBefore(f)}else{i.appendTo(d)}}i.css({display:"none"}).fadeIn(1000);SN.U.NoticeReplyTo($("#"+c));SN.U.NoticeWithAttachment($("#"+c))})},isNoticeVisible:function(a){return($("#notice-"+a).length>0)},purgeLastNoticeItem:function(){if($("#notices_primary .notice").length>RealtimeUpdate._maxnotices){$("#notices_primary .notice:last").remove()}},updateWindowCounter:function(){if(RealtimeUpdate._windowhasfocus===false){RealtimeUpdate._updatecounter+=1;document.title="("+RealtimeUpdate._updatecounter+") "+RealtimeUpdate._documenttitle}},removeWindowCounter:function(){document.title=RealtimeUpdate._documenttitle},makeNoticeItem:function(b,c){var a=RealtimeUpdate._showurl.replace("0000000000",b.id);$.get(a,{ajax:1},function(f,h,g){var e=$("li.notice:first",f);if(e.length){var d=document._importNode(e[0],true);c(d)}})},makeFavoriteForm:function(c,b){var a;a='
        Favor this notice
        ';return a},makeReplyLink:function(c,a){var b;b='Reply '+c+"";return b},makeRepeatForm:function(c,b){var a;a='
        Repeat this notice?
        ';return a},makeDeleteLink:function(c){var b,a;a=RealtimeUpdate._deleteurl.replace("0000000000",c);b='Delete';return b},initActions:function(a,c,d,b,e){$("#notices_primary").prepend('
        ');RealtimeUpdate._pluginPath=d;RealtimeUpdate._keepaliveurl=b;RealtimeUpdate._closeurl=e;$(window).unload(function(){$.ajax({type:"POST",url:RealtimeUpdate._closeurl})});setInterval(function(){$.ajax({type:"POST",url:RealtimeUpdate._keepaliveurl})},15*60*1000);RealtimeUpdate.initPlayPause();RealtimeUpdate.initAddPopup(a,c,RealtimeUpdate._pluginPath)},initPlayPause:function(){if(typeof(localStorage)=="undefined"){RealtimeUpdate.showPause()}else{if(localStorage.getItem("RealtimeUpdate_paused")==="true"){RealtimeUpdate.showPlay()}else{RealtimeUpdate.showPause()}}},showPause:function(){RealtimeUpdate.setPause(false);RealtimeUpdate.showQueuedNotices();RealtimeUpdate.addNoticesHover();$("#realtime_playpause").remove();$("#realtime_actions").prepend('
      • ');$("#realtime_pause").text(SN.msg("realtime_pause")).attr("title",SN.msg("realtime_pause_tooltip")).bind("click",function(){RealtimeUpdate.removeNoticesHover();RealtimeUpdate.showPlay();return false})},showPlay:function(){RealtimeUpdate.setPause(true);$("#realtime_playpause").remove();$("#realtime_actions").prepend('
      • ');$("#realtime_play").text(SN.msg("realtime_play")).attr("title",SN.msg("realtime_play_tooltip")).bind("click",function(){RealtimeUpdate.showPause();return false})},setPause:function(a){RealtimeUpdate._paused=a;if(typeof(localStorage)!="undefined"){localStorage.setItem("RealtimeUpdate_paused",RealtimeUpdate._paused)}},showQueuedNotices:function(){$.each(RealtimeUpdate._queuedNotices,function(a,b){RealtimeUpdate.insertNoticeItem(b)});RealtimeUpdate._queuedNotices=[];RealtimeUpdate.removeQueuedCounter()},updateQueuedCounter:function(){$("#realtime_playpause #queued_counter").html("("+RealtimeUpdate._queuedNotices.length+")")},removeQueuedCounter:function(){$("#realtime_playpause #queued_counter").empty()},addNoticesHover:function(){$("#notices_primary .notices").hover(function(){if(RealtimeUpdate._paused===false){RealtimeUpdate.showPlay()}},function(){if(RealtimeUpdate._paused===true){RealtimeUpdate.showPause()}})},removeNoticesHover:function(){$("#notices_primary .notices").unbind()},initAddPopup:function(a,b,c){$("#realtime_timeline").append('');$("#realtime_popup").text(SN.msg("realtime_popup")).attr("title",SN.msg("realtime_popup_tooltip")).bind("click",function(){window.open(a,"","toolbar=no,resizable=yes,scrollbars=yes,status=no,menubar=no,personalbar=no,location=no,width=500,height=550");return false})},initPopupWindow:function(){$(".notices .entry-title a, .notices .entry-content a").bind("click",function(){window.open(this.href,"");return false});$("#showstream .entity_profile").css({width:"69%"})}}; \ No newline at end of file diff --git a/plugins/Recaptcha/RecaptchaPlugin.php b/plugins/Recaptcha/RecaptchaPlugin.php index fbc0e0cac1..73a2dcc76a 100644 --- a/plugins/Recaptcha/RecaptchaPlugin.php +++ b/plugins/Recaptcha/RecaptchaPlugin.php @@ -54,6 +54,7 @@ class RecaptchaPlugin extends Plugin function onEndRegistrationFormData($action) { $action->elementStart('li'); + // TRANS: Field label. $action->raw(''); // AJAX API will fill this div out. @@ -93,9 +94,12 @@ class RecaptchaPlugin extends Plugin if (!$resp->is_valid) { if($this->display_errors) { - $action->showForm(sprintf(_m("(reCAPTCHA error: %s)", $resp->error))); + // TRANS: Error message displayed if there is in error communicating with the + // TRANS: reCAPTCHA server. %s is the error. + $action->showForm(sprintf(_m('(reCAPTCHA error: %s)', $resp->error))); } - $action->showForm(_m("Captcha does not match!")); + // TRANS: Error message displayed if a provided captcha response does not match. + $action->showForm(_m('Captcha does not match!')); return false; } } @@ -107,6 +111,7 @@ class RecaptchaPlugin extends Plugin 'author' => 'Eric Helgeson', 'homepage' => 'http://status.net/wiki/Plugin:Recaptcha', 'rawdescription' => + // TRANS: Plugin description. _m('Uses Recaptcha service to add a '. 'captcha to the registration page.')); return true; diff --git a/plugins/Recaptcha/locale/Recaptcha.pot b/plugins/Recaptcha/locale/Recaptcha.pot index 94307316b1..4bebaf3b65 100644 --- a/plugins/Recaptcha/locale/Recaptcha.pot +++ b/plugins/Recaptcha/locale/Recaptcha.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,15 +16,18 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: RecaptchaPlugin.php:57 +#. TRANS: Field label. +#: RecaptchaPlugin.php:58 msgid "Captcha" msgstr "" -#: RecaptchaPlugin.php:98 +#. TRANS: Error message displayed if a provided captcha response does not match. +#: RecaptchaPlugin.php:102 msgid "Captcha does not match!" msgstr "" -#: RecaptchaPlugin.php:110 +#. TRANS: Plugin description. +#: RecaptchaPlugin.php:115 msgid "" "Uses Recaptcha service to add a " "captcha to the registration page." diff --git a/plugins/Recaptcha/locale/ca/LC_MESSAGES/Recaptcha.po b/plugins/Recaptcha/locale/ca/LC_MESSAGES/Recaptcha.po index 3f32959598..b58605b7fd 100644 --- a/plugins/Recaptcha/locale/ca/LC_MESSAGES/Recaptcha.po +++ b/plugins/Recaptcha/locale/ca/LC_MESSAGES/Recaptcha.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - Recaptcha to Catalan (Català) +# Translation of StatusNet - Recaptcha to Catalan (català) # Exported from translatewiki.net # # Author: Toniher @@ -9,24 +9,27 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Recaptcha\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:01+0000\n" -"Language-Team: Catalan \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:47+0000\n" +"Language-Team: Catalan \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-16 23:18:53+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:24+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ca\n" "X-Message-Group: #out-statusnet-plugin-recaptcha\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Field label. msgid "Captcha" msgstr "Captcha" +#. TRANS: Error message displayed if a provided captcha response does not match. msgid "Captcha does not match!" msgstr "El Captcha no coincideix!" +#. TRANS: Plugin description. msgid "" "Uses Recaptcha service to add a " "captcha to the registration page." diff --git a/plugins/Recaptcha/locale/de/LC_MESSAGES/Recaptcha.po b/plugins/Recaptcha/locale/de/LC_MESSAGES/Recaptcha.po index 6f60e4843b..fc6e346408 100644 --- a/plugins/Recaptcha/locale/de/LC_MESSAGES/Recaptcha.po +++ b/plugins/Recaptcha/locale/de/LC_MESSAGES/Recaptcha.po @@ -10,24 +10,27 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Recaptcha\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:01+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:47+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-16 23:18:53+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:24+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-recaptcha\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Field label. msgid "Captcha" msgstr "Captcha" +#. TRANS: Error message displayed if a provided captcha response does not match. msgid "Captcha does not match!" msgstr "Captcha stimmt nicht mit Text überein!" +#. TRANS: Plugin description. msgid "" "Uses Recaptcha service to add a " "captcha to the registration page." diff --git a/plugins/Recaptcha/locale/es/LC_MESSAGES/Recaptcha.po b/plugins/Recaptcha/locale/es/LC_MESSAGES/Recaptcha.po new file mode 100644 index 0000000000..f62215aab7 --- /dev/null +++ b/plugins/Recaptcha/locale/es/LC_MESSAGES/Recaptcha.po @@ -0,0 +1,35 @@ +# Translation of StatusNet - Recaptcha to Spanish (español) +# Exported from translatewiki.net +# +# Author: Armando-Martin +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Recaptcha\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:48+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:51:24+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Field label. +msgid "Captcha" +msgstr "Verificador Captcha" + +#. TRANS: Error message displayed if a provided captcha response does not match. +msgid "Captcha does not match!" +msgstr "¡El código de verificación Captcha no coincide!" + +#. TRANS: Plugin description. +msgid "" +"Uses Recaptcha service to add a " +"captcha to the registration page." +msgstr "" +"Use el servicio Recaptcha para añadir " +"un código de verificación Captcha a la página de registro." diff --git a/plugins/Recaptcha/locale/fr/LC_MESSAGES/Recaptcha.po b/plugins/Recaptcha/locale/fr/LC_MESSAGES/Recaptcha.po index 1f5a3607f5..f2e4f986ce 100644 --- a/plugins/Recaptcha/locale/fr/LC_MESSAGES/Recaptcha.po +++ b/plugins/Recaptcha/locale/fr/LC_MESSAGES/Recaptcha.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - Recaptcha to French (Français) +# Translation of StatusNet - Recaptcha to French (français) # Exported from translatewiki.net # # Author: Peter17 @@ -10,24 +10,27 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Recaptcha\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:01+0000\n" -"Language-Team: French \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:48+0000\n" +"Language-Team: French \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-16 23:18:53+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:24+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-recaptcha\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Field label. msgid "Captcha" msgstr "Vérificateur anti-robot Captcha" +#. TRANS: Error message displayed if a provided captcha response does not match. msgid "Captcha does not match!" msgstr "Le Captcha ne correspond pas !" +#. TRANS: Plugin description. msgid "" "Uses Recaptcha service to add a " "captcha to the registration page." diff --git a/plugins/Recaptcha/locale/fur/LC_MESSAGES/Recaptcha.po b/plugins/Recaptcha/locale/fur/LC_MESSAGES/Recaptcha.po index 355d0c9696..1974962a83 100644 --- a/plugins/Recaptcha/locale/fur/LC_MESSAGES/Recaptcha.po +++ b/plugins/Recaptcha/locale/fur/LC_MESSAGES/Recaptcha.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - Recaptcha to Friulian (Furlan) +# Translation of StatusNet - Recaptcha to Friulian (furlan) # Exported from translatewiki.net # # Author: Klenje @@ -9,24 +9,27 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Recaptcha\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:01+0000\n" -"Language-Team: Friulian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:48+0000\n" +"Language-Team: Friulian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-16 23:18:53+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:24+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fur\n" "X-Message-Group: #out-statusnet-plugin-recaptcha\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Field label. msgid "Captcha" msgstr "Captcha" +#. TRANS: Error message displayed if a provided captcha response does not match. msgid "Captcha does not match!" msgstr "Il Captcha nol corispuint!" +#. TRANS: Plugin description. msgid "" "Uses Recaptcha service to add a " "captcha to the registration page." diff --git a/plugins/Recaptcha/locale/gl/LC_MESSAGES/Recaptcha.po b/plugins/Recaptcha/locale/gl/LC_MESSAGES/Recaptcha.po new file mode 100644 index 0000000000..2f85db4ae5 --- /dev/null +++ b/plugins/Recaptcha/locale/gl/LC_MESSAGES/Recaptcha.po @@ -0,0 +1,38 @@ +# Translation of StatusNet - Recaptcha to Galician (galego) +# Exported from translatewiki.net +# +# Author: Toliño +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Recaptcha\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:48+0000\n" +"Language-Team: Galician \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:51:24+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: gl\n" +"X-Message-Group: #out-statusnet-plugin-recaptcha\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Field label. +msgid "Captcha" +msgstr "Captcha" + +#. TRANS: Error message displayed if a provided captcha response does not match. +msgid "Captcha does not match!" +msgstr "O captcha non coincide!" + +#. TRANS: Plugin description. +msgid "" +"Uses Recaptcha service to add a " +"captcha to the registration page." +msgstr "" +"Usa o servizo Recaptcha para engadir o " +"captcha á páxina de rexistro." diff --git a/plugins/Recaptcha/locale/ia/LC_MESSAGES/Recaptcha.po b/plugins/Recaptcha/locale/ia/LC_MESSAGES/Recaptcha.po index ae5c950a44..9f42ea4891 100644 --- a/plugins/Recaptcha/locale/ia/LC_MESSAGES/Recaptcha.po +++ b/plugins/Recaptcha/locale/ia/LC_MESSAGES/Recaptcha.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - Recaptcha to Interlingua (Interlingua) +# Translation of StatusNet - Recaptcha to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,24 +9,27 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Recaptcha\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:02+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:48+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-16 23:18:53+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:24+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-recaptcha\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Field label. msgid "Captcha" msgstr "Captcha" +#. TRANS: Error message displayed if a provided captcha response does not match. msgid "Captcha does not match!" msgstr "Captcha non corresponde!" +#. TRANS: Plugin description. msgid "" "Uses Recaptcha service to add a " "captcha to the registration page." diff --git a/plugins/Recaptcha/locale/mk/LC_MESSAGES/Recaptcha.po b/plugins/Recaptcha/locale/mk/LC_MESSAGES/Recaptcha.po index 282296c921..a3c2256025 100644 --- a/plugins/Recaptcha/locale/mk/LC_MESSAGES/Recaptcha.po +++ b/plugins/Recaptcha/locale/mk/LC_MESSAGES/Recaptcha.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - Recaptcha to Macedonian (МакедонÑки) +# Translation of StatusNet - Recaptcha to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 @@ -9,24 +9,27 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Recaptcha\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:02+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:48+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-16 23:18:53+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:24+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-recaptcha\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" +#. TRANS: Field label. msgid "Captcha" msgstr "Captcha" +#. TRANS: Error message displayed if a provided captcha response does not match. msgid "Captcha does not match!" msgstr "Captcha не Ñе Ñовпаѓа!" +#. TRANS: Plugin description. msgid "" "Uses Recaptcha service to add a " "captcha to the registration page." diff --git a/plugins/Recaptcha/locale/nb/LC_MESSAGES/Recaptcha.po b/plugins/Recaptcha/locale/nb/LC_MESSAGES/Recaptcha.po index 830e12c571..c7fb0f8da9 100644 --- a/plugins/Recaptcha/locale/nb/LC_MESSAGES/Recaptcha.po +++ b/plugins/Recaptcha/locale/nb/LC_MESSAGES/Recaptcha.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - Recaptcha to Norwegian (bokmÃ¥l)‬ (‪Norsk (bokmÃ¥l)‬) +# Translation of StatusNet - Recaptcha to Norwegian BokmÃ¥l (‪norsk (bokmÃ¥l)‬) # Exported from translatewiki.net # # Author: Nghtwlkr @@ -9,24 +9,27 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Recaptcha\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:02+0000\n" -"Language-Team: Norwegian (bokmÃ¥l)‬ \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:48+0000\n" +"Language-Team: Norwegian BokmÃ¥l \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-16 23:18:53+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" -"X-Language-Code: no\n" +"X-POT-Import-Date: 2011-06-05 21:51:24+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: nb\n" "X-Message-Group: #out-statusnet-plugin-recaptcha\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Field label. msgid "Captcha" msgstr "Captcha" +#. TRANS: Error message displayed if a provided captcha response does not match. msgid "Captcha does not match!" msgstr "Captcha stemmer ikke." +#. TRANS: Plugin description. msgid "" "Uses Recaptcha service to add a " "captcha to the registration page." diff --git a/plugins/Recaptcha/locale/nl/LC_MESSAGES/Recaptcha.po b/plugins/Recaptcha/locale/nl/LC_MESSAGES/Recaptcha.po index 4bdff1e62c..c30b9dc170 100644 --- a/plugins/Recaptcha/locale/nl/LC_MESSAGES/Recaptcha.po +++ b/plugins/Recaptcha/locale/nl/LC_MESSAGES/Recaptcha.po @@ -9,24 +9,27 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Recaptcha\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:02+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:48+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-16 23:18:53+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:24+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-recaptcha\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Field label. msgid "Captcha" msgstr "Captcha" +#. TRANS: Error message displayed if a provided captcha response does not match. msgid "Captcha does not match!" msgstr "Captcha komt niet overeen!" +#. TRANS: Plugin description. msgid "" "Uses Recaptcha service to add a " "captcha to the registration page." diff --git a/plugins/Recaptcha/locale/pl/LC_MESSAGES/Recaptcha.po b/plugins/Recaptcha/locale/pl/LC_MESSAGES/Recaptcha.po index 7aad4cff03..a5520e7026 100644 --- a/plugins/Recaptcha/locale/pl/LC_MESSAGES/Recaptcha.po +++ b/plugins/Recaptcha/locale/pl/LC_MESSAGES/Recaptcha.po @@ -1,7 +1,8 @@ -# Translation of StatusNet - Recaptcha to Polish (Polski) -# Expored from translatewiki.net +# Translation of StatusNet - Recaptcha to Polish (polski) +# Exported from translatewiki.net # # Author: Raven +# Author: Woytecr # -- # This file is distributed under the same license as the StatusNet package. # @@ -9,29 +10,31 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Recaptcha\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-12-16 15:08+0000\n" -"PO-Revision-Date: 2010-12-16 15:12:49+0000\n" -"Language-Team: Polish \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:48+0000\n" +"Language-Team: Polish \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-11-30 20:43:51+0000\n" -"X-Generator: MediaWiki 1.18alpha (r78478); Translate extension (2010-09-17)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:24+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: pl\n" "X-Message-Group: #out-statusnet-plugin-recaptcha\n" "Plural-Forms: nplurals=3; plural=(n == 1) ? 0 : ( (n%10 >= 2 && n%10 <= 4 && " "(n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" -#: RecaptchaPlugin.php:64 +#. TRANS: Field label. msgid "Captcha" msgstr "Captcha" -#: RecaptchaPlugin.php:105 +#. TRANS: Error message displayed if a provided captcha response does not match. msgid "Captcha does not match!" -msgstr "" +msgstr "Kod Captcha nie zostaÅ‚ przepisany prawidÅ‚owo!" -#: RecaptchaPlugin.php:117 +#. TRANS: Plugin description. msgid "" "Uses Recaptcha service to add a " "captcha to the registration page." msgstr "" +"Używa serwisu Recaptcha aby umieÅ›cić " +"kod captcha na stronÄ™ rejestracji." diff --git a/plugins/Recaptcha/locale/pt/LC_MESSAGES/Recaptcha.po b/plugins/Recaptcha/locale/pt/LC_MESSAGES/Recaptcha.po index 56da14943e..5bbcfe98e6 100644 --- a/plugins/Recaptcha/locale/pt/LC_MESSAGES/Recaptcha.po +++ b/plugins/Recaptcha/locale/pt/LC_MESSAGES/Recaptcha.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - Recaptcha to Portuguese (Português) +# Translation of StatusNet - Recaptcha to Portuguese (português) # Exported from translatewiki.net # # Author: GTNS @@ -9,24 +9,27 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Recaptcha\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:02+0000\n" -"Language-Team: Portuguese \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:48+0000\n" +"Language-Team: Portuguese \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-16 23:18:53+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:24+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: pt\n" "X-Message-Group: #out-statusnet-plugin-recaptcha\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Field label. msgid "Captcha" msgstr "Imagem de verificação" +#. TRANS: Error message displayed if a provided captcha response does not match. msgid "Captcha does not match!" msgstr "A imagem de verificação não corresponde!" +#. TRANS: Plugin description. msgid "" "Uses Recaptcha service to add a " "captcha to the registration page." diff --git a/plugins/Recaptcha/locale/ru/LC_MESSAGES/Recaptcha.po b/plugins/Recaptcha/locale/ru/LC_MESSAGES/Recaptcha.po index 59857e822a..fcb10a821e 100644 --- a/plugins/Recaptcha/locale/ru/LC_MESSAGES/Recaptcha.po +++ b/plugins/Recaptcha/locale/ru/LC_MESSAGES/Recaptcha.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - Recaptcha to Russian (РуÑÑкий) +# Translation of StatusNet - Recaptcha to Russian (руÑÑкий) # Exported from translatewiki.net # # Author: Eleferen @@ -10,25 +10,28 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Recaptcha\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:02+0000\n" -"Language-Team: Russian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:48+0000\n" +"Language-Team: Russian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-16 23:18:53+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:24+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ru\n" "X-Message-Group: #out-statusnet-plugin-recaptcha\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Field label. msgid "Captcha" msgstr "Капча" +#. TRANS: Error message displayed if a provided captcha response does not match. msgid "Captcha does not match!" msgstr "Код проверки не Ñовпадает!" +#. TRANS: Plugin description. msgid "" "Uses Recaptcha service to add a " "captcha to the registration page." diff --git a/plugins/Recaptcha/locale/sv/LC_MESSAGES/Recaptcha.po b/plugins/Recaptcha/locale/sv/LC_MESSAGES/Recaptcha.po index 4d4bf5c266..64aaee3835 100644 --- a/plugins/Recaptcha/locale/sv/LC_MESSAGES/Recaptcha.po +++ b/plugins/Recaptcha/locale/sv/LC_MESSAGES/Recaptcha.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - Recaptcha to Swedish (Svenska) +# Translation of StatusNet - Recaptcha to Swedish (svenska) # Exported from translatewiki.net # # Author: Jamminjohn @@ -9,24 +9,27 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Recaptcha\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:02+0000\n" -"Language-Team: Swedish \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:49+0000\n" +"Language-Team: Swedish \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-16 23:18:53+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:24+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: sv\n" "X-Message-Group: #out-statusnet-plugin-recaptcha\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Field label. msgid "Captcha" msgstr "Captcha" +#. TRANS: Error message displayed if a provided captcha response does not match. msgid "Captcha does not match!" msgstr "Captcha stämmer inte!" +#. TRANS: Plugin description. msgid "" "Uses Recaptcha service to add a " "captcha to the registration page." diff --git a/plugins/Recaptcha/locale/tl/LC_MESSAGES/Recaptcha.po b/plugins/Recaptcha/locale/tl/LC_MESSAGES/Recaptcha.po index d3b23a69f3..84c33845d7 100644 --- a/plugins/Recaptcha/locale/tl/LC_MESSAGES/Recaptcha.po +++ b/plugins/Recaptcha/locale/tl/LC_MESSAGES/Recaptcha.po @@ -9,24 +9,27 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Recaptcha\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:02+0000\n" -"Language-Team: Tagalog \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:49+0000\n" +"Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-16 23:18:53+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:24+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-recaptcha\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Field label. msgid "Captcha" msgstr "Captcha" +#. TRANS: Error message displayed if a provided captcha response does not match. msgid "Captcha does not match!" msgstr "Hindi tugma ang Captcha!" +#. TRANS: Plugin description. msgid "" "Uses Recaptcha service to add a " "captcha to the registration page." diff --git a/plugins/Recaptcha/locale/uk/LC_MESSAGES/Recaptcha.po b/plugins/Recaptcha/locale/uk/LC_MESSAGES/Recaptcha.po index 8eccdd99d2..0c67de4e99 100644 --- a/plugins/Recaptcha/locale/uk/LC_MESSAGES/Recaptcha.po +++ b/plugins/Recaptcha/locale/uk/LC_MESSAGES/Recaptcha.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - Recaptcha to Ukrainian (УкраїнÑька) +# Translation of StatusNet - Recaptcha to Ukrainian (українÑька) # Exported from translatewiki.net # # Author: Boogie @@ -9,25 +9,28 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Recaptcha\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:02+0000\n" -"Language-Team: Ukrainian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:49+0000\n" +"Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-16 23:18:53+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:24+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-recaptcha\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Field label. msgid "Captcha" msgstr "Captcha" +#. TRANS: Error message displayed if a provided captcha response does not match. msgid "Captcha does not match!" msgstr "Коди перевірки не збігаютьÑÑ!" +#. TRANS: Plugin description. msgid "" "Uses Recaptcha service to add a " "captcha to the registration page." diff --git a/plugins/Recaptcha/recaptchalib.php b/plugins/Recaptcha/recaptchalib.php index 897c50981a..4dc082b33d 100644 --- a/plugins/Recaptcha/recaptchalib.php +++ b/plugins/Recaptcha/recaptchalib.php @@ -1,5 +1,7 @@ ...@" . htmlentities ($emailparts [1]); } - - -?> diff --git a/plugins/RegisterThrottle/RegisterThrottlePlugin.php b/plugins/RegisterThrottle/RegisterThrottlePlugin.php index e3982427da..1e686bd62b 100644 --- a/plugins/RegisterThrottle/RegisterThrottlePlugin.php +++ b/plugins/RegisterThrottle/RegisterThrottlePlugin.php @@ -52,7 +52,6 @@ class RegisterThrottlePlugin extends Plugin * * Default is 3 registrations per hour, 5 per day, 10 per week. */ - public $regLimits = array(604800 => 10, // per week 86400 => 5, // per day 3600 => 3); // per hour @@ -61,13 +60,11 @@ class RegisterThrottlePlugin extends Plugin * Disallow registration if a silenced user has registered from * this IP address. */ - public $silenced = true; /** * Whether we're enabled; prevents recursion. */ - static private $enabled = true; /** @@ -77,13 +74,11 @@ class RegisterThrottlePlugin extends Plugin * * @return boolean hook value; true means continue processing, false means stop. */ - function onCheckSchema() { $schema = Schema::get(); // For storing user-submitted flags on profiles - $schema->ensureTable('registration_ip', array(new ColumnDef('user_id', 'integer', null, false, 'PRI'), @@ -100,7 +95,6 @@ class RegisterThrottlePlugin extends Plugin * * @return boolean hook value; true means continue processing, false means stop. */ - function onAutoload($cls) { $dir = dirname(__FILE__); @@ -124,13 +118,13 @@ class RegisterThrottlePlugin extends Plugin * @param Action $action Action that is being executed * * @return boolean hook value - * */ function onStartRegistrationTry($action) { $ipaddress = $this->_getIpAddress(); if (empty($ipaddress)) { + // TRANS: Server exception thrown when no IP address can be found for a registation attempt. throw new ServerException(_m('Cannot find IP address.')); } @@ -146,7 +140,8 @@ class RegisterThrottlePlugin extends Plugin $now = time(); $this->debug("Comparing {$regtime} to {$now}"); if ($now - $regtime < $seconds) { - throw new Exception(_m("Too many registrations. Take a break and try again later.")); + // TRANS: Exception thrown when too many user have registered from one IP address within a given time frame. + throw new Exception(_m('Too many registrations. Take a break and try again later.')); } } } @@ -158,7 +153,8 @@ class RegisterThrottlePlugin extends Plugin foreach ($ids as $id) { $profile = Profile::staticGet('id', $id); if ($profile && $profile->isSilenced()) { - throw new Exception(_m("A banned user has registered from this address.")); + // TRANS: Exception thrown when attempting to register from an IP address from which silenced users have registered. + throw new Exception(_m('A banned user has registered from this address.')); } } } @@ -175,9 +171,7 @@ class RegisterThrottlePlugin extends Plugin * @param User $user new user * * @return boolean hook value - * */ - function onEndUserRegister($profile, $user) { $ipaddress = $this->_getIpAddress(); @@ -209,7 +203,6 @@ class RegisterThrottlePlugin extends Plugin * * @return boolean hook value */ - function onPluginVersion(&$versions) { $versions[] = array('name' => 'RegisterThrottle', @@ -217,6 +210,7 @@ class RegisterThrottlePlugin extends Plugin 'author' => 'Evan Prodromou', 'homepage' => 'http://status.net/wiki/Plugin:RegisterThrottle', 'description' => + // TRANS: Plugin description. _m('Throttles excessive registration from a single IP address.')); return true; } @@ -226,10 +220,10 @@ class RegisterThrottlePlugin extends Plugin * * @return string IP address or null if not found. */ - private function _getIpAddress() { $keys = array('HTTP_X_FORWARDED_FOR', + 'HTTP_X_CLIENT', 'CLIENT-IP', 'REMOTE_ADDR'); @@ -250,7 +244,6 @@ class RegisterThrottlePlugin extends Plugin * * @return Registration_ip nth registration or null if not found. */ - private function _getNthReg($ipaddress, $n) { $reg = new Registration_ip(); @@ -276,7 +269,6 @@ class RegisterThrottlePlugin extends Plugin * * @return boolean hook value */ - function onEndGrantRole($profile, $role) { if (!self::$enabled) { @@ -300,7 +292,6 @@ class RegisterThrottlePlugin extends Plugin $ids = Registration_ip::usersByIP($ri->ipaddress); foreach ($ids as $id) { - if ($id == $profile->id) { continue; } diff --git a/plugins/RegisterThrottle/Registration_ip.php b/plugins/RegisterThrottle/Registration_ip.php index 2486e36b46..f9fc4918d5 100644 --- a/plugins/RegisterThrottle/Registration_ip.php +++ b/plugins/RegisterThrottle/Registration_ip.php @@ -111,7 +111,6 @@ class Registration_ip extends Memcached_DataObject * * @return array magic three-false array that stops auto-incrementing. */ - function sequenceKey() { return array(false, false, false); @@ -124,7 +123,6 @@ class Registration_ip extends Memcached_DataObject * * @return Array IDs of users who registered with this address. */ - static function usersByIP($ipaddress) { $ids = array(); diff --git a/plugins/RegisterThrottle/locale/RegisterThrottle.pot b/plugins/RegisterThrottle/locale/RegisterThrottle.pot index 788646924d..b831f6bf6c 100644 --- a/plugins/RegisterThrottle/locale/RegisterThrottle.pot +++ b/plugins/RegisterThrottle/locale/RegisterThrottle.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,18 +16,22 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: RegisterThrottlePlugin.php:134 +#. TRANS: Server exception thrown when no IP address can be found for a registation attempt. +#: RegisterThrottlePlugin.php:128 msgid "Cannot find IP address." msgstr "" -#: RegisterThrottlePlugin.php:149 +#. TRANS: Exception thrown when too many user have registered from one IP address within a given time frame. +#: RegisterThrottlePlugin.php:144 msgid "Too many registrations. Take a break and try again later." msgstr "" -#: RegisterThrottlePlugin.php:161 +#. TRANS: Exception thrown when attempting to register from an IP address from which silenced users have registered. +#: RegisterThrottlePlugin.php:157 msgid "A banned user has registered from this address." msgstr "" -#: RegisterThrottlePlugin.php:220 +#. TRANS: Plugin description. +#: RegisterThrottlePlugin.php:214 msgid "Throttles excessive registration from a single IP address." msgstr "" diff --git a/plugins/RegisterThrottle/locale/ca/LC_MESSAGES/RegisterThrottle.po b/plugins/RegisterThrottle/locale/ca/LC_MESSAGES/RegisterThrottle.po new file mode 100644 index 0000000000..e38ff7ab88 --- /dev/null +++ b/plugins/RegisterThrottle/locale/ca/LC_MESSAGES/RegisterThrottle.po @@ -0,0 +1,38 @@ +# Translation of StatusNet - RegisterThrottle to Catalan (català) +# Exported from translatewiki.net +# +# Author: Toniher +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - RegisterThrottle\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:49+0000\n" +"Language-Team: Catalan \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:49:00+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: ca\n" +"X-Message-Group: #out-statusnet-plugin-registerthrottle\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Server exception thrown when no IP address can be found for a registation attempt. +msgid "Cannot find IP address." +msgstr "No es pot trobar l'adreça IP." + +#. TRANS: Exception thrown when too many user have registered from one IP address within a given time frame. +msgid "Too many registrations. Take a break and try again later." +msgstr "Massa registreu. Prengueu un respir i torneu-ho a provar més endavant." + +#. TRANS: Exception thrown when attempting to register from an IP address from which silenced users have registered. +msgid "A banned user has registered from this address." +msgstr "" + +#. TRANS: Plugin description. +msgid "Throttles excessive registration from a single IP address." +msgstr "" diff --git a/plugins/RegisterThrottle/locale/de/LC_MESSAGES/RegisterThrottle.po b/plugins/RegisterThrottle/locale/de/LC_MESSAGES/RegisterThrottle.po index 2a57f3eaa5..a1a38f8f62 100644 --- a/plugins/RegisterThrottle/locale/de/LC_MESSAGES/RegisterThrottle.po +++ b/plugins/RegisterThrottle/locale/de/LC_MESSAGES/RegisterThrottle.po @@ -1,6 +1,7 @@ # Translation of StatusNet - RegisterThrottle to German (Deutsch) # Exported from translatewiki.net # +# Author: LWChris # Author: The Evil IP address # -- # This file is distributed under the same license as the StatusNet package. @@ -9,27 +10,31 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - RegisterThrottle\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:03+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:49+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-09 19:01:00+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:00+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-registerthrottle\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Server exception thrown when no IP address can be found for a registation attempt. msgid "Cannot find IP address." -msgstr "Kann IP-Addresse nicht finden." +msgstr "Kann IP-Adresse nicht finden." +#. TRANS: Exception thrown when too many user have registered from one IP address within a given time frame. msgid "Too many registrations. Take a break and try again later." msgstr "" "Zu viele Registrierungen. Mach eine Pause and versuche es später noch einmal." +#. TRANS: Exception thrown when attempting to register from an IP address from which silenced users have registered. msgid "A banned user has registered from this address." msgstr "Ein gesperrter Benutzer hat sich von dieser Adresse registriert." +#. TRANS: Plugin description. msgid "Throttles excessive registration from a single IP address." msgstr "Drosselt exzessive Registrierungen einer einzelnen IP-Adresse." diff --git a/plugins/RegisterThrottle/locale/es/LC_MESSAGES/RegisterThrottle.po b/plugins/RegisterThrottle/locale/es/LC_MESSAGES/RegisterThrottle.po new file mode 100644 index 0000000000..25f765b104 --- /dev/null +++ b/plugins/RegisterThrottle/locale/es/LC_MESSAGES/RegisterThrottle.po @@ -0,0 +1,35 @@ +# Translation of StatusNet - RegisterThrottle to Spanish (español) +# Exported from translatewiki.net +# +# Author: Armando-Martin +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - RegisterThrottle\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:49+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:49:00+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Server exception thrown when no IP address can be found for a registation attempt. +msgid "Cannot find IP address." +msgstr "No se pudo encontrar la dirección IP" + +#. TRANS: Exception thrown when too many user have registered from one IP address within a given time frame. +msgid "Too many registrations. Take a break and try again later." +msgstr "Demasiados registros. Haga una pausa e inténtelo más tarde." + +#. TRANS: Exception thrown when attempting to register from an IP address from which silenced users have registered. +msgid "A banned user has registered from this address." +msgstr "Un usuario bloqueado se ha registrado desde esta dirección." + +#. TRANS: Plugin description. +msgid "Throttles excessive registration from a single IP address." +msgstr "Evita la excesiva creación de cuentas desde una misma dirección IP." diff --git a/plugins/RegisterThrottle/locale/fr/LC_MESSAGES/RegisterThrottle.po b/plugins/RegisterThrottle/locale/fr/LC_MESSAGES/RegisterThrottle.po index 849fed7a9e..0bc99982c0 100644 --- a/plugins/RegisterThrottle/locale/fr/LC_MESSAGES/RegisterThrottle.po +++ b/plugins/RegisterThrottle/locale/fr/LC_MESSAGES/RegisterThrottle.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - RegisterThrottle to French (Français) +# Translation of StatusNet - RegisterThrottle to French (français) # Exported from translatewiki.net # # Author: Peter17 @@ -10,28 +10,32 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - RegisterThrottle\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:03+0000\n" -"Language-Team: French \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:49+0000\n" +"Language-Team: French \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-09 19:01:00+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:00+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-registerthrottle\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Server exception thrown when no IP address can be found for a registation attempt. msgid "Cannot find IP address." msgstr "Impossible de trouver l’adresse IP." +#. TRANS: Exception thrown when too many user have registered from one IP address within a given time frame. msgid "Too many registrations. Take a break and try again later." msgstr "" "Inscriptions trop nombreuses. Faites une pause et essayez à nouveau plus " "tard." +#. TRANS: Exception thrown when attempting to register from an IP address from which silenced users have registered. msgid "A banned user has registered from this address." msgstr "Un utilisateur banni s’est inscrit depuis cette adresse." +#. TRANS: Plugin description. msgid "Throttles excessive registration from a single IP address." msgstr "Évite les inscriptions excessives depuis une même adresse IP." diff --git a/plugins/RegisterThrottle/locale/gl/LC_MESSAGES/RegisterThrottle.po b/plugins/RegisterThrottle/locale/gl/LC_MESSAGES/RegisterThrottle.po new file mode 100644 index 0000000000..d620f0e529 --- /dev/null +++ b/plugins/RegisterThrottle/locale/gl/LC_MESSAGES/RegisterThrottle.po @@ -0,0 +1,38 @@ +# Translation of StatusNet - RegisterThrottle to Galician (galego) +# Exported from translatewiki.net +# +# Author: Toliño +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - RegisterThrottle\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:49+0000\n" +"Language-Team: Galician \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:49:00+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: gl\n" +"X-Message-Group: #out-statusnet-plugin-registerthrottle\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Server exception thrown when no IP address can be found for a registation attempt. +msgid "Cannot find IP address." +msgstr "Non se pode atopar o enderezo IP." + +#. TRANS: Exception thrown when too many user have registered from one IP address within a given time frame. +msgid "Too many registrations. Take a break and try again later." +msgstr "Demasiados rexistros. Faga unha pausa e inténteo máis tarde." + +#. TRANS: Exception thrown when attempting to register from an IP address from which silenced users have registered. +msgid "A banned user has registered from this address." +msgstr "Un usuario bloqueado rexistrouse desde este enderezo." + +#. TRANS: Plugin description. +msgid "Throttles excessive registration from a single IP address." +msgstr "Evita a exceciva creación de contas desde un mesmo enderezo IP." diff --git a/plugins/RegisterThrottle/locale/ia/LC_MESSAGES/RegisterThrottle.po b/plugins/RegisterThrottle/locale/ia/LC_MESSAGES/RegisterThrottle.po index ce788d9be8..cfbba99218 100644 --- a/plugins/RegisterThrottle/locale/ia/LC_MESSAGES/RegisterThrottle.po +++ b/plugins/RegisterThrottle/locale/ia/LC_MESSAGES/RegisterThrottle.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - RegisterThrottle to Interlingua (Interlingua) +# Translation of StatusNet - RegisterThrottle to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,26 +9,30 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - RegisterThrottle\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:03+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:49+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-09 19:01:00+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:00+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-registerthrottle\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Server exception thrown when no IP address can be found for a registation attempt. msgid "Cannot find IP address." msgstr "Non pote trovar adresse IP." +#. TRANS: Exception thrown when too many user have registered from one IP address within a given time frame. msgid "Too many registrations. Take a break and try again later." msgstr "Troppo de registrationes. Face un pausa e reproba plus tarde." +#. TRANS: Exception thrown when attempting to register from an IP address from which silenced users have registered. msgid "A banned user has registered from this address." msgstr "Un usator bannite se ha registrate ab iste adresse." +#. TRANS: Plugin description. msgid "Throttles excessive registration from a single IP address." msgstr "Inhibi le creation de contos excessive ab un sol adresse IP." diff --git a/plugins/RegisterThrottle/locale/mk/LC_MESSAGES/RegisterThrottle.po b/plugins/RegisterThrottle/locale/mk/LC_MESSAGES/RegisterThrottle.po index 566f79a1f2..350923f41d 100644 --- a/plugins/RegisterThrottle/locale/mk/LC_MESSAGES/RegisterThrottle.po +++ b/plugins/RegisterThrottle/locale/mk/LC_MESSAGES/RegisterThrottle.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - RegisterThrottle to Macedonian (МакедонÑки) +# Translation of StatusNet - RegisterThrottle to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 @@ -9,26 +9,30 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - RegisterThrottle\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:03+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:49+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-09 19:01:00+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:00+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-registerthrottle\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" +#. TRANS: Server exception thrown when no IP address can be found for a registation attempt. msgid "Cannot find IP address." msgstr "Ðе можам да ја пронајдам IP-адреÑата." +#. TRANS: Exception thrown when too many user have registered from one IP address within a given time frame. msgid "Too many registrations. Take a break and try again later." msgstr "Премногу региÑтрации. Ðаправете пауза и обидете Ñе подоцна." +#. TRANS: Exception thrown when attempting to register from an IP address from which silenced users have registered. msgid "A banned user has registered from this address." msgstr "Од оваа адреÑа Ñе региÑтрирал забранет кориÑник." +#. TRANS: Plugin description. msgid "Throttles excessive registration from a single IP address." msgstr "ИÑтиÑнува прекумерни региÑтрации од една IP-адреÑа." diff --git a/plugins/RegisterThrottle/locale/nl/LC_MESSAGES/RegisterThrottle.po b/plugins/RegisterThrottle/locale/nl/LC_MESSAGES/RegisterThrottle.po index e930f08d08..c5d00c0090 100644 --- a/plugins/RegisterThrottle/locale/nl/LC_MESSAGES/RegisterThrottle.po +++ b/plugins/RegisterThrottle/locale/nl/LC_MESSAGES/RegisterThrottle.po @@ -10,26 +10,30 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - RegisterThrottle\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:03+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:50+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-09 19:01:00+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:00+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-registerthrottle\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Server exception thrown when no IP address can be found for a registation attempt. msgid "Cannot find IP address." msgstr "Het IP-adres kon niet gevonden worden." +#. TRANS: Exception thrown when too many user have registered from one IP address within a given time frame. msgid "Too many registrations. Take a break and try again later." msgstr "Te veel registraties. Wacht even en probeer het later opnieuw." +#. TRANS: Exception thrown when attempting to register from an IP address from which silenced users have registered. msgid "A banned user has registered from this address." msgstr "Er is een geblokkeerde gebruiker die vanaf dit adres is geregistreerd." +#. TRANS: Plugin description. msgid "Throttles excessive registration from a single IP address." msgstr "Beperkt excessieve aantallen registraties vanaf één IP-adres." diff --git a/plugins/RegisterThrottle/locale/tl/LC_MESSAGES/RegisterThrottle.po b/plugins/RegisterThrottle/locale/tl/LC_MESSAGES/RegisterThrottle.po index 7d21c171a2..0a2999c860 100644 --- a/plugins/RegisterThrottle/locale/tl/LC_MESSAGES/RegisterThrottle.po +++ b/plugins/RegisterThrottle/locale/tl/LC_MESSAGES/RegisterThrottle.po @@ -9,27 +9,31 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - RegisterThrottle\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:03+0000\n" -"Language-Team: Tagalog \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:50+0000\n" +"Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-09 19:01:00+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:00+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-registerthrottle\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Server exception thrown when no IP address can be found for a registation attempt. msgid "Cannot find IP address." msgstr "Hindi matagpuan ang tirahan ng IP." +#. TRANS: Exception thrown when too many user have registered from one IP address within a given time frame. msgid "Too many registrations. Take a break and try again later." msgstr "Napakaraming mga pagpapatala. Magpahinga muna at subukan uli mamaya." +#. TRANS: Exception thrown when attempting to register from an IP address from which silenced users have registered. msgid "A banned user has registered from this address." msgstr "Isang pinagbawalang tagagamit ang nagpatala mula sa ganitong tirahan." +#. TRANS: Plugin description. msgid "Throttles excessive registration from a single IP address." msgstr "" "Naglilipat-lipat ng labis na pagpapatala mula sa isang nag-iisang tirahan ng " diff --git a/plugins/RegisterThrottle/locale/uk/LC_MESSAGES/RegisterThrottle.po b/plugins/RegisterThrottle/locale/uk/LC_MESSAGES/RegisterThrottle.po index 6c20047e69..21061a7387 100644 --- a/plugins/RegisterThrottle/locale/uk/LC_MESSAGES/RegisterThrottle.po +++ b/plugins/RegisterThrottle/locale/uk/LC_MESSAGES/RegisterThrottle.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - RegisterThrottle to Ukrainian (УкраїнÑька) +# Translation of StatusNet - RegisterThrottle to Ukrainian (українÑька) # Exported from translatewiki.net # # Author: Boogie @@ -10,27 +10,31 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - RegisterThrottle\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:04+0000\n" -"Language-Team: Ukrainian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:50+0000\n" +"Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-09 19:01:00+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:00+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-registerthrottle\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Server exception thrown when no IP address can be found for a registation attempt. msgid "Cannot find IP address." msgstr "Ðе вдаєтьÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ IP-адреÑу." +#. TRANS: Exception thrown when too many user have registered from one IP address within a given time frame. msgid "Too many registrations. Take a break and try again later." msgstr "Забагато реєÑтрацій. Випийте поки що кави Ñ– повертайтеÑÑŒ пізніше." +#. TRANS: Exception thrown when attempting to register from an IP address from which silenced users have registered. msgid "A banned user has registered from this address." msgstr "Заблокований кориÑтувач був зареєÑтрований з цієї адреÑи." +#. TRANS: Plugin description. msgid "Throttles excessive registration from a single IP address." msgstr "Цей додаток обмежує кількіÑÑ‚ÑŒ реєÑтрацій з певної IP-адреÑи." diff --git a/plugins/RequireValidatedEmail/README b/plugins/RequireValidatedEmail/README index 84b1485b25..326e19c28a 100644 --- a/plugins/RequireValidatedEmail/README +++ b/plugins/RequireValidatedEmail/README @@ -25,9 +25,6 @@ For example, to trust WikiHow and Wikipedia users: ), )); - - Todo: * add a more visible indicator that validation is still outstanding * test with XMPP, API posting - diff --git a/plugins/RequireValidatedEmail/RequireValidatedEmailPlugin.php b/plugins/RequireValidatedEmail/RequireValidatedEmailPlugin.php index fdb039afec..c14ace1f1e 100644 --- a/plugins/RequireValidatedEmail/RequireValidatedEmailPlugin.php +++ b/plugins/RequireValidatedEmail/RequireValidatedEmailPlugin.php @@ -50,14 +50,12 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ - class RequireValidatedEmailPlugin extends Plugin { /** * Users created before this time will be grandfathered in * without the validation requirement. */ - public $grandfatherCutoff = null; /** @@ -74,13 +72,11 @@ class RequireValidatedEmailPlugin extends Plugin * ), * )); */ - public $trustedOpenIDs = array(); /** * Whether or not to disallow login for unvalidated users. */ - public $disallowLogin = false; function onAutoload($cls) @@ -112,13 +108,13 @@ class RequireValidatedEmailPlugin extends Plugin * * @return bool hook result code */ - function onStartNoticeSave($notice) { $user = User::staticGet('id', $notice->profile_id); if (!empty($user)) { // it's a remote notice if (!$this->validated($user)) { - $msg = _m("You must validate your email address before posting."); + // TRANS: Client exception thrown when trying to post notices before validating an e-mail address. + $msg = _m('You must validate your email address before posting.'); throw new ClientException($msg); } } @@ -133,12 +129,12 @@ class RequireValidatedEmailPlugin extends Plugin * * @return bool hook result code */ - function onStartRegisterUser(&$user, &$profile) { $email = $user->email; if (empty($email)) { + // TRANS: Client exception thrown when trying to register without providing an e-mail address. throw new ClientException(_m('You must provide an email address to register.')); } @@ -164,8 +160,7 @@ class RequireValidatedEmailPlugin extends Plugin // Give other plugins a chance to override, if they can validate // that somebody's ok despite a non-validated email. - // FIXME: This isn't how to do it! Use Start*/End* instead - + // @todo FIXME: This isn't how to do it! Use Start*/End* instead Event::handle('RequireValidatedEmailPlugin_Override', array($user, &$knownGood)); @@ -201,7 +196,6 @@ class RequireValidatedEmailPlugin extends Plugin * * @return bool true if user has a trusted OpenID. */ - function hasTrustedOpenID($user) { if ($this->trustedOpenIDs && class_exists('User_openid')) { @@ -228,7 +222,6 @@ class RequireValidatedEmailPlugin extends Plugin * * @return boolean hook value */ - function onPluginVersion(&$versions) { $versions[] = @@ -240,7 +233,9 @@ class RequireValidatedEmailPlugin extends Plugin 'homepage' => 'http://status.net/wiki/Plugin:RequireValidatedEmail', 'rawdescription' => + // TRANS: Plugin description. _m('Disables posting without a validated email address.')); + return true; } @@ -251,7 +246,6 @@ class RequireValidatedEmailPlugin extends Plugin * * @return boolean hook value */ - function onStartShowNoticeForm($action) { $user = common_current_user(); diff --git a/plugins/RequireValidatedEmail/confirmfirstemail.php b/plugins/RequireValidatedEmail/confirmfirstemail.php index 974a95a7cf..0b6843fa47 100644 --- a/plugins/RequireValidatedEmail/confirmfirstemail.php +++ b/plugins/RequireValidatedEmail/confirmfirstemail.php @@ -4,7 +4,7 @@ * Copyright (C) 2011, StatusNet, Inc. * * Action for confirming first email registration - * + * * PHP version 5 * * This program is free software: you can redistribute it and/or modify @@ -44,7 +44,6 @@ if (!defined('STATUSNET')) { * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @link http://status.net/ */ - class ConfirmfirstemailAction extends Action { public $confirm; @@ -59,13 +58,13 @@ class ConfirmfirstemailAction extends Action * * @return boolean true */ - function prepare($argarray) { parent::prepare($argarray); $user = common_current_user(); if (!empty($user)) { + // TRANS: Client exception thrown when trying to register while already logged in. throw new ClientException(_m('You are already logged in.')); } @@ -74,6 +73,7 @@ class ConfirmfirstemailAction extends Action $this->confirm = Confirm_address::staticGet('code', $this->code); if (empty($this->confirm)) { + // TRANS: Client exception thrown when trying to register with a non-existing confirmation code. throw new ClientException(_m('Confirmation code not found.')); return; } @@ -81,12 +81,15 @@ class ConfirmfirstemailAction extends Action $this->user = User::staticGet('id', $this->confirm->user_id); if (empty($this->user)) { + // TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user. throw new ServerException(_m('No user for that confirmation code.')); } $type = $this->confirm->address_type; if ($type != 'email') { + // TRANS: Client exception thrown when trying to register with a invalid e-mail address. + // TRANS: %s is the invalid e-mail address. throw new ServerException(sprintf(_m('Unrecognized address type %s.'), $type)); } @@ -103,10 +106,12 @@ class ConfirmfirstemailAction extends Action $confirm = $this->trimmed('confirm'); if (strlen($password) < 6) { + // TRANS: Client exception thrown when trying to register with too short a password. throw new ClientException(_m('Password too short.')); return; } else if (0 != strcmp($password, $confirm)) { - throw new ClientException(_m("Passwords do not match.")); + // TRANS: Client exception thrown when trying to register without providing the same password twice. + throw new ClientException(_m('Passwords do not match.')); return; } @@ -123,10 +128,9 @@ class ConfirmfirstemailAction extends Action * * @return void */ - function handle($argarray=null) { - $homepage = common_local_url('all', + $homepage = common_local_url('all', array('nickname' => $this->user->nickname)); if ($this->isPost()) { @@ -162,6 +166,7 @@ class ConfirmfirstemailAction extends Action function showContent() { $this->element('p', 'instructions', + // TRANS: Form instructions. %s is the nickname of the to be registered user. sprintf(_m('You have confirmed the email address for your new user account %s. '. 'Use the form below to set your new password.'), $this->user->nickname)); @@ -172,6 +177,7 @@ class ConfirmfirstemailAction extends Action function title() { + // TRANS: Page title. return _m('Set a password'); } } @@ -188,7 +194,8 @@ class ConfirmFirstEmailForm extends Form function formLegend() { - return _m('Confirm email'); + // TRANS: Form legend. + return _m('Confirm email address'); } function action() @@ -206,11 +213,15 @@ class ConfirmFirstEmailForm extends Form { $this->out->elementStart('ul', 'form_data'); $this->out->elementStart('li'); + // TRANS: Field label. $this->out->password('password', _m('New password'), + // TRANS: Field title for password field. _m('6 or more characters.')); $this->out->elementEnd('li'); $this->out->elementStart('li'); - $this->out->password('confirm', _m('Confirm'), + // TRANS: Field label for repeat password field. + $this->out->password('confirm', _m('LABEL','Confirm'), + // TRANS: Field title for repeat password field. _m('Same as password above.')); $this->out->elementEnd('li'); $this->out->elementEnd('ul'); @@ -218,6 +229,7 @@ class ConfirmFirstEmailForm extends Form function formActions() { - $this->out->submit('save', _m('Save')); + // TRANS: Button text for completing registration by e-mail. + $this->out->submit('save', _m('BUTTON','Save')); } } diff --git a/plugins/RequireValidatedEmail/locale/RequireValidatedEmail.pot b/plugins/RequireValidatedEmail/locale/RequireValidatedEmail.pot index b443918e1a..24cab03bc8 100644 --- a/plugins/RequireValidatedEmail/locale/RequireValidatedEmail.pot +++ b/plugins/RequireValidatedEmail/locale/RequireValidatedEmail.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,79 +16,99 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: RequireValidatedEmailPlugin.php:121 +#. TRANS: Client exception thrown when trying to post notices before validating an e-mail address. +#: RequireValidatedEmailPlugin.php:117 msgid "You must validate your email address before posting." msgstr "" -#: RequireValidatedEmailPlugin.php:142 +#. TRANS: Client exception thrown when trying to register without providing an e-mail address. +#: RequireValidatedEmailPlugin.php:138 msgid "You must provide an email address to register." msgstr "" -#: RequireValidatedEmailPlugin.php:243 +#. TRANS: Plugin description. +#: RequireValidatedEmailPlugin.php:237 msgid "Disables posting without a validated email address." msgstr "" -#: confirmfirstemail.php:69 +#. TRANS: Client exception thrown when trying to register while already logged in. +#: confirmfirstemail.php:68 msgid "You are already logged in." msgstr "" +#. TRANS: Client exception thrown when trying to register with a non-existing confirmation code. #: confirmfirstemail.php:77 msgid "Confirmation code not found." msgstr "" -#: confirmfirstemail.php:84 +#. TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user. +#: confirmfirstemail.php:85 msgid "No user for that confirmation code." msgstr "" -#: confirmfirstemail.php:90 +#. TRANS: Client exception thrown when trying to register with a invalid e-mail address. +#. TRANS: %s is the invalid e-mail address. +#: confirmfirstemail.php:93 #, php-format msgid "Unrecognized address type %s." msgstr "" #. TRANS: Client error for an already confirmed email/jabber/sms address. -#: confirmfirstemail.php:95 +#: confirmfirstemail.php:98 msgid "That address has already been confirmed." msgstr "" -#: confirmfirstemail.php:106 +#. TRANS: Client exception thrown when trying to register with too short a password. +#: confirmfirstemail.php:110 msgid "Password too short." msgstr "" -#: confirmfirstemail.php:109 +#. TRANS: Client exception thrown when trying to register without providing the same password twice. +#: confirmfirstemail.php:114 msgid "Passwords do not match." msgstr "" -#: confirmfirstemail.php:165 +#. TRANS: Form instructions. %s is the nickname of the to be registered user. +#: confirmfirstemail.php:170 #, php-format msgid "" "You have confirmed the email address for your new user account %s. Use the " "form below to set your new password." msgstr "" -#: confirmfirstemail.php:175 +#. TRANS: Page title. +#: confirmfirstemail.php:181 msgid "Set a password" msgstr "" -#: confirmfirstemail.php:191 -msgid "Confirm email" +#. TRANS: Form legend. +#: confirmfirstemail.php:198 +msgid "Confirm email address" msgstr "" -#: confirmfirstemail.php:209 +#. TRANS: Field label. +#: confirmfirstemail.php:217 msgid "New password" msgstr "" -#: confirmfirstemail.php:210 +#. TRANS: Field title for password field. +#: confirmfirstemail.php:219 msgid "6 or more characters." msgstr "" -#: confirmfirstemail.php:213 +#. TRANS: Field label for repeat password field. +#: confirmfirstemail.php:223 +msgctxt "LABEL" msgid "Confirm" msgstr "" -#: confirmfirstemail.php:214 +#. TRANS: Field title for repeat password field. +#: confirmfirstemail.php:225 msgid "Same as password above." msgstr "" -#: confirmfirstemail.php:221 +#. TRANS: Button text for completing registration by e-mail. +#: confirmfirstemail.php:233 +msgctxt "BUTTON" msgid "Save" msgstr "" diff --git a/plugins/RequireValidatedEmail/locale/ar/LC_MESSAGES/RequireValidatedEmail.po b/plugins/RequireValidatedEmail/locale/ar/LC_MESSAGES/RequireValidatedEmail.po new file mode 100644 index 0000000000..fd111d3c8a --- /dev/null +++ b/plugins/RequireValidatedEmail/locale/ar/LC_MESSAGES/RequireValidatedEmail.po @@ -0,0 +1,103 @@ +# Translation of StatusNet - RequireValidatedEmail to Arabic (العربية) +# Exported from translatewiki.net +# +# Author: OsamaK +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - RequireValidatedEmail\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:50+0000\n" +"Language-Team: Arabic \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-18 16:19:28+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: ar\n" +"X-Message-Group: #out-statusnet-plugin-requirevalidatedemail\n" +"Plural-Forms: nplurals=6; plural=(n == 0) ? 0 : ( (n == 1) ? 1 : ( (n == " +"2) ? 2 : ( (n%100 >= 3 && n%100 <= 10) ? 3 : ( (n%100 >= 11 && n%100 <= " +"99) ? 4 : 5 ) ) ) );\n" + +#. TRANS: Client exception thrown when trying to post notices before validating an e-mail address. +msgid "You must validate your email address before posting." +msgstr "" + +#. TRANS: Client exception thrown when trying to register without providing an e-mail address. +msgid "You must provide an email address to register." +msgstr "" + +#. TRANS: Plugin description. +msgid "Disables posting without a validated email address." +msgstr "" + +#. TRANS: Client exception thrown when trying to register while already logged in. +msgid "You are already logged in." +msgstr "" + +#. TRANS: Client exception thrown when trying to register with a non-existing confirmation code. +msgid "Confirmation code not found." +msgstr "" + +#. TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user. +msgid "No user for that confirmation code." +msgstr "" + +#. TRANS: Client exception thrown when trying to register with a invalid e-mail address. +#. TRANS: %s is the invalid e-mail address. +#, php-format +msgid "Unrecognized address type %s." +msgstr "" + +#. TRANS: Client error for an already confirmed email/jabber/sms address. +msgid "That address has already been confirmed." +msgstr "" + +#. TRANS: Client exception thrown when trying to register with too short a password. +msgid "Password too short." +msgstr "كلمة السر قصيرة جدا." + +#. TRANS: Client exception thrown when trying to register without providing the same password twice. +msgid "Passwords do not match." +msgstr "كلمتا السر غير متطابقتين." + +#. TRANS: Form instructions. %s is the nickname of the to be registered user. +#, php-format +msgid "" +"You have confirmed the email address for your new user account %s. Use the " +"form below to set your new password." +msgstr "" + +#. TRANS: Page title. +msgid "Set a password" +msgstr "تعيين كلمة السر" + +#. TRANS: Form legend. +msgid "Confirm email address" +msgstr "تأكيد عنوان البريد الإلكتروني" + +#. TRANS: Field label. +msgid "New password" +msgstr "كلمة السر الجديدة" + +#. TRANS: Field title for password field. +msgid "6 or more characters." +msgstr "6 أحر٠أو أكثر." + +#. TRANS: Field label for repeat password field. +msgctxt "LABEL" +msgid "Confirm" +msgstr "أكّد" + +#. TRANS: Field title for repeat password field. +msgid "Same as password above." +msgstr "Ù†Ùس كلمة السر أعلاه." + +#. TRANS: Button text for completing registration by e-mail. +msgctxt "BUTTON" +msgid "Save" +msgstr "احÙظ" diff --git a/plugins/RequireValidatedEmail/locale/br/LC_MESSAGES/RequireValidatedEmail.po b/plugins/RequireValidatedEmail/locale/br/LC_MESSAGES/RequireValidatedEmail.po new file mode 100644 index 0000000000..f7bf93b449 --- /dev/null +++ b/plugins/RequireValidatedEmail/locale/br/LC_MESSAGES/RequireValidatedEmail.po @@ -0,0 +1,101 @@ +# Translation of StatusNet - RequireValidatedEmail to Breton (brezhoneg) +# Exported from translatewiki.net +# +# Author: Y-M D +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - RequireValidatedEmail\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:50+0000\n" +"Language-Team: Breton \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-18 16:19:28+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: br\n" +"X-Message-Group: #out-statusnet-plugin-requirevalidatedemail\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. TRANS: Client exception thrown when trying to post notices before validating an e-mail address. +msgid "You must validate your email address before posting." +msgstr "" + +#. TRANS: Client exception thrown when trying to register without providing an e-mail address. +msgid "You must provide an email address to register." +msgstr "" + +#. TRANS: Plugin description. +msgid "Disables posting without a validated email address." +msgstr "" + +#. TRANS: Client exception thrown when trying to register while already logged in. +msgid "You are already logged in." +msgstr "" + +#. TRANS: Client exception thrown when trying to register with a non-existing confirmation code. +msgid "Confirmation code not found." +msgstr "" + +#. TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user. +msgid "No user for that confirmation code." +msgstr "" + +#. TRANS: Client exception thrown when trying to register with a invalid e-mail address. +#. TRANS: %s is the invalid e-mail address. +#, php-format +msgid "Unrecognized address type %s." +msgstr "" + +#. TRANS: Client error for an already confirmed email/jabber/sms address. +msgid "That address has already been confirmed." +msgstr "" + +#. TRANS: Client exception thrown when trying to register with too short a password. +msgid "Password too short." +msgstr "Ger-tremen re verr." + +#. TRANS: Client exception thrown when trying to register without providing the same password twice. +msgid "Passwords do not match." +msgstr "" + +#. TRANS: Form instructions. %s is the nickname of the to be registered user. +#, php-format +msgid "" +"You have confirmed the email address for your new user account %s. Use the " +"form below to set your new password." +msgstr "" + +#. TRANS: Page title. +msgid "Set a password" +msgstr "Termeniñ ur ger-tremen" + +#. TRANS: Form legend. +msgid "Confirm email address" +msgstr "Kadarnaat ar chomlec'h postel" + +#. TRANS: Field label. +msgid "New password" +msgstr "Ger-tremen nevez" + +#. TRANS: Field title for password field. +msgid "6 or more characters." +msgstr "6 arouezenn pe muioc'h." + +#. TRANS: Field label for repeat password field. +msgctxt "LABEL" +msgid "Confirm" +msgstr "Kadarnaat" + +#. TRANS: Field title for repeat password field. +msgid "Same as password above." +msgstr "Memestra eget ar ger-tremen a-us." + +#. TRANS: Button text for completing registration by e-mail. +msgctxt "BUTTON" +msgid "Save" +msgstr "Enrollañ" diff --git a/plugins/RequireValidatedEmail/locale/ca/LC_MESSAGES/RequireValidatedEmail.po b/plugins/RequireValidatedEmail/locale/ca/LC_MESSAGES/RequireValidatedEmail.po index a5e90e6038..cab8c19b28 100644 --- a/plugins/RequireValidatedEmail/locale/ca/LC_MESSAGES/RequireValidatedEmail.po +++ b/plugins/RequireValidatedEmail/locale/ca/LC_MESSAGES/RequireValidatedEmail.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - RequireValidatedEmail to Catalan (Català) +# Translation of StatusNet - RequireValidatedEmail to Catalan (català) # Exported from translatewiki.net # # Author: Toniher @@ -9,73 +9,95 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - RequireValidatedEmail\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:06+0000\n" -"Language-Team: Catalan \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:50+0000\n" +"Language-Team: Catalan \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:17+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-18 16:19:28+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ca\n" "X-Message-Group: #out-statusnet-plugin-requirevalidatedemail\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Client exception thrown when trying to post notices before validating an e-mail address. msgid "You must validate your email address before posting." msgstr "" +#. TRANS: Client exception thrown when trying to register without providing an e-mail address. msgid "You must provide an email address to register." msgstr "" +#. TRANS: Plugin description. msgid "Disables posting without a validated email address." msgstr "" +#. TRANS: Client exception thrown when trying to register while already logged in. msgid "You are already logged in." -msgstr "" +msgstr "Ja heu iniciat una sessió." +#. TRANS: Client exception thrown when trying to register with a non-existing confirmation code. msgid "Confirmation code not found." -msgstr "" +msgstr "No s'ha trobat el codi de confirmació." +#. TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user. msgid "No user for that confirmation code." -msgstr "" +msgstr "No hi ha cap usuari per a aquest codi de confirmació." +#. TRANS: Client exception thrown when trying to register with a invalid e-mail address. +#. TRANS: %s is the invalid e-mail address. #, php-format msgid "Unrecognized address type %s." -msgstr "" +msgstr "Tipus d'adreça no reconeguda %s." #. TRANS: Client error for an already confirmed email/jabber/sms address. msgid "That address has already been confirmed." -msgstr "" +msgstr "Ja s'ha confirmat l'adreça." +#. TRANS: Client exception thrown when trying to register with too short a password. msgid "Password too short." -msgstr "" +msgstr "La contrasenya és massa curta." +#. TRANS: Client exception thrown when trying to register without providing the same password twice. msgid "Passwords do not match." -msgstr "" +msgstr "Les contrasenyes no coincideixen." +#. TRANS: Form instructions. %s is the nickname of the to be registered user. #, php-format msgid "" "You have confirmed the email address for your new user account %s. Use the " "form below to set your new password." msgstr "" +"Heu confirmat l'adreça electrònica del vostre nou compte d'usuari %s. " +"Utilitzeu el formulari a sota per definir una contrasenya nova." +#. TRANS: Page title. msgid "Set a password" msgstr "Definiu una contrasenya" -msgid "Confirm email" +#. TRANS: Form legend. +msgid "Confirm email address" msgstr "Confirmeu l'adreça electrònica" +#. TRANS: Field label. msgid "New password" msgstr "Contrasenya nova" +#. TRANS: Field title for password field. msgid "6 or more characters." msgstr "6 o més caràcters." +#. TRANS: Field label for repeat password field. +msgctxt "LABEL" msgid "Confirm" msgstr "Confirma" +#. TRANS: Field title for repeat password field. msgid "Same as password above." msgstr "La mateixa que la contrasenya de dalt." +#. TRANS: Button text for completing registration by e-mail. +msgctxt "BUTTON" msgid "Save" msgstr "Desa" diff --git a/plugins/RequireValidatedEmail/locale/de/LC_MESSAGES/RequireValidatedEmail.po b/plugins/RequireValidatedEmail/locale/de/LC_MESSAGES/RequireValidatedEmail.po index 243da7cc8d..2f70656022 100644 --- a/plugins/RequireValidatedEmail/locale/de/LC_MESSAGES/RequireValidatedEmail.po +++ b/plugins/RequireValidatedEmail/locale/de/LC_MESSAGES/RequireValidatedEmail.po @@ -1,6 +1,7 @@ # Translation of StatusNet - RequireValidatedEmail to German (Deutsch) # Exported from translatewiki.net # +# Author: ChrisiPK # Author: Giftpflanze # Author: The Evil IP address # -- @@ -10,36 +11,44 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - RequireValidatedEmail\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:06+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:50+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:17+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-18 16:19:28+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-requirevalidatedemail\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Client exception thrown when trying to post notices before validating an e-mail address. msgid "You must validate your email address before posting." msgstr "Du musst deine E-Mail-Adresse validieren, bevor du beitragen kannst." +#. TRANS: Client exception thrown when trying to register without providing an e-mail address. msgid "You must provide an email address to register." msgstr "Du musst eine E-Mail-Adresse angeben, um dich zu registrieren." +#. TRANS: Plugin description. msgid "Disables posting without a validated email address." msgstr "Deaktiviert Posten ohne gültige E-Mail-Adresse." +#. TRANS: Client exception thrown when trying to register while already logged in. msgid "You are already logged in." msgstr "Du bist bereits angemeldet." +#. TRANS: Client exception thrown when trying to register with a non-existing confirmation code. msgid "Confirmation code not found." msgstr "Bestätigungscode nicht gefunden." +#. TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user. msgid "No user for that confirmation code." msgstr "Kein Benutzer für diesen Bestätigungscode." +#. TRANS: Client exception thrown when trying to register with a invalid e-mail address. +#. TRANS: %s is the invalid e-mail address. #, php-format msgid "Unrecognized address type %s." msgstr "Unbekannter Adresstyp %s." @@ -48,12 +57,15 @@ msgstr "Unbekannter Adresstyp %s." msgid "That address has already been confirmed." msgstr "Diese Adresse wurde bereits bestätigt." +#. TRANS: Client exception thrown when trying to register with too short a password. msgid "Password too short." msgstr "Passwort ist zu kurz." +#. TRANS: Client exception thrown when trying to register without providing the same password twice. msgid "Passwords do not match." msgstr "Passwörter stimmen nicht überein." +#. TRANS: Form instructions. %s is the nickname of the to be registered user. #, php-format msgid "" "You have confirmed the email address for your new user account %s. Use the " @@ -62,23 +74,32 @@ msgstr "" "Du hast die E-Mail-Adresse für dein neues Benutzerkonto %s bestätigt. Nutze " "das untenstehende Formular, um dein neues Passwort zu setzen." +#. TRANS: Page title. msgid "Set a password" msgstr "Passwort setzen" -msgid "Confirm email" -msgstr "E-Mail bestätigen" +#. TRANS: Form legend. +msgid "Confirm email address" +msgstr "E-Mail-Adresse bestätigen" +#. TRANS: Field label. msgid "New password" msgstr "Neues Passwort" +#. TRANS: Field title for password field. msgid "6 or more characters." msgstr "Mindestens 6 Zeichen." +#. TRANS: Field label for repeat password field. +msgctxt "LABEL" msgid "Confirm" msgstr "Bestätigen" +#. TRANS: Field title for repeat password field. msgid "Same as password above." msgstr "Dasselbe Passwort wie oben." +#. TRANS: Button text for completing registration by e-mail. +msgctxt "BUTTON" msgid "Save" msgstr "Speichern" diff --git a/plugins/RequireValidatedEmail/locale/es/LC_MESSAGES/RequireValidatedEmail.po b/plugins/RequireValidatedEmail/locale/es/LC_MESSAGES/RequireValidatedEmail.po new file mode 100644 index 0000000000..e78ef6bc82 --- /dev/null +++ b/plugins/RequireValidatedEmail/locale/es/LC_MESSAGES/RequireValidatedEmail.po @@ -0,0 +1,104 @@ +# Translation of StatusNet - RequireValidatedEmail to Spanish (español) +# Exported from translatewiki.net +# +# Author: Armando-Martin +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - RequireValidatedEmail\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:50+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-18 16:19:28+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Client exception thrown when trying to post notices before validating an e-mail address. +msgid "You must validate your email address before posting." +msgstr "Debe validar su dirección de correo electrónico antes de publicar." + +#. TRANS: Client exception thrown when trying to register without providing an e-mail address. +msgid "You must provide an email address to register." +msgstr "" +"Debe proporcionar una dirección de correo electrónico para registrarse." + +#. TRANS: Plugin description. +msgid "Disables posting without a validated email address." +msgstr "" +"Desactiva la publicación de mensajes sin una dirección de correo electrónico " +"válida." + +#. TRANS: Client exception thrown when trying to register while already logged in. +msgid "You are already logged in." +msgstr "Ya has iniciado sesión." + +#. TRANS: Client exception thrown when trying to register with a non-existing confirmation code. +msgid "Confirmation code not found." +msgstr "No se ha encontrado el código de confirmación." + +#. TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user. +msgid "No user for that confirmation code." +msgstr "Ningún usuario tiene ese código de confirmación." + +#. TRANS: Client exception thrown when trying to register with a invalid e-mail address. +#. TRANS: %s is the invalid e-mail address. +#, php-format +msgid "Unrecognized address type %s." +msgstr "No se reconoce el tipo de dirección %s." + +#. TRANS: Client error for an already confirmed email/jabber/sms address. +msgid "That address has already been confirmed." +msgstr "Esta dirección ya ha sido confirmada." + +#. TRANS: Client exception thrown when trying to register with too short a password. +msgid "Password too short." +msgstr "La contraseña es demasiado corta" + +#. TRANS: Client exception thrown when trying to register without providing the same password twice. +msgid "Passwords do not match." +msgstr "Las contraseñas no coinciden." + +#. TRANS: Form instructions. %s is the nickname of the to be registered user. +#, php-format +msgid "" +"You have confirmed the email address for your new user account %s. Use the " +"form below to set your new password." +msgstr "" +"Ha confirmado la dirección de correo electrónico para su nueva cuenta de " +"usuario %s . Utilice el siguiente formulario para establecer su nueva " +"contraseña." + +#. TRANS: Page title. +msgid "Set a password" +msgstr "Establecer una contraseña" + +#. TRANS: Form legend. +msgid "Confirm email address" +msgstr "Confirme la dirección de correo electrónico" + +#. TRANS: Field label. +msgid "New password" +msgstr "Nueva contraseña" + +#. TRANS: Field title for password field. +msgid "6 or more characters." +msgstr "6 o más caracteres." + +#. TRANS: Field label for repeat password field. +msgctxt "LABEL" +msgid "Confirm" +msgstr "Confirmar" + +#. TRANS: Field title for repeat password field. +msgid "Same as password above." +msgstr "Igual a la contraseña anterior" + +#. TRANS: Button text for completing registration by e-mail. +msgctxt "BUTTON" +msgid "Save" +msgstr "Guardar" diff --git a/plugins/RequireValidatedEmail/locale/eu/LC_MESSAGES/RequireValidatedEmail.po b/plugins/RequireValidatedEmail/locale/eu/LC_MESSAGES/RequireValidatedEmail.po new file mode 100644 index 0000000000..ff1b72e64f --- /dev/null +++ b/plugins/RequireValidatedEmail/locale/eu/LC_MESSAGES/RequireValidatedEmail.po @@ -0,0 +1,98 @@ +# Translation of StatusNet - RequireValidatedEmail to Basque (euskara) +# Exported from translatewiki.net +# +# Author: Artsuaga +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - RequireValidatedEmail\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:50+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-18 16:19:28+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Client exception thrown when trying to post notices before validating an e-mail address. +msgid "You must validate your email address before posting." +msgstr "" + +#. TRANS: Client exception thrown when trying to register without providing an e-mail address. +msgid "You must provide an email address to register." +msgstr "" + +#. TRANS: Plugin description. +msgid "Disables posting without a validated email address." +msgstr "" + +#. TRANS: Client exception thrown when trying to register while already logged in. +msgid "You are already logged in." +msgstr "Dagoeneko saioa hasi duzu." + +#. TRANS: Client exception thrown when trying to register with a non-existing confirmation code. +msgid "Confirmation code not found." +msgstr "Ez da baieztapen koderik aurkitu." + +#. TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user. +msgid "No user for that confirmation code." +msgstr "Baieztapen-kode horrentzat ez dago erabiltzailerik." + +#. TRANS: Client exception thrown when trying to register with a invalid e-mail address. +#. TRANS: %s is the invalid e-mail address. +#, php-format +msgid "Unrecognized address type %s." +msgstr "%s helbide-mota ez da ezaguna." + +#. TRANS: Client error for an already confirmed email/jabber/sms address. +msgid "That address has already been confirmed." +msgstr "Helbide hori dagoeneko baieztatu da." + +#. TRANS: Client exception thrown when trying to register with too short a password. +msgid "Password too short." +msgstr "Pasahitz laburregia." + +#. TRANS: Client exception thrown when trying to register without providing the same password twice. +msgid "Passwords do not match." +msgstr "Pasahitzak ez datoz bat." + +#. TRANS: Form instructions. %s is the nickname of the to be registered user. +#, php-format +msgid "" +"You have confirmed the email address for your new user account %s. Use the " +"form below to set your new password." +msgstr "" + +#. TRANS: Page title. +msgid "Set a password" +msgstr "Pasahitza bat zehaztu." + +#. TRANS: Form legend. +msgid "Confirm email address" +msgstr "Helbide elektronikoa baieztatu." + +#. TRANS: Field label. +msgid "New password" +msgstr "Pasahitz berria" + +#. TRANS: Field title for password field. +msgid "6 or more characters." +msgstr "6 karaktere edo gehiago." + +#. TRANS: Field label for repeat password field. +msgctxt "LABEL" +msgid "Confirm" +msgstr "Baieztatu" + +#. TRANS: Field title for repeat password field. +msgid "Same as password above." +msgstr "Gohiko pasahitz berbera." + +#. TRANS: Button text for completing registration by e-mail. +msgctxt "BUTTON" +msgid "Save" +msgstr "Gorde" diff --git a/plugins/RequireValidatedEmail/locale/fr/LC_MESSAGES/RequireValidatedEmail.po b/plugins/RequireValidatedEmail/locale/fr/LC_MESSAGES/RequireValidatedEmail.po index 65a1aa780d..f2516cb081 100644 --- a/plugins/RequireValidatedEmail/locale/fr/LC_MESSAGES/RequireValidatedEmail.po +++ b/plugins/RequireValidatedEmail/locale/fr/LC_MESSAGES/RequireValidatedEmail.po @@ -1,7 +1,8 @@ -# Translation of StatusNet - RequireValidatedEmail to French (Français) +# Translation of StatusNet - RequireValidatedEmail to French (français) # Exported from translatewiki.net # # Author: Brunoperel +# Author: Crochet.david # Author: Od1n # Author: Peter17 # -- @@ -11,37 +12,45 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - RequireValidatedEmail\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:06+0000\n" -"Language-Team: French \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:50+0000\n" +"Language-Team: French \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:17+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-18 16:19:28+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-requirevalidatedemail\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Client exception thrown when trying to post notices before validating an e-mail address. msgid "You must validate your email address before posting." msgstr "Vous devez valider votre adresse électronique avant de poster." +#. TRANS: Client exception thrown when trying to register without providing an e-mail address. msgid "You must provide an email address to register." msgstr "Vous devez fournir une adresse électronique avant de vous enregistrer." +#. TRANS: Plugin description. msgid "Disables posting without a validated email address." msgstr "" "Désactive le postage pour ceux qui n’ont pas d’adresse électronique valide." +#. TRANS: Client exception thrown when trying to register while already logged in. msgid "You are already logged in." msgstr "Votre session est déjà ouverte." +#. TRANS: Client exception thrown when trying to register with a non-existing confirmation code. msgid "Confirmation code not found." msgstr "Code de confirmation non trouvé." +#. TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user. msgid "No user for that confirmation code." msgstr "Aucun utilisateur pour ce code de confirmation." +#. TRANS: Client exception thrown when trying to register with a invalid e-mail address. +#. TRANS: %s is the invalid e-mail address. #, php-format msgid "Unrecognized address type %s." msgstr "Type d’adresse non reconnu : %s" @@ -50,12 +59,15 @@ msgstr "Type d’adresse non reconnu : %s" msgid "That address has already been confirmed." msgstr "Cette adresse a déjà été confirmée." +#. TRANS: Client exception thrown when trying to register with too short a password. msgid "Password too short." msgstr "Mot de passe trop court." +#. TRANS: Client exception thrown when trying to register without providing the same password twice. msgid "Passwords do not match." msgstr "Les mots de passe ne correspondent pas." +#. TRANS: Form instructions. %s is the nickname of the to be registered user. #, php-format msgid "" "You have confirmed the email address for your new user account %s. Use the " @@ -65,23 +77,32 @@ msgstr "" "s . Utilisez le formulaire ci-dessous pour définir votre nouveau mot de " "passe." +#. TRANS: Page title. msgid "Set a password" msgstr "Définir un nouveau mot de passe" -msgid "Confirm email" -msgstr "Confirmer le courriel" +#. TRANS: Form legend. +msgid "Confirm email address" +msgstr "Confirmer l’adresse de courriel" +#. TRANS: Field label. msgid "New password" msgstr "Nouveau mot de passe" +#. TRANS: Field title for password field. msgid "6 or more characters." msgstr "6 caractères ou plus." +#. TRANS: Field label for repeat password field. +msgctxt "LABEL" msgid "Confirm" msgstr "Confirmer" +#. TRANS: Field title for repeat password field. msgid "Same as password above." msgstr "Identique au mot de passe ci-dessus." +#. TRANS: Button text for completing registration by e-mail. +msgctxt "BUTTON" msgid "Save" -msgstr "Enregistrer" +msgstr "Sauvegarder" diff --git a/plugins/RequireValidatedEmail/locale/gl/LC_MESSAGES/RequireValidatedEmail.po b/plugins/RequireValidatedEmail/locale/gl/LC_MESSAGES/RequireValidatedEmail.po new file mode 100644 index 0000000000..ea7e71bab6 --- /dev/null +++ b/plugins/RequireValidatedEmail/locale/gl/LC_MESSAGES/RequireValidatedEmail.po @@ -0,0 +1,105 @@ +# Translation of StatusNet - RequireValidatedEmail to Galician (galego) +# Exported from translatewiki.net +# +# Author: Toliño +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - RequireValidatedEmail\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:51+0000\n" +"Language-Team: Galician \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-18 16:19:28+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: gl\n" +"X-Message-Group: #out-statusnet-plugin-requirevalidatedemail\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Client exception thrown when trying to post notices before validating an e-mail address. +msgid "You must validate your email address before posting." +msgstr "Debe validar o enderezo de correo electrónico antes de publicar." + +#. TRANS: Client exception thrown when trying to register without providing an e-mail address. +msgid "You must provide an email address to register." +msgstr "Debe proporcionar un enderezo de correo electrónico para se rexistrar." + +#. TRANS: Plugin description. +msgid "Disables posting without a validated email address." +msgstr "" +"Desactiva a publicación de mensaxes sen un enderezo de correo electrónico " +"validado." + +#. TRANS: Client exception thrown when trying to register while already logged in. +msgid "You are already logged in." +msgstr "Xa está identificado." + +#. TRANS: Client exception thrown when trying to register with a non-existing confirmation code. +msgid "Confirmation code not found." +msgstr "Non se atopou o código de confirmación." + +#. TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user. +msgid "No user for that confirmation code." +msgstr "Non hai usuario ningún para ese código de confirmación." + +#. TRANS: Client exception thrown when trying to register with a invalid e-mail address. +#. TRANS: %s is the invalid e-mail address. +#, php-format +msgid "Unrecognized address type %s." +msgstr "Non se recoñeceu o tipo de enderezo %s." + +#. TRANS: Client error for an already confirmed email/jabber/sms address. +msgid "That address has already been confirmed." +msgstr "Ese enderezo xa se confirmou." + +#. TRANS: Client exception thrown when trying to register with too short a password. +msgid "Password too short." +msgstr "O contrasinal é curto de máis." + +#. TRANS: Client exception thrown when trying to register without providing the same password twice. +msgid "Passwords do not match." +msgstr "Os contrasinais non coinciden." + +#. TRANS: Form instructions. %s is the nickname of the to be registered user. +#, php-format +msgid "" +"You have confirmed the email address for your new user account %s. Use the " +"form below to set your new password." +msgstr "" +"Confirmou o enderezo de correo electrónico da nova conta de usuario %s. " +"Empregue o formulario inferior para definir o seu novo contrasinal." + +#. TRANS: Page title. +msgid "Set a password" +msgstr "Definir un contrasinal" + +#. TRANS: Form legend. +msgid "Confirm email address" +msgstr "Confirmar o enderezo de correo electrónico" + +#. TRANS: Field label. +msgid "New password" +msgstr "Novo contrasinal" + +#. TRANS: Field title for password field. +msgid "6 or more characters." +msgstr "Seis ou máis caracteres." + +#. TRANS: Field label for repeat password field. +msgctxt "LABEL" +msgid "Confirm" +msgstr "Confirmar" + +#. TRANS: Field title for repeat password field. +msgid "Same as password above." +msgstr "Igual ao contrasinal anterior." + +#. TRANS: Button text for completing registration by e-mail. +msgctxt "BUTTON" +msgid "Save" +msgstr "Gardar" diff --git a/plugins/RequireValidatedEmail/locale/ia/LC_MESSAGES/RequireValidatedEmail.po b/plugins/RequireValidatedEmail/locale/ia/LC_MESSAGES/RequireValidatedEmail.po index 5216b71c35..9d2d592be5 100644 --- a/plugins/RequireValidatedEmail/locale/ia/LC_MESSAGES/RequireValidatedEmail.po +++ b/plugins/RequireValidatedEmail/locale/ia/LC_MESSAGES/RequireValidatedEmail.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - RequireValidatedEmail to Interlingua (Interlingua) +# Translation of StatusNet - RequireValidatedEmail to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,36 +9,44 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - RequireValidatedEmail\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:06+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:51+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:17+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-18 16:19:28+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-requirevalidatedemail\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Client exception thrown when trying to post notices before validating an e-mail address. msgid "You must validate your email address before posting." msgstr "Tu debe validar tu adresse de e-mail ante de publicar." +#. TRANS: Client exception thrown when trying to register without providing an e-mail address. msgid "You must provide an email address to register." msgstr "Tu debe fornir un adresse de e-mail pro poter crear un conto." +#. TRANS: Plugin description. msgid "Disables posting without a validated email address." msgstr "Disactiva le publication de messages sin adresse de e-mail validate." +#. TRANS: Client exception thrown when trying to register while already logged in. msgid "You are already logged in." msgstr "Tu es jam authenticate." +#. TRANS: Client exception thrown when trying to register with a non-existing confirmation code. msgid "Confirmation code not found." msgstr "Codice de confirmation non trovate." +#. TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user. msgid "No user for that confirmation code." msgstr "Il non ha un usator pro iste codice de confirmation." +#. TRANS: Client exception thrown when trying to register with a invalid e-mail address. +#. TRANS: %s is the invalid e-mail address. #, php-format msgid "Unrecognized address type %s." msgstr "Typo de adresse %s non recognoscite." @@ -47,12 +55,15 @@ msgstr "Typo de adresse %s non recognoscite." msgid "That address has already been confirmed." msgstr "Iste adresse ha ja essite confirmate." +#. TRANS: Client exception thrown when trying to register with too short a password. msgid "Password too short." msgstr "Contrasigno troppo curte." +#. TRANS: Client exception thrown when trying to register without providing the same password twice. msgid "Passwords do not match." msgstr "Le contrasignos non corresponde." +#. TRANS: Form instructions. %s is the nickname of the to be registered user. #, php-format msgid "" "You have confirmed the email address for your new user account %s. Use the " @@ -61,23 +72,32 @@ msgstr "" "Tu ha confirmate le adresse de e-mail pro tu nove conto de usator %s. Usa le " "formulario sequente pro definir tu nove contrasigno." +#. TRANS: Page title. msgid "Set a password" msgstr "Definir un contrasigno" -msgid "Confirm email" -msgstr "Confirmar e-mail" +#. TRANS: Form legend. +msgid "Confirm email address" +msgstr "Confirmar adresse de e-mail" +#. TRANS: Field label. msgid "New password" msgstr "Nove contrasigno" +#. TRANS: Field title for password field. msgid "6 or more characters." msgstr "6 o plus characteres." +#. TRANS: Field label for repeat password field. +msgctxt "LABEL" msgid "Confirm" msgstr "Confirmar" +#. TRANS: Field title for repeat password field. msgid "Same as password above." msgstr "Identic al contrasigno hic supra." +#. TRANS: Button text for completing registration by e-mail. +msgctxt "BUTTON" msgid "Save" msgstr "Salveguardar" diff --git a/plugins/RequireValidatedEmail/locale/mk/LC_MESSAGES/RequireValidatedEmail.po b/plugins/RequireValidatedEmail/locale/mk/LC_MESSAGES/RequireValidatedEmail.po index 66bdb463d1..9efdb41329 100644 --- a/plugins/RequireValidatedEmail/locale/mk/LC_MESSAGES/RequireValidatedEmail.po +++ b/plugins/RequireValidatedEmail/locale/mk/LC_MESSAGES/RequireValidatedEmail.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - RequireValidatedEmail to Macedonian (МакедонÑки) +# Translation of StatusNet - RequireValidatedEmail to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 @@ -9,38 +9,46 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - RequireValidatedEmail\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:06+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:51+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:17+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-18 16:19:28+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-requirevalidatedemail\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" +#. TRANS: Client exception thrown when trying to post notices before validating an e-mail address. msgid "You must validate your email address before posting." msgstr "" "Пред да почнете да објавувате ќе мора да ја потврдите Вашата е-поштенÑка " "адреÑа." +#. TRANS: Client exception thrown when trying to register without providing an e-mail address. msgid "You must provide an email address to register." msgstr "За да Ñе региÑтрирате, ќе мора да наведете е-поштенÑка адреÑа." +#. TRANS: Plugin description. msgid "Disables posting without a validated email address." msgstr "Оневозможува објавување без потврдена е-пошта." +#. TRANS: Client exception thrown when trying to register while already logged in. msgid "You are already logged in." msgstr "Веќе Ñте најавени." +#. TRANS: Client exception thrown when trying to register with a non-existing confirmation code. msgid "Confirmation code not found." msgstr "Потврдниот код не е пронајден." +#. TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user. msgid "No user for that confirmation code." msgstr "Ðема кориÑник за тој потврден код." +#. TRANS: Client exception thrown when trying to register with a invalid e-mail address. +#. TRANS: %s is the invalid e-mail address. #, php-format msgid "Unrecognized address type %s." msgstr "Ðепознат тип на адреÑа %s." @@ -49,12 +57,15 @@ msgstr "Ðепознат тип на адреÑа %s." msgid "That address has already been confirmed." msgstr "Таа адреÑа е веќе потврдена." +#. TRANS: Client exception thrown when trying to register with too short a password. msgid "Password too short." msgstr "Лозинката е прекратка." +#. TRANS: Client exception thrown when trying to register without providing the same password twice. msgid "Passwords do not match." msgstr "Лозинките не Ñе Ñовпаѓаат." +#. TRANS: Form instructions. %s is the nickname of the to be registered user. #, php-format msgid "" "You have confirmed the email address for your new user account %s. Use the " @@ -63,23 +74,32 @@ msgstr "" "Ја потврдивте е-поштата за Вашата нова кориÑничка Ñметка %s. Задајте нова " "лозинка во образецот подолу." +#. TRANS: Page title. msgid "Set a password" msgstr "Задајте лозинка" -msgid "Confirm email" +#. TRANS: Form legend. +msgid "Confirm email address" msgstr "Потврдете е-пошта" +#. TRANS: Field label. msgid "New password" msgstr "Ðова лозинка" +#. TRANS: Field title for password field. msgid "6 or more characters." msgstr "барем 6 знаци." +#. TRANS: Field label for repeat password field. +msgctxt "LABEL" msgid "Confirm" msgstr "Потврди" +#. TRANS: Field title for repeat password field. msgid "Same as password above." msgstr "ИÑто како лозинката погоре." +#. TRANS: Button text for completing registration by e-mail. +msgctxt "BUTTON" msgid "Save" msgstr "Зачувај" diff --git a/plugins/RequireValidatedEmail/locale/nl/LC_MESSAGES/RequireValidatedEmail.po b/plugins/RequireValidatedEmail/locale/nl/LC_MESSAGES/RequireValidatedEmail.po index a940a72f99..e941626016 100644 --- a/plugins/RequireValidatedEmail/locale/nl/LC_MESSAGES/RequireValidatedEmail.po +++ b/plugins/RequireValidatedEmail/locale/nl/LC_MESSAGES/RequireValidatedEmail.po @@ -9,36 +9,44 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - RequireValidatedEmail\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:06+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:51+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:17+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-18 16:19:28+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-requirevalidatedemail\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Client exception thrown when trying to post notices before validating an e-mail address. msgid "You must validate your email address before posting." msgstr "U moet uw e-mailadres bevestigen voordat u berichten kunt plaatsen." +#. TRANS: Client exception thrown when trying to register without providing an e-mail address. msgid "You must provide an email address to register." msgstr "U moet een e-mailadres opgeven om te kunnen registreren." +#. TRANS: Plugin description. msgid "Disables posting without a validated email address." msgstr "Schakelt berichten plaatsen zonder gevalideerd e-mailadres uit." +#. TRANS: Client exception thrown when trying to register while already logged in. msgid "You are already logged in." msgstr "U bent al aangemeld." +#. TRANS: Client exception thrown when trying to register with a non-existing confirmation code. msgid "Confirmation code not found." msgstr "De bevestigingscode is niet gevonden." +#. TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user. msgid "No user for that confirmation code." msgstr "Er is geen gebruiker voor die bevestigingscode." +#. TRANS: Client exception thrown when trying to register with a invalid e-mail address. +#. TRANS: %s is the invalid e-mail address. #, php-format msgid "Unrecognized address type %s." msgstr "Onbekend adrestype %s." @@ -47,12 +55,15 @@ msgstr "Onbekend adrestype %s." msgid "That address has already been confirmed." msgstr "Dit adres is al bevestigd." +#. TRANS: Client exception thrown when trying to register with too short a password. msgid "Password too short." msgstr "Het wachtwoord is te kort." +#. TRANS: Client exception thrown when trying to register without providing the same password twice. msgid "Passwords do not match." msgstr "De wachtwoorden komen niet overeen." +#. TRANS: Form instructions. %s is the nickname of the to be registered user. #, php-format msgid "" "You have confirmed the email address for your new user account %s. Use the " @@ -61,23 +72,32 @@ msgstr "" "U hebt het e-mailadres bevestigd voor uw nieuwe gebruiker %s. Gebruik het " "formulier hieronder om uw nieuwe wachtwoord in te stellen." +#. TRANS: Page title. msgid "Set a password" msgstr "Stel een wachtwoord in" -msgid "Confirm email" +#. TRANS: Form legend. +msgid "Confirm email address" msgstr "E-mailadres bevestigen" +#. TRANS: Field label. msgid "New password" msgstr "Nieuw wachtwoord" +#. TRANS: Field title for password field. msgid "6 or more characters." msgstr "Zes of meer tekens." +#. TRANS: Field label for repeat password field. +msgctxt "LABEL" msgid "Confirm" msgstr "Bevestigen" +#. TRANS: Field title for repeat password field. msgid "Same as password above." msgstr "Gelijk aan het wachtwoord hierboven." +#. TRANS: Button text for completing registration by e-mail. +msgctxt "BUTTON" msgid "Save" msgstr "Opslaan" diff --git a/plugins/RequireValidatedEmail/locale/pl/LC_MESSAGES/RequireValidatedEmail.po b/plugins/RequireValidatedEmail/locale/pl/LC_MESSAGES/RequireValidatedEmail.po new file mode 100644 index 0000000000..9e2cc5c97b --- /dev/null +++ b/plugins/RequireValidatedEmail/locale/pl/LC_MESSAGES/RequireValidatedEmail.po @@ -0,0 +1,102 @@ +# Translation of StatusNet - RequireValidatedEmail to Polish (polski) +# Exported from translatewiki.net +# +# Author: Woytecr +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - RequireValidatedEmail\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:51+0000\n" +"Language-Team: Polish \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-18 16:19:28+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: pl\n" +"X-Message-Group: #out-statusnet-plugin-requirevalidatedemail\n" +"Plural-Forms: nplurals=3; plural=(n == 1) ? 0 : ( (n%10 >= 2 && n%10 <= 4 && " +"(n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" + +#. TRANS: Client exception thrown when trying to post notices before validating an e-mail address. +msgid "You must validate your email address before posting." +msgstr "" + +#. TRANS: Client exception thrown when trying to register without providing an e-mail address. +msgid "You must provide an email address to register." +msgstr "" + +#. TRANS: Plugin description. +msgid "Disables posting without a validated email address." +msgstr "" + +#. TRANS: Client exception thrown when trying to register while already logged in. +msgid "You are already logged in." +msgstr "JesteÅ› już zalogowany" + +#. TRANS: Client exception thrown when trying to register with a non-existing confirmation code. +msgid "Confirmation code not found." +msgstr "Nie odnaleziono kodu potwierdzajÄ…cego." + +#. TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user. +msgid "No user for that confirmation code." +msgstr "" + +#. TRANS: Client exception thrown when trying to register with a invalid e-mail address. +#. TRANS: %s is the invalid e-mail address. +#, php-format +msgid "Unrecognized address type %s." +msgstr "" + +#. TRANS: Client error for an already confirmed email/jabber/sms address. +msgid "That address has already been confirmed." +msgstr "Adres zostaÅ‚ już potwierdzony." + +#. TRANS: Client exception thrown when trying to register with too short a password. +msgid "Password too short." +msgstr "HasÅ‚o jest za krótkie." + +#. TRANS: Client exception thrown when trying to register without providing the same password twice. +msgid "Passwords do not match." +msgstr "HasÅ‚a nie pasujÄ… do siebie." + +#. TRANS: Form instructions. %s is the nickname of the to be registered user. +#, php-format +msgid "" +"You have confirmed the email address for your new user account %s. Use the " +"form below to set your new password." +msgstr "" + +#. TRANS: Page title. +msgid "Set a password" +msgstr "Ustaw hasÅ‚o" + +#. TRANS: Form legend. +msgid "Confirm email address" +msgstr "Potwierdź adres e-mail" + +#. TRANS: Field label. +msgid "New password" +msgstr "Nowe hasÅ‚o" + +#. TRANS: Field title for password field. +msgid "6 or more characters." +msgstr "6 lub wiÄ™cej znaków." + +#. TRANS: Field label for repeat password field. +msgctxt "LABEL" +msgid "Confirm" +msgstr "Potwierdź" + +#. TRANS: Field title for repeat password field. +msgid "Same as password above." +msgstr "" + +#. TRANS: Button text for completing registration by e-mail. +msgctxt "BUTTON" +msgid "Save" +msgstr "Zapisz" diff --git a/plugins/RequireValidatedEmail/locale/tl/LC_MESSAGES/RequireValidatedEmail.po b/plugins/RequireValidatedEmail/locale/tl/LC_MESSAGES/RequireValidatedEmail.po index 3167e37eaa..cd9318f0a6 100644 --- a/plugins/RequireValidatedEmail/locale/tl/LC_MESSAGES/RequireValidatedEmail.po +++ b/plugins/RequireValidatedEmail/locale/tl/LC_MESSAGES/RequireValidatedEmail.po @@ -9,38 +9,46 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - RequireValidatedEmail\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:07+0000\n" -"Language-Team: Tagalog \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:51+0000\n" +"Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:17+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-18 16:19:28+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-requirevalidatedemail\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Client exception thrown when trying to post notices before validating an e-mail address. msgid "You must validate your email address before posting." msgstr "Kailangan patunayan mo ang iyong tirahan ng e-liham bago magpaskil." +#. TRANS: Client exception thrown when trying to register without providing an e-mail address. msgid "You must provide an email address to register." msgstr "Dapat kang magbigay ng isang tirahan ng e-liham upang makapagpatala." +#. TRANS: Plugin description. msgid "Disables posting without a validated email address." msgstr "" "Hindi nagpapagana ng pagpapaskil na walang isang napatunayang tirahan ng e-" "liham." +#. TRANS: Client exception thrown when trying to register while already logged in. msgid "You are already logged in." msgstr "Nakalagda ka na." +#. TRANS: Client exception thrown when trying to register with a non-existing confirmation code. msgid "Confirmation code not found." msgstr "Hindi natagpuan ang kodigo ng pagtitiyak." +#. TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user. msgid "No user for that confirmation code." msgstr "Walang tagagamit para sa ganyang kodigo ng paniniyak." +#. TRANS: Client exception thrown when trying to register with a invalid e-mail address. +#. TRANS: %s is the invalid e-mail address. #, php-format msgid "Unrecognized address type %s." msgstr "Hindi nakikilalang uri ng tirahan na %s." @@ -49,12 +57,15 @@ msgstr "Hindi nakikilalang uri ng tirahan na %s." msgid "That address has already been confirmed." msgstr "Natiyak na ang ganyang tirahan." +#. TRANS: Client exception thrown when trying to register with too short a password. msgid "Password too short." msgstr "Napakaikli ng hudyat." +#. TRANS: Client exception thrown when trying to register without providing the same password twice. msgid "Passwords do not match." msgstr "Hindi magkatugma ang mga hudyat." +#. TRANS: Form instructions. %s is the nickname of the to be registered user. #, php-format msgid "" "You have confirmed the email address for your new user account %s. Use the " @@ -64,23 +75,32 @@ msgstr "" "na %s. Gamitin ang pormularyong nasa ibaba upang maitakda ang bago mong " "hudyat." +#. TRANS: Page title. msgid "Set a password" msgstr "Magtakda ng isang hudyat" -msgid "Confirm email" -msgstr "Tiyakin ang e-liham" +#. TRANS: Form legend. +msgid "Confirm email address" +msgstr "Patotohanan ang tirahan ng e-liham" +#. TRANS: Field label. msgid "New password" msgstr "Bagong hudyat" +#. TRANS: Field title for password field. msgid "6 or more characters." msgstr "6 o mahigit pang mga panitik." +#. TRANS: Field label for repeat password field. +msgctxt "LABEL" msgid "Confirm" -msgstr "Pagtibayin" +msgstr "Patunayan" +#. TRANS: Field title for repeat password field. msgid "Same as password above." msgstr "Katulad ng hudyat na nasa itaas." +#. TRANS: Button text for completing registration by e-mail. +msgctxt "BUTTON" msgid "Save" msgstr "Sagipin" diff --git a/plugins/RequireValidatedEmail/locale/uk/LC_MESSAGES/RequireValidatedEmail.po b/plugins/RequireValidatedEmail/locale/uk/LC_MESSAGES/RequireValidatedEmail.po index b4126dc2d5..610d933b37 100644 --- a/plugins/RequireValidatedEmail/locale/uk/LC_MESSAGES/RequireValidatedEmail.po +++ b/plugins/RequireValidatedEmail/locale/uk/LC_MESSAGES/RequireValidatedEmail.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - RequireValidatedEmail to Ukrainian (УкраїнÑька) +# Translation of StatusNet - RequireValidatedEmail to Ukrainian (українÑька) # Exported from translatewiki.net # # Author: Boogie @@ -9,41 +9,49 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - RequireValidatedEmail\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:07+0000\n" -"Language-Team: Ukrainian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:51+0000\n" +"Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:17+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-18 16:19:28+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-requirevalidatedemail\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Client exception thrown when trying to post notices before validating an e-mail address. msgid "You must validate your email address before posting." msgstr "" "Ви повинні підтвердити Ñвою адреÑу електронної пошти до того, Ñк почнете " "надÑилати допиÑи поштою." +#. TRANS: Client exception thrown when trying to register without providing an e-mail address. msgid "You must provide an email address to register." msgstr "Ви повинні зазначити Ñвою адреÑу електронної пошти Ð´Ð»Ñ Ñ€ÐµÑ”Ñтрації." +#. TRANS: Plugin description. msgid "Disables posting without a validated email address." msgstr "" "ЗаборонÑÑ” надÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð´Ð¾Ð¿Ð¸Ñів, Ñкщо кориÑтувач не має підтвердженої " "електронної адреÑи." +#. TRANS: Client exception thrown when trying to register while already logged in. msgid "You are already logged in." msgstr "Ви вже увійшли." +#. TRANS: Client exception thrown when trying to register with a non-existing confirmation code. msgid "Confirmation code not found." msgstr "Код Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð½Ðµ знайдено." +#. TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user. msgid "No user for that confirmation code." msgstr "Ðемає кориÑтувача Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ коду підтвердженнÑ." +#. TRANS: Client exception thrown when trying to register with a invalid e-mail address. +#. TRANS: %s is the invalid e-mail address. #, php-format msgid "Unrecognized address type %s." msgstr "Ðевизначений тип адреÑи %s." @@ -52,12 +60,15 @@ msgstr "Ðевизначений тип адреÑи %s." msgid "That address has already been confirmed." msgstr "Цю адреÑу вже було підтверджено." +#. TRANS: Client exception thrown when trying to register with too short a password. msgid "Password too short." msgstr "Пароль занадто короткий." +#. TRANS: Client exception thrown when trying to register without providing the same password twice. msgid "Passwords do not match." msgstr "Паролі не збігаютьÑÑ." +#. TRANS: Form instructions. %s is the nickname of the to be registered user. #, php-format msgid "" "You have confirmed the email address for your new user account %s. Use the " @@ -66,23 +77,32 @@ msgstr "" "Ви підтвердили електронну адреÑу Ð´Ð»Ñ Ñвого нового акаунту %s. СкориÑтайтеÑÑ " "формою нижче, щоб вÑтановити новий пароль." +#. TRANS: Page title. msgid "Set a password" msgstr "Ð’Ñтановити пароль" -msgid "Confirm email" +#. TRANS: Form legend. +msgid "Confirm email address" msgstr "Підтвердити адреÑу електронної пошти" +#. TRANS: Field label. msgid "New password" msgstr "Ðовий пароль" +#. TRANS: Field title for password field. msgid "6 or more characters." msgstr "6 або більше знаків." +#. TRANS: Field label for repeat password field. +msgctxt "LABEL" msgid "Confirm" msgstr "Підтвердити" +#. TRANS: Field title for repeat password field. msgid "Same as password above." msgstr "Такий Ñамо, Ñк Ñ– пароль вище." +#. TRANS: Button text for completing registration by e-mail. +msgctxt "BUTTON" msgid "Save" msgstr "Зберегти" diff --git a/plugins/ReverseUsernameAuthentication/ReverseUsernameAuthenticationPlugin.php b/plugins/ReverseUsernameAuthentication/ReverseUsernameAuthenticationPlugin.php index 8a05a77340..568c1c9584 100644 --- a/plugins/ReverseUsernameAuthentication/ReverseUsernameAuthenticationPlugin.php +++ b/plugins/ReverseUsernameAuthentication/ReverseUsernameAuthenticationPlugin.php @@ -64,6 +64,7 @@ class ReverseUsernameAuthenticationPlugin extends AuthenticationPlugin 'author' => 'Craig Andrews', 'homepage' => 'http://status.net/wiki/Plugin:ReverseUsernameAuthentication', 'rawdescription' => + // TRANS: Plugin description. _m('The Reverse Username Authentication plugin allows for StatusNet to handle authentication by checking if the provided password is the same as the reverse of the username.')); return true; } diff --git a/plugins/ReverseUsernameAuthentication/locale/ReverseUsernameAuthentication.pot b/plugins/ReverseUsernameAuthentication/locale/ReverseUsernameAuthentication.pot index 01bca8eb80..6262951cb4 100644 --- a/plugins/ReverseUsernameAuthentication/locale/ReverseUsernameAuthentication.pot +++ b/plugins/ReverseUsernameAuthentication/locale/ReverseUsernameAuthentication.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,7 +16,8 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: ReverseUsernameAuthenticationPlugin.php:67 +#. TRANS: Plugin description. +#: ReverseUsernameAuthenticationPlugin.php:68 msgid "" "The Reverse Username Authentication plugin allows for StatusNet to handle " "authentication by checking if the provided password is the same as the " diff --git a/plugins/ReverseUsernameAuthentication/locale/de/LC_MESSAGES/ReverseUsernameAuthentication.po b/plugins/ReverseUsernameAuthentication/locale/de/LC_MESSAGES/ReverseUsernameAuthentication.po index 7557fca9fc..fdd60dcab3 100644 --- a/plugins/ReverseUsernameAuthentication/locale/de/LC_MESSAGES/ReverseUsernameAuthentication.po +++ b/plugins/ReverseUsernameAuthentication/locale/de/LC_MESSAGES/ReverseUsernameAuthentication.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - ReverseUsernameAuthentication\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:07+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:51+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:03+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:27+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-reverseusernameauthentication\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "The Reverse Username Authentication plugin allows for StatusNet to handle " "authentication by checking if the provided password is the same as the " diff --git a/plugins/ReverseUsernameAuthentication/locale/es/LC_MESSAGES/ReverseUsernameAuthentication.po b/plugins/ReverseUsernameAuthentication/locale/es/LC_MESSAGES/ReverseUsernameAuthentication.po new file mode 100644 index 0000000000..c608bfbaa3 --- /dev/null +++ b/plugins/ReverseUsernameAuthentication/locale/es/LC_MESSAGES/ReverseUsernameAuthentication.po @@ -0,0 +1,29 @@ +# Translation of StatusNet - ReverseUsernameAuthentication to Spanish (español) +# Exported from translatewiki.net +# +# Author: Armando-Martin +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - ReverseUsernameAuthentication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:51+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:51:27+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin description. +msgid "" +"The Reverse Username Authentication plugin allows for StatusNet to handle " +"authentication by checking if the provided password is the same as the " +"reverse of the username." +msgstr "" +"El complemento (plugin) Reverse Username Authentication permite a StatusNet " +"controlar la autenticación comprobando si la contraseña proporcionada es la " +"misma que el reverso del nombre de usuario." diff --git a/plugins/ReverseUsernameAuthentication/locale/fr/LC_MESSAGES/ReverseUsernameAuthentication.po b/plugins/ReverseUsernameAuthentication/locale/fr/LC_MESSAGES/ReverseUsernameAuthentication.po index 53eaa376ff..2875634839 100644 --- a/plugins/ReverseUsernameAuthentication/locale/fr/LC_MESSAGES/ReverseUsernameAuthentication.po +++ b/plugins/ReverseUsernameAuthentication/locale/fr/LC_MESSAGES/ReverseUsernameAuthentication.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - ReverseUsernameAuthentication to French (Français) +# Translation of StatusNet - ReverseUsernameAuthentication to French (français) # Exported from translatewiki.net # # Author: Peter17 @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - ReverseUsernameAuthentication\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:07+0000\n" -"Language-Team: French \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:51+0000\n" +"Language-Team: French \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:03+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:27+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-reverseusernameauthentication\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Plugin description. msgid "" "The Reverse Username Authentication plugin allows for StatusNet to handle " "authentication by checking if the provided password is the same as the " diff --git a/plugins/ReverseUsernameAuthentication/locale/gl/LC_MESSAGES/ReverseUsernameAuthentication.po b/plugins/ReverseUsernameAuthentication/locale/gl/LC_MESSAGES/ReverseUsernameAuthentication.po new file mode 100644 index 0000000000..f7fe91b63f --- /dev/null +++ b/plugins/ReverseUsernameAuthentication/locale/gl/LC_MESSAGES/ReverseUsernameAuthentication.po @@ -0,0 +1,32 @@ +# Translation of StatusNet - ReverseUsernameAuthentication to Galician (galego) +# Exported from translatewiki.net +# +# Author: Toliño +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - ReverseUsernameAuthentication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:51+0000\n" +"Language-Team: Galician \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:51:27+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: gl\n" +"X-Message-Group: #out-statusnet-plugin-reverseusernameauthentication\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin description. +msgid "" +"The Reverse Username Authentication plugin allows for StatusNet to handle " +"authentication by checking if the provided password is the same as the " +"reverse of the username." +msgstr "" +"O complemento Reverse Username Authentication permite ao StatusNet manexar a " +"autenticación comprobando se o contrasinal dado é o mesmo que o nome de " +"usuario ao revés." diff --git a/plugins/ReverseUsernameAuthentication/locale/he/LC_MESSAGES/ReverseUsernameAuthentication.po b/plugins/ReverseUsernameAuthentication/locale/he/LC_MESSAGES/ReverseUsernameAuthentication.po index 246427a8f0..b3e5821850 100644 --- a/plugins/ReverseUsernameAuthentication/locale/he/LC_MESSAGES/ReverseUsernameAuthentication.po +++ b/plugins/ReverseUsernameAuthentication/locale/he/LC_MESSAGES/ReverseUsernameAuthentication.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - ReverseUsernameAuthentication\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:07+0000\n" -"Language-Team: Hebrew \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:52+0000\n" +"Language-Team: Hebrew \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:03+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:27+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: he\n" "X-Message-Group: #out-statusnet-plugin-reverseusernameauthentication\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "The Reverse Username Authentication plugin allows for StatusNet to handle " "authentication by checking if the provided password is the same as the " diff --git a/plugins/ReverseUsernameAuthentication/locale/ia/LC_MESSAGES/ReverseUsernameAuthentication.po b/plugins/ReverseUsernameAuthentication/locale/ia/LC_MESSAGES/ReverseUsernameAuthentication.po index e6d9dc3316..22521b96b5 100644 --- a/plugins/ReverseUsernameAuthentication/locale/ia/LC_MESSAGES/ReverseUsernameAuthentication.po +++ b/plugins/ReverseUsernameAuthentication/locale/ia/LC_MESSAGES/ReverseUsernameAuthentication.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - ReverseUsernameAuthentication to Interlingua (Interlingua) +# Translation of StatusNet - ReverseUsernameAuthentication to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - ReverseUsernameAuthentication\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:07+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:52+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:03+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:27+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-reverseusernameauthentication\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "The Reverse Username Authentication plugin allows for StatusNet to handle " "authentication by checking if the provided password is the same as the " diff --git a/plugins/ReverseUsernameAuthentication/locale/id/LC_MESSAGES/ReverseUsernameAuthentication.po b/plugins/ReverseUsernameAuthentication/locale/id/LC_MESSAGES/ReverseUsernameAuthentication.po index 016990b1d3..c0598c6494 100644 --- a/plugins/ReverseUsernameAuthentication/locale/id/LC_MESSAGES/ReverseUsernameAuthentication.po +++ b/plugins/ReverseUsernameAuthentication/locale/id/LC_MESSAGES/ReverseUsernameAuthentication.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - ReverseUsernameAuthentication\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:07+0000\n" -"Language-Team: Indonesian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:52+0000\n" +"Language-Team: Indonesian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:03+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:27+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: id\n" "X-Message-Group: #out-statusnet-plugin-reverseusernameauthentication\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Plugin description. msgid "" "The Reverse Username Authentication plugin allows for StatusNet to handle " "authentication by checking if the provided password is the same as the " diff --git a/plugins/ReverseUsernameAuthentication/locale/ja/LC_MESSAGES/ReverseUsernameAuthentication.po b/plugins/ReverseUsernameAuthentication/locale/ja/LC_MESSAGES/ReverseUsernameAuthentication.po index 5e709b722e..55d3a6a6a3 100644 --- a/plugins/ReverseUsernameAuthentication/locale/ja/LC_MESSAGES/ReverseUsernameAuthentication.po +++ b/plugins/ReverseUsernameAuthentication/locale/ja/LC_MESSAGES/ReverseUsernameAuthentication.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - ReverseUsernameAuthentication\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:07+0000\n" -"Language-Team: Japanese \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:52+0000\n" +"Language-Team: Japanese \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:03+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:27+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ja\n" "X-Message-Group: #out-statusnet-plugin-reverseusernameauthentication\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Plugin description. msgid "" "The Reverse Username Authentication plugin allows for StatusNet to handle " "authentication by checking if the provided password is the same as the " diff --git a/plugins/ReverseUsernameAuthentication/locale/mk/LC_MESSAGES/ReverseUsernameAuthentication.po b/plugins/ReverseUsernameAuthentication/locale/mk/LC_MESSAGES/ReverseUsernameAuthentication.po index 68744a45be..9e0f8b1a7d 100644 --- a/plugins/ReverseUsernameAuthentication/locale/mk/LC_MESSAGES/ReverseUsernameAuthentication.po +++ b/plugins/ReverseUsernameAuthentication/locale/mk/LC_MESSAGES/ReverseUsernameAuthentication.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - ReverseUsernameAuthentication to Macedonian (МакедонÑки) +# Translation of StatusNet - ReverseUsernameAuthentication to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - ReverseUsernameAuthentication\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:07+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:52+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:03+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:27+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-reverseusernameauthentication\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" +#. TRANS: Plugin description. msgid "" "The Reverse Username Authentication plugin allows for StatusNet to handle " "authentication by checking if the provided password is the same as the " diff --git a/plugins/ReverseUsernameAuthentication/locale/nb/LC_MESSAGES/ReverseUsernameAuthentication.po b/plugins/ReverseUsernameAuthentication/locale/nb/LC_MESSAGES/ReverseUsernameAuthentication.po index 3bcdc8fbfe..e341c7cef1 100644 --- a/plugins/ReverseUsernameAuthentication/locale/nb/LC_MESSAGES/ReverseUsernameAuthentication.po +++ b/plugins/ReverseUsernameAuthentication/locale/nb/LC_MESSAGES/ReverseUsernameAuthentication.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - ReverseUsernameAuthentication to Norwegian (bokmÃ¥l)‬ (‪Norsk (bokmÃ¥l)‬) +# Translation of StatusNet - ReverseUsernameAuthentication to Norwegian BokmÃ¥l (‪norsk (bokmÃ¥l)‬) # Exported from translatewiki.net # # Author: Nghtwlkr @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - ReverseUsernameAuthentication\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:08+0000\n" -"Language-Team: Norwegian (bokmÃ¥l)‬ \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:52+0000\n" +"Language-Team: Norwegian BokmÃ¥l \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:03+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" -"X-Language-Code: no\n" +"X-POT-Import-Date: 2011-06-05 21:51:27+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: nb\n" "X-Message-Group: #out-statusnet-plugin-reverseusernameauthentication\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "The Reverse Username Authentication plugin allows for StatusNet to handle " "authentication by checking if the provided password is the same as the " diff --git a/plugins/ReverseUsernameAuthentication/locale/nl/LC_MESSAGES/ReverseUsernameAuthentication.po b/plugins/ReverseUsernameAuthentication/locale/nl/LC_MESSAGES/ReverseUsernameAuthentication.po index 87e2b030e6..ddee9ae3ea 100644 --- a/plugins/ReverseUsernameAuthentication/locale/nl/LC_MESSAGES/ReverseUsernameAuthentication.po +++ b/plugins/ReverseUsernameAuthentication/locale/nl/LC_MESSAGES/ReverseUsernameAuthentication.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - ReverseUsernameAuthentication\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:08+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:52+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:03+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:27+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-reverseusernameauthentication\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "The Reverse Username Authentication plugin allows for StatusNet to handle " "authentication by checking if the provided password is the same as the " diff --git a/plugins/ReverseUsernameAuthentication/locale/ru/LC_MESSAGES/ReverseUsernameAuthentication.po b/plugins/ReverseUsernameAuthentication/locale/ru/LC_MESSAGES/ReverseUsernameAuthentication.po index 8f58fbf265..e948719097 100644 --- a/plugins/ReverseUsernameAuthentication/locale/ru/LC_MESSAGES/ReverseUsernameAuthentication.po +++ b/plugins/ReverseUsernameAuthentication/locale/ru/LC_MESSAGES/ReverseUsernameAuthentication.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - ReverseUsernameAuthentication to Russian (РуÑÑкий) +# Translation of StatusNet - ReverseUsernameAuthentication to Russian (руÑÑкий) # Exported from translatewiki.net # # Author: ÐлекÑандр Сигачёв @@ -9,19 +9,20 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - ReverseUsernameAuthentication\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:08+0000\n" -"Language-Team: Russian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:52+0000\n" +"Language-Team: Russian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:03+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:27+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ru\n" "X-Message-Group: #out-statusnet-plugin-reverseusernameauthentication\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Plugin description. msgid "" "The Reverse Username Authentication plugin allows for StatusNet to handle " "authentication by checking if the provided password is the same as the " diff --git a/plugins/ReverseUsernameAuthentication/locale/tl/LC_MESSAGES/ReverseUsernameAuthentication.po b/plugins/ReverseUsernameAuthentication/locale/tl/LC_MESSAGES/ReverseUsernameAuthentication.po index 23ba4b89be..3b51a6bd01 100644 --- a/plugins/ReverseUsernameAuthentication/locale/tl/LC_MESSAGES/ReverseUsernameAuthentication.po +++ b/plugins/ReverseUsernameAuthentication/locale/tl/LC_MESSAGES/ReverseUsernameAuthentication.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - ReverseUsernameAuthentication\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:08+0000\n" -"Language-Team: Tagalog \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:52+0000\n" +"Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:03+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:27+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-reverseusernameauthentication\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "The Reverse Username Authentication plugin allows for StatusNet to handle " "authentication by checking if the provided password is the same as the " diff --git a/plugins/ReverseUsernameAuthentication/locale/uk/LC_MESSAGES/ReverseUsernameAuthentication.po b/plugins/ReverseUsernameAuthentication/locale/uk/LC_MESSAGES/ReverseUsernameAuthentication.po index 01e09abccb..9389b11ecf 100644 --- a/plugins/ReverseUsernameAuthentication/locale/uk/LC_MESSAGES/ReverseUsernameAuthentication.po +++ b/plugins/ReverseUsernameAuthentication/locale/uk/LC_MESSAGES/ReverseUsernameAuthentication.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - ReverseUsernameAuthentication to Ukrainian (УкраїнÑька) +# Translation of StatusNet - ReverseUsernameAuthentication to Ukrainian (українÑька) # Exported from translatewiki.net # # Author: Boogie @@ -9,19 +9,20 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - ReverseUsernameAuthentication\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:08+0000\n" -"Language-Team: Ukrainian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:52+0000\n" +"Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:03+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:27+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-reverseusernameauthentication\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Plugin description. msgid "" "The Reverse Username Authentication plugin allows for StatusNet to handle " "authentication by checking if the provided password is the same as the " diff --git a/plugins/SQLProfile/SQLProfilePlugin.php b/plugins/SQLProfile/SQLProfilePlugin.php index c17646f042..20dfb88676 100644 --- a/plugins/SQLProfile/SQLProfilePlugin.php +++ b/plugins/SQLProfile/SQLProfilePlugin.php @@ -38,6 +38,7 @@ class SQLProfilePlugin extends Plugin 'author' => 'Brion Vibber', 'homepage' => 'http://status.net/wiki/Plugin:SQLProfile', 'rawdescription' => + // TRANS: Plugin description. _m('Debug tool to watch for poorly indexed DB queries.')); return true; diff --git a/plugins/SQLProfile/locale/SQLProfile.pot b/plugins/SQLProfile/locale/SQLProfile.pot index 76e531b67b..de696b437a 100644 --- a/plugins/SQLProfile/locale/SQLProfile.pot +++ b/plugins/SQLProfile/locale/SQLProfile.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,6 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: SQLProfilePlugin.php:41 +#. TRANS: Plugin description. +#: SQLProfilePlugin.php:42 msgid "Debug tool to watch for poorly indexed DB queries." msgstr "" diff --git a/plugins/SQLProfile/locale/de/LC_MESSAGES/SQLProfile.po b/plugins/SQLProfile/locale/de/LC_MESSAGES/SQLProfile.po index 6a7f4dd6b7..0f8bff164c 100644 --- a/plugins/SQLProfile/locale/de/LC_MESSAGES/SQLProfile.po +++ b/plugins/SQLProfile/locale/de/LC_MESSAGES/SQLProfile.po @@ -9,17 +9,18 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SQLProfile\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:24+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:07+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-09 19:01:24+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:39+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-sqlprofile\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "Debug tool to watch for poorly indexed DB queries." msgstr "Debug-Werkzeug zur Ãœberwachung von schlecht indexierten DB-Abfragen." diff --git a/plugins/SQLProfile/locale/es/LC_MESSAGES/SQLProfile.po b/plugins/SQLProfile/locale/es/LC_MESSAGES/SQLProfile.po new file mode 100644 index 0000000000..64b68717f4 --- /dev/null +++ b/plugins/SQLProfile/locale/es/LC_MESSAGES/SQLProfile.po @@ -0,0 +1,25 @@ +# Translation of StatusNet - SQLProfile to Spanish (español) +# Exported from translatewiki.net +# +# Author: Armando-Martin +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - SQLProfile\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:07+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:51:39+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin description. +msgid "Debug tool to watch for poorly indexed DB queries." +msgstr "" +"Herramienta de depuración de errores para peticiones a bases de datos mal " +"indexadas." diff --git a/plugins/SQLProfile/locale/fr/LC_MESSAGES/SQLProfile.po b/plugins/SQLProfile/locale/fr/LC_MESSAGES/SQLProfile.po index fd4addb078..b221c62a22 100644 --- a/plugins/SQLProfile/locale/fr/LC_MESSAGES/SQLProfile.po +++ b/plugins/SQLProfile/locale/fr/LC_MESSAGES/SQLProfile.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SQLProfile to French (Français) +# Translation of StatusNet - SQLProfile to French (français) # Exported from translatewiki.net # # Author: IAlex @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SQLProfile\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:25+0000\n" -"Language-Team: French \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:07+0000\n" +"Language-Team: French \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-09 19:01:24+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:39+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-sqlprofile\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Plugin description. msgid "Debug tool to watch for poorly indexed DB queries." msgstr "" "Outil de débogage pour surveiller les requêtes de la base de données mal " diff --git a/plugins/SQLProfile/locale/gl/LC_MESSAGES/SQLProfile.po b/plugins/SQLProfile/locale/gl/LC_MESSAGES/SQLProfile.po new file mode 100644 index 0000000000..cda7c777c1 --- /dev/null +++ b/plugins/SQLProfile/locale/gl/LC_MESSAGES/SQLProfile.po @@ -0,0 +1,28 @@ +# Translation of StatusNet - SQLProfile to Galician (galego) +# Exported from translatewiki.net +# +# Author: Toliño +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - SQLProfile\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:07+0000\n" +"Language-Team: Galician \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:51:39+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: gl\n" +"X-Message-Group: #out-statusnet-plugin-sqlprofile\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin description. +msgid "Debug tool to watch for poorly indexed DB queries." +msgstr "" +"Ferramenta de depuración para seguir as pescudas á base de datos mal " +"indexadas." diff --git a/plugins/SQLProfile/locale/he/LC_MESSAGES/SQLProfile.po b/plugins/SQLProfile/locale/he/LC_MESSAGES/SQLProfile.po new file mode 100644 index 0000000000..d55fdcb061 --- /dev/null +++ b/plugins/SQLProfile/locale/he/LC_MESSAGES/SQLProfile.po @@ -0,0 +1,26 @@ +# Translation of StatusNet - SQLProfile to Hebrew (עברית) +# Exported from translatewiki.net +# +# Author: Amire80 +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - SQLProfile\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:07+0000\n" +"Language-Team: Hebrew \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:51:39+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: he\n" +"X-Message-Group: #out-statusnet-plugin-sqlprofile\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin description. +msgid "Debug tool to watch for poorly indexed DB queries." +msgstr "כלי ניפוי שגי×ות לגילוי ש×ילתות מסד × ×ª×•× ×™× ×©×ינן ממופתחות טוב." diff --git a/plugins/SQLProfile/locale/ia/LC_MESSAGES/SQLProfile.po b/plugins/SQLProfile/locale/ia/LC_MESSAGES/SQLProfile.po index 582e8e3ebe..e0624e89ae 100644 --- a/plugins/SQLProfile/locale/ia/LC_MESSAGES/SQLProfile.po +++ b/plugins/SQLProfile/locale/ia/LC_MESSAGES/SQLProfile.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SQLProfile to Interlingua (Interlingua) +# Translation of StatusNet - SQLProfile to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,17 +9,18 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SQLProfile\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:25+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:08+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-09 19:01:24+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:39+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-sqlprofile\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "Debug tool to watch for poorly indexed DB queries." msgstr "Instrumento pro deteger le consultas mal indexate del base de datos." diff --git a/plugins/SQLProfile/locale/ja/LC_MESSAGES/SQLProfile.po b/plugins/SQLProfile/locale/ja/LC_MESSAGES/SQLProfile.po new file mode 100644 index 0000000000..b606466c3d --- /dev/null +++ b/plugins/SQLProfile/locale/ja/LC_MESSAGES/SQLProfile.po @@ -0,0 +1,23 @@ +# Translation of StatusNet - SQLProfile to Japanese (日本語) +# Exported from translatewiki.net +# +# Author: Shirayuki +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - SQLProfile\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:08+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:51:39+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. TRANS: Plugin description. +msgid "Debug tool to watch for poorly indexed DB queries." +msgstr "ä¸å®Œå…¨ã«ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã•ã‚ŒãŸ DB クエリを監視ã™ã‚‹ãƒ‡ãƒãƒƒã‚° ツールã§ã™ã€‚" diff --git a/plugins/SQLProfile/locale/mk/LC_MESSAGES/SQLProfile.po b/plugins/SQLProfile/locale/mk/LC_MESSAGES/SQLProfile.po index cbb12a5700..06fb790a83 100644 --- a/plugins/SQLProfile/locale/mk/LC_MESSAGES/SQLProfile.po +++ b/plugins/SQLProfile/locale/mk/LC_MESSAGES/SQLProfile.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SQLProfile to Macedonian (МакедонÑки) +# Translation of StatusNet - SQLProfile to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SQLProfile\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:25+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:08+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-09 19:01:24+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:39+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-sqlprofile\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" +#. TRANS: Plugin description. msgid "Debug tool to watch for poorly indexed DB queries." msgstr "" "Ðлатка за поправање грешки што пронаоѓа лошо индекÑирани барања до базата на " diff --git a/plugins/SQLProfile/locale/nl/LC_MESSAGES/SQLProfile.po b/plugins/SQLProfile/locale/nl/LC_MESSAGES/SQLProfile.po index 362de3265e..57ab016347 100644 --- a/plugins/SQLProfile/locale/nl/LC_MESSAGES/SQLProfile.po +++ b/plugins/SQLProfile/locale/nl/LC_MESSAGES/SQLProfile.po @@ -9,17 +9,18 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SQLProfile\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:25+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:08+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-09 19:01:24+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:39+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-sqlprofile\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "Debug tool to watch for poorly indexed DB queries." msgstr "Debughulpmiddel om slecht geïndexeerde databasequery's te ontdekken." diff --git a/plugins/SQLProfile/locale/pt/LC_MESSAGES/SQLProfile.po b/plugins/SQLProfile/locale/pt/LC_MESSAGES/SQLProfile.po index c667687c92..2f475ca002 100644 --- a/plugins/SQLProfile/locale/pt/LC_MESSAGES/SQLProfile.po +++ b/plugins/SQLProfile/locale/pt/LC_MESSAGES/SQLProfile.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SQLProfile to Portuguese (Português) +# Translation of StatusNet - SQLProfile to Portuguese (português) # Exported from translatewiki.net # # Author: Waldir @@ -9,17 +9,18 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SQLProfile\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:25+0000\n" -"Language-Team: Portuguese \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:08+0000\n" +"Language-Team: Portuguese \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-09 19:01:24+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:39+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: pt\n" "X-Message-Group: #out-statusnet-plugin-sqlprofile\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "Debug tool to watch for poorly indexed DB queries." msgstr "Ferramenta de depuração para vigiar consultas à BD mal indexadas." diff --git a/plugins/SQLProfile/locale/ru/LC_MESSAGES/SQLProfile.po b/plugins/SQLProfile/locale/ru/LC_MESSAGES/SQLProfile.po index 10d0ba4dd3..344d1ddc17 100644 --- a/plugins/SQLProfile/locale/ru/LC_MESSAGES/SQLProfile.po +++ b/plugins/SQLProfile/locale/ru/LC_MESSAGES/SQLProfile.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SQLProfile to Russian (РуÑÑкий) +# Translation of StatusNet - SQLProfile to Russian (руÑÑкий) # Exported from translatewiki.net # # Author: ÐлекÑандр Сигачёв @@ -9,19 +9,20 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SQLProfile\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:25+0000\n" -"Language-Team: Russian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:08+0000\n" +"Language-Team: Russian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-09 19:01:24+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:39+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ru\n" "X-Message-Group: #out-statusnet-plugin-sqlprofile\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Plugin description. msgid "Debug tool to watch for poorly indexed DB queries." msgstr "" "Отладочный инÑтрумент Ð´Ð»Ñ Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ Ð¿Ð»Ð¾Ñ…Ð¾ индекÑированных запроÑов к БД." diff --git a/plugins/SQLProfile/locale/tl/LC_MESSAGES/SQLProfile.po b/plugins/SQLProfile/locale/tl/LC_MESSAGES/SQLProfile.po index 479d726368..a01042360c 100644 --- a/plugins/SQLProfile/locale/tl/LC_MESSAGES/SQLProfile.po +++ b/plugins/SQLProfile/locale/tl/LC_MESSAGES/SQLProfile.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SQLProfile\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:25+0000\n" -"Language-Team: Tagalog \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:08+0000\n" +"Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-09 19:01:24+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:39+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-sqlprofile\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "Debug tool to watch for poorly indexed DB queries." msgstr "" "Kasangkapang pangtanggal ng sira upang makapagtanod ng mga pagtatanong sa " diff --git a/plugins/SQLProfile/locale/uk/LC_MESSAGES/SQLProfile.po b/plugins/SQLProfile/locale/uk/LC_MESSAGES/SQLProfile.po index 0c36c75704..f2a3cceb24 100644 --- a/plugins/SQLProfile/locale/uk/LC_MESSAGES/SQLProfile.po +++ b/plugins/SQLProfile/locale/uk/LC_MESSAGES/SQLProfile.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SQLProfile to Ukrainian (УкраїнÑька) +# Translation of StatusNet - SQLProfile to Ukrainian (українÑька) # Exported from translatewiki.net # # Author: Boogie @@ -9,19 +9,20 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SQLProfile\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:25+0000\n" -"Language-Team: Ukrainian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:08+0000\n" +"Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-09 19:01:24+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:39+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-sqlprofile\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Plugin description. msgid "Debug tool to watch for poorly indexed DB queries." msgstr "" "ІнÑтрумент правки Ð´Ð»Ñ ÑпоÑÑ‚ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð° погано індекÑованими запитами до бази " diff --git a/plugins/SQLStats/locale/SQLStats.pot b/plugins/SQLStats/locale/SQLStats.pot index c25b51bfef..182893ca5a 100644 --- a/plugins/SQLStats/locale/SQLStats.pot +++ b/plugins/SQLStats/locale/SQLStats.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/plugins/SQLStats/locale/de/LC_MESSAGES/SQLStats.po b/plugins/SQLStats/locale/de/LC_MESSAGES/SQLStats.po index 4572420fc7..c035ec9d3f 100644 --- a/plugins/SQLStats/locale/de/LC_MESSAGES/SQLStats.po +++ b/plugins/SQLStats/locale/de/LC_MESSAGES/SQLStats.po @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SQLStats\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:26+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:09+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:21+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:39+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-sqlstats\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/plugins/SQLStats/locale/es/LC_MESSAGES/SQLStats.po b/plugins/SQLStats/locale/es/LC_MESSAGES/SQLStats.po new file mode 100644 index 0000000000..42d41719b4 --- /dev/null +++ b/plugins/SQLStats/locale/es/LC_MESSAGES/SQLStats.po @@ -0,0 +1,25 @@ +# Translation of StatusNet - SQLStats to Spanish (español) +# Exported from translatewiki.net +# +# Author: Armando-Martin +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - SQLStats\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:09+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:51:39+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin decription. +msgid "Debug tool to watch for poorly indexed DB queries." +msgstr "" +"Herramienta de depuración de errores para vigilar peticiones a bases de " +"datos mal indexadas." diff --git a/plugins/SQLStats/locale/fr/LC_MESSAGES/SQLStats.po b/plugins/SQLStats/locale/fr/LC_MESSAGES/SQLStats.po index 1271441edb..af3718060d 100644 --- a/plugins/SQLStats/locale/fr/LC_MESSAGES/SQLStats.po +++ b/plugins/SQLStats/locale/fr/LC_MESSAGES/SQLStats.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SQLStats to French (Français) +# Translation of StatusNet - SQLStats to French (français) # Exported from translatewiki.net # # Author: Od1n @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SQLStats\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:26+0000\n" -"Language-Team: French \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:09+0000\n" +"Language-Team: French \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:21+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:39+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-sqlstats\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" diff --git a/plugins/SQLStats/locale/gl/LC_MESSAGES/SQLStats.po b/plugins/SQLStats/locale/gl/LC_MESSAGES/SQLStats.po new file mode 100644 index 0000000000..29016a6097 --- /dev/null +++ b/plugins/SQLStats/locale/gl/LC_MESSAGES/SQLStats.po @@ -0,0 +1,28 @@ +# Translation of StatusNet - SQLStats to Galician (galego) +# Exported from translatewiki.net +# +# Author: Toliño +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - SQLStats\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:09+0000\n" +"Language-Team: Galician \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:51:39+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: gl\n" +"X-Message-Group: #out-statusnet-plugin-sqlstats\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin decription. +msgid "Debug tool to watch for poorly indexed DB queries." +msgstr "" +"Ferramenta de depuración para seguir as pescudas á base de datos mal " +"indexadas." diff --git a/plugins/SQLStats/locale/he/LC_MESSAGES/SQLStats.po b/plugins/SQLStats/locale/he/LC_MESSAGES/SQLStats.po new file mode 100644 index 0000000000..a46e1bb606 --- /dev/null +++ b/plugins/SQLStats/locale/he/LC_MESSAGES/SQLStats.po @@ -0,0 +1,26 @@ +# Translation of StatusNet - SQLStats to Hebrew (עברית) +# Exported from translatewiki.net +# +# Author: Amire80 +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - SQLStats\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:09+0000\n" +"Language-Team: Hebrew \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:51:39+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: he\n" +"X-Message-Group: #out-statusnet-plugin-sqlstats\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin decription. +msgid "Debug tool to watch for poorly indexed DB queries." +msgstr "כלי ניפוי שגי×ות לגילוי ש×ילתות מסד × ×ª×•× ×™× ×©×ינן ממופתחות טוב." diff --git a/plugins/SQLStats/locale/ia/LC_MESSAGES/SQLStats.po b/plugins/SQLStats/locale/ia/LC_MESSAGES/SQLStats.po index 58b2dee891..581d731c4e 100644 --- a/plugins/SQLStats/locale/ia/LC_MESSAGES/SQLStats.po +++ b/plugins/SQLStats/locale/ia/LC_MESSAGES/SQLStats.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SQLStats to Interlingua (Interlingua) +# Translation of StatusNet - SQLStats to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SQLStats\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:26+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:09+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:21+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:39+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-sqlstats\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/plugins/SQLStats/locale/ja/LC_MESSAGES/SQLStats.po b/plugins/SQLStats/locale/ja/LC_MESSAGES/SQLStats.po new file mode 100644 index 0000000000..bb4c118244 --- /dev/null +++ b/plugins/SQLStats/locale/ja/LC_MESSAGES/SQLStats.po @@ -0,0 +1,23 @@ +# Translation of StatusNet - SQLStats to Japanese (日本語) +# Exported from translatewiki.net +# +# Author: Shirayuki +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - SQLStats\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:09+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:51:39+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. TRANS: Plugin decription. +msgid "Debug tool to watch for poorly indexed DB queries." +msgstr "ä¸å®Œå…¨ã«ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã•ã‚ŒãŸ DB クエリを監視ã™ã‚‹ãƒ‡ãƒãƒƒã‚° ツールã§ã™ã€‚" diff --git a/plugins/SQLStats/locale/ksh/LC_MESSAGES/SQLStats.po b/plugins/SQLStats/locale/ksh/LC_MESSAGES/SQLStats.po new file mode 100644 index 0000000000..b408dd817e --- /dev/null +++ b/plugins/SQLStats/locale/ksh/LC_MESSAGES/SQLStats.po @@ -0,0 +1,28 @@ +# Translation of StatusNet - SQLStats to Colognian (Ripoarisch) +# Exported from translatewiki.net +# +# Author: Purodha +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - SQLStats\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:09+0000\n" +"Language-Team: Colognian \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:51:39+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: ksh\n" +"X-Message-Group: #out-statusnet-plugin-sqlstats\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin decription. +msgid "Debug tool to watch for poorly indexed DB queries." +msgstr "" +"E Wärkzüsch, öm düüre Aanfroore aan de Daatebangk met schlääsch opjesaz " +"Schlößelle ze fenge." diff --git a/plugins/SQLStats/locale/mk/LC_MESSAGES/SQLStats.po b/plugins/SQLStats/locale/mk/LC_MESSAGES/SQLStats.po index 9ed0cf44bd..418e0c9c52 100644 --- a/plugins/SQLStats/locale/mk/LC_MESSAGES/SQLStats.po +++ b/plugins/SQLStats/locale/mk/LC_MESSAGES/SQLStats.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SQLStats to Macedonian (МакедонÑки) +# Translation of StatusNet - SQLStats to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SQLStats\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:26+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:09+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:21+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:39+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-sqlstats\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" diff --git a/plugins/SQLStats/locale/nl/LC_MESSAGES/SQLStats.po b/plugins/SQLStats/locale/nl/LC_MESSAGES/SQLStats.po index c36d3bdfdd..1ae8bc0322 100644 --- a/plugins/SQLStats/locale/nl/LC_MESSAGES/SQLStats.po +++ b/plugins/SQLStats/locale/nl/LC_MESSAGES/SQLStats.po @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SQLStats\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:26+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:10+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:21+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:39+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-sqlstats\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/plugins/SQLStats/locale/tl/LC_MESSAGES/SQLStats.po b/plugins/SQLStats/locale/tl/LC_MESSAGES/SQLStats.po index ccccf59a9e..0532ebc2d2 100644 --- a/plugins/SQLStats/locale/tl/LC_MESSAGES/SQLStats.po +++ b/plugins/SQLStats/locale/tl/LC_MESSAGES/SQLStats.po @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SQLStats\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:26+0000\n" -"Language-Team: Tagalog \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:10+0000\n" +"Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:21+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:39+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-sqlstats\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/plugins/SQLStats/locale/uk/LC_MESSAGES/SQLStats.po b/plugins/SQLStats/locale/uk/LC_MESSAGES/SQLStats.po index 0a17c80303..35ad98ba0d 100644 --- a/plugins/SQLStats/locale/uk/LC_MESSAGES/SQLStats.po +++ b/plugins/SQLStats/locale/uk/LC_MESSAGES/SQLStats.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SQLStats to Ukrainian (УкраїнÑька) +# Translation of StatusNet - SQLStats to Ukrainian (українÑька) # Exported from translatewiki.net # # Author: Boogie @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SQLStats\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:26+0000\n" -"Language-Team: Ukrainian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:10+0000\n" +"Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:21+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:39+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-sqlstats\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " diff --git a/plugins/Sample/SamplePlugin.php b/plugins/Sample/SamplePlugin.php index a0d1140f37..5c34d10bd1 100644 --- a/plugins/Sample/SamplePlugin.php +++ b/plugins/Sample/SamplePlugin.php @@ -265,9 +265,11 @@ class SamplePlugin extends Plugin { // common_local_url() gets the correct URL for the action name // we provide - $action->menuItem(common_local_url('hello'), - _m('Hello'), _m('A warm greeting'), false, 'nav_hello'); + // TRANS: Menu item in sample plugin. + _m('Hello'), + // TRANS: Menu item title in sample plugin. + _m('A warm greeting'), false, 'nav_hello'); return true; } @@ -278,6 +280,7 @@ class SamplePlugin extends Plugin 'author' => 'Brion Vibber, Evan Prodromou', 'homepage' => 'http://status.net/wiki/Plugin:Sample', 'rawdescription' => + // TRANS: Plugin description. _m('A sample plugin to show basics of development for new hackers.')); return true; } diff --git a/plugins/Sample/User_greeting_count.php b/plugins/Sample/User_greeting_count.php index 38d68c91ed..8128343d81 100644 --- a/plugins/Sample/User_greeting_count.php +++ b/plugins/Sample/User_greeting_count.php @@ -52,7 +52,6 @@ require_once INSTALLDIR . '/classes/Memcached_DataObject.php'; * * @see DB_DataObject */ - class User_greeting_count extends Memcached_DataObject { public $__table = 'user_greeting_count'; // table name @@ -68,7 +67,6 @@ class User_greeting_count extends Memcached_DataObject * @param mixed $v Value to lookup * * @return User_greeting_count object found, or null for no hits - * */ function staticGet($k, $v=null) { @@ -150,7 +148,6 @@ class User_greeting_count extends Memcached_DataObject $gc = User_greeting_count::staticGet('user_id', $user_id); if (empty($gc)) { - $gc = new User_greeting_count(); $gc->user_id = $user_id; @@ -161,7 +158,7 @@ class User_greeting_count extends Memcached_DataObject if (!$result) { // TRANS: Exception thrown when the user greeting count could not be saved in the database. // TRANS: %d is a user ID (number). - throw Exception(sprintf(_m("Could not save new greeting count for %d."), + throw Exception(sprintf(_m('Could not save new greeting count for %d.'), $user_id)); } } else { @@ -174,7 +171,7 @@ class User_greeting_count extends Memcached_DataObject if (!$result) { // TRANS: Exception thrown when the user greeting count could not be saved in the database. // TRANS: %d is a user ID (number). - throw Exception(sprintf(_m("Could not increment greeting count for %d."), + throw Exception(sprintf(_m('Could not increment greeting count for %d.'), $user_id)); } } diff --git a/plugins/Sample/hello.php b/plugins/Sample/hello.php index a793ac6de2..da5682b332 100644 --- a/plugins/Sample/hello.php +++ b/plugins/Sample/hello.php @@ -108,8 +108,10 @@ class HelloAction extends Action function title() { if (empty($this->user)) { + // TRANS: Page title for sample plugin. return _m('Hello'); } else { + // TRANS: Page title for sample plugin. %s is a user nickname. return sprintf(_m('Hello, %s!'), $this->user->nickname); } } @@ -130,11 +132,15 @@ class HelloAction extends Action { if (empty($this->user)) { $this->element('p', array('class' => 'greeting'), + // TRANS: Message in sample plugin. _m('Hello, stranger!')); } else { $this->element('p', array('class' => 'greeting'), + // TRANS: Message in sample plugin. %s is a user nickname. sprintf(_m('Hello, %s'), $this->user->nickname)); $this->element('p', array('class' => 'greeting_count'), + // TRANS: Message in sample plugin. + // TRANS: %d is the number of times a user is greeted. sprintf(_m('I have greeted you %d time.', 'I have greeted you %d times.', $this->gc->greeting_count), diff --git a/plugins/Sample/locale/Sample.pot b/plugins/Sample/locale/Sample.pot index bd1f3c8dca..a8bf64240a 100644 --- a/plugins/Sample/locale/Sample.pot +++ b/plugins/Sample/locale/Sample.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,49 +17,58 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: hello.php:111 SamplePlugin.php:270 +#. TRANS: Page title for sample plugin. +#. TRANS: Menu item in sample plugin. +#: hello.php:112 SamplePlugin.php:270 msgid "Hello" msgstr "" -#: hello.php:113 +#. TRANS: Page title for sample plugin. %s is a user nickname. +#: hello.php:115 #, php-format msgid "Hello, %s!" msgstr "" -#: hello.php:133 +#. TRANS: Message in sample plugin. +#: hello.php:136 msgid "Hello, stranger!" msgstr "" -#: hello.php:136 +#. TRANS: Message in sample plugin. %s is a user nickname. +#: hello.php:140 #, php-format msgid "Hello, %s" msgstr "" -#: hello.php:138 +#. TRANS: Message in sample plugin. +#. TRANS: %d is the number of times a user is greeted. +#: hello.php:144 #, php-format msgid "I have greeted you %d time." msgid_plural "I have greeted you %d times." msgstr[0] "" msgstr[1] "" -#: SamplePlugin.php:270 +#. TRANS: Menu item title in sample plugin. +#: SamplePlugin.php:272 msgid "A warm greeting" msgstr "" -#: SamplePlugin.php:281 +#. TRANS: Plugin description. +#: SamplePlugin.php:284 msgid "A sample plugin to show basics of development for new hackers." msgstr "" #. TRANS: Exception thrown when the user greeting count could not be saved in the database. #. TRANS: %d is a user ID (number). -#: User_greeting_count.php:164 +#: User_greeting_count.php:161 #, php-format msgid "Could not save new greeting count for %d." msgstr "" #. TRANS: Exception thrown when the user greeting count could not be saved in the database. #. TRANS: %d is a user ID (number). -#: User_greeting_count.php:177 +#: User_greeting_count.php:174 #, php-format msgid "Could not increment greeting count for %d." msgstr "" diff --git a/plugins/Sample/locale/af/LC_MESSAGES/Sample.po b/plugins/Sample/locale/af/LC_MESSAGES/Sample.po new file mode 100644 index 0000000000..ef26e04ded --- /dev/null +++ b/plugins/Sample/locale/af/LC_MESSAGES/Sample.po @@ -0,0 +1,69 @@ +# Translation of StatusNet - Sample to Afrikaans (Afrikaans) +# Exported from translatewiki.net +# +# Author: Naudefj +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Sample\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:53+0000\n" +"Language-Team: Afrikaans \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: af\n" +"X-Message-Group: #out-statusnet-plugin-sample\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Page title for sample plugin. +#. TRANS: Menu item in sample plugin. +msgid "Hello" +msgstr "Hallo" + +#. TRANS: Page title for sample plugin. %s is a user nickname. +#, php-format +msgid "Hello, %s!" +msgstr "Hallo, %s!" + +#. TRANS: Message in sample plugin. +msgid "Hello, stranger!" +msgstr "Hallo vreemdeling!" + +#. TRANS: Message in sample plugin. %s is a user nickname. +#, php-format +msgid "Hello, %s" +msgstr "Hallo, %s" + +#. TRANS: Message in sample plugin. +#. TRANS: %d is the number of times a user is greeted. +#, php-format +msgid "I have greeted you %d time." +msgid_plural "I have greeted you %d times." +msgstr[0] "" +msgstr[1] "" + +#. TRANS: Menu item title in sample plugin. +msgid "A warm greeting" +msgstr "" + +#. TRANS: Plugin description. +msgid "A sample plugin to show basics of development for new hackers." +msgstr "" + +#. TRANS: Exception thrown when the user greeting count could not be saved in the database. +#. TRANS: %d is a user ID (number). +#, php-format +msgid "Could not save new greeting count for %d." +msgstr "" + +#. TRANS: Exception thrown when the user greeting count could not be saved in the database. +#. TRANS: %d is a user ID (number). +#, php-format +msgid "Could not increment greeting count for %d." +msgstr "" diff --git a/plugins/Sample/locale/ar/LC_MESSAGES/Sample.po b/plugins/Sample/locale/ar/LC_MESSAGES/Sample.po index f2b9883855..9853aeb58e 100644 --- a/plugins/Sample/locale/ar/LC_MESSAGES/Sample.po +++ b/plugins/Sample/locale/ar/LC_MESSAGES/Sample.po @@ -9,34 +9,41 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Sample\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:11+0000\n" -"Language-Team: Arabic \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:54+0000\n" +"Language-Team: Arabic \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:20+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ar\n" "X-Message-Group: #out-statusnet-plugin-sample\n" "Plural-Forms: nplurals=6; plural=(n == 0) ? 0 : ( (n == 1) ? 1 : ( (n == " "2) ? 2 : ( (n%100 >= 3 && n%100 <= 10) ? 3 : ( (n%100 >= 11 && n%100 <= " "99) ? 4 : 5 ) ) ) );\n" +#. TRANS: Page title for sample plugin. +#. TRANS: Menu item in sample plugin. msgid "Hello" msgstr "مرحبا" +#. TRANS: Page title for sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s!" msgstr "مرحبا يا %s!" +#. TRANS: Message in sample plugin. msgid "Hello, stranger!" msgstr "مرحبا أيها الغريب!" +#. TRANS: Message in sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s" msgstr "مرحبا يا %s" +#. TRANS: Message in sample plugin. +#. TRANS: %d is the number of times a user is greeted. #, php-format msgid "I have greeted you %d time." msgid_plural "I have greeted you %d times." @@ -47,9 +54,11 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" +#. TRANS: Menu item title in sample plugin. msgid "A warm greeting" msgstr "تحية حارة" +#. TRANS: Plugin description. msgid "A sample plugin to show basics of development for new hackers." msgstr "" diff --git a/plugins/Sample/locale/br/LC_MESSAGES/Sample.po b/plugins/Sample/locale/br/LC_MESSAGES/Sample.po index 1d74d9e3bd..69f213c2c3 100644 --- a/plugins/Sample/locale/br/LC_MESSAGES/Sample.po +++ b/plugins/Sample/locale/br/LC_MESSAGES/Sample.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - Sample to Breton (Brezhoneg) +# Translation of StatusNet - Sample to Breton (brezhoneg) # Exported from translatewiki.net # # Author: Y-M D @@ -9,41 +9,50 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Sample\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:11+0000\n" -"Language-Team: Breton \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:54+0000\n" +"Language-Team: Breton \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:20+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: br\n" "X-Message-Group: #out-statusnet-plugin-sample\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Page title for sample plugin. +#. TRANS: Menu item in sample plugin. msgid "Hello" msgstr "Demat" +#. TRANS: Page title for sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s!" msgstr "Demat, %s !" +#. TRANS: Message in sample plugin. msgid "Hello, stranger!" msgstr "Demat, estrañjour!" +#. TRANS: Message in sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s" msgstr "Demat, %s" +#. TRANS: Message in sample plugin. +#. TRANS: %d is the number of times a user is greeted. #, php-format msgid "I have greeted you %d time." msgid_plural "I have greeted you %d times." msgstr[0] "ur" msgstr[1] "%d" +#. TRANS: Menu item title in sample plugin. msgid "A warm greeting" msgstr "Un degemer tomm" +#. TRANS: Plugin description. msgid "A sample plugin to show basics of development for new hackers." msgstr "" "Ur skouer a lugant evit diskouez an diazezoù diorren evit ar c'hoderien " diff --git a/plugins/Sample/locale/ca/LC_MESSAGES/Sample.po b/plugins/Sample/locale/ca/LC_MESSAGES/Sample.po index 92848f4a18..f577c06194 100644 --- a/plugins/Sample/locale/ca/LC_MESSAGES/Sample.po +++ b/plugins/Sample/locale/ca/LC_MESSAGES/Sample.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - Sample to Catalan (Català) +# Translation of StatusNet - Sample to Catalan (català) # Exported from translatewiki.net # # Author: Toniher @@ -9,41 +9,50 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Sample\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:11+0000\n" -"Language-Team: Catalan \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:54+0000\n" +"Language-Team: Catalan \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:20+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ca\n" "X-Message-Group: #out-statusnet-plugin-sample\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Page title for sample plugin. +#. TRANS: Menu item in sample plugin. msgid "Hello" msgstr "Hola" +#. TRANS: Page title for sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s!" msgstr "Hola, %s" +#. TRANS: Message in sample plugin. msgid "Hello, stranger!" msgstr "Hola, foraster!" +#. TRANS: Message in sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s" msgstr "Hola, %s" +#. TRANS: Message in sample plugin. +#. TRANS: %d is the number of times a user is greeted. #, php-format msgid "I have greeted you %d time." msgid_plural "I have greeted you %d times." msgstr[0] "Us he saludat %d vegada." msgstr[1] "Us he saludat %d vegades." +#. TRANS: Menu item title in sample plugin. msgid "A warm greeting" msgstr "Una salutació cordial" +#. TRANS: Plugin description. msgid "A sample plugin to show basics of development for new hackers." msgstr "" diff --git a/plugins/Sample/locale/de/LC_MESSAGES/Sample.po b/plugins/Sample/locale/de/LC_MESSAGES/Sample.po index c3f081138d..ff5642da73 100644 --- a/plugins/Sample/locale/de/LC_MESSAGES/Sample.po +++ b/plugins/Sample/locale/de/LC_MESSAGES/Sample.po @@ -9,41 +9,50 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Sample\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:11+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:54+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:20+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-sample\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Page title for sample plugin. +#. TRANS: Menu item in sample plugin. msgid "Hello" msgstr "Hallo" +#. TRANS: Page title for sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s!" msgstr "Hallo %s!" +#. TRANS: Message in sample plugin. msgid "Hello, stranger!" msgstr "Hallo Fremder!" +#. TRANS: Message in sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s" msgstr "Hallo %s" +#. TRANS: Message in sample plugin. +#. TRANS: %d is the number of times a user is greeted. #, php-format msgid "I have greeted you %d time." msgid_plural "I have greeted you %d times." msgstr[0] "Ich habe dich einmal begrüßt. " msgstr[1] "Ich habe dich %d-mal begrüßt. " +#. TRANS: Menu item title in sample plugin. msgid "A warm greeting" msgstr "Ein herzlicher Gruß" +#. TRANS: Plugin description. msgid "A sample plugin to show basics of development for new hackers." msgstr "Ein Beispiel-Plugin, um die Entwicklungsbasis neuen Hackern zu zeigen." diff --git a/plugins/Sample/locale/es/LC_MESSAGES/Sample.po b/plugins/Sample/locale/es/LC_MESSAGES/Sample.po new file mode 100644 index 0000000000..740e4c178a --- /dev/null +++ b/plugins/Sample/locale/es/LC_MESSAGES/Sample.po @@ -0,0 +1,69 @@ +# Translation of StatusNet - Sample to Spanish (español) +# Exported from translatewiki.net +# +# Author: Armando-Martin +# Author: Peter17 +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Sample\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:54+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Page title for sample plugin. +#. TRANS: Menu item in sample plugin. +msgid "Hello" +msgstr "Hola" + +#. TRANS: Page title for sample plugin. %s is a user nickname. +#, php-format +msgid "Hello, %s!" +msgstr "¡ Hola, %s !" + +#. TRANS: Message in sample plugin. +msgid "Hello, stranger!" +msgstr "¡Hola, extraño!" + +#. TRANS: Message in sample plugin. %s is a user nickname. +#, php-format +msgid "Hello, %s" +msgstr "Hola, %s" + +#. TRANS: Message in sample plugin. +#. TRANS: %d is the number of times a user is greeted. +#, php-format +msgid "I have greeted you %d time." +msgid_plural "I have greeted you %d times." +msgstr[0] "%d vez." +msgstr[1] "%d veces." + +#. TRANS: Menu item title in sample plugin. +msgid "A warm greeting" +msgstr "Un cordial saludo" + +#. TRANS: Plugin description. +msgid "A sample plugin to show basics of development for new hackers." +msgstr "" +"Un complemento (plugin) de ejemplo para mostrar los principios básicos de " +"desarrollo a los nuevos programadores." + +#. TRANS: Exception thrown when the user greeting count could not be saved in the database. +#. TRANS: %d is a user ID (number). +#, php-format +msgid "Could not save new greeting count for %d." +msgstr "No se pudo guardar el número de saludos enviados a %d." + +#. TRANS: Exception thrown when the user greeting count could not be saved in the database. +#. TRANS: %d is a user ID (number). +#, php-format +msgid "Could not increment greeting count for %d." +msgstr "No se pudo incrementar el número de saludos enviados a %d." diff --git a/plugins/Sample/locale/eu/LC_MESSAGES/Sample.po b/plugins/Sample/locale/eu/LC_MESSAGES/Sample.po new file mode 100644 index 0000000000..d341773671 --- /dev/null +++ b/plugins/Sample/locale/eu/LC_MESSAGES/Sample.po @@ -0,0 +1,66 @@ +# Translation of StatusNet - Sample to Basque (euskara) +# Exported from translatewiki.net +# +# Author: Artsuaga +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Sample\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:54+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Page title for sample plugin. +#. TRANS: Menu item in sample plugin. +msgid "Hello" +msgstr "Kaixo" + +#. TRANS: Page title for sample plugin. %s is a user nickname. +#, php-format +msgid "Hello, %s!" +msgstr "" + +#. TRANS: Message in sample plugin. +msgid "Hello, stranger!" +msgstr "" + +#. TRANS: Message in sample plugin. %s is a user nickname. +#, php-format +msgid "Hello, %s" +msgstr "" + +#. TRANS: Message in sample plugin. +#. TRANS: %d is the number of times a user is greeted. +#, fuzzy, php-format +msgid "I have greeted you %d time." +msgid_plural "I have greeted you %d times." +msgstr[0] "Ekitaldi data/ordua" +msgstr[1] "" + +#. TRANS: Menu item title in sample plugin. +msgid "A warm greeting" +msgstr "" + +#. TRANS: Plugin description. +msgid "A sample plugin to show basics of development for new hackers." +msgstr "Frogako plugin bat, hacker berriei garapen oinarriak erakusteko." + +#. TRANS: Exception thrown when the user greeting count could not be saved in the database. +#. TRANS: %d is a user ID (number). +#, php-format +msgid "Could not save new greeting count for %d." +msgstr "Ezin izan da %d(e)ri bidalitako agur kopurua gorde." + +#. TRANS: Exception thrown when the user greeting count could not be saved in the database. +#. TRANS: %d is a user ID (number). +#, php-format +msgid "Could not increment greeting count for %d." +msgstr "Ezin izan da gehitu %d(r)i bidalitako agur kopurua." diff --git a/plugins/Sample/locale/fr/LC_MESSAGES/Sample.po b/plugins/Sample/locale/fr/LC_MESSAGES/Sample.po index c6b032da73..e98eb3f8ca 100644 --- a/plugins/Sample/locale/fr/LC_MESSAGES/Sample.po +++ b/plugins/Sample/locale/fr/LC_MESSAGES/Sample.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - Sample to French (Français) +# Translation of StatusNet - Sample to French (français) # Exported from translatewiki.net # # Author: Verdy p @@ -9,41 +9,50 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Sample\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:11+0000\n" -"Language-Team: French \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:54+0000\n" +"Language-Team: French \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:20+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-sample\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Page title for sample plugin. +#. TRANS: Menu item in sample plugin. msgid "Hello" msgstr "Bonjour" +#. TRANS: Page title for sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s!" msgstr "Bonjour, %s !" +#. TRANS: Message in sample plugin. msgid "Hello, stranger!" msgstr "Bonjour, étranger !" +#. TRANS: Message in sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s" msgstr "Bonjour, %s" +#. TRANS: Message in sample plugin. +#. TRANS: %d is the number of times a user is greeted. #, php-format msgid "I have greeted you %d time." msgid_plural "I have greeted you %d times." msgstr[0] "une" msgstr[1] "%d" +#. TRANS: Menu item title in sample plugin. msgid "A warm greeting" msgstr "Un accueil chaleureux" +#. TRANS: Plugin description. msgid "A sample plugin to show basics of development for new hackers." msgstr "" "Un exemple de greffon pour montrer les bases de développement pour les " diff --git a/plugins/Sample/locale/gl/LC_MESSAGES/Sample.po b/plugins/Sample/locale/gl/LC_MESSAGES/Sample.po index 4e7b02053d..11f6e0940d 100644 --- a/plugins/Sample/locale/gl/LC_MESSAGES/Sample.po +++ b/plugins/Sample/locale/gl/LC_MESSAGES/Sample.po @@ -1,5 +1,5 @@ -# Translation of StatusNet - Sample to Galician (Galego) -# Expored from translatewiki.net +# Translation of StatusNet - Sample to Galician (galego) +# Exported from translatewiki.net # # Author: Toliño # -- @@ -9,61 +9,63 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Sample\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-12-16 15:08+0000\n" -"PO-Revision-Date: 2010-12-16 15:12:53+0000\n" -"Language-Team: Galician \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:54+0000\n" +"Language-Team: Galician \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-11-30 20:43:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r78478); Translate extension (2010-09-17)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: gl\n" "X-Message-Group: #out-statusnet-plugin-sample\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#. TRANS: Exception thrown when the user greeting count could not be saved in the database. -#. TRANS: %d is a user ID (number). -#: User_greeting_count.php:164 -#, php-format -msgid "Could not save new greeting count for %d." -msgstr "" - -#. TRANS: Exception thrown when the user greeting count could not be saved in the database. -#. TRANS: %d is a user ID (number). -#: User_greeting_count.php:177 -#, php-format -msgid "Could not increment greeting count for %d." -msgstr "" - -#: SamplePlugin.php:259 hello.php:111 +#. TRANS: Page title for sample plugin. +#. TRANS: Menu item in sample plugin. msgid "Hello" msgstr "Ola" -#: SamplePlugin.php:259 -msgid "A warm greeting" -msgstr "" - -#: SamplePlugin.php:270 -msgid "A sample plugin to show basics of development for new hackers." -msgstr "" - -#: hello.php:113 +#. TRANS: Page title for sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s!" -msgstr "" +msgstr "Ola, %s!" -#: hello.php:133 +#. TRANS: Message in sample plugin. msgid "Hello, stranger!" -msgstr "" +msgstr "Ola, estraño!" -#: hello.php:136 +#. TRANS: Message in sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s" msgstr "Ola, %s" -#: hello.php:138 +#. TRANS: Message in sample plugin. +#. TRANS: %d is the number of times a user is greeted. #, php-format msgid "I have greeted you %d time." msgid_plural "I have greeted you %d times." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Saudeino %d vez." +msgstr[1] "Saudeino %d veces." + +#. TRANS: Menu item title in sample plugin. +msgid "A warm greeting" +msgstr "Un cordial saúdo" + +#. TRANS: Plugin description. +msgid "A sample plugin to show basics of development for new hackers." +msgstr "" +"Un complemento de exemplo para mostrar os principios básicos de " +"desenvolvemento aos novos programadores." + +#. TRANS: Exception thrown when the user greeting count could not be saved in the database. +#. TRANS: %d is a user ID (number). +#, php-format +msgid "Could not save new greeting count for %d." +msgstr "Non se puido gardar o número de saúdos enviados a %d." + +#. TRANS: Exception thrown when the user greeting count could not be saved in the database. +#. TRANS: %d is a user ID (number). +#, php-format +msgid "Could not increment greeting count for %d." +msgstr "Non se puido incrementar o número de saúdos enviados a %d." diff --git a/plugins/Sample/locale/ia/LC_MESSAGES/Sample.po b/plugins/Sample/locale/ia/LC_MESSAGES/Sample.po index c282f33fa3..3821a8bf78 100644 --- a/plugins/Sample/locale/ia/LC_MESSAGES/Sample.po +++ b/plugins/Sample/locale/ia/LC_MESSAGES/Sample.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - Sample to Interlingua (Interlingua) +# Translation of StatusNet - Sample to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,41 +9,50 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Sample\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:11+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:54+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:20+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-sample\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Page title for sample plugin. +#. TRANS: Menu item in sample plugin. msgid "Hello" msgstr "Salute" +#. TRANS: Page title for sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s!" msgstr "Salute %s!" +#. TRANS: Message in sample plugin. msgid "Hello, stranger!" msgstr "Salute estraniero!" +#. TRANS: Message in sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s" msgstr "Salute %s" +#. TRANS: Message in sample plugin. +#. TRANS: %d is the number of times a user is greeted. #, php-format msgid "I have greeted you %d time." msgid_plural "I have greeted you %d times." msgstr[0] "Io te ha salutate %d vice." msgstr[1] "Io te ha salutate %d vices." +#. TRANS: Menu item title in sample plugin. msgid "A warm greeting" msgstr "Un calide salutation" +#. TRANS: Plugin description. msgid "A sample plugin to show basics of development for new hackers." msgstr "" "Un plug-in de exemplo pro demonstrar le principios de disveloppamento pro " diff --git a/plugins/Sample/locale/lb/LC_MESSAGES/Sample.po b/plugins/Sample/locale/lb/LC_MESSAGES/Sample.po index 6f4bb899ec..825d20ca67 100644 --- a/plugins/Sample/locale/lb/LC_MESSAGES/Sample.po +++ b/plugins/Sample/locale/lb/LC_MESSAGES/Sample.po @@ -9,41 +9,50 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Sample\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:11+0000\n" -"Language-Team: Luxembourgish \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:55+0000\n" +"Language-Team: Luxembourgish \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:20+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: lb\n" "X-Message-Group: #out-statusnet-plugin-sample\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Page title for sample plugin. +#. TRANS: Menu item in sample plugin. msgid "Hello" msgstr "Salut" +#. TRANS: Page title for sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s!" msgstr "Salut %s!" +#. TRANS: Message in sample plugin. msgid "Hello, stranger!" msgstr "" +#. TRANS: Message in sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s" msgstr "Salut, %s" +#. TRANS: Message in sample plugin. +#. TRANS: %d is the number of times a user is greeted. #, php-format msgid "I have greeted you %d time." msgid_plural "I have greeted you %d times." msgstr[0] "" msgstr[1] "" +#. TRANS: Menu item title in sample plugin. msgid "A warm greeting" msgstr "E schéine Bonjour" +#. TRANS: Plugin description. msgid "A sample plugin to show basics of development for new hackers." msgstr "" diff --git a/plugins/Sample/locale/mk/LC_MESSAGES/Sample.po b/plugins/Sample/locale/mk/LC_MESSAGES/Sample.po index 67b58690af..72a8289670 100644 --- a/plugins/Sample/locale/mk/LC_MESSAGES/Sample.po +++ b/plugins/Sample/locale/mk/LC_MESSAGES/Sample.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - Sample to Macedonian (МакедонÑки) +# Translation of StatusNet - Sample to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 @@ -9,41 +9,50 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Sample\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:11+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:55+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:20+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-sample\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" +#. TRANS: Page title for sample plugin. +#. TRANS: Menu item in sample plugin. msgid "Hello" msgstr "Здраво" +#. TRANS: Page title for sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s!" msgstr "Здраво, %s!" +#. TRANS: Message in sample plugin. msgid "Hello, stranger!" msgstr "Здрво, незнајнику!" +#. TRANS: Message in sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s" msgstr "Здраво, %s" +#. TRANS: Message in sample plugin. +#. TRANS: %d is the number of times a user is greeted. #, php-format msgid "I have greeted you %d time." msgid_plural "I have greeted you %d times." msgstr[0] "Ве поздравив еднаш." msgstr[1] "Ве поздравив %d пати." +#. TRANS: Menu item title in sample plugin. msgid "A warm greeting" msgstr "Срдечен поздрав" +#. TRANS: Plugin description. msgid "A sample plugin to show basics of development for new hackers." msgstr "" "Приклучок-пример за оÑновите на развојното програмирање за нови хакери." diff --git a/plugins/Sample/locale/nl/LC_MESSAGES/Sample.po b/plugins/Sample/locale/nl/LC_MESSAGES/Sample.po index 14a7226d8e..8ae7489de0 100644 --- a/plugins/Sample/locale/nl/LC_MESSAGES/Sample.po +++ b/plugins/Sample/locale/nl/LC_MESSAGES/Sample.po @@ -1,6 +1,7 @@ # Translation of StatusNet - Sample to Dutch (Nederlands) # Exported from translatewiki.net # +# Author: SPQRobin # Author: Siebrand # -- # This file is distributed under the same license as the StatusNet package. @@ -9,44 +10,54 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Sample\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:12+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:55+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:20+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-sample\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Page title for sample plugin. +#. TRANS: Menu item in sample plugin. msgid "Hello" msgstr "Hallo" +#. TRANS: Page title for sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s!" msgstr "Hallo, %s!" +#. TRANS: Message in sample plugin. msgid "Hello, stranger!" msgstr "Hallo vreemdeling!" +#. TRANS: Message in sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s" msgstr "Hallo, %s" +#. TRANS: Message in sample plugin. +#. TRANS: %d is the number of times a user is greeted. #, php-format msgid "I have greeted you %d time." msgid_plural "I have greeted you %d times." msgstr[0] "Ik heb u voor de eerste keer gegroet." msgstr[1] "Ik heb u %d keer gegroet." +#. TRANS: Menu item title in sample plugin. msgid "A warm greeting" msgstr "Een warme begroeting" +#. TRANS: Plugin description. msgid "A sample plugin to show basics of development for new hackers." msgstr "" -"Een voorbeeldplug-in als basis voor ontwikkelingen door nieuwe hackers." +"Een voorbeeldplug-in om de basisprogrammeertechnieken te demonstreren aan " +"nieuwe ontwikkelaars." #. TRANS: Exception thrown when the user greeting count could not be saved in the database. #. TRANS: %d is a user ID (number). diff --git a/plugins/Sample/locale/pdc/LC_MESSAGES/Sample.po b/plugins/Sample/locale/pdc/LC_MESSAGES/Sample.po new file mode 100644 index 0000000000..82d97b7c17 --- /dev/null +++ b/plugins/Sample/locale/pdc/LC_MESSAGES/Sample.po @@ -0,0 +1,69 @@ +# Translation of StatusNet - Sample to Deitsch (Deitsch) +# Exported from translatewiki.net +# +# Author: Xqt +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Sample\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:55+0000\n" +"Language-Team: Deitsch \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: pdc\n" +"X-Message-Group: #out-statusnet-plugin-sample\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Page title for sample plugin. +#. TRANS: Menu item in sample plugin. +msgid "Hello" +msgstr "Heiya" + +#. TRANS: Page title for sample plugin. %s is a user nickname. +#, php-format +msgid "Hello, %s!" +msgstr "Heiya %s!" + +#. TRANS: Message in sample plugin. +msgid "Hello, stranger!" +msgstr "Heiya Fremmer!" + +#. TRANS: Message in sample plugin. %s is a user nickname. +#, php-format +msgid "Hello, %s" +msgstr "Heiya %s" + +#. TRANS: Message in sample plugin. +#. TRANS: %d is the number of times a user is greeted. +#, php-format +msgid "I have greeted you %d time." +msgid_plural "I have greeted you %d times." +msgstr[0] "" +msgstr[1] "" + +#. TRANS: Menu item title in sample plugin. +msgid "A warm greeting" +msgstr "" + +#. TRANS: Plugin description. +msgid "A sample plugin to show basics of development for new hackers." +msgstr "" + +#. TRANS: Exception thrown when the user greeting count could not be saved in the database. +#. TRANS: %d is a user ID (number). +#, php-format +msgid "Could not save new greeting count for %d." +msgstr "" + +#. TRANS: Exception thrown when the user greeting count could not be saved in the database. +#. TRANS: %d is a user ID (number). +#, php-format +msgid "Could not increment greeting count for %d." +msgstr "" diff --git a/plugins/Sample/locale/ru/LC_MESSAGES/Sample.po b/plugins/Sample/locale/ru/LC_MESSAGES/Sample.po index 0d344dd775..355ccbfb64 100644 --- a/plugins/Sample/locale/ru/LC_MESSAGES/Sample.po +++ b/plugins/Sample/locale/ru/LC_MESSAGES/Sample.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - Sample to Russian (РуÑÑкий) +# Translation of StatusNet - Sample to Russian (руÑÑкий) # Exported from translatewiki.net # # Author: Eleferen @@ -10,33 +10,40 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Sample\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:12+0000\n" -"Language-Team: Russian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:55+0000\n" +"Language-Team: Russian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:20+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ru\n" "X-Message-Group: #out-statusnet-plugin-sample\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Page title for sample plugin. +#. TRANS: Menu item in sample plugin. msgid "Hello" msgstr "Привет" +#. TRANS: Page title for sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s!" msgstr "ЗдравÑтвуйте, %s!" +#. TRANS: Message in sample plugin. msgid "Hello, stranger!" msgstr "Привет, незнакомец!" +#. TRANS: Message in sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s" msgstr "ЗдравÑтвуйте,%s" +#. TRANS: Message in sample plugin. +#. TRANS: %d is the number of times a user is greeted. #, php-format msgid "I have greeted you %d time." msgid_plural "I have greeted you %d times." @@ -44,9 +51,11 @@ msgstr[0] "Я Ð²Ð°Ñ Ð¿Ð¾Ð¿Ñ€Ð¸Ð²ÐµÑÑ‚Ñтвовал %d раз." msgstr[1] "Я Ð²Ð°Ñ Ð¿Ð¾Ð¿Ñ€Ð¸Ð²ÐµÑ‚Ñтвовал %d раза." msgstr[2] "Я Ð²Ð°Ñ Ð¿Ð¾Ð¿Ñ€Ð¸Ð²ÐµÑÑ‚Ñтвовал %d раз." +#. TRANS: Menu item title in sample plugin. msgid "A warm greeting" msgstr "" +#. TRANS: Plugin description. msgid "A sample plugin to show basics of development for new hackers." msgstr "" diff --git a/plugins/Sample/locale/tl/LC_MESSAGES/Sample.po b/plugins/Sample/locale/tl/LC_MESSAGES/Sample.po index acdda7e7f9..12b472d001 100644 --- a/plugins/Sample/locale/tl/LC_MESSAGES/Sample.po +++ b/plugins/Sample/locale/tl/LC_MESSAGES/Sample.po @@ -9,41 +9,50 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Sample\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:12+0000\n" -"Language-Team: Tagalog \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:55+0000\n" +"Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:20+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-sample\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Page title for sample plugin. +#. TRANS: Menu item in sample plugin. msgid "Hello" msgstr "Kumusta" +#. TRANS: Page title for sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s!" msgstr "Kumusta, %s!" +#. TRANS: Message in sample plugin. msgid "Hello, stranger!" msgstr "Kumusta, dayuhan!" +#. TRANS: Message in sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s" msgstr "Kumusta, %s" +#. TRANS: Message in sample plugin. +#. TRANS: %d is the number of times a user is greeted. #, php-format msgid "I have greeted you %d time." msgid_plural "I have greeted you %d times." msgstr[0] "Binati kita ng %d ulit." msgstr[1] "Binati kita ng %d mga ulit." +#. TRANS: Menu item title in sample plugin. msgid "A warm greeting" msgstr "Isang mainit-init na pagbati" +#. TRANS: Plugin description. msgid "A sample plugin to show basics of development for new hackers." msgstr "" "Isang halimbawang pampasak upang ipakita ang mga saligan ng kaunlaran para " diff --git a/plugins/Sample/locale/uk/LC_MESSAGES/Sample.po b/plugins/Sample/locale/uk/LC_MESSAGES/Sample.po index 23c1356ef7..4d8691fd7e 100644 --- a/plugins/Sample/locale/uk/LC_MESSAGES/Sample.po +++ b/plugins/Sample/locale/uk/LC_MESSAGES/Sample.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - Sample to Ukrainian (УкраїнÑька) +# Translation of StatusNet - Sample to Ukrainian (українÑька) # Exported from translatewiki.net # # Author: Boogie @@ -9,33 +9,40 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Sample\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:12+0000\n" -"Language-Team: Ukrainian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:55+0000\n" +"Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:20+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-sample\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Page title for sample plugin. +#. TRANS: Menu item in sample plugin. msgid "Hello" msgstr "Привіт" +#. TRANS: Page title for sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s!" msgstr "Привіт, %s!" +#. TRANS: Message in sample plugin. msgid "Hello, stranger!" msgstr "Привіт, чужинцю!" +#. TRANS: Message in sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s" msgstr "Привіт, %s" +#. TRANS: Message in sample plugin. +#. TRANS: %d is the number of times a user is greeted. #, php-format msgid "I have greeted you %d time." msgid_plural "I have greeted you %d times." @@ -43,9 +50,11 @@ msgstr[0] "Я привітав Ð²Ð°Ñ %d раз." msgstr[1] "Я привітав Ð²Ð°Ñ %d разів." msgstr[2] "Я привітав Ð²Ð°Ñ %d разів." +#. TRANS: Menu item title in sample plugin. msgid "A warm greeting" msgstr "Щирі вітаннÑ" +#. TRANS: Plugin description. msgid "A sample plugin to show basics of development for new hackers." msgstr "Приклад додатку Ð´Ð»Ñ Ð´ÐµÐ¼Ð¾Ð½Ñтрації оÑнов розробки новим гакерам." diff --git a/plugins/Sample/locale/zh_CN/LC_MESSAGES/Sample.po b/plugins/Sample/locale/zh_CN/LC_MESSAGES/Sample.po index 172059d8d2..1a26ab16de 100644 --- a/plugins/Sample/locale/zh_CN/LC_MESSAGES/Sample.po +++ b/plugins/Sample/locale/zh_CN/LC_MESSAGES/Sample.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - Sample to Simplified Chinese (‪中文(简体)‬) +# Translation of StatusNet - Sample to Simplified Chinese (‪中文(简体)‬) # Exported from translatewiki.net # # Author: ZhengYiFeng @@ -9,41 +9,50 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Sample\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:12+0000\n" -"Language-Team: Simplified Chinese \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:20+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: zh-hans\n" "X-Message-Group: #out-statusnet-plugin-sample\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Page title for sample plugin. +#. TRANS: Menu item in sample plugin. msgid "Hello" msgstr "你好" +#. TRANS: Page title for sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s!" msgstr "你好,%sï¼" +#. TRANS: Message in sample plugin. msgid "Hello, stranger!" msgstr "你好,陌生人ï¼" +#. TRANS: Message in sample plugin. %s is a user nickname. #, php-format msgid "Hello, %s" msgstr "你好,%s" +#. TRANS: Message in sample plugin. +#. TRANS: %d is the number of times a user is greeted. #, php-format msgid "I have greeted you %d time." msgid_plural "I have greeted you %d times." msgstr[0] "" +#. TRANS: Menu item title in sample plugin. msgid "A warm greeting" msgstr "一个热情的问候" +#. TRANS: Plugin description. msgid "A sample plugin to show basics of development for new hackers." msgstr "一个为新的 hackers 显示基础开å‘的示例æ’件。" diff --git a/plugins/SearchSub/SearchSub.php b/plugins/SearchSub/SearchSub.php index b903e88e2e..7e9a94caa9 100644 --- a/plugins/SearchSub/SearchSub.php +++ b/plugins/SearchSub/SearchSub.php @@ -147,18 +147,18 @@ class SearchSub extends Managed_DataObject $keypart = sprintf('searchsub:by_profile:%d', $profile->id); $searchstring = self::cacheGet($keypart); - if ($searchstring !== false && !empty($searchstring)) { - $searches = explode(',', $searchstring); + if ($searchstring !== false) { + if (!empty($searchstring)) { + $searches = explode(',', $searchstring); + } } else { $searchsub = new SearchSub(); $searchsub->profile_id = $profile->id; + $searchsub->selectAdd(); + $searchsub->selectAdd('search'); if ($searchsub->find()) { - while ($searchsub->fetch()) { - if (!empty($searchsub->search)) { - $searches[] = $searchsub->search; - } - } + $searches = $searchsub->fetchAll('search'); } self::cacheSet($keypart, implode(',', $searches)); diff --git a/plugins/SearchSub/SearchSubPlugin.php b/plugins/SearchSub/SearchSubPlugin.php index de131c2b04..858474240e 100644 --- a/plugins/SearchSub/SearchSubPlugin.php +++ b/plugins/SearchSub/SearchSubPlugin.php @@ -108,7 +108,6 @@ class SearchSubPlugin extends Plugin $m->connect('search/:search/unsubscribe', array('action' => 'searchunsub'), array('search' => Router::REGEX_TAG)); - $m->connect(':nickname/search-subscriptions', array('action' => 'searchsubs'), array('nickname' => Nickname::DISPLAY_FMT)); @@ -181,7 +180,7 @@ class SearchSubPlugin extends Plugin * or Sphinx search backends. * * @param Notice $notice - * @param string $search + * @param string $search * @return boolean */ function matchSearch(Notice $notice, $search) @@ -226,7 +225,6 @@ class SearchSubPlugin extends Plugin * * @return boolean hook return */ - function onEndSubGroupNav($widget) { $action = $widget->out; @@ -296,11 +294,11 @@ class SearchSubPlugin extends Plugin if (!empty($searches) && count($searches) > 0) { $searchSubMenu = new SearchSubMenu($menu->out, $user, $searches); - $menu->submenu(_m('Searches'), $searchSubMenu); + // TRANS: Sub menu for searches. + $menu->submenu(_m('MENU','Searches'), $searchSubMenu); } } return true; } - } diff --git a/plugins/SearchSub/locale/SearchSub.pot b/plugins/SearchSub/locale/SearchSub.pot index 9fa45419fd..ac01fd7ce2 100644 --- a/plugins/SearchSub/locale/SearchSub.pot +++ b/plugins/SearchSub/locale/SearchSub.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -73,19 +73,22 @@ msgid "\"%2$s\" since %3$s" msgstr "" #. TRANS: Error text shown a user tries to untrack a search query they're not subscribed to. -#: searchsubuntrackcommand.php:21 +#. TRANS: %s is the keyword for the search. +#: searchsubuntrackcommand.php:22 #, php-format msgid "You are not tracking the search \"%s\"." msgstr "" #. TRANS: Message given having failed to cancel a search subscription by untrack command. -#: searchsubuntrackcommand.php:29 +#. TRANS: %s is the keyword for the query. +#: searchsubuntrackcommand.php:31 #, php-format msgid "Could not end a search subscription for query \"%s\"." msgstr "" #. TRANS: Message given having removed a search subscription by untrack command. -#: searchsubuntrackcommand.php:35 +#. TRANS: %s is the keyword for the search. +#: searchsubuntrackcommand.php:38 #, php-format msgid "You are no longer subscribed to the search \"%s\"." msgstr "" @@ -116,15 +119,22 @@ msgstr "" msgid "Subscribed" msgstr "" -#: searchunsubform.php:96 searchunsubform.php:107 +#. TRANS: Form legend. +#: searchunsubform.php:90 msgid "Unsubscribe from this search" msgstr "" -#: searchunsubform.php:107 +#. TRANS: Button text for unsubscribing from a text search. +#: searchunsubform.php:102 msgctxt "BUTTON" msgid "Unsubscribe" msgstr "" +#. TRANS: Button title for unsubscribing from a text search. +#: searchunsubform.php:106 +msgid "Unsubscribe from this search." +msgstr "" + #. TRANS: Page title when search unsubscription succeeded. #: searchunsubaction.php:76 msgid "Unsubscribed" @@ -149,78 +159,90 @@ msgid "You are subscribed to the search \"%s\"." msgstr "" #. TRANS: Plugin description. -#: SearchSubPlugin.php:133 +#: SearchSubPlugin.php:132 msgid "Plugin to allow following all messages with a given search." msgstr "" #. TRANS: SearchSub plugin menu item on user settings page. -#: SearchSubPlugin.php:237 +#. TRANS: Sub menu for searches. +#: SearchSubPlugin.php:235 SearchSubPlugin.php:298 msgctxt "MENU" msgid "Searches" msgstr "" #. TRANS: SearchSub plugin tooltip for user settings menu item. -#: SearchSubPlugin.php:239 +#: SearchSubPlugin.php:237 msgid "Configure search subscriptions" msgstr "" #. TRANS: Help message for IM/SMS command "track " -#: SearchSubPlugin.php:277 +#: SearchSubPlugin.php:275 msgctxt "COMMANDHELP" msgid "Start following notices matching the given search query." msgstr "" #. TRANS: Help message for IM/SMS command "untrack " -#: SearchSubPlugin.php:279 +#: SearchSubPlugin.php:277 msgctxt "COMMANDHELP" msgid "Stop following notices matching the given search query." msgstr "" #. TRANS: Help message for IM/SMS command "track off" #. TRANS: Help message for IM/SMS command "untrack all" -#: SearchSubPlugin.php:281 SearchSubPlugin.php:283 +#: SearchSubPlugin.php:279 SearchSubPlugin.php:281 msgctxt "COMMANDHELP" msgid "Disable all tracked search subscriptions." msgstr "" #. TRANS: Help message for IM/SMS command "tracks" #. TRANS: Help message for IM/SMS command "tracking" -#: SearchSubPlugin.php:285 SearchSubPlugin.php:287 +#: SearchSubPlugin.php:283 SearchSubPlugin.php:285 msgctxt "COMMANDHELP" msgid "List all your search subscriptions." msgstr "" -#: SearchSubPlugin.php:299 -msgid "Searches" -msgstr "" - #. TRANS: Error text shown a user tries to disable all a search subscriptions with track off command, but has none. #: searchsubtrackingcommand.php:14 searchsubtrackoffcommand.php:14 msgid "You are not tracking any searches." msgstr "" -#. TRANS: Message given having disabled all search subscriptions with 'track off'. +#. TRANS: Separator for list of tracked searches. #: searchsubtrackingcommand.php:24 -#, php-format -msgid "You are tracking searches for: %s" +msgctxt "SEPARATOR" +msgid "\", \"" msgstr "" -#: searchsubform.php:116 searchsubform.php:140 +#. TRANS: Message given having disabled all search subscriptions with 'track off'. +#. TRANS: %s is a list of searches. Separator default is '", "'. +#: searchsubtrackingcommand.php:28 +#, php-format +msgid "You are tracking searches for: \"%s\"." +msgstr "" + +#. TRANS: Form legend. +#: searchsubform.php:110 msgid "Subscribe to this search" msgstr "" -#: searchsubform.php:140 +#. TRANS: Button text for subscribing to a search. +#: searchsubform.php:134 msgctxt "BUTTON" msgid "Subscribe" msgstr "" +#. TRANS: Button title for subscribing to a search. +#: searchsubform.php:138 +msgid "Subscribe to this search." +msgstr "" + #. TRANS: Message given having failed to cancel one of the search subs with 'track off' command. -#: searchsubtrackoffcommand.php:24 +#. TRANS: %s is the search for which the subscription removal failed. +#: searchsubtrackoffcommand.php:25 #, php-format msgid "Error disabling search subscription for query \"%s\"." msgstr "" #. TRANS: Message given having disabled all search subscriptions with 'track off'. -#: searchsubtrackoffcommand.php:31 +#: searchsubtrackoffcommand.php:32 msgid "Disabled all your search subscriptions." msgstr "" diff --git a/plugins/SearchSub/locale/ca/LC_MESSAGES/SearchSub.po b/plugins/SearchSub/locale/ca/LC_MESSAGES/SearchSub.po new file mode 100644 index 0000000000..5094271e7d --- /dev/null +++ b/plugins/SearchSub/locale/ca/LC_MESSAGES/SearchSub.po @@ -0,0 +1,219 @@ +# Translation of StatusNet - SearchSub to Catalan (català) +# Exported from translatewiki.net +# +# Author: Toniher +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - SearchSub\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:55+0000\n" +"Language-Team: Catalan \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: ca\n" +"X-Message-Group: #out-statusnet-plugin-searchsub\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Header for subscriptions overview for a user (first page). +#. TRANS: %s is a user nickname. +#, php-format +msgid "%s's search subscriptions" +msgstr "Subscripcions de cerca de %s" + +#. TRANS: Header for subscriptions overview for a user (not first page). +#. TRANS: %1$s is a user nickname, %2$d is the page number. +#, php-format +msgid "%1$s's search subscriptions, page %2$d" +msgstr "" + +#. TRANS: Page notice for page with an overview of all search subscriptions +#. TRANS: of the logged in user's own profile. +msgid "" +"You have subscribed to receive all notices on this site matching the " +"following searches:" +msgstr "" + +#. TRANS: Page notice for page with an overview of all subscriptions of a user other +#. TRANS: than the logged in user. %s is the user nickname. +#, php-format +msgid "" +"%s has subscribed to receive all notices on this site matching the following " +"searches:" +msgstr "" + +#. TRANS: Search subscription list text when the logged in user has no search subscriptions. +msgid "" +"You are not subscribed to any text searches right now. You can push the " +"\"Subscribe\" button on any notice text search to automatically receive any " +"public messages on this site that match that search, even if you are not " +"subscribed to the poster." +msgstr "" + +#. TRANS: Search subscription list text when looking at the subscriptions for a of a user other +#. TRANS: than the logged in user that has no search subscriptions. %s is the user nickname. +#. TRANS: Subscription list text when looking at the subscriptions for a of a user that has none +#. TRANS: as an anonymous user. %s is the user nickname. +#, php-format +msgid "%s is not subscribed to any searches." +msgstr "" + +#. TRANS: Search subscription list item. %1$s is a URL to a notice search, +#. TRANS: %2$s are the search criteria, %3$s is a datestring. +#, php-format +msgid "\"%2$s\" since %3$s" +msgstr "" + +#. TRANS: Error text shown a user tries to untrack a search query they're not subscribed to. +#. TRANS: %s is the keyword for the search. +#, php-format +msgid "You are not tracking the search \"%s\"." +msgstr "" + +#. TRANS: Message given having failed to cancel a search subscription by untrack command. +#. TRANS: %s is the keyword for the query. +#, php-format +msgid "Could not end a search subscription for query \"%s\"." +msgstr "" + +#. TRANS: Message given having removed a search subscription by untrack command. +#. TRANS: %s is the keyword for the search. +#, php-format +msgid "You are no longer subscribed to the search \"%s\"." +msgstr "" + +#. TRANS: Client error displayed trying to perform any request method other than POST. +#. TRANS: Do not translate POST. +msgid "This action only accepts POST requests." +msgstr "" + +#. TRANS: Client error displayed when the session token is not okay. +msgid "There was a problem with your session token. Try again, please." +msgstr "" + +#. TRANS: Error message displayed when trying to perform an action that requires a logged in user. +msgid "Not logged in." +msgstr "No s'ha iniciat una sessió." + +#. TRANS: Client error displayed trying to subscribe to a non-existing profile. +msgid "No such profile." +msgstr "No existeix el perfil." + +#. TRANS: Page title when search subscription succeeded. +msgid "Subscribed" +msgstr "Subscrit" + +#. TRANS: Form legend. +msgid "Unsubscribe from this search" +msgstr "Cancel·la la subscripció d'aquesta cerca" + +#. TRANS: Button text for unsubscribing from a text search. +msgctxt "BUTTON" +msgid "Unsubscribe" +msgstr "Cancel·la la subscripció" + +#. TRANS: Button title for unsubscribing from a text search. +msgid "Unsubscribe from this search." +msgstr "Cancel·la la subscripció d'aquesta cerca." + +#. TRANS: Page title when search unsubscription succeeded. +msgid "Unsubscribed" +msgstr "S'ha cancel·lat la subscripció" + +#. TRANS: Error text shown a user tries to track a search query they're already subscribed to. +#, php-format +msgid "You are already tracking the search \"%s\"." +msgstr "Ja esteu seguint la cerca «%s»." + +#. TRANS: Message given having failed to set up a search subscription by track command. +#, php-format +msgid "Could not start a search subscription for query \"%s\"." +msgstr "No s'ha pogut iniciar una subscripció de cerca de la consulta «%s»." + +#. TRANS: Message given having added a search subscription by track command. +#, php-format +msgid "You are subscribed to the search \"%s\"." +msgstr "Esteu subscrit a la cerca «%s»." + +#. TRANS: Plugin description. +msgid "Plugin to allow following all messages with a given search." +msgstr "" +"Connector per permetre seguir tots els missatges d'una cerca determinada." + +#. TRANS: SearchSub plugin menu item on user settings page. +#. TRANS: Sub menu for searches. +msgctxt "MENU" +msgid "Searches" +msgstr "Cerques" + +#. TRANS: SearchSub plugin tooltip for user settings menu item. +msgid "Configure search subscriptions" +msgstr "Configura les subscripcions de cerca" + +#. TRANS: Help message for IM/SMS command "track " +msgctxt "COMMANDHELP" +msgid "Start following notices matching the given search query." +msgstr "" +"Inicia el seguiment d'avisos que coincideixen amb el criteri de cerca donat." + +#. TRANS: Help message for IM/SMS command "untrack " +msgctxt "COMMANDHELP" +msgid "Stop following notices matching the given search query." +msgstr "" +"Atura el seguiment d'avisos que coincideixen amb el criteri de cerca donat." + +#. TRANS: Help message for IM/SMS command "track off" +#. TRANS: Help message for IM/SMS command "untrack all" +msgctxt "COMMANDHELP" +msgid "Disable all tracked search subscriptions." +msgstr "Inhabilita totes les subscripcions de cerca en seguiment." + +#. TRANS: Help message for IM/SMS command "tracks" +#. TRANS: Help message for IM/SMS command "tracking" +msgctxt "COMMANDHELP" +msgid "List all your search subscriptions." +msgstr "Llista totes les vostres subscripcions de cerca." + +#. TRANS: Error text shown a user tries to disable all a search subscriptions with track off command, but has none. +msgid "You are not tracking any searches." +msgstr "No esteu seguint cap cerca." + +#. TRANS: Separator for list of tracked searches. +msgctxt "SEPARATOR" +msgid "\", \"" +msgstr "\", \"" + +#. TRANS: Message given having disabled all search subscriptions with 'track off'. +#. TRANS: %s is a list of searches. Separator default is '", "'. +#, php-format +msgid "You are tracking searches for: \"%s\"." +msgstr "Esteu seguint les cerques de: «%s»." + +#. TRANS: Form legend. +msgid "Subscribe to this search" +msgstr "Subscriu a aquesta cerca" + +#. TRANS: Button text for subscribing to a search. +msgctxt "BUTTON" +msgid "Subscribe" +msgstr "Subscriu" + +#. TRANS: Button title for subscribing to a search. +msgid "Subscribe to this search." +msgstr "Subscriviu-vos a la cerca." + +#. TRANS: Message given having failed to cancel one of the search subs with 'track off' command. +#. TRANS: %s is the search for which the subscription removal failed. +#, php-format +msgid "Error disabling search subscription for query \"%s\"." +msgstr "" + +#. TRANS: Message given having disabled all search subscriptions with 'track off'. +msgid "Disabled all your search subscriptions." +msgstr "" diff --git a/plugins/SearchSub/locale/de/LC_MESSAGES/SearchSub.po b/plugins/SearchSub/locale/de/LC_MESSAGES/SearchSub.po index b4b048e0ae..c5c640194e 100644 --- a/plugins/SearchSub/locale/de/LC_MESSAGES/SearchSub.po +++ b/plugins/SearchSub/locale/de/LC_MESSAGES/SearchSub.po @@ -1,6 +1,7 @@ # Translation of StatusNet - SearchSub to German (Deutsch) # Exported from translatewiki.net # +# Author: ChrisiPK # Author: Giftpflanze # -- # This file is distributed under the same license as the StatusNet package. @@ -9,14 +10,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SearchSub\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:15+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:56+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:20+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-searchsub\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -79,16 +80,19 @@ msgid "\"%2$s\" since %3$s" msgstr "„%2$s“ seit %3$s" #. TRANS: Error text shown a user tries to untrack a search query they're not subscribed to. +#. TRANS: %s is the keyword for the search. #, php-format msgid "You are not tracking the search \"%s\"." msgstr "Du verfolgst die Suche „%s“ nicht." #. TRANS: Message given having failed to cancel a search subscription by untrack command. +#. TRANS: %s is the keyword for the query. #, php-format msgid "Could not end a search subscription for query \"%s\"." msgstr "Konnte Abonnement für Suche „%s“ nicht beenden." #. TRANS: Message given having removed a search subscription by untrack command. +#. TRANS: %s is the keyword for the search. #, php-format msgid "You are no longer subscribed to the search \"%s\"." msgstr "Du verfolgst die Suche „%s“ nicht länger." @@ -114,13 +118,19 @@ msgstr "Kein solches Profil." msgid "Subscribed" msgstr "Abonniert" +#. TRANS: Form legend. msgid "Unsubscribe from this search" msgstr "Diese Suche nicht länger verfolgen" +#. TRANS: Button text for unsubscribing from a text search. msgctxt "BUTTON" msgid "Unsubscribe" msgstr "Abbestellen" +#. TRANS: Button title for unsubscribing from a text search. +msgid "Unsubscribe from this search." +msgstr "Diese Suche nicht länger verfolgen." + #. TRANS: Page title when search unsubscription succeeded. msgid "Unsubscribed" msgstr "Abbestellt" @@ -147,6 +157,7 @@ msgstr "" "übereinstimmen." #. TRANS: SearchSub plugin menu item on user settings page. +#. TRANS: Sub menu for searches. msgctxt "MENU" msgid "Searches" msgstr "Suchen" @@ -179,26 +190,36 @@ msgctxt "COMMANDHELP" msgid "List all your search subscriptions." msgstr "Alle Suchabonnements auflisten." -msgid "Searches" -msgstr "Suchen" - #. TRANS: Error text shown a user tries to disable all a search subscriptions with track off command, but has none. msgid "You are not tracking any searches." msgstr "Du verfolgst keine Suchen." -#. TRANS: Message given having disabled all search subscriptions with 'track off'. -#, php-format -msgid "You are tracking searches for: %s" -msgstr "Du verfolgst Suchen für: %s" +#. TRANS: Separator for list of tracked searches. +msgctxt "SEPARATOR" +msgid "\", \"" +msgstr "“, „" +#. TRANS: Message given having disabled all search subscriptions with 'track off'. +#. TRANS: %s is a list of searches. Separator default is '", "'. +#, php-format +msgid "You are tracking searches for: \"%s\"." +msgstr "Du verfolgst Suchen für: „%s“." + +#. TRANS: Form legend. msgid "Subscribe to this search" msgstr "Diese Suche abonnieren" +#. TRANS: Button text for subscribing to a search. msgctxt "BUTTON" msgid "Subscribe" msgstr "Abonnieren" +#. TRANS: Button title for subscribing to a search. +msgid "Subscribe to this search." +msgstr "Diese Suche abonnieren." + #. TRANS: Message given having failed to cancel one of the search subs with 'track off' command. +#. TRANS: %s is the search for which the subscription removal failed. #, php-format msgid "Error disabling search subscription for query \"%s\"." msgstr "Fehler bei der Abbestellung der Suche „%s“." diff --git a/plugins/SearchSub/locale/es/LC_MESSAGES/SearchSub.po b/plugins/SearchSub/locale/es/LC_MESSAGES/SearchSub.po new file mode 100644 index 0000000000..9d54a502db --- /dev/null +++ b/plugins/SearchSub/locale/es/LC_MESSAGES/SearchSub.po @@ -0,0 +1,230 @@ +# Translation of StatusNet - SearchSub to Spanish (español) +# Exported from translatewiki.net +# +# Author: Armando-Martin +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - SearchSub\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:56+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Header for subscriptions overview for a user (first page). +#. TRANS: %s is a user nickname. +#, php-format +msgid "%s's search subscriptions" +msgstr "Subscripciones a búsquedas de %s" + +#. TRANS: Header for subscriptions overview for a user (not first page). +#. TRANS: %1$s is a user nickname, %2$d is the page number. +#, php-format +msgid "%1$s's search subscriptions, page %2$d" +msgstr "suscripciones a búsquedas de %1$s, página %2$d" + +#. TRANS: Page notice for page with an overview of all search subscriptions +#. TRANS: of the logged in user's own profile. +msgid "" +"You have subscribed to receive all notices on this site matching the " +"following searches:" +msgstr "" +"Se ha suscrito para recibir todos los avisos de este sitio que contengan las " +"búsquedas siguientes:" + +#. TRANS: Page notice for page with an overview of all subscriptions of a user other +#. TRANS: than the logged in user. %s is the user nickname. +#, php-format +msgid "" +"%s has subscribed to receive all notices on this site matching the following " +"searches:" +msgstr "" +"%s se ha suscrito para recibir todos los avisos de este sitio que contengan " +"las búsquedas siguientes:" + +#. TRANS: Search subscription list text when the logged in user has no search subscriptions. +msgid "" +"You are not subscribed to any text searches right now. You can push the " +"\"Subscribe\" button on any notice text search to automatically receive any " +"public messages on this site that match that search, even if you are not " +"subscribed to the poster." +msgstr "" +"No está suscrito ahora a ninguna búsqueda de texto. Puede pulsar el botón " +"\"Suscribirse\" en cualquier aviso de búsqueda de texto para recibir " +"automáticamente los mensajes públicos de este sitio que utilicen esa " +"búsqueda, incluso si no está suscrito al autor." + +#. TRANS: Search subscription list text when looking at the subscriptions for a of a user other +#. TRANS: than the logged in user that has no search subscriptions. %s is the user nickname. +#. TRANS: Subscription list text when looking at the subscriptions for a of a user that has none +#. TRANS: as an anonymous user. %s is the user nickname. +#, php-format +msgid "%s is not subscribed to any searches." +msgstr "%s no está suscrito a ninguna búsqueda." + +#. TRANS: Search subscription list item. %1$s is a URL to a notice search, +#. TRANS: %2$s are the search criteria, %3$s is a datestring. +#, php-format +msgid "\"%2$s\" since %3$s" +msgstr "\"%2$s\" desde %3$s" + +#. TRANS: Error text shown a user tries to untrack a search query they're not subscribed to. +#. TRANS: %s is the keyword for the search. +#, php-format +msgid "You are not tracking the search \"%s\"." +msgstr "No está siguiendo la búsqueda \"%s\"." + +#. TRANS: Message given having failed to cancel a search subscription by untrack command. +#. TRANS: %s is the keyword for the query. +#, php-format +msgid "Could not end a search subscription for query \"%s\"." +msgstr "" +"No se pudo finalizar una suscripción de búsqueda para la consulta \"%s\"." + +#. TRANS: Message given having removed a search subscription by untrack command. +#. TRANS: %s is the keyword for the search. +#, php-format +msgid "You are no longer subscribed to the search \"%s\"." +msgstr "Ya no está suscrito a la búsqueda \"%s\"." + +#. TRANS: Client error displayed trying to perform any request method other than POST. +#. TRANS: Do not translate POST. +msgid "This action only accepts POST requests." +msgstr "Esta acción sólo acepta solicitudes POST." + +#. TRANS: Client error displayed when the session token is not okay. +msgid "There was a problem with your session token. Try again, please." +msgstr "Hubo un problema con su contraseña de sesión. Inténtelo de nuevo." + +#. TRANS: Error message displayed when trying to perform an action that requires a logged in user. +msgid "Not logged in." +msgstr "No ha iniciado sesión" + +#. TRANS: Client error displayed trying to subscribe to a non-existing profile. +msgid "No such profile." +msgstr "No existe tal perfil." + +#. TRANS: Page title when search subscription succeeded. +msgid "Subscribed" +msgstr "Suscrito" + +#. TRANS: Form legend. +msgid "Unsubscribe from this search" +msgstr "Cancelar la suscripción a esta búsqueda" + +#. TRANS: Button text for unsubscribing from a text search. +msgctxt "BUTTON" +msgid "Unsubscribe" +msgstr "Cancelar la suscripción" + +#. TRANS: Button title for unsubscribing from a text search. +msgid "Unsubscribe from this search." +msgstr "Cancelar la suscripción a esta búsqueda." + +#. TRANS: Page title when search unsubscription succeeded. +msgid "Unsubscribed" +msgstr "Ha cancelado la suscripción" + +#. TRANS: Error text shown a user tries to track a search query they're already subscribed to. +#, php-format +msgid "You are already tracking the search \"%s\"." +msgstr "Ya está siguiendo la búsqueda \"%s\"." + +#. TRANS: Message given having failed to set up a search subscription by track command. +#, php-format +msgid "Could not start a search subscription for query \"%s\"." +msgstr "" +"No se pudo iniciar una suscripción de búsqueda para la consulta \"%s\"." + +#. TRANS: Message given having added a search subscription by track command. +#, php-format +msgid "You are subscribed to the search \"%s\"." +msgstr "Está suscrito a la búsqueda \"%s\"." + +#. TRANS: Plugin description. +msgid "Plugin to allow following all messages with a given search." +msgstr "" +"Complemento (plugin) para permitir seguir todos los mensajes con una " +"búsqueda determinada." + +#. TRANS: SearchSub plugin menu item on user settings page. +#. TRANS: Sub menu for searches. +msgctxt "MENU" +msgid "Searches" +msgstr "Búsquedas" + +#. TRANS: SearchSub plugin tooltip for user settings menu item. +msgid "Configure search subscriptions" +msgstr "Configurar las suscripciones de búsqueda" + +#. TRANS: Help message for IM/SMS command "track " +msgctxt "COMMANDHELP" +msgid "Start following notices matching the given search query." +msgstr "" +"Empezar a seguir los avisos que coincidan con la consulta de búsqueda " +"especificada." + +#. TRANS: Help message for IM/SMS command "untrack " +msgctxt "COMMANDHELP" +msgid "Stop following notices matching the given search query." +msgstr "" +"Dejar de seguir los avisos que coincidan con la consulta de búsqueda " +"especificada." + +#. TRANS: Help message for IM/SMS command "track off" +#. TRANS: Help message for IM/SMS command "untrack all" +msgctxt "COMMANDHELP" +msgid "Disable all tracked search subscriptions." +msgstr "Desactivar todas las suscripciones de búsqueda que estaba siguiendo." + +#. TRANS: Help message for IM/SMS command "tracks" +#. TRANS: Help message for IM/SMS command "tracking" +msgctxt "COMMANDHELP" +msgid "List all your search subscriptions." +msgstr "Enumerar todas sus suscripciones de búsqueda." + +#. TRANS: Error text shown a user tries to disable all a search subscriptions with track off command, but has none. +msgid "You are not tracking any searches." +msgstr "No está siguiendo ninguna búsqueda." + +#. TRANS: Separator for list of tracked searches. +msgctxt "SEPARATOR" +msgid "\", \"" +msgstr "\", \"" + +#. TRANS: Message given having disabled all search subscriptions with 'track off'. +#. TRANS: %s is a list of searches. Separator default is '", "'. +#, php-format +msgid "You are tracking searches for: \"%s\"." +msgstr "Está siguiendo las búsquedas de: \"%s\"." + +#. TRANS: Form legend. +msgid "Subscribe to this search" +msgstr "Suscribirse a esta búsqueda" + +#. TRANS: Button text for subscribing to a search. +msgctxt "BUTTON" +msgid "Subscribe" +msgstr "Suscribirse" + +#. TRANS: Button title for subscribing to a search. +msgid "Subscribe to this search." +msgstr "Suscribirse a esta búsqueda." + +#. TRANS: Message given having failed to cancel one of the search subs with 'track off' command. +#. TRANS: %s is the search for which the subscription removal failed. +#, php-format +msgid "Error disabling search subscription for query \"%s\"." +msgstr "" +"Error al desactivar la suscripción de búsqueda para la consulta \"%s\"." + +#. TRANS: Message given having disabled all search subscriptions with 'track off'. +msgid "Disabled all your search subscriptions." +msgstr "Desactivar todas sus suscripciones de búsqueda." diff --git a/plugins/SearchSub/locale/eu/LC_MESSAGES/SearchSub.po b/plugins/SearchSub/locale/eu/LC_MESSAGES/SearchSub.po new file mode 100644 index 0000000000..8e631460bb --- /dev/null +++ b/plugins/SearchSub/locale/eu/LC_MESSAGES/SearchSub.po @@ -0,0 +1,213 @@ +# Translation of StatusNet - SearchSub to Basque (euskara) +# Exported from translatewiki.net +# +# Author: Artsuaga +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - SearchSub\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:56+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Header for subscriptions overview for a user (first page). +#. TRANS: %s is a user nickname. +#, php-format +msgid "%s's search subscriptions" +msgstr "%s(r)en bilaketa harpidetzak" + +#. TRANS: Header for subscriptions overview for a user (not first page). +#. TRANS: %1$s is a user nickname, %2$d is the page number. +#, fuzzy, php-format +msgid "%1$s's search subscriptions, page %2$d" +msgstr "%1$s(r)en bilaketa harpidetzak, %2$s. orria" + +#. TRANS: Page notice for page with an overview of all search subscriptions +#. TRANS: of the logged in user's own profile. +msgid "" +"You have subscribed to receive all notices on this site matching the " +"following searches:" +msgstr "" + +#. TRANS: Page notice for page with an overview of all subscriptions of a user other +#. TRANS: than the logged in user. %s is the user nickname. +#, php-format +msgid "" +"%s has subscribed to receive all notices on this site matching the following " +"searches:" +msgstr "" + +#. TRANS: Search subscription list text when the logged in user has no search subscriptions. +msgid "" +"You are not subscribed to any text searches right now. You can push the " +"\"Subscribe\" button on any notice text search to automatically receive any " +"public messages on this site that match that search, even if you are not " +"subscribed to the poster." +msgstr "" + +#. TRANS: Search subscription list text when looking at the subscriptions for a of a user other +#. TRANS: than the logged in user that has no search subscriptions. %s is the user nickname. +#. TRANS: Subscription list text when looking at the subscriptions for a of a user that has none +#. TRANS: as an anonymous user. %s is the user nickname. +#, php-format +msgid "%s is not subscribed to any searches." +msgstr "" + +#. TRANS: Search subscription list item. %1$s is a URL to a notice search, +#. TRANS: %2$s are the search criteria, %3$s is a datestring. +#, php-format +msgid "\"%2$s\" since %3$s" +msgstr "\"%2$s\" %3$s(e)tik." + +#. TRANS: Error text shown a user tries to untrack a search query they're not subscribed to. +#. TRANS: %s is the keyword for the search. +#, php-format +msgid "You are not tracking the search \"%s\"." +msgstr "Ez zara \"%s\" bilaketa jarraitzen ari." + +#. TRANS: Message given having failed to cancel a search subscription by untrack command. +#. TRANS: %s is the keyword for the query. +#, php-format +msgid "Could not end a search subscription for query \"%s\"." +msgstr "" + +#. TRANS: Message given having removed a search subscription by untrack command. +#. TRANS: %s is the keyword for the search. +#, php-format +msgid "You are no longer subscribed to the search \"%s\"." +msgstr "" + +#. TRANS: Client error displayed trying to perform any request method other than POST. +#. TRANS: Do not translate POST. +msgid "This action only accepts POST requests." +msgstr "Ekintza honek POST eskariak soilik onartzen ditu." + +#. TRANS: Client error displayed when the session token is not okay. +msgid "There was a problem with your session token. Try again, please." +msgstr "Arazoa egon da zure saio-tokenarekin. Saiatu berriro, mesedez." + +#. TRANS: Error message displayed when trying to perform an action that requires a logged in user. +msgid "Not logged in." +msgstr "Saioa hasi gabe." + +#. TRANS: Client error displayed trying to subscribe to a non-existing profile. +msgid "No such profile." +msgstr "Profil hori ez dago." + +#. TRANS: Page title when search subscription succeeded. +msgid "Subscribed" +msgstr "Harpidetua" + +#. TRANS: Form legend. +msgid "Unsubscribe from this search" +msgstr "Eten bilaketa honekiko harpidetza" + +#. TRANS: Button text for unsubscribing from a text search. +msgctxt "BUTTON" +msgid "Unsubscribe" +msgstr "Harpidetza kendu" + +#. TRANS: Button title for unsubscribing from a text search. +msgid "Unsubscribe from this search." +msgstr "KEten bilaketa honekiko harpidetza" + +#. TRANS: Page title when search unsubscription succeeded. +msgid "Unsubscribed" +msgstr "Harpidetu gabea" + +#. TRANS: Error text shown a user tries to track a search query they're already subscribed to. +#, php-format +msgid "You are already tracking the search \"%s\"." +msgstr "Dagoeneko \"%s\" bilaketa jarraitzen ari zara." + +#. TRANS: Message given having failed to set up a search subscription by track command. +#, php-format +msgid "Could not start a search subscription for query \"%s\"." +msgstr "" + +#. TRANS: Message given having added a search subscription by track command. +#, php-format +msgid "You are subscribed to the search \"%s\"." +msgstr "\"%s\" bilaketara harpideturik zaude." + +#. TRANS: Plugin description. +msgid "Plugin to allow following all messages with a given search." +msgstr "" + +#. TRANS: SearchSub plugin menu item on user settings page. +#. TRANS: Sub menu for searches. +msgctxt "MENU" +msgid "Searches" +msgstr "" + +#. TRANS: SearchSub plugin tooltip for user settings menu item. +msgid "Configure search subscriptions" +msgstr "Konfiguratu bilaketa harpidetzak" + +#. TRANS: Help message for IM/SMS command "track " +msgctxt "COMMANDHELP" +msgid "Start following notices matching the given search query." +msgstr "" + +#. TRANS: Help message for IM/SMS command "untrack " +msgctxt "COMMANDHELP" +msgid "Stop following notices matching the given search query." +msgstr "" + +#. TRANS: Help message for IM/SMS command "track off" +#. TRANS: Help message for IM/SMS command "untrack all" +msgctxt "COMMANDHELP" +msgid "Disable all tracked search subscriptions." +msgstr "" + +#. TRANS: Help message for IM/SMS command "tracks" +#. TRANS: Help message for IM/SMS command "tracking" +msgctxt "COMMANDHELP" +msgid "List all your search subscriptions." +msgstr "" + +#. TRANS: Error text shown a user tries to disable all a search subscriptions with track off command, but has none. +msgid "You are not tracking any searches." +msgstr "Ez zara bilaketarik jarraitzen ari." + +#. TRANS: Separator for list of tracked searches. +msgctxt "SEPARATOR" +msgid "\", \"" +msgstr "" + +#. TRANS: Message given having disabled all search subscriptions with 'track off'. +#. TRANS: %s is a list of searches. Separator default is '", "'. +#, php-format +msgid "You are tracking searches for: \"%s\"." +msgstr "Jarraitzen ari zaren bilaketak: \"%s\"." + +#. TRANS: Form legend. +msgid "Subscribe to this search" +msgstr "Harpidetu bilaketa honetara" + +#. TRANS: Button text for subscribing to a search. +msgctxt "BUTTON" +msgid "Subscribe" +msgstr "Harpidetu" + +#. TRANS: Button title for subscribing to a search. +msgid "Subscribe to this search." +msgstr "Harpidetu bilaketa honetara" + +#. TRANS: Message given having failed to cancel one of the search subs with 'track off' command. +#. TRANS: %s is the search for which the subscription removal failed. +#, php-format +msgid "Error disabling search subscription for query \"%s\"." +msgstr "" + +#. TRANS: Message given having disabled all search subscriptions with 'track off'. +msgid "Disabled all your search subscriptions." +msgstr "" diff --git a/plugins/SearchSub/locale/fr/LC_MESSAGES/SearchSub.po b/plugins/SearchSub/locale/fr/LC_MESSAGES/SearchSub.po index 1abb6b766b..672e34a2d9 100644 --- a/plugins/SearchSub/locale/fr/LC_MESSAGES/SearchSub.po +++ b/plugins/SearchSub/locale/fr/LC_MESSAGES/SearchSub.po @@ -1,7 +1,8 @@ -# Translation of StatusNet - SearchSub to French (Français) +# Translation of StatusNet - SearchSub to French (français) # Exported from translatewiki.net # # Author: Brunoperel +# Author: Gomoko # Author: Iketsi # Author: Od1n # -- @@ -11,14 +12,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SearchSub\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:15+0000\n" -"Language-Team: French \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:56+0000\n" +"Language-Team: French \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:20+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-searchsub\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" @@ -27,13 +28,13 @@ msgstr "" #. TRANS: %s is a user nickname. #, php-format msgid "%s's search subscriptions" -msgstr "" +msgstr "souscriptions aux recherches de %s" #. TRANS: Header for subscriptions overview for a user (not first page). #. TRANS: %1$s is a user nickname, %2$d is the page number. #, php-format msgid "%1$s's search subscriptions, page %2$d" -msgstr "" +msgstr "souscriptions aux recherches de %1$s, page %2$d" #. TRANS: Page notice for page with an overview of all search subscriptions #. TRANS: of the logged in user's own profile. @@ -41,6 +42,8 @@ msgid "" "You have subscribed to receive all notices on this site matching the " "following searches:" msgstr "" +"Vous vous êtes inscrit pour recevoir tous les avertissements de ce site " +"correspondant aux recherches suivantes:" #. TRANS: Page notice for page with an overview of all subscriptions of a user other #. TRANS: than the logged in user. %s is the user nickname. @@ -49,6 +52,8 @@ msgid "" "%s has subscribed to receive all notices on this site matching the following " "searches:" msgstr "" +"%s s'est inscrit pour recevoir tous les avertissements de ce site " +"correspondant aux recherches suivantes:" #. TRANS: Search subscription list text when the logged in user has no search subscriptions. msgid "" @@ -57,6 +62,10 @@ msgid "" "public messages on this site that match that search, even if you are not " "subscribed to the poster." msgstr "" +"Vous n'êtes désormais abonné à aucune des recherches de texte. Vous pouvez " +"appuyer sur le bouton \"S'abonner\" sur n'importe quel avis de recherche de " +"texte pour recevoir automatiquement les messages publics sur ce site qui " +"correspondent à cette recherche, même si vous n'êtes pas abonné au publieur." #. TRANS: Search subscription list text when looking at the subscriptions for a of a user other #. TRANS: than the logged in user that has no search subscriptions. %s is the user nickname. @@ -64,7 +73,7 @@ msgstr "" #. TRANS: as an anonymous user. %s is the user nickname. #, php-format msgid "%s is not subscribed to any searches." -msgstr "" +msgstr "%s n'est abonné à aucune recherche." #. TRANS: Search subscription list item. %1$s is a URL to a notice search, #. TRANS: %2$s are the search criteria, %3$s is a datestring. @@ -73,17 +82,20 @@ msgid "\"%2$s\" since %3$s" msgstr "\"%2$s\" depuis le %3$s" #. TRANS: Error text shown a user tries to untrack a search query they're not subscribed to. +#. TRANS: %s is the keyword for the search. #, php-format msgid "You are not tracking the search \"%s\"." msgstr "Vous ne surveillez pas la recherche \"%s\"." #. TRANS: Message given having failed to cancel a search subscription by untrack command. +#. TRANS: %s is the keyword for the query. #, php-format msgid "Could not end a search subscription for query \"%s\"." msgstr "" "Impossible de mettre fin à un suivi de recherche pour la requête \"%s\"." #. TRANS: Message given having removed a search subscription by untrack command. +#. TRANS: %s is the keyword for the search. #, php-format msgid "You are no longer subscribed to the search \"%s\"." msgstr "Vous ne surveillez plus la recherche \"%s\"." @@ -110,16 +122,22 @@ msgstr "Profil non trouvé." msgid "Subscribed" msgstr "Abonné" +#. TRANS: Form legend. msgid "Unsubscribe from this search" msgstr "Cesser la surveillance de cette recherche" +#. TRANS: Button text for unsubscribing from a text search. msgctxt "BUTTON" msgid "Unsubscribe" -msgstr "" +msgstr "Se désabonner" + +#. TRANS: Button title for unsubscribing from a text search. +msgid "Unsubscribe from this search." +msgstr "Se désabonner de cette recherche." #. TRANS: Page title when search unsubscription succeeded. msgid "Unsubscribed" -msgstr "désabonné" +msgstr "Désabonné" #. TRANS: Error text shown a user tries to track a search query they're already subscribed to. #, php-format @@ -130,6 +148,7 @@ msgstr "Vous surveillez déjà la recherche \"%s\"." #, php-format msgid "Could not start a search subscription for query \"%s\"." msgstr "" +"Impossible de démarrer l'abonnement à une recherche pour la requête \"%s\"." #. TRANS: Message given having added a search subscription by track command. #, php-format @@ -142,6 +161,7 @@ msgstr "" "Plugin pour permettre de suivre tous les messages pour une recherche donnée." #. TRANS: SearchSub plugin menu item on user settings page. +#. TRANS: Sub menu for searches. msgctxt "MENU" msgid "Searches" msgstr "Recherches" @@ -154,17 +174,21 @@ msgstr "Configurer les surveillances de recherche" msgctxt "COMMANDHELP" msgid "Start following notices matching the given search query." msgstr "" +"Commencer le suivi des notifications correspondant à la requête de recherche " +"fournie." #. TRANS: Help message for IM/SMS command "untrack " msgctxt "COMMANDHELP" msgid "Stop following notices matching the given search query." msgstr "" +"Arrêter le suivi des notifications correspondant à la requête de recherche " +"fournie." #. TRANS: Help message for IM/SMS command "track off" #. TRANS: Help message for IM/SMS command "untrack all" msgctxt "COMMANDHELP" msgid "Disable all tracked search subscriptions." -msgstr "" +msgstr "Désactiver tous les abonnements aux recherches suivies." #. TRANS: Help message for IM/SMS command "tracks" #. TRANS: Help message for IM/SMS command "tracking" @@ -172,26 +196,36 @@ msgctxt "COMMANDHELP" msgid "List all your search subscriptions." msgstr "Lister toutes vos surveillances de recherche." -msgid "Searches" -msgstr "Recherches" - #. TRANS: Error text shown a user tries to disable all a search subscriptions with track off command, but has none. msgid "You are not tracking any searches." msgstr "Vous ne surveillez aucune recherche." -#. TRANS: Message given having disabled all search subscriptions with 'track off'. -#, php-format -msgid "You are tracking searches for: %s" -msgstr "Vous effectuez la surveillance des recherches pour: %s" +#. TRANS: Separator for list of tracked searches. +msgctxt "SEPARATOR" +msgid "\", \"" +msgstr "\", \"" +#. TRANS: Message given having disabled all search subscriptions with 'track off'. +#. TRANS: %s is a list of searches. Separator default is '", "'. +#, php-format +msgid "You are tracking searches for: \"%s\"." +msgstr "Vous effectuez le suivi des recherches pour: \"%s\"." + +#. TRANS: Form legend. msgid "Subscribe to this search" msgstr "S’abonner à cette recherche" +#. TRANS: Button text for subscribing to a search. msgctxt "BUTTON" msgid "Subscribe" msgstr "S’abonner" +#. TRANS: Button title for subscribing to a search. +msgid "Subscribe to this search." +msgstr "S’abonner à cette recherche." + #. TRANS: Message given having failed to cancel one of the search subs with 'track off' command. +#. TRANS: %s is the search for which the subscription removal failed. #, php-format msgid "Error disabling search subscription for query \"%s\"." msgstr "" diff --git a/plugins/SearchSub/locale/gl/LC_MESSAGES/SearchSub.po b/plugins/SearchSub/locale/gl/LC_MESSAGES/SearchSub.po new file mode 100644 index 0000000000..6b97fabb23 --- /dev/null +++ b/plugins/SearchSub/locale/gl/LC_MESSAGES/SearchSub.po @@ -0,0 +1,226 @@ +# Translation of StatusNet - SearchSub to Galician (galego) +# Exported from translatewiki.net +# +# Author: Toliño +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - SearchSub\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:56+0000\n" +"Language-Team: Galician \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: gl\n" +"X-Message-Group: #out-statusnet-plugin-searchsub\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Header for subscriptions overview for a user (first page). +#. TRANS: %s is a user nickname. +#, php-format +msgid "%s's search subscriptions" +msgstr "Subscricións a procuras de %s" + +#. TRANS: Header for subscriptions overview for a user (not first page). +#. TRANS: %1$s is a user nickname, %2$d is the page number. +#, php-format +msgid "%1$s's search subscriptions, page %2$d" +msgstr "Subscricións a procuras de %1$s, páxina %2$d" + +#. TRANS: Page notice for page with an overview of all search subscriptions +#. TRANS: of the logged in user's own profile. +msgid "" +"You have subscribed to receive all notices on this site matching the " +"following searches:" +msgstr "" +"Subscribiuse para recibir todas as notas do sitio que conteñan as seguintes " +"procuras:" + +#. TRANS: Page notice for page with an overview of all subscriptions of a user other +#. TRANS: than the logged in user. %s is the user nickname. +#, php-format +msgid "" +"%s has subscribed to receive all notices on this site matching the following " +"searches:" +msgstr "" +"%s subscribiuse para recibir todas as notas do sitio que conteñan as " +"seguintes procuras:" + +#. TRANS: Search subscription list text when the logged in user has no search subscriptions. +msgid "" +"You are not subscribed to any text searches right now. You can push the " +"\"Subscribe\" button on any notice text search to automatically receive any " +"public messages on this site that match that search, even if you are not " +"subscribed to the poster." +msgstr "" +"Non está a seguir ningunha procura nestes intres. Pode premer no botón " +"\"Subscribirse\" de calquera procura de texto para recibir automaticamente " +"calquera mensaxe pública deste sitio que coincida coa procura, mesmo se non " +"está subscrito ao autor." + +#. TRANS: Search subscription list text when looking at the subscriptions for a of a user other +#. TRANS: than the logged in user that has no search subscriptions. %s is the user nickname. +#. TRANS: Subscription list text when looking at the subscriptions for a of a user that has none +#. TRANS: as an anonymous user. %s is the user nickname. +#, php-format +msgid "%s is not subscribed to any searches." +msgstr "%s non está subscrito a ningunha procura." + +#. TRANS: Search subscription list item. %1$s is a URL to a notice search, +#. TRANS: %2$s are the search criteria, %3$s is a datestring. +#, php-format +msgid "\"%2$s\" since %3$s" +msgstr "\"%2$s\" desde %3$s" + +#. TRANS: Error text shown a user tries to untrack a search query they're not subscribed to. +#. TRANS: %s is the keyword for the search. +#, php-format +msgid "You are not tracking the search \"%s\"." +msgstr "Non está a seguir a procura \"%s\"." + +#. TRANS: Message given having failed to cancel a search subscription by untrack command. +#. TRANS: %s is the keyword for the query. +#, php-format +msgid "Could not end a search subscription for query \"%s\"." +msgstr "Non se puido rematar a subscrición á procura para a pescuda \"%s\"." + +#. TRANS: Message given having removed a search subscription by untrack command. +#. TRANS: %s is the keyword for the search. +#, php-format +msgid "You are no longer subscribed to the search \"%s\"." +msgstr "Xa non está subscrito á procura \"%s\"." + +#. TRANS: Client error displayed trying to perform any request method other than POST. +#. TRANS: Do not translate POST. +msgid "This action only accepts POST requests." +msgstr "Esta acción só permite solicitudes POST." + +#. TRANS: Client error displayed when the session token is not okay. +msgid "There was a problem with your session token. Try again, please." +msgstr "Houbo un erro co seu pase. Inténteo de novo." + +#. TRANS: Error message displayed when trying to perform an action that requires a logged in user. +msgid "Not logged in." +msgstr "Non iniciou sesión." + +#. TRANS: Client error displayed trying to subscribe to a non-existing profile. +msgid "No such profile." +msgstr "Non existe ese perfil." + +#. TRANS: Page title when search subscription succeeded. +msgid "Subscribed" +msgstr "Subscrito" + +#. TRANS: Form legend. +msgid "Unsubscribe from this search" +msgstr "Cancelar a subscrición a esta procura" + +#. TRANS: Button text for unsubscribing from a text search. +msgctxt "BUTTON" +msgid "Unsubscribe" +msgstr "Cancelar a subscrición" + +#. TRANS: Button title for unsubscribing from a text search. +msgid "Unsubscribe from this search." +msgstr "Cancelar a subscrición a esta procura." + +#. TRANS: Page title when search unsubscription succeeded. +msgid "Unsubscribed" +msgstr "Cancelouse a subscrición" + +#. TRANS: Error text shown a user tries to track a search query they're already subscribed to. +#, php-format +msgid "You are already tracking the search \"%s\"." +msgstr "Xa está a seguir a procura \"%s\"." + +#. TRANS: Message given having failed to set up a search subscription by track command. +#, php-format +msgid "Could not start a search subscription for query \"%s\"." +msgstr "Non se puido iniciar a subscrición á procura para a pescuda \"%s\"." + +#. TRANS: Message given having added a search subscription by track command. +#, php-format +msgid "You are subscribed to the search \"%s\"." +msgstr "Está subscrito á procura \"%s\"." + +#. TRANS: Plugin description. +msgid "Plugin to allow following all messages with a given search." +msgstr "" +"Complemento para permitir seguir todas as mensaxes cunha procura " +"especificada." + +#. TRANS: SearchSub plugin menu item on user settings page. +#. TRANS: Sub menu for searches. +msgctxt "MENU" +msgid "Searches" +msgstr "Procuras" + +#. TRANS: SearchSub plugin tooltip for user settings menu item. +msgid "Configure search subscriptions" +msgstr "Configurar as subscricións ás procuras" + +#. TRANS: Help message for IM/SMS command "track " +msgctxt "COMMANDHELP" +msgid "Start following notices matching the given search query." +msgstr "Comezar a seguir as notas que coincidan coa pescuda especificada." + +#. TRANS: Help message for IM/SMS command "untrack " +msgctxt "COMMANDHELP" +msgid "Stop following notices matching the given search query." +msgstr "Deixar de seguir as notas que coincidan coa pescuda especificada." + +#. TRANS: Help message for IM/SMS command "track off" +#. TRANS: Help message for IM/SMS command "untrack all" +msgctxt "COMMANDHELP" +msgid "Disable all tracked search subscriptions." +msgstr "Desactivar todas as subscricións ás procuras que está a seguir." + +#. TRANS: Help message for IM/SMS command "tracks" +#. TRANS: Help message for IM/SMS command "tracking" +msgctxt "COMMANDHELP" +msgid "List all your search subscriptions." +msgstr "Listar todas as subscricións a procuras." + +#. TRANS: Error text shown a user tries to disable all a search subscriptions with track off command, but has none. +msgid "You are not tracking any searches." +msgstr "Non está a seguir a procura ningunha." + +#. TRANS: Separator for list of tracked searches. +msgctxt "SEPARATOR" +msgid "\", \"" +msgstr "\", \"" + +#. TRANS: Message given having disabled all search subscriptions with 'track off'. +#. TRANS: %s is a list of searches. Separator default is '", "'. +#, php-format +msgid "You are tracking searches for: \"%s\"." +msgstr "Está a seguir as procuras de: \"%s\"." + +#. TRANS: Form legend. +msgid "Subscribe to this search" +msgstr "Subscribirse a esta procura" + +#. TRANS: Button text for subscribing to a search. +msgctxt "BUTTON" +msgid "Subscribe" +msgstr "Subscribirse" + +#. TRANS: Button title for subscribing to a search. +msgid "Subscribe to this search." +msgstr "Subscribirse a esta procura." + +#. TRANS: Message given having failed to cancel one of the search subs with 'track off' command. +#. TRANS: %s is the search for which the subscription removal failed. +#, php-format +msgid "Error disabling search subscription for query \"%s\"." +msgstr "Erro ao desactivar a subscrición á procura da pescuda \"%s\"." + +#. TRANS: Message given having disabled all search subscriptions with 'track off'. +msgid "Disabled all your search subscriptions." +msgstr "Desactivar todas as subscricións a procuras." diff --git a/plugins/SearchSub/locale/ia/LC_MESSAGES/SearchSub.po b/plugins/SearchSub/locale/ia/LC_MESSAGES/SearchSub.po index ba4d5cee11..43f0b67806 100644 --- a/plugins/SearchSub/locale/ia/LC_MESSAGES/SearchSub.po +++ b/plugins/SearchSub/locale/ia/LC_MESSAGES/SearchSub.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SearchSub to Interlingua (Interlingua) +# Translation of StatusNet - SearchSub to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SearchSub\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:15+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:56+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:20+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-searchsub\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -79,16 +79,19 @@ msgid "\"%2$s\" since %3$s" msgstr "\"%2$s\" depost %3$s" #. TRANS: Error text shown a user tries to untrack a search query they're not subscribed to. +#. TRANS: %s is the keyword for the search. #, php-format msgid "You are not tracking the search \"%s\"." msgstr "Tu non tracia le recerca \"%s\"." #. TRANS: Message given having failed to cancel a search subscription by untrack command. +#. TRANS: %s is the keyword for the query. #, php-format msgid "Could not end a search subscription for query \"%s\"." msgstr "Non poteva terminar un subscription al recerca de \"%s\"." #. TRANS: Message given having removed a search subscription by untrack command. +#. TRANS: %s is the keyword for the search. #, php-format msgid "You are no longer subscribed to the search \"%s\"." msgstr "Tu non es plus subscribite al recerca de \"%s\"." @@ -114,13 +117,19 @@ msgstr "Profilo non existe." msgid "Subscribed" msgstr "Subscribite" +#. TRANS: Form legend. msgid "Unsubscribe from this search" msgstr "Cancellar subscription a iste recerca" +#. TRANS: Button text for unsubscribing from a text search. msgctxt "BUTTON" msgid "Unsubscribe" msgstr "Cancellar subscription" +#. TRANS: Button title for unsubscribing from a text search. +msgid "Unsubscribe from this search." +msgstr "Cancellar subscription a iste recerca." + #. TRANS: Page title when search unsubscription succeeded. msgid "Unsubscribed" msgstr "Subscription cancellate" @@ -147,6 +156,7 @@ msgstr "" "specificate." #. TRANS: SearchSub plugin menu item on user settings page. +#. TRANS: Sub menu for searches. msgctxt "MENU" msgid "Searches" msgstr "Recercas" @@ -179,26 +189,36 @@ msgctxt "COMMANDHELP" msgid "List all your search subscriptions." msgstr "Listar tote tu subscriptiones de recerca." -msgid "Searches" -msgstr "Recercas" - #. TRANS: Error text shown a user tries to disable all a search subscriptions with track off command, but has none. msgid "You are not tracking any searches." msgstr "Tu non tracia alcun recerca." -#. TRANS: Message given having disabled all search subscriptions with 'track off'. -#, php-format -msgid "You are tracking searches for: %s" -msgstr "Tu tracia recercas de: %s" +#. TRANS: Separator for list of tracked searches. +msgctxt "SEPARATOR" +msgid "\", \"" +msgstr "\", \"" +#. TRANS: Message given having disabled all search subscriptions with 'track off'. +#. TRANS: %s is a list of searches. Separator default is '", "'. +#, php-format +msgid "You are tracking searches for: \"%s\"." +msgstr "Tu tracia le recercas de: \"%s\"." + +#. TRANS: Form legend. msgid "Subscribe to this search" msgstr "Subscriber a iste recerca" +#. TRANS: Button text for subscribing to a search. msgctxt "BUTTON" msgid "Subscribe" msgstr "Subscriber" +#. TRANS: Button title for subscribing to a search. +msgid "Subscribe to this search." +msgstr "Subscriber a iste recerca." + #. TRANS: Message given having failed to cancel one of the search subs with 'track off' command. +#. TRANS: %s is the search for which the subscription removal failed. #, php-format msgid "Error disabling search subscription for query \"%s\"." msgstr "" diff --git a/plugins/SearchSub/locale/mk/LC_MESSAGES/SearchSub.po b/plugins/SearchSub/locale/mk/LC_MESSAGES/SearchSub.po index bf492f7e58..dbd550ae18 100644 --- a/plugins/SearchSub/locale/mk/LC_MESSAGES/SearchSub.po +++ b/plugins/SearchSub/locale/mk/LC_MESSAGES/SearchSub.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SearchSub to Macedonian (МакедонÑки) +# Translation of StatusNet - SearchSub to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SearchSub\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:15+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:56+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:20+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-searchsub\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" @@ -80,16 +80,19 @@ msgid "\"%2$s\" since %3$s" msgstr "„%2$s“ од %3$s" #. TRANS: Error text shown a user tries to untrack a search query they're not subscribed to. +#. TRANS: %s is the keyword for the search. #, php-format msgid "You are not tracking the search \"%s\"." msgstr "Ðе го Ñледите пребарувањето „%s“." #. TRANS: Message given having failed to cancel a search subscription by untrack command. +#. TRANS: %s is the keyword for the query. #, php-format msgid "Could not end a search subscription for query \"%s\"." msgstr "Ðе можев да ја прекратам претплатата на барањето „%s“." #. TRANS: Message given having removed a search subscription by untrack command. +#. TRANS: %s is the keyword for the search. #, php-format msgid "You are no longer subscribed to the search \"%s\"." msgstr "Повеќе не Ñте претплатени на пребарувањето „%s“." @@ -115,13 +118,19 @@ msgstr "Ðема таков профил." msgid "Subscribed" msgstr "Претплатено" +#. TRANS: Form legend. msgid "Unsubscribe from this search" msgstr "Откажи претплата на ова пребарување" +#. TRANS: Button text for unsubscribing from a text search. msgctxt "BUTTON" msgid "Unsubscribe" msgstr "Откажи претплата" +#. TRANS: Button title for unsubscribing from a text search. +msgid "Unsubscribe from this search." +msgstr "Откажи претплата на ова пребарување." + #. TRANS: Page title when search unsubscription succeeded. msgid "Unsubscribed" msgstr "Претплатата е откажана" @@ -147,6 +156,7 @@ msgstr "" "Приклучок што овозможува Ñледење на Ñите пораки од извеÑно пребарување." #. TRANS: SearchSub plugin menu item on user settings page. +#. TRANS: Sub menu for searches. msgctxt "MENU" msgid "Searches" msgstr "Пребарувања" @@ -177,26 +187,36 @@ msgctxt "COMMANDHELP" msgid "List all your search subscriptions." msgstr "Ги наведува Ñите пребарувања на кои Ñте претплатени." -msgid "Searches" -msgstr "Пребарувања" - #. TRANS: Error text shown a user tries to disable all a search subscriptions with track off command, but has none. msgid "You are not tracking any searches." msgstr "Ðе Ñледите никакви пребарувања." -#. TRANS: Message given having disabled all search subscriptions with 'track off'. -#, php-format -msgid "You are tracking searches for: %s" -msgstr "Следите пребарувања на: %s" +#. TRANS: Separator for list of tracked searches. +msgctxt "SEPARATOR" +msgid "\", \"" +msgstr "„, “" +#. TRANS: Message given having disabled all search subscriptions with 'track off'. +#. TRANS: %s is a list of searches. Separator default is '", "'. +#, php-format +msgid "You are tracking searches for: \"%s\"." +msgstr "Ги Ñледите пребарувањата на: „%s“." + +#. TRANS: Form legend. msgid "Subscribe to this search" msgstr "Претплати Ñе на пребарувањево" +#. TRANS: Button text for subscribing to a search. msgctxt "BUTTON" msgid "Subscribe" msgstr "Претплати Ñе" +#. TRANS: Button title for subscribing to a search. +msgid "Subscribe to this search." +msgstr "Претплати Ñе на пребарувањево." + #. TRANS: Message given having failed to cancel one of the search subs with 'track off' command. +#. TRANS: %s is the search for which the subscription removal failed. #, php-format msgid "Error disabling search subscription for query \"%s\"." msgstr "Грешка при оневозможувањето на претплатата за барањето „%s“." diff --git a/plugins/SearchSub/locale/nl/LC_MESSAGES/SearchSub.po b/plugins/SearchSub/locale/nl/LC_MESSAGES/SearchSub.po index 6272ab78b2..942c6555ad 100644 --- a/plugins/SearchSub/locale/nl/LC_MESSAGES/SearchSub.po +++ b/plugins/SearchSub/locale/nl/LC_MESSAGES/SearchSub.po @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SearchSub\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:15+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:56+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:20+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-searchsub\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -79,16 +79,19 @@ msgid "\"%2$s\" since %3$s" msgstr "%2$s\" sinds %3$s" #. TRANS: Error text shown a user tries to untrack a search query they're not subscribed to. +#. TRANS: %s is the keyword for the search. #, php-format msgid "You are not tracking the search \"%s\"." msgstr "U hebt geen abonnement op de zoekopdracht \"%s\"." #. TRANS: Message given having failed to cancel a search subscription by untrack command. +#. TRANS: %s is the keyword for the query. #, php-format msgid "Could not end a search subscription for query \"%s\"." msgstr "Het opzeggen van het abonnement op de zoekopdracht \"%s\" is mislukt." #. TRANS: Message given having removed a search subscription by untrack command. +#. TRANS: %s is the keyword for the search. #, php-format msgid "You are no longer subscribed to the search \"%s\"." msgstr "U hebt niet langer meer een abonnement op de zoekopdracht \"%s\"." @@ -116,13 +119,19 @@ msgstr "Het profiel bestaat niet." msgid "Subscribed" msgstr "Geabonneerd" +#. TRANS: Form legend. msgid "Unsubscribe from this search" msgstr "Abonnement op deze zoekopdracht opzeggen" +#. TRANS: Button text for unsubscribing from a text search. msgctxt "BUTTON" msgid "Unsubscribe" msgstr "Uitschrijven" +#. TRANS: Button title for unsubscribing from a text search. +msgid "Unsubscribe from this search." +msgstr "Het abonnement op deze zoekopdracht opzeggen." + #. TRANS: Page title when search unsubscription succeeded. msgid "Unsubscribed" msgstr "Het abonnement is opgezegd" @@ -148,6 +157,7 @@ msgid "Plugin to allow following all messages with a given search." msgstr "Plug-in om mededelingen via een zoekopdracht te volgen." #. TRANS: SearchSub plugin menu item on user settings page. +#. TRANS: Sub menu for searches. msgctxt "MENU" msgid "Searches" msgstr "Zoekopdrachten" @@ -178,26 +188,36 @@ msgctxt "COMMANDHELP" msgid "List all your search subscriptions." msgstr "Al uw abonnementen op zoekopdrachten beëindigen." -msgid "Searches" -msgstr "Zoekopdrachten" - #. TRANS: Error text shown a user tries to disable all a search subscriptions with track off command, but has none. msgid "You are not tracking any searches." msgstr "U volgt geen zoekopdrachten." -#. TRANS: Message given having disabled all search subscriptions with 'track off'. -#, php-format -msgid "You are tracking searches for: %s" -msgstr "U volgt zoekopdrachten naar: %s." +#. TRANS: Separator for list of tracked searches. +msgctxt "SEPARATOR" +msgid "\", \"" +msgstr "\", \"" +#. TRANS: Message given having disabled all search subscriptions with 'track off'. +#. TRANS: %s is a list of searches. Separator default is '", "'. +#, php-format +msgid "You are tracking searches for: \"%s\"." +msgstr "U volgt zoekopdrachten naar: \"%s\"." + +#. TRANS: Form legend. msgid "Subscribe to this search" msgstr "Deze zoekopdracht volgen" +#. TRANS: Button text for subscribing to a search. msgctxt "BUTTON" msgid "Subscribe" msgstr "Abonneren" +#. TRANS: Button title for subscribing to a search. +msgid "Subscribe to this search." +msgstr "Deze zoekopdracht volgen." + #. TRANS: Message given having failed to cancel one of the search subs with 'track off' command. +#. TRANS: %s is the search for which the subscription removal failed. #, php-format msgid "Error disabling search subscription for query \"%s\"." msgstr "" diff --git a/plugins/SearchSub/locale/tl/LC_MESSAGES/SearchSub.po b/plugins/SearchSub/locale/tl/LC_MESSAGES/SearchSub.po index 687fd5eab8..8123ad1d42 100644 --- a/plugins/SearchSub/locale/tl/LC_MESSAGES/SearchSub.po +++ b/plugins/SearchSub/locale/tl/LC_MESSAGES/SearchSub.po @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SearchSub\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:16+0000\n" -"Language-Team: Tagalog \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:56+0000\n" +"Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:20+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-searchsub\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -80,11 +80,13 @@ msgid "\"%2$s\" since %3$s" msgstr "\"%2$s\" magmula noong %3$s" #. TRANS: Error text shown a user tries to untrack a search query they're not subscribed to. +#. TRANS: %s is the keyword for the search. #, php-format msgid "You are not tracking the search \"%s\"." msgstr "Hindi mo sinusubaybayan ang paghahanap ng \"%s\"." #. TRANS: Message given having failed to cancel a search subscription by untrack command. +#. TRANS: %s is the keyword for the query. #, php-format msgid "Could not end a search subscription for query \"%s\"." msgstr "" @@ -92,6 +94,7 @@ msgstr "" "s\"." #. TRANS: Message given having removed a search subscription by untrack command. +#. TRANS: %s is the keyword for the search. #, php-format msgid "You are no longer subscribed to the search \"%s\"." msgstr "Hindi ka na nagpapasipi sa paghahanap ng \"%s\"." @@ -118,13 +121,19 @@ msgstr "Walang ganyang balangkas." msgid "Subscribed" msgstr "Nagpapasipi na" +#. TRANS: Form legend. msgid "Unsubscribe from this search" msgstr "Huwag nang magpasipi mula sa paghahanap na ito" +#. TRANS: Button text for unsubscribing from a text search. msgctxt "BUTTON" msgid "Unsubscribe" msgstr "Pahintuin na ang pagtanggap ng sipi" +#. TRANS: Button title for unsubscribing from a text search. +msgid "Unsubscribe from this search." +msgstr "Huwag nang magpasipi magmula sa paghahanap na ito" + #. TRANS: Page title when search unsubscription succeeded. msgid "Unsubscribed" msgstr "Hindi na nagpapasipi" @@ -152,6 +161,7 @@ msgstr "" "ibinigay na paghahanap." #. TRANS: SearchSub plugin menu item on user settings page. +#. TRANS: Sub menu for searches. msgctxt "MENU" msgid "Searches" msgstr "Mga paghahanap" @@ -186,26 +196,36 @@ msgctxt "COMMANDHELP" msgid "List all your search subscriptions." msgstr "Itala ang lahat ng mga pagpapasipi mo ng paghahanap." -msgid "Searches" -msgstr "Mga paghahanap" - #. TRANS: Error text shown a user tries to disable all a search subscriptions with track off command, but has none. msgid "You are not tracking any searches." msgstr "Hindi ka sumusubaybay ng anumang mga paghahanap." -#. TRANS: Message given having disabled all search subscriptions with 'track off'. -#, php-format -msgid "You are tracking searches for: %s" -msgstr "Sinusubaybayan mo ang mga paghahanap para sa: %s" +#. TRANS: Separator for list of tracked searches. +msgctxt "SEPARATOR" +msgid "\", \"" +msgstr "\", \"" +#. TRANS: Message given having disabled all search subscriptions with 'track off'. +#. TRANS: %s is a list of searches. Separator default is '", "'. +#, php-format +msgid "You are tracking searches for: \"%s\"." +msgstr "Sinusubaybayan mo ang mga paghahanap para sa: \"%s\"." + +#. TRANS: Form legend. msgid "Subscribe to this search" msgstr "Magpasipi para sa paghahanap na ito" +#. TRANS: Button text for subscribing to a search. msgctxt "BUTTON" msgid "Subscribe" msgstr "Pumayag na tumanggap ng sipi" +#. TRANS: Button title for subscribing to a search. +msgid "Subscribe to this search." +msgstr "Magpasipi para sa paghahanap na ito." + #. TRANS: Message given having failed to cancel one of the search subs with 'track off' command. +#. TRANS: %s is the search for which the subscription removal failed. #, php-format msgid "Error disabling search subscription for query \"%s\"." msgstr "" diff --git a/plugins/SearchSub/locale/uk/LC_MESSAGES/SearchSub.po b/plugins/SearchSub/locale/uk/LC_MESSAGES/SearchSub.po index 5530bb1fee..3e0686c84e 100644 --- a/plugins/SearchSub/locale/uk/LC_MESSAGES/SearchSub.po +++ b/plugins/SearchSub/locale/uk/LC_MESSAGES/SearchSub.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SearchSub to Ukrainian (УкраїнÑька) +# Translation of StatusNet - SearchSub to Ukrainian (українÑька) # Exported from translatewiki.net # # Author: Boogie @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SearchSub\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:16+0000\n" -"Language-Team: Ukrainian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:57+0000\n" +"Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:20+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-searchsub\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " @@ -81,16 +81,19 @@ msgid "\"%2$s\" since %3$s" msgstr "«%2$s» протÑгом %3$s" #. TRANS: Error text shown a user tries to untrack a search query they're not subscribed to. +#. TRANS: %s is the keyword for the search. #, php-format msgid "You are not tracking the search \"%s\"." msgstr "Ви не відÑтежує пошук «%s»." #. TRANS: Message given having failed to cancel a search subscription by untrack command. +#. TRANS: %s is the keyword for the query. #, php-format msgid "Could not end a search subscription for query \"%s\"." msgstr "Ðеможливо закінчити пошукову підпиÑку за запитом «%s»." #. TRANS: Message given having removed a search subscription by untrack command. +#. TRANS: %s is the keyword for the search. #, php-format msgid "You are no longer subscribed to the search \"%s\"." msgstr "Ви більше не підпиÑані на пошук «%s»." @@ -116,13 +119,19 @@ msgstr "Ðемає такого профілю." msgid "Subscribed" msgstr "ПідпиÑані" +#. TRANS: Form legend. msgid "Unsubscribe from this search" msgstr "ВідмовитиÑÑ Ð²Ñ–Ð´ цього пошуку" +#. TRANS: Button text for unsubscribing from a text search. msgctxt "BUTTON" msgid "Unsubscribe" msgstr "ВідпиÑатиÑÑŒ" +#. TRANS: Button title for unsubscribing from a text search. +msgid "Unsubscribe from this search." +msgstr "ВідпиÑатиÑÑ Ð²Ñ–Ð´ цього пошуку." + #. TRANS: Page title when search unsubscription succeeded. msgid "Unsubscribed" msgstr "ВідпиÑано" @@ -148,6 +157,7 @@ msgstr "" "Додаток, Ñкий дозволÑÑ” відÑлідковувати допиÑи за певними параметрами пошуку." #. TRANS: SearchSub plugin menu item on user settings page. +#. TRANS: Sub menu for searches. msgctxt "MENU" msgid "Searches" msgstr "Пошуки" @@ -181,26 +191,36 @@ msgctxt "COMMANDHELP" msgid "List all your search subscriptions." msgstr "СпиÑок пошукових запитів, за Ñкими ви Ñлідкуєте." -msgid "Searches" -msgstr "Пошуки" - #. TRANS: Error text shown a user tries to disable all a search subscriptions with track off command, but has none. msgid "You are not tracking any searches." msgstr "Ðе ви відÑтежуєте жодні пошукові запити." -#. TRANS: Message given having disabled all search subscriptions with 'track off'. -#, php-format -msgid "You are tracking searches for: %s" -msgstr "Ви відÑлідковуєте пошуки длÑ: %s" +#. TRANS: Separator for list of tracked searches. +msgctxt "SEPARATOR" +msgid "\", \"" +msgstr "«, »" +#. TRANS: Message given having disabled all search subscriptions with 'track off'. +#. TRANS: %s is a list of searches. Separator default is '", "'. +#, php-format +msgid "You are tracking searches for: \"%s\"." +msgstr "Ви відÑлідковуєте пошуки длÑ: «%s»." + +#. TRANS: Form legend. msgid "Subscribe to this search" msgstr "ПідпиÑатиÑÑ Ð´Ð¾ даного пошуку" +#. TRANS: Button text for subscribing to a search. msgctxt "BUTTON" msgid "Subscribe" msgstr "ПідпиÑатиÑÑŒ" +#. TRANS: Button title for subscribing to a search. +msgid "Subscribe to this search." +msgstr "ПідпиÑатиÑÑ Ð´Ð¾ цього пошуку." + #. TRANS: Message given having failed to cancel one of the search subs with 'track off' command. +#. TRANS: %s is the search for which the subscription removal failed. #, php-format msgid "Error disabling search subscription for query \"%s\"." msgstr "Помилка при ÑкаÑуванні пошукової підпиÑки «%s»." diff --git a/plugins/SearchSub/searchsubform.php b/plugins/SearchSub/searchsubform.php index 7b05377397..4d44910e67 100644 --- a/plugins/SearchSub/searchsubform.php +++ b/plugins/SearchSub/searchsubform.php @@ -46,13 +46,11 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { * * @see UnsubscribeForm */ - class SearchSubForm extends Form { /** * Name of search to subscribe to */ - var $search = ''; /** @@ -61,7 +59,6 @@ class SearchSubForm extends Form * @param HTMLOutputter $out output channel * @param string $search name of search to subscribe to */ - function __construct($out=null, $search=null) { parent::__construct($out); @@ -74,7 +71,6 @@ class SearchSubForm extends Form * * @return int ID of the form */ - function id() { return 'search-subscribe-' . $this->search; @@ -86,7 +82,6 @@ class SearchSubForm extends Form * * @return string of the form class */ - function formClass() { // class to match existing styles... @@ -99,13 +94,11 @@ class SearchSubForm extends Form * * @return string URL of the action */ - function action() { return common_local_url('searchsub', array('search' => $this->search)); } - /** * Legend of the Form * @@ -113,6 +106,7 @@ class SearchSubForm extends Form */ function formLegend() { + // TRANS: Form legend. $this->out->element('legend', null, _m('Subscribe to this search')); } @@ -121,7 +115,6 @@ class SearchSubForm extends Form * * @return void */ - function formData() { $this->out->hidden('subscribeto-' . $this->search, @@ -134,9 +127,14 @@ class SearchSubForm extends Form * * @return void */ - function formActions() { - $this->out->submit('submit', _m('BUTTON','Subscribe'), 'submit', null, _m('Subscribe to this search')); + $this->out->submit('submit', + // TRANS: Button text for subscribing to a search. + _m('BUTTON','Subscribe'), + 'submit', + null, + // TRANS: Button title for subscribing to a search. + _m('Subscribe to this search.')); } } diff --git a/plugins/SearchSub/searchsubmenu.php b/plugins/SearchSub/searchsubmenu.php index 684f5c7db2..fa5b34942b 100644 --- a/plugins/SearchSub/searchsubmenu.php +++ b/plugins/SearchSub/searchsubmenu.php @@ -45,7 +45,7 @@ if (!defined('STATUSNET')) { * @link http://status.net/ */ -class SearchSubMenu extends Menu +class SearchSubMenu extends MoreMenu { protected $user; protected $searches; @@ -57,22 +57,54 @@ class SearchSubMenu extends Menu $this->searches = $searches; } - function show() + function tag() { - $this->out->elementStart('ul', array('class' => 'nav')); + return 'searchsubs'; + } + function seeAllItem() + { + return array('searchsubs', + array('nickname' => $this->user->nickname), + _('See all'), + _('See all searches you are following')); + } + + function getItems() + { + $items = array(); + foreach ($this->searches as $search) { if (!empty($search)) { - $this->out->menuItem(common_local_url('noticesearch', - array('q' => $search)), - sprintf('"%s"', $search), - sprintf(_('Notices including %s'), $search), - $this->actionName == 'noticesearch' && $this->action->arg('q') == $search, - 'nav_streams_search_'.$search); + $items[] = array('noticesearch', + array('q' => $search), + sprintf('"%s"', $search), + sprintf(_('Notices including %s'), $search));; } } - $this->out->elementEnd('ul'); + return $items; + } + + function item($actionName, $args, $label, $description, $id=null, $cls=null) + { + if (empty($id)) { + $id = $this->menuItemID($actionName, $args); + } + + if ($actionName == 'noticesearch') { + // Add 'q' as a search param, not part of the url path + $url = common_local_url($actionName, array(), $args); + } else { + $url = common_local_url($actionName, $args); + } + + $this->out->menuItem($url, + $label, + $description, + $this->isCurrent($actionName, $args), + $id, + $cls); } - } + diff --git a/plugins/SearchSub/searchsubtrackingcommand.php b/plugins/SearchSub/searchsubtrackingcommand.php index 385a22b8ba..a404fd4ccf 100644 --- a/plugins/SearchSub/searchsubtrackingcommand.php +++ b/plugins/SearchSub/searchsubtrackingcommand.php @@ -20,8 +20,12 @@ class SearchSubTrackingCommand extends Command $list[] = $all->search; } + // TRANS: Separator for list of tracked searches. + $separator = _m('SEPARATOR','", "'); + // TRANS: Message given having disabled all search subscriptions with 'track off'. - $channel->output($cur, sprintf(_m('You are tracking searches for: %s'), - '"' . implode('", "', $list) . '"')); + // TRANS: %s is a list of searches. Separator default is '", "'. + $channel->output($cur, sprintf(_m('You are tracking searches for: "%s".'), + implode($separator, $list))); } -} \ No newline at end of file +} diff --git a/plugins/SearchSub/searchsubtrackoffcommand.php b/plugins/SearchSub/searchsubtrackoffcommand.php index 1e5eb97ebc..4ab78a50a9 100644 --- a/plugins/SearchSub/searchsubtrackoffcommand.php +++ b/plugins/SearchSub/searchsubtrackoffcommand.php @@ -21,6 +21,7 @@ class SearchSubTrackoffCommand extends Command SearchSub::cancel($profile, $all->search); } catch (Exception $e) { // TRANS: Message given having failed to cancel one of the search subs with 'track off' command. + // TRANS: %s is the search for which the subscription removal failed. $channel->error($cur, sprintf(_m('Error disabling search subscription for query "%s".'), $all->search)); return; @@ -30,4 +31,4 @@ class SearchSubTrackoffCommand extends Command // TRANS: Message given having disabled all search subscriptions with 'track off'. $channel->output($cur, _m('Disabled all your search subscriptions.')); } -} \ No newline at end of file +} diff --git a/plugins/SearchSub/searchsubuntrackcommand.php b/plugins/SearchSub/searchsubuntrackcommand.php index 9fb84cd130..fb3d78a14e 100644 --- a/plugins/SearchSub/searchsubuntrackcommand.php +++ b/plugins/SearchSub/searchsubuntrackcommand.php @@ -18,6 +18,7 @@ class SearchSubUntrackCommand extends Command if (!$searchsub) { // TRANS: Error text shown a user tries to untrack a search query they're not subscribed to. + // TRANS: %s is the keyword for the search. $channel->error($cur, sprintf(_m('You are not tracking the search "%s".'), $this->keyword)); return; } @@ -26,13 +27,15 @@ class SearchSubUntrackCommand extends Command SearchSub::cancel($cur->getProfile(), $this->keyword); } catch (Exception $e) { // TRANS: Message given having failed to cancel a search subscription by untrack command. + // TRANS: %s is the keyword for the query. $channel->error($cur, sprintf(_m('Could not end a search subscription for query "%s".'), $this->keyword)); return; } // TRANS: Message given having removed a search subscription by untrack command. + // TRANS: %s is the keyword for the search. $channel->output($cur, sprintf(_m('You are no longer subscribed to the search "%s".'), $this->keyword)); } -} \ No newline at end of file +} diff --git a/plugins/SearchSub/searchunsubform.php b/plugins/SearchSub/searchunsubform.php index f90531f6aa..ae07f8dfa8 100644 --- a/plugins/SearchSub/searchunsubform.php +++ b/plugins/SearchSub/searchunsubform.php @@ -46,7 +46,6 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { * * @see UnsubscribeForm */ - class SearchUnsubForm extends SearchSubForm { /** @@ -54,38 +53,32 @@ class SearchUnsubForm extends SearchSubForm * * @return int ID of the form */ - function id() { return 'search-unsubscribe-' . $this->search; } - /** * class of the form * * @return string of the form class */ - function formClass() { // class to match existing styles... return 'form_user_unsubscribe ajax'; } - /** * Action of the form * * @return string URL of the action */ - function action() { return common_local_url('searchunsub', array('search' => $this->search)); } - /** * Legend of the Form * @@ -93,6 +86,7 @@ class SearchUnsubForm extends SearchSubForm */ function formLegend() { + // TRANS: Form legend. $this->out->element('legend', null, _m('Unsubscribe from this search')); } @@ -101,9 +95,14 @@ class SearchUnsubForm extends SearchSubForm * * @return void */ - function formActions() { - $this->out->submit('submit', _m('BUTTON','Unsubscribe'), 'submit', null, _m('Unsubscribe from this search')); + $this->out->submit('submit', + // TRANS: Button text for unsubscribing from a text search. + _m('BUTTON','Unsubscribe'), + 'submit', + null, + // TRANS: Button title for unsubscribing from a text search. + _m('Unsubscribe from this search.')); } } diff --git a/plugins/ShareNotice/ShareNoticePlugin.php b/plugins/ShareNotice/ShareNoticePlugin.php index 0cd248e213..08362f7932 100644 --- a/plugins/ShareNotice/ShareNoticePlugin.php +++ b/plugins/ShareNotice/ShareNoticePlugin.php @@ -102,15 +102,18 @@ abstract class GenericNoticeShareTarget extends NoticeShareTarget protected function statusText() { - // TRANS: Leave this message unchanged. + // TRANS: %s is notice content that is shared on Twitter, Facebook or another platform. $pattern = _m('"%s"'); $url = $this->notice->bestUrl(); $suffix = ' ' . $url; $room = $this->maxLength() - mb_strlen($suffix) - (mb_strlen($pattern) - mb_strlen('%s')); $content = $this->notice->content; + // TRANS: Truncation symbol. + $truncation_symbol = _m('…'); + $truncation_symbol_length = mb_strlen($truncation_symbol); if (mb_strlen($content) > $room) { - $content = mb_substr($content, 0, $room - 1) . '…'; + $content = mb_substr($content, 0, $room - $truncation_symbol_length) . $truncation_symbol; } return sprintf($pattern, $content) . $suffix; diff --git a/plugins/ShareNotice/locale/ShareNotice.pot b/plugins/ShareNotice/locale/ShareNotice.pot index bb3f26c5df..10dc79466c 100644 --- a/plugins/ShareNotice/locale/ShareNotice.pot +++ b/plugins/ShareNotice/locale/ShareNotice.pot @@ -8,40 +8,44 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" +"Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#. TRANS: Leave this message unchanged. #. TRANS: %s is notice content that is shared on Twitter, Facebook or another platform. -#: ShareNoticePlugin.php:106 ShareNoticePlugin.php:194 +#: ShareNoticePlugin.php:106 ShareNoticePlugin.php:197 #, php-format msgid "\"%s\"" msgstr "" +#. TRANS: Truncation symbol. +#: ShareNoticePlugin.php:113 +msgid "…" +msgstr "" + #. TRANS: Tooltip for image to share a notice on Twitter. -#: ShareNoticePlugin.php:130 +#: ShareNoticePlugin.php:133 msgid "Share on Twitter" msgstr "" #. TRANS: Tooltip for image to share a notice on another platform (other than Twitter or Facebook). #. TRANS: %s is a host name. -#: ShareNoticePlugin.php:163 +#: ShareNoticePlugin.php:166 #, php-format msgid "Share on %s" msgstr "" #. TRANS: Tooltip for image to share a notice on Facebook. -#: ShareNoticePlugin.php:186 +#: ShareNoticePlugin.php:189 msgid "Share on Facebook" msgstr "" #. TRANS: Plugin description. -#: ShareNoticePlugin.php:219 +#: ShareNoticePlugin.php:222 msgid "" "This plugin allows sharing of notices to Twitter, Facebook and other " "platforms." diff --git a/plugins/ShareNotice/locale/ar/LC_MESSAGES/ShareNotice.po b/plugins/ShareNotice/locale/ar/LC_MESSAGES/ShareNotice.po index 329837e67e..f1c482d954 100644 --- a/plugins/ShareNotice/locale/ar/LC_MESSAGES/ShareNotice.po +++ b/plugins/ShareNotice/locale/ar/LC_MESSAGES/ShareNotice.po @@ -9,26 +9,29 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - ShareNotice\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:16+0000\n" -"Language-Team: Arabic \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:57+0000\n" +"Language-Team: Arabic \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-24 15:25:49+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:02+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ar\n" "X-Message-Group: #out-statusnet-plugin-sharenotice\n" "Plural-Forms: nplurals=6; plural=(n == 0) ? 0 : ( (n == 1) ? 1 : ( (n == " "2) ? 2 : ( (n%100 >= 3 && n%100 <= 10) ? 3 : ( (n%100 >= 11 && n%100 <= " "99) ? 4 : 5 ) ) ) );\n" -#. TRANS: Leave this message unchanged. #. TRANS: %s is notice content that is shared on Twitter, Facebook or another platform. #, php-format msgid "\"%s\"" msgstr "\"%s\"" +#. TRANS: Truncation symbol. +msgid "…" +msgstr "..." + #. TRANS: Tooltip for image to share a notice on Twitter. msgid "Share on Twitter" msgstr "تشارك على تويتر" diff --git a/plugins/ShareNotice/locale/br/LC_MESSAGES/ShareNotice.po b/plugins/ShareNotice/locale/br/LC_MESSAGES/ShareNotice.po index 8ee132b816..9583dfe4be 100644 --- a/plugins/ShareNotice/locale/br/LC_MESSAGES/ShareNotice.po +++ b/plugins/ShareNotice/locale/br/LC_MESSAGES/ShareNotice.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - ShareNotice to Breton (Brezhoneg) +# Translation of StatusNet - ShareNotice to Breton (brezhoneg) # Exported from translatewiki.net # # Author: Y-M D @@ -9,24 +9,27 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - ShareNotice\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:16+0000\n" -"Language-Team: Breton \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:57+0000\n" +"Language-Team: Breton \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-24 15:25:49+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:02+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: br\n" "X-Message-Group: #out-statusnet-plugin-sharenotice\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#. TRANS: Leave this message unchanged. #. TRANS: %s is notice content that is shared on Twitter, Facebook or another platform. #, php-format msgid "\"%s\"" msgstr "\"%s\"" +#. TRANS: Truncation symbol. +msgid "…" +msgstr "…" + #. TRANS: Tooltip for image to share a notice on Twitter. msgid "Share on Twitter" msgstr "Rannañ war Twitter" diff --git a/plugins/ShareNotice/locale/ca/LC_MESSAGES/ShareNotice.po b/plugins/ShareNotice/locale/ca/LC_MESSAGES/ShareNotice.po index 2132f94878..851d46328f 100644 --- a/plugins/ShareNotice/locale/ca/LC_MESSAGES/ShareNotice.po +++ b/plugins/ShareNotice/locale/ca/LC_MESSAGES/ShareNotice.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - ShareNotice to Catalan (Català) +# Translation of StatusNet - ShareNotice to Catalan (català) # Exported from translatewiki.net # # Author: Toniher @@ -9,24 +9,27 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - ShareNotice\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:17+0000\n" -"Language-Team: Catalan \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:57+0000\n" +"Language-Team: Catalan \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-24 15:25:49+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:02+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ca\n" "X-Message-Group: #out-statusnet-plugin-sharenotice\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#. TRANS: Leave this message unchanged. #. TRANS: %s is notice content that is shared on Twitter, Facebook or another platform. #, php-format msgid "\"%s\"" msgstr "«%s»" +#. TRANS: Truncation symbol. +msgid "…" +msgstr "" + #. TRANS: Tooltip for image to share a notice on Twitter. msgid "Share on Twitter" msgstr "Comparteix al Twitter" diff --git a/plugins/ShareNotice/locale/de/LC_MESSAGES/ShareNotice.po b/plugins/ShareNotice/locale/de/LC_MESSAGES/ShareNotice.po index 9780ce8c58..816bf7fdc3 100644 --- a/plugins/ShareNotice/locale/de/LC_MESSAGES/ShareNotice.po +++ b/plugins/ShareNotice/locale/de/LC_MESSAGES/ShareNotice.po @@ -1,6 +1,7 @@ # Translation of StatusNet - ShareNotice to German (Deutsch) # Exported from translatewiki.net # +# Author: ChrisiPK # Author: The Evil IP address # -- # This file is distributed under the same license as the StatusNet package. @@ -9,24 +10,27 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - ShareNotice\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:17+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:57+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-24 15:25:49+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:02+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-sharenotice\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#. TRANS: Leave this message unchanged. #. TRANS: %s is notice content that is shared on Twitter, Facebook or another platform. #, php-format msgid "\"%s\"" msgstr "„%s“" +#. TRANS: Truncation symbol. +msgid "…" +msgstr "…" + #. TRANS: Tooltip for image to share a notice on Twitter. msgid "Share on Twitter" msgstr "Auf Twitter teilen" diff --git a/plugins/ShareNotice/locale/es/LC_MESSAGES/ShareNotice.po b/plugins/ShareNotice/locale/es/LC_MESSAGES/ShareNotice.po new file mode 100644 index 0000000000..74251e4cb3 --- /dev/null +++ b/plugins/ShareNotice/locale/es/LC_MESSAGES/ShareNotice.po @@ -0,0 +1,50 @@ +# Translation of StatusNet - ShareNotice to Spanish (español) +# Exported from translatewiki.net +# +# Author: Armando-Martin +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - ShareNotice\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:57+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:49:02+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: %s is notice content that is shared on Twitter, Facebook or another platform. +#, php-format +msgid "\"%s\"" +msgstr "\"%s\"" + +#. TRANS: Truncation symbol. +msgid "…" +msgstr "…" + +#. TRANS: Tooltip for image to share a notice on Twitter. +msgid "Share on Twitter" +msgstr "Compartir en Twitter" + +#. TRANS: Tooltip for image to share a notice on another platform (other than Twitter or Facebook). +#. TRANS: %s is a host name. +#, php-format +msgid "Share on %s" +msgstr "Compartir en %s" + +#. TRANS: Tooltip for image to share a notice on Facebook. +msgid "Share on Facebook" +msgstr "Compartir en Facebook" + +#. TRANS: Plugin description. +msgid "" +"This plugin allows sharing of notices to Twitter, Facebook and other " +"platforms." +msgstr "" +"Este complemento (plugin) permite el intercambio de notificaciones de " +"Twitter, Facebook y otras plataformas." diff --git a/plugins/ShareNotice/locale/eu/LC_MESSAGES/ShareNotice.po b/plugins/ShareNotice/locale/eu/LC_MESSAGES/ShareNotice.po new file mode 100644 index 0000000000..ab27c13f24 --- /dev/null +++ b/plugins/ShareNotice/locale/eu/LC_MESSAGES/ShareNotice.po @@ -0,0 +1,48 @@ +# Translation of StatusNet - ShareNotice to Basque (euskara) +# Exported from translatewiki.net +# +# Author: Artsuaga +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - ShareNotice\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:57+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:49:02+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: %s is notice content that is shared on Twitter, Facebook or another platform. +#, php-format +msgid "\"%s\"" +msgstr "" + +#. TRANS: Truncation symbol. +msgid "…" +msgstr "…" + +#. TRANS: Tooltip for image to share a notice on Twitter. +msgid "Share on Twitter" +msgstr "Partekatu Twitterren" + +#. TRANS: Tooltip for image to share a notice on another platform (other than Twitter or Facebook). +#. TRANS: %s is a host name. +#, php-format +msgid "Share on %s" +msgstr "Partekatu %s(e)n" + +#. TRANS: Tooltip for image to share a notice on Facebook. +msgid "Share on Facebook" +msgstr "Partekatu Facebooken" + +#. TRANS: Plugin description. +msgid "" +"This plugin allows sharing of notices to Twitter, Facebook and other " +"platforms." +msgstr "" diff --git a/plugins/ShareNotice/locale/fi/LC_MESSAGES/ShareNotice.po b/plugins/ShareNotice/locale/fi/LC_MESSAGES/ShareNotice.po new file mode 100644 index 0000000000..d8c52808e5 --- /dev/null +++ b/plugins/ShareNotice/locale/fi/LC_MESSAGES/ShareNotice.po @@ -0,0 +1,51 @@ +# Translation of StatusNet - ShareNotice to Finnish (suomi) +# Exported from translatewiki.net +# +# Author: Silvonen +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - ShareNotice\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:57+0000\n" +"Language-Team: Finnish \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:49:02+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: fi\n" +"X-Message-Group: #out-statusnet-plugin-sharenotice\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: %s is notice content that is shared on Twitter, Facebook or another platform. +#, php-format +msgid "\"%s\"" +msgstr "" + +#. TRANS: Truncation symbol. +msgid "…" +msgstr "" + +#. TRANS: Tooltip for image to share a notice on Twitter. +msgid "Share on Twitter" +msgstr "Jaa Twitterissä" + +#. TRANS: Tooltip for image to share a notice on another platform (other than Twitter or Facebook). +#. TRANS: %s is a host name. +#, php-format +msgid "Share on %s" +msgstr "Jaa palvelussa %s" + +#. TRANS: Tooltip for image to share a notice on Facebook. +msgid "Share on Facebook" +msgstr "Jaa Facebookissa" + +#. TRANS: Plugin description. +msgid "" +"This plugin allows sharing of notices to Twitter, Facebook and other " +"platforms." +msgstr "" diff --git a/plugins/ShareNotice/locale/fr/LC_MESSAGES/ShareNotice.po b/plugins/ShareNotice/locale/fr/LC_MESSAGES/ShareNotice.po index e3efd5865c..4fabeb57b0 100644 --- a/plugins/ShareNotice/locale/fr/LC_MESSAGES/ShareNotice.po +++ b/plugins/ShareNotice/locale/fr/LC_MESSAGES/ShareNotice.po @@ -1,6 +1,7 @@ -# Translation of StatusNet - ShareNotice to French (Français) +# Translation of StatusNet - ShareNotice to French (français) # Exported from translatewiki.net # +# Author: Crochet.david # Author: Peter17 # -- # This file is distributed under the same license as the StatusNet package. @@ -9,24 +10,27 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - ShareNotice\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:17+0000\n" -"Language-Team: French \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:57+0000\n" +"Language-Team: French \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-24 15:25:49+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:02+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-sharenotice\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#. TRANS: Leave this message unchanged. #. TRANS: %s is notice content that is shared on Twitter, Facebook or another platform. #, php-format msgid "\"%s\"" msgstr "« %s »" +#. TRANS: Truncation symbol. +msgid "…" +msgstr "…" + #. TRANS: Tooltip for image to share a notice on Twitter. msgid "Share on Twitter" msgstr "Partager sur Twitter" diff --git a/plugins/ShareNotice/locale/gl/LC_MESSAGES/ShareNotice.po b/plugins/ShareNotice/locale/gl/LC_MESSAGES/ShareNotice.po new file mode 100644 index 0000000000..149aac0f81 --- /dev/null +++ b/plugins/ShareNotice/locale/gl/LC_MESSAGES/ShareNotice.po @@ -0,0 +1,53 @@ +# Translation of StatusNet - ShareNotice to Galician (galego) +# Exported from translatewiki.net +# +# Author: Toliño +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - ShareNotice\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:57+0000\n" +"Language-Team: Galician \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:49:02+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: gl\n" +"X-Message-Group: #out-statusnet-plugin-sharenotice\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: %s is notice content that is shared on Twitter, Facebook or another platform. +#, php-format +msgid "\"%s\"" +msgstr "\"%s\"" + +#. TRANS: Truncation symbol. +msgid "…" +msgstr "…" + +#. TRANS: Tooltip for image to share a notice on Twitter. +msgid "Share on Twitter" +msgstr "Compartir no Twitter" + +#. TRANS: Tooltip for image to share a notice on another platform (other than Twitter or Facebook). +#. TRANS: %s is a host name. +#, php-format +msgid "Share on %s" +msgstr "Compartir en %s" + +#. TRANS: Tooltip for image to share a notice on Facebook. +msgid "Share on Facebook" +msgstr "Compartir no Facebook" + +#. TRANS: Plugin description. +msgid "" +"This plugin allows sharing of notices to Twitter, Facebook and other " +"platforms." +msgstr "" +"Este complemento permite compartir notas no Twitter, Facebook e outras " +"plataformas." diff --git a/plugins/ShareNotice/locale/ia/LC_MESSAGES/ShareNotice.po b/plugins/ShareNotice/locale/ia/LC_MESSAGES/ShareNotice.po index f448f013c4..3a0bbdda43 100644 --- a/plugins/ShareNotice/locale/ia/LC_MESSAGES/ShareNotice.po +++ b/plugins/ShareNotice/locale/ia/LC_MESSAGES/ShareNotice.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - ShareNotice to Interlingua (Interlingua) +# Translation of StatusNet - ShareNotice to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,42 +9,45 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - ShareNotice\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:17+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:58+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-24 15:25:49+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:02+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-sharenotice\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#. TRANS: Leave this message unchanged. #. TRANS: %s is notice content that is shared on Twitter, Facebook or another platform. #, php-format msgid "\"%s\"" msgstr "\"%s\"" +#. TRANS: Truncation symbol. +msgid "…" +msgstr "…" + #. TRANS: Tooltip for image to share a notice on Twitter. msgid "Share on Twitter" -msgstr "Condivider in Twitter" +msgstr "Divider in Twitter" #. TRANS: Tooltip for image to share a notice on another platform (other than Twitter or Facebook). #. TRANS: %s is a host name. #, php-format msgid "Share on %s" -msgstr "Condivider in %s" +msgstr "Divider in %s" #. TRANS: Tooltip for image to share a notice on Facebook. msgid "Share on Facebook" -msgstr "Condivider in Facebook" +msgstr "Divider in Facebook" #. TRANS: Plugin description. msgid "" "This plugin allows sharing of notices to Twitter, Facebook and other " "platforms." msgstr "" -"Iste plug-in permitte condivider notas in Twitter, Facebook e altere " +"Iste plug-in permitte divider notas in Twitter, Facebook e altere " "platteformas." diff --git a/plugins/ShareNotice/locale/mk/LC_MESSAGES/ShareNotice.po b/plugins/ShareNotice/locale/mk/LC_MESSAGES/ShareNotice.po index 4f155c4873..eaad4120ba 100644 --- a/plugins/ShareNotice/locale/mk/LC_MESSAGES/ShareNotice.po +++ b/plugins/ShareNotice/locale/mk/LC_MESSAGES/ShareNotice.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - ShareNotice to Macedonian (МакедонÑки) +# Translation of StatusNet - ShareNotice to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 @@ -9,24 +9,27 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - ShareNotice\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:17+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:58+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-24 15:25:49+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:02+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-sharenotice\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" -#. TRANS: Leave this message unchanged. #. TRANS: %s is notice content that is shared on Twitter, Facebook or another platform. #, php-format msgid "\"%s\"" msgstr "„%s“" +#. TRANS: Truncation symbol. +msgid "…" +msgstr "…" + #. TRANS: Tooltip for image to share a notice on Twitter. msgid "Share on Twitter" msgstr "Сподели на Twitter" diff --git a/plugins/ShareNotice/locale/nl/LC_MESSAGES/ShareNotice.po b/plugins/ShareNotice/locale/nl/LC_MESSAGES/ShareNotice.po index c3163f7fdd..03637e0be0 100644 --- a/plugins/ShareNotice/locale/nl/LC_MESSAGES/ShareNotice.po +++ b/plugins/ShareNotice/locale/nl/LC_MESSAGES/ShareNotice.po @@ -10,24 +10,27 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - ShareNotice\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:17+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:58+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-24 15:25:49+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:02+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-sharenotice\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#. TRANS: Leave this message unchanged. #. TRANS: %s is notice content that is shared on Twitter, Facebook or another platform. #, php-format msgid "\"%s\"" msgstr "\"%s\"" +#. TRANS: Truncation symbol. +msgid "…" +msgstr "…" + #. TRANS: Tooltip for image to share a notice on Twitter. msgid "Share on Twitter" msgstr "Delen op Twitter" diff --git a/plugins/ShareNotice/locale/pl/LC_MESSAGES/ShareNotice.po b/plugins/ShareNotice/locale/pl/LC_MESSAGES/ShareNotice.po index 3e3390171d..040a68a687 100644 --- a/plugins/ShareNotice/locale/pl/LC_MESSAGES/ShareNotice.po +++ b/plugins/ShareNotice/locale/pl/LC_MESSAGES/ShareNotice.po @@ -1,7 +1,8 @@ -# Translation of StatusNet - ShareNotice to Polish (Polski) -# Expored from translatewiki.net +# Translation of StatusNet - ShareNotice to Polish (polski) +# Exported from translatewiki.net # # Author: Raven +# Author: Woytecr # -- # This file is distributed under the same license as the StatusNet package. # @@ -9,45 +10,43 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - ShareNotice\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-12-16 15:08+0000\n" -"PO-Revision-Date: 2010-12-16 15:12:54+0000\n" -"Language-Team: Polish \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:58+0000\n" +"Language-Team: Polish \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-11-30 20:43:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r78478); Translate extension (2010-09-17)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:02+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: pl\n" "X-Message-Group: #out-statusnet-plugin-sharenotice\n" "Plural-Forms: nplurals=3; plural=(n == 1) ? 0 : ( (n%10 >= 2 && n%10 <= 4 && " "(n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" -#. TRANS: Leave this message unchanged. #. TRANS: %s is notice content that is shared on Twitter, Facebook or another platform. -#: ShareNoticePlugin.php:106 ShareNoticePlugin.php:194 #, php-format msgid "\"%s\"" msgstr "\"%s\"" +#. TRANS: Truncation symbol. +msgid "…" +msgstr "…" + #. TRANS: Tooltip for image to share a notice on Twitter. -#: ShareNoticePlugin.php:130 msgid "Share on Twitter" msgstr "" #. TRANS: Tooltip for image to share a notice on another platform (other than Twitter or Facebook). #. TRANS: %s is a host name. -#: ShareNoticePlugin.php:163 #, php-format msgid "Share on %s" msgstr "" #. TRANS: Tooltip for image to share a notice on Facebook. -#: ShareNoticePlugin.php:186 msgid "Share on Facebook" -msgstr "" +msgstr "UdostÄ™pnij na Facebooku" #. TRANS: Plugin description. -#: ShareNoticePlugin.php:219 msgid "" "This plugin allows sharing of notices to Twitter, Facebook and other " "platforms." diff --git a/plugins/ShareNotice/locale/te/LC_MESSAGES/ShareNotice.po b/plugins/ShareNotice/locale/te/LC_MESSAGES/ShareNotice.po index 998c2cc0c3..fc71cfd799 100644 --- a/plugins/ShareNotice/locale/te/LC_MESSAGES/ShareNotice.po +++ b/plugins/ShareNotice/locale/te/LC_MESSAGES/ShareNotice.po @@ -9,24 +9,27 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - ShareNotice\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:17+0000\n" -"Language-Team: Telugu \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:58+0000\n" +"Language-Team: Telugu \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-24 15:25:49+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:02+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: te\n" "X-Message-Group: #out-statusnet-plugin-sharenotice\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#. TRANS: Leave this message unchanged. #. TRANS: %s is notice content that is shared on Twitter, Facebook or another platform. #, php-format msgid "\"%s\"" msgstr "\"%s\"" +#. TRANS: Truncation symbol. +msgid "…" +msgstr "…" + #. TRANS: Tooltip for image to share a notice on Twitter. msgid "Share on Twitter" msgstr "à°Ÿà±à°µà°¿à°Ÿà±à°Ÿà°°à±à°²à±‹ పంచà±à°•à±‹à°‚à°¡à°¿" diff --git a/plugins/ShareNotice/locale/tl/LC_MESSAGES/ShareNotice.po b/plugins/ShareNotice/locale/tl/LC_MESSAGES/ShareNotice.po index 4c0b576f86..1858790d26 100644 --- a/plugins/ShareNotice/locale/tl/LC_MESSAGES/ShareNotice.po +++ b/plugins/ShareNotice/locale/tl/LC_MESSAGES/ShareNotice.po @@ -9,24 +9,27 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - ShareNotice\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:17+0000\n" -"Language-Team: Tagalog \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:58+0000\n" +"Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-24 15:25:49+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:02+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-sharenotice\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#. TRANS: Leave this message unchanged. #. TRANS: %s is notice content that is shared on Twitter, Facebook or another platform. #, php-format msgid "\"%s\"" msgstr "\"%s\"" +#. TRANS: Truncation symbol. +msgid "…" +msgstr "…" + #. TRANS: Tooltip for image to share a notice on Twitter. msgid "Share on Twitter" msgstr "Ibahagi sa Twitter" diff --git a/plugins/ShareNotice/locale/tr/LC_MESSAGES/ShareNotice.po b/plugins/ShareNotice/locale/tr/LC_MESSAGES/ShareNotice.po index 24c1d61fe1..3b0ef18d0f 100644 --- a/plugins/ShareNotice/locale/tr/LC_MESSAGES/ShareNotice.po +++ b/plugins/ShareNotice/locale/tr/LC_MESSAGES/ShareNotice.po @@ -9,24 +9,27 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - ShareNotice\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:17+0000\n" -"Language-Team: Turkish \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:58+0000\n" +"Language-Team: Turkish \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-24 15:25:49+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:02+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tr\n" "X-Message-Group: #out-statusnet-plugin-sharenotice\n" "Plural-Forms: nplurals=1; plural=0;\n" -#. TRANS: Leave this message unchanged. #. TRANS: %s is notice content that is shared on Twitter, Facebook or another platform. #, php-format msgid "\"%s\"" msgstr "" +#. TRANS: Truncation symbol. +msgid "…" +msgstr "" + #. TRANS: Tooltip for image to share a notice on Twitter. msgid "Share on Twitter" msgstr "Twitter'da PaylaÅŸ" diff --git a/plugins/ShareNotice/locale/uk/LC_MESSAGES/ShareNotice.po b/plugins/ShareNotice/locale/uk/LC_MESSAGES/ShareNotice.po index c5d2d3d86f..156be2cef7 100644 --- a/plugins/ShareNotice/locale/uk/LC_MESSAGES/ShareNotice.po +++ b/plugins/ShareNotice/locale/uk/LC_MESSAGES/ShareNotice.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - ShareNotice to Ukrainian (УкраїнÑька) +# Translation of StatusNet - ShareNotice to Ukrainian (українÑька) # Exported from translatewiki.net # # Author: Boogie @@ -9,25 +9,28 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - ShareNotice\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:17+0000\n" -"Language-Team: Ukrainian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:58+0000\n" +"Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-24 15:25:49+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:49:02+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-sharenotice\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" -#. TRANS: Leave this message unchanged. #. TRANS: %s is notice content that is shared on Twitter, Facebook or another platform. #, php-format msgid "\"%s\"" msgstr "«%s»" +#. TRANS: Truncation symbol. +msgid "…" +msgstr "…" + #. TRANS: Tooltip for image to share a notice on Twitter. msgid "Share on Twitter" msgstr "РозміÑтити в Twitter" diff --git a/plugins/SimpleUrl/SimpleUrlPlugin.php b/plugins/SimpleUrl/SimpleUrlPlugin.php index 24250f4d07..acf0e91e61 100644 --- a/plugins/SimpleUrl/SimpleUrlPlugin.php +++ b/plugins/SimpleUrl/SimpleUrlPlugin.php @@ -38,7 +38,8 @@ class SimpleUrlPlugin extends UrlShortenerPlugin function onInitializePlugin(){ parent::onInitializePlugin(); if(!isset($this->serviceUrl)){ - throw new Exception("must specify a serviceUrl"); + // TRANS: Exception thrown when the SimpleUrl plugin has been configured incorrectly. + throw new Exception(_m('You must specify a serviceUrl.')); } } @@ -53,10 +54,10 @@ class SimpleUrlPlugin extends UrlShortenerPlugin 'author' => 'Craig Andrews', 'homepage' => 'http://status.net/wiki/Plugin:SimpleUrl', 'rawdescription' => + // TRANS: Plugin description. sprintf(_m('Uses %1$s URL-shortener service.'), $this->shortenerName)); return true; } } - diff --git a/plugins/SimpleUrl/locale/SimpleUrl.pot b/plugins/SimpleUrl/locale/SimpleUrl.pot index 2bf1a96d31..5c79798179 100644 --- a/plugins/SimpleUrl/locale/SimpleUrl.pot +++ b/plugins/SimpleUrl/locale/SimpleUrl.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,7 +16,13 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: SimpleUrlPlugin.php:56 +#. TRANS: Exception thrown when the SimpleUrl plugin has been configured incorrectly. +#: SimpleUrlPlugin.php:42 +msgid "You must specify a serviceUrl." +msgstr "" + +#. TRANS: Plugin description. +#: SimpleUrlPlugin.php:58 #, php-format msgid "Uses %1$s URL-shortener service." msgstr "" diff --git a/plugins/SimpleUrl/locale/br/LC_MESSAGES/SimpleUrl.po b/plugins/SimpleUrl/locale/br/LC_MESSAGES/SimpleUrl.po index 2db437d648..3f2856a31b 100644 --- a/plugins/SimpleUrl/locale/br/LC_MESSAGES/SimpleUrl.po +++ b/plugins/SimpleUrl/locale/br/LC_MESSAGES/SimpleUrl.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SimpleUrl to Breton (Brezhoneg) +# Translation of StatusNet - SimpleUrl to Breton (brezhoneg) # Exported from translatewiki.net # # Author: Fulup @@ -9,18 +9,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SimpleUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:18+0000\n" -"Language-Team: Breton \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:58+0000\n" +"Language-Team: Breton \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:23+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: br\n" "X-Message-Group: #out-statusnet-plugin-simpleurl\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Exception thrown when the SimpleUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "" + +#. TRANS: Plugin description. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "" diff --git a/plugins/SimpleUrl/locale/de/LC_MESSAGES/SimpleUrl.po b/plugins/SimpleUrl/locale/de/LC_MESSAGES/SimpleUrl.po index 25ead5bdf6..aa196a519b 100644 --- a/plugins/SimpleUrl/locale/de/LC_MESSAGES/SimpleUrl.po +++ b/plugins/SimpleUrl/locale/de/LC_MESSAGES/SimpleUrl.po @@ -1,6 +1,7 @@ # Translation of StatusNet - SimpleUrl to German (Deutsch) # Exported from translatewiki.net # +# Author: ChrisiPK # Author: The Evil IP address # -- # This file is distributed under the same license as the StatusNet package. @@ -9,18 +10,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SimpleUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:18+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:58+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:23+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-simpleurl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Exception thrown when the SimpleUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "Du musst eine serviceUrl angeben." + +#. TRANS: Plugin description. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "Benutzung des %1$s-URL-Kürzungsdienstes." diff --git a/plugins/SimpleUrl/locale/es/LC_MESSAGES/SimpleUrl.po b/plugins/SimpleUrl/locale/es/LC_MESSAGES/SimpleUrl.po index 09c4e01177..3fbb7a5211 100644 --- a/plugins/SimpleUrl/locale/es/LC_MESSAGES/SimpleUrl.po +++ b/plugins/SimpleUrl/locale/es/LC_MESSAGES/SimpleUrl.po @@ -1,6 +1,7 @@ -# Translation of StatusNet - SimpleUrl to Spanish (Español) +# Translation of StatusNet - SimpleUrl to Spanish (español) # Exported from translatewiki.net # +# Author: Armando-Martin # Author: Translationista # -- # This file is distributed under the same license as the StatusNet package. @@ -9,18 +10,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SimpleUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:18+0000\n" -"Language-Team: Spanish \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:58+0000\n" +"Language-Team: Spanish \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:23+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: es\n" "X-Message-Group: #out-statusnet-plugin-simpleurl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Exception thrown when the SimpleUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "Debe especificar un \"serviceUrl\"." + +#. TRANS: Plugin description. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "" diff --git a/plugins/SimpleUrl/locale/eu/LC_MESSAGES/SimpleUrl.po b/plugins/SimpleUrl/locale/eu/LC_MESSAGES/SimpleUrl.po new file mode 100644 index 0000000000..4a212e4b23 --- /dev/null +++ b/plugins/SimpleUrl/locale/eu/LC_MESSAGES/SimpleUrl.po @@ -0,0 +1,28 @@ +# Translation of StatusNet - SimpleUrl to Basque (euskara) +# Exported from translatewiki.net +# +# Author: Artsuaga +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - SimpleUrl\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:59+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-19 11:23:23+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Exception thrown when the SimpleUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "Url zerbitzu bat adierazi behar duzu." + +#. TRANS: Plugin description. +#, php-format +msgid "Uses %1$s URL-shortener service." +msgstr "%1$s URL-laburtze zerbitzua erabiliz." diff --git a/plugins/SimpleUrl/locale/fi/LC_MESSAGES/SimpleUrl.po b/plugins/SimpleUrl/locale/fi/LC_MESSAGES/SimpleUrl.po index 86bd6ff089..ec82ae7e9b 100644 --- a/plugins/SimpleUrl/locale/fi/LC_MESSAGES/SimpleUrl.po +++ b/plugins/SimpleUrl/locale/fi/LC_MESSAGES/SimpleUrl.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SimpleUrl to Finnish (Suomi) +# Translation of StatusNet - SimpleUrl to Finnish (suomi) # Exported from translatewiki.net # # Author: Nike @@ -9,18 +9,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SimpleUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:18+0000\n" -"Language-Team: Finnish \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:59+0000\n" +"Language-Team: Finnish \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:23+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fi\n" "X-Message-Group: #out-statusnet-plugin-simpleurl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Exception thrown when the SimpleUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "" + +#. TRANS: Plugin description. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "Käyttää %1$s URL-lyhennyspalvelua." diff --git a/plugins/SimpleUrl/locale/fr/LC_MESSAGES/SimpleUrl.po b/plugins/SimpleUrl/locale/fr/LC_MESSAGES/SimpleUrl.po index db352d31c2..fe59014a01 100644 --- a/plugins/SimpleUrl/locale/fr/LC_MESSAGES/SimpleUrl.po +++ b/plugins/SimpleUrl/locale/fr/LC_MESSAGES/SimpleUrl.po @@ -1,6 +1,7 @@ -# Translation of StatusNet - SimpleUrl to French (Français) +# Translation of StatusNet - SimpleUrl to French (français) # Exported from translatewiki.net # +# Author: Crochet.david # Author: Peter17 # -- # This file is distributed under the same license as the StatusNet package. @@ -9,18 +10,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SimpleUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:18+0000\n" -"Language-Team: French \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:59+0000\n" +"Language-Team: French \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:23+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-simpleurl\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Exception thrown when the SimpleUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "Vous devez spécifier un serviceUrl." + +#. TRANS: Plugin description. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "" diff --git a/plugins/SimpleUrl/locale/gl/LC_MESSAGES/SimpleUrl.po b/plugins/SimpleUrl/locale/gl/LC_MESSAGES/SimpleUrl.po index f08885d3bf..700ccb3029 100644 --- a/plugins/SimpleUrl/locale/gl/LC_MESSAGES/SimpleUrl.po +++ b/plugins/SimpleUrl/locale/gl/LC_MESSAGES/SimpleUrl.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SimpleUrl to Galician (Galego) +# Translation of StatusNet - SimpleUrl to Galician (galego) # Exported from translatewiki.net # # Author: Toliño @@ -9,18 +9,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SimpleUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:18+0000\n" -"Language-Team: Galician \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:59+0000\n" +"Language-Team: Galician \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:23+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: gl\n" "X-Message-Group: #out-statusnet-plugin-simpleurl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Exception thrown when the SimpleUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "Cómpre especificar un serviceUrl." + +#. TRANS: Plugin description. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "" diff --git a/plugins/SimpleUrl/locale/he/LC_MESSAGES/SimpleUrl.po b/plugins/SimpleUrl/locale/he/LC_MESSAGES/SimpleUrl.po index be500a3029..3b2c1502cc 100644 --- a/plugins/SimpleUrl/locale/he/LC_MESSAGES/SimpleUrl.po +++ b/plugins/SimpleUrl/locale/he/LC_MESSAGES/SimpleUrl.po @@ -1,6 +1,7 @@ # Translation of StatusNet - SimpleUrl to Hebrew (עברית) # Exported from translatewiki.net # +# Author: Amire80 # Author: YaronSh # -- # This file is distributed under the same license as the StatusNet package. @@ -9,18 +10,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SimpleUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:18+0000\n" -"Language-Team: Hebrew \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:59+0000\n" +"Language-Team: Hebrew \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:23+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: he\n" "X-Message-Group: #out-statusnet-plugin-simpleurl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Exception thrown when the SimpleUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "יש להזין serviceUrl." + +#. TRANS: Plugin description. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "שימוש בשירות קיצור הכתובות %1$s." diff --git a/plugins/SimpleUrl/locale/ia/LC_MESSAGES/SimpleUrl.po b/plugins/SimpleUrl/locale/ia/LC_MESSAGES/SimpleUrl.po index d4a3d91cff..918ecdb4f9 100644 --- a/plugins/SimpleUrl/locale/ia/LC_MESSAGES/SimpleUrl.po +++ b/plugins/SimpleUrl/locale/ia/LC_MESSAGES/SimpleUrl.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SimpleUrl to Interlingua (Interlingua) +# Translation of StatusNet - SimpleUrl to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,18 +9,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SimpleUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:18+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:09:59+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:23+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-simpleurl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Exception thrown when the SimpleUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "Es necessari specificar un \"serviceUrl\"." + +#. TRANS: Plugin description. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "" diff --git a/plugins/SimpleUrl/locale/id/LC_MESSAGES/SimpleUrl.po b/plugins/SimpleUrl/locale/id/LC_MESSAGES/SimpleUrl.po index e01b9e4a0d..e7bcf61acc 100644 --- a/plugins/SimpleUrl/locale/id/LC_MESSAGES/SimpleUrl.po +++ b/plugins/SimpleUrl/locale/id/LC_MESSAGES/SimpleUrl.po @@ -9,18 +9,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SimpleUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:18+0000\n" -"Language-Team: Indonesian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:00+0000\n" +"Language-Team: Indonesian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:23+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: id\n" "X-Message-Group: #out-statusnet-plugin-simpleurl\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Exception thrown when the SimpleUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "" + +#. TRANS: Plugin description. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "Menggunakan layanan pemendek URL %1$s." diff --git a/plugins/SimpleUrl/locale/ja/LC_MESSAGES/SimpleUrl.po b/plugins/SimpleUrl/locale/ja/LC_MESSAGES/SimpleUrl.po index e5c241cddb..792b8d2550 100644 --- a/plugins/SimpleUrl/locale/ja/LC_MESSAGES/SimpleUrl.po +++ b/plugins/SimpleUrl/locale/ja/LC_MESSAGES/SimpleUrl.po @@ -9,18 +9,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SimpleUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:19+0000\n" -"Language-Team: Japanese \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:00+0000\n" +"Language-Team: Japanese \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:23+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ja\n" "X-Message-Group: #out-statusnet-plugin-simpleurl\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Exception thrown when the SimpleUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "" + +#. TRANS: Plugin description. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "%1$sã‚’URL短縮サービスã¨ã—ã¦åˆ©ç”¨ã™ã‚‹ã€‚" diff --git a/plugins/SimpleUrl/locale/mk/LC_MESSAGES/SimpleUrl.po b/plugins/SimpleUrl/locale/mk/LC_MESSAGES/SimpleUrl.po index 206fda65f6..b4334369ec 100644 --- a/plugins/SimpleUrl/locale/mk/LC_MESSAGES/SimpleUrl.po +++ b/plugins/SimpleUrl/locale/mk/LC_MESSAGES/SimpleUrl.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SimpleUrl to Macedonian (МакедонÑки) +# Translation of StatusNet - SimpleUrl to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 @@ -9,18 +9,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SimpleUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:19+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:00+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:23+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-simpleurl\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" +#. TRANS: Exception thrown when the SimpleUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "Мора да наведете serviceUrl." + +#. TRANS: Plugin description. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "" diff --git a/plugins/SimpleUrl/locale/nb/LC_MESSAGES/SimpleUrl.po b/plugins/SimpleUrl/locale/nb/LC_MESSAGES/SimpleUrl.po index 408da96523..9ffe5c8a7b 100644 --- a/plugins/SimpleUrl/locale/nb/LC_MESSAGES/SimpleUrl.po +++ b/plugins/SimpleUrl/locale/nb/LC_MESSAGES/SimpleUrl.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SimpleUrl to Norwegian (bokmÃ¥l)‬ (‪Norsk (bokmÃ¥l)‬) +# Translation of StatusNet - SimpleUrl to Norwegian BokmÃ¥l (‪norsk (bokmÃ¥l)‬) # Exported from translatewiki.net # # Author: Nghtwlkr @@ -9,18 +9,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SimpleUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:19+0000\n" -"Language-Team: Norwegian (bokmÃ¥l)‬ \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:00+0000\n" +"Language-Team: Norwegian BokmÃ¥l \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" -"X-Language-Code: no\n" +"X-POT-Import-Date: 2011-06-19 11:23:23+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: nb\n" "X-Message-Group: #out-statusnet-plugin-simpleurl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Exception thrown when the SimpleUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "" + +#. TRANS: Plugin description. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "Bruker URL-forkortertjenesten %1$s." diff --git a/plugins/SimpleUrl/locale/nl/LC_MESSAGES/SimpleUrl.po b/plugins/SimpleUrl/locale/nl/LC_MESSAGES/SimpleUrl.po index 923c910a48..a1b2a4d812 100644 --- a/plugins/SimpleUrl/locale/nl/LC_MESSAGES/SimpleUrl.po +++ b/plugins/SimpleUrl/locale/nl/LC_MESSAGES/SimpleUrl.po @@ -9,18 +9,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SimpleUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:19+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:00+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:23+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-simpleurl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Exception thrown when the SimpleUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "U moet een serviceUrl opgeven." + +#. TRANS: Plugin description. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "" diff --git a/plugins/SimpleUrl/locale/pt/LC_MESSAGES/SimpleUrl.po b/plugins/SimpleUrl/locale/pt/LC_MESSAGES/SimpleUrl.po index 3ecaf79b48..4e6c0bf698 100644 --- a/plugins/SimpleUrl/locale/pt/LC_MESSAGES/SimpleUrl.po +++ b/plugins/SimpleUrl/locale/pt/LC_MESSAGES/SimpleUrl.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SimpleUrl to Portuguese (Português) +# Translation of StatusNet - SimpleUrl to Portuguese (português) # Exported from translatewiki.net # # Author: Hamilton Abreu @@ -9,18 +9,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SimpleUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:19+0000\n" -"Language-Team: Portuguese \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:00+0000\n" +"Language-Team: Portuguese \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:23+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: pt\n" "X-Message-Group: #out-statusnet-plugin-simpleurl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Exception thrown when the SimpleUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "" + +#. TRANS: Plugin description. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "Usa o serviço de abreviação de URLs %1$s." diff --git a/plugins/SimpleUrl/locale/ru/LC_MESSAGES/SimpleUrl.po b/plugins/SimpleUrl/locale/ru/LC_MESSAGES/SimpleUrl.po index df4f7ab3f8..8f255c183d 100644 --- a/plugins/SimpleUrl/locale/ru/LC_MESSAGES/SimpleUrl.po +++ b/plugins/SimpleUrl/locale/ru/LC_MESSAGES/SimpleUrl.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SimpleUrl to Russian (РуÑÑкий) +# Translation of StatusNet - SimpleUrl to Russian (руÑÑкий) # Exported from translatewiki.net # # Author: Eleferen @@ -9,19 +9,24 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SimpleUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:19+0000\n" -"Language-Team: Russian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:00+0000\n" +"Language-Team: Russian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:23+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ru\n" "X-Message-Group: #out-statusnet-plugin-simpleurl\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Exception thrown when the SimpleUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "" + +#. TRANS: Plugin description. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "ИÑпользование Ñлужбы ÑÐ¾ÐºÑ€Ð°Ñ‰ÐµÐ½Ð¸Ñ URL %1$s." diff --git a/plugins/SimpleUrl/locale/tl/LC_MESSAGES/SimpleUrl.po b/plugins/SimpleUrl/locale/tl/LC_MESSAGES/SimpleUrl.po index e888e26a6e..662b9f8083 100644 --- a/plugins/SimpleUrl/locale/tl/LC_MESSAGES/SimpleUrl.po +++ b/plugins/SimpleUrl/locale/tl/LC_MESSAGES/SimpleUrl.po @@ -9,18 +9,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SimpleUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:19+0000\n" -"Language-Team: Tagalog \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:00+0000\n" +"Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:23+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-simpleurl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Exception thrown when the SimpleUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "Dapat kang tumukoy ng isang URL ng paglilingkod." + +#. TRANS: Plugin description. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "" diff --git a/plugins/SimpleUrl/locale/uk/LC_MESSAGES/SimpleUrl.po b/plugins/SimpleUrl/locale/uk/LC_MESSAGES/SimpleUrl.po index 85eede5aec..b8adcd169d 100644 --- a/plugins/SimpleUrl/locale/uk/LC_MESSAGES/SimpleUrl.po +++ b/plugins/SimpleUrl/locale/uk/LC_MESSAGES/SimpleUrl.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SimpleUrl to Ukrainian (УкраїнÑька) +# Translation of StatusNet - SimpleUrl to Ukrainian (українÑька) # Exported from translatewiki.net # # Author: Boogie @@ -9,19 +9,24 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SimpleUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:19+0000\n" -"Language-Team: Ukrainian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:00+0000\n" +"Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:23+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-simpleurl\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Exception thrown when the SimpleUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "" + +#. TRANS: Plugin description. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "" diff --git a/plugins/Sitemap/SitemapPlugin.php b/plugins/Sitemap/SitemapPlugin.php index 36041cfc9a..29b822acd5 100644 --- a/plugins/Sitemap/SitemapPlugin.php +++ b/plugins/Sitemap/SitemapPlugin.php @@ -108,14 +108,14 @@ class SitemapPlugin extends Plugin $m->connect('sitemapindex.xml', array('action' => 'sitemapindex')); - $m->connect('/notice-sitemap-:year-:month-:day-:index.xml', + $m->connect('notice-sitemap-:year-:month-:day-:index.xml', array('action' => 'noticesitemap'), array('year' => '[0-9]{4}', 'month' => '[01][0-9]', 'day' => '[0123][0-9]', 'index' => '[1-9][0-9]*')); - $m->connect('/user-sitemap-:year-:month-:day-:index.xml', + $m->connect('user-sitemap-:year-:month-:day-:index.xml', array('action' => 'usersitemap'), array('year' => '[0-9]{4}', 'month' => '[01][0-9]', @@ -196,12 +196,6 @@ class SitemapPlugin extends Plugin null, false), new ColumnDef('modified', 'timestamp'))); - $userCreated = $schema->getColumnDef('user', 'created'); - - if (empty($userCreated) || $userCreated->key != 'MUL') { - $schema->createIndex('user', 'created'); - } - return true; } diff --git a/plugins/Sitemap/locale/Sitemap.pot b/plugins/Sitemap/locale/Sitemap.pot index ed6dd52b32..b90fa7d787 100644 --- a/plugins/Sitemap/locale/Sitemap.pot +++ b/plugins/Sitemap/locale/Sitemap.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -68,17 +68,17 @@ msgid "Save sitemap settings." msgstr "" #. TRANS: Menu item title/tooltip -#: SitemapPlugin.php:211 +#: SitemapPlugin.php:205 msgid "Sitemap configuration" msgstr "" #. TRANS: Menu item for site administration -#: SitemapPlugin.php:213 +#: SitemapPlugin.php:207 msgctxt "MENU" msgid "Sitemap" msgstr "" #. TRANS: Plugin description. -#: SitemapPlugin.php:238 +#: SitemapPlugin.php:232 msgid "This plugin allows creation of sitemaps for Bing, Yahoo! and Google." msgstr "" diff --git a/plugins/Sitemap/locale/br/LC_MESSAGES/Sitemap.po b/plugins/Sitemap/locale/br/LC_MESSAGES/Sitemap.po index cba192bd97..08d64f7da2 100644 --- a/plugins/Sitemap/locale/br/LC_MESSAGES/Sitemap.po +++ b/plugins/Sitemap/locale/br/LC_MESSAGES/Sitemap.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - Sitemap to Breton (Brezhoneg) +# Translation of StatusNet - Sitemap to Breton (brezhoneg) # Exported from translatewiki.net # # Author: Fulup @@ -10,14 +10,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Sitemap\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:21+0000\n" -"Language-Team: Breton \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:01+0000\n" +"Language-Team: Breton \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:57+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:35+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: br\n" "X-Message-Group: #out-statusnet-plugin-sitemap\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" diff --git a/plugins/Sitemap/locale/de/LC_MESSAGES/Sitemap.po b/plugins/Sitemap/locale/de/LC_MESSAGES/Sitemap.po index a2723bed58..6211db386f 100644 --- a/plugins/Sitemap/locale/de/LC_MESSAGES/Sitemap.po +++ b/plugins/Sitemap/locale/de/LC_MESSAGES/Sitemap.po @@ -10,14 +10,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Sitemap\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:21+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:01+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:57+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:35+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-sitemap\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/plugins/Sitemap/locale/diq/LC_MESSAGES/Sitemap.po b/plugins/Sitemap/locale/diq/LC_MESSAGES/Sitemap.po new file mode 100644 index 0000000000..62122ae525 --- /dev/null +++ b/plugins/Sitemap/locale/diq/LC_MESSAGES/Sitemap.po @@ -0,0 +1,73 @@ +# Translation of StatusNet - Sitemap to Zazaki (Zazaki) +# Exported from translatewiki.net +# +# Author: Erdemaslancan +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Sitemap\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:01+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:51:35+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Title for sitemap. +msgid "Sitemap" +msgstr "Pusulay sita" + +#. TRANS: Instructions for sitemap. +msgid "Sitemap settings for this StatusNet site" +msgstr "" + +#. TRANS: Field label. +msgid "Google key" +msgstr "Google kesa" + +#. TRANS: Title for field label. +msgid "Google Webmaster Tools verification key." +msgstr "" + +#. TRANS: Field label. +msgid "Yahoo key" +msgstr "Yahoo kesa" + +#. TRANS: Title for field label. +msgid "Yahoo! Site Explorer verification key." +msgstr "" + +#. TRANS: Field label. +msgid "Bing key" +msgstr "Bing kesa" + +#. TRANS: Title for field label. +msgid "Bing Webmaster Tools verification key." +msgstr "" + +#. TRANS: Submit button text to save sitemap settings. +msgctxt "BUTTON" +msgid "Save" +msgstr "Star ke" + +#. TRANS: Submit button title to save sitemap settings. +msgid "Save sitemap settings." +msgstr "" + +#. TRANS: Menu item title/tooltip +msgid "Sitemap configuration" +msgstr "" + +#. TRANS: Menu item for site administration +msgctxt "MENU" +msgid "Sitemap" +msgstr "Pusulay sita" + +#. TRANS: Plugin description. +msgid "This plugin allows creation of sitemaps for Bing, Yahoo! and Google." +msgstr "" diff --git a/plugins/Sitemap/locale/es/LC_MESSAGES/Sitemap.po b/plugins/Sitemap/locale/es/LC_MESSAGES/Sitemap.po new file mode 100644 index 0000000000..806164eea9 --- /dev/null +++ b/plugins/Sitemap/locale/es/LC_MESSAGES/Sitemap.po @@ -0,0 +1,75 @@ +# Translation of StatusNet - Sitemap to Spanish (español) +# Exported from translatewiki.net +# +# Author: Armando-Martin +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Sitemap\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:01+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:51:35+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Title for sitemap. +msgid "Sitemap" +msgstr "Mapa del sitio" + +#. TRANS: Instructions for sitemap. +msgid "Sitemap settings for this StatusNet site" +msgstr "Configuración del mapa del sitio para este sitio de StatusNet" + +#. TRANS: Field label. +msgid "Google key" +msgstr "Clave Google" + +#. TRANS: Title for field label. +msgid "Google Webmaster Tools verification key." +msgstr "Clave de verificación de Google Webmaster Tools." + +#. TRANS: Field label. +msgid "Yahoo key" +msgstr "Clave Yahoo" + +#. TRANS: Title for field label. +msgid "Yahoo! Site Explorer verification key." +msgstr "Clave de verificación de Yahoo! Site Explorer." + +#. TRANS: Field label. +msgid "Bing key" +msgstr "Clave Bing" + +#. TRANS: Title for field label. +msgid "Bing Webmaster Tools verification key." +msgstr "Clave de verificación de Bing Webmaster Tools." + +#. TRANS: Submit button text to save sitemap settings. +msgctxt "BUTTON" +msgid "Save" +msgstr "Guardar" + +#. TRANS: Submit button title to save sitemap settings. +msgid "Save sitemap settings." +msgstr "Guardar la configuración del mapa del sitio." + +#. TRANS: Menu item title/tooltip +msgid "Sitemap configuration" +msgstr "Configuración del mapa del sitio" + +#. TRANS: Menu item for site administration +msgctxt "MENU" +msgid "Sitemap" +msgstr "Mapa del sitio" + +#. TRANS: Plugin description. +msgid "This plugin allows creation of sitemaps for Bing, Yahoo! and Google." +msgstr "" +"Este complemento (plugin) permite la creación de mapas de sitios para Bing, " +"Yahoo! y Google." diff --git a/plugins/Sitemap/locale/eu/LC_MESSAGES/Sitemap.po b/plugins/Sitemap/locale/eu/LC_MESSAGES/Sitemap.po new file mode 100644 index 0000000000..07e3e5ec96 --- /dev/null +++ b/plugins/Sitemap/locale/eu/LC_MESSAGES/Sitemap.po @@ -0,0 +1,73 @@ +# Translation of StatusNet - Sitemap to Basque (euskara) +# Exported from translatewiki.net +# +# Author: Artsuaga +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Sitemap\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:01+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:51:35+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Title for sitemap. +msgid "Sitemap" +msgstr "Gunemapa" + +#. TRANS: Instructions for sitemap. +msgid "Sitemap settings for this StatusNet site" +msgstr "Saio-ezarpenak StatusNet gune honetarako" + +#. TRANS: Field label. +msgid "Google key" +msgstr "Google gakoa" + +#. TRANS: Title for field label. +msgid "Google Webmaster Tools verification key." +msgstr "" + +#. TRANS: Field label. +msgid "Yahoo key" +msgstr "Yahoo gakoa" + +#. TRANS: Title for field label. +msgid "Yahoo! Site Explorer verification key." +msgstr "" + +#. TRANS: Field label. +msgid "Bing key" +msgstr "Bing gakoa" + +#. TRANS: Title for field label. +msgid "Bing Webmaster Tools verification key." +msgstr "" + +#. TRANS: Submit button text to save sitemap settings. +msgctxt "BUTTON" +msgid "Save" +msgstr "Gorde" + +#. TRANS: Submit button title to save sitemap settings. +msgid "Save sitemap settings." +msgstr "Gorde gunemapa aukerak." + +#. TRANS: Menu item title/tooltip +msgid "Sitemap configuration" +msgstr "Gunemapa konfigurazioa" + +#. TRANS: Menu item for site administration +msgctxt "MENU" +msgid "Sitemap" +msgstr "Gunemapa" + +#. TRANS: Plugin description. +msgid "This plugin allows creation of sitemaps for Bing, Yahoo! and Google." +msgstr "" diff --git a/plugins/Sitemap/locale/fr/LC_MESSAGES/Sitemap.po b/plugins/Sitemap/locale/fr/LC_MESSAGES/Sitemap.po index b5e3764f12..8e85cee128 100644 --- a/plugins/Sitemap/locale/fr/LC_MESSAGES/Sitemap.po +++ b/plugins/Sitemap/locale/fr/LC_MESSAGES/Sitemap.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - Sitemap to French (Français) +# Translation of StatusNet - Sitemap to French (français) # Exported from translatewiki.net # # Author: Peter17 @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Sitemap\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:21+0000\n" -"Language-Team: French \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:01+0000\n" +"Language-Team: French \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:57+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:35+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-sitemap\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" diff --git a/plugins/Sitemap/locale/gl/LC_MESSAGES/Sitemap.po b/plugins/Sitemap/locale/gl/LC_MESSAGES/Sitemap.po new file mode 100644 index 0000000000..86e135df34 --- /dev/null +++ b/plugins/Sitemap/locale/gl/LC_MESSAGES/Sitemap.po @@ -0,0 +1,78 @@ +# Translation of StatusNet - Sitemap to Galician (galego) +# Exported from translatewiki.net +# +# Author: Toliño +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Sitemap\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:02+0000\n" +"Language-Team: Galician \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:51:35+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: gl\n" +"X-Message-Group: #out-statusnet-plugin-sitemap\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Title for sitemap. +msgid "Sitemap" +msgstr "Mapa do sitio" + +#. TRANS: Instructions for sitemap. +msgid "Sitemap settings for this StatusNet site" +msgstr "Configuración de mapa do sitio para este sitio StatusNet" + +#. TRANS: Field label. +msgid "Google key" +msgstr "Clave Google" + +#. TRANS: Title for field label. +msgid "Google Webmaster Tools verification key." +msgstr "Clave de verificación para as ferramentas de Google Webmaster." + +#. TRANS: Field label. +msgid "Yahoo key" +msgstr "Clave Yahoo" + +#. TRANS: Title for field label. +msgid "Yahoo! Site Explorer verification key." +msgstr "Clave de verificación para o explorador de sitios de Yahoo!" + +#. TRANS: Field label. +msgid "Bing key" +msgstr "Clave Bing" + +#. TRANS: Title for field label. +msgid "Bing Webmaster Tools verification key." +msgstr "Clave de verificación para as ferramentas de Bing Webmaster." + +#. TRANS: Submit button text to save sitemap settings. +msgctxt "BUTTON" +msgid "Save" +msgstr "Gardar" + +#. TRANS: Submit button title to save sitemap settings. +msgid "Save sitemap settings." +msgstr "Gardar a configuración do mapa do sitio." + +#. TRANS: Menu item title/tooltip +msgid "Sitemap configuration" +msgstr "Configuración do mapa do sitio" + +#. TRANS: Menu item for site administration +msgctxt "MENU" +msgid "Sitemap" +msgstr "Mapa do sitio" + +#. TRANS: Plugin description. +msgid "This plugin allows creation of sitemaps for Bing, Yahoo! and Google." +msgstr "" +"Este complemento permite a creación de mapas do sitio para Bing, Yahoo! e " +"Google." diff --git a/plugins/Sitemap/locale/ia/LC_MESSAGES/Sitemap.po b/plugins/Sitemap/locale/ia/LC_MESSAGES/Sitemap.po index bf855b15ab..223f208f6a 100644 --- a/plugins/Sitemap/locale/ia/LC_MESSAGES/Sitemap.po +++ b/plugins/Sitemap/locale/ia/LC_MESSAGES/Sitemap.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - Sitemap to Interlingua (Interlingua) +# Translation of StatusNet - Sitemap to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Sitemap\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:21+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:02+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:57+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:35+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-sitemap\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/plugins/Sitemap/locale/ja/LC_MESSAGES/Sitemap.po b/plugins/Sitemap/locale/ja/LC_MESSAGES/Sitemap.po new file mode 100644 index 0000000000..12c76d4d3d --- /dev/null +++ b/plugins/Sitemap/locale/ja/LC_MESSAGES/Sitemap.po @@ -0,0 +1,73 @@ +# Translation of StatusNet - Sitemap to Japanese (日本語) +# Exported from translatewiki.net +# +# Author: Shirayuki +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Sitemap\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:02+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:51:35+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. TRANS: Title for sitemap. +msgid "Sitemap" +msgstr "サイトマップ" + +#. TRANS: Instructions for sitemap. +msgid "Sitemap settings for this StatusNet site" +msgstr "" + +#. TRANS: Field label. +msgid "Google key" +msgstr "Google キー" + +#. TRANS: Title for field label. +msgid "Google Webmaster Tools verification key." +msgstr "" + +#. TRANS: Field label. +msgid "Yahoo key" +msgstr "Yahoo キー" + +#. TRANS: Title for field label. +msgid "Yahoo! Site Explorer verification key." +msgstr "" + +#. TRANS: Field label. +msgid "Bing key" +msgstr "Bing キー" + +#. TRANS: Title for field label. +msgid "Bing Webmaster Tools verification key." +msgstr "" + +#. TRANS: Submit button text to save sitemap settings. +msgctxt "BUTTON" +msgid "Save" +msgstr "ä¿å­˜" + +#. TRANS: Submit button title to save sitemap settings. +msgid "Save sitemap settings." +msgstr "" + +#. TRANS: Menu item title/tooltip +msgid "Sitemap configuration" +msgstr "" + +#. TRANS: Menu item for site administration +msgctxt "MENU" +msgid "Sitemap" +msgstr "サイトマップ" + +#. TRANS: Plugin description. +msgid "This plugin allows creation of sitemaps for Bing, Yahoo! and Google." +msgstr "" diff --git a/plugins/Sitemap/locale/mk/LC_MESSAGES/Sitemap.po b/plugins/Sitemap/locale/mk/LC_MESSAGES/Sitemap.po index 217765e31c..b05e53cf22 100644 --- a/plugins/Sitemap/locale/mk/LC_MESSAGES/Sitemap.po +++ b/plugins/Sitemap/locale/mk/LC_MESSAGES/Sitemap.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - Sitemap to Macedonian (МакедонÑки) +# Translation of StatusNet - Sitemap to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Sitemap\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:21+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:02+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:57+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:35+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-sitemap\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" diff --git a/plugins/Sitemap/locale/nl/LC_MESSAGES/Sitemap.po b/plugins/Sitemap/locale/nl/LC_MESSAGES/Sitemap.po index 7772a8591a..068c9074f4 100644 --- a/plugins/Sitemap/locale/nl/LC_MESSAGES/Sitemap.po +++ b/plugins/Sitemap/locale/nl/LC_MESSAGES/Sitemap.po @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Sitemap\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:21+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:02+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:57+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:35+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-sitemap\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/plugins/Sitemap/locale/ru/LC_MESSAGES/Sitemap.po b/plugins/Sitemap/locale/ru/LC_MESSAGES/Sitemap.po index 71879f46dc..8069cf7513 100644 --- a/plugins/Sitemap/locale/ru/LC_MESSAGES/Sitemap.po +++ b/plugins/Sitemap/locale/ru/LC_MESSAGES/Sitemap.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - Sitemap to Russian (РуÑÑкий) +# Translation of StatusNet - Sitemap to Russian (руÑÑкий) # Exported from translatewiki.net # # Author: MaxSem @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Sitemap\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:21+0000\n" -"Language-Team: Russian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:02+0000\n" +"Language-Team: Russian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:57+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:35+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ru\n" "X-Message-Group: #out-statusnet-plugin-sitemap\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " diff --git a/plugins/Sitemap/locale/tl/LC_MESSAGES/Sitemap.po b/plugins/Sitemap/locale/tl/LC_MESSAGES/Sitemap.po index 50e8ebaed4..4d0e5bc00e 100644 --- a/plugins/Sitemap/locale/tl/LC_MESSAGES/Sitemap.po +++ b/plugins/Sitemap/locale/tl/LC_MESSAGES/Sitemap.po @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Sitemap\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:21+0000\n" -"Language-Team: Tagalog \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:02+0000\n" +"Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:57+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:35+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-sitemap\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/plugins/Sitemap/locale/uk/LC_MESSAGES/Sitemap.po b/plugins/Sitemap/locale/uk/LC_MESSAGES/Sitemap.po index 0c01fa50c8..e83ee56a40 100644 --- a/plugins/Sitemap/locale/uk/LC_MESSAGES/Sitemap.po +++ b/plugins/Sitemap/locale/uk/LC_MESSAGES/Sitemap.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - Sitemap to Ukrainian (УкраїнÑька) +# Translation of StatusNet - Sitemap to Ukrainian (українÑька) # Exported from translatewiki.net # # Author: Boogie @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Sitemap\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:21+0000\n" -"Language-Team: Ukrainian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:03+0000\n" +"Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:57+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:35+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-sitemap\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " diff --git a/plugins/SlicedFavorites/locale/SlicedFavorites.pot b/plugins/SlicedFavorites/locale/SlicedFavorites.pot index ceb47ee345..c1cf49d66f 100644 --- a/plugins/SlicedFavorites/locale/SlicedFavorites.pot +++ b/plugins/SlicedFavorites/locale/SlicedFavorites.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/plugins/SlicedFavorites/locale/de/LC_MESSAGES/SlicedFavorites.po b/plugins/SlicedFavorites/locale/de/LC_MESSAGES/SlicedFavorites.po index 5abf3c0bda..81bee18cc1 100644 --- a/plugins/SlicedFavorites/locale/de/LC_MESSAGES/SlicedFavorites.po +++ b/plugins/SlicedFavorites/locale/de/LC_MESSAGES/SlicedFavorites.po @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SlicedFavorites\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:22+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:03+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:58+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-slicedfavorites\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/plugins/SlicedFavorites/locale/es/LC_MESSAGES/SlicedFavorites.po b/plugins/SlicedFavorites/locale/es/LC_MESSAGES/SlicedFavorites.po new file mode 100644 index 0000000000..270b472b9a --- /dev/null +++ b/plugins/SlicedFavorites/locale/es/LC_MESSAGES/SlicedFavorites.po @@ -0,0 +1,28 @@ +# Translation of StatusNet - SlicedFavorites to Spanish (español) +# Exported from translatewiki.net +# +# Author: Armando-Martin +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - SlicedFavorites\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:03+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:51:36+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin description. +msgid "Shows timelines of popular notices for defined subsets of users." +msgstr "" +"Muestra listas de notas populares para subconjuntos definidos de usuarios." + +#. TRANS: Client exception. +msgid "Unknown favorites slice." +msgstr "Sección de favoritos desconocida" diff --git a/plugins/SlicedFavorites/locale/eu/LC_MESSAGES/SlicedFavorites.po b/plugins/SlicedFavorites/locale/eu/LC_MESSAGES/SlicedFavorites.po new file mode 100644 index 0000000000..59a3566cfa --- /dev/null +++ b/plugins/SlicedFavorites/locale/eu/LC_MESSAGES/SlicedFavorites.po @@ -0,0 +1,27 @@ +# Translation of StatusNet - SlicedFavorites to Basque (euskara) +# Exported from translatewiki.net +# +# Author: Artsuaga +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - SlicedFavorites\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:03+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:51:36+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin description. +msgid "Shows timelines of popular notices for defined subsets of users." +msgstr "" + +#. TRANS: Client exception. +msgid "Unknown favorites slice." +msgstr "Gogokoen atal ezezaguna." diff --git a/plugins/SlicedFavorites/locale/fr/LC_MESSAGES/SlicedFavorites.po b/plugins/SlicedFavorites/locale/fr/LC_MESSAGES/SlicedFavorites.po index 2dee64c2f7..df1dc113d7 100644 --- a/plugins/SlicedFavorites/locale/fr/LC_MESSAGES/SlicedFavorites.po +++ b/plugins/SlicedFavorites/locale/fr/LC_MESSAGES/SlicedFavorites.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SlicedFavorites to French (Français) +# Translation of StatusNet - SlicedFavorites to French (français) # Exported from translatewiki.net # # Author: Peter17 @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SlicedFavorites\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:22+0000\n" -"Language-Team: French \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:03+0000\n" +"Language-Team: French \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:58+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-slicedfavorites\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" diff --git a/plugins/SlicedFavorites/locale/gl/LC_MESSAGES/SlicedFavorites.po b/plugins/SlicedFavorites/locale/gl/LC_MESSAGES/SlicedFavorites.po new file mode 100644 index 0000000000..7fe986d249 --- /dev/null +++ b/plugins/SlicedFavorites/locale/gl/LC_MESSAGES/SlicedFavorites.po @@ -0,0 +1,31 @@ +# Translation of StatusNet - SlicedFavorites to Galician (galego) +# Exported from translatewiki.net +# +# Author: Toliño +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - SlicedFavorites\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:03+0000\n" +"Language-Team: Galician \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:51:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: gl\n" +"X-Message-Group: #out-statusnet-plugin-slicedfavorites\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin description. +msgid "Shows timelines of popular notices for defined subsets of users." +msgstr "" +"Mostra listas de notas populares para os subconxuntos definidos de usuarios." + +#. TRANS: Client exception. +msgid "Unknown favorites slice." +msgstr "Anaco de favoritos descoñecido." diff --git a/plugins/SlicedFavorites/locale/he/LC_MESSAGES/SlicedFavorites.po b/plugins/SlicedFavorites/locale/he/LC_MESSAGES/SlicedFavorites.po index 2201c11c1a..7b07d6357d 100644 --- a/plugins/SlicedFavorites/locale/he/LC_MESSAGES/SlicedFavorites.po +++ b/plugins/SlicedFavorites/locale/he/LC_MESSAGES/SlicedFavorites.po @@ -1,6 +1,7 @@ # Translation of StatusNet - SlicedFavorites to Hebrew (עברית) # Exported from translatewiki.net # +# Author: Amire80 # Author: YaronSh # -- # This file is distributed under the same license as the StatusNet package. @@ -9,21 +10,21 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SlicedFavorites\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:22+0000\n" -"Language-Team: Hebrew \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:03+0000\n" +"Language-Team: Hebrew \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:58+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: he\n" "X-Message-Group: #out-statusnet-plugin-slicedfavorites\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. TRANS: Plugin description. msgid "Shows timelines of popular notices for defined subsets of users." -msgstr "הצגת צירי זמן של התרעות נפוצות לקבוצות מסוימות של משתמשי×." +msgstr "הצגת צירי זמן של ×¢×“×›×•× ×™× ×¤×•×¤×•×œ×¨×™×™× ×œ×ª×ªÖ¾×§×‘×•×¦×•×ª מסוימות של משתמשי×." #. TRANS: Client exception. msgid "Unknown favorites slice." diff --git a/plugins/SlicedFavorites/locale/ia/LC_MESSAGES/SlicedFavorites.po b/plugins/SlicedFavorites/locale/ia/LC_MESSAGES/SlicedFavorites.po index 828dc32514..e43529a4c4 100644 --- a/plugins/SlicedFavorites/locale/ia/LC_MESSAGES/SlicedFavorites.po +++ b/plugins/SlicedFavorites/locale/ia/LC_MESSAGES/SlicedFavorites.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SlicedFavorites to Interlingua (Interlingua) +# Translation of StatusNet - SlicedFavorites to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SlicedFavorites\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:22+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:03+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:58+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-slicedfavorites\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/plugins/SlicedFavorites/locale/id/LC_MESSAGES/SlicedFavorites.po b/plugins/SlicedFavorites/locale/id/LC_MESSAGES/SlicedFavorites.po index d23764c33d..2e8ae13609 100644 --- a/plugins/SlicedFavorites/locale/id/LC_MESSAGES/SlicedFavorites.po +++ b/plugins/SlicedFavorites/locale/id/LC_MESSAGES/SlicedFavorites.po @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SlicedFavorites\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:22+0000\n" -"Language-Team: Indonesian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:03+0000\n" +"Language-Team: Indonesian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:58+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: id\n" "X-Message-Group: #out-statusnet-plugin-slicedfavorites\n" "Plural-Forms: nplurals=1; plural=0;\n" diff --git a/plugins/SlicedFavorites/locale/mk/LC_MESSAGES/SlicedFavorites.po b/plugins/SlicedFavorites/locale/mk/LC_MESSAGES/SlicedFavorites.po index a9976f721f..68f2e71b4b 100644 --- a/plugins/SlicedFavorites/locale/mk/LC_MESSAGES/SlicedFavorites.po +++ b/plugins/SlicedFavorites/locale/mk/LC_MESSAGES/SlicedFavorites.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SlicedFavorites to Macedonian (МакедонÑки) +# Translation of StatusNet - SlicedFavorites to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SlicedFavorites\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:23+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:04+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:58+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-slicedfavorites\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" diff --git a/plugins/SlicedFavorites/locale/nl/LC_MESSAGES/SlicedFavorites.po b/plugins/SlicedFavorites/locale/nl/LC_MESSAGES/SlicedFavorites.po index dccb0c11f5..f7a68df868 100644 --- a/plugins/SlicedFavorites/locale/nl/LC_MESSAGES/SlicedFavorites.po +++ b/plugins/SlicedFavorites/locale/nl/LC_MESSAGES/SlicedFavorites.po @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SlicedFavorites\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:23+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:04+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:58+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-slicedfavorites\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/plugins/SlicedFavorites/locale/ru/LC_MESSAGES/SlicedFavorites.po b/plugins/SlicedFavorites/locale/ru/LC_MESSAGES/SlicedFavorites.po index f43c2b9399..2534acdddb 100644 --- a/plugins/SlicedFavorites/locale/ru/LC_MESSAGES/SlicedFavorites.po +++ b/plugins/SlicedFavorites/locale/ru/LC_MESSAGES/SlicedFavorites.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SlicedFavorites to Russian (РуÑÑкий) +# Translation of StatusNet - SlicedFavorites to Russian (руÑÑкий) # Exported from translatewiki.net # # Author: ÐлекÑандр Сигачёв @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SlicedFavorites\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:23+0000\n" -"Language-Team: Russian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:04+0000\n" +"Language-Team: Russian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:58+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ru\n" "X-Message-Group: #out-statusnet-plugin-slicedfavorites\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " diff --git a/plugins/SlicedFavorites/locale/tl/LC_MESSAGES/SlicedFavorites.po b/plugins/SlicedFavorites/locale/tl/LC_MESSAGES/SlicedFavorites.po index c4010f7555..14960c7491 100644 --- a/plugins/SlicedFavorites/locale/tl/LC_MESSAGES/SlicedFavorites.po +++ b/plugins/SlicedFavorites/locale/tl/LC_MESSAGES/SlicedFavorites.po @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SlicedFavorites\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:23+0000\n" -"Language-Team: Tagalog \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:04+0000\n" +"Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:58+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-slicedfavorites\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/plugins/SlicedFavorites/locale/uk/LC_MESSAGES/SlicedFavorites.po b/plugins/SlicedFavorites/locale/uk/LC_MESSAGES/SlicedFavorites.po index dd1f9b3f58..672515e950 100644 --- a/plugins/SlicedFavorites/locale/uk/LC_MESSAGES/SlicedFavorites.po +++ b/plugins/SlicedFavorites/locale/uk/LC_MESSAGES/SlicedFavorites.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SlicedFavorites to Ukrainian (УкраїнÑька) +# Translation of StatusNet - SlicedFavorites to Ukrainian (українÑька) # Exported from translatewiki.net # # Author: Boogie @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SlicedFavorites\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:23+0000\n" -"Language-Team: Ukrainian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:04+0000\n" +"Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:58+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-slicedfavorites\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " diff --git a/plugins/SphinxSearch/locale/SphinxSearch.pot b/plugins/SphinxSearch/locale/SphinxSearch.pot index 1db4ef417d..346eee59d6 100644 --- a/plugins/SphinxSearch/locale/SphinxSearch.pot +++ b/plugins/SphinxSearch/locale/SphinxSearch.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" #. TRANS: Server exception thrown when a database name cannot be identified. -#: sphinxsearch.php:126 +#: sphinxsearch.php:129 msgid "Sphinx search could not identify database name." msgstr "" diff --git a/plugins/SphinxSearch/locale/de/LC_MESSAGES/SphinxSearch.po b/plugins/SphinxSearch/locale/de/LC_MESSAGES/SphinxSearch.po index 39d0a81c84..b0cd57c216 100644 --- a/plugins/SphinxSearch/locale/de/LC_MESSAGES/SphinxSearch.po +++ b/plugins/SphinxSearch/locale/de/LC_MESSAGES/SphinxSearch.po @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SphinxSearch\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:23+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:04+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:58+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:37+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-sphinxsearch\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/plugins/SphinxSearch/locale/es/LC_MESSAGES/SphinxSearch.po b/plugins/SphinxSearch/locale/es/LC_MESSAGES/SphinxSearch.po new file mode 100644 index 0000000000..7301906379 --- /dev/null +++ b/plugins/SphinxSearch/locale/es/LC_MESSAGES/SphinxSearch.po @@ -0,0 +1,31 @@ +# Translation of StatusNet - SphinxSearch to Spanish (español) +# Exported from translatewiki.net +# +# Author: Armando-Martin +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - SphinxSearch\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:04+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:51:37+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Server exception thrown when a database name cannot be identified. +msgid "Sphinx search could not identify database name." +msgstr "La búsqueda Sphinx nn pudo identificar el nombre de la base de datos." + +#. TRANS: Server exception. +msgid "Sphinx PHP extension must be installed." +msgstr "La extensión PHP Sphinx debe ser instalada." + +#. TRANS: Plugin description. +msgid "Plugin for Sphinx search backend." +msgstr "Complemento (plugin) para el motor de búsquedas Sphinx." diff --git a/plugins/SphinxSearch/locale/fr/LC_MESSAGES/SphinxSearch.po b/plugins/SphinxSearch/locale/fr/LC_MESSAGES/SphinxSearch.po index 483547f24e..89854bb5bd 100644 --- a/plugins/SphinxSearch/locale/fr/LC_MESSAGES/SphinxSearch.po +++ b/plugins/SphinxSearch/locale/fr/LC_MESSAGES/SphinxSearch.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SphinxSearch to French (Français) +# Translation of StatusNet - SphinxSearch to French (français) # Exported from translatewiki.net # # Author: Peter17 @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SphinxSearch\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:23+0000\n" -"Language-Team: French \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:04+0000\n" +"Language-Team: French \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:58+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:37+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-sphinxsearch\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" diff --git a/plugins/SphinxSearch/locale/gl/LC_MESSAGES/SphinxSearch.po b/plugins/SphinxSearch/locale/gl/LC_MESSAGES/SphinxSearch.po new file mode 100644 index 0000000000..25e93d9961 --- /dev/null +++ b/plugins/SphinxSearch/locale/gl/LC_MESSAGES/SphinxSearch.po @@ -0,0 +1,34 @@ +# Translation of StatusNet - SphinxSearch to Galician (galego) +# Exported from translatewiki.net +# +# Author: Toliño +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - SphinxSearch\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:05+0000\n" +"Language-Team: Galician \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:51:37+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: gl\n" +"X-Message-Group: #out-statusnet-plugin-sphinxsearch\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Server exception thrown when a database name cannot be identified. +msgid "Sphinx search could not identify database name." +msgstr "A procura Sphinx non puido identificar o nome da base de datos." + +#. TRANS: Server exception. +msgid "Sphinx PHP extension must be installed." +msgstr "Cómpre que a extensión PHP Sphinx estea instalada." + +#. TRANS: Plugin description. +msgid "Plugin for Sphinx search backend." +msgstr "Complemento para o motor de procuras Sphinx." diff --git a/plugins/SphinxSearch/locale/ia/LC_MESSAGES/SphinxSearch.po b/plugins/SphinxSearch/locale/ia/LC_MESSAGES/SphinxSearch.po index 469f43050e..b559581dbb 100644 --- a/plugins/SphinxSearch/locale/ia/LC_MESSAGES/SphinxSearch.po +++ b/plugins/SphinxSearch/locale/ia/LC_MESSAGES/SphinxSearch.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SphinxSearch to Interlingua (Interlingua) +# Translation of StatusNet - SphinxSearch to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SphinxSearch\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:23+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:05+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:58+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:37+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-sphinxsearch\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/plugins/SphinxSearch/locale/mk/LC_MESSAGES/SphinxSearch.po b/plugins/SphinxSearch/locale/mk/LC_MESSAGES/SphinxSearch.po index 03f03e3b69..a2192867a1 100644 --- a/plugins/SphinxSearch/locale/mk/LC_MESSAGES/SphinxSearch.po +++ b/plugins/SphinxSearch/locale/mk/LC_MESSAGES/SphinxSearch.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SphinxSearch to Macedonian (МакедонÑки) +# Translation of StatusNet - SphinxSearch to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SphinxSearch\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:24+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:05+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:58+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:37+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-sphinxsearch\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" diff --git a/plugins/SphinxSearch/locale/nl/LC_MESSAGES/SphinxSearch.po b/plugins/SphinxSearch/locale/nl/LC_MESSAGES/SphinxSearch.po index dc258a20f6..c6c7a98fed 100644 --- a/plugins/SphinxSearch/locale/nl/LC_MESSAGES/SphinxSearch.po +++ b/plugins/SphinxSearch/locale/nl/LC_MESSAGES/SphinxSearch.po @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SphinxSearch\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:24+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:05+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:58+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:37+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-sphinxsearch\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/plugins/SphinxSearch/locale/ru/LC_MESSAGES/SphinxSearch.po b/plugins/SphinxSearch/locale/ru/LC_MESSAGES/SphinxSearch.po index e827080460..593b00fe0c 100644 --- a/plugins/SphinxSearch/locale/ru/LC_MESSAGES/SphinxSearch.po +++ b/plugins/SphinxSearch/locale/ru/LC_MESSAGES/SphinxSearch.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SphinxSearch to Russian (РуÑÑкий) +# Translation of StatusNet - SphinxSearch to Russian (руÑÑкий) # Exported from translatewiki.net # # Author: MaxSem @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SphinxSearch\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:24+0000\n" -"Language-Team: Russian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:05+0000\n" +"Language-Team: Russian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:58+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:37+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ru\n" "X-Message-Group: #out-statusnet-plugin-sphinxsearch\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " diff --git a/plugins/SphinxSearch/locale/tl/LC_MESSAGES/SphinxSearch.po b/plugins/SphinxSearch/locale/tl/LC_MESSAGES/SphinxSearch.po index b980b88ba4..b635462b1b 100644 --- a/plugins/SphinxSearch/locale/tl/LC_MESSAGES/SphinxSearch.po +++ b/plugins/SphinxSearch/locale/tl/LC_MESSAGES/SphinxSearch.po @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SphinxSearch\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:24+0000\n" -"Language-Team: Tagalog \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:05+0000\n" +"Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:58+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:37+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-sphinxsearch\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/plugins/SphinxSearch/locale/uk/LC_MESSAGES/SphinxSearch.po b/plugins/SphinxSearch/locale/uk/LC_MESSAGES/SphinxSearch.po index 5d869a1063..6c9e3c840c 100644 --- a/plugins/SphinxSearch/locale/uk/LC_MESSAGES/SphinxSearch.po +++ b/plugins/SphinxSearch/locale/uk/LC_MESSAGES/SphinxSearch.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SphinxSearch to Ukrainian (УкраїнÑька) +# Translation of StatusNet - SphinxSearch to Ukrainian (українÑька) # Exported from translatewiki.net # # Author: Boogie @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SphinxSearch\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:24+0000\n" -"Language-Team: Ukrainian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:05+0000\n" +"Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:09:58+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:37+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-sphinxsearch\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " diff --git a/plugins/SphinxSearch/sphinxsearch.php b/plugins/SphinxSearch/sphinxsearch.php index 46b5e3e28a..607ac76d27 100644 --- a/plugins/SphinxSearch/sphinxsearch.php +++ b/plugins/SphinxSearch/sphinxsearch.php @@ -65,6 +65,9 @@ class SphinxSearch extends SearchEngine function query($q) { $result = $this->sphinx->query($q, $this->remote_table()); + if ($result === false) { + throw new ServerException($this->sphinx->getLastError()); + } if (!isset($result['matches'])) return false; $id_set = join(', ', array_keys($result['matches'])); $this->target->whereAdd("id in ($id_set)"); diff --git a/plugins/Spotify/SpotifyPlugin.php b/plugins/Spotify/SpotifyPlugin.php index e7a5a53826..6d4e645629 100644 --- a/plugins/Spotify/SpotifyPlugin.php +++ b/plugins/Spotify/SpotifyPlugin.php @@ -1,7 +1,7 @@ 'Spotify', + 'version' => SPOTIFYPLUGIN_VERSION, + 'author' => 'Nick Holliday', + 'homepage' => 'http://status.net/wiki/Plugin:Spotify', + 'rawdescription' => + // TRANS: Plugin description. + _m('Create pretty Spotify URLs.')); + + return true; + } } +// @todo FIXME: This probably should not be global functions. function doSpotifyLookup($uri, $isArtist) { $request = HTTPClient::start(); diff --git a/plugins/Spotify/locale/Spotify.pot b/plugins/Spotify/locale/Spotify.pot new file mode 100644 index 0000000000..067d910d5a --- /dev/null +++ b/plugins/Spotify/locale/Spotify.pot @@ -0,0 +1,22 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#. TRANS: Plugin description. +#: SpotifyPlugin.php:84 +msgid "Create pretty Spotify URLs." +msgstr "" diff --git a/plugins/Spotify/locale/de/LC_MESSAGES/Spotify.po b/plugins/Spotify/locale/de/LC_MESSAGES/Spotify.po new file mode 100644 index 0000000000..3db27433fd --- /dev/null +++ b/plugins/Spotify/locale/de/LC_MESSAGES/Spotify.po @@ -0,0 +1,26 @@ +# Translation of StatusNet - Spotify to German (Deutsch) +# Exported from translatewiki.net +# +# Author: ChrisiPK +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Spotify\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:06+0000\n" +"Language-Team: German \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-19 11:23:27+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: de\n" +"X-Message-Group: #out-statusnet-plugin-spotify\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin description. +msgid "Create pretty Spotify URLs." +msgstr "Schöne Spotify-URLs erstellen." diff --git a/plugins/Spotify/locale/es/LC_MESSAGES/Spotify.po b/plugins/Spotify/locale/es/LC_MESSAGES/Spotify.po new file mode 100644 index 0000000000..b57a11f2dd --- /dev/null +++ b/plugins/Spotify/locale/es/LC_MESSAGES/Spotify.po @@ -0,0 +1,24 @@ +# Translation of StatusNet - Spotify to Spanish (español) +# Exported from translatewiki.net +# +# Author: Armando-Martin +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Spotify\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:06+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-19 11:23:27+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin description. +msgid "Create pretty Spotify URLs." +msgstr "" +"Crear direcciones URL para Spotify." diff --git a/plugins/Spotify/locale/fr/LC_MESSAGES/Spotify.po b/plugins/Spotify/locale/fr/LC_MESSAGES/Spotify.po new file mode 100644 index 0000000000..52f3ad52ec --- /dev/null +++ b/plugins/Spotify/locale/fr/LC_MESSAGES/Spotify.po @@ -0,0 +1,23 @@ +# Translation of StatusNet - Spotify to French (français) +# Exported from translatewiki.net +# +# Author: Gomoko +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Spotify\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:06+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-19 11:23:27+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. TRANS: Plugin description. +msgid "Create pretty Spotify URLs." +msgstr "Créer de jolies URLs Spotify." diff --git a/plugins/Spotify/locale/gl/LC_MESSAGES/Spotify.po b/plugins/Spotify/locale/gl/LC_MESSAGES/Spotify.po new file mode 100644 index 0000000000..d9337709c0 --- /dev/null +++ b/plugins/Spotify/locale/gl/LC_MESSAGES/Spotify.po @@ -0,0 +1,27 @@ +# Translation of StatusNet - Spotify to Galician (galego) +# Exported from translatewiki.net +# +# Author: Toliño +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Spotify\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:06+0000\n" +"Language-Team: Galician \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-19 11:23:27+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: gl\n" +"X-Message-Group: #out-statusnet-plugin-spotify\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin description. +msgid "Create pretty Spotify URLs." +msgstr "" +"Crear enderezos URL para Spotify." diff --git a/plugins/Spotify/locale/he/LC_MESSAGES/Spotify.po b/plugins/Spotify/locale/he/LC_MESSAGES/Spotify.po new file mode 100644 index 0000000000..28f1678eda --- /dev/null +++ b/plugins/Spotify/locale/he/LC_MESSAGES/Spotify.po @@ -0,0 +1,26 @@ +# Translation of StatusNet - Spotify to Hebrew (עברית) +# Exported from translatewiki.net +# +# Author: Amire80 +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Spotify\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:06+0000\n" +"Language-Team: Hebrew \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-19 11:23:27+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: he\n" +"X-Message-Group: #out-statusnet-plugin-spotify\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin description. +msgid "Create pretty Spotify URLs." +msgstr "יצירת כתובות יפות ל־Spotify." diff --git a/plugins/Spotify/locale/ia/LC_MESSAGES/Spotify.po b/plugins/Spotify/locale/ia/LC_MESSAGES/Spotify.po new file mode 100644 index 0000000000..3185173912 --- /dev/null +++ b/plugins/Spotify/locale/ia/LC_MESSAGES/Spotify.po @@ -0,0 +1,26 @@ +# Translation of StatusNet - Spotify to Interlingua (interlingua) +# Exported from translatewiki.net +# +# Author: McDutchie +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Spotify\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:06+0000\n" +"Language-Team: Interlingua \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-19 11:23:27+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: ia\n" +"X-Message-Group: #out-statusnet-plugin-spotify\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin description. +msgid "Create pretty Spotify URLs." +msgstr "Crear belle URLs de Spotify." diff --git a/plugins/Spotify/locale/mk/LC_MESSAGES/Spotify.po b/plugins/Spotify/locale/mk/LC_MESSAGES/Spotify.po new file mode 100644 index 0000000000..b1c86f17d6 --- /dev/null +++ b/plugins/Spotify/locale/mk/LC_MESSAGES/Spotify.po @@ -0,0 +1,28 @@ +# Translation of StatusNet - Spotify to Macedonian (македонÑки) +# Exported from translatewiki.net +# +# Author: Bjankuloski06 +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Spotify\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:06+0000\n" +"Language-Team: Macedonian \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-19 11:23:27+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: mk\n" +"X-Message-Group: #out-statusnet-plugin-spotify\n" +"Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" + +#. TRANS: Plugin description. +msgid "Create pretty Spotify URLs." +msgstr "" +"Правете интереÑни и убави URL-адреÑи Ñо Spotify." diff --git a/plugins/Spotify/locale/nl/LC_MESSAGES/Spotify.po b/plugins/Spotify/locale/nl/LC_MESSAGES/Spotify.po new file mode 100644 index 0000000000..be97552c5f --- /dev/null +++ b/plugins/Spotify/locale/nl/LC_MESSAGES/Spotify.po @@ -0,0 +1,26 @@ +# Translation of StatusNet - Spotify to Dutch (Nederlands) +# Exported from translatewiki.net +# +# Author: Siebrand +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Spotify\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:07+0000\n" +"Language-Team: Dutch \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-19 11:23:27+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: nl\n" +"X-Message-Group: #out-statusnet-plugin-spotify\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin description. +msgid "Create pretty Spotify URLs." +msgstr "Maak mooie Spotify-URL's." diff --git a/plugins/Spotify/locale/sv/LC_MESSAGES/Spotify.po b/plugins/Spotify/locale/sv/LC_MESSAGES/Spotify.po new file mode 100644 index 0000000000..fa3b155b89 --- /dev/null +++ b/plugins/Spotify/locale/sv/LC_MESSAGES/Spotify.po @@ -0,0 +1,27 @@ +# Translation of StatusNet - Spotify to Swedish (svenska) +# Exported from translatewiki.net +# +# Author: WikiPhoenix +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Spotify\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:07+0000\n" +"Language-Team: Swedish \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-19 11:23:27+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: sv\n" +"X-Message-Group: #out-statusnet-plugin-spotify\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin description. +msgid "Create pretty Spotify URLs." +msgstr "" +"Skapa vackra Spotify-webbadresser." diff --git a/plugins/Spotify/locale/tl/LC_MESSAGES/Spotify.po b/plugins/Spotify/locale/tl/LC_MESSAGES/Spotify.po new file mode 100644 index 0000000000..64c13c1fe4 --- /dev/null +++ b/plugins/Spotify/locale/tl/LC_MESSAGES/Spotify.po @@ -0,0 +1,25 @@ +# Translation of StatusNet - Spotify to Tagalog (Tagalog) +# Exported from translatewiki.net +# +# Author: AnakngAraw +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Spotify\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:07+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-19 11:23:27+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin description. +msgid "Create pretty Spotify URLs." +msgstr "" +"Lumikha ng marilag na mga URL ng Spotify." diff --git a/plugins/StrictTransportSecurity/StrictTransportSecurityPlugin.php b/plugins/StrictTransportSecurity/StrictTransportSecurityPlugin.php index 004a627929..d4376b8ab9 100644 --- a/plugins/StrictTransportSecurity/StrictTransportSecurityPlugin.php +++ b/plugins/StrictTransportSecurity/StrictTransportSecurityPlugin.php @@ -56,6 +56,7 @@ class StrictTransportSecurityPlugin extends Plugin 'author' => 'Craig Andrews', 'homepage' => 'http://status.net/wiki/Plugin:StrictTransportSecurity', 'rawdescription' => + // TRANS: Plugin description. _m('The Strict Transport Security plugin implements the Strict Transport Security header, improving the security of HTTPS only sites.')); return true; } diff --git a/plugins/StrictTransportSecurity/locale/StrictTransportSecurity.pot b/plugins/StrictTransportSecurity/locale/StrictTransportSecurity.pot index 841336bc6c..6b3559ec63 100644 --- a/plugins/StrictTransportSecurity/locale/StrictTransportSecurity.pot +++ b/plugins/StrictTransportSecurity/locale/StrictTransportSecurity.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,7 +16,8 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: StrictTransportSecurityPlugin.php:59 +#. TRANS: Plugin description. +#: StrictTransportSecurityPlugin.php:60 msgid "" "The Strict Transport Security plugin implements the Strict Transport " "Security header, improving the security of HTTPS only sites." diff --git a/plugins/StrictTransportSecurity/locale/de/LC_MESSAGES/StrictTransportSecurity.po b/plugins/StrictTransportSecurity/locale/de/LC_MESSAGES/StrictTransportSecurity.po index 54df3bffd8..90a9443ccc 100644 --- a/plugins/StrictTransportSecurity/locale/de/LC_MESSAGES/StrictTransportSecurity.po +++ b/plugins/StrictTransportSecurity/locale/de/LC_MESSAGES/StrictTransportSecurity.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - StrictTransportSecurity\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:27+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:10+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:21+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:41+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-stricttransportsecurity\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "The Strict Transport Security plugin implements the Strict Transport " "Security header, improving the security of HTTPS only sites." diff --git a/plugins/StrictTransportSecurity/locale/es/LC_MESSAGES/StrictTransportSecurity.po b/plugins/StrictTransportSecurity/locale/es/LC_MESSAGES/StrictTransportSecurity.po new file mode 100644 index 0000000000..ecb02b40e1 --- /dev/null +++ b/plugins/StrictTransportSecurity/locale/es/LC_MESSAGES/StrictTransportSecurity.po @@ -0,0 +1,28 @@ +# Translation of StatusNet - StrictTransportSecurity to Spanish (español) +# Exported from translatewiki.net +# +# Author: Armando-Martin +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - StrictTransportSecurity\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:10+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:51:41+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin description. +msgid "" +"The Strict Transport Security plugin implements the Strict Transport " +"Security header, improving the security of HTTPS only sites." +msgstr "" +"El complemento (plugin) Strict Transport Security implementa la cabecera " +"Strict Transport Security, que mejora la seguridad de los sitios disponibles " +"unicamente en HTTPS." diff --git a/plugins/StrictTransportSecurity/locale/fr/LC_MESSAGES/StrictTransportSecurity.po b/plugins/StrictTransportSecurity/locale/fr/LC_MESSAGES/StrictTransportSecurity.po index 48b3f9b6c1..ae52d58df2 100644 --- a/plugins/StrictTransportSecurity/locale/fr/LC_MESSAGES/StrictTransportSecurity.po +++ b/plugins/StrictTransportSecurity/locale/fr/LC_MESSAGES/StrictTransportSecurity.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - StrictTransportSecurity to French (Français) +# Translation of StatusNet - StrictTransportSecurity to French (français) # Exported from translatewiki.net # # Author: Brunoperel @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - StrictTransportSecurity\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:27+0000\n" -"Language-Team: French \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:10+0000\n" +"Language-Team: French \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:21+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:41+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-stricttransportsecurity\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Plugin description. msgid "" "The Strict Transport Security plugin implements the Strict Transport " "Security header, improving the security of HTTPS only sites." diff --git a/plugins/StrictTransportSecurity/locale/gl/LC_MESSAGES/StrictTransportSecurity.po b/plugins/StrictTransportSecurity/locale/gl/LC_MESSAGES/StrictTransportSecurity.po new file mode 100644 index 0000000000..2ce758e78b --- /dev/null +++ b/plugins/StrictTransportSecurity/locale/gl/LC_MESSAGES/StrictTransportSecurity.po @@ -0,0 +1,30 @@ +# Translation of StatusNet - StrictTransportSecurity to Galician (galego) +# Exported from translatewiki.net +# +# Author: Toliño +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - StrictTransportSecurity\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:10+0000\n" +"Language-Team: Galician \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:51:41+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: gl\n" +"X-Message-Group: #out-statusnet-plugin-stricttransportsecurity\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin description. +msgid "" +"The Strict Transport Security plugin implements the Strict Transport " +"Security header, improving the security of HTTPS only sites." +msgstr "" +"O complemento Strict Transport Security inclúe a cabeceira Strict Transport " +"Security, mellorando a seguridade dos sitios dispoñibles unicamente en HTTPS." diff --git a/plugins/StrictTransportSecurity/locale/he/LC_MESSAGES/StrictTransportSecurity.po b/plugins/StrictTransportSecurity/locale/he/LC_MESSAGES/StrictTransportSecurity.po new file mode 100644 index 0000000000..22833b951e --- /dev/null +++ b/plugins/StrictTransportSecurity/locale/he/LC_MESSAGES/StrictTransportSecurity.po @@ -0,0 +1,30 @@ +# Translation of StatusNet - StrictTransportSecurity to Hebrew (עברית) +# Exported from translatewiki.net +# +# Author: Amire80 +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - StrictTransportSecurity\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:10+0000\n" +"Language-Team: Hebrew \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:51:41+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: he\n" +"X-Message-Group: #out-statusnet-plugin-stricttransportsecurity\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin description. +msgid "" +"The Strict Transport Security plugin implements the Strict Transport " +"Security header, improving the security of HTTPS only sites." +msgstr "" +"תוסף ×בטחת תעבורה הדוקה ×ž×™×™×©× ×ת הכותרת ×בטחת תעבורה הדוקה (Strict Transport " +"Security), שמשפת ×ת ×”×בטחה ב××ª×¨×™× ×©×¤×•×¢×œ×™× ×¨×§ ב־HTTPS." diff --git a/plugins/StrictTransportSecurity/locale/ia/LC_MESSAGES/StrictTransportSecurity.po b/plugins/StrictTransportSecurity/locale/ia/LC_MESSAGES/StrictTransportSecurity.po index a0feb79763..d0212f2118 100644 --- a/plugins/StrictTransportSecurity/locale/ia/LC_MESSAGES/StrictTransportSecurity.po +++ b/plugins/StrictTransportSecurity/locale/ia/LC_MESSAGES/StrictTransportSecurity.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - StrictTransportSecurity to Interlingua (Interlingua) +# Translation of StatusNet - StrictTransportSecurity to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - StrictTransportSecurity\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:27+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:10+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:21+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:41+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-stricttransportsecurity\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "The Strict Transport Security plugin implements the Strict Transport " "Security header, improving the security of HTTPS only sites." diff --git a/plugins/StrictTransportSecurity/locale/mk/LC_MESSAGES/StrictTransportSecurity.po b/plugins/StrictTransportSecurity/locale/mk/LC_MESSAGES/StrictTransportSecurity.po index e9f67df98f..c3d4a7951f 100644 --- a/plugins/StrictTransportSecurity/locale/mk/LC_MESSAGES/StrictTransportSecurity.po +++ b/plugins/StrictTransportSecurity/locale/mk/LC_MESSAGES/StrictTransportSecurity.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - StrictTransportSecurity to Macedonian (МакедонÑки) +# Translation of StatusNet - StrictTransportSecurity to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - StrictTransportSecurity\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:27+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:10+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:21+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:41+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-stricttransportsecurity\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" +#. TRANS: Plugin description. msgid "" "The Strict Transport Security plugin implements the Strict Transport " "Security header, improving the security of HTTPS only sites." diff --git a/plugins/StrictTransportSecurity/locale/nl/LC_MESSAGES/StrictTransportSecurity.po b/plugins/StrictTransportSecurity/locale/nl/LC_MESSAGES/StrictTransportSecurity.po index 997936c3eb..8b5e3e36fb 100644 --- a/plugins/StrictTransportSecurity/locale/nl/LC_MESSAGES/StrictTransportSecurity.po +++ b/plugins/StrictTransportSecurity/locale/nl/LC_MESSAGES/StrictTransportSecurity.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - StrictTransportSecurity\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:27+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:10+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:21+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:41+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-stricttransportsecurity\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "The Strict Transport Security plugin implements the Strict Transport " "Security header, improving the security of HTTPS only sites." diff --git a/plugins/StrictTransportSecurity/locale/ru/LC_MESSAGES/StrictTransportSecurity.po b/plugins/StrictTransportSecurity/locale/ru/LC_MESSAGES/StrictTransportSecurity.po index 8184bd47e6..fb758025fd 100644 --- a/plugins/StrictTransportSecurity/locale/ru/LC_MESSAGES/StrictTransportSecurity.po +++ b/plugins/StrictTransportSecurity/locale/ru/LC_MESSAGES/StrictTransportSecurity.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - StrictTransportSecurity to Russian (РуÑÑкий) +# Translation of StatusNet - StrictTransportSecurity to Russian (руÑÑкий) # Exported from translatewiki.net # # Author: ÐлекÑандр Сигачёв @@ -9,19 +9,20 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - StrictTransportSecurity\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:27+0000\n" -"Language-Team: Russian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:11+0000\n" +"Language-Team: Russian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:21+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:41+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ru\n" "X-Message-Group: #out-statusnet-plugin-stricttransportsecurity\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Plugin description. msgid "" "The Strict Transport Security plugin implements the Strict Transport " "Security header, improving the security of HTTPS only sites." diff --git a/plugins/StrictTransportSecurity/locale/tl/LC_MESSAGES/StrictTransportSecurity.po b/plugins/StrictTransportSecurity/locale/tl/LC_MESSAGES/StrictTransportSecurity.po index 195dbc1a5a..f61be0f287 100644 --- a/plugins/StrictTransportSecurity/locale/tl/LC_MESSAGES/StrictTransportSecurity.po +++ b/plugins/StrictTransportSecurity/locale/tl/LC_MESSAGES/StrictTransportSecurity.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - StrictTransportSecurity\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:27+0000\n" -"Language-Team: Tagalog \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:11+0000\n" +"Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:21+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:41+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-stricttransportsecurity\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "The Strict Transport Security plugin implements the Strict Transport " "Security header, improving the security of HTTPS only sites." diff --git a/plugins/StrictTransportSecurity/locale/uk/LC_MESSAGES/StrictTransportSecurity.po b/plugins/StrictTransportSecurity/locale/uk/LC_MESSAGES/StrictTransportSecurity.po index 02acaa3cf7..bcae6000e4 100644 --- a/plugins/StrictTransportSecurity/locale/uk/LC_MESSAGES/StrictTransportSecurity.po +++ b/plugins/StrictTransportSecurity/locale/uk/LC_MESSAGES/StrictTransportSecurity.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - StrictTransportSecurity to Ukrainian (УкраїнÑька) +# Translation of StatusNet - StrictTransportSecurity to Ukrainian (українÑька) # Exported from translatewiki.net # # Author: Boogie @@ -9,19 +9,20 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - StrictTransportSecurity\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:27+0000\n" -"Language-Team: Ukrainian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:11+0000\n" +"Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:21+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:51:41+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-stricttransportsecurity\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Plugin description. msgid "" "The Strict Transport Security plugin implements the Strict Transport " "Security header, improving the security of HTTPS only sites." diff --git a/plugins/SubMirror/SubMirrorPlugin.php b/plugins/SubMirror/SubMirrorPlugin.php index a9cb2315b4..427153ab22 100644 --- a/plugins/SubMirror/SubMirrorPlugin.php +++ b/plugins/SubMirror/SubMirrorPlugin.php @@ -90,6 +90,7 @@ class SubMirrorPlugin extends Plugin 'author' => 'Brion Vibber', 'homepage' => 'http://status.net/wiki/Plugin:SubMirror', 'rawdescription' => + // TRANS: Plugin description. _m('Pull feeds into your timeline!')); return true; @@ -98,16 +99,16 @@ class SubMirrorPlugin extends Plugin /** * Menu item for personal subscriptions/groups area * - * @param Widget $widget Widget being executed + * @param Action $action action being executed * * @return boolean hook return */ - - function onEndSubGroupNav($widget) + function onEndAccountSettingsNav($action) { - $action = $widget->out; $action_name = $action->trimmed('action'); + common_debug("ACTION NAME = " . $action_name); + $action->menuItem(common_local_url('mirrorsettings'), // TRANS: SubMirror plugin menu item on user settings page. _m('MENU', 'Mirroring'), @@ -156,6 +157,10 @@ class SubMirrorPlugin extends Plugin */ function onOstatus_profileSubscriberCount($oprofile, &$count) { + if (empty($oprofile) || !($oprofile instanceof Ostatus_profile)) { + return true; + } + if ($oprofile->profile_id) { $mirror = new SubMirror(); $mirror->subscribed = $oprofile->profile_id; @@ -165,6 +170,7 @@ class SubMirrorPlugin extends Plugin } } } + return true; } @@ -183,6 +189,7 @@ class SubMirrorPlugin extends Plugin $mirror->subscriber = $profile->id; $entry = array( 'id' => 'mirrors', + // TRANS: Label in profile statistics section, followed by a count. 'label' => _m('Mirrored feeds'), 'link' => common_local_url('mirrorsettings'), 'value' => $mirror->count(), diff --git a/plugins/SubMirror/actions/addmirror.php b/plugins/SubMirror/actions/addmirror.php index 31805c1669..0031cf1bf4 100644 --- a/plugins/SubMirror/actions/addmirror.php +++ b/plugins/SubMirror/actions/addmirror.php @@ -76,7 +76,8 @@ class AddMirrorAction extends BaseMirrorAction $base = 'http://api.twitter.com/1/statuses/user_timeline.atom?screen_name='; return $base . urlencode($screenie); default: - throw new Exception('Internal form error: unrecognized feed provider.'); + // TRANS: Exception thrown when a feed provider could not be recognised. + throw new Exception(_m('Internal form error: Unrecognized feed provider.')); } } @@ -85,7 +86,8 @@ class AddMirrorAction extends BaseMirrorAction if ($this->oprofile->subscribe()) { SubMirror::saveMirror($this->user, $this->profile); } else { - $this->serverError(_m("Could not subscribe to feed.")); + // TRANS: Exception thrown when a subscribing to a feed fails. + $this->serverError(_m('Could not subscribe to feed.')); } } } diff --git a/plugins/SubMirror/actions/basemirror.php b/plugins/SubMirror/actions/basemirror.php index 9a01e2ddb7..e3b67bb1d6 100644 --- a/plugins/SubMirror/actions/basemirror.php +++ b/plugins/SubMirror/actions/basemirror.php @@ -101,9 +101,10 @@ abstract class BaseMirrorAction extends Action $oprofile = Ostatus_profile::ensureFeedURL($url); } if ($oprofile->isGroup()) { - $this->clientError(_m("Cannot mirror a StatusNet group at this time.")); + // TRANS: Client error displayed when trying to mirror a StatusNet group feed. + $this->clientError(_m('Cannot mirror a StatusNet group at this time.')); } - $this->oprofile = $oprofile; // @fixme ugly side effect :D + $this->oprofile = $oprofile; // @todo FIXME: ugly side effect :D return $oprofile->localProfile(); } @@ -115,6 +116,7 @@ abstract class BaseMirrorAction extends Action { // Only allow POST requests if ($_SERVER['REQUEST_METHOD'] != 'POST') { + // TRANS: Client error displayed when trying to use another method than POST. $this->clientError(_m('This action only accepts POST requests.')); return false; } @@ -123,6 +125,7 @@ abstract class BaseMirrorAction extends Action $token = $this->trimmed('token'); if (!$token || $token != common_session_token()) { + // TRANS: Client error displayed when the session token does not match or is not given. $this->clientError(_m('There was a problem with your session token.'. ' Try again, please.')); return false; @@ -157,6 +160,7 @@ abstract class BaseMirrorAction extends Action if ($this->boolean('ajax')) { $this->startHTML('text/xml;charset=utf-8'); $this->elementStart('head'); + // TRANS: Page title for subscribed feed mirror. $this->element('title', null, _m('Subscribed')); $this->elementEnd('head'); $this->elementStart('body'); diff --git a/plugins/SubMirror/actions/editmirror.php b/plugins/SubMirror/actions/editmirror.php index 0f8b037325..557eb0aba4 100644 --- a/plugins/SubMirror/actions/editmirror.php +++ b/plugins/SubMirror/actions/editmirror.php @@ -47,7 +47,6 @@ if (!defined('STATUSNET')) { */ class EditMirrorAction extends BaseMirrorAction { - /** * Check pre-requisites and instantiate attributes * @@ -65,7 +64,8 @@ class EditMirrorAction extends BaseMirrorAction 'subscribed' => $this->profile->id)); if (!$this->mirror) { - $this->clientError(_m("Requested invalid profile to edit.")); + // TRANS: Client error displayed when trying to edit an object that is not a feed mirror. + $this->clientError(_m('Requested invalid profile to edit.')); } $this->style = $this->validateStyle($this->trimmed('style')); @@ -83,7 +83,8 @@ class EditMirrorAction extends BaseMirrorAction if (in_array($style, $allowed)) { return $style; } else { - $this->clientError(_m("Bad form data.")); + // TRANS: Client error displayed when providing invalid input when editing a mirror. + $this->clientError(_m('Bad form data.')); } } @@ -92,7 +93,7 @@ class EditMirrorAction extends BaseMirrorAction $mirror = SubMirror::getMirror($this->user, $this->profile); if (!$mirror) { // TRANS: Client error thrown when a mirror request is made and no result is retrieved. - $this->clientError(_m('Requested edit of missing mirror.')); + $this->clientError(_m('The mirror request failed, because no result was retrieved.')); } if ($this->delete) { diff --git a/plugins/SubMirror/actions/mirrorsettings.php b/plugins/SubMirror/actions/mirrorsettings.php index d6e1ed5d1b..000d7ecad0 100644 --- a/plugins/SubMirror/actions/mirrorsettings.php +++ b/plugins/SubMirror/actions/mirrorsettings.php @@ -38,7 +38,7 @@ class MirrorSettingsAction extends SettingsAction */ function title() { - // TRANS: Title. + // TRANS: Page title. return _m('Feed mirror settings'); } @@ -50,7 +50,7 @@ class MirrorSettingsAction extends SettingsAction function getInstructions() { - // TRANS: Instructions. + // TRANS: Page instructions. return _m('You can mirror updates from many RSS and Atom feeds ' . 'into your StatusNet timeline!'); } @@ -129,6 +129,7 @@ class MirrorSettingsAction extends SettingsAction header('Content-Type: text/html;charset=utf-8'); $this->elementStart('html'); $this->elementStart('head'); + // TRANS: Title for page with form to add a mirror feed provider on. $this->element('title', null, _m('Provider add')); $this->elementEnd('head'); $this->elementStart('body'); @@ -152,10 +153,17 @@ class MirrorSettingsAction extends SettingsAction { } + /** + * Show the local navigation menu + * + * This is the same for all settings, so we show it here. + * + * @return void + */ function showLocalNav() { - $nav = new SubGroupNav($this, common_current_user()); - $nav->show(); + $menu = new SettingsNav($this); + $menu->show(); } function showScripts() diff --git a/plugins/SubMirror/classes/SubMirror.php b/plugins/SubMirror/classes/SubMirror.php index b39af918d5..b36677e58a 100644 --- a/plugins/SubMirror/classes/SubMirror.php +++ b/plugins/SubMirror/classes/SubMirror.php @@ -117,7 +117,7 @@ class SubMirror extends Memcached_DataObject function keyTypes() { - // @fixme keys + // @todo FIXME keys // need a sane key for reverse lookup too return array('subscriber' => 'K', 'subscribed' => 'K'); } @@ -157,7 +157,7 @@ class SubMirror extends Memcached_DataObject { $profile = Profile::staticGet('id', $this->subscriber); if (!$profile) { - common_log(LOG_ERROR, "SubMirror plugin skipping auto-repeat of notice $notice->id for missing user $profile->id"); + common_log(LOG_ERR, "SubMirror plugin skipping auto-repeat of notice $notice->id for missing user $profile->id"); return false; } diff --git a/plugins/SubMirror/lib/addmirrorform.php b/plugins/SubMirror/lib/addmirrorform.php index 17edbd5e96..949b716dea 100644 --- a/plugins/SubMirror/lib/addmirrorform.php +++ b/plugins/SubMirror/lib/addmirrorform.php @@ -57,11 +57,13 @@ class AddMirrorForm extends Form $this->li(); $this->doInput('addmirror-feedurl', 'feedurl', + // TRANS: Field label. _m('Web page or feed URL:'), $this->out->trimmed('feedurl')); $this->unli(); $this->li(); + // TRANS: Button text for adding a feed. $this->out->submit('addmirror-save', _m('BUTTON','Add feed')); $this->unli(); $this->out->elementEnd('ul'); diff --git a/plugins/SubMirror/lib/addmirrorwizard.php b/plugins/SubMirror/lib/addmirrorwizard.php index 920db0bc9c..512b2bfa4a 100644 --- a/plugins/SubMirror/lib/addmirrorwizard.php +++ b/plugins/SubMirror/lib/addmirrorwizard.php @@ -73,6 +73,7 @@ class AddMirrorWizard extends Widget // hopes, is getting timely updates. array( 'id' => 'twitter', + // TRANS: Name for possible feed provider. 'name' => _m('Twitter'), ), /* @@ -106,6 +107,7 @@ class AddMirrorWizard extends Widget */ array( 'id' => 'feed', + // TRANS: Name for possible feed provider. 'name' => _m('RSS or Atom feed'), ), ); @@ -116,6 +118,7 @@ class AddMirrorWizard extends Widget $out = $this->out; $out->elementStart('div', 'provider-list'); + // TRANS: Heading for feed mirroring selection form. $out->element('h2', null, _m('Select a feed provider')); $out->elementStart('table'); foreach ($providers as $provider) { diff --git a/plugins/SubMirror/lib/addtwittermirrorform.php b/plugins/SubMirror/lib/addtwittermirrorform.php index eb28aa038f..172d321de2 100644 --- a/plugins/SubMirror/lib/addtwittermirrorform.php +++ b/plugins/SubMirror/lib/addtwittermirrorform.php @@ -47,11 +47,13 @@ class AddTwitterMirrorForm extends AddMirrorForm $this->li(); $this->doInput('addmirror-feedurl', 'screen_name', + // TRANS: Field label. _m('Twitter username:'), $this->out->trimmed('screen_name')); $this->unli(); $this->li(); + // TRANS: Button text for adding a Twitter feed mirror. $this->out->submit('addmirror-save', _m('BUTTON','Add feed')); $this->unli(); $this->out->elementEnd('ul'); diff --git a/plugins/SubMirror/lib/editmirrorform.php b/plugins/SubMirror/lib/editmirrorform.php index c1f60f9c2c..c09aa4a7ad 100644 --- a/plugins/SubMirror/lib/editmirrorform.php +++ b/plugins/SubMirror/lib/editmirrorform.php @@ -80,20 +80,25 @@ class EditMirrorForm extends Form $this->out->elementStart('div'); if ($feed) { // XXX: Why the hard coded space? + // TRANS: Field label (URL expectected). $this->out->text(_m('LABEL', 'Remote feed:') . ' '); //$this->out->element('a', array('href' => $feed), $feed); $this->out->element('input', array('value' => $feed, 'readonly' => 'readonly', 'style' => 'width: 100%')); } else { + // TRANS: Field label. $this->out->text(_m('LABEL', 'Local user')); } $this->out->elementEnd('div'); $this->out->elementEnd('p'); $this->out->elementStart('fieldset', array('style' => 'margin-top: 20px')); - $this->out->element('legend', false, _m("Mirroring style")); + // TRANS: Fieldset legend for feed mirror setting. + $this->out->element('legend', false, _m('Mirroring style')); - $styles = array('repeat' => _m("Repeat: reference the original user's post (sometimes shows as 'RT @blah')"), - 'copy' => _m("Repost the content under my account")); + // TRANS: Feed mirror style (radio button option). + $styles = array('repeat' => _m('Repeat: reference the original user\'s post (sometimes shows as "RT @blah")'), + // TRANS: Feed mirror style (radio button option). + 'copy' => _m('Repost the content under my account')); foreach ($styles as $key => $label) { $this->out->elementStart('div'); $attribs = array('type' => 'radio', @@ -104,7 +109,7 @@ class EditMirrorForm extends Form $attribs['checked'] = 'checked'; } $this->out->element('input', $attribs); - $this->out->element('span', false, $label); // @fixme should be label, but the styles muck it up for now + $this->out->element('span', false, $label); // @todo FIXME: should be label, but the styles muck it up for now $this->out->elementEnd('div'); } @@ -112,9 +117,11 @@ class EditMirrorForm extends Form $this->out->elementStart('div'); - $this->out->submit($this->id() . '-save', _m('Save')); + // TRANS: Button text to save feed mirror settings. + $this->out->submit($this->id() . '-save', _m('BUTTON','Save')); $this->out->element('input', array('type' => 'submit', - 'value' => _m('Stop mirroring'), + // TRANS: Button text to stop mirroring a feed. + 'value' => _m('BUTTON','Stop mirroring'), 'name' => 'delete', 'class' => 'submit')); $this->out->elementEnd('div'); diff --git a/plugins/SubMirror/locale/SubMirror.pot b/plugins/SubMirror/locale/SubMirror.pot index 68e6753ea7..93a9810404 100644 --- a/plugins/SubMirror/locale/SubMirror.pot +++ b/plugins/SubMirror/locale/SubMirror.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -29,131 +29,162 @@ msgstr "" msgid "Invalid profile for mirroring." msgstr "" -#: actions/basemirror.php:104 +#. TRANS: Client error displayed when trying to mirror a StatusNet group feed. +#: actions/basemirror.php:105 msgid "Cannot mirror a StatusNet group at this time." msgstr "" -#: actions/basemirror.php:118 +#. TRANS: Client error displayed when trying to use another method than POST. +#: actions/basemirror.php:120 msgid "This action only accepts POST requests." msgstr "" -#: actions/basemirror.php:126 +#. TRANS: Client error displayed when the session token does not match or is not given. +#: actions/basemirror.php:129 msgid "There was a problem with your session token. Try again, please." msgstr "" #. TRANS: Error message displayed when trying to perform an action that requires a logged in user. -#: actions/basemirror.php:137 +#: actions/basemirror.php:140 msgid "Not logged in." msgstr "" -#: actions/basemirror.php:160 +#. TRANS: Page title for subscribed feed mirror. +#: actions/basemirror.php:164 msgid "Subscribed" msgstr "" +#. TRANS: Client error displayed when trying to edit an object that is not a feed mirror. #: actions/editmirror.php:68 msgid "Requested invalid profile to edit." msgstr "" -#: actions/editmirror.php:86 +#. TRANS: Client error displayed when providing invalid input when editing a mirror. +#: actions/editmirror.php:87 msgid "Bad form data." msgstr "" #. TRANS: Client error thrown when a mirror request is made and no result is retrieved. -#: actions/editmirror.php:95 -msgid "Requested edit of missing mirror." +#: actions/editmirror.php:96 +msgid "The mirror request failed, because no result was retrieved." msgstr "" -#: actions/addmirror.php:88 +#. TRANS: Exception thrown when a feed provider could not be recognised. +#: actions/addmirror.php:80 +msgid "Internal form error: Unrecognized feed provider." +msgstr "" + +#. TRANS: Exception thrown when a subscribing to a feed fails. +#: actions/addmirror.php:90 msgid "Could not subscribe to feed." msgstr "" -#. TRANS: Title. +#. TRANS: Page title. #: actions/mirrorsettings.php:42 msgid "Feed mirror settings" msgstr "" -#. TRANS: Instructions. +#. TRANS: Page instructions. #: actions/mirrorsettings.php:54 msgid "" "You can mirror updates from many RSS and Atom feeds into your StatusNet " "timeline!" msgstr "" -#: actions/mirrorsettings.php:132 +#. TRANS: Title for page with form to add a mirror feed provider on. +#: actions/mirrorsettings.php:133 msgid "Provider add" msgstr "" -#: SubMirrorPlugin.php:93 +#. TRANS: Plugin description. +#: SubMirrorPlugin.php:94 msgid "Pull feeds into your timeline!" msgstr "" #. TRANS: SubMirror plugin menu item on user settings page. -#: SubMirrorPlugin.php:113 +#: SubMirrorPlugin.php:114 msgctxt "MENU" msgid "Mirroring" msgstr "" #. TRANS: SubMirror plugin tooltip for user settings menu item. -#: SubMirrorPlugin.php:115 +#: SubMirrorPlugin.php:116 msgid "Configure mirroring of posts from other feeds" msgstr "" -#: SubMirrorPlugin.php:186 +#. TRANS: Label in profile statistics section, followed by a count. +#: SubMirrorPlugin.php:193 msgid "Mirrored feeds" msgstr "" -#: lib/addmirrorform.php:60 +#. TRANS: Field label. +#: lib/addmirrorform.php:61 msgid "Web page or feed URL:" msgstr "" -#: lib/addmirrorform.php:65 lib/addtwittermirrorform.php:55 +#. TRANS: Button text for adding a feed. +#. TRANS: Button text for adding a Twitter feed mirror. +#: lib/addmirrorform.php:67 lib/addtwittermirrorform.php:57 msgctxt "BUTTON" msgid "Add feed" msgstr "" -#: lib/addtwittermirrorform.php:50 +#. TRANS: Field label. +#: lib/addtwittermirrorform.php:51 msgid "Twitter username:" msgstr "" -#: lib/editmirrorform.php:83 +#. TRANS: Field label (URL expectected). +#: lib/editmirrorform.php:84 msgctxt "LABEL" msgid "Remote feed:" msgstr "" -#: lib/editmirrorform.php:87 +#. TRANS: Field label. +#: lib/editmirrorform.php:89 msgctxt "LABEL" msgid "Local user" msgstr "" -#: lib/editmirrorform.php:93 +#. TRANS: Fieldset legend for feed mirror setting. +#: lib/editmirrorform.php:96 msgid "Mirroring style" msgstr "" -#: lib/editmirrorform.php:95 +#. TRANS: Feed mirror style (radio button option). +#: lib/editmirrorform.php:99 msgid "" -"Repeat: reference the original user's post (sometimes shows as 'RT @blah')" +"Repeat: reference the original user's post (sometimes shows as \"RT @blah\")" msgstr "" -#: lib/editmirrorform.php:96 +#. TRANS: Feed mirror style (radio button option). +#: lib/editmirrorform.php:101 msgid "Repost the content under my account" msgstr "" -#: lib/editmirrorform.php:115 +#. TRANS: Button text to save feed mirror settings. +#: lib/editmirrorform.php:121 +msgctxt "BUTTON" msgid "Save" msgstr "" -#: lib/editmirrorform.php:117 +#. TRANS: Button text to stop mirroring a feed. +#: lib/editmirrorform.php:124 +msgctxt "BUTTON" msgid "Stop mirroring" msgstr "" -#: lib/addmirrorwizard.php:76 +#. TRANS: Name for possible feed provider. +#: lib/addmirrorwizard.php:77 msgid "Twitter" msgstr "" -#: lib/addmirrorwizard.php:109 +#. TRANS: Name for possible feed provider. +#: lib/addmirrorwizard.php:111 msgid "RSS or Atom feed" msgstr "" -#: lib/addmirrorwizard.php:119 +#. TRANS: Heading for feed mirroring selection form. +#: lib/addmirrorwizard.php:122 msgid "Select a feed provider" msgstr "" diff --git a/plugins/SubMirror/locale/ca/LC_MESSAGES/SubMirror.po b/plugins/SubMirror/locale/ca/LC_MESSAGES/SubMirror.po new file mode 100644 index 0000000000..0372223572 --- /dev/null +++ b/plugins/SubMirror/locale/ca/LC_MESSAGES/SubMirror.po @@ -0,0 +1,163 @@ +# Translation of StatusNet - SubMirror to Catalan (català) +# Exported from translatewiki.net +# +# Author: Toniher +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - SubMirror\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:11+0000\n" +"Language-Team: Catalan \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-19 11:23:33+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: ca\n" +"X-Message-Group: #out-statusnet-plugin-submirror\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Client error displayed when entering an invalid URL for a feed. +#. TRANS: %s is the invalid feed URL. +#, php-format +msgid "Invalid feed URL: %s." +msgstr "L'URL del canal no és vàlid: %s." + +#. TRANS: Error message returned to user when setting up feed mirroring, +#. TRANS: but we were unable to resolve the given URL to a working feed. +msgid "Invalid profile for mirroring." +msgstr "" + +#. TRANS: Client error displayed when trying to mirror a StatusNet group feed. +msgid "Cannot mirror a StatusNet group at this time." +msgstr "" + +#. TRANS: Client error displayed when trying to use another method than POST. +msgid "This action only accepts POST requests." +msgstr "" + +#. TRANS: Client error displayed when the session token does not match or is not given. +msgid "There was a problem with your session token. Try again, please." +msgstr "" + +#. TRANS: Error message displayed when trying to perform an action that requires a logged in user. +msgid "Not logged in." +msgstr "No s'ha iniciat una sessió." + +#. TRANS: Page title for subscribed feed mirror. +msgid "Subscribed" +msgstr "Subscrit" + +#. TRANS: Client error displayed when trying to edit an object that is not a feed mirror. +msgid "Requested invalid profile to edit." +msgstr "" + +#. TRANS: Client error displayed when providing invalid input when editing a mirror. +msgid "Bad form data." +msgstr "" + +#. TRANS: Client error thrown when a mirror request is made and no result is retrieved. +msgid "The mirror request failed, because no result was retrieved." +msgstr "" + +#. TRANS: Exception thrown when a feed provider could not be recognised. +msgid "Internal form error: Unrecognized feed provider." +msgstr "" + +#. TRANS: Exception thrown when a subscribing to a feed fails. +msgid "Could not subscribe to feed." +msgstr "No s'ha pogut subscriure al canal." + +#. TRANS: Page title. +msgid "Feed mirror settings" +msgstr "" + +#. TRANS: Page instructions. +msgid "" +"You can mirror updates from many RSS and Atom feeds into your StatusNet " +"timeline!" +msgstr "" + +#. TRANS: Title for page with form to add a mirror feed provider on. +msgid "Provider add" +msgstr "" + +#. TRANS: Plugin description. +msgid "Pull feeds into your timeline!" +msgstr "Publica canals en la vostra línia temporal!" + +#. TRANS: SubMirror plugin menu item on user settings page. +msgctxt "MENU" +msgid "Mirroring" +msgstr "" + +#. TRANS: SubMirror plugin tooltip for user settings menu item. +msgid "Configure mirroring of posts from other feeds" +msgstr "" + +#. TRANS: Label in profile statistics section, followed by a count. +msgid "Mirrored feeds" +msgstr "" + +#. TRANS: Field label. +msgid "Web page or feed URL:" +msgstr "Pàgina web o canal URL:" + +#. TRANS: Button text for adding a feed. +#. TRANS: Button text for adding a Twitter feed mirror. +msgctxt "BUTTON" +msgid "Add feed" +msgstr "Afegeix un canal" + +#. TRANS: Field label. +msgid "Twitter username:" +msgstr "Nom d'usuari al Twitter:" + +#. TRANS: Field label (URL expectected). +msgctxt "LABEL" +msgid "Remote feed:" +msgstr "Canal remot:" + +#. TRANS: Field label. +msgctxt "LABEL" +msgid "Local user" +msgstr "Usuari local" + +#. TRANS: Fieldset legend for feed mirror setting. +msgid "Mirroring style" +msgstr "" + +#. TRANS: Feed mirror style (radio button option). +msgid "" +"Repeat: reference the original user's post (sometimes shows as \"RT @blah\")" +msgstr "" + +#. TRANS: Feed mirror style (radio button option). +msgid "Repost the content under my account" +msgstr "" + +#. TRANS: Button text to save feed mirror settings. +msgctxt "BUTTON" +msgid "Save" +msgstr "Desa" + +#. TRANS: Button text to stop mirroring a feed. +msgctxt "BUTTON" +msgid "Stop mirroring" +msgstr "" + +#. TRANS: Name for possible feed provider. +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Name for possible feed provider. +msgid "RSS or Atom feed" +msgstr "Canal RSS o Atom" + +#. TRANS: Heading for feed mirroring selection form. +msgid "Select a feed provider" +msgstr "Seleccioneu un proveïdor de canals" diff --git a/plugins/SubMirror/locale/de/LC_MESSAGES/SubMirror.po b/plugins/SubMirror/locale/de/LC_MESSAGES/SubMirror.po index e1a8b721c9..6fa79055cc 100644 --- a/plugins/SubMirror/locale/de/LC_MESSAGES/SubMirror.po +++ b/plugins/SubMirror/locale/de/LC_MESSAGES/SubMirror.po @@ -4,6 +4,7 @@ # Author: Fujnky # Author: Giftpflanze # Author: MF-Warburg +# Author: Tiin # -- # This file is distributed under the same license as the StatusNet package. # @@ -11,14 +12,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SubMirror\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:29+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:11+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:22+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:33+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-submirror\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -34,12 +35,15 @@ msgstr "Ungültige Feed-URL: %s." msgid "Invalid profile for mirroring." msgstr "Ungültiges Profil für das Spiegeln." +#. TRANS: Client error displayed when trying to mirror a StatusNet group feed. msgid "Cannot mirror a StatusNet group at this time." msgstr "Kann im Moment keine StatusNet-Gruppe spiegeln." +#. TRANS: Client error displayed when trying to use another method than POST. msgid "This action only accepts POST requests." msgstr "Diese Aktion nimmt nur POST-Requests." +#. TRANS: Client error displayed when the session token does not match or is not given. msgid "There was a problem with your session token. Try again, please." msgstr "Es gab ein Problem mit deinem Sitzungstoken. Bitte versuche es erneut." @@ -47,27 +51,37 @@ msgstr "Es gab ein Problem mit deinem Sitzungstoken. Bitte versuche es erneut." msgid "Not logged in." msgstr "Nicht angemeldet." +#. TRANS: Page title for subscribed feed mirror. msgid "Subscribed" msgstr "Abonniert" +#. TRANS: Client error displayed when trying to edit an object that is not a feed mirror. msgid "Requested invalid profile to edit." msgstr "Ungültiges Profil zum Bearbeiten angefordert." +#. TRANS: Client error displayed when providing invalid input when editing a mirror. msgid "Bad form data." msgstr "Ungültige Formulardaten." #. TRANS: Client error thrown when a mirror request is made and no result is retrieved. -msgid "Requested edit of missing mirror." -msgstr "Bearbeitung eines fehlenden Spiegels angefordert." +msgid "The mirror request failed, because no result was retrieved." +msgstr "" +"Die Spiegel-Anforderung ist fehlgeschlagen, weil kein Ergebnis abgerufen " +"wurde." +#. TRANS: Exception thrown when a feed provider could not be recognised. +msgid "Internal form error: Unrecognized feed provider." +msgstr "Interner Formfehler: Unerkannter Feed-Provider." + +#. TRANS: Exception thrown when a subscribing to a feed fails. msgid "Could not subscribe to feed." msgstr "Konnte den Feed nicht abonnieren." -#. TRANS: Title. +#. TRANS: Page title. msgid "Feed mirror settings" msgstr "Feed-Spiegel-Einstellungen" -#. TRANS: Instructions. +#. TRANS: Page instructions. msgid "" "You can mirror updates from many RSS and Atom feeds into your StatusNet " "timeline!" @@ -75,9 +89,11 @@ msgstr "" "Du kanst die Aktualisierungen von vielen RSS- und Atomfeeds in deine " "StatusNet-Zeitleiste integrieren!" +#. TRANS: Title for page with form to add a mirror feed provider on. msgid "Provider add" msgstr "Provider hinzufügen" +#. TRANS: Plugin description. msgid "Pull feeds into your timeline!" msgstr "Ziehe Feeds in deine Zeitleiste!" @@ -90,50 +106,67 @@ msgstr "Spiegeln" msgid "Configure mirroring of posts from other feeds" msgstr "Konfiguration des Spiegelns von Posts von anderen Feeds" +#. TRANS: Label in profile statistics section, followed by a count. msgid "Mirrored feeds" msgstr "Gespiegelte Feeds" +#. TRANS: Field label. msgid "Web page or feed URL:" msgstr "Webseiten- oder Feed-URL:" +#. TRANS: Button text for adding a feed. +#. TRANS: Button text for adding a Twitter feed mirror. msgctxt "BUTTON" msgid "Add feed" msgstr "Feed hinzufügen" +#. TRANS: Field label. msgid "Twitter username:" msgstr "Twitter-Benutzername:" +#. TRANS: Field label (URL expectected). msgctxt "LABEL" msgid "Remote feed:" msgstr "Remote-Feed:" +#. TRANS: Field label. msgctxt "LABEL" msgid "Local user" msgstr "Lokaler Benutzer" +#. TRANS: Fieldset legend for feed mirror setting. msgid "Mirroring style" msgstr "Spiegelungs-Stil" +#. TRANS: Feed mirror style (radio button option). msgid "" -"Repeat: reference the original user's post (sometimes shows as 'RT @blah')" +"Repeat: reference the original user's post (sometimes shows as \"RT @blah\")" msgstr "" "Wiederholen: Auf den Post des ursprünglichen Benutzers beziehen (manchmal " "als „RT @blah“ dargestellt)" +#. TRANS: Feed mirror style (radio button option). msgid "Repost the content under my account" msgstr "Den Inhalt mit meinem Konto erneut posten" +#. TRANS: Button text to save feed mirror settings. +msgctxt "BUTTON" msgid "Save" msgstr "Speichern" +#. TRANS: Button text to stop mirroring a feed. +msgctxt "BUTTON" msgid "Stop mirroring" msgstr "Mit dem Spiegeln aufhören" +#. TRANS: Name for possible feed provider. msgid "Twitter" msgstr "Twitter" +#. TRANS: Name for possible feed provider. msgid "RSS or Atom feed" msgstr "RSS- oder Atomfeed" +#. TRANS: Heading for feed mirroring selection form. msgid "Select a feed provider" msgstr "Wähle einen Feedprovider aus" diff --git a/plugins/SubMirror/locale/es/LC_MESSAGES/SubMirror.po b/plugins/SubMirror/locale/es/LC_MESSAGES/SubMirror.po new file mode 100644 index 0000000000..958ea7f1a1 --- /dev/null +++ b/plugins/SubMirror/locale/es/LC_MESSAGES/SubMirror.po @@ -0,0 +1,171 @@ +# Translation of StatusNet - SubMirror to Spanish (español) +# Exported from translatewiki.net +# +# Author: Armando-Martin +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - SubMirror\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:11+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-19 11:23:33+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Client error displayed when entering an invalid URL for a feed. +#. TRANS: %s is the invalid feed URL. +#, php-format +msgid "Invalid feed URL: %s." +msgstr "Dirección URL de fuente web (feed) no válida: %s." + +#. TRANS: Error message returned to user when setting up feed mirroring, +#. TRANS: but we were unable to resolve the given URL to a working feed. +msgid "Invalid profile for mirroring." +msgstr "Perfil inválido para hacer copia especular (mirroring)." + +#. TRANS: Client error displayed when trying to mirror a StatusNet group feed. +msgid "Cannot mirror a StatusNet group at this time." +msgstr "" +"No se puede hacer copia especular (mirror) de un grupo de StatusNet en este " +"momento." + +#. TRANS: Client error displayed when trying to use another method than POST. +msgid "This action only accepts POST requests." +msgstr "Esta acción sólo acepta solicitudes POST." + +#. TRANS: Client error displayed when the session token does not match or is not given. +msgid "There was a problem with your session token. Try again, please." +msgstr "Hubo un problema con su contraseña de sesión. Inténtelo de nuevo." + +#. TRANS: Error message displayed when trying to perform an action that requires a logged in user. +msgid "Not logged in." +msgstr "No ha iniciado sesión." + +#. TRANS: Page title for subscribed feed mirror. +msgid "Subscribed" +msgstr "Suscrito" + +#. TRANS: Client error displayed when trying to edit an object that is not a feed mirror. +msgid "Requested invalid profile to edit." +msgstr "El perfil que ha solicitado editar no es válido." + +#. TRANS: Client error displayed when providing invalid input when editing a mirror. +msgid "Bad form data." +msgstr "Datos de formulario incorrectos." + +#. TRANS: Client error thrown when a mirror request is made and no result is retrieved. +msgid "The mirror request failed, because no result was retrieved." +msgstr "" +"Error en la solicitud de copia especular (mirror), porque no se obtuvo " +"ningún resultado." + +#. TRANS: Exception thrown when a feed provider could not be recognised. +msgid "Internal form error: Unrecognized feed provider." +msgstr "" +"Error interno en el formulario: Proveedor de fuente web (feed) no reconocido." + +#. TRANS: Exception thrown when a subscribing to a feed fails. +msgid "Could not subscribe to feed." +msgstr "No se pudo suscribir a la fuente web (feed)" + +#. TRANS: Page title. +msgid "Feed mirror settings" +msgstr "Configuración de copia especular (mirror) de fuente web (feed)" + +#. TRANS: Page instructions. +msgid "" +"You can mirror updates from many RSS and Atom feeds into your StatusNet " +"timeline!" +msgstr "" +"¡Puede hacer copia especular (mirror) de las actualizaciones de muchas " +"fuentes web RSS y Atom en su agenda de StatusNet!" + +#. TRANS: Title for page with form to add a mirror feed provider on. +msgid "Provider add" +msgstr "Agregar proveedor" + +#. TRANS: Plugin description. +msgid "Pull feeds into your timeline!" +msgstr "¡Importar fuentes web (feed) en su agenda!" + +#. TRANS: SubMirror plugin menu item on user settings page. +msgctxt "MENU" +msgid "Mirroring" +msgstr "Copia especular (mirroring)" + +#. TRANS: SubMirror plugin tooltip for user settings menu item. +msgid "Configure mirroring of posts from other feeds" +msgstr "" +"Configurar la copia especular (mirror) de entradas de otras fuentes web " +"(feed)" + +#. TRANS: Label in profile statistics section, followed by a count. +msgid "Mirrored feeds" +msgstr "Se ha hecho copia especular de las fuentes web" + +#. TRANS: Field label. +msgid "Web page or feed URL:" +msgstr "Página web o dirección URL de la fuente web (feed):" + +#. TRANS: Button text for adding a feed. +#. TRANS: Button text for adding a Twitter feed mirror. +msgctxt "BUTTON" +msgid "Add feed" +msgstr "Añadir fuente web (feed)" + +#. TRANS: Field label. +msgid "Twitter username:" +msgstr "Nombre de usuario de Twitter:" + +#. TRANS: Field label (URL expectected). +msgctxt "LABEL" +msgid "Remote feed:" +msgstr "Fuente web (feed) remota:" + +#. TRANS: Field label. +msgctxt "LABEL" +msgid "Local user" +msgstr "Usuario local" + +#. TRANS: Fieldset legend for feed mirror setting. +msgid "Mirroring style" +msgstr "Estilo de copia especular (mirror)" + +#. TRANS: Feed mirror style (radio button option). +msgid "" +"Repeat: reference the original user's post (sometimes shows as \"RT @blah\")" +msgstr "" +"Repetir: Referenciar la entrada del usuario original (a veces se muestra " +"como \"RT @blah\")" + +#. TRANS: Feed mirror style (radio button option). +msgid "Repost the content under my account" +msgstr "Volver a publicar el contenido bajo mi cuenta" + +#. TRANS: Button text to save feed mirror settings. +msgctxt "BUTTON" +msgid "Save" +msgstr "Guardar" + +#. TRANS: Button text to stop mirroring a feed. +msgctxt "BUTTON" +msgid "Stop mirroring" +msgstr "Detener copia especular (mirror)" + +#. TRANS: Name for possible feed provider. +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Name for possible feed provider. +msgid "RSS or Atom feed" +msgstr "Fuente web (feed) RSS o Atom" + +#. TRANS: Heading for feed mirroring selection form. +msgid "Select a feed provider" +msgstr "Seleccione un proveedor de fuente web (feed)" diff --git a/plugins/SubMirror/locale/eu/LC_MESSAGES/SubMirror.po b/plugins/SubMirror/locale/eu/LC_MESSAGES/SubMirror.po new file mode 100644 index 0000000000..02a6d95155 --- /dev/null +++ b/plugins/SubMirror/locale/eu/LC_MESSAGES/SubMirror.po @@ -0,0 +1,160 @@ +# Translation of StatusNet - SubMirror to Basque (euskara) +# Exported from translatewiki.net +# +# Author: Artsuaga +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - SubMirror\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:11+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-19 11:23:33+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Client error displayed when entering an invalid URL for a feed. +#. TRANS: %s is the invalid feed URL. +#, php-format +msgid "Invalid feed URL: %s." +msgstr "Jario URL baliogabea: %s." + +#. TRANS: Error message returned to user when setting up feed mirroring, +#. TRANS: but we were unable to resolve the given URL to a working feed. +msgid "Invalid profile for mirroring." +msgstr "Ispilu gisa erabiltzeko profil baliogabea." + +#. TRANS: Client error displayed when trying to mirror a StatusNet group feed. +msgid "Cannot mirror a StatusNet group at this time." +msgstr "" + +#. TRANS: Client error displayed when trying to use another method than POST. +msgid "This action only accepts POST requests." +msgstr "Ekintza honek POST eskariak soilik onartzen ditu." + +#. TRANS: Client error displayed when the session token does not match or is not given. +msgid "There was a problem with your session token. Try again, please." +msgstr "Arazoa egon da zure saio-tokenarekin. Saiatu berriro, mesedez." + +#. TRANS: Error message displayed when trying to perform an action that requires a logged in user. +msgid "Not logged in." +msgstr "Saioa hasi gabe." + +#. TRANS: Page title for subscribed feed mirror. +msgid "Subscribed" +msgstr "Harpidetua" + +#. TRANS: Client error displayed when trying to edit an object that is not a feed mirror. +msgid "Requested invalid profile to edit." +msgstr "" + +#. TRANS: Client error displayed when providing invalid input when editing a mirror. +msgid "Bad form data." +msgstr "Inprimaki data okerrak." + +#. TRANS: Client error thrown when a mirror request is made and no result is retrieved. +msgid "The mirror request failed, because no result was retrieved." +msgstr "" + +#. TRANS: Exception thrown when a feed provider could not be recognised. +msgid "Internal form error: Unrecognized feed provider." +msgstr "" + +#. TRANS: Exception thrown when a subscribing to a feed fails. +msgid "Could not subscribe to feed." +msgstr "Ezin izan da jariora harpidetu." + +#. TRANS: Page title. +msgid "Feed mirror settings" +msgstr "Jario ispilu aukerak" + +#. TRANS: Page instructions. +msgid "" +"You can mirror updates from many RSS and Atom feeds into your StatusNet " +"timeline!" +msgstr "" + +#. TRANS: Title for page with form to add a mirror feed provider on. +msgid "Provider add" +msgstr "Hornitzailea gehitu" + +#. TRANS: Plugin description. +msgid "Pull feeds into your timeline!" +msgstr "" + +#. TRANS: SubMirror plugin menu item on user settings page. +msgctxt "MENU" +msgid "Mirroring" +msgstr "" + +#. TRANS: SubMirror plugin tooltip for user settings menu item. +msgid "Configure mirroring of posts from other feeds" +msgstr "" + +#. TRANS: Label in profile statistics section, followed by a count. +msgid "Mirrored feeds" +msgstr "" + +#. TRANS: Field label. +msgid "Web page or feed URL:" +msgstr "" + +#. TRANS: Button text for adding a feed. +#. TRANS: Button text for adding a Twitter feed mirror. +msgctxt "BUTTON" +msgid "Add feed" +msgstr "Gehitu jarioa" + +#. TRANS: Field label. +msgid "Twitter username:" +msgstr "Twitter erabiltzailea:" + +#. TRANS: Field label (URL expectected). +msgctxt "LABEL" +msgid "Remote feed:" +msgstr "Urruneko jarioa:" + +#. TRANS: Field label. +msgctxt "LABEL" +msgid "Local user" +msgstr "Erabiltzaile lokala" + +#. TRANS: Fieldset legend for feed mirror setting. +msgid "Mirroring style" +msgstr "Ispilu estiloa" + +#. TRANS: Feed mirror style (radio button option). +msgid "" +"Repeat: reference the original user's post (sometimes shows as \"RT @blah\")" +msgstr "" + +#. TRANS: Feed mirror style (radio button option). +msgid "Repost the content under my account" +msgstr "" + +#. TRANS: Button text to save feed mirror settings. +msgctxt "BUTTON" +msgid "Save" +msgstr "Gorde" + +#. TRANS: Button text to stop mirroring a feed. +msgctxt "BUTTON" +msgid "Stop mirroring" +msgstr "Gelditu ispilua" + +#. TRANS: Name for possible feed provider. +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Name for possible feed provider. +msgid "RSS or Atom feed" +msgstr "RSS edo Atom jarioa" + +#. TRANS: Heading for feed mirroring selection form. +msgid "Select a feed provider" +msgstr "Aukeratu jario hornitzailea" diff --git a/plugins/SubMirror/locale/fr/LC_MESSAGES/SubMirror.po b/plugins/SubMirror/locale/fr/LC_MESSAGES/SubMirror.po index c879c08359..ca3e5564b6 100644 --- a/plugins/SubMirror/locale/fr/LC_MESSAGES/SubMirror.po +++ b/plugins/SubMirror/locale/fr/LC_MESSAGES/SubMirror.po @@ -1,6 +1,7 @@ -# Translation of StatusNet - SubMirror to French (Français) +# Translation of StatusNet - SubMirror to French (français) # Exported from translatewiki.net # +# Author: Gomoko # Author: IAlex # Author: Od1n # Author: Peter17 @@ -12,14 +13,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SubMirror\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:30+0000\n" -"Language-Team: French \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:11+0000\n" +"Language-Team: French \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:22+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:33+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-submirror\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" @@ -35,12 +36,15 @@ msgstr "Adresse URL de flux invalide : %s." msgid "Invalid profile for mirroring." msgstr "Profil invalide pour la mise en miroir." +#. TRANS: Client error displayed when trying to mirror a StatusNet group feed. msgid "Cannot mirror a StatusNet group at this time." msgstr "Impossible de mettre en miroir un groupe StatusNet actuellement." +#. TRANS: Client error displayed when trying to use another method than POST. msgid "This action only accepts POST requests." msgstr "Cette action n’accepte que les requêtes de type POST." +#. TRANS: Client error displayed when the session token does not match or is not given. msgid "There was a problem with your session token. Try again, please." msgstr "" "Un problème est survenu avec votre jeton de session. Veuillez essayer à " @@ -50,27 +54,35 @@ msgstr "" msgid "Not logged in." msgstr "Non connecté." +#. TRANS: Page title for subscribed feed mirror. msgid "Subscribed" msgstr "Abonné" +#. TRANS: Client error displayed when trying to edit an object that is not a feed mirror. msgid "Requested invalid profile to edit." msgstr "Profil invalide demandé à modifier." +#. TRANS: Client error displayed when providing invalid input when editing a mirror. msgid "Bad form data." msgstr "Données de formulaire erronées." #. TRANS: Client error thrown when a mirror request is made and no result is retrieved. -msgid "Requested edit of missing mirror." -msgstr "Miroir inexistant demandé à modifier." +msgid "The mirror request failed, because no result was retrieved." +msgstr "Échec de la requête miroir, car aucun résultat n'a été récupéré." +#. TRANS: Exception thrown when a feed provider could not be recognised. +msgid "Internal form error: Unrecognized feed provider." +msgstr "Erreur interne du formulaire: Fournisseur d'alimentation non reconnu." + +#. TRANS: Exception thrown when a subscribing to a feed fails. msgid "Could not subscribe to feed." msgstr "Impossible de vous abonner au flux." -#. TRANS: Title. +#. TRANS: Page title. msgid "Feed mirror settings" msgstr "Paramètres de miroir de flux" -#. TRANS: Instructions. +#. TRANS: Page instructions. msgid "" "You can mirror updates from many RSS and Atom feeds into your StatusNet " "timeline!" @@ -78,9 +90,11 @@ msgstr "" "Vous pouvez mettre en miroir dans votre agenda StatusNet les mises à jour de " "nombreux flux RSS et Atom !" +#. TRANS: Title for page with form to add a mirror feed provider on. msgid "Provider add" msgstr "Ajout de fournisseurs" +#. TRANS: Plugin description. msgid "Pull feeds into your timeline!" msgstr "Importez des flux d’information dans votre agenda !" @@ -93,50 +107,67 @@ msgstr "Mise en miroir" msgid "Configure mirroring of posts from other feeds" msgstr "Configurer la mise en miroir de messages provenant d’autres flux" +#. TRANS: Label in profile statistics section, followed by a count. msgid "Mirrored feeds" msgstr "Flux en miroir" +#. TRANS: Field label. msgid "Web page or feed URL:" msgstr "Adresse URL de la page Web ou du flux :" +#. TRANS: Button text for adding a feed. +#. TRANS: Button text for adding a Twitter feed mirror. msgctxt "BUTTON" msgid "Add feed" msgstr "Ajouter le flux" +#. TRANS: Field label. msgid "Twitter username:" msgstr "Nom d’utilisateur Twitter :" +#. TRANS: Field label (URL expectected). msgctxt "LABEL" msgid "Remote feed:" msgstr "Flux distant :" +#. TRANS: Field label. msgctxt "LABEL" msgid "Local user" msgstr "Utilisateur local" +#. TRANS: Fieldset legend for feed mirror setting. msgid "Mirroring style" msgstr "Style de mise en miroir" +#. TRANS: Feed mirror style (radio button option). msgid "" -"Repeat: reference the original user's post (sometimes shows as 'RT @blah')" +"Repeat: reference the original user's post (sometimes shows as \"RT @blah\")" msgstr "" -"Répéter : référence le message de l’auteur d’origine (montré parfois comme « " -"RT @blabla »)" +"Répétition: référence du message de l’utilisateur d’origine (affiché parfois " +"sous la forme \"RT @blah\")" +#. TRANS: Feed mirror style (radio button option). msgid "Repost the content under my account" msgstr "Reposter le contenu sous mon compte" +#. TRANS: Button text to save feed mirror settings. +msgctxt "BUTTON" msgid "Save" -msgstr "Sauvegarder" +msgstr "Enregistrer" +#. TRANS: Button text to stop mirroring a feed. +msgctxt "BUTTON" msgid "Stop mirroring" msgstr "Arrêter le miroir" +#. TRANS: Name for possible feed provider. msgid "Twitter" msgstr "Twitter" +#. TRANS: Name for possible feed provider. msgid "RSS or Atom feed" msgstr "Flux RSS ou Atom" +#. TRANS: Heading for feed mirroring selection form. msgid "Select a feed provider" msgstr "Sélectionner un fournisseur de flux" diff --git a/plugins/SubMirror/locale/gl/LC_MESSAGES/SubMirror.po b/plugins/SubMirror/locale/gl/LC_MESSAGES/SubMirror.po new file mode 100644 index 0000000000..d2a56b27ac --- /dev/null +++ b/plugins/SubMirror/locale/gl/LC_MESSAGES/SubMirror.po @@ -0,0 +1,168 @@ +# Translation of StatusNet - SubMirror to Galician (galego) +# Exported from translatewiki.net +# +# Author: Toliño +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - SubMirror\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:11+0000\n" +"Language-Team: Galician \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-19 11:23:33+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: gl\n" +"X-Message-Group: #out-statusnet-plugin-submirror\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Client error displayed when entering an invalid URL for a feed. +#. TRANS: %s is the invalid feed URL. +#, php-format +msgid "Invalid feed URL: %s." +msgstr "URL de fonte de novas non válido: %s." + +#. TRANS: Error message returned to user when setting up feed mirroring, +#. TRANS: but we were unable to resolve the given URL to a working feed. +msgid "Invalid profile for mirroring." +msgstr "Perfil inválido para a republicación." + +#. TRANS: Client error displayed when trying to mirror a StatusNet group feed. +msgid "Cannot mirror a StatusNet group at this time." +msgstr "Non se pode republicar un grupo de StatusNet nestes intres." + +#. TRANS: Client error displayed when trying to use another method than POST. +msgid "This action only accepts POST requests." +msgstr "Esta acción só permite solicitudes POST." + +#. TRANS: Client error displayed when the session token does not match or is not given. +msgid "There was a problem with your session token. Try again, please." +msgstr "Houbo un erro co seu pase. Inténteo de novo." + +#. TRANS: Error message displayed when trying to perform an action that requires a logged in user. +msgid "Not logged in." +msgstr "Non iniciou sesión." + +#. TRANS: Page title for subscribed feed mirror. +msgid "Subscribed" +msgstr "Subscrito" + +#. TRANS: Client error displayed when trying to edit an object that is not a feed mirror. +msgid "Requested invalid profile to edit." +msgstr "O perfil que solicitou editar é inválido." + +#. TRANS: Client error displayed when providing invalid input when editing a mirror. +msgid "Bad form data." +msgstr "Datos de formulario incorrectos." + +#. TRANS: Client error thrown when a mirror request is made and no result is retrieved. +msgid "The mirror request failed, because no result was retrieved." +msgstr "" +"A solicitude de republicación fallou porque non se obtivo ningún resultado." + +#. TRANS: Exception thrown when a feed provider could not be recognised. +msgid "Internal form error: Unrecognized feed provider." +msgstr "Erro interno no formulario: Provedor de fonte de novas non recoñecido." + +#. TRANS: Exception thrown when a subscribing to a feed fails. +msgid "Could not subscribe to feed." +msgstr "Non se puido subscribir á fonte de novas." + +#. TRANS: Page title. +msgid "Feed mirror settings" +msgstr "Configuración da republicación de fontes de novas" + +#. TRANS: Page instructions. +msgid "" +"You can mirror updates from many RSS and Atom feeds into your StatusNet " +"timeline!" +msgstr "" +"Pode republicar as actualizacións de moitas fontes de novas RSS e Atom na " +"súa liña do tempo de StatusNet!" + +#. TRANS: Title for page with form to add a mirror feed provider on. +msgid "Provider add" +msgstr "Adición dun provedor" + +#. TRANS: Plugin description. +msgid "Pull feeds into your timeline!" +msgstr "Importar as fontes de novas na súa liña do tempo!" + +#. TRANS: SubMirror plugin menu item on user settings page. +msgctxt "MENU" +msgid "Mirroring" +msgstr "Republicación" + +#. TRANS: SubMirror plugin tooltip for user settings menu item. +msgid "Configure mirroring of posts from other feeds" +msgstr "Configurar a republicación de mensaxes doutras fontes de novas" + +#. TRANS: Label in profile statistics section, followed by a count. +msgid "Mirrored feeds" +msgstr "Fontes de novas republicadas" + +#. TRANS: Field label. +msgid "Web page or feed URL:" +msgstr "Enderezo URL da páxina web ou da fonte de novas:" + +#. TRANS: Button text for adding a feed. +#. TRANS: Button text for adding a Twitter feed mirror. +msgctxt "BUTTON" +msgid "Add feed" +msgstr "Engadir unha fonte de novas" + +#. TRANS: Field label. +msgid "Twitter username:" +msgstr "Nome de usuario do Twitter:" + +#. TRANS: Field label (URL expectected). +msgctxt "LABEL" +msgid "Remote feed:" +msgstr "Fonte de novas remota:" + +#. TRANS: Field label. +msgctxt "LABEL" +msgid "Local user" +msgstr "Usuario local" + +#. TRANS: Fieldset legend for feed mirror setting. +msgid "Mirroring style" +msgstr "Estilo de republicación" + +#. TRANS: Feed mirror style (radio button option). +msgid "" +"Repeat: reference the original user's post (sometimes shows as \"RT @blah\")" +msgstr "" +"Repetir: Referenciar a publicación do usuario orixinal (ás veces móstrase " +"como \"RT @bla\")" + +#. TRANS: Feed mirror style (radio button option). +msgid "Repost the content under my account" +msgstr "Volver publicar o contido baixo a miña conta" + +#. TRANS: Button text to save feed mirror settings. +msgctxt "BUTTON" +msgid "Save" +msgstr "Gardar" + +#. TRANS: Button text to stop mirroring a feed. +msgctxt "BUTTON" +msgid "Stop mirroring" +msgstr "Deixar de republicar" + +#. TRANS: Name for possible feed provider. +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Name for possible feed provider. +msgid "RSS or Atom feed" +msgstr "Fonte de novas RSS ou Atom" + +#. TRANS: Heading for feed mirroring selection form. +msgid "Select a feed provider" +msgstr "Seleccione un provedor de fonte de novas" diff --git a/plugins/SubMirror/locale/ia/LC_MESSAGES/SubMirror.po b/plugins/SubMirror/locale/ia/LC_MESSAGES/SubMirror.po index 8f36d4a2b5..d65c17120f 100644 --- a/plugins/SubMirror/locale/ia/LC_MESSAGES/SubMirror.po +++ b/plugins/SubMirror/locale/ia/LC_MESSAGES/SubMirror.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SubMirror to Interlingua (Interlingua) +# Translation of StatusNet - SubMirror to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SubMirror\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:30+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:12+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:22+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:33+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-submirror\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -32,12 +32,15 @@ msgstr "URL de syndication invalide: %s." msgid "Invalid profile for mirroring." msgstr "Profilo invalide pro republication." +#. TRANS: Client error displayed when trying to mirror a StatusNet group feed. msgid "Cannot mirror a StatusNet group at this time." msgstr "Al presente il es impossibile republicar un gruppo StatusNet." +#. TRANS: Client error displayed when trying to use another method than POST. msgid "This action only accepts POST requests." msgstr "Iste action accepta solmente le requestas de typo POST." +#. TRANS: Client error displayed when the session token does not match or is not given. msgid "There was a problem with your session token. Try again, please." msgstr "Occurreva un problema con le indicio de tu session. Per favor reproba." @@ -45,27 +48,37 @@ msgstr "Occurreva un problema con le indicio de tu session. Per favor reproba." msgid "Not logged in." msgstr "Tu non ha aperite un session." +#. TRANS: Page title for subscribed feed mirror. msgid "Subscribed" msgstr "Subscribite" +#. TRANS: Client error displayed when trying to edit an object that is not a feed mirror. msgid "Requested invalid profile to edit." msgstr "Requestava un profilo invalide a modificar." +#. TRANS: Client error displayed when providing invalid input when editing a mirror. msgid "Bad form data." msgstr "Mal datos de formulario." #. TRANS: Client error thrown when a mirror request is made and no result is retrieved. -msgid "Requested edit of missing mirror." -msgstr "Requestava le modification de un speculo mancante." +msgid "The mirror request failed, because no result was retrieved." +msgstr "" +"Le requesta de reduplication ha fallite proque nulle requesta ha essite " +"recipite." +#. TRANS: Exception thrown when a feed provider could not be recognised. +msgid "Internal form error: Unrecognized feed provider." +msgstr "Error interne in formulario: Fornitor de syndication incognite." + +#. TRANS: Exception thrown when a subscribing to a feed fails. msgid "Could not subscribe to feed." msgstr "Non poteva subscriber al syndication." -#. TRANS: Title. +#. TRANS: Page title. msgid "Feed mirror settings" msgstr "Configuration de speculo de syndication" -#. TRANS: Instructions. +#. TRANS: Page instructions. msgid "" "You can mirror updates from many RSS and Atom feeds into your StatusNet " "timeline!" @@ -73,9 +86,11 @@ msgstr "" "Tu pote republicar actualisationes de multe syndicationes RSS e Atom in tu " "chronologia de StatusNet!" +#. TRANS: Title for page with form to add a mirror feed provider on. msgid "Provider add" msgstr "Addition de fornitor" +#. TRANS: Plugin description. msgid "Pull feeds into your timeline!" msgstr "Importar syndicationes in tu chronologia!" @@ -88,50 +103,67 @@ msgstr "Republication" msgid "Configure mirroring of posts from other feeds" msgstr "Configurar le republication de messages de altere syndicationes" +#. TRANS: Label in profile statistics section, followed by a count. msgid "Mirrored feeds" msgstr "Speculos de syndicationes" +#. TRANS: Field label. msgid "Web page or feed URL:" msgstr "URL de pagina web o syndication:" +#. TRANS: Button text for adding a feed. +#. TRANS: Button text for adding a Twitter feed mirror. msgctxt "BUTTON" msgid "Add feed" msgstr "Adder syndication" +#. TRANS: Field label. msgid "Twitter username:" msgstr "Nomine de usator de Twitter:" +#. TRANS: Field label (URL expectected). msgctxt "LABEL" msgid "Remote feed:" msgstr "Syndication remote:" +#. TRANS: Field label. msgctxt "LABEL" msgid "Local user" msgstr "Usator local" +#. TRANS: Fieldset legend for feed mirror setting. msgid "Mirroring style" msgstr "Stilo de republication" +#. TRANS: Feed mirror style (radio button option). msgid "" -"Repeat: reference the original user's post (sometimes shows as 'RT @blah')" +"Repeat: reference the original user's post (sometimes shows as \"RT @blah\")" msgstr "" -"Repeter: referer al message del usator original (monstrate a vices como 'RT " -"@pseudonymo')" +"Repeter: referer al message del usator original (monstrate a vices como \"RT " +"@pseudonymo\")" +#. TRANS: Feed mirror style (radio button option). msgid "Repost the content under my account" msgstr "Republicar le contento sub mi conto" +#. TRANS: Button text to save feed mirror settings. +msgctxt "BUTTON" msgid "Save" msgstr "Salveguardar" +#. TRANS: Button text to stop mirroring a feed. +msgctxt "BUTTON" msgid "Stop mirroring" -msgstr "Cessar le republication" +msgstr "Cessar le reduplication" +#. TRANS: Name for possible feed provider. msgid "Twitter" msgstr "Twitter" +#. TRANS: Name for possible feed provider. msgid "RSS or Atom feed" msgstr "Syndication RSS o Atom" +#. TRANS: Heading for feed mirroring selection form. msgid "Select a feed provider" msgstr "Selige un fornitor de syndicationes" diff --git a/plugins/SubMirror/locale/mk/LC_MESSAGES/SubMirror.po b/plugins/SubMirror/locale/mk/LC_MESSAGES/SubMirror.po index 74f2987f3c..4b38bb3513 100644 --- a/plugins/SubMirror/locale/mk/LC_MESSAGES/SubMirror.po +++ b/plugins/SubMirror/locale/mk/LC_MESSAGES/SubMirror.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SubMirror to Macedonian (МакедонÑки) +# Translation of StatusNet - SubMirror to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SubMirror\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:30+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:12+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:22+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:33+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-submirror\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" @@ -32,12 +32,15 @@ msgstr "Ðеважечка URL-адреÑа за каналот: %s." msgid "Invalid profile for mirroring." msgstr "Ðеважечки профил за отÑликување." +#. TRANS: Client error displayed when trying to mirror a StatusNet group feed. msgid "Cannot mirror a StatusNet group at this time." msgstr "Моментално не можам да отÑликам група од StatusNet." +#. TRANS: Client error displayed when trying to use another method than POST. msgid "This action only accepts POST requests." msgstr "Оваа поÑтапка прифаќа Ñамо POST-барања." +#. TRANS: Client error displayed when the session token does not match or is not given. msgid "There was a problem with your session token. Try again, please." msgstr "Се појави проблем Ñо жетонот на Вашата ÑеÑија. Обидете Ñе подоцна." @@ -45,27 +48,35 @@ msgstr "Се појави проблем Ñо жетонот на Вашата msgid "Not logged in." msgstr "Ðе Ñте најавени." +#. TRANS: Page title for subscribed feed mirror. msgid "Subscribed" msgstr "Претплатено" +#. TRANS: Client error displayed when trying to edit an object that is not a feed mirror. msgid "Requested invalid profile to edit." msgstr "Побаран е неважечки профил за уредување." +#. TRANS: Client error displayed when providing invalid input when editing a mirror. msgid "Bad form data." msgstr "ÐеиÑправни податоци за образецот." #. TRANS: Client error thrown when a mirror request is made and no result is retrieved. -msgid "Requested edit of missing mirror." -msgstr "Побаравте уредување на отÑликување што недоÑтаÑува." +msgid "The mirror request failed, because no result was retrieved." +msgstr "Барањето за отÑликување не уÑпеа бидејќи не добив никаков резултат." +#. TRANS: Exception thrown when a feed provider could not be recognised. +msgid "Internal form error: Unrecognized feed provider." +msgstr "Грешка во внатрешниот образец: Ðепрепознаен извор за каналот." + +#. TRANS: Exception thrown when a subscribing to a feed fails. msgid "Could not subscribe to feed." msgstr "Ðе можев да Ве претплатам на каналот." -#. TRANS: Title. +#. TRANS: Page title. msgid "Feed mirror settings" msgstr "Ðагодувања на каналÑкото отÑликување" -#. TRANS: Instructions. +#. TRANS: Page instructions. msgid "" "You can mirror updates from many RSS and Atom feeds into your StatusNet " "timeline!" @@ -73,9 +84,11 @@ msgstr "" "Можете да отÑликувате поднови од многу RSS- и Atom-канали во Вашата " "хронологија на StatusNet!" +#. TRANS: Title for page with form to add a mirror feed provider on. msgid "Provider add" msgstr "ÐдреÑа на уÑлужникот" +#. TRANS: Plugin description. msgid "Pull feeds into your timeline!" msgstr "Повлекувајте каналÑки емитувања во Вашата хронологија!" @@ -88,50 +101,67 @@ msgstr "ОтÑликување" msgid "Configure mirroring of posts from other feeds" msgstr "Ðагодување на отÑликувањето на објавите од други канали" +#. TRANS: Label in profile statistics section, followed by a count. msgid "Mirrored feeds" msgstr "Огледални канали" +#. TRANS: Field label. msgid "Web page or feed URL:" msgstr "Мреж. Ñтраница или URL на каналот:" +#. TRANS: Button text for adding a feed. +#. TRANS: Button text for adding a Twitter feed mirror. msgctxt "BUTTON" msgid "Add feed" msgstr "Додај канал" +#. TRANS: Field label. msgid "Twitter username:" msgstr "КориÑничко име на Twitter:" +#. TRANS: Field label (URL expectected). msgctxt "LABEL" msgid "Remote feed:" msgstr "ДалечинÑки канал:" +#. TRANS: Field label. msgctxt "LABEL" msgid "Local user" msgstr "Локален кориÑник" +#. TRANS: Fieldset legend for feed mirror setting. msgid "Mirroring style" msgstr "Стил на отÑликување" +#. TRANS: Feed mirror style (radio button option). msgid "" -"Repeat: reference the original user's post (sometimes shows as 'RT @blah')" +"Repeat: reference the original user's post (sometimes shows as \"RT @blah\")" msgstr "" "Повторување: наведете ја објавата на изворниот кориÑник (понекогаш Ñе " -"прикажува како „RT @blah“)" +"прикажува како „RT @бла“)" +#. TRANS: Feed mirror style (radio button option). msgid "Repost the content under my account" msgstr "Објави ја Ñодржината под мојата Ñметка" +#. TRANS: Button text to save feed mirror settings. +msgctxt "BUTTON" msgid "Save" msgstr "Зачувај" +#. TRANS: Button text to stop mirroring a feed. +msgctxt "BUTTON" msgid "Stop mirroring" msgstr "ПреÑтани Ñо отÑликување" +#. TRANS: Name for possible feed provider. msgid "Twitter" msgstr "Twitter" +#. TRANS: Name for possible feed provider. msgid "RSS or Atom feed" msgstr "RSS или Atom канал" +#. TRANS: Heading for feed mirroring selection form. msgid "Select a feed provider" msgstr "Одберете емитувач" diff --git a/plugins/SubMirror/locale/nl/LC_MESSAGES/SubMirror.po b/plugins/SubMirror/locale/nl/LC_MESSAGES/SubMirror.po index e95d3ce79f..4003d8e5f4 100644 --- a/plugins/SubMirror/locale/nl/LC_MESSAGES/SubMirror.po +++ b/plugins/SubMirror/locale/nl/LC_MESSAGES/SubMirror.po @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SubMirror\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:30+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:12+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:22+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:33+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-submirror\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -32,12 +32,15 @@ msgstr "Ongeldige URL voor feed: %s." msgid "Invalid profile for mirroring." msgstr "Ongeldig profiel om te spiegelen." +#. TRANS: Client error displayed when trying to mirror a StatusNet group feed. msgid "Cannot mirror a StatusNet group at this time." msgstr "Het is niet mogelijk om een StatusNet-groep te spiegelen." +#. TRANS: Client error displayed when trying to use another method than POST. msgid "This action only accepts POST requests." msgstr "Deze handeling accepteert alleen POST-verzoeken." +#. TRANS: Client error displayed when the session token does not match or is not given. msgid "There was a problem with your session token. Try again, please." msgstr "" "Er is een probleem ontstaan met uw sessie. Probeer het nog een keer, " @@ -47,37 +50,47 @@ msgstr "" msgid "Not logged in." msgstr "Niet aangemeld." +#. TRANS: Page title for subscribed feed mirror. msgid "Subscribed" msgstr "Geabonneerd" +#. TRANS: Client error displayed when trying to edit an object that is not a feed mirror. msgid "Requested invalid profile to edit." msgstr "Er is een ongeldig profiel opgevraagd om te bewerken." +#. TRANS: Client error displayed when providing invalid input when editing a mirror. msgid "Bad form data." msgstr "Onjuiste formuliergegevens." #. TRANS: Client error thrown when a mirror request is made and no result is retrieved. -msgid "Requested edit of missing mirror." -msgstr "Er is een missende spiegel opgevraagd om te bewerken." +msgid "The mirror request failed, because no result was retrieved." +msgstr "Het kopieerverzoek is mislukt omdat er geen resultaat is ontvangen." +#. TRANS: Exception thrown when a feed provider could not be recognised. +msgid "Internal form error: Unrecognized feed provider." +msgstr "Interne formulierfout: onbekende feedprovider." + +#. TRANS: Exception thrown when a subscribing to a feed fails. msgid "Could not subscribe to feed." msgstr "Het abonneren op de feed is mislukt." -#. TRANS: Title. +#. TRANS: Page title. msgid "Feed mirror settings" msgstr "Instellingen voor spiegelfeed" -#. TRANS: Instructions. +#. TRANS: Page instructions. msgid "" "You can mirror updates from many RSS and Atom feeds into your StatusNet " "timeline!" msgstr "" -"U kunt statusupdates vanuit veel RSS- en Atomfeeds spiegelen in uit " +"U kunt statusupdates vanuit veel RSS- en Atomfeeds spiegelen in een " "StatusNet-tijdlijn." +#. TRANS: Title for page with form to add a mirror feed provider on. msgid "Provider add" msgstr "Provider toevoegen" +#. TRANS: Plugin description. msgid "Pull feeds into your timeline!" msgstr "Neem feeds op in uw tijdlijn!" @@ -90,50 +103,67 @@ msgstr "Spiegelen" msgid "Configure mirroring of posts from other feeds" msgstr "Spiegelen instellen voor berichten van andere feeds" +#. TRANS: Label in profile statistics section, followed by a count. msgid "Mirrored feeds" msgstr "Gespiegelde feeds" +#. TRANS: Field label. msgid "Web page or feed URL:" msgstr "URL van webpagina of feed:" +#. TRANS: Button text for adding a feed. +#. TRANS: Button text for adding a Twitter feed mirror. msgctxt "BUTTON" msgid "Add feed" msgstr "Feed toevoegen" +#. TRANS: Field label. msgid "Twitter username:" msgstr "Twitter-gebruikersnaam:" +#. TRANS: Field label (URL expectected). msgctxt "LABEL" msgid "Remote feed:" msgstr "Bronfeed:" +#. TRANS: Field label. msgctxt "LABEL" msgid "Local user" msgstr "Lokale gebruiker" +#. TRANS: Fieldset legend for feed mirror setting. msgid "Mirroring style" msgstr "Spiegelstijl" +#. TRANS: Feed mirror style (radio button option). msgid "" -"Repeat: reference the original user's post (sometimes shows as 'RT @blah')" +"Repeat: reference the original user's post (sometimes shows as \"RT @blah\")" msgstr "" "Herhalen: refereer aan het bericht van de originele gebruiker (wordt soms " "weergegeven als \"RT @blah ...\")" +#. TRANS: Feed mirror style (radio button option). msgid "Repost the content under my account" msgstr "De inhoud herhalen alsof die van mij komt" +#. TRANS: Button text to save feed mirror settings. +msgctxt "BUTTON" msgid "Save" msgstr "Opslaan" +#. TRANS: Button text to stop mirroring a feed. +msgctxt "BUTTON" msgid "Stop mirroring" msgstr "Spiegelen beëindigen" +#. TRANS: Name for possible feed provider. msgid "Twitter" msgstr "Twitter" +#. TRANS: Name for possible feed provider. msgid "RSS or Atom feed" msgstr "RSS- of Atom-feed" +#. TRANS: Heading for feed mirroring selection form. msgid "Select a feed provider" msgstr "Selecteer een feedprovider" diff --git a/plugins/SubMirror/locale/tl/LC_MESSAGES/SubMirror.po b/plugins/SubMirror/locale/tl/LC_MESSAGES/SubMirror.po index 99fe6f4b12..7980949453 100644 --- a/plugins/SubMirror/locale/tl/LC_MESSAGES/SubMirror.po +++ b/plugins/SubMirror/locale/tl/LC_MESSAGES/SubMirror.po @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SubMirror\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:30+0000\n" -"Language-Team: Tagalog \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:12+0000\n" +"Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:22+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:33+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-submirror\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -32,12 +32,15 @@ msgstr "Hindi tanggap na URL ng pasubo: %s." msgid "Invalid profile for mirroring." msgstr "Hindi tanggap na balangkas para sa pagsasalamin." +#. TRANS: Client error displayed when trying to mirror a StatusNet group feed. msgid "Cannot mirror a StatusNet group at this time." msgstr "Hindi maisalamin sa ngayon ang isang pangkat ng StatusNet." +#. TRANS: Client error displayed when trying to use another method than POST. msgid "This action only accepts POST requests." msgstr "Ang galaw na ito ay tumatanggap lamang ng mga kahilingan ng PAGPASKIL." +#. TRANS: Client error displayed when the session token does not match or is not given. msgid "There was a problem with your session token. Try again, please." msgstr "May isang suliranin sa iyong token ng sesyon. Pakisubukan uli." @@ -45,27 +48,36 @@ msgstr "May isang suliranin sa iyong token ng sesyon. Pakisubukan uli." msgid "Not logged in." msgstr "Hindi nakalagda." +#. TRANS: Page title for subscribed feed mirror. msgid "Subscribed" msgstr "Tumanggap ng sipi" +#. TRANS: Client error displayed when trying to edit an object that is not a feed mirror. msgid "Requested invalid profile to edit." msgstr "Hiniling na pamamatnugutang hindi tanggap na balangkas." +#. TRANS: Client error displayed when providing invalid input when editing a mirror. msgid "Bad form data." msgstr "Datong may masamang anyo." #. TRANS: Client error thrown when a mirror request is made and no result is retrieved. -msgid "Requested edit of missing mirror." -msgstr "Hiniling na pagpatnugot ng nawawalang salamin." +msgid "The mirror request failed, because no result was retrieved." +msgstr "Nabigo ang paghiling ng salamin, sapagkat walang nabawing resulta." +#. TRANS: Exception thrown when a feed provider could not be recognised. +msgid "Internal form error: Unrecognized feed provider." +msgstr "" +"Kamalian ng panloob na pormularyo: Hindi nakikilalang tagapagbigay ng pakain." + +#. TRANS: Exception thrown when a subscribing to a feed fails. msgid "Could not subscribe to feed." msgstr "Hindi magawang makatanggap ng pakain." -#. TRANS: Title. +#. TRANS: Page title. msgid "Feed mirror settings" msgstr "Mga katakdaan ng salamin ng pakain" -#. TRANS: Instructions. +#. TRANS: Page instructions. msgid "" "You can mirror updates from many RSS and Atom feeds into your StatusNet " "timeline!" @@ -73,9 +85,11 @@ msgstr "" "Maisasalamin mo ang mga pagsasapanahon mula sa maraming mga pakain ng RSS at " "Atom sa iyong guhit ng panahon ng StatusNet!" +#. TRANS: Title for page with form to add a mirror feed provider on. msgid "Provider add" msgstr "Dagdag ng tagapagbigay" +#. TRANS: Plugin description. msgid "Pull feeds into your timeline!" msgstr "Hilahin ang mga pakain papasok sa iyong guhit ng panahon!" @@ -88,50 +102,67 @@ msgstr "Sinasalamin" msgid "Configure mirroring of posts from other feeds" msgstr "Iayos ang pagsasalamin ng mga pagpapaskil mula sa ibang mga pakain" +#. TRANS: Label in profile statistics section, followed by a count. msgid "Mirrored feeds" msgstr "Naisalaming mga pasubo" +#. TRANS: Field label. msgid "Web page or feed URL:" msgstr "URL ng pahina sa web o pakain:" +#. TRANS: Button text for adding a feed. +#. TRANS: Button text for adding a Twitter feed mirror. msgctxt "BUTTON" msgid "Add feed" msgstr "Idagdag ang pakain" +#. TRANS: Field label. msgid "Twitter username:" msgstr "Pangalan ng tagagamit sa Twitter:" +#. TRANS: Field label (URL expectected). msgctxt "LABEL" msgid "Remote feed:" msgstr "Pakaing malayo:" +#. TRANS: Field label. msgctxt "LABEL" msgid "Local user" msgstr "Katutubong tagagamit" +#. TRANS: Fieldset legend for feed mirror setting. msgid "Mirroring style" msgstr "Estilo ng pagsasalamin" +#. TRANS: Feed mirror style (radio button option). msgid "" -"Repeat: reference the original user's post (sometimes shows as 'RT @blah')" +"Repeat: reference the original user's post (sometimes shows as \"RT @blah\")" msgstr "" -"Ulitin: sangguniin ang orihinal na pagpapaskil ng tagagamit (minsang " -"ipinapakita bilang 'RT @blah')" +"Ulitin: tukuyin ang orihinal na paskil ng tagagamit (minsang ipinapakita " +"bilang \"RT @blah\")" +#. TRANS: Feed mirror style (radio button option). msgid "Repost the content under my account" msgstr "Muling ipaskil ang nilalaman sa ilalim ng aking akawnt" +#. TRANS: Button text to save feed mirror settings. +msgctxt "BUTTON" msgid "Save" msgstr "Sagipin" +#. TRANS: Button text to stop mirroring a feed. +msgctxt "BUTTON" msgid "Stop mirroring" -msgstr "Ihinto ang pagsasalamin" +msgstr "Ihinto ang pagpapasalamin" +#. TRANS: Name for possible feed provider. msgid "Twitter" msgstr "Twitter" +#. TRANS: Name for possible feed provider. msgid "RSS or Atom feed" msgstr "RSS o pasubong Atom" +#. TRANS: Heading for feed mirroring selection form. msgid "Select a feed provider" msgstr "Pumili ng isang tagapagbigay ng pasubo" diff --git a/plugins/SubMirror/locale/uk/LC_MESSAGES/SubMirror.po b/plugins/SubMirror/locale/uk/LC_MESSAGES/SubMirror.po index 1eb76faf2f..dec9cbff17 100644 --- a/plugins/SubMirror/locale/uk/LC_MESSAGES/SubMirror.po +++ b/plugins/SubMirror/locale/uk/LC_MESSAGES/SubMirror.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SubMirror to Ukrainian (УкраїнÑька) +# Translation of StatusNet - SubMirror to Ukrainian (українÑька) # Exported from translatewiki.net # # Author: Boogie @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SubMirror\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:30+0000\n" -"Language-Team: Ukrainian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:12+0000\n" +"Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:22+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:33+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-submirror\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " @@ -33,12 +33,15 @@ msgstr "Помилкова URL-адреÑа Ñтрічки: %s." msgid "Invalid profile for mirroring." msgstr "Помилковий профіль Ð´Ð»Ñ Ð²Ñ–Ð´Ð´Ð·ÐµÑ€ÐºÐ°Ð»ÐµÐ½Ð½Ñ." +#. TRANS: Client error displayed when trying to mirror a StatusNet group feed. msgid "Cannot mirror a StatusNet group at this time." msgstr "Ðа даний момент не можу віддзеркалювати Ñпільноту на Ñайті StatusNet." +#. TRANS: Client error displayed when trying to use another method than POST. msgid "This action only accepts POST requests." msgstr "Ð¦Ñ Ð´Ñ–Ñ Ð¿Ñ€Ð¸Ð¹Ð¼Ð°Ñ” запити лише за формою POST." +#. TRANS: Client error displayed when the session token does not match or is not given. msgid "There was a problem with your session token. Try again, please." msgstr "Виникли певні проблеми з токеном ÑеÑÑ–Ñ—. Спробуйте знов, будь лаÑка." @@ -46,27 +49,35 @@ msgstr "Виникли певні проблеми з токеном ÑеÑÑ–Ñ—. msgid "Not logged in." msgstr "Ви не увійшли до ÑиÑтеми." +#. TRANS: Page title for subscribed feed mirror. msgid "Subscribed" msgstr "ПідпиÑані" +#. TRANS: Client error displayed when trying to edit an object that is not a feed mirror. msgid "Requested invalid profile to edit." msgstr "Було запитано невірний профіль Ð´Ð»Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ." +#. TRANS: Client error displayed when providing invalid input when editing a mirror. msgid "Bad form data." msgstr "Ðевірні дані форми." #. TRANS: Client error thrown when a mirror request is made and no result is retrieved. -msgid "Requested edit of missing mirror." -msgstr "Запитано Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð½Ð¸ÐºÐ»Ð¾Ð³Ð¾ дзеркала." +msgid "The mirror request failed, because no result was retrieved." +msgstr "" +#. TRANS: Exception thrown when a feed provider could not be recognised. +msgid "Internal form error: Unrecognized feed provider." +msgstr "" + +#. TRANS: Exception thrown when a subscribing to a feed fails. msgid "Could not subscribe to feed." msgstr "Ðе можу підпиÑатиÑÑ Ð´Ð¾ веб-Ñтрічки." -#. TRANS: Title. +#. TRANS: Page title. msgid "Feed mirror settings" msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð·ÐµÑ€ÐºÐ°Ð»Ð° веб-Ñтрічки" -#. TRANS: Instructions. +#. TRANS: Page instructions. msgid "" "You can mirror updates from many RSS and Atom feeds into your StatusNet " "timeline!" @@ -74,9 +85,11 @@ msgstr "" "Ви маєте можливіÑÑ‚ÑŒ віддзеркалювати Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð±Ð°Ð³Ð°Ñ‚ÑŒÐ¾Ñ… веб-Ñтрічок формату " "RSS або Atom одразу до Ñтрічки Ñвоїх допиÑів на Ñайті StatusNet!" +#. TRANS: Title for page with form to add a mirror feed provider on. msgid "Provider add" msgstr "Додати провайдера" +#. TRANS: Plugin description. msgid "Pull feeds into your timeline!" msgstr "СтÑÐ³ÑƒÐ²Ð°Ð½Ð½Ñ Ð²ÐµÐ±-каналів до вашої Ñтрічки повідомлень!" @@ -89,50 +102,70 @@ msgstr "Дзеркала" msgid "Configure mirroring of posts from other feeds" msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð²Ñ–Ð´Ð´Ð·ÐµÑ€ÐºÐ°Ð»ÐµÐ½Ð½Ñ Ð´Ð¾Ð¿Ð¸Ñів з інших веб-Ñтрічок" +#. TRANS: Label in profile statistics section, followed by a count. msgid "Mirrored feeds" msgstr "Дзеркала" +#. TRANS: Field label. msgid "Web page or feed URL:" msgstr "Веб-Ñторінка або ж URL-адреÑа Ñтрічки:" +#. TRANS: Button text for adding a feed. +#. TRANS: Button text for adding a Twitter feed mirror. msgctxt "BUTTON" msgid "Add feed" msgstr "Додати веб-Ñтрічку" +#. TRANS: Field label. msgid "Twitter username:" msgstr "Ð†Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Twitter:" +#. TRANS: Field label (URL expectected). msgctxt "LABEL" msgid "Remote feed:" msgstr "Віддалена веб-Ñтрічка:" +#. TRANS: Field label. msgctxt "LABEL" msgid "Local user" msgstr "Тутешній кориÑтувач" +#. TRANS: Fieldset legend for feed mirror setting. msgid "Mirroring style" msgstr "Форма віддзеркаленнÑ" +#. TRANS: Feed mirror style (radio button option). +#, fuzzy msgid "" -"Repeat: reference the original user's post (sometimes shows as 'RT @blah')" +"Repeat: reference the original user's post (sometimes shows as \"RT @blah\")" msgstr "" "ПовтореннÑ: поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð´Ð¾ оригінального допиÑу кориÑтувача (щоÑÑŒ на зразок «RT " "@pupkin»)" +#. TRANS: Feed mirror style (radio button option). msgid "Repost the content under my account" msgstr "ÐŸÐ¾Ð²Ñ‚Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ñту під моїм акаунтом" +#. TRANS: Button text to save feed mirror settings. +#, fuzzy +msgctxt "BUTTON" msgid "Save" msgstr "Зберегти" +#. TRANS: Button text to stop mirroring a feed. +#, fuzzy +msgctxt "BUTTON" msgid "Stop mirroring" msgstr "Зупинити віддзеркаленнÑ" +#. TRANS: Name for possible feed provider. msgid "Twitter" msgstr "Twitter" +#. TRANS: Name for possible feed provider. msgid "RSS or Atom feed" msgstr "Стрічка у форматі RSS або Atom" +#. TRANS: Heading for feed mirroring selection form. msgid "Select a feed provider" msgstr "Виберіть канал поÑтачальника" diff --git a/plugins/SubscriptionThrottle/SubscriptionThrottlePlugin.php b/plugins/SubscriptionThrottle/SubscriptionThrottlePlugin.php index e898ce9ae0..9e6fc9cab7 100644 --- a/plugins/SubscriptionThrottle/SubscriptionThrottlePlugin.php +++ b/plugins/SubscriptionThrottle/SubscriptionThrottlePlugin.php @@ -44,7 +44,6 @@ if (!defined('STATUSNET')) { * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @link http://status.net/ */ - class SubscriptionThrottlePlugin extends Plugin { public $subLimits = array(86400 => 100, @@ -61,7 +60,6 @@ class SubscriptionThrottlePlugin extends Plugin * * @return boolean hook value */ - function onStartSubscribe($user, $other) { foreach ($this->subLimits as $seconds => $limit) { @@ -71,7 +69,8 @@ class SubscriptionThrottlePlugin extends Plugin $subtime = strtotime($sub->created); $now = time(); if ($now - $subtime < $seconds) { - throw new Exception(_m("Too many subscriptions. Take a break and try again later.")); + // TRANS: Exception thrown when subscribing too quickly. + throw new Exception(_m('Too many subscriptions. Take a break and try again later.')); } } } @@ -82,22 +81,22 @@ class SubscriptionThrottlePlugin extends Plugin /** * Filter group joins to see if they're coming too fast. * - * @param Group $group The group being joined - * @param User $user The user joining + * @param Group $group The group being joined + * @param Profile $profile The profile joining * * @return boolean hook value */ - - function onStartJoinGroup($group, $user) + function onStartJoinGroup($group, $profile) { foreach ($this->groupLimits as $seconds => $limit) { - $mem = $this->_getNthMem($user, $limit); + $mem = $this->_getNthMem($profile, $limit); if (!empty($mem)) { $jointime = strtotime($mem->created); $now = time(); if ($now - $jointime < $seconds) { - throw new Exception(_m("Too many memberships. Take a break and try again later.")); + // TRANS: Exception thrown when joing groups too quickly. + throw new Exception(_m('Too many memberships. Take a break and try again later.')); } } } @@ -113,7 +112,6 @@ class SubscriptionThrottlePlugin extends Plugin * * @return Subscription a subscription or null */ - private function _getNthSub($user, $n) { $sub = new Subscription(); @@ -132,17 +130,16 @@ class SubscriptionThrottlePlugin extends Plugin /** * Get the Nth most recent group membership for this user * - * @param User $user The user to get memberships for - * @param integer $n How far to count back + * @param Profile $profile The user to get memberships for + * @param integer $n How far to count back * * @return Group_member a membership or null */ - - private function _getNthMem($user, $n) + private function _getNthMem($profile, $n) { $mem = new Group_member(); - $mem->profile_id = $user->id; + $mem->profile_id = $profile->id; $mem->orderBy('created DESC'); $mem->limit($n - 1, 1); @@ -160,7 +157,6 @@ class SubscriptionThrottlePlugin extends Plugin * * @return boolean hook value */ - function onPluginVersion(&$versions) { $versions[] = array('name' => 'SubscriptionThrottle', @@ -168,8 +164,8 @@ class SubscriptionThrottlePlugin extends Plugin 'author' => 'Evan Prodromou', 'homepage' => 'http://status.net/wiki/Plugin:SubscriptionThrottle', 'rawdescription' => + // TRANS: Plugin description. _m('Configurable limits for subscriptions and group memberships.')); return true; } } - diff --git a/plugins/SubscriptionThrottle/locale/SubscriptionThrottle.pot b/plugins/SubscriptionThrottle/locale/SubscriptionThrottle.pot index 935dbb2697..0d248115c0 100644 --- a/plugins/SubscriptionThrottle/locale/SubscriptionThrottle.pot +++ b/plugins/SubscriptionThrottle/locale/SubscriptionThrottle.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,14 +16,17 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: SubscriptionThrottlePlugin.php:74 +#. TRANS: Exception thrown when subscribing too quickly. +#: SubscriptionThrottlePlugin.php:73 msgid "Too many subscriptions. Take a break and try again later." msgstr "" -#: SubscriptionThrottlePlugin.php:100 +#. TRANS: Exception thrown when joing groups too quickly. +#: SubscriptionThrottlePlugin.php:99 msgid "Too many memberships. Take a break and try again later." msgstr "" -#: SubscriptionThrottlePlugin.php:171 +#. TRANS: Plugin description. +#: SubscriptionThrottlePlugin.php:168 msgid "Configurable limits for subscriptions and group memberships." msgstr "" diff --git a/plugins/SubscriptionThrottle/locale/ca/LC_MESSAGES/SubscriptionThrottle.po b/plugins/SubscriptionThrottle/locale/ca/LC_MESSAGES/SubscriptionThrottle.po index 99b5430921..542f98dfac 100644 --- a/plugins/SubscriptionThrottle/locale/ca/LC_MESSAGES/SubscriptionThrottle.po +++ b/plugins/SubscriptionThrottle/locale/ca/LC_MESSAGES/SubscriptionThrottle.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SubscriptionThrottle to Catalan (Català) +# Translation of StatusNet - SubscriptionThrottle to Catalan (català) # Exported from translatewiki.net # # Author: Toniher @@ -9,23 +9,26 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SubscriptionThrottle\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:31+0000\n" -"Language-Team: Catalan \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:12+0000\n" +"Language-Team: Catalan \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:22+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:27:35+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ca\n" "X-Message-Group: #out-statusnet-plugin-subscriptionthrottle\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Exception thrown when subscribing too quickly. msgid "Too many subscriptions. Take a break and try again later." msgstr "Massa subscripcions. Prengueu alè i torneu-ho a provar més endavant." +#. TRANS: Exception thrown when joing groups too quickly. msgid "Too many memberships. Take a break and try again later." msgstr "Masses pertinències. Prengueu alè i torneu-ho a provar més endavant." +#. TRANS: Plugin description. msgid "Configurable limits for subscriptions and group memberships." -msgstr "" +msgstr "Configura els límits de subscripció i pertinència a grups." diff --git a/plugins/SubscriptionThrottle/locale/de/LC_MESSAGES/SubscriptionThrottle.po b/plugins/SubscriptionThrottle/locale/de/LC_MESSAGES/SubscriptionThrottle.po index c5a5c23833..3ced8154f2 100644 --- a/plugins/SubscriptionThrottle/locale/de/LC_MESSAGES/SubscriptionThrottle.po +++ b/plugins/SubscriptionThrottle/locale/de/LC_MESSAGES/SubscriptionThrottle.po @@ -10,26 +10,29 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SubscriptionThrottle\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:31+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:12+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:22+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:27:35+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-subscriptionthrottle\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Exception thrown when subscribing too quickly. msgid "Too many subscriptions. Take a break and try again later." msgstr "" "Zu viele Abonnements. Mach eine Pause und versuche es später noch einmal." +#. TRANS: Exception thrown when joing groups too quickly. msgid "Too many memberships. Take a break and try again later." msgstr "" "Zu viele Mitgliedschaften. Mach eine Pause und versuche es später noch " "einmal." +#. TRANS: Plugin description. msgid "Configurable limits for subscriptions and group memberships." msgstr "Konfigurierbare Limits für Abonnements und Gruppenmitgliedschaften." diff --git a/plugins/SubscriptionThrottle/locale/es/LC_MESSAGES/SubscriptionThrottle.po b/plugins/SubscriptionThrottle/locale/es/LC_MESSAGES/SubscriptionThrottle.po index 758366a271..ad5c10e0a0 100644 --- a/plugins/SubscriptionThrottle/locale/es/LC_MESSAGES/SubscriptionThrottle.po +++ b/plugins/SubscriptionThrottle/locale/es/LC_MESSAGES/SubscriptionThrottle.po @@ -1,6 +1,7 @@ -# Translation of StatusNet - SubscriptionThrottle to Spanish (Español) +# Translation of StatusNet - SubscriptionThrottle to Spanish (español) # Exported from translatewiki.net # +# Author: Armando-Martin # Author: Translationista # -- # This file is distributed under the same license as the StatusNet package. @@ -9,24 +10,27 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SubscriptionThrottle\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-03-31 21:06+0000\n" -"PO-Revision-Date: 2011-03-31 21:10:38+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:12+0000\n" "Language-Team: Spanish \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:10:02+0000\n" -"X-Generator: MediaWiki 1.18alpha (r85082); Translate extension (2011-03-11)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:27:35+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: es\n" "X-Message-Group: #out-statusnet-plugin-subscriptionthrottle\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Exception thrown when subscribing too quickly. msgid "Too many subscriptions. Take a break and try again later." -msgstr "" +msgstr "Demasiadas subscripciones. Haga una pausa e inténtelo más tarde." +#. TRANS: Exception thrown when joing groups too quickly. msgid "Too many memberships. Take a break and try again later." -msgstr "" +msgstr "Demasiados miembros. Haga una pausa e inténtelo más tarde." +#. TRANS: Plugin description. msgid "Configurable limits for subscriptions and group memberships." msgstr "" "Límites configurables para las suscripciones y adhesiones a los grupos." diff --git a/plugins/SubscriptionThrottle/locale/fr/LC_MESSAGES/SubscriptionThrottle.po b/plugins/SubscriptionThrottle/locale/fr/LC_MESSAGES/SubscriptionThrottle.po index c81eb1100c..9e2bd1868a 100644 --- a/plugins/SubscriptionThrottle/locale/fr/LC_MESSAGES/SubscriptionThrottle.po +++ b/plugins/SubscriptionThrottle/locale/fr/LC_MESSAGES/SubscriptionThrottle.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SubscriptionThrottle to French (Français) +# Translation of StatusNet - SubscriptionThrottle to French (français) # Exported from translatewiki.net # # Author: Peter17 @@ -10,27 +10,30 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SubscriptionThrottle\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:31+0000\n" -"Language-Team: French \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:12+0000\n" +"Language-Team: French \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:22+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:27:35+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-subscriptionthrottle\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Exception thrown when subscribing too quickly. msgid "Too many subscriptions. Take a break and try again later." msgstr "" "Inscriptions trop nombreuses. Faites une pause et essayez à nouveau plus " "tard." +#. TRANS: Exception thrown when joing groups too quickly. msgid "Too many memberships. Take a break and try again later." msgstr "" "Inscriptions trop nombreuses. Faites une pause et essayez à nouveau plus " "tard." +#. TRANS: Plugin description. msgid "Configurable limits for subscriptions and group memberships." msgstr "Limites configurables pour les abonnements et adhésions aux groupes." diff --git a/plugins/SubscriptionThrottle/locale/gl/LC_MESSAGES/SubscriptionThrottle.po b/plugins/SubscriptionThrottle/locale/gl/LC_MESSAGES/SubscriptionThrottle.po new file mode 100644 index 0000000000..4ddbcfdc85 --- /dev/null +++ b/plugins/SubscriptionThrottle/locale/gl/LC_MESSAGES/SubscriptionThrottle.po @@ -0,0 +1,34 @@ +# Translation of StatusNet - SubscriptionThrottle to Galician (galego) +# Exported from translatewiki.net +# +# Author: Toliño +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - SubscriptionThrottle\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:12+0000\n" +"Language-Team: Galician \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-19 11:27:35+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: gl\n" +"X-Message-Group: #out-statusnet-plugin-subscriptionthrottle\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Exception thrown when subscribing too quickly. +msgid "Too many subscriptions. Take a break and try again later." +msgstr "Demasiadas subscricións. Faga unha pausa e inténteo máis tarde." + +#. TRANS: Exception thrown when joing groups too quickly. +msgid "Too many memberships. Take a break and try again later." +msgstr "Demasiados membros. Faga unha pausa e inténteo máis tarde." + +#. TRANS: Plugin description. +msgid "Configurable limits for subscriptions and group memberships." +msgstr "Límites configurables para as subscricións e os membros dos grupos." diff --git a/plugins/SubscriptionThrottle/locale/he/LC_MESSAGES/SubscriptionThrottle.po b/plugins/SubscriptionThrottle/locale/he/LC_MESSAGES/SubscriptionThrottle.po index 9eb4aca936..1ddff7c6c9 100644 --- a/plugins/SubscriptionThrottle/locale/he/LC_MESSAGES/SubscriptionThrottle.po +++ b/plugins/SubscriptionThrottle/locale/he/LC_MESSAGES/SubscriptionThrottle.po @@ -1,6 +1,7 @@ # Translation of StatusNet - SubscriptionThrottle to Hebrew (עברית) # Exported from translatewiki.net # +# Author: Amire80 # Author: YaronSh # -- # This file is distributed under the same license as the StatusNet package. @@ -9,23 +10,26 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SubscriptionThrottle\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-03-31 21:06+0000\n" -"PO-Revision-Date: 2011-03-31 21:10:38+0000\n" -"Language-Team: Hebrew \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:13+0000\n" +"Language-Team: Hebrew \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-03-18 20:10:02+0000\n" -"X-Generator: MediaWiki 1.18alpha (r85082); Translate extension (2011-03-11)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:27:35+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: he\n" "X-Message-Group: #out-statusnet-plugin-subscriptionthrottle\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Exception thrown when subscribing too quickly. msgid "Too many subscriptions. Take a break and try again later." -msgstr "" +msgstr "יותר מדי הרשמות. קח הפסקה ונסה מ×וחר יותר." +#. TRANS: Exception thrown when joing groups too quickly. msgid "Too many memberships. Take a break and try again later." -msgstr "" +msgstr "יותר מדי חברויות. קח הפסקה ונסה מ×וחר יותר." +#. TRANS: Plugin description. msgid "Configurable limits for subscriptions and group memberships." msgstr "הגבלות מינוי וחברות בקבוצות הניתנות להגדרה." diff --git a/plugins/SubscriptionThrottle/locale/ia/LC_MESSAGES/SubscriptionThrottle.po b/plugins/SubscriptionThrottle/locale/ia/LC_MESSAGES/SubscriptionThrottle.po index 1b9b843274..77b9b9524e 100644 --- a/plugins/SubscriptionThrottle/locale/ia/LC_MESSAGES/SubscriptionThrottle.po +++ b/plugins/SubscriptionThrottle/locale/ia/LC_MESSAGES/SubscriptionThrottle.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SubscriptionThrottle to Interlingua (Interlingua) +# Translation of StatusNet - SubscriptionThrottle to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,23 +9,26 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SubscriptionThrottle\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:31+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:13+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:22+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:27:35+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-subscriptionthrottle\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Exception thrown when subscribing too quickly. msgid "Too many subscriptions. Take a break and try again later." msgstr "Troppo de subscriptiones. Face un pausa e reproba plus tarde." +#. TRANS: Exception thrown when joing groups too quickly. msgid "Too many memberships. Take a break and try again later." msgstr "Troppo de membratos. Face un pausa e reproba plus tarde." +#. TRANS: Plugin description. msgid "Configurable limits for subscriptions and group memberships." msgstr "Limites configurabile pro subscriptiones e membrato de gruppos." diff --git a/plugins/SubscriptionThrottle/locale/mk/LC_MESSAGES/SubscriptionThrottle.po b/plugins/SubscriptionThrottle/locale/mk/LC_MESSAGES/SubscriptionThrottle.po index 041fd2524a..713a01584c 100644 --- a/plugins/SubscriptionThrottle/locale/mk/LC_MESSAGES/SubscriptionThrottle.po +++ b/plugins/SubscriptionThrottle/locale/mk/LC_MESSAGES/SubscriptionThrottle.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SubscriptionThrottle to Macedonian (МакедонÑки) +# Translation of StatusNet - SubscriptionThrottle to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 @@ -9,23 +9,26 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SubscriptionThrottle\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:31+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:13+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:22+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:27:35+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-subscriptionthrottle\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" +#. TRANS: Exception thrown when subscribing too quickly. msgid "Too many subscriptions. Take a break and try again later." msgstr "Премногу претплати. Ðаправете пауза и обидете Ñе подоцна." +#. TRANS: Exception thrown when joing groups too quickly. msgid "Too many memberships. Take a break and try again later." msgstr "Премногу членÑтва. Ðаправете пауза и обидете Ñе подоцна." +#. TRANS: Plugin description. msgid "Configurable limits for subscriptions and group memberships." msgstr "Прилагодливи ограничувања за претплата и членÑтва во групи." diff --git a/plugins/SubscriptionThrottle/locale/ms/LC_MESSAGES/SubscriptionThrottle.po b/plugins/SubscriptionThrottle/locale/ms/LC_MESSAGES/SubscriptionThrottle.po index f3af33ab38..5349652b94 100644 --- a/plugins/SubscriptionThrottle/locale/ms/LC_MESSAGES/SubscriptionThrottle.po +++ b/plugins/SubscriptionThrottle/locale/ms/LC_MESSAGES/SubscriptionThrottle.po @@ -9,23 +9,26 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SubscriptionThrottle\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:31+0000\n" -"Language-Team: Malay \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:13+0000\n" +"Language-Team: Malay \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:22+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:27:35+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ms\n" "X-Message-Group: #out-statusnet-plugin-subscriptionthrottle\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Exception thrown when subscribing too quickly. msgid "Too many subscriptions. Take a break and try again later." msgstr "Terlalu banyak langganan. Berehat seketika dan cuba lagi nanti." +#. TRANS: Exception thrown when joing groups too quickly. msgid "Too many memberships. Take a break and try again later." msgstr "Terlalu banyak keahlian. Berehat seketika dan cuba lagi nanti." +#. TRANS: Plugin description. msgid "Configurable limits for subscriptions and group memberships." -msgstr "" +msgstr "Had yang boleh dikonfigurasi untuk langganan dan keahlian kumpulan." diff --git a/plugins/SubscriptionThrottle/locale/nl/LC_MESSAGES/SubscriptionThrottle.po b/plugins/SubscriptionThrottle/locale/nl/LC_MESSAGES/SubscriptionThrottle.po index 31b332f750..dd06a168b7 100644 --- a/plugins/SubscriptionThrottle/locale/nl/LC_MESSAGES/SubscriptionThrottle.po +++ b/plugins/SubscriptionThrottle/locale/nl/LC_MESSAGES/SubscriptionThrottle.po @@ -9,23 +9,26 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SubscriptionThrottle\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:31+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:13+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:22+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:27:35+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-subscriptionthrottle\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Exception thrown when subscribing too quickly. msgid "Too many subscriptions. Take a break and try again later." msgstr "Te veel abonnementen. Wacht even en probeer het later opnieuw." +#. TRANS: Exception thrown when joing groups too quickly. msgid "Too many memberships. Take a break and try again later." msgstr "Te veel lidmaatschappen. Wacht even en probeer het later opnieuw." +#. TRANS: Plugin description. msgid "Configurable limits for subscriptions and group memberships." msgstr "In te stellen limieten voor abonnementen en groepslidmaatschappen." diff --git a/plugins/SubscriptionThrottle/locale/tl/LC_MESSAGES/SubscriptionThrottle.po b/plugins/SubscriptionThrottle/locale/tl/LC_MESSAGES/SubscriptionThrottle.po index 20ae9bf4ef..5695805343 100644 --- a/plugins/SubscriptionThrottle/locale/tl/LC_MESSAGES/SubscriptionThrottle.po +++ b/plugins/SubscriptionThrottle/locale/tl/LC_MESSAGES/SubscriptionThrottle.po @@ -9,24 +9,27 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SubscriptionThrottle\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:31+0000\n" -"Language-Team: Tagalog \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:13+0000\n" +"Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:22+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:27:35+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-subscriptionthrottle\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Exception thrown when subscribing too quickly. msgid "Too many subscriptions. Take a break and try again later." msgstr "Napakaraming mga pagpapasipi. Magpahinga muna at subukan uli mamaya." +#. TRANS: Exception thrown when joing groups too quickly. msgid "Too many memberships. Take a break and try again later." msgstr "Napakaraming mga kasapian. Magpahinga muna at subukan uli mamaya." +#. TRANS: Plugin description. msgid "Configurable limits for subscriptions and group memberships." msgstr "" "Maisasaayos na mga hangganan para sa mga pagtatanggap at mga kasapian sa " diff --git a/plugins/SubscriptionThrottle/locale/uk/LC_MESSAGES/SubscriptionThrottle.po b/plugins/SubscriptionThrottle/locale/uk/LC_MESSAGES/SubscriptionThrottle.po index 08a8618c7a..daa648f97f 100644 --- a/plugins/SubscriptionThrottle/locale/uk/LC_MESSAGES/SubscriptionThrottle.po +++ b/plugins/SubscriptionThrottle/locale/uk/LC_MESSAGES/SubscriptionThrottle.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - SubscriptionThrottle to Ukrainian (УкраїнÑька) +# Translation of StatusNet - SubscriptionThrottle to Ukrainian (українÑька) # Exported from translatewiki.net # # Author: Boogie @@ -9,27 +9,30 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - SubscriptionThrottle\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:31+0000\n" -"Language-Team: Ukrainian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:13+0000\n" +"Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:22+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:27:35+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-subscriptionthrottle\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Exception thrown when subscribing too quickly. msgid "Too many subscriptions. Take a break and try again later." msgstr "Забагато підпиÑок. Випийте поки що кави Ñ– повертайтеÑÑŒ пізніше." +#. TRANS: Exception thrown when joing groups too quickly. msgid "Too many memberships. Take a break and try again later." msgstr "" "Забагато запитів щодо Ð¿Ñ€Ð¸Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð¾ Ñпільноти. Випийте поки що кави Ñ– " "повертайтеÑÑŒ пізніше." +#. TRANS: Plugin description. msgid "Configurable limits for subscriptions and group memberships." msgstr "" "З допомогою цього додатку можна обмежувати кількіÑÑ‚ÑŒ можливих підпиÑок Ð´Ð»Ñ " diff --git a/plugins/TabFocus/TabFocusPlugin.php b/plugins/TabFocus/TabFocusPlugin.php index 1b1d1c2b0a..58f3d06b11 100644 --- a/plugins/TabFocus/TabFocusPlugin.php +++ b/plugins/TabFocus/TabFocusPlugin.php @@ -51,6 +51,7 @@ class TabFocusPlugin extends Plugin 'author' => 'Craig Andrews and Paul Irish', 'homepage' => 'http://status.net/wiki/Plugin:TabFocus', 'rawdescription' => + // TRANS: Plugin description. _m('TabFocus changes the notice form behavior so that, while in the text area, pressing the tab key focuses the "Send" button, matching the behavior of Twitter.')); return true; } diff --git a/plugins/TabFocus/locale/TabFocus.pot b/plugins/TabFocus/locale/TabFocus.pot index 12bf251b23..0ba18a4e37 100644 --- a/plugins/TabFocus/locale/TabFocus.pot +++ b/plugins/TabFocus/locale/TabFocus.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,7 +16,8 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: TabFocusPlugin.php:54 +#. TRANS: Plugin description. +#: TabFocusPlugin.php:55 msgid "" "TabFocus changes the notice form behavior so that, while in the text area, " "pressing the tab key focuses the \"Send\" button, matching the behavior of " diff --git a/plugins/TabFocus/locale/br/LC_MESSAGES/TabFocus.po b/plugins/TabFocus/locale/br/LC_MESSAGES/TabFocus.po index 47f2f60cc7..bb3979cba5 100644 --- a/plugins/TabFocus/locale/br/LC_MESSAGES/TabFocus.po +++ b/plugins/TabFocus/locale/br/LC_MESSAGES/TabFocus.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TabFocus to Breton (Brezhoneg) +# Translation of StatusNet - TabFocus to Breton (brezhoneg) # Exported from translatewiki.net # # Author: Y-M D @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TabFocus\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:32+0000\n" -"Language-Team: Breton \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:13+0000\n" +"Language-Team: Breton \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:23+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:27:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: br\n" "X-Message-Group: #out-statusnet-plugin-tabfocus\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Plugin description. msgid "" "TabFocus changes the notice form behavior so that, while in the text area, " "pressing the tab key focuses the \"Send\" button, matching the behavior of " diff --git a/plugins/TabFocus/locale/de/LC_MESSAGES/TabFocus.po b/plugins/TabFocus/locale/de/LC_MESSAGES/TabFocus.po index 9504076af9..1965ffa230 100644 --- a/plugins/TabFocus/locale/de/LC_MESSAGES/TabFocus.po +++ b/plugins/TabFocus/locale/de/LC_MESSAGES/TabFocus.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TabFocus\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:32+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:13+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:23+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:27:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-tabfocus\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "TabFocus changes the notice form behavior so that, while in the text area, " "pressing the tab key focuses the \"Send\" button, matching the behavior of " diff --git a/plugins/TabFocus/locale/es/LC_MESSAGES/TabFocus.po b/plugins/TabFocus/locale/es/LC_MESSAGES/TabFocus.po index 114cfac12f..6e98556fe9 100644 --- a/plugins/TabFocus/locale/es/LC_MESSAGES/TabFocus.po +++ b/plugins/TabFocus/locale/es/LC_MESSAGES/TabFocus.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TabFocus to Spanish (Español) +# Translation of StatusNet - TabFocus to Spanish (español) # Exported from translatewiki.net # # Author: Translationista @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TabFocus\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:32+0000\n" -"Language-Team: Spanish \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:13+0000\n" +"Language-Team: Spanish \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:23+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:27:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: es\n" "X-Message-Group: #out-statusnet-plugin-tabfocus\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "TabFocus changes the notice form behavior so that, while in the text area, " "pressing the tab key focuses the \"Send\" button, matching the behavior of " diff --git a/plugins/TabFocus/locale/fr/LC_MESSAGES/TabFocus.po b/plugins/TabFocus/locale/fr/LC_MESSAGES/TabFocus.po index 08c00205ba..b009bd34a9 100644 --- a/plugins/TabFocus/locale/fr/LC_MESSAGES/TabFocus.po +++ b/plugins/TabFocus/locale/fr/LC_MESSAGES/TabFocus.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TabFocus to French (Français) +# Translation of StatusNet - TabFocus to French (français) # Exported from translatewiki.net # # Author: Verdy p @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TabFocus\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:32+0000\n" -"Language-Team: French \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:13+0000\n" +"Language-Team: French \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:23+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:27:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-tabfocus\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Plugin description. msgid "" "TabFocus changes the notice form behavior so that, while in the text area, " "pressing the tab key focuses the \"Send\" button, matching the behavior of " diff --git a/plugins/TabFocus/locale/gl/LC_MESSAGES/TabFocus.po b/plugins/TabFocus/locale/gl/LC_MESSAGES/TabFocus.po index 4086bb3b3c..2dff162d9f 100644 --- a/plugins/TabFocus/locale/gl/LC_MESSAGES/TabFocus.po +++ b/plugins/TabFocus/locale/gl/LC_MESSAGES/TabFocus.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TabFocus to Galician (Galego) +# Translation of StatusNet - TabFocus to Galician (galego) # Exported from translatewiki.net # # Author: Toliño @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TabFocus\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:32+0000\n" -"Language-Team: Galician \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:14+0000\n" +"Language-Team: Galician \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:23+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:27:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: gl\n" "X-Message-Group: #out-statusnet-plugin-tabfocus\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "TabFocus changes the notice form behavior so that, while in the text area, " "pressing the tab key focuses the \"Send\" button, matching the behavior of " diff --git a/plugins/TabFocus/locale/he/LC_MESSAGES/TabFocus.po b/plugins/TabFocus/locale/he/LC_MESSAGES/TabFocus.po index ceb46cab07..82d1e1e576 100644 --- a/plugins/TabFocus/locale/he/LC_MESSAGES/TabFocus.po +++ b/plugins/TabFocus/locale/he/LC_MESSAGES/TabFocus.po @@ -1,6 +1,7 @@ # Translation of StatusNet - TabFocus to Hebrew (עברית) # Exported from translatewiki.net # +# Author: Amire80 # Author: YaronSh # -- # This file is distributed under the same license as the StatusNet package. @@ -9,22 +10,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TabFocus\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:32+0000\n" -"Language-Team: Hebrew \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:14+0000\n" +"Language-Team: Hebrew \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:23+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:27:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: he\n" "X-Message-Group: #out-statusnet-plugin-tabfocus\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "TabFocus changes the notice form behavior so that, while in the text area, " "pressing the tab key focuses the \"Send\" button, matching the behavior of " "Twitter." msgstr "" -"התוסף TabFocus משנה ×ת צורת התנהגות ההתרעה כך שבכל זמן שישנה פעילות ב×זור " +"התוסף TabFocus משנה ×ת צורת התנהגות העדכון כך שבכל זמן שישנה פעילות ב×זור " "טקסט לחיצה על לחצן ×”Ö¾tab מתמקדת על הלחצן \"שליחה\", בדומה להתנהגות ב־Twitter." diff --git a/plugins/TabFocus/locale/ia/LC_MESSAGES/TabFocus.po b/plugins/TabFocus/locale/ia/LC_MESSAGES/TabFocus.po index 4bb5282620..e60031ffc4 100644 --- a/plugins/TabFocus/locale/ia/LC_MESSAGES/TabFocus.po +++ b/plugins/TabFocus/locale/ia/LC_MESSAGES/TabFocus.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TabFocus to Interlingua (Interlingua) +# Translation of StatusNet - TabFocus to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TabFocus\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:32+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:14+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:23+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:27:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-tabfocus\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "TabFocus changes the notice form behavior so that, while in the text area, " "pressing the tab key focuses the \"Send\" button, matching the behavior of " diff --git a/plugins/TabFocus/locale/id/LC_MESSAGES/TabFocus.po b/plugins/TabFocus/locale/id/LC_MESSAGES/TabFocus.po index 6a143bc731..ddca3d0738 100644 --- a/plugins/TabFocus/locale/id/LC_MESSAGES/TabFocus.po +++ b/plugins/TabFocus/locale/id/LC_MESSAGES/TabFocus.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TabFocus\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:32+0000\n" -"Language-Team: Indonesian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:14+0000\n" +"Language-Team: Indonesian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:23+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:27:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: id\n" "X-Message-Group: #out-statusnet-plugin-tabfocus\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Plugin description. msgid "" "TabFocus changes the notice form behavior so that, while in the text area, " "pressing the tab key focuses the \"Send\" button, matching the behavior of " diff --git a/plugins/TabFocus/locale/mk/LC_MESSAGES/TabFocus.po b/plugins/TabFocus/locale/mk/LC_MESSAGES/TabFocus.po index 978f08e109..bbfa38f51a 100644 --- a/plugins/TabFocus/locale/mk/LC_MESSAGES/TabFocus.po +++ b/plugins/TabFocus/locale/mk/LC_MESSAGES/TabFocus.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TabFocus to Macedonian (МакедонÑки) +# Translation of StatusNet - TabFocus to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TabFocus\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:32+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:14+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:23+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:27:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-tabfocus\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" +#. TRANS: Plugin description. msgid "" "TabFocus changes the notice form behavior so that, while in the text area, " "pressing the tab key focuses the \"Send\" button, matching the behavior of " @@ -28,4 +29,4 @@ msgid "" msgstr "" "TabFocus го менува поведението на образецот за забелешки: Ñо приÑтиÑкање на " "копчето Tab во меÑтото за текÑÑ‚ Ñе означува копчето „ИÑпрати“, така " -"поÑитоветувајќи Ñе Ñо поведението на Twitter." +"поиÑтоветувајќи Ñе Ñо поведението на Twitter." diff --git a/plugins/TabFocus/locale/nb/LC_MESSAGES/TabFocus.po b/plugins/TabFocus/locale/nb/LC_MESSAGES/TabFocus.po index 9e23332bf0..b71f8b404e 100644 --- a/plugins/TabFocus/locale/nb/LC_MESSAGES/TabFocus.po +++ b/plugins/TabFocus/locale/nb/LC_MESSAGES/TabFocus.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TabFocus to Norwegian (bokmÃ¥l)‬ (‪Norsk (bokmÃ¥l)‬) +# Translation of StatusNet - TabFocus to Norwegian BokmÃ¥l (‪norsk (bokmÃ¥l)‬) # Exported from translatewiki.net # # Author: Nghtwlkr @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TabFocus\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:33+0000\n" -"Language-Team: Norwegian (bokmÃ¥l)‬ \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:14+0000\n" +"Language-Team: Norwegian BokmÃ¥l \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:23+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" -"X-Language-Code: no\n" +"X-POT-Import-Date: 2011-06-19 11:27:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: nb\n" "X-Message-Group: #out-statusnet-plugin-tabfocus\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "TabFocus changes the notice form behavior so that, while in the text area, " "pressing the tab key focuses the \"Send\" button, matching the behavior of " diff --git a/plugins/TabFocus/locale/nl/LC_MESSAGES/TabFocus.po b/plugins/TabFocus/locale/nl/LC_MESSAGES/TabFocus.po index caf437958f..c9eebf40fc 100644 --- a/plugins/TabFocus/locale/nl/LC_MESSAGES/TabFocus.po +++ b/plugins/TabFocus/locale/nl/LC_MESSAGES/TabFocus.po @@ -10,18 +10,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TabFocus\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:32+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:14+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:23+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:27:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-tabfocus\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "TabFocus changes the notice form behavior so that, while in the text area, " "pressing the tab key focuses the \"Send\" button, matching the behavior of " diff --git a/plugins/TabFocus/locale/nn/LC_MESSAGES/TabFocus.po b/plugins/TabFocus/locale/nn/LC_MESSAGES/TabFocus.po index 879941fb52..9f4bd760a4 100644 --- a/plugins/TabFocus/locale/nn/LC_MESSAGES/TabFocus.po +++ b/plugins/TabFocus/locale/nn/LC_MESSAGES/TabFocus.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TabFocus to Norwegian Nynorsk (‪Norsk (nynorsk)‬) +# Translation of StatusNet - TabFocus to Norwegian Nynorsk (‪norsk (nynorsk)‬) # Exported from translatewiki.net # # Author: Sjurhamre @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TabFocus\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:32+0000\n" -"Language-Team: Norwegian Nynorsk \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:14+0000\n" +"Language-Team: Norwegian Nynorsk \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:23+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:27:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nn\n" "X-Message-Group: #out-statusnet-plugin-tabfocus\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "TabFocus changes the notice form behavior so that, while in the text area, " "pressing the tab key focuses the \"Send\" button, matching the behavior of " diff --git a/plugins/TabFocus/locale/ru/LC_MESSAGES/TabFocus.po b/plugins/TabFocus/locale/ru/LC_MESSAGES/TabFocus.po index 7180fa9945..a33bae24b3 100644 --- a/plugins/TabFocus/locale/ru/LC_MESSAGES/TabFocus.po +++ b/plugins/TabFocus/locale/ru/LC_MESSAGES/TabFocus.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TabFocus to Russian (РуÑÑкий) +# Translation of StatusNet - TabFocus to Russian (руÑÑкий) # Exported from translatewiki.net # # Author: ÐлекÑандр Сигачёв @@ -9,19 +9,20 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TabFocus\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:33+0000\n" -"Language-Team: Russian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:14+0000\n" +"Language-Team: Russian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:23+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:27:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ru\n" "X-Message-Group: #out-statusnet-plugin-tabfocus\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Plugin description. msgid "" "TabFocus changes the notice form behavior so that, while in the text area, " "pressing the tab key focuses the \"Send\" button, matching the behavior of " diff --git a/plugins/TabFocus/locale/tl/LC_MESSAGES/TabFocus.po b/plugins/TabFocus/locale/tl/LC_MESSAGES/TabFocus.po index 349f14b9e3..7a230069be 100644 --- a/plugins/TabFocus/locale/tl/LC_MESSAGES/TabFocus.po +++ b/plugins/TabFocus/locale/tl/LC_MESSAGES/TabFocus.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TabFocus\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:33+0000\n" -"Language-Team: Tagalog \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:14+0000\n" +"Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:23+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:27:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-tabfocus\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "TabFocus changes the notice form behavior so that, while in the text area, " "pressing the tab key focuses the \"Send\" button, matching the behavior of " diff --git a/plugins/TabFocus/locale/uk/LC_MESSAGES/TabFocus.po b/plugins/TabFocus/locale/uk/LC_MESSAGES/TabFocus.po index b32e4dc229..34303da26a 100644 --- a/plugins/TabFocus/locale/uk/LC_MESSAGES/TabFocus.po +++ b/plugins/TabFocus/locale/uk/LC_MESSAGES/TabFocus.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TabFocus to Ukrainian (УкраїнÑька) +# Translation of StatusNet - TabFocus to Ukrainian (українÑька) # Exported from translatewiki.net # # Author: Boogie @@ -9,19 +9,20 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TabFocus\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:33+0000\n" -"Language-Team: Ukrainian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:15+0000\n" +"Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:23+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:27:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-tabfocus\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Plugin description. msgid "" "TabFocus changes the notice form behavior so that, while in the text area, " "pressing the tab key focuses the \"Send\" button, matching the behavior of " diff --git a/plugins/TagSub/TagSub.php b/plugins/TagSub/TagSub.php index 9662811bf9..c0c4c1ec86 100644 --- a/plugins/TagSub/TagSub.php +++ b/plugins/TagSub/TagSub.php @@ -42,7 +42,6 @@ if (!defined('STATUSNET')) { * * @see DB_DataObject */ - class TagSub extends Managed_DataObject { public $__table = 'tagsub'; // table name @@ -147,18 +146,18 @@ class TagSub extends Managed_DataObject $keypart = sprintf('tagsub:by_profile:%d', $profile->id); $tagstring = self::cacheGet($keypart); - if ($tagstring !== false && !empty($tagstring)) { - $tags = explode(',', $tagstring); + if ($tagstring !== false) { // cache hit + if (!empty($tagstring)) { + $tags = explode(',', $tagstring); + } } else { - $tagsub = new TagSub(); + $tagsub = new TagSub(); $tagsub->profile_id = $profile->id; + $tagsub->selectAdd(); + $tagsub->selectAdd('tag'); if ($tagsub->find()) { - while ($tagsub->fetch()) { - if (!empty($tagsub->tag)) { - $tags[] = $tagsub->tag; - } - } + $tags = $tagsub->fetchAll('tag'); } self::cacheSet($keypart, implode(',', $tags)); diff --git a/plugins/TagSub/TagSubPlugin.php b/plugins/TagSub/TagSubPlugin.php index 59297a7fb3..b84b208006 100644 --- a/plugins/TagSub/TagSubPlugin.php +++ b/plugins/TagSub/TagSubPlugin.php @@ -192,7 +192,6 @@ class TagSubPlugin extends Plugin * * @return boolean hook return */ - function onEndSubGroupNav($widget) { $action = $widget->out; @@ -218,11 +217,11 @@ class TagSubPlugin extends Plugin if (!empty($tags) && count($tags) > 0) { $tagSubMenu = new TagSubMenu($menu->out, $user, $tags); + // TRANS: Menu item text for tags submenu. $menu->submenu(_m('Tags'), $tagSubMenu); } } return true; } - } diff --git a/plugins/TagSub/locale/TagSub.pot b/plugins/TagSub/locale/TagSub.pot index 561ad9f839..fa401a93e9 100644 --- a/plugins/TagSub/locale/TagSub.pot +++ b/plugins/TagSub/locale/TagSub.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,44 +16,59 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: tagunsubform.php:96 tagunsubform.php:107 +#. TRANS: Form legend. +#: tagunsubform.php:90 msgid "Unsubscribe from this tag" msgstr "" -#: tagunsubform.php:107 +#. TRANS: Submit button text to unsubscribe from a tag. +#: tagunsubform.php:101 msgctxt "BUTTON" msgid "Unsubscribe" msgstr "" +#. TRANS: Submit button title to unsubscribe from a tag. +#: tagunsubform.php:103 +msgid "Unsubscribe from this tag." +msgstr "" + #. TRANS: Plugin description. #: TagSubPlugin.php:129 msgid "Plugin to allow following all messages with a given tag." msgstr "" #. TRANS: SubMirror plugin menu item on user settings page. -#: TagSubPlugin.php:203 +#: TagSubPlugin.php:202 msgctxt "MENU" msgid "Tags" msgstr "" #. TRANS: SubMirror plugin tooltip for user settings menu item. -#: TagSubPlugin.php:205 +#: TagSubPlugin.php:204 msgid "Configure tag subscriptions" msgstr "" +#. TRANS: Menu item text for tags submenu. #: TagSubPlugin.php:221 msgid "Tags" msgstr "" -#: tagsubform.php:116 tagsubform.php:140 +#. TRANS: Form legend. +#: tagsubform.php:108 msgid "Subscribe to this tag" msgstr "" -#: tagsubform.php:140 +#. TRANS: Submit button text to subscribe to a tag. +#: tagsubform.php:131 msgctxt "BUTTON" msgid "Subscribe" msgstr "" +#. TRANS: Submit button title to subscribe to a tag. +#: tagsubform.php:133 +msgid "Subscribe to this tag." +msgstr "" + #. TRANS: Page title when tag unsubscription succeeded. #: tagunsubaction.php:76 msgid "Unsubscribed" @@ -131,10 +146,12 @@ msgstr "" #. TRANS: as an anonymous user. %s is the user nickname. #: tagsubsaction.php:124 tagsubsaction.php:130 #, php-format -msgid "%s is not listening to any tags." +msgid "%s is not following any tags." msgstr "" -#: tagsubsaction.php:168 +#. TRANS: %1$s is a URL to a tag, %2$s is a tag, +#. TRANS: %3$s a date string. +#: tagsubsaction.php:170 #, php-format -msgid "#%s since %s" +msgid "#%2$s since %3$s" msgstr "" diff --git a/plugins/TagSub/locale/ar/LC_MESSAGES/TagSub.po b/plugins/TagSub/locale/ar/LC_MESSAGES/TagSub.po new file mode 100644 index 0000000000..f953b6c527 --- /dev/null +++ b/plugins/TagSub/locale/ar/LC_MESSAGES/TagSub.po @@ -0,0 +1,141 @@ +# Translation of StatusNet - TagSub to Arabic (العربية) +# Exported from translatewiki.net +# +# Author: OsamaK +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - TagSub\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:15+0000\n" +"Language-Team: Arabic \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:51:31+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: ar\n" +"X-Message-Group: #out-statusnet-plugin-tagsub\n" +"Plural-Forms: nplurals=6; plural=(n == 0) ? 0 : ( (n == 1) ? 1 : ( (n == " +"2) ? 2 : ( (n%100 >= 3 && n%100 <= 10) ? 3 : ( (n%100 >= 11 && n%100 <= " +"99) ? 4 : 5 ) ) ) );\n" + +#. TRANS: Form legend. +msgid "Unsubscribe from this tag" +msgstr "" + +#. TRANS: Submit button text to unsubscribe from a tag. +msgctxt "BUTTON" +msgid "Unsubscribe" +msgstr "ألغ٠الاشتراك" + +#. TRANS: Submit button title to unsubscribe from a tag. +msgid "Unsubscribe from this tag." +msgstr "" + +#. TRANS: Plugin description. +msgid "Plugin to allow following all messages with a given tag." +msgstr "" + +#. TRANS: SubMirror plugin menu item on user settings page. +msgctxt "MENU" +msgid "Tags" +msgstr "الوسوم" + +#. TRANS: SubMirror plugin tooltip for user settings menu item. +msgid "Configure tag subscriptions" +msgstr "" + +#. TRANS: Menu item text for tags submenu. +msgid "Tags" +msgstr "الوسوم" + +#. TRANS: Form legend. +msgid "Subscribe to this tag" +msgstr "اشتراك بهذا الوسم" + +#. TRANS: Submit button text to subscribe to a tag. +msgctxt "BUTTON" +msgid "Subscribe" +msgstr "اشترك" + +#. TRANS: Submit button title to subscribe to a tag. +msgid "Subscribe to this tag." +msgstr "اشترك بهذا الوسم." + +#. TRANS: Page title when tag unsubscription succeeded. +msgid "Unsubscribed" +msgstr "Ø£Ùلغيَ الاشتراك" + +#. TRANS: Client error displayed trying to perform any request method other than POST. +#. TRANS: Do not translate POST. +msgid "This action only accepts POST requests." +msgstr "" + +#. TRANS: Client error displayed when the session token is not okay. +msgid "There was a problem with your session token. Try again, please." +msgstr "" + +#. TRANS: Error message displayed when trying to perform an action that requires a logged in user. +msgid "Not logged in." +msgstr "لست والجًا." + +#. TRANS: Client error displayed trying to subscribe to a non-existing profile. +msgid "No such profile." +msgstr "" + +#. TRANS: Page title when tag subscription succeeded. +msgid "Subscribed" +msgstr "Ù…Ùشترك" + +#. TRANS: Header for subscriptions overview for a user (first page). +#. TRANS: %s is a user nickname. +#, php-format +msgid "%s's tag subscriptions" +msgstr "" + +#. TRANS: Header for subscriptions overview for a user (not first page). +#. TRANS: %1$s is a user nickname, %2$d is the page number. +#, php-format +msgid "%1$s's tag subscriptions, page %2$d" +msgstr "" + +#. TRANS: Page notice for page with an overview of all tag subscriptions +#. TRANS: of the logged in user's own profile. +msgid "" +"You have subscribed to receive all notices on this site containing the " +"following tags:" +msgstr "" + +#. TRANS: Page notice for page with an overview of all subscriptions of a user other +#. TRANS: than the logged in user. %s is the user nickname. +#, php-format +msgid "" +"%s has subscribed to receive all notices on this site containing the " +"following tags:" +msgstr "" + +#. TRANS: Tag subscription list text when the logged in user has no tag subscriptions. +msgid "" +"You are not listening to any hash tags right now. You can push the " +"\"Subscribe\" button on any hashtag page to automatically receive any public " +"messages on this site that use that tag, even if you are not subscribed to " +"the poster." +msgstr "" + +#. TRANS: Tag subscription list text when looking at the subscriptions for a of a user other +#. TRANS: than the logged in user that has no tag subscriptions. %s is the user nickname. +#. TRANS: Subscription list text when looking at the subscriptions for a of a user that has none +#. TRANS: as an anonymous user. %s is the user nickname. +#, php-format +msgid "%s is not following any tags." +msgstr "" + +#. TRANS: %1$s is a URL to a tag, %2$s is a tag, +#. TRANS: %3$s a date string. +#, php-format +msgid "#%2$s since %3$s" +msgstr "" diff --git a/plugins/TagSub/locale/ca/LC_MESSAGES/TagSub.po b/plugins/TagSub/locale/ca/LC_MESSAGES/TagSub.po index 0a1a2abca0..b7243f2821 100644 --- a/plugins/TagSub/locale/ca/LC_MESSAGES/TagSub.po +++ b/plugins/TagSub/locale/ca/LC_MESSAGES/TagSub.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TagSub to Catalan (Català) +# Translation of StatusNet - TagSub to Catalan (català) # Exported from translatewiki.net # # Author: Toniher @@ -9,25 +9,31 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TagSub\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:34+0000\n" -"Language-Team: Catalan \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:15+0000\n" +"Language-Team: Catalan \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:23+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:31+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ca\n" "X-Message-Group: #out-statusnet-plugin-tagsub\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Form legend. msgid "Unsubscribe from this tag" msgstr "Cancel·la la subscripció d'aquesta etiqueta" +#. TRANS: Submit button text to unsubscribe from a tag. msgctxt "BUTTON" msgid "Unsubscribe" msgstr "Cancel·la la subscripció" +#. TRANS: Submit button title to unsubscribe from a tag. +msgid "Unsubscribe from this tag." +msgstr "Deixa la subscripció d'aquesta etiqueta." + #. TRANS: Plugin description. msgid "Plugin to allow following all messages with a given tag." msgstr "" @@ -43,16 +49,23 @@ msgstr "Etiquetes" msgid "Configure tag subscriptions" msgstr "Configura les subscripcions d'etiquetes" +#. TRANS: Menu item text for tags submenu. msgid "Tags" msgstr "Etiquetes" +#. TRANS: Form legend. msgid "Subscribe to this tag" msgstr "Subscriu a aquesta etiqueta" +#. TRANS: Submit button text to subscribe to a tag. msgctxt "BUTTON" msgid "Subscribe" msgstr "Subscriu" +#. TRANS: Submit button title to subscribe to a tag. +msgid "Subscribe to this tag." +msgstr "Subscriu a aquesta etiqueta." + #. TRANS: Page title when tag unsubscription succeeded. msgid "Unsubscribed" msgstr "Dessubscrit" @@ -68,7 +81,7 @@ msgstr "" #. TRANS: Error message displayed when trying to perform an action that requires a logged in user. msgid "Not logged in." -msgstr "" +msgstr "No s'ha iniciat una sessió." #. TRANS: Client error displayed trying to subscribe to a non-existing profile. msgid "No such profile." @@ -82,7 +95,7 @@ msgstr "Subscrit." #. TRANS: %s is a user nickname. #, php-format msgid "%s's tag subscriptions" -msgstr "" +msgstr "Subscripcions d'etiqueta de %s" #. TRANS: Header for subscriptions overview for a user (not first page). #. TRANS: %1$s is a user nickname, %2$d is the page number. @@ -118,9 +131,11 @@ msgstr "" #. TRANS: Subscription list text when looking at the subscriptions for a of a user that has none #. TRANS: as an anonymous user. %s is the user nickname. #, php-format -msgid "%s is not listening to any tags." -msgstr "" +msgid "%s is not following any tags." +msgstr "%s no està seguint cap etiqueta." +#. TRANS: %1$s is a URL to a tag, %2$s is a tag, +#. TRANS: %3$s a date string. #, php-format -msgid "#%s since %s" -msgstr "" +msgid "#%2$s since %3$s" +msgstr "#%2$s des de %3$s" diff --git a/plugins/TagSub/locale/de/LC_MESSAGES/TagSub.po b/plugins/TagSub/locale/de/LC_MESSAGES/TagSub.po index e5da7ac0ad..626a47b1b5 100644 --- a/plugins/TagSub/locale/de/LC_MESSAGES/TagSub.po +++ b/plugins/TagSub/locale/de/LC_MESSAGES/TagSub.po @@ -2,6 +2,7 @@ # Exported from translatewiki.net # # Author: Giftpflanze +# Author: Tiin # -- # This file is distributed under the same license as the StatusNet package. # @@ -9,25 +10,31 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TagSub\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:34+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:15+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:23+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:31+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-tagsub\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Form legend. msgid "Unsubscribe from this tag" msgstr "Dieses Tag abbestellen" +#. TRANS: Submit button text to unsubscribe from a tag. msgctxt "BUTTON" msgid "Unsubscribe" msgstr "Abbestellen" +#. TRANS: Submit button title to unsubscribe from a tag. +msgid "Unsubscribe from this tag." +msgstr "Dieses Tag abbestellen." + #. TRANS: Plugin description. msgid "Plugin to allow following all messages with a given tag." msgstr "" @@ -42,16 +49,23 @@ msgstr "Tags" msgid "Configure tag subscriptions" msgstr "Tagabonnements konfigurieren" +#. TRANS: Menu item text for tags submenu. msgid "Tags" msgstr "Tags" +#. TRANS: Form legend. msgid "Subscribe to this tag" msgstr "Dieses Tag abonnieren" +#. TRANS: Submit button text to subscribe to a tag. msgctxt "BUTTON" msgid "Subscribe" msgstr "Abonnieren" +#. TRANS: Submit button title to subscribe to a tag. +msgid "Subscribe to this tag." +msgstr "Dieses Tag abonnieren." + #. TRANS: Page title when tag unsubscription succeeded. msgid "Unsubscribed" msgstr "Abbestellt" @@ -127,9 +141,11 @@ msgstr "" #. TRANS: Subscription list text when looking at the subscriptions for a of a user that has none #. TRANS: as an anonymous user. %s is the user nickname. #, php-format -msgid "%s is not listening to any tags." +msgid "%s is not following any tags." msgstr "%s verfolgt keine Tags." +#. TRANS: %1$s is a URL to a tag, %2$s is a tag, +#. TRANS: %3$s a date string. #, php-format -msgid "#%s since %s" -msgstr "#%s seit %s" +msgid "#%2$s since %3$s" +msgstr "#%2$s seit %3$s" diff --git a/plugins/TagSub/locale/es/LC_MESSAGES/TagSub.po b/plugins/TagSub/locale/es/LC_MESSAGES/TagSub.po new file mode 100644 index 0000000000..3bcf330d4a --- /dev/null +++ b/plugins/TagSub/locale/es/LC_MESSAGES/TagSub.po @@ -0,0 +1,146 @@ +# Translation of StatusNet - TagSub to Spanish (español) +# Exported from translatewiki.net +# +# Author: Armando-Martin +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - TagSub\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:15+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:51:31+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Form legend. +msgid "Unsubscribe from this tag" +msgstr "Cancelar la subscrición a esta etiqueta" + +#. TRANS: Submit button text to unsubscribe from a tag. +msgctxt "BUTTON" +msgid "Unsubscribe" +msgstr "Cancelar la suscripción" + +#. TRANS: Submit button title to unsubscribe from a tag. +msgid "Unsubscribe from this tag." +msgstr "Cancelar la subscrición a esta etiqueta." + +#. TRANS: Plugin description. +msgid "Plugin to allow following all messages with a given tag." +msgstr "" +"Complemento (plugin) para permitir seguir todos los mensajes con una " +"etiqueta determinada." + +#. TRANS: SubMirror plugin menu item on user settings page. +msgctxt "MENU" +msgid "Tags" +msgstr "Etiquetas" + +#. TRANS: SubMirror plugin tooltip for user settings menu item. +msgid "Configure tag subscriptions" +msgstr "Configurar las suscripciones a las etiquetas" + +#. TRANS: Menu item text for tags submenu. +msgid "Tags" +msgstr "Etiquetas" + +#. TRANS: Form legend. +msgid "Subscribe to this tag" +msgstr "Suscribirse a esta etiqueta" + +#. TRANS: Submit button text to subscribe to a tag. +msgctxt "BUTTON" +msgid "Subscribe" +msgstr "Suscribirse" + +#. TRANS: Submit button title to subscribe to a tag. +msgid "Subscribe to this tag." +msgstr "Suscribirse a esta etiqueta." + +#. TRANS: Page title when tag unsubscription succeeded. +msgid "Unsubscribed" +msgstr "Ha cancelado la suscripción" + +#. TRANS: Client error displayed trying to perform any request method other than POST. +#. TRANS: Do not translate POST. +msgid "This action only accepts POST requests." +msgstr "Esta acción sólo acepta solicitudes POST." + +#. TRANS: Client error displayed when the session token is not okay. +msgid "There was a problem with your session token. Try again, please." +msgstr "Hubo un problema con su contraseña de sesión. Inténtelo de nuevo." + +#. TRANS: Error message displayed when trying to perform an action that requires a logged in user. +msgid "Not logged in." +msgstr "No ha iniciado sesión" + +#. TRANS: Client error displayed trying to subscribe to a non-existing profile. +msgid "No such profile." +msgstr "No existe tal perfil." + +#. TRANS: Page title when tag subscription succeeded. +msgid "Subscribed" +msgstr "Suscrito" + +#. TRANS: Header for subscriptions overview for a user (first page). +#. TRANS: %s is a user nickname. +#, php-format +msgid "%s's tag subscriptions" +msgstr "suscripciones a las etiquetas de %ss" + +#. TRANS: Header for subscriptions overview for a user (not first page). +#. TRANS: %1$s is a user nickname, %2$d is the page number. +#, php-format +msgid "%1$s's tag subscriptions, page %2$d" +msgstr "suscripciones a las etiquetas de %1$s, página %2$d" + +#. TRANS: Page notice for page with an overview of all tag subscriptions +#. TRANS: of the logged in user's own profile. +msgid "" +"You have subscribed to receive all notices on this site containing the " +"following tags:" +msgstr "" +"Se ha suscrito para recibir todos los avisos de este sitio que contengan las " +"etiquetas siguientes:" + +#. TRANS: Page notice for page with an overview of all subscriptions of a user other +#. TRANS: than the logged in user. %s is the user nickname. +#, php-format +msgid "" +"%s has subscribed to receive all notices on this site containing the " +"following tags:" +msgstr "" +"%s se ha suscrito para recibir todos los avisos de este sitio que contengan " +"las etiquetas siguientes:" + +#. TRANS: Tag subscription list text when the logged in user has no tag subscriptions. +msgid "" +"You are not listening to any hash tags right now. You can push the " +"\"Subscribe\" button on any hashtag page to automatically receive any public " +"messages on this site that use that tag, even if you are not subscribed to " +"the poster." +msgstr "" +"No está siguiendo ahora ninguna etiqueta (hashtag). Puede pulsar el botón " +"\"Suscribirse\" en cualquier página de hashtag para recibir automáticamente " +"los mensajes públicos de este sitio que utilicen esa etiqueta, incluso si no " +"está suscrito al autor." + +#. TRANS: Tag subscription list text when looking at the subscriptions for a of a user other +#. TRANS: than the logged in user that has no tag subscriptions. %s is the user nickname. +#. TRANS: Subscription list text when looking at the subscriptions for a of a user that has none +#. TRANS: as an anonymous user. %s is the user nickname. +#, php-format +msgid "%s is not following any tags." +msgstr "%s no está siguiendo ninguna etiqueta." + +#. TRANS: %1$s is a URL to a tag, %2$s is a tag, +#. TRANS: %3$s a date string. +#, php-format +msgid "#%2$s since %3$s" +msgstr "#%2$s desde %3$s" diff --git a/plugins/TagSub/locale/eu/LC_MESSAGES/TagSub.po b/plugins/TagSub/locale/eu/LC_MESSAGES/TagSub.po new file mode 100644 index 0000000000..07771dfb49 --- /dev/null +++ b/plugins/TagSub/locale/eu/LC_MESSAGES/TagSub.po @@ -0,0 +1,136 @@ +# Translation of StatusNet - TagSub to Basque (euskara) +# Exported from translatewiki.net +# +# Author: Artsuaga +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - TagSub\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:15+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:51:31+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Form legend. +msgid "Unsubscribe from this tag" +msgstr "Etiketa hontara harpidetza kendu" + +#. TRANS: Submit button text to unsubscribe from a tag. +msgctxt "BUTTON" +msgid "Unsubscribe" +msgstr "Harpidetza kendu" + +#. TRANS: Submit button title to unsubscribe from a tag. +msgid "Unsubscribe from this tag." +msgstr "Etiketa hontara harpidetza kendu." + +#. TRANS: Plugin description. +msgid "Plugin to allow following all messages with a given tag." +msgstr "" + +#. TRANS: SubMirror plugin menu item on user settings page. +msgctxt "MENU" +msgid "Tags" +msgstr "Etiketak" + +#. TRANS: SubMirror plugin tooltip for user settings menu item. +msgid "Configure tag subscriptions" +msgstr "Konfiguratu etiketetara harpidetzak" + +#. TRANS: Menu item text for tags submenu. +msgid "Tags" +msgstr "Etiketak" + +#. TRANS: Form legend. +msgid "Subscribe to this tag" +msgstr "Harpidetu etiketa honetara" + +#. TRANS: Submit button text to subscribe to a tag. +msgctxt "BUTTON" +msgid "Subscribe" +msgstr "Harpidetu" + +#. TRANS: Submit button title to subscribe to a tag. +msgid "Subscribe to this tag." +msgstr "Harpidetu etiketa honetara." + +#. TRANS: Page title when tag unsubscription succeeded. +msgid "Unsubscribed" +msgstr "Harpidetu gabea" + +#. TRANS: Client error displayed trying to perform any request method other than POST. +#. TRANS: Do not translate POST. +msgid "This action only accepts POST requests." +msgstr "Ekintza honek POST eskariak soilik onartzen ditu." + +#. TRANS: Client error displayed when the session token is not okay. +msgid "There was a problem with your session token. Try again, please." +msgstr "Arazoa egon da zure saio-tokenarekin. Saiatu berriro, mesedez." + +#. TRANS: Error message displayed when trying to perform an action that requires a logged in user. +msgid "Not logged in." +msgstr "Saioa hasi gabe." + +#. TRANS: Client error displayed trying to subscribe to a non-existing profile. +msgid "No such profile." +msgstr "Profil hori ez dago." + +#. TRANS: Page title when tag subscription succeeded. +msgid "Subscribed" +msgstr "Harpidetua" + +#. TRANS: Header for subscriptions overview for a user (first page). +#. TRANS: %s is a user nickname. +#, php-format +msgid "%s's tag subscriptions" +msgstr "%s(r)en etiketa harpidetzak" + +#. TRANS: Header for subscriptions overview for a user (not first page). +#. TRANS: %1$s is a user nickname, %2$d is the page number. +#, fuzzy, php-format +msgid "%1$s's tag subscriptions, page %2$d" +msgstr "%1$s(r)en etiketa harpidetzak, 2$s. orria" + +#. TRANS: Page notice for page with an overview of all tag subscriptions +#. TRANS: of the logged in user's own profile. +msgid "" +"You have subscribed to receive all notices on this site containing the " +"following tags:" +msgstr "" + +#. TRANS: Page notice for page with an overview of all subscriptions of a user other +#. TRANS: than the logged in user. %s is the user nickname. +#, php-format +msgid "" +"%s has subscribed to receive all notices on this site containing the " +"following tags:" +msgstr "" + +#. TRANS: Tag subscription list text when the logged in user has no tag subscriptions. +msgid "" +"You are not listening to any hash tags right now. You can push the " +"\"Subscribe\" button on any hashtag page to automatically receive any public " +"messages on this site that use that tag, even if you are not subscribed to " +"the poster." +msgstr "" + +#. TRANS: Tag subscription list text when looking at the subscriptions for a of a user other +#. TRANS: than the logged in user that has no tag subscriptions. %s is the user nickname. +#. TRANS: Subscription list text when looking at the subscriptions for a of a user that has none +#. TRANS: as an anonymous user. %s is the user nickname. +#, php-format +msgid "%s is not following any tags." +msgstr "%s ez da ari etiketarik jarraitzen." + +#. TRANS: %1$s is a URL to a tag, %2$s is a tag, +#. TRANS: %3$s a date string. +#, php-format +msgid "#%2$s since %3$s" +msgstr "#%2$s %3$s(e)tik" diff --git a/plugins/TagSub/locale/fr/LC_MESSAGES/TagSub.po b/plugins/TagSub/locale/fr/LC_MESSAGES/TagSub.po new file mode 100644 index 0000000000..a3cf26b6ba --- /dev/null +++ b/plugins/TagSub/locale/fr/LC_MESSAGES/TagSub.po @@ -0,0 +1,148 @@ +# Translation of StatusNet - TagSub to French (français) +# Exported from translatewiki.net +# +# Author: Brunoperel +# Author: Gomoko +# Author: Od1n +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - TagSub\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:15+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:51:31+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. TRANS: Form legend. +msgid "Unsubscribe from this tag" +msgstr "Se désinscrire de cette balise" + +#. TRANS: Submit button text to unsubscribe from a tag. +msgctxt "BUTTON" +msgid "Unsubscribe" +msgstr "Se désabonner" + +#. TRANS: Submit button title to unsubscribe from a tag. +msgid "Unsubscribe from this tag." +msgstr "Se désinscrire de cette balise." + +#. TRANS: Plugin description. +msgid "Plugin to allow following all messages with a given tag." +msgstr "" +"Plugin pour permettre de suivre tous les messages avec une balise donnée." + +#. TRANS: SubMirror plugin menu item on user settings page. +msgctxt "MENU" +msgid "Tags" +msgstr "Balises" + +#. TRANS: SubMirror plugin tooltip for user settings menu item. +msgid "Configure tag subscriptions" +msgstr "Configurer les inscriptions aux balises" + +#. TRANS: Menu item text for tags submenu. +msgid "Tags" +msgstr "Balises" + +#. TRANS: Form legend. +msgid "Subscribe to this tag" +msgstr "S'abonner à cette balise" + +#. TRANS: Submit button text to subscribe to a tag. +msgctxt "BUTTON" +msgid "Subscribe" +msgstr "S’abonner" + +#. TRANS: Submit button title to subscribe to a tag. +msgid "Subscribe to this tag." +msgstr "S'abonner à cette balise." + +#. TRANS: Page title when tag unsubscription succeeded. +msgid "Unsubscribed" +msgstr "Désabonné" + +#. TRANS: Client error displayed trying to perform any request method other than POST. +#. TRANS: Do not translate POST. +msgid "This action only accepts POST requests." +msgstr "Cette action n'accepte que les requêtes de type POST." + +#. TRANS: Client error displayed when the session token is not okay. +msgid "There was a problem with your session token. Try again, please." +msgstr "" +"Un problème est survenu avec votre session. Merci d'essayer de nouveau." + +#. TRANS: Error message displayed when trying to perform an action that requires a logged in user. +msgid "Not logged in." +msgstr "Non connecté." + +#. TRANS: Client error displayed trying to subscribe to a non-existing profile. +msgid "No such profile." +msgstr "Profil non trouvé." + +#. TRANS: Page title when tag subscription succeeded. +msgid "Subscribed" +msgstr "Abonné" + +#. TRANS: Header for subscriptions overview for a user (first page). +#. TRANS: %s is a user nickname. +#, php-format +msgid "%s's tag subscriptions" +msgstr "inscriptions à la balise %s" + +#. TRANS: Header for subscriptions overview for a user (not first page). +#. TRANS: %1$s is a user nickname, %2$d is the page number. +#, php-format +msgid "%1$s's tag subscriptions, page %2$d" +msgstr "inscriptions à la balise %1$s, page %2$d" + +#. TRANS: Page notice for page with an overview of all tag subscriptions +#. TRANS: of the logged in user's own profile. +msgid "" +"You have subscribed to receive all notices on this site containing the " +"following tags:" +msgstr "" +"Vous vous êtes inscrit pour recevoir tous les avertissements de ce site " +"correspondant aux balises suivantes:" + +#. TRANS: Page notice for page with an overview of all subscriptions of a user other +#. TRANS: than the logged in user. %s is the user nickname. +#, php-format +msgid "" +"%s has subscribed to receive all notices on this site containing the " +"following tags:" +msgstr "" +"%s s'est inscrit pour recevoir tous les avertissements de ce site contenant " +"les balises suivantes:" + +#. TRANS: Tag subscription list text when the logged in user has no tag subscriptions. +msgid "" +"You are not listening to any hash tags right now. You can push the " +"\"Subscribe\" button on any hashtag page to automatically receive any public " +"messages on this site that use that tag, even if you are not subscribed to " +"the poster." +msgstr "" +"Vous n'êtes désormais plus à l'écoute des balises de hachage. Vous pouvez " +"appuyez sur le bouton \"S'abonner\" sur n'importe quelle page de balise de " +"hachage pour recevoir automatiquement tous les messages publics sur ce site " +"qui utilisent cette balise, même si vous n'êtes pas abonné au publieur." + +#. TRANS: Tag subscription list text when looking at the subscriptions for a of a user other +#. TRANS: than the logged in user that has no tag subscriptions. %s is the user nickname. +#. TRANS: Subscription list text when looking at the subscriptions for a of a user that has none +#. TRANS: as an anonymous user. %s is the user nickname. +#, php-format +msgid "%s is not following any tags." +msgstr "%s ne suit aucune balise." + +#. TRANS: %1$s is a URL to a tag, %2$s is a tag, +#. TRANS: %3$s a date string. +#, php-format +msgid "#%2$s since %3$s" +msgstr "#%2$s depuis %3$s" diff --git a/plugins/TagSub/locale/gl/LC_MESSAGES/TagSub.po b/plugins/TagSub/locale/gl/LC_MESSAGES/TagSub.po new file mode 100644 index 0000000000..aeeb2fc0e6 --- /dev/null +++ b/plugins/TagSub/locale/gl/LC_MESSAGES/TagSub.po @@ -0,0 +1,149 @@ +# Translation of StatusNet - TagSub to Galician (galego) +# Exported from translatewiki.net +# +# Author: Toliño +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - TagSub\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:15+0000\n" +"Language-Team: Galician \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:51:31+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: gl\n" +"X-Message-Group: #out-statusnet-plugin-tagsub\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Form legend. +msgid "Unsubscribe from this tag" +msgstr "Cancelar a subscrición a esta etiqueta" + +#. TRANS: Submit button text to unsubscribe from a tag. +msgctxt "BUTTON" +msgid "Unsubscribe" +msgstr "Cancelar a subscrición" + +#. TRANS: Submit button title to unsubscribe from a tag. +msgid "Unsubscribe from this tag." +msgstr "Cancelar a subscrición a esta etiqueta." + +#. TRANS: Plugin description. +msgid "Plugin to allow following all messages with a given tag." +msgstr "" +"Complemento para permitir seguir todas as mensaxes cunha etiqueta " +"especificada." + +#. TRANS: SubMirror plugin menu item on user settings page. +msgctxt "MENU" +msgid "Tags" +msgstr "Etiquetas" + +#. TRANS: SubMirror plugin tooltip for user settings menu item. +msgid "Configure tag subscriptions" +msgstr "Configurar as subscricións ás etiquetas" + +#. TRANS: Menu item text for tags submenu. +msgid "Tags" +msgstr "Etiquetas" + +#. TRANS: Form legend. +msgid "Subscribe to this tag" +msgstr "Subscribirse a esta etiqueta" + +#. TRANS: Submit button text to subscribe to a tag. +msgctxt "BUTTON" +msgid "Subscribe" +msgstr "Subscribirse" + +#. TRANS: Submit button title to subscribe to a tag. +msgid "Subscribe to this tag." +msgstr "Subscribirse a esta etiqueta." + +#. TRANS: Page title when tag unsubscription succeeded. +msgid "Unsubscribed" +msgstr "Cancelouse a subscrición" + +#. TRANS: Client error displayed trying to perform any request method other than POST. +#. TRANS: Do not translate POST. +msgid "This action only accepts POST requests." +msgstr "Esta acción só permite solicitudes POST." + +#. TRANS: Client error displayed when the session token is not okay. +msgid "There was a problem with your session token. Try again, please." +msgstr "Houbo un erro co seu pase. Inténteo de novo." + +#. TRANS: Error message displayed when trying to perform an action that requires a logged in user. +msgid "Not logged in." +msgstr "Non iniciou sesión." + +#. TRANS: Client error displayed trying to subscribe to a non-existing profile. +msgid "No such profile." +msgstr "Non existe ese perfil." + +#. TRANS: Page title when tag subscription succeeded. +msgid "Subscribed" +msgstr "Subscrito" + +#. TRANS: Header for subscriptions overview for a user (first page). +#. TRANS: %s is a user nickname. +#, php-format +msgid "%s's tag subscriptions" +msgstr "Subscricións a etiquetas de %s" + +#. TRANS: Header for subscriptions overview for a user (not first page). +#. TRANS: %1$s is a user nickname, %2$d is the page number. +#, php-format +msgid "%1$s's tag subscriptions, page %2$d" +msgstr "Subscricións a etiquetas de %1$s, páxina %2$d" + +#. TRANS: Page notice for page with an overview of all tag subscriptions +#. TRANS: of the logged in user's own profile. +msgid "" +"You have subscribed to receive all notices on this site containing the " +"following tags:" +msgstr "" +"Subscribiuse para recibir todas as notas do sitio que conteñan as seguintes " +"etiquetas:" + +#. TRANS: Page notice for page with an overview of all subscriptions of a user other +#. TRANS: than the logged in user. %s is the user nickname. +#, php-format +msgid "" +"%s has subscribed to receive all notices on this site containing the " +"following tags:" +msgstr "" +"%s subscribiuse para recibir todas as notas do sitio que conteñan as " +"seguintes etiquetas:" + +#. TRANS: Tag subscription list text when the logged in user has no tag subscriptions. +msgid "" +"You are not listening to any hash tags right now. You can push the " +"\"Subscribe\" button on any hashtag page to automatically receive any public " +"messages on this site that use that tag, even if you are not subscribed to " +"the poster." +msgstr "" +"Non está a seguir ningunha etiqueta nestes intres. Pode premer no botón " +"\"Subscribirse\" de calquera páxina dalgunha etiqueta para recibir " +"automaticamente calquera mensaxe pública deste sitio que use esa etiqueta, " +"mesmo se non está subscrito ao autor." + +#. TRANS: Tag subscription list text when looking at the subscriptions for a of a user other +#. TRANS: than the logged in user that has no tag subscriptions. %s is the user nickname. +#. TRANS: Subscription list text when looking at the subscriptions for a of a user that has none +#. TRANS: as an anonymous user. %s is the user nickname. +#, php-format +msgid "%s is not following any tags." +msgstr "%s non segue etiqueta ningunha." + +#. TRANS: %1$s is a URL to a tag, %2$s is a tag, +#. TRANS: %3$s a date string. +#, php-format +msgid "#%2$s since %3$s" +msgstr "#%2$s desde %3$s" diff --git a/plugins/TagSub/locale/ia/LC_MESSAGES/TagSub.po b/plugins/TagSub/locale/ia/LC_MESSAGES/TagSub.po index d21ad4a239..ca82002594 100644 --- a/plugins/TagSub/locale/ia/LC_MESSAGES/TagSub.po +++ b/plugins/TagSub/locale/ia/LC_MESSAGES/TagSub.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TagSub to Interlingua (Interlingua) +# Translation of StatusNet - TagSub to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,25 +9,31 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TagSub\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:35+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:15+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:23+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:31+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-tagsub\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Form legend. msgid "Unsubscribe from this tag" msgstr "Cancellar subscription a iste etiquetta" +#. TRANS: Submit button text to unsubscribe from a tag. msgctxt "BUTTON" msgid "Unsubscribe" msgstr "Cancellar subscription" +#. TRANS: Submit button title to unsubscribe from a tag. +msgid "Unsubscribe from this tag." +msgstr "Cancellar subscription a iste etiquetta." + #. TRANS: Plugin description. msgid "Plugin to allow following all messages with a given tag." msgstr "" @@ -43,16 +49,23 @@ msgstr "Etiquettas" msgid "Configure tag subscriptions" msgstr "Configurar subscriptiones a etiquettas" +#. TRANS: Menu item text for tags submenu. msgid "Tags" msgstr "Etiquettas" +#. TRANS: Form legend. msgid "Subscribe to this tag" msgstr "Subscriber a iste etiquetta" +#. TRANS: Submit button text to subscribe to a tag. msgctxt "BUTTON" msgid "Subscribe" msgstr "Subscriber" +#. TRANS: Submit button title to subscribe to a tag. +msgid "Subscribe to this tag." +msgstr "Subscriber a iste etiquetta." + #. TRANS: Page title when tag unsubscription succeeded. msgid "Unsubscribed" msgstr "Subscription cancellate" @@ -126,9 +139,11 @@ msgstr "" #. TRANS: Subscription list text when looking at the subscriptions for a of a user that has none #. TRANS: as an anonymous user. %s is the user nickname. #, php-format -msgid "%s is not listening to any tags." +msgid "%s is not following any tags." msgstr "%s non seque alcun etiquetta." +#. TRANS: %1$s is a URL to a tag, %2$s is a tag, +#. TRANS: %3$s a date string. #, php-format -msgid "#%s since %s" -msgstr "#%s depost %s" +msgid "#%2$s since %3$s" +msgstr "#%2$s depost %3$s" diff --git a/plugins/TagSub/locale/mk/LC_MESSAGES/TagSub.po b/plugins/TagSub/locale/mk/LC_MESSAGES/TagSub.po index 372e7001f8..0375f945f8 100644 --- a/plugins/TagSub/locale/mk/LC_MESSAGES/TagSub.po +++ b/plugins/TagSub/locale/mk/LC_MESSAGES/TagSub.po @@ -1,7 +1,8 @@ -# Translation of StatusNet - TagSub to Macedonian (МакедонÑки) +# Translation of StatusNet - TagSub to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 +# Author: Rancher # -- # This file is distributed under the same license as the StatusNet package. # @@ -9,25 +10,31 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TagSub\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:35+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:16+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:23+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:31+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-tagsub\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" +#. TRANS: Form legend. msgid "Unsubscribe from this tag" msgstr "Отпиши Ñе од ознакава" +#. TRANS: Submit button text to unsubscribe from a tag. msgctxt "BUTTON" msgid "Unsubscribe" msgstr "Откажи претплата" +#. TRANS: Submit button title to unsubscribe from a tag. +msgid "Unsubscribe from this tag." +msgstr "Отпиши Ñе од ознакава." + #. TRANS: Plugin description. msgid "Plugin to allow following all messages with a given tag." msgstr "Приклучок што овозможува да ги Ñледите Ñите пораки Ñо извеÑна ознака." @@ -41,16 +48,23 @@ msgstr "Ознаки" msgid "Configure tag subscriptions" msgstr "Ðагоди претплата на ознаки" +#. TRANS: Menu item text for tags submenu. msgid "Tags" msgstr "Ознаки" +#. TRANS: Form legend. msgid "Subscribe to this tag" msgstr "Претплати Ñе на ознакава" +#. TRANS: Submit button text to subscribe to a tag. msgctxt "BUTTON" msgid "Subscribe" msgstr "Претплати Ñе" +#. TRANS: Submit button title to subscribe to a tag. +msgid "Subscribe to this tag." +msgstr "Претплати Ñе на ознакава." + #. TRANS: Page title when tag unsubscription succeeded. msgid "Unsubscribed" msgstr "Претплатено" @@ -124,9 +138,11 @@ msgstr "" #. TRANS: Subscription list text when looking at the subscriptions for a of a user that has none #. TRANS: as an anonymous user. %s is the user nickname. #, php-format -msgid "%s is not listening to any tags." -msgstr "%s не Ñлуша никакви ознаки." +msgid "%s is not following any tags." +msgstr "%s не Ñледи никакви ознаки." +#. TRANS: %1$s is a URL to a tag, %2$s is a tag, +#. TRANS: %3$s a date string. #, php-format -msgid "#%s since %s" -msgstr "#%s од %s" +msgid "#%2$s since %3$s" +msgstr "#%2$s од %3$s" diff --git a/plugins/TagSub/locale/ms/LC_MESSAGES/TagSub.po b/plugins/TagSub/locale/ms/LC_MESSAGES/TagSub.po index a62fee842c..d3ff313f95 100644 --- a/plugins/TagSub/locale/ms/LC_MESSAGES/TagSub.po +++ b/plugins/TagSub/locale/ms/LC_MESSAGES/TagSub.po @@ -9,25 +9,31 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TagSub\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:35+0000\n" +"POT-Creation-Date: 2011-06-18 15:54+0000\n" +"PO-Revision-Date: 2011-06-18 15:57:46+0000\n" "Language-Team: Malay \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:23+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" +"X-POT-Import-Date: 2011-06-05 21:52:06+0000\n" +"X-Generator: MediaWiki 1.19alpha (r90318); Translate extension (2011-06-02)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ms\n" "X-Message-Group: #out-statusnet-plugin-tagsub\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Form legend. msgid "Unsubscribe from this tag" msgstr "" +#. TRANS: Submit button text to unsubscribe from a tag. msgctxt "BUTTON" msgid "Unsubscribe" msgstr "Berhenti melanggan" +#. TRANS: Submit button title to unsubscribe from a tag. +msgid "Unsubscribe from this tag." +msgstr "" + #. TRANS: Plugin description. msgid "Plugin to allow following all messages with a given tag." msgstr "" @@ -41,17 +47,24 @@ msgstr "Tag" msgid "Configure tag subscriptions" msgstr "" +#. TRANS: Menu item text for tags submenu. #, fuzzy msgid "Tags" msgstr "Tag" +#. TRANS: Form legend. msgid "Subscribe to this tag" msgstr "" +#. TRANS: Submit button text to subscribe to a tag. msgctxt "BUTTON" msgid "Subscribe" msgstr "" +#. TRANS: Submit button title to subscribe to a tag. +msgid "Subscribe to this tag." +msgstr "" + #. TRANS: Page title when tag unsubscription succeeded. msgid "Unsubscribed" msgstr "Langganan dihentikan." @@ -116,10 +129,12 @@ msgstr "" #. TRANS: than the logged in user that has no tag subscriptions. %s is the user nickname. #. TRANS: Subscription list text when looking at the subscriptions for a of a user that has none #. TRANS: as an anonymous user. %s is the user nickname. -#, php-format -msgid "%s is not listening to any tags." +#, fuzzy, php-format +msgid "%s is not following any tags." msgstr "%s tidak mendengari mana-mana tag pun." -#, php-format -msgid "#%s since %s" +#. TRANS: %1$s is a URL to a tag, %2$s is a tag, +#. TRANS: %3$s a date string. +#, fuzzy, php-format +msgid "#%2$s since %3$s" msgstr "#%s sejak %s" diff --git a/plugins/TagSub/locale/nl/LC_MESSAGES/TagSub.po b/plugins/TagSub/locale/nl/LC_MESSAGES/TagSub.po index f6a790fdcd..d12f3db98b 100644 --- a/plugins/TagSub/locale/nl/LC_MESSAGES/TagSub.po +++ b/plugins/TagSub/locale/nl/LC_MESSAGES/TagSub.po @@ -9,25 +9,31 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TagSub\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:35+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:16+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:23+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:31+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-tagsub\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Form legend. msgid "Unsubscribe from this tag" msgstr "Abonnement op dit label beëindigen" +#. TRANS: Submit button text to unsubscribe from a tag. msgctxt "BUTTON" msgid "Unsubscribe" msgstr "Uitschrijven" +#. TRANS: Submit button title to unsubscribe from a tag. +msgid "Unsubscribe from this tag." +msgstr "Het abonnement op dit label beëindigen." + #. TRANS: Plugin description. msgid "Plugin to allow following all messages with a given tag." msgstr "" @@ -43,16 +49,23 @@ msgstr "Labels" msgid "Configure tag subscriptions" msgstr "Labelabonnementen instellen" +#. TRANS: Menu item text for tags submenu. msgid "Tags" msgstr "Labels" +#. TRANS: Form legend. msgid "Subscribe to this tag" msgstr "Op dit label abonneren" +#. TRANS: Submit button text to subscribe to a tag. msgctxt "BUTTON" msgid "Subscribe" msgstr "Abonneren" +#. TRANS: Submit button title to subscribe to a tag. +msgid "Subscribe to this tag." +msgstr "Op dit label abonneren." + #. TRANS: Page title when tag unsubscription succeeded. msgid "Unsubscribed" msgstr "Het abonnement is opgezegd" @@ -128,9 +141,11 @@ msgstr "" #. TRANS: Subscription list text when looking at the subscriptions for a of a user that has none #. TRANS: as an anonymous user. %s is the user nickname. #, php-format -msgid "%s is not listening to any tags." +msgid "%s is not following any tags." msgstr "%s heeft geen labelabonnementen." +#. TRANS: %1$s is a URL to a tag, %2$s is a tag, +#. TRANS: %3$s a date string. #, php-format -msgid "#%s since %s" -msgstr "#%s sinds %s" +msgid "#%2$s since %3$s" +msgstr "#%2$s sinds %3$s" diff --git a/plugins/TagSub/locale/sr-ec/LC_MESSAGES/TagSub.po b/plugins/TagSub/locale/sr-ec/LC_MESSAGES/TagSub.po index 4090e19dbe..c2b03dcfc0 100644 --- a/plugins/TagSub/locale/sr-ec/LC_MESSAGES/TagSub.po +++ b/plugins/TagSub/locale/sr-ec/LC_MESSAGES/TagSub.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TagSub to Serbian Cyrillic ekavian (‪СрпÑки (ћирилица)‬) +# Translation of StatusNet - TagSub to Serbian (Cyrillic script) (‪ÑрпÑки (ћирилица)‬) # Exported from translatewiki.net # # Author: Rancher @@ -9,26 +9,32 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TagSub\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:35+0000\n" -"Language-Team: Serbian Cyrillic ekavian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:23+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:31+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: sr-ec\n" "X-Message-Group: #out-statusnet-plugin-tagsub\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Form legend. msgid "Unsubscribe from this tag" msgstr "Одјави ме Ñ Ð¾Ð²Ðµ ознаке" +#. TRANS: Submit button text to unsubscribe from a tag. msgctxt "BUTTON" msgid "Unsubscribe" msgstr "Одјави ме" +#. TRANS: Submit button title to unsubscribe from a tag. +msgid "Unsubscribe from this tag." +msgstr "Одјави ме Ñ Ð¾Ð²Ðµ ознаке" + #. TRANS: Plugin description. msgid "Plugin to allow following all messages with a given tag." msgstr "Прикључак за праћење Ñвих порука Ñ Ð´Ð°Ñ‚Ð¾Ð¼ ознаком." @@ -42,16 +48,23 @@ msgstr "Ознаке" msgid "Configure tag subscriptions" msgstr "ПодеÑи пријаве за ознаку" +#. TRANS: Menu item text for tags submenu. msgid "Tags" msgstr "Ознаке" +#. TRANS: Form legend. msgid "Subscribe to this tag" msgstr "Пријави ме на ову ознаку" +#. TRANS: Submit button text to subscribe to a tag. msgctxt "BUTTON" msgid "Subscribe" msgstr "Пријави ме" +#. TRANS: Submit button title to subscribe to a tag. +msgid "Subscribe to this tag." +msgstr "Пријави ме на ову ознаку" + #. TRANS: Page title when tag unsubscription succeeded. msgid "Unsubscribed" msgstr "Одјави ме" @@ -126,9 +139,11 @@ msgstr "" #. TRANS: Subscription list text when looking at the subscriptions for a of a user that has none #. TRANS: as an anonymous user. %s is the user nickname. #, php-format -msgid "%s is not listening to any tags." -msgstr "%s не Ñлуша ниједну ознаку." +msgid "%s is not following any tags." +msgstr "%s не прати ниједну ознаку." +#. TRANS: %1$s is a URL to a tag, %2$s is a tag, +#. TRANS: %3$s a date string. #, php-format -msgid "#%s since %s" -msgstr "#%s од %s" +msgid "#%2$s since %3$s" +msgstr "#%2$s од %3$s" diff --git a/plugins/TagSub/locale/te/LC_MESSAGES/TagSub.po b/plugins/TagSub/locale/te/LC_MESSAGES/TagSub.po index 3b326d4ef4..2015c28688 100644 --- a/plugins/TagSub/locale/te/LC_MESSAGES/TagSub.po +++ b/plugins/TagSub/locale/te/LC_MESSAGES/TagSub.po @@ -9,25 +9,32 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TagSub\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:35+0000\n" -"Language-Team: Telugu \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:16+0000\n" +"Language-Team: Telugu \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:23+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:31+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: te\n" "X-Message-Group: #out-statusnet-plugin-tagsub\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Form legend. msgid "Unsubscribe from this tag" msgstr "à°ˆ à°Ÿà±à°¯à°¾à°—à±à°•à°¿ చందావిరమించండి" +#. TRANS: Submit button text to unsubscribe from a tag. msgctxt "BUTTON" msgid "Unsubscribe" msgstr "చందావిరమించà±" +#. TRANS: Submit button title to unsubscribe from a tag. +#, fuzzy +msgid "Unsubscribe from this tag." +msgstr "à°ˆ à°Ÿà±à°¯à°¾à°—à±à°•à°¿ చందావిరమించండి" + #. TRANS: Plugin description. msgid "Plugin to allow following all messages with a given tag." msgstr "" @@ -41,16 +48,24 @@ msgstr "à°Ÿà±à°¯à°¾à°—à±à°²à±" msgid "Configure tag subscriptions" msgstr "" +#. TRANS: Menu item text for tags submenu. msgid "Tags" msgstr "à°Ÿà±à°¯à°¾à°—à±à°²à±" +#. TRANS: Form legend. msgid "Subscribe to this tag" msgstr "à°ˆ ఈటà±à°¯à°¾à°—à±à°•à°¿ చందా చేరండి" +#. TRANS: Submit button text to subscribe to a tag. msgctxt "BUTTON" msgid "Subscribe" msgstr "చందాచేరà±" +#. TRANS: Submit button title to subscribe to a tag. +#, fuzzy +msgid "Subscribe to this tag." +msgstr "à°ˆ ఈటà±à°¯à°¾à°—à±à°•à°¿ చందా చేరండి" + #. TRANS: Page title when tag unsubscription succeeded. msgid "Unsubscribed" msgstr "చందావిరమించారà±" @@ -116,9 +131,11 @@ msgstr "" #. TRANS: Subscription list text when looking at the subscriptions for a of a user that has none #. TRANS: as an anonymous user. %s is the user nickname. #, php-format -msgid "%s is not listening to any tags." +msgid "%s is not following any tags." msgstr "" -#, php-format -msgid "#%s since %s" +#. TRANS: %1$s is a URL to a tag, %2$s is a tag, +#. TRANS: %3$s a date string. +#, fuzzy, php-format +msgid "#%2$s since %3$s" msgstr "#%s %s à°¨à±à°‚à°¡à°¿" diff --git a/plugins/TagSub/locale/tl/LC_MESSAGES/TagSub.po b/plugins/TagSub/locale/tl/LC_MESSAGES/TagSub.po index f963563b6e..0b3bc90c6d 100644 --- a/plugins/TagSub/locale/tl/LC_MESSAGES/TagSub.po +++ b/plugins/TagSub/locale/tl/LC_MESSAGES/TagSub.po @@ -9,25 +9,31 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TagSub\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:35+0000\n" -"Language-Team: Tagalog \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:16+0000\n" +"Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:23+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:31+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-tagsub\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Form legend. msgid "Unsubscribe from this tag" msgstr "Huwag nang magpasipi mula sa tatak na ito" +#. TRANS: Submit button text to unsubscribe from a tag. msgctxt "BUTTON" msgid "Unsubscribe" msgstr "Pahintuin na ang pagtanggap ng sipi" +#. TRANS: Submit button title to unsubscribe from a tag. +msgid "Unsubscribe from this tag." +msgstr "Huwag nang sumipi mula sa tatak na ito." + #. TRANS: Plugin description. msgid "Plugin to allow following all messages with a given tag." msgstr "" @@ -43,16 +49,23 @@ msgstr "Mga tatak" msgid "Configure tag subscriptions" msgstr "Isaayos ang mga pagpapasipi ng tatak" +#. TRANS: Menu item text for tags submenu. msgid "Tags" msgstr "Mga tatak" +#. TRANS: Form legend. msgid "Subscribe to this tag" msgstr "Magpasipi para sa tatak na ito" +#. TRANS: Submit button text to subscribe to a tag. msgctxt "BUTTON" msgid "Subscribe" msgstr "Pumayag na tumanggap ng sipi" +#. TRANS: Submit button title to subscribe to a tag. +msgid "Subscribe to this tag." +msgstr "Sumipi mula sa tatak na ito." + #. TRANS: Page title when tag unsubscription succeeded. msgid "Unsubscribed" msgstr "Hindi na nagpapasipi" @@ -128,9 +141,11 @@ msgstr "" #. TRANS: Subscription list text when looking at the subscriptions for a of a user that has none #. TRANS: as an anonymous user. %s is the user nickname. #, php-format -msgid "%s is not listening to any tags." -msgstr "Si %s ay hindi nakikinig sa anumang mga tatak." +msgid "%s is not following any tags." +msgstr "Hindi sinusundan ni %s ang anumang mga tatak." +#. TRANS: %1$s is a URL to a tag, %2$s is a tag, +#. TRANS: %3$s a date string. #, php-format -msgid "#%s since %s" -msgstr "#%s magmula noong %s" +msgid "#%2$s since %3$s" +msgstr "#%2$s magmula pa noong %3$s" diff --git a/plugins/TagSub/locale/uk/LC_MESSAGES/TagSub.po b/plugins/TagSub/locale/uk/LC_MESSAGES/TagSub.po index fd9e5d7a57..09223782a7 100644 --- a/plugins/TagSub/locale/uk/LC_MESSAGES/TagSub.po +++ b/plugins/TagSub/locale/uk/LC_MESSAGES/TagSub.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TagSub to Ukrainian (УкраїнÑька) +# Translation of StatusNet - TagSub to Ukrainian (українÑька) # Exported from translatewiki.net # # Author: Boogie @@ -9,26 +9,33 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TagSub\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:35+0000\n" -"Language-Team: Ukrainian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:16+0000\n" +"Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:23+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:31+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-tagsub\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Form legend. msgid "Unsubscribe from this tag" msgstr "ВідпиÑатиÑÑ Ð²Ñ–Ð´ цього теґу" +#. TRANS: Submit button text to unsubscribe from a tag. msgctxt "BUTTON" msgid "Unsubscribe" msgstr "ВідпиÑатиÑÑŒ" +#. TRANS: Submit button title to unsubscribe from a tag. +#, fuzzy +msgid "Unsubscribe from this tag." +msgstr "ВідпиÑатиÑÑ Ð²Ñ–Ð´ цього теґу" + #. TRANS: Plugin description. msgid "Plugin to allow following all messages with a given tag." msgstr "Додаток, Ñкий дозволÑÑ” відÑлідковувати допиÑи позначені певним теґом" @@ -42,16 +49,24 @@ msgstr "Теґи" msgid "Configure tag subscriptions" msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñок на теґи" +#. TRANS: Menu item text for tags submenu. msgid "Tags" msgstr "Теґи" +#. TRANS: Form legend. msgid "Subscribe to this tag" msgstr "ПідпиÑатиÑÑ Ð½Ð° цей теґ" +#. TRANS: Submit button text to subscribe to a tag. msgctxt "BUTTON" msgid "Subscribe" msgstr "ПідпиÑатиÑÑŒ" +#. TRANS: Submit button title to subscribe to a tag. +#, fuzzy +msgid "Subscribe to this tag." +msgstr "ПідпиÑатиÑÑ Ð½Ð° цей теґ" + #. TRANS: Page title when tag unsubscription succeeded. msgid "Unsubscribed" msgstr "ВідпиÑано" @@ -122,10 +137,12 @@ msgstr "" #. TRANS: than the logged in user that has no tag subscriptions. %s is the user nickname. #. TRANS: Subscription list text when looking at the subscriptions for a of a user that has none #. TRANS: as an anonymous user. %s is the user nickname. -#, php-format -msgid "%s is not listening to any tags." +#, fuzzy, php-format +msgid "%s is not following any tags." msgstr "%s не підпиÑаний до жодних тегів" -#, php-format -msgid "#%s since %s" +#. TRANS: %1$s is a URL to a tag, %2$s is a tag, +#. TRANS: %3$s a date string. +#, fuzzy, php-format +msgid "#%2$s since %3$s" msgstr "#%s протÑгом %s" diff --git a/plugins/TagSub/tagsubform.php b/plugins/TagSub/tagsubform.php index 169ccc4adb..22eed25801 100644 --- a/plugins/TagSub/tagsubform.php +++ b/plugins/TagSub/tagsubform.php @@ -46,13 +46,11 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { * * @see UnsubscribeForm */ - class TagSubForm extends Form { /** * Name of tag to subscribe to */ - var $tag = ''; /** @@ -61,7 +59,6 @@ class TagSubForm extends Form * @param HTMLOutputter $out output channel * @param string $tag name of tag to subscribe to */ - function __construct($out=null, $tag=null) { parent::__construct($out); @@ -74,38 +71,32 @@ class TagSubForm extends Form * * @return int ID of the form */ - function id() { return 'tag-subscribe-' . $this->tag; } - /** * class of the form * * @return string of the form class */ - function formClass() { // class to match existing styles... return 'form_user_subscribe ajax'; } - /** * Action of the form * * @return string URL of the action */ - function action() { return common_local_url('tagsub', array('tag' => $this->tag)); } - /** * Legend of the Form * @@ -113,6 +104,7 @@ class TagSubForm extends Form */ function formLegend() { + // TRANS: Form legend. $this->out->element('legend', null, _m('Subscribe to this tag')); } @@ -121,7 +113,6 @@ class TagSubForm extends Form * * @return void */ - function formData() { $this->out->hidden('subscribeto-' . $this->tag, @@ -134,9 +125,11 @@ class TagSubForm extends Form * * @return void */ - function formActions() { - $this->out->submit('submit', _m('BUTTON','Subscribe'), 'submit', null, _m('Subscribe to this tag')); + // TRANS: Submit button text to subscribe to a tag. + $this->out->submit('submit', _m('BUTTON','Subscribe'), + // TRANS: Submit button title to subscribe to a tag. + 'submit', null, _m('Subscribe to this tag.')); } } diff --git a/plugins/TagSub/tagsubmenu.php b/plugins/TagSub/tagsubmenu.php index e57a8a8a97..01fa372dd9 100644 --- a/plugins/TagSub/tagsubmenu.php +++ b/plugins/TagSub/tagsubmenu.php @@ -4,7 +4,7 @@ * Copyright (C) 2011, StatusNet, Inc. * * Menu to show tags you're subscribed to - * + * * PHP version 5 * * This program is free software: you can redistribute it and/or modify @@ -44,8 +44,7 @@ if (!defined('STATUSNET')) { * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @link http://status.net/ */ - -class TagSubMenu extends Menu +class TagSubMenu extends MoreMenu { protected $user; protected $tags; @@ -57,22 +56,33 @@ class TagSubMenu extends Menu $this->tags = $tags; } - function show() + function getItems() { - $this->out->elementStart('ul', array('class' => 'nav')); - + $items = array(); + foreach ($this->tags as $tag) { if (!empty($tag)) { - $this->out->menuItem(common_local_url('tag', - array('tag' => $tag)), - sprintf('#%s', $tag), - sprintf(_('Notices tagged with %s'), $tag), - $this->actionName == 'tag' && $this->action->arg('tag') == $tag, - 'nav_streams_tag_'.$tag); + $items[] = array('tag', + array('tag' => $tag), + sprintf('#%s', $tag), + // TRANS: Menu item title. %s is a tag. + sprintf(_('Notices tagged with "%s".'), $tag)); } } - $this->out->elementEnd('ul'); + return $items; + } + + function tag() + { + return 'tagsubs'; } + function seeAllItem() + { + return array('tagsubs', + array('nickname' => $this->user->nickname), + _('See all'), + _('See all tags you are following')); + } } diff --git a/plugins/TagSub/tagsubsaction.php b/plugins/TagSub/tagsubsaction.php index 21ddf5035f..be195250f6 100644 --- a/plugins/TagSub/tagsubsaction.php +++ b/plugins/TagSub/tagsubsaction.php @@ -116,18 +116,18 @@ class TagSubsAction extends GalleryAction if ($this->user->id === $current_user->id) { // TRANS: Tag subscription list text when the logged in user has no tag subscriptions. $message = _m('You are not listening to any hash tags right now. You can push the "Subscribe" button ' . - 'on any hashtag page to automatically receive any public messages on this site that use that ' . - 'tag, even if you are not subscribed to the poster.'); + 'on any hashtag page to automatically receive any public messages on this site that use that ' . + 'tag, even if you are not subscribed to the poster.'); } else { // TRANS: Tag subscription list text when looking at the subscriptions for a of a user other // TRANS: than the logged in user that has no tag subscriptions. %s is the user nickname. - $message = sprintf(_m('%s is not listening to any tags.'), $this->user->nickname); + $message = sprintf(_m('%s is not following any tags.'), $this->user->nickname); } } else { // TRANS: Subscription list text when looking at the subscriptions for a of a user that has none // TRANS: as an anonymous user. %s is the user nickname. - $message = sprintf(_m('%s is not listening to any tags.'), $this->user->nickname); + $message = sprintf(_m('%s is not following any tags.'), $this->user->nickname); } $this->elementStart('div', 'guide'); @@ -163,9 +163,11 @@ class TagSubscriptionsListItem extends SubscriptionListItem if (!empty($cur) && $cur->id == $this->owner->id) { $this->showOwnerControls(); } - + $url = common_local_url('tag', array('tag' => $tag)); - $linkline = sprintf(_m('#%s since %s'), + // TRANS: %1$s is a URL to a tag, %2$s is a tag, + // TRANS: %3$s a date string. + $linkline = sprintf(_m('#%2$s since %3$s'), htmlspecialchars($url), htmlspecialchars($tag), common_date_string($tagsub->created)); diff --git a/plugins/TagSub/tagunsubform.php b/plugins/TagSub/tagunsubform.php index d26e99a3e5..6bec4b0ce1 100644 --- a/plugins/TagSub/tagunsubform.php +++ b/plugins/TagSub/tagunsubform.php @@ -46,7 +46,6 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { * * @see UnsubscribeForm */ - class TagUnsubForm extends TagSubForm { /** @@ -54,38 +53,32 @@ class TagUnsubForm extends TagSubForm * * @return int ID of the form */ - function id() { return 'tag-unsubscribe-' . $this->tag; } - /** * class of the form * * @return string of the form class */ - function formClass() { // class to match existing styles... return 'form_user_unsubscribe ajax'; } - /** * Action of the form * * @return string URL of the action */ - function action() { return common_local_url('tagunsub', array('tag' => $this->tag)); } - /** * Legend of the Form * @@ -93,6 +86,7 @@ class TagUnsubForm extends TagSubForm */ function formLegend() { + // TRANS: Form legend. $this->out->element('legend', null, _m('Unsubscribe from this tag')); } @@ -101,9 +95,11 @@ class TagUnsubForm extends TagSubForm * * @return void */ - function formActions() { - $this->out->submit('submit', _m('BUTTON','Unsubscribe'), 'submit', null, _m('Unsubscribe from this tag')); + // TRANS: Submit button text to unsubscribe from a tag. + $this->out->submit('submit', _m('BUTTON','Unsubscribe'), + // TRANS: Submit button title to unsubscribe from a tag. + 'submit', null, _m('Unsubscribe from this tag.')); } } diff --git a/plugins/Template/TemplatePlugin.php b/plugins/Template/TemplatePlugin.php deleted file mode 100644 index c013f9f4d1..0000000000 --- a/plugins/Template/TemplatePlugin.php +++ /dev/null @@ -1,357 +0,0 @@ - - * @copyright 2009 Megapump, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://megapump.com/ - */ - -if (!defined('STATUSNET')) { - exit(1); -} - -define('TEMPLATEPLUGIN_VERSION', '0.1'); - -class TemplatePlugin extends Plugin { - - var $blocks = array(); - - function __construct() { - parent::__construct(); - } - - // capture the RouterInitialized event - // and connect a new API method - // for updating the template - function onRouterInitialized( $m ) { - $m->connect( 'template/update', array( - 'action' => 'template', - )); - } - - // <%styles%> - // <%scripts%> - // <%search%> - // <%feeds%> - // <%description%> - // <%head%> - function onStartShowHead( &$act ) { - $this->clear_xmlWriter($act); - $act->extraHead(); - $this->blocks['head'] = $act->xw->flush(); - $act->showStylesheets(); - $this->blocks['styles'] = $act->xw->flush(); - $act->showScripts(); - $this->blocks['scripts'] = $act->xw->flush(); - $act->showFeeds(); - $this->blocks['feeds'] = $act->xw->flush(); - $act->showOpenSearch(); - $this->blocks['search'] = $act->xw->flush(); - $act->showDescription(); - $this->blocks['description'] = $act->xw->flush(); - return false; - } - - // <%bodytext%> - function onStartShowContentBlock( &$act ) { - $this->clear_xmlWriter($act); - return true; - } - function onEndShowContentBlock( &$act ) { - $this->blocks['bodytext'] = $act->xw->flush(); - } - - // <%localnav%> - function onStartShowLocalNavBlock( &$act ) { - $this->clear_xmlWriter($act); - return true; - } - function onEndShowLocalNavBlock( &$act ) { - $this->blocks['localnav'] = $act->xw->flush(); - } - - // <%export%> - function onStartShowExportData( &$act ) { - $this->clear_xmlWriter($act); - return true; - } - function onEndShowExportData( &$act ) { - $this->blocks['export'] = $act->xw->flush(); - } - - // <%subscriptions%> - // <%subscribers%> - // <%groups%> - // <%statistics%> - // <%cloud%> - // <%groupmembers%> - // <%groupstatistics%> - // <%groupcloud%> - // <%popular%> - // <%groupsbyposts%> - // <%featuredusers%> - // <%groupsbymembers%> - function onStartShowSections( &$act ) { - global $action; - $this->clear_xmlWriter($act); - switch ($action) { - case "showstream": - $act->showSubscriptions(); - $this->blocks['subscriptions'] = $act->xw->flush(); - $act->showSubscribers(); - $this->blocks['subscribers'] = $act->xw->flush(); - $act->showGroups(); - $this->blocks['groups'] = $act->xw->flush(); - $act->showStatistics(); - $this->blocks['statistics'] = $act->xw->flush(); - $cloud = new PersonalTagCloudSection($act, $act->user); - $cloud->show(); - $this->blocks['cloud'] = $act->xw->flush(); - break; - case "showgroup": - $act->showMembers(); - $this->blocks['groupmembers'] = $act->xw->flush(); - $act->showStatistics(); - $this->blocks['groupstatistics'] = $act->xw->flush(); - $cloud = new GroupTagCloudSection($act, $act->group); - $cloud->show(); - $this->blocks['groupcloud'] = $act->xw->flush(); - break; - case "public": - $pop = new PopularNoticeSection($act); - $pop->show(); - $this->blocks['popular'] = $act->xw->flush(); - $gbp = new GroupsByPostsSection($act); - $gbp->show(); - $this->blocks['groupsbyposts'] = $act->xw->flush(); - $feat = new FeaturedUsersSection($act); - $feat->show(); - $this->blocks['featuredusers'] = $act->xw->flush(); - break; - case "groups": - $gbp = new GroupsByPostsSection($act); - $gbp->show(); - $this->blocks['groupsbyposts'] = $act->xw->flush(); - $gbm = new GroupsByMembersSection($act); - $gbm->show(); - $this->blocks['groupsbymembers'] = $act->xw->flush(); - break; - } - return false; - } - - // <%logo%> - // <%nav%> - // <%notice%> - // <%noticeform%> - function onStartShowHeader( &$act ) { - $this->clear_xmlWriter($act); - $act->showLogo(); - $this->blocks['logo'] = $act->xw->flush(); - $act->showPrimaryNav(); - $this->blocks['nav'] = $act->xw->flush(); - $act->showSiteNotice(); - $this->blocks['notice'] = $act->xw->flush(); - if (common_logged_in()) { - $act->showNoticeForm(); - } else { - $act->showAnonymousMessage(); - } - $this->blocks['noticeform'] = $act->xw->flush(); - return false; - } - - // <%secondarynav%> - // <%licenses%> - function onStartShowFooter( &$act ) { - $this->clear_xmlWriter($act); - $act->showSecondaryNav(); - $this->blocks['secondarynav'] = $act->xw->flush(); - $act->showLicenses(); - $this->blocks['licenses'] = $act->xw->flush(); - return false; - } - - // capture the EndHTML event - // and include the template - function onEndEndHTML($act) { - - global $action, $tags; - - // set the action and title values - $vars = array( - 'action'=>$action, - 'title'=>$act->title(). " - ". common_config('site', 'name') - ); - - // use the PHP template - // unless statusnet config: - // $config['template']['mode'] = 'html'; - if (!(common_config('template', 'mode') == 'html')) { - $tpl_file = $this->templateFolder() . '/index.php'; - $tags = array_merge($vars,$this->blocks); - include $tpl_file; - return; - } - - $tpl_file = $this->templateFolder() . '/index.html'; - - // read the static template - $output = file_get_contents( $tpl_file ); - - $tags = array(); - - // get a list of the <%tags%> in the template - $pattern='/<%([a-z]+)%>/'; - - if ( 1 <= preg_match_all( $pattern, $output, $found )) - $tags[] = $found; - - // for each found tag, set its value from the rendered blocks - foreach( $tags[0][1] as $pos=>$tag ) { - if (isset($this->blocks[$tag])) - $vars[$tag] = $this->blocks[$tag]; - - // didn't find a block for the tag - elseif (!isset($vars[$tag])) - $vars[$tag] = ''; - } - - // replace the tags in the template - foreach( $vars as $key=>$val ) - $output = str_replace( '<%'.$key.'%>', $val, $output ); - - echo $output; - - return true; - - } - function templateFolder() { - return 'tpl'; - } - - // catching the StartShowHTML event to halt the rendering - function onStartShowHTML( &$act ) { - $this->clear_xmlWriter($act); - return true; - } - - // clear the xmlWriter - function clear_xmlWriter( &$act ) { - $act->xw->openMemory(); - $act->xw->setIndent(true); - } - -} - -/** - * Action for updating the template remotely - * - * "template/update" -- a POST method that requires a single - * parameter "template", containing the new template code - * - * @category Plugin - * @package StatusNet - * @author Brian Hendrickson - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://megapump.com/ - * - */ - -class TemplateAction extends Action -{ - - function prepare($args) { - parent::prepare($args); - return true; - } - - function handle($args) { - - parent::handle($args); - - if (!isset($_SERVER['PHP_AUTH_USER'])) { - - // not authenticated, show login form - header('WWW-Authenticate: Basic realm="StatusNet API"'); - - // cancelled the browser login form - $this->clientError(_m('Authentication error!'), $code = 401); - - } else { - - $nick = $_SERVER['PHP_AUTH_USER']; - $pass = $_SERVER['PHP_AUTH_PW']; - - // check username and password - $user = common_check_user($nick,$pass); - - if ($user) { - - // verify that user is admin - if (!($user->id == 1)) - $this->clientError(_m('Only User #1 can update the template.'), $code = 401); - - // open the old template - $tpl_file = $this->templateFolder() . '/index.html'; - $fp = fopen( $tpl_file, 'w+' ); - - // overwrite with the new template - fwrite($fp, $this->arg('template')); - fclose($fp); - - header('HTTP/1.1 200 OK'); - header('Content-type: text/plain'); - print "Template Updated!"; - - } else { - - // bad username and password - $this->clientError(_m('Authentication error!'), $code = 401); - - } - - } - } - function onPluginVersion(&$versions) - { - $versions[] = array('name' => 'Template', - 'version' => TEMPLATEPLUGIN_VERSION, - 'author' => 'Brian Hendrickson', - 'homepage' => 'http://status.net/wiki/Plugin:Template', - 'rawdescription' => - _m('Use an HTML template for Web output.')); - return true; - } - -} - -/** - * Function for retrieving a statusnet display section - * - * requires one parameter, the name of the section - * section names are listed in the comments of the TemplatePlugin class - * - * @category Plugin - * @package StatusNet - * @author Brian Hendrickson - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://megapump.com/ - * - */ - -function section($tagname) { - global $tags; - if (isset($tags[$tagname])) - return $tags[$tagname]; -} - diff --git a/plugins/TightUrl/TightUrlPlugin.php b/plugins/TightUrl/TightUrlPlugin.php index 8fd645945b..6d96f40bc5 100644 --- a/plugins/TightUrl/TightUrlPlugin.php +++ b/plugins/TightUrl/TightUrlPlugin.php @@ -38,7 +38,8 @@ class TightUrlPlugin extends UrlShortenerPlugin function onInitializePlugin(){ parent::onInitializePlugin(); if(!isset($this->serviceUrl)){ - throw new Exception("must specify a serviceUrl"); + // TRANS: Exception thrown when the TightUrl plugin has been configured incorrectly. + throw new Exception(_m('You must specify a serviceUrl.')); } } @@ -63,6 +64,7 @@ class TightUrlPlugin extends UrlShortenerPlugin 'author' => 'Craig Andrews', 'homepage' => 'http://status.net/wiki/Plugin:TightUrl', 'rawdescription' => + // TRANS: Plugin description. %s is the shortener name. sprintf(_m('Uses %1$s URL-shortener service.'), $this->shortenerName)); return true; diff --git a/plugins/TightUrl/locale/TightUrl.pot b/plugins/TightUrl/locale/TightUrl.pot index 94216d0199..e3d1c46bf5 100644 --- a/plugins/TightUrl/locale/TightUrl.pot +++ b/plugins/TightUrl/locale/TightUrl.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,7 +16,13 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: TightUrlPlugin.php:66 +#. TRANS: Exception thrown when the TightUrl plugin has been configured incorrectly. +#: TightUrlPlugin.php:42 +msgid "You must specify a serviceUrl." +msgstr "" + +#. TRANS: Plugin description. %s is the shortener name. +#: TightUrlPlugin.php:68 #, php-format msgid "Uses %1$s URL-shortener service." msgstr "" diff --git a/plugins/TightUrl/locale/de/LC_MESSAGES/TightUrl.po b/plugins/TightUrl/locale/de/LC_MESSAGES/TightUrl.po index 466820ea9c..054a2d7c2d 100644 --- a/plugins/TightUrl/locale/de/LC_MESSAGES/TightUrl.po +++ b/plugins/TightUrl/locale/de/LC_MESSAGES/TightUrl.po @@ -1,6 +1,7 @@ # Translation of StatusNet - TightUrl to German (Deutsch) # Exported from translatewiki.net # +# Author: ChrisiPK # Author: The Evil IP address # -- # This file is distributed under the same license as the StatusNet package. @@ -9,18 +10,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TightUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:35+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:16+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-01 21:06:41+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-tighturl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Exception thrown when the TightUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "Du musst eine serviceUrl angeben." + +#. TRANS: Plugin description. %s is the shortener name. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "Benutzung des %1$s-URL-Kürzungsdienstes." diff --git a/plugins/TightUrl/locale/es/LC_MESSAGES/TightUrl.po b/plugins/TightUrl/locale/es/LC_MESSAGES/TightUrl.po index cb0afd8aec..2fa8c7f226 100644 --- a/plugins/TightUrl/locale/es/LC_MESSAGES/TightUrl.po +++ b/plugins/TightUrl/locale/es/LC_MESSAGES/TightUrl.po @@ -1,6 +1,7 @@ -# Translation of StatusNet - TightUrl to Spanish (Español) +# Translation of StatusNet - TightUrl to Spanish (español) # Exported from translatewiki.net # +# Author: Armando-Martin # Author: Translationista # -- # This file is distributed under the same license as the StatusNet package. @@ -9,18 +10,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TightUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:36+0000\n" -"Language-Team: Spanish \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:16+0000\n" +"Language-Team: Spanish \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-01 21:06:41+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: es\n" "X-Message-Group: #out-statusnet-plugin-tighturl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Exception thrown when the TightUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "Debe especificar un \"serviceUrl\"." + +#. TRANS: Plugin description. %s is the shortener name. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "" diff --git a/plugins/TightUrl/locale/eu/LC_MESSAGES/TightUrl.po b/plugins/TightUrl/locale/eu/LC_MESSAGES/TightUrl.po new file mode 100644 index 0000000000..e9bf436d29 --- /dev/null +++ b/plugins/TightUrl/locale/eu/LC_MESSAGES/TightUrl.po @@ -0,0 +1,28 @@ +# Translation of StatusNet - TightUrl to Basque (euskara) +# Exported from translatewiki.net +# +# Author: Artsuaga +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - TightUrl\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:16+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-19 11:23:38+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Exception thrown when the TightUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "Url zerbitzu bat adierazi behar duzu." + +#. TRANS: Plugin description. %s is the shortener name. +#, php-format +msgid "Uses %1$s URL-shortener service." +msgstr "%1$s URL-laburtze zerbitzua erabiliz." diff --git a/plugins/TightUrl/locale/fr/LC_MESSAGES/TightUrl.po b/plugins/TightUrl/locale/fr/LC_MESSAGES/TightUrl.po index 2a912859d9..60f9b35d76 100644 --- a/plugins/TightUrl/locale/fr/LC_MESSAGES/TightUrl.po +++ b/plugins/TightUrl/locale/fr/LC_MESSAGES/TightUrl.po @@ -1,6 +1,7 @@ -# Translation of StatusNet - TightUrl to French (Français) +# Translation of StatusNet - TightUrl to French (français) # Exported from translatewiki.net # +# Author: Crochet.david # Author: Peter17 # -- # This file is distributed under the same license as the StatusNet package. @@ -9,18 +10,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TightUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:36+0000\n" -"Language-Team: French \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:17+0000\n" +"Language-Team: French \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-01 21:06:41+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-tighturl\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Exception thrown when the TightUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "Vous devez spécifier un serviceUrl." + +#. TRANS: Plugin description. %s is the shortener name. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "" diff --git a/plugins/TightUrl/locale/gl/LC_MESSAGES/TightUrl.po b/plugins/TightUrl/locale/gl/LC_MESSAGES/TightUrl.po index 9900622076..c05c6a9988 100644 --- a/plugins/TightUrl/locale/gl/LC_MESSAGES/TightUrl.po +++ b/plugins/TightUrl/locale/gl/LC_MESSAGES/TightUrl.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TightUrl to Galician (Galego) +# Translation of StatusNet - TightUrl to Galician (galego) # Exported from translatewiki.net # # Author: Toliño @@ -9,18 +9,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TightUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:36+0000\n" -"Language-Team: Galician \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:17+0000\n" +"Language-Team: Galician \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-01 21:06:41+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: gl\n" "X-Message-Group: #out-statusnet-plugin-tighturl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Exception thrown when the TightUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "Cómpre especificar un serviceUrl." + +#. TRANS: Plugin description. %s is the shortener name. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "" diff --git a/plugins/TightUrl/locale/he/LC_MESSAGES/TightUrl.po b/plugins/TightUrl/locale/he/LC_MESSAGES/TightUrl.po index c6f4393070..171a858fa0 100644 --- a/plugins/TightUrl/locale/he/LC_MESSAGES/TightUrl.po +++ b/plugins/TightUrl/locale/he/LC_MESSAGES/TightUrl.po @@ -1,6 +1,7 @@ # Translation of StatusNet - TightUrl to Hebrew (עברית) # Exported from translatewiki.net # +# Author: Amire80 # Author: YaronSh # -- # This file is distributed under the same license as the StatusNet package. @@ -9,18 +10,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TightUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:36+0000\n" -"Language-Team: Hebrew \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:17+0000\n" +"Language-Team: Hebrew \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-01 21:06:41+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: he\n" "X-Message-Group: #out-statusnet-plugin-tighturl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Exception thrown when the TightUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "יש להזין serviceUrl." + +#. TRANS: Plugin description. %s is the shortener name. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "שימוש בשירות קיצור הכתובות %1$s." diff --git a/plugins/TightUrl/locale/ia/LC_MESSAGES/TightUrl.po b/plugins/TightUrl/locale/ia/LC_MESSAGES/TightUrl.po index 19df8eb5b5..2f8d325983 100644 --- a/plugins/TightUrl/locale/ia/LC_MESSAGES/TightUrl.po +++ b/plugins/TightUrl/locale/ia/LC_MESSAGES/TightUrl.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TightUrl to Interlingua (Interlingua) +# Translation of StatusNet - TightUrl to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,18 +9,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TightUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:36+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:17+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-01 21:06:41+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-tighturl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Exception thrown when the TightUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "Es necessari specificar un \"serviceUrl\"." + +#. TRANS: Plugin description. %s is the shortener name. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "" diff --git a/plugins/TightUrl/locale/id/LC_MESSAGES/TightUrl.po b/plugins/TightUrl/locale/id/LC_MESSAGES/TightUrl.po index de122375f3..c9313e5c38 100644 --- a/plugins/TightUrl/locale/id/LC_MESSAGES/TightUrl.po +++ b/plugins/TightUrl/locale/id/LC_MESSAGES/TightUrl.po @@ -9,18 +9,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TightUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:36+0000\n" -"Language-Team: Indonesian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:17+0000\n" +"Language-Team: Indonesian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-01 21:06:41+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: id\n" "X-Message-Group: #out-statusnet-plugin-tighturl\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Exception thrown when the TightUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "" + +#. TRANS: Plugin description. %s is the shortener name. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "Menggunakan layanan pemendek URL %1$s." diff --git a/plugins/TightUrl/locale/ja/LC_MESSAGES/TightUrl.po b/plugins/TightUrl/locale/ja/LC_MESSAGES/TightUrl.po index cd89ada5d7..7a720834de 100644 --- a/plugins/TightUrl/locale/ja/LC_MESSAGES/TightUrl.po +++ b/plugins/TightUrl/locale/ja/LC_MESSAGES/TightUrl.po @@ -1,6 +1,7 @@ # Translation of StatusNet - TightUrl to Japanese (日本語) # Exported from translatewiki.net # +# Author: Shirayuki # Author: é’å­å®ˆæ­Œ # -- # This file is distributed under the same license as the StatusNet package. @@ -9,18 +10,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TightUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:36+0000\n" -"Language-Team: Japanese \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:17+0000\n" +"Language-Team: Japanese \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-01 21:06:41+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ja\n" "X-Message-Group: #out-statusnet-plugin-tighturl\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Exception thrown when the TightUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "serviceUrl を指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚" + +#. TRANS: Plugin description. %s is the shortener name. #, php-format msgid "Uses %1$s URL-shortener service." -msgstr "%1$sã‚’URL短縮サービスã¨ã—ã¦åˆ©ç”¨ã™ã‚‹ã€‚" +msgstr "%1$sã‚’URL短縮サービスã¨ã—ã¦ä½¿ç”¨ã™ã‚‹ã€‚" diff --git a/plugins/TightUrl/locale/mk/LC_MESSAGES/TightUrl.po b/plugins/TightUrl/locale/mk/LC_MESSAGES/TightUrl.po index e469329fa1..f785bbecba 100644 --- a/plugins/TightUrl/locale/mk/LC_MESSAGES/TightUrl.po +++ b/plugins/TightUrl/locale/mk/LC_MESSAGES/TightUrl.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TightUrl to Macedonian (МакедонÑки) +# Translation of StatusNet - TightUrl to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 @@ -9,18 +9,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TightUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:36+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:17+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-01 21:06:41+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-tighturl\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" +#. TRANS: Exception thrown when the TightUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "Мора да наведете serviceUrl." + +#. TRANS: Plugin description. %s is the shortener name. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "" diff --git a/plugins/TightUrl/locale/ms/LC_MESSAGES/TightUrl.po b/plugins/TightUrl/locale/ms/LC_MESSAGES/TightUrl.po index 94306753e8..8591d97076 100644 --- a/plugins/TightUrl/locale/ms/LC_MESSAGES/TightUrl.po +++ b/plugins/TightUrl/locale/ms/LC_MESSAGES/TightUrl.po @@ -9,18 +9,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TightUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:36+0000\n" -"Language-Team: Malay \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:17+0000\n" +"Language-Team: Malay \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-01 21:06:41+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ms\n" "X-Message-Group: #out-statusnet-plugin-tighturl\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Exception thrown when the TightUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "" + +#. TRANS: Plugin description. %s is the shortener name. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "Menggunakan khidmat pemendekan URL %1$s." diff --git a/plugins/TightUrl/locale/nb/LC_MESSAGES/TightUrl.po b/plugins/TightUrl/locale/nb/LC_MESSAGES/TightUrl.po index 087108c009..a18fa31554 100644 --- a/plugins/TightUrl/locale/nb/LC_MESSAGES/TightUrl.po +++ b/plugins/TightUrl/locale/nb/LC_MESSAGES/TightUrl.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TightUrl to Norwegian (bokmÃ¥l)‬ (‪Norsk (bokmÃ¥l)‬) +# Translation of StatusNet - TightUrl to Norwegian BokmÃ¥l (‪norsk (bokmÃ¥l)‬) # Exported from translatewiki.net # # Author: Nghtwlkr @@ -9,18 +9,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TightUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:36+0000\n" -"Language-Team: Norwegian (bokmÃ¥l)‬ \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:17+0000\n" +"Language-Team: Norwegian BokmÃ¥l \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-01 21:06:41+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" -"X-Language-Code: no\n" +"X-POT-Import-Date: 2011-06-19 11:23:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: nb\n" "X-Message-Group: #out-statusnet-plugin-tighturl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Exception thrown when the TightUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "" + +#. TRANS: Plugin description. %s is the shortener name. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "Bruker URL-forkortertjenesten %1$s." diff --git a/plugins/TightUrl/locale/nl/LC_MESSAGES/TightUrl.po b/plugins/TightUrl/locale/nl/LC_MESSAGES/TightUrl.po index fdaf9cf2c1..9260a21778 100644 --- a/plugins/TightUrl/locale/nl/LC_MESSAGES/TightUrl.po +++ b/plugins/TightUrl/locale/nl/LC_MESSAGES/TightUrl.po @@ -9,18 +9,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TightUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:36+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:17+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-01 21:06:41+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-tighturl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Exception thrown when the TightUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "U moet een serviceUrl opgeven." + +#. TRANS: Plugin description. %s is the shortener name. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "" diff --git a/plugins/TightUrl/locale/pt/LC_MESSAGES/TightUrl.po b/plugins/TightUrl/locale/pt/LC_MESSAGES/TightUrl.po index 73a23db9e1..a4386f6bee 100644 --- a/plugins/TightUrl/locale/pt/LC_MESSAGES/TightUrl.po +++ b/plugins/TightUrl/locale/pt/LC_MESSAGES/TightUrl.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TightUrl to Portuguese (Português) +# Translation of StatusNet - TightUrl to Portuguese (português) # Exported from translatewiki.net # # Author: Waldir @@ -9,18 +9,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TightUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:36+0000\n" -"Language-Team: Portuguese \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:18+0000\n" +"Language-Team: Portuguese \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-01 21:06:41+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: pt\n" "X-Message-Group: #out-statusnet-plugin-tighturl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Exception thrown when the TightUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "" + +#. TRANS: Plugin description. %s is the shortener name. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "Usa o serviço de abreviação de URLs %1$s." diff --git a/plugins/TightUrl/locale/pt_BR/LC_MESSAGES/TightUrl.po b/plugins/TightUrl/locale/pt_BR/LC_MESSAGES/TightUrl.po index fca997b0de..06f690a599 100644 --- a/plugins/TightUrl/locale/pt_BR/LC_MESSAGES/TightUrl.po +++ b/plugins/TightUrl/locale/pt_BR/LC_MESSAGES/TightUrl.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TightUrl to Brazilian Portuguese (Português do Brasil) +# Translation of StatusNet - TightUrl to Brazilian Portuguese (português do Brasil) # Exported from translatewiki.net # # Author: Giro720 @@ -9,19 +9,24 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TightUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:36+0000\n" -"Language-Team: Brazilian Portuguese \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:18+0000\n" +"Language-Team: Brazilian Portuguese \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-01 21:06:41+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: pt-br\n" "X-Message-Group: #out-statusnet-plugin-tighturl\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Exception thrown when the TightUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "" + +#. TRANS: Plugin description. %s is the shortener name. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "" diff --git a/plugins/TightUrl/locale/ru/LC_MESSAGES/TightUrl.po b/plugins/TightUrl/locale/ru/LC_MESSAGES/TightUrl.po index 0d189b9bc5..eb351c5191 100644 --- a/plugins/TightUrl/locale/ru/LC_MESSAGES/TightUrl.po +++ b/plugins/TightUrl/locale/ru/LC_MESSAGES/TightUrl.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TightUrl to Russian (РуÑÑкий) +# Translation of StatusNet - TightUrl to Russian (руÑÑкий) # Exported from translatewiki.net # # Author: ÐлекÑандр Сигачёв @@ -9,19 +9,24 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TightUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:37+0000\n" -"Language-Team: Russian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:18+0000\n" +"Language-Team: Russian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-01 21:06:41+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ru\n" "X-Message-Group: #out-statusnet-plugin-tighturl\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Exception thrown when the TightUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "" + +#. TRANS: Plugin description. %s is the shortener name. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "ИÑпользование Ñлужбы ÑÐ¾ÐºÑ€Ð°Ñ‰ÐµÐ½Ð¸Ñ URL %1$s." diff --git a/plugins/TightUrl/locale/tl/LC_MESSAGES/TightUrl.po b/plugins/TightUrl/locale/tl/LC_MESSAGES/TightUrl.po index 1ded9d06ab..7cdff4e6f6 100644 --- a/plugins/TightUrl/locale/tl/LC_MESSAGES/TightUrl.po +++ b/plugins/TightUrl/locale/tl/LC_MESSAGES/TightUrl.po @@ -9,18 +9,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TightUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:37+0000\n" -"Language-Team: Tagalog \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:18+0000\n" +"Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-01 21:06:41+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-tighturl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Exception thrown when the TightUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "Dapat kang tumukoy ng isang URL ng paglilingkod." + +#. TRANS: Plugin description. %s is the shortener name. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "" diff --git a/plugins/TightUrl/locale/uk/LC_MESSAGES/TightUrl.po b/plugins/TightUrl/locale/uk/LC_MESSAGES/TightUrl.po index 7b842af334..8942a3315f 100644 --- a/plugins/TightUrl/locale/uk/LC_MESSAGES/TightUrl.po +++ b/plugins/TightUrl/locale/uk/LC_MESSAGES/TightUrl.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TightUrl to Ukrainian (УкраїнÑька) +# Translation of StatusNet - TightUrl to Ukrainian (українÑька) # Exported from translatewiki.net # # Author: Boogie @@ -9,19 +9,24 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TightUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:37+0000\n" -"Language-Team: Ukrainian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:18+0000\n" +"Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-01 21:06:41+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-tighturl\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Exception thrown when the TightUrl plugin has been configured incorrectly. +msgid "You must specify a serviceUrl." +msgstr "" + +#. TRANS: Plugin description. %s is the shortener name. #, php-format msgid "Uses %1$s URL-shortener service." msgstr "" diff --git a/plugins/TinyMCE/TinyMCEPlugin.php b/plugins/TinyMCE/TinyMCEPlugin.php index 4051ff59ee..a5e4a481b8 100644 --- a/plugins/TinyMCE/TinyMCEPlugin.php +++ b/plugins/TinyMCE/TinyMCEPlugin.php @@ -1,5 +1,4 @@ 'Evan Prodromou', 'homepage' => 'http://status.net/wiki/Plugin:TinyMCE', 'rawdescription' => + // TRANS: Plugin description. _m('Use TinyMCE library to allow rich text editing in the browser.')); return true; } diff --git a/plugins/TinyMCE/js/langs/en.js b/plugins/TinyMCE/js/langs/en.js index ea4a1b0e14..8a80d46b1a 100644 --- a/plugins/TinyMCE/js/langs/en.js +++ b/plugins/TinyMCE/js/langs/en.js @@ -12,9 +12,54 @@ not_set:"-- Not set --", clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?", clipboard_no_support:"Currently not supported by your browser, use keyboard shortcuts instead.", popup_blocked:"Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.", -invalid_data:"Error: Invalid values entered, these are marked in red.", +invalid_data:"{#field} is invalid", +invalid_data_number:"{#field} must be a number", +invalid_data_min:"{#field} must be a number greater than {#min}", +invalid_data_size:"{#field} must be a number or percentage", more_colors:"More colors" }, +colors:{ +'000000':'Black', +'993300':'Burnt orange', +'333300':'Dark olive', +'003300':'Dark green', +'003366':'Dark azure', +'000080':'Navy Blue', +'333399':'Indigo', +'333333':'Very dark gray', +'800000':'Maroon', +'FF6600':'Orange', +'808000':'Olive', +'008000':'Green', +'008080':'Teal', +'0000FF':'Blue', +'666699':'Grayish blue', +'808080':'Gray', +'FF0000':'Red', +'FF9900':'Amber', +'99CC00':'Yellow green', +'339966':'Sea green', +'33CCCC':'Turquoise', +'3366FF':'Royal blue', +'800080':'Purple', +'999999':'Medium gray', +'FF00FF':'Magenta', +'FFCC00':'Gold', +'FFFF00':'Yellow', +'00FF00':'Lime', +'00FFFF':'Aqua', +'00CCFF':'Sky blue', +'993366':'Brown', +'C0C0C0':'Silver', +'FF99CC':'Pink', +'FFCC99':'Peach', +'FFFF99':'Light yellow', +'CCFFCC':'Pale green', +'CCFFFF':'Pale cyan', +'99CCFF':'Light sky blue', +'CC99FF':'Plum', +'FFFFFF':'White' +}, contextmenu:{ align:"Alignment", left:"Left", @@ -151,7 +196,8 @@ langs:"Languages", wait:"Please wait...", sug:"Suggestions", no_sug:"No suggestions", -no_mpell:"No misspellings found." +no_mpell:"No misspellings found.", +learn_word:"Learn word" }, pagebreak:{ desc:"Insert page break." @@ -167,4 +213,11 @@ upper_roman:"Upper roman", circle:"Circle", disc:"Disc", square:"Square" -}}}); \ No newline at end of file +}, +aria:{ +rich_text_area:"Rich Text Area" +}, +wordcount:{ +words: 'Words: ' +} +}}); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/advhr/langs/en_dlg.js b/plugins/TinyMCE/js/plugins/advhr/langs/en_dlg.js index 873bfd8d38..ad6a7b6988 100644 --- a/plugins/TinyMCE/js/plugins/advhr/langs/en_dlg.js +++ b/plugins/TinyMCE/js/plugins/advhr/langs/en_dlg.js @@ -1,5 +1,7 @@ tinyMCE.addI18n('en.advhr_dlg',{ +normal:"Normal", width:"Width", +widthunits:"Units", size:"Height", noshade:"No shadow" }); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/advhr/rule.htm b/plugins/TinyMCE/js/plugins/advhr/rule.htm index fc37b2aecd..843e1f8f0b 100644 --- a/plugins/TinyMCE/js/plugins/advhr/rule.htm +++ b/plugins/TinyMCE/js/plugins/advhr/rule.htm @@ -8,43 +8,44 @@ - +
        - - - - - - - - - - - - - -
        - - -
        + + + + + + + + + + + + + +
        + + + +
        diff --git a/plugins/TinyMCE/js/plugins/advimage/image.htm b/plugins/TinyMCE/js/plugins/advimage/image.htm index 79cff3f19f..ed16b3d4a9 100644 --- a/plugins/TinyMCE/js/plugins/advimage/image.htm +++ b/plugins/TinyMCE/js/plugins/advimage/image.htm @@ -10,13 +10,14 @@ - - + + + @@ -25,15 +26,15 @@
        {#advimage_dlg.general} - +
        - @@ -60,7 +61,7 @@
        {#advimage_dlg.tab_appearance} -
        +
        - + - - + @@ -109,7 +108,7 @@ @@ -118,7 +117,7 @@ @@ -129,7 +128,7 @@ - -
        - x - px + + x + + px
          + +
        @@ -142,18 +145,18 @@
        {#advimage_dlg.swap_image} - + -
        +
        - @@ -161,12 +164,12 @@ - @@ -178,7 +181,7 @@
        {#advimage_dlg.misc} -
        + +
        - - + + -
          
        + +
        - - + + -
          
        +
        @@ -211,12 +214,12 @@ -
        + +
        - - + + -
          
        @@ -227,6 +230,6 @@ - + diff --git a/plugins/TinyMCE/js/plugins/advimage/js/image.js b/plugins/TinyMCE/js/plugins/advimage/js/image.js index 3bda86a2d3..f222486131 100644 --- a/plugins/TinyMCE/js/plugins/advimage/js/image.js +++ b/plugins/TinyMCE/js/plugins/advimage/js/image.js @@ -9,13 +9,13 @@ var ImageDialog = { }, init : function(ed) { - var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, dom = ed.dom, n = ed.selection.getNode(); + var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, dom = ed.dom, n = ed.selection.getNode(), fl = tinyMCEPopup.getParam('external_image_list', 'tinyMCEImageList'); tinyMCEPopup.resizeToInnerSize(); this.fillClassList('class_list'); - this.fillFileList('src_list', 'tinyMCEImageList'); - this.fillFileList('over_list', 'tinyMCEImageList'); - this.fillFileList('out_list', 'tinyMCEImageList'); + this.fillFileList('src_list', fl); + this.fillFileList('over_list', fl); + this.fillFileList('out_list', fl); TinyMCE_EditableSelects.init(); if (n.nodeName == 'IMG') { @@ -142,7 +142,7 @@ var ImageDialog = { } tinymce.extend(args, { - src : nl.src.value, + src : nl.src.value.replace(/ /g, '%20'), width : nl.width.value, height : nl.height.value, alt : nl.alt.value, @@ -177,6 +177,8 @@ var ImageDialog = { ed.undoManager.add(); } + tinyMCEPopup.editor.execCommand('mceRepaint'); + tinyMCEPopup.editor.focus(); tinyMCEPopup.close(); }, @@ -285,7 +287,7 @@ var ImageDialog = { fillFileList : function(id, l) { var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; - l = window[l]; + l = typeof(l) === 'function' ? l() : window[l]; lst.options.length = 0; if (l && l.length > 0) { @@ -359,7 +361,7 @@ var ImageDialog = { }, updateStyle : function(ty) { - var dom = tinyMCEPopup.dom, st, v, f = document.forms[0], img = dom.create('img', {style : dom.get('style').value}); + var dom = tinyMCEPopup.dom, b, bStyle, bColor, v, isIE = tinymce.isIE, f = document.forms[0], img = dom.create('img', {style : dom.get('style').value}); if (tinyMCEPopup.editor.settings.inline_styles) { // Handle align @@ -378,14 +380,27 @@ var ImageDialog = { // Handle border if (ty == 'border') { + b = img.style.border ? img.style.border.split(' ') : []; + bStyle = dom.getStyle(img, 'border-style'); + bColor = dom.getStyle(img, 'border-color'); + dom.setStyle(img, 'border', ''); v = f.border.value; if (v || v == '0') { if (v == '0') - img.style.border = '0'; - else - img.style.border = v + 'px solid black'; + img.style.border = isIE ? '0' : '0 none none'; + else { + if (b.length == 3 && b[isIE ? 2 : 1]) + bStyle = b[isIE ? 2 : 1]; + else if (!bStyle || bStyle == 'none') + bStyle = 'solid'; + if (b.length == 3 && b[isIE ? 0 : 2]) + bColor = b[isIE ? 0 : 2]; + else if (!bColor || bColor == 'none') + bColor = 'black'; + img.style.border = v + 'px ' + bStyle + ' ' + bColor; + } } } diff --git a/plugins/TinyMCE/js/plugins/advimage/langs/en_dlg.js b/plugins/TinyMCE/js/plugins/advimage/langs/en_dlg.js index f493d196fa..d8f11e0303 100644 --- a/plugins/TinyMCE/js/plugins/advimage/langs/en_dlg.js +++ b/plugins/TinyMCE/js/plugins/advimage/langs/en_dlg.js @@ -28,6 +28,8 @@ alt:"Image description", list:"Image list", border:"Border", dimensions:"Dimensions", +width:"Width", +height:"Height", vspace:"Vertical space", hspace:"Horizontal space", align:"Alignment", diff --git a/plugins/TinyMCE/js/plugins/advlink/js/advlink.js b/plugins/TinyMCE/js/plugins/advlink/js/advlink.js index b78e82f76b..837c937c66 100644 --- a/plugins/TinyMCE/js/plugins/advlink/js/advlink.js +++ b/plugins/TinyMCE/js/plugins/advlink/js/advlink.js @@ -30,8 +30,6 @@ function init() { document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','advlink'); document.getElementById('popupurlbrowsercontainer').innerHTML = getBrowserHTML('popupurlbrowser','popupurl','file','advlink'); - document.getElementById('linklisthrefcontainer').innerHTML = getLinkListHTML('linklisthref','href'); - document.getElementById('anchorlistcontainer').innerHTML = getAnchorListHTML('anchorlist','href'); document.getElementById('targetlistcontainer').innerHTML = getTargetListHTML('targetlist','target'); // Link list @@ -41,6 +39,13 @@ function init() { else document.getElementById("linklisthrefcontainer").innerHTML = html; + // Anchor list + html = getAnchorListHTML('anchorlist','href'); + if (html == "") + document.getElementById("anchorlistrow").style.display = 'none'; + else + document.getElementById("anchorlistcontainer").innerHTML = html; + // Resize some elements if (isVisible('hrefbrowser')) document.getElementById('href').style.width = '260px'; @@ -360,20 +365,22 @@ function setAttrib(elm, attrib, value) { } function getAnchorListHTML(id, target) { - var inst = tinyMCEPopup.editor; - var nodes = inst.dom.select('a.mceItemAnchor,img.mceItemAnchor'), name, i; - var html = ""; + var ed = tinyMCEPopup.editor, nodes = ed.dom.select('a'), name, i, len, html = ""; - html += ''; + if (html == "") + return ""; + + html = ''; return html; } @@ -389,7 +396,6 @@ function insertAction() { // Remove element if there is no href if (!document.forms[0].href.value) { - tinyMCEPopup.execCommand("mceBeginUndoLevel"); i = inst.selection.getBookmark(); inst.dom.remove(elm, 1); inst.selection.moveToBookmark(i); @@ -398,12 +404,10 @@ function insertAction() { return; } - tinyMCEPopup.execCommand("mceBeginUndoLevel"); - // Create new anchor elements if (elm == null) { inst.getDoc().execCommand("unlink", false, null); - tinyMCEPopup.execCommand("CreateLink", false, "#mce_temp_url#", {skip_undo : 1}); + tinyMCEPopup.execCommand("mceInsertLink", false, "#mce_temp_url#", {skip_undo : 1}); elementArray = tinymce.grep(inst.dom.select("a"), function(n) {return inst.dom.getAttrib(n, 'href') == '#mce_temp_url#';}); for (i=0; i - -
        -
        + + + + -
        +
        + diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-foot-in-mouth.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-foot-in-mouth.gif index 16f68cc1e9..c7cf1011da 100644 Binary files a/plugins/TinyMCE/js/plugins/emotions/img/smiley-foot-in-mouth.gif and b/plugins/TinyMCE/js/plugins/emotions/img/smiley-foot-in-mouth.gif differ diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-laughing.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-laughing.gif index 1606c119e7..82c5b182e6 100644 Binary files a/plugins/TinyMCE/js/plugins/emotions/img/smiley-laughing.gif and b/plugins/TinyMCE/js/plugins/emotions/img/smiley-laughing.gif differ diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-sealed.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-sealed.gif index b33d3cca1e..fe66220c24 100644 Binary files a/plugins/TinyMCE/js/plugins/emotions/img/smiley-sealed.gif and b/plugins/TinyMCE/js/plugins/emotions/img/smiley-sealed.gif differ diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-smile.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-smile.gif index e6a9e60d5d..fd27edfaaa 100644 Binary files a/plugins/TinyMCE/js/plugins/emotions/img/smiley-smile.gif and b/plugins/TinyMCE/js/plugins/emotions/img/smiley-smile.gif differ diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-surprised.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-surprised.gif index cb99cdd913..0cc9bb71cc 100644 Binary files a/plugins/TinyMCE/js/plugins/emotions/img/smiley-surprised.gif and b/plugins/TinyMCE/js/plugins/emotions/img/smiley-surprised.gif differ diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-wink.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-wink.gif index 9faf1aff8f..0631c7616e 100644 Binary files a/plugins/TinyMCE/js/plugins/emotions/img/smiley-wink.gif and b/plugins/TinyMCE/js/plugins/emotions/img/smiley-wink.gif differ diff --git a/plugins/TinyMCE/js/plugins/example_dependency/editor_plugin.js b/plugins/TinyMCE/js/plugins/example_dependency/editor_plugin.js new file mode 100644 index 0000000000..0a4551d380 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/example_dependency/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.ExampleDependencyPlugin",{init:function(a,b){},getInfo:function(){return{longname:"Example Dependency plugin",author:"Some author",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example_dependency",version:"1.0"}}});tinymce.PluginManager.add("example_dependency",tinymce.plugins.ExampleDependencyPlugin,["example"])})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/example_dependency/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/example_dependency/editor_plugin_src.js new file mode 100644 index 0000000000..e1c55e41bc --- /dev/null +++ b/plugins/TinyMCE/js/plugins/example_dependency/editor_plugin_src.js @@ -0,0 +1,50 @@ +/** + * editor_plugin_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function() { + + tinymce.create('tinymce.plugins.ExampleDependencyPlugin', { + /** + * Initializes the plugin, this will be executed after the plugin has been created. + * This call is done before the editor instance has finished it's initialization so use the onInit event + * of the editor instance to intercept that event. + * + * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in. + * @param {string} url Absolute URL to where the plugin is located. + */ + init : function(ed, url) { + }, + + + /** + * Returns information about the plugin as a name/value array. + * The current keys are longname, author, authorurl, infourl and version. + * + * @return {Object} Name/value array containing information about the plugin. + */ + getInfo : function() { + return { + longname : 'Example Dependency plugin', + author : 'Some author', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example_dependency', + version : "1.0" + }; + } + }); + + /** + * Register the plugin, specifying the list of the plugins that this plugin depends on. They are specified in a list, with the list loaded in order. + * plugins in this list will be initialised when this plugin is initialized. (before the init method is called). + * plugins in a depends list should typically be specified using the short name). If neccesary this can be done + * with an object which has the url to the plugin and the shortname. + */ + tinymce.PluginManager.add('example_dependency', tinymce.plugins.ExampleDependencyPlugin, ['example']); +})(); diff --git a/plugins/TinyMCE/js/plugins/fullpage/css/fullpage.css b/plugins/TinyMCE/js/plugins/fullpage/css/fullpage.css index 7a3334f08d..2675cec155 100644 --- a/plugins/TinyMCE/js/plugins/fullpage/css/fullpage.css +++ b/plugins/TinyMCE/js/plugins/fullpage/css/fullpage.css @@ -35,53 +35,14 @@ width: 240px; } -/* Head list classes */ - -.headlistwrapper { - width: 100%; -} - -.addbutton, .removebutton, .moveupbutton, .movedownbutton { - border-top: 1px solid; - border-left: 1px solid; - border-bottom: 1px solid; - border-right: 1px solid; - border-color: #F0F0EE; - cursor: default; - display: block; - width: 20px; - height: 20px; -} - #doctypes { width: 200px; } -.addbutton:hover, .removebutton:hover, .moveupbutton:hover, .movedownbutton:hover { - border: 1px solid #0A246A; - background-color: #B6BDD2; -} +/* Head list classes */ -.addbutton { - background-image: url('../images/add.gif'); - float: left; - margin-right: 3px; -} - -.removebutton { - background-image: url('../images/remove.gif'); - float: left; -} - -.moveupbutton { - background-image: url('../images/move_up.gif'); - float: left; - margin-right: 3px; -} - -.movedownbutton { - background-image: url('../images/move_down.gif'); - float: left; +.headlistwrapper { + width: 100%; } .selected { diff --git a/plugins/TinyMCE/js/plugins/fullpage/editor_plugin.js b/plugins/TinyMCE/js/plugins/fullpage/editor_plugin.js index aeaa669794..eb0ec33120 100644 --- a/plugins/TinyMCE/js/plugins/fullpage/editor_plugin.js +++ b/plugins/TinyMCE/js/plugins/fullpage/editor_plugin.js @@ -1 +1 @@ -(function(){tinymce.create("tinymce.plugins.FullPagePlugin",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceFullPageProperties",function(){a.windowManager.open({file:b+"/fullpage.htm",width:430+parseInt(a.getLang("fullpage.delta_width",0)),height:495+parseInt(a.getLang("fullpage.delta_height",0)),inline:1},{plugin_url:b,head_html:c.head})});a.addButton("fullpage",{title:"fullpage.desc",cmd:"mceFullPageProperties"});a.onBeforeSetContent.add(c._setContent,c);a.onSetContent.add(c._setBodyAttribs,c);a.onGetContent.add(c._getContent,c)},getInfo:function(){return{longname:"Fullpage",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullpage",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_setBodyAttribs:function(d,a){var l,c,e,g,b,h,j,f=this.head.match(/body(.*?)>/i);if(f&&f[1]){l=f[1].match(/\s*(\w+\s*=\s*".*?"|\w+\s*=\s*'.*?'|\w+\s*=\s*\w+|\w+)\s*/g);if(l){for(c=0,e=l.length;c",a);h.head=f.substring(0,a+1);j=f.indexOf("\n'}h.head+=d.getParam("fullpage_default_doctype",'');h.head+="\n\n\n"+d.getParam("fullpage_default_title","Untitled document")+"\n";if(g=d.getParam("fullpage_default_encoding")){h.head+='\n'}if(g=d.getParam("fullpage_default_font_family")){i+="font-family: "+g+";"}if(g=d.getParam("fullpage_default_font_size")){i+="font-size: "+g+";"}if(g=d.getParam("fullpage_default_text_color")){i+="color: "+g+";"}h.head+="\n\n";h.foot="\n\n"}},_getContent:function(a,c){var b=this;if(!c.source_view||!a.getParam("fullpage_hide_in_source_view")){c.content=tinymce.trim(b.head)+"\n"+tinymce.trim(c.content)+"\n"+tinymce.trim(b.foot)}}});tinymce.PluginManager.add("fullpage",tinymce.plugins.FullPagePlugin)})(); \ No newline at end of file +(function(){var b=tinymce.each,a=tinymce.html.Node;tinymce.create("tinymce.plugins.FullPagePlugin",{init:function(c,d){var e=this;e.editor=c;c.addCommand("mceFullPageProperties",function(){c.windowManager.open({file:d+"/fullpage.htm",width:430+parseInt(c.getLang("fullpage.delta_width",0)),height:495+parseInt(c.getLang("fullpage.delta_height",0)),inline:1},{plugin_url:d,data:e._htmlToData()})});c.addButton("fullpage",{title:"fullpage.desc",cmd:"mceFullPageProperties"});c.onBeforeSetContent.add(e._setContent,e);c.onGetContent.add(e._getContent,e)},getInfo:function(){return{longname:"Fullpage",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullpage",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_htmlToData:function(){var f=this._parseHeader(),h={},c,i,g,e=this.editor;function d(l,j){var k=l.attr(j);return k||""}h.fontface=e.getParam("fullpage_default_fontface","");h.fontsize=e.getParam("fullpage_default_fontsize","");i=f.firstChild;if(i.type==7){h.xml_pi=true;g=/encoding="([^"]+)"/.exec(i.value);if(g){h.docencoding=g[1]}}i=f.getAll("#doctype")[0];if(i){h.doctype=""}i=f.getAll("title")[0];if(i&&i.firstChild){h.metatitle=i.firstChild.value}b(f.getAll("meta"),function(m){var k=m.attr("name"),j=m.attr("http-equiv"),l;if(k){h["meta"+k.toLowerCase()]=m.attr("content")}else{if(j=="Content-Type"){l=/charset\s*=\s*(.*)\s*/gi.exec(m.attr("content"));if(l){h.docencoding=l[1]}}}});i=f.getAll("html")[0];if(i){h.langcode=d(i,"lang")||d(i,"xml:lang")}i=f.getAll("link")[0];if(i&&i.attr("rel")=="stylesheet"){h.stylesheet=i.attr("href")}i=f.getAll("body")[0];if(i){h.langdir=d(i,"dir");h.style=d(i,"style");h.visited_color=d(i,"vlink");h.link_color=d(i,"link");h.active_color=d(i,"alink")}return h},_dataToHtml:function(g){var f,d,h,j,k,e=this.editor.dom;function c(n,l,m){n.attr(l,m?m:undefined)}function i(l){if(d.firstChild){d.insert(l,d.firstChild)}else{d.append(l)}}f=this._parseHeader();d=f.getAll("head")[0];if(!d){j=f.getAll("html")[0];d=new a("head",1);if(j.firstChild){j.insert(d,j.firstChild,true)}else{j.append(d)}}j=f.firstChild;if(g.xml_pi){k='version="1.0"';if(g.docencoding){k+=' encoding="'+g.docencoding+'"'}if(j.type!=7){j=new a("xml",7);f.insert(j,f.firstChild,true)}j.value=k}else{if(j&&j.type==7){j.remove()}}j=f.getAll("#doctype")[0];if(g.doctype){if(!j){j=new a("#doctype",10);if(g.xml_pi){f.insert(j,f.firstChild)}else{i(j)}}j.value=g.doctype.substring(9,g.doctype.length-1)}else{if(j){j.remove()}}j=f.getAll("title")[0];if(g.metatitle){if(!j){j=new a("title",1);j.append(new a("#text",3)).value=g.metatitle;i(j)}}if(g.docencoding){j=null;b(f.getAll("meta"),function(l){if(l.attr("http-equiv")=="Content-Type"){j=l}});if(!j){j=new a("meta",1);j.attr("http-equiv","Content-Type");j.shortEnded=true;i(j)}j.attr("content","text/html; charset="+g.docencoding)}b("keywords,description,author,copyright,robots".split(","),function(m){var l=f.getAll("meta"),n,p,o=g["meta"+m];for(n=0;n"))},_parseHeader:function(){return new tinymce.html.DomParser({validate:false,root_name:"#document"}).parse(this.head)},_setContent:function(g,d){var m=this,i,c,h=d.content,f,l="",e=m.editor.dom,j;function k(n){return n.replace(/<\/?[A-Z]+/g,function(o){return o.toLowerCase()})}if(d.format=="raw"&&m.head){return}if(d.source_view&&g.getParam("fullpage_hide_in_source_view")){return}h=h.replace(/<(\/?)BODY/gi,"<$1body");i=h.indexOf("",i);m.head=k(h.substring(0,i+1));c=h.indexOf("\n"}f=m._parseHeader();b(f.getAll("style"),function(n){if(n.firstChild){l+=n.firstChild.value}});j=f.getAll("body")[0];if(j){e.setAttribs(m.editor.getBody(),{style:j.attr("style")||"",dir:j.attr("dir")||"",vLink:j.attr("vlink")||"",link:j.attr("link")||"",aLink:j.attr("alink")||""})}if(l){e.add(m.editor.getDoc().getElementsByTagName("head")[0],"style",{id:"fullpage_styles"},l)}else{e.remove("fullpage_styles")}},_getDefaultHeader:function(){var f="",c=this.editor,e,d="";if(c.getParam("fullpage_default_xml_pi")){f+='\n'}f+=c.getParam("fullpage_default_doctype",'');f+="\n\n\n";if(e=c.getParam("fullpage_default_title")){f+=""+e+"\n"}if(e=c.getParam("fullpage_default_encoding")){f+='\n'}if(e=c.getParam("fullpage_default_font_family")){d+="font-family: "+e+";"}if(e=c.getParam("fullpage_default_font_size")){d+="font-size: "+e+";"}if(e=c.getParam("fullpage_default_text_color")){d+="color: "+e+";"}f+="\n\n";return f},_getContent:function(d,e){var c=this;if(!e.source_view||!d.getParam("fullpage_hide_in_source_view")){e.content=tinymce.trim(c.head)+"\n"+tinymce.trim(e.content)+"\n"+tinymce.trim(c.foot)}}});tinymce.PluginManager.add("fullpage",tinymce.plugins.FullPagePlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/fullpage/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/fullpage/editor_plugin_src.js index a2c9df8987..5725b56152 100644 --- a/plugins/TinyMCE/js/plugins/fullpage/editor_plugin_src.js +++ b/plugins/TinyMCE/js/plugins/fullpage/editor_plugin_src.js @@ -9,6 +9,8 @@ */ (function() { + var each = tinymce.each, Node = tinymce.html.Node; + tinymce.create('tinymce.plugins.FullPagePlugin', { init : function(ed, url) { var t = this; @@ -24,7 +26,7 @@ inline : 1 }, { plugin_url : url, - head_html : t.head + data : t._htmlToData() }); }); @@ -32,7 +34,6 @@ ed.addButton('fullpage', {title : 'fullpage.desc', cmd : 'mceFullPageProperties'}); ed.onBeforeSetContent.add(t._setContent, t); - ed.onSetContent.add(t._setBodyAttribs, t); ed.onGetContent.add(t._getContent, t); }, @@ -48,106 +49,351 @@ // Private plugin internal methods - _setBodyAttribs : function(ed, o) { - var bdattr, i, len, kv, k, v, t, attr = this.head.match(/body(.*?)>/i); + _htmlToData : function() { + var headerFragment = this._parseHeader(), data = {}, nodes, elm, matches, editor = this.editor; - if (attr && attr[1]) { - bdattr = attr[1].match(/\s*(\w+\s*=\s*".*?"|\w+\s*=\s*'.*?'|\w+\s*=\s*\w+|\w+)\s*/g); + function getAttr(elm, name) { + var value = elm.attr(name); - if (bdattr) { - for(i = 0, len = bdattr.length; i < len; i++) { - kv = bdattr[i].split('='); - k = kv[0].replace(/\s/,''); - v = kv[1]; + return value || ''; + }; - if (v) { - v = v.replace(/^\s+/,'').replace(/\s+$/,''); - t = v.match(/^["'](.*)["']$/); + // Default some values + data.fontface = editor.getParam("fullpage_default_fontface", ""); + data.fontsize = editor.getParam("fullpage_default_fontsize", ""); - if (t) - v = t[1]; - } else - v = k; - - ed.dom.setAttrib(ed.getBody(), 'style', v); - } - } + // Parse XML PI + elm = headerFragment.firstChild; + if (elm.type == 7) { + data.xml_pi = true; + matches = /encoding="([^"]+)"/.exec(elm.value); + if (matches) + data.docencoding = matches[1]; } + + // Parse doctype + elm = headerFragment.getAll('#doctype')[0]; + if (elm) + data.doctype = '"; + + // Parse title element + elm = headerFragment.getAll('title')[0]; + if (elm && elm.firstChild) { + data.metatitle = elm.firstChild.value; + } + + // Parse meta elements + each(headerFragment.getAll('meta'), function(meta) { + var name = meta.attr('name'), httpEquiv = meta.attr('http-equiv'), matches; + + if (name) + data['meta' + name.toLowerCase()] = meta.attr('content'); + else if (httpEquiv == "Content-Type") { + matches = /charset\s*=\s*(.*)\s*/gi.exec(meta.attr('content')); + + if (matches) + data.docencoding = matches[1]; + } + }); + + // Parse html attribs + elm = headerFragment.getAll('html')[0]; + if (elm) + data.langcode = getAttr(elm, 'lang') || getAttr(elm, 'xml:lang'); + + // Parse stylesheet + elm = headerFragment.getAll('link')[0]; + if (elm && elm.attr('rel') == 'stylesheet') + data.stylesheet = elm.attr('href'); + + // Parse body parts + elm = headerFragment.getAll('body')[0]; + if (elm) { + data.langdir = getAttr(elm, 'dir'); + data.style = getAttr(elm, 'style'); + data.visited_color = getAttr(elm, 'vlink'); + data.link_color = getAttr(elm, 'link'); + data.active_color = getAttr(elm, 'alink'); + } + + return data; }, - _createSerializer : function() { - return new tinymce.dom.Serializer({ - dom : this.editor.dom, - apply_source_formatting : true + _dataToHtml : function(data) { + var headerFragment, headElement, html, elm, value, dom = this.editor.dom; + + function setAttr(elm, name, value) { + elm.attr(name, value ? value : undefined); + }; + + function addHeadNode(node) { + if (headElement.firstChild) + headElement.insert(node, headElement.firstChild); + else + headElement.append(node); + }; + + headerFragment = this._parseHeader(); + headElement = headerFragment.getAll('head')[0]; + if (!headElement) { + elm = headerFragment.getAll('html')[0]; + headElement = new Node('head', 1); + + if (elm.firstChild) + elm.insert(headElement, elm.firstChild, true); + else + elm.append(headElement); + } + + // Add/update/remove XML-PI + elm = headerFragment.firstChild; + if (data.xml_pi) { + value = 'version="1.0"'; + + if (data.docencoding) + value += ' encoding="' + data.docencoding + '"'; + + if (elm.type != 7) { + elm = new Node('xml', 7); + headerFragment.insert(elm, headerFragment.firstChild, true); + } + + elm.value = value; + } else if (elm && elm.type == 7) + elm.remove(); + + // Add/update/remove doctype + elm = headerFragment.getAll('#doctype')[0]; + if (data.doctype) { + if (!elm) { + elm = new Node('#doctype', 10); + + if (data.xml_pi) + headerFragment.insert(elm, headerFragment.firstChild); + else + addHeadNode(elm); + } + + elm.value = data.doctype.substring(9, data.doctype.length - 1); + } else if (elm) + elm.remove(); + + // Add/update/remove title + elm = headerFragment.getAll('title')[0]; + if (data.metatitle) { + if (!elm) { + elm = new Node('title', 1); + elm.append(new Node('#text', 3)).value = data.metatitle; + addHeadNode(elm); + } + } + + // Add meta encoding + if (data.docencoding) { + elm = null; + each(headerFragment.getAll('meta'), function(meta) { + if (meta.attr('http-equiv') == 'Content-Type') + elm = meta; + }); + + if (!elm) { + elm = new Node('meta', 1); + elm.attr('http-equiv', 'Content-Type'); + elm.shortEnded = true; + addHeadNode(elm); + } + + elm.attr('content', 'text/html; charset=' + data.docencoding); + } + + // Add/update/remove meta + each('keywords,description,author,copyright,robots'.split(','), function(name) { + var nodes = headerFragment.getAll('meta'), i, meta, value = data['meta' + name]; + + for (i = 0; i < nodes.length; i++) { + meta = nodes[i]; + + if (meta.attr('name') == name) { + if (value) + meta.attr('content', value); + else + meta.remove(); + + return; + } + } + + if (value) { + elm = new Node('meta', 1); + elm.attr('name', name); + elm.attr('content', value); + elm.shortEnded = true; + + addHeadNode(elm); + } }); + + // Add/update/delete link + elm = headerFragment.getAll('link')[0]; + if (elm && elm.attr('rel') == 'stylesheet') { + if (data.stylesheet) + elm.attr('href', data.stylesheet); + else + elm.remove(); + } else if (data.stylesheet) { + elm = new Node('link', 1); + elm.attr({ + rel : 'stylesheet', + text : 'text/css', + href : data.stylesheet + }); + elm.shortEnded = true; + + addHeadNode(elm); + } + + // Update body attributes + elm = headerFragment.getAll('body')[0]; + if (elm) { + setAttr(elm, 'dir', data.langdir); + setAttr(elm, 'style', data.style); + setAttr(elm, 'vlink', data.visited_color); + setAttr(elm, 'link', data.link_color); + setAttr(elm, 'alink', data.active_color); + + // Update iframe body as well + dom.setAttribs(this.editor.getBody(), { + style : data.style, + dir : data.dir, + vLink : data.visited_color, + link : data.link_color, + aLink : data.active_color + }); + } + + // Set html attributes + elm = headerFragment.getAll('html')[0]; + if (elm) { + setAttr(elm, 'lang', data.langcode); + setAttr(elm, 'xml:lang', data.langcode); + } + + // Serialize header fragment and crop away body part + html = new tinymce.html.Serializer({ + validate: false, + indent: true, + apply_source_formatting : true, + indent_before: 'head,html,body,meta,title,script,link,style', + indent_after: 'head,html,body,meta,title,script,link,style' + }).serialize(headerFragment); + + this.head = html.substring(0, html.indexOf('')); + }, + + _parseHeader : function() { + // Parse the contents with a DOM parser + return new tinymce.html.DomParser({ + validate: false, + root_name: '#document' + }).parse(this.head); }, _setContent : function(ed, o) { - var t = this, sp, ep, c = o.content, v, st = ''; + var self = this, startPos, endPos, content = o.content, headerFragment, styles = '', dom = self.editor.dom, elm; + + function low(s) { + return s.replace(/<\/?[A-Z]+/g, function(a) { + return a.toLowerCase(); + }) + }; // Ignore raw updated if we already have a head, this will fix issues with undo/redo keeping the head/foot separate - if (o.format == 'raw' && t.head) + if (o.format == 'raw' && self.head) return; if (o.source_view && ed.getParam('fullpage_hide_in_source_view')) return; // Parse out head, body and footer - c = c.replace(/<(\/?)BODY/gi, '<$1body'); - sp = c.indexOf('', sp); - t.head = c.substring(0, sp + 1); + if (startPos != -1) { + startPos = content.indexOf('>', startPos); + self.head = low(content.substring(0, startPos + 1)); - ep = c.indexOf('\n'; - - t.head += ed.getParam('fullpage_default_doctype', ''); - t.head += '\n\n\n' + ed.getParam('fullpage_default_title', 'Untitled document') + '\n'; - - if (v = ed.getParam('fullpage_default_encoding')) - t.head += '\n'; - - if (v = ed.getParam('fullpage_default_font_family')) - st += 'font-family: ' + v + ';'; - - if (v = ed.getParam('fullpage_default_font_size')) - st += 'font-size: ' + v + ';'; - - if (v = ed.getParam('fullpage_default_text_color')) - st += 'color: ' + v + ';'; - - t.head += '\n\n'; - t.foot = '\n\n'; + self.head = this._getDefaultHeader(); + self.foot = '\n\n'; } + + // Parse header and update iframe + headerFragment = self._parseHeader(); + each(headerFragment.getAll('style'), function(node) { + if (node.firstChild) + styles += node.firstChild.value; + }); + + elm = headerFragment.getAll('body')[0]; + if (elm) { + dom.setAttribs(self.editor.getBody(), { + style : elm.attr('style') || '', + dir : elm.attr('dir') || '', + vLink : elm.attr('vlink') || '', + link : elm.attr('link') || '', + aLink : elm.attr('alink') || '' + }); + } + + if (styles) + dom.add(self.editor.getDoc().getElementsByTagName('head')[0], 'style', {id : 'fullpage_styles'}, styles); + else + dom.remove('fullpage_styles'); + }, + + _getDefaultHeader : function() { + var header = '', editor = this.editor, value, styles = ''; + + if (editor.getParam('fullpage_default_xml_pi')) + header += '\n'; + + header += editor.getParam('fullpage_default_doctype', ''); + header += '\n\n\n'; + + if (value = editor.getParam('fullpage_default_title')) + header += '' + value + '\n'; + + if (value = editor.getParam('fullpage_default_encoding')) + header += '\n'; + + if (value = editor.getParam('fullpage_default_font_family')) + styles += 'font-family: ' + value + ';'; + + if (value = editor.getParam('fullpage_default_font_size')) + styles += 'font-size: ' + value + ';'; + + if (value = editor.getParam('fullpage_default_text_color')) + styles += 'color: ' + value + ';'; + + header += '\n\n'; + + return header; }, _getContent : function(ed, o) { - var t = this; + var self = this; if (!o.source_view || !ed.getParam('fullpage_hide_in_source_view')) - o.content = tinymce.trim(t.head) + '\n' + tinymce.trim(o.content) + '\n' + tinymce.trim(t.foot); + o.content = tinymce.trim(self.head) + '\n' + tinymce.trim(o.content) + '\n' + tinymce.trim(self.foot); } }); // Register plugin tinymce.PluginManager.add('fullpage', tinymce.plugins.FullPagePlugin); -})(); \ No newline at end of file +})(); diff --git a/plugins/TinyMCE/js/plugins/fullpage/fullpage.htm b/plugins/TinyMCE/js/plugins/fullpage/fullpage.htm index c32afaf2d9..14ab8652ea 100644 --- a/plugins/TinyMCE/js/plugins/fullpage/fullpage.htm +++ b/plugins/TinyMCE/js/plugins/fullpage/fullpage.htm @@ -8,13 +8,12 @@ - -
        + + @@ -72,9 +71,9 @@
           -
        -
        - - +
         
        @@ -147,7 +146,7 @@
        - +
         
        @@ -158,7 +157,7 @@
        - +
         
        @@ -173,15 +172,15 @@ - + - + - + - +
        @@ -195,7 +194,7 @@
        - +
        @@ -205,7 +204,7 @@
        - +
         
        @@ -217,7 +216,7 @@
        - +
         
        @@ -225,16 +224,6 @@
           
        @@ -254,318 +243,17 @@ - + - -
        - - -
        - {#fullpage_dlg.head_elements} - -
        -
        -
        - - -
        -
        - - -
        -
        -
        - -
        -
        - -
        - {#fullpage_dlg.meta_element} - - - - - - - - - - - - - - -
        - - -
        - -
        - {#fullpage_dlg.title_element} - - - - - - -
        - - -
        - -
        - {#fullpage_dlg.script_element} - - - -
        - -
        -
        - - - - - - - - - - - - - - - - - -
        - - - - -
         
        -
        - -
        - -
        -
        - - -
        - -
        - {#fullpage_dlg.style_element} - - - -
        - -
        -
        - - - - - - - - - -
        -
        - -
        - -
        -
        - - -
        - -
        - {#fullpage_dlg.base_element} - - - - - - - - - - -
        - - -
        - - - -
        - {#fullpage_dlg.comment_element} - - - - -
        -
        - + diff --git a/plugins/TinyMCE/js/plugins/fullpage/js/fullpage.js b/plugins/TinyMCE/js/plugins/fullpage/js/fullpage.js index a1bb719a38..3f672ad3ba 100644 --- a/plugins/TinyMCE/js/plugins/fullpage/js/fullpage.js +++ b/plugins/TinyMCE/js/plugins/fullpage/js/fullpage.js @@ -8,464 +8,225 @@ * Contributing: http://tinymce.moxiecode.com/contributing */ -tinyMCEPopup.requireLangPack(); +(function() { + tinyMCEPopup.requireLangPack(); -var doc; + var defaultDocTypes = + 'XHTML 1.0 Transitional=,' + + 'XHTML 1.0 Frameset=,' + + 'XHTML 1.0 Strict=,' + + 'XHTML 1.1=,' + + 'HTML 4.01 Transitional=,' + + 'HTML 4.01 Strict=,' + + 'HTML 4.01 Frameset='; -var defaultDocTypes = - 'XHTML 1.0 Transitional=,' + - 'XHTML 1.0 Frameset=,' + - 'XHTML 1.0 Strict=,' + - 'XHTML 1.1=,' + - 'HTML 4.01 Transitional=,' + - 'HTML 4.01 Strict=,' + - 'HTML 4.01 Frameset='; + var defaultEncodings = + 'Western european (iso-8859-1)=iso-8859-1,' + + 'Central European (iso-8859-2)=iso-8859-2,' + + 'Unicode (UTF-8)=utf-8,' + + 'Chinese traditional (Big5)=big5,' + + 'Cyrillic (iso-8859-5)=iso-8859-5,' + + 'Japanese (iso-2022-jp)=iso-2022-jp,' + + 'Greek (iso-8859-7)=iso-8859-7,' + + 'Korean (iso-2022-kr)=iso-2022-kr,' + + 'ASCII (us-ascii)=us-ascii'; -var defaultEncodings = - 'Western european (iso-8859-1)=iso-8859-1,' + - 'Central European (iso-8859-2)=iso-8859-2,' + - 'Unicode (UTF-8)=utf-8,' + - 'Chinese traditional (Big5)=big5,' + - 'Cyrillic (iso-8859-5)=iso-8859-5,' + - 'Japanese (iso-2022-jp)=iso-2022-jp,' + - 'Greek (iso-8859-7)=iso-8859-7,' + - 'Korean (iso-2022-kr)=iso-2022-kr,' + - 'ASCII (us-ascii)=us-ascii'; + var defaultFontNames = 'Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;WingDings=wingdings'; + var defaultFontSizes = '10px,11px,12px,13px,14px,15px,16px'; -var defaultMediaTypes = - 'all=all,' + - 'screen=screen,' + - 'print=print,' + - 'tty=tty,' + - 'tv=tv,' + - 'projection=projection,' + - 'handheld=handheld,' + - 'braille=braille,' + - 'aural=aural'; + function setVal(id, value) { + var elm = document.getElementById(id); -var defaultFontNames = 'Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;WingDings=wingdings'; -var defaultFontSizes = '10px,11px,12px,13px,14px,15px,16px'; + if (elm) { + value = value || ''; -function init() { - var f = document.forms['fullpage'], el = f.elements, e, i, p, doctypes, encodings, mediaTypes, fonts, ed = tinyMCEPopup.editor, dom = tinyMCEPopup.dom, style; - - // Setup doctype select box - doctypes = ed.getParam("fullpage_doctypes", defaultDocTypes).split(','); - for (i=0; i 1) - addSelectValue(f, 'doctypes', p[0], p[1]); - } - - // Setup fonts select box - fonts = ed.getParam("fullpage_fonts", defaultFontNames).split(';'); - for (i=0; i 1) - addSelectValue(f, 'fontface', p[0], p[1]); - } - - // Setup fontsize select box - fonts = ed.getParam("fullpage_fontsizes", defaultFontSizes).split(','); - for (i=0; i 1) { - addSelectValue(f, 'element_style_media', p[0], p[1]); - addSelectValue(f, 'element_link_media', p[0], p[1]); - } - } - - // Setup encodings select box - encodings = ed.getParam("fullpage_encodings", defaultEncodings).split(','); - for (i=0; i 1) { - addSelectValue(f, 'docencoding', p[0], p[1]); - addSelectValue(f, 'element_script_charset', p[0], p[1]); - addSelectValue(f, 'element_link_charset', p[0], p[1]); - } - } - - document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); - document.getElementById('link_color_pickcontainer').innerHTML = getColorPickerHTML('link_color_pick','link_color'); - //document.getElementById('hover_color_pickcontainer').innerHTML = getColorPickerHTML('hover_color_pick','hover_color'); - document.getElementById('visited_color_pickcontainer').innerHTML = getColorPickerHTML('visited_color_pick','visited_color'); - document.getElementById('active_color_pickcontainer').innerHTML = getColorPickerHTML('active_color_pick','active_color'); - document.getElementById('textcolor_pickcontainer').innerHTML = getColorPickerHTML('textcolor_pick','textcolor'); - document.getElementById('stylesheet_browsercontainer').innerHTML = getBrowserHTML('stylesheetbrowser','stylesheet','file','fullpage'); - document.getElementById('link_href_pickcontainer').innerHTML = getBrowserHTML('link_href_browser','element_link_href','file','fullpage'); - document.getElementById('script_src_pickcontainer').innerHTML = getBrowserHTML('script_src_browser','element_script_src','file','fullpage'); - document.getElementById('bgimage_pickcontainer').innerHTML = getBrowserHTML('bgimage_browser','bgimage','image','fullpage'); - - // Resize some elements - if (isVisible('stylesheetbrowser')) - document.getElementById('stylesheet').style.width = '220px'; - - if (isVisible('link_href_browser')) - document.getElementById('element_link_href').style.width = '230px'; - - if (isVisible('bgimage_browser')) - document.getElementById('bgimage').style.width = '210px'; - - // Add iframe - dom.add(document.body, 'iframe', {id : 'documentIframe', src : 'javascript:""', style : {display : 'none'}}); - doc = dom.get('documentIframe').contentWindow.document; - h = tinyMCEPopup.getWindowArg('head_html'); - - // Preprocess the HTML disable scripts and urls - h = h.replace(/'; - } - - return im; - }); - } - }); + return urlConverter.call(urlConverterScope, url, 'src', 'object'); }, getInfo : function() { @@ -202,210 +223,552 @@ }; }, - // Private methods - _objectsToSpans : function(ed, o) { - var t = this, h = o.content; + /** + * Converts the JSON data object to an img node. + */ + dataToImg : function(data, force_absolute) { + var self = this, editor = self.editor, baseUri = editor.documentBaseURI, sources, attrs, img, i; - h = h.replace(/]*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi, function(a, b, c) { - var o = t._parse(c); + data.params.src = self.convertUrl(data.params.src, force_absolute); - return '' + attrs = data.video.attrs; + if (attrs) + attrs.src = self.convertUrl(attrs.src, force_absolute); + + if (attrs) + attrs.poster = self.convertUrl(attrs.poster, force_absolute); + + sources = toArray(data.video.sources); + if (sources) { + for (i = 0; i < sources.length; i++) + sources[i].src = self.convertUrl(sources[i].src, force_absolute); + } + + img = self.editor.dom.create('img', { + id : data.id, + style : data.style, + align : data.align, + src : self.editor.theme.url + '/img/trans.gif', + 'class' : 'mceItemMedia mceItem' + self.getType(data.type).name, + 'data-mce-json' : JSON.serialize(data, "'") }); - h = h.replace(/]*)>/gi, ''); - h = h.replace(/]*)\/?>/gi, ''); - h = h.replace(/]*)>/gi, ''); - h = h.replace(/<\/(object)([^>]*)>/gi, ''); - h = h.replace(/<\/embed>/gi, ''); - h = h.replace(/]*)>/gi, function(a, b) {return ''}); - h = h.replace(/\/ class=\"mceItemParam\"><\/span>/gi, 'class="mceItemParam">'); + img.width = data.width || "320"; + img.height = data.height || "240"; - o.content = h; + return img; }, - _buildObj : function(o, n) { - var ob, ed = this.editor, dom = ed.dom, p = this._parse(n.title), stc; - - stc = ed.getParam('media_strict', true) && o.type == 'application/x-shockwave-flash'; + /** + * Converts the JSON data object to a HTML string. + */ + dataToHtml : function(data, force_absolute) { + return this.editor.serializer.serialize(this.dataToImg(data, force_absolute), {forced_root_block : '', force_absolute : force_absolute}); + }, - p.width = o.width = dom.getAttrib(n, 'width') || 100; - p.height = o.height = dom.getAttrib(n, 'height') || 100; + /** + * Converts the JSON data object to a HTML string. + */ + htmlToData : function(html) { + var fragment, img, data; - if (p.src) - p.src = ed.convertURL(p.src, 'src', n); + data = { + type : 'flash', + video: {sources:[]}, + params: {} + }; - if (stc) { - ob = dom.create('span', { - id : p.id, - _mce_name : 'object', - type : 'application/x-shockwave-flash', - data : p.src, - style : dom.getAttrib(n, 'style'), - width : o.width, - height : o.height - }); - } else { - ob = dom.create('span', { - id : p.id, - _mce_name : 'object', - classid : "clsid:" + o.classid, - style : dom.getAttrib(n, 'style'), - codebase : o.codebase, - width : o.width, - height : o.height + fragment = this.editor.parser.parse(html); + img = fragment.getAll('img')[0]; + + if (img) { + data = JSON.parse(img.attr('data-mce-json')); + data.type = this.getType(img.attr('class')).name.toLowerCase(); + + // Add some extra properties to the data object + tinymce.each(rootAttributes, function(name) { + var value = img.attr(name); + + if (value) + data[name] = value; }); } - each (p, function(v, k) { - if (!/^(width|height|codebase|classid|id|_cx|_cy)$/.test(k)) { - // Use url instead of src in IE for Windows media - if (o.type == 'application/x-mplayer2' && k == 'src' && !p.url) - k = 'url'; - - if (v) - dom.add(ob, 'span', {_mce_name : 'param', name : k, '_mce_value' : v}); - } - }); - - if (!stc) - dom.add(ob, 'span', tinymce.extend({_mce_name : 'embed', type : o.type, style : dom.getAttrib(n, 'style')}, p)); - - return ob; + return data; }, - _spansToImgs : function(p) { - var t = this, dom = t.editor.dom, im, ci; + /** + * Get type item by extension, class, clsid or mime type. + * + * @method getType + * @param {String} value Value to get type item by. + * @return {Object} Type item object or undefined. + */ + getType : function(value) { + var i, values, typeItem; - each(dom.select('span', p), function(n) { - // Convert object into image - if (dom.getAttrib(n, 'class') == 'mceItemObject') { - ci = dom.getAttrib(n, "classid").toLowerCase().replace(/\s+/g, ''); + // Find type by checking the classes + values = tinymce.explode(value, ' '); + for (i = 0; i < values.length; i++) { + typeItem = this.lookup[values[i]]; - switch (ci) { - case 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000': - dom.replace(t._createImg('mceItemFlash', n), n); - break; + if (typeItem) + return typeItem; + } + }, - case 'clsid:166b1bca-3f9c-11cf-8075-444553540000': - dom.replace(t._createImg('mceItemShockWave', n), n); - break; + /** + * Converts a tinymce.html.Node image element to video/object/embed. + */ + imgToObject : function(node, args) { + var self = this, editor = self.editor, video, object, embed, iframe, name, value, data, + source, sources, params, param, typeItem, i, item, mp4Source, replacement, + posterSrc, style; - case 'clsid:6bf52a52-394a-11d3-b153-00c04f79faa6': - case 'clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95': - case 'clsid:05589fa1-c356-11ce-bf01-00aa0055595a': - dom.replace(t._createImg('mceItemWindowsMedia', n), n); - break; + // Adds the flash player + function addPlayer(video_src, poster_src) { + var baseUri, flashVars, flashVarsOutput, params, flashPlayer; - case 'clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b': - dom.replace(t._createImg('mceItemQuickTime', n), n); - break; + flashPlayer = editor.getParam('flash_video_player_url', self.convertUrl(self.url + '/moxieplayer.swf')); + if (flashPlayer) { + baseUri = editor.documentBaseURI; + data.params.src = flashPlayer; - case 'clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa': - dom.replace(t._createImg('mceItemRealMedia', n), n); - break; - - default: - dom.replace(t._createImg('mceItemFlash', n), n); + // Convert the movie url to absolute urls + if (editor.getParam('flash_video_player_absvideourl', true)) { + video_src = baseUri.toAbsolute(video_src || '', true); + poster_src = baseUri.toAbsolute(poster_src || '', true); } - + + // Generate flash vars + flashVarsOutput = ''; + flashVars = editor.getParam('flash_video_player_flashvars', {url : '$url', poster : '$poster'}); + tinymce.each(flashVars, function(value, name) { + // Replace $url and $poster variables in flashvars value + value = value.replace(/\$url/, video_src || ''); + value = value.replace(/\$poster/, poster_src || ''); + + if (value.length > 0) + flashVarsOutput += (flashVarsOutput ? '&' : '') + name + '=' + escape(value); + }); + + if (flashVarsOutput.length) + data.params.flashvars = flashVarsOutput; + + params = editor.getParam('flash_video_player_params', { + allowfullscreen: true, + allowscriptaccess: true + }); + + tinymce.each(params, function(value, name) { + data.params[name] = "" + value; + }); + } + }; + + data = node.attr('data-mce-json'); + if (!data) + return; + + data = JSON.parse(data); + typeItem = this.getType(node.attr('class')); + + style = node.attr('data-mce-style') + if (!style) { + style = node.attr('style'); + + if (style) + style = editor.dom.serializeStyle(editor.dom.parseStyle(style, 'img')); + } + + // Handle iframe + if (typeItem.name === 'Iframe') { + replacement = new Node('iframe', 1); + + tinymce.each(rootAttributes, function(name) { + var value = node.attr(name); + + if (name == 'class' && value) + value = value.replace(/mceItem.+ ?/g, ''); + + if (value && value.length > 0) + replacement.attr(name, value); + }); + + for (name in data.params) + replacement.attr(name, data.params[name]); + + replacement.attr({ + style: style, + src: data.params.src + }); + + node.replace(replacement); + + return; + } + + // Handle scripts + if (this.editor.settings.media_use_script) { + replacement = new Node('script', 1).attr('type', 'text/javascript'); + + value = new Node('#text', 3); + value.value = 'write' + typeItem.name + '(' + JSON.serialize(tinymce.extend(data.params, { + width: node.attr('width'), + height: node.attr('height') + })) + ');'; + + replacement.append(value); + node.replace(replacement); + + return; + } + + // Add HTML5 video element + if (typeItem.name === 'Video' && data.video.sources[0]) { + // Create new object element + video = new Node('video', 1).attr(tinymce.extend({ + id : node.attr('id'), + width: node.attr('width'), + height: node.attr('height'), + style : style + }, data.video.attrs)); + + // Get poster source and use that for flash fallback + if (data.video.attrs) + posterSrc = data.video.attrs.poster; + + sources = data.video.sources = toArray(data.video.sources); + for (i = 0; i < sources.length; i++) { + if (/\.mp4$/.test(sources[i].src)) + mp4Source = sources[i].src; + } + + if (!sources[0].type) { + video.attr('src', sources[0].src); + sources.splice(0, 1); + } + + for (i = 0; i < sources.length; i++) { + source = new Node('source', 1).attr(sources[i]); + source.shortEnded = true; + video.append(source); + } + + // Create flash fallback for video if we have a mp4 source + if (mp4Source) { + addPlayer(mp4Source, posterSrc); + typeItem = self.getType('flash'); + } else + data.params.src = ''; + } + + // Do we have a params src then we can generate object + if (data.params.src) { + // Is flv movie add player for it + if (/\.flv$/i.test(data.params.src)) + addPlayer(data.params.src, ''); + + if (args && args.force_absolute) + data.params.src = editor.documentBaseURI.toAbsolute(data.params.src); + + // Create new object element + object = new Node('object', 1).attr({ + id : node.attr('id'), + width: node.attr('width'), + height: node.attr('height'), + style : style + }); + + tinymce.each(rootAttributes, function(name) { + if (data[name] && name != 'type') + object.attr(name, data[name]); + }); + + // Add params + for (name in data.params) { + param = new Node('param', 1); + param.shortEnded = true; + value = data.params[name]; + + // Windows media needs to use url instead of src for the media URL + if (name === 'src' && typeItem.name === 'WindowsMedia') + name = 'url'; + + param.attr({name: name, value: value}); + object.append(param); + } + + // Setup add type and classid if strict is disabled + if (this.editor.getParam('media_strict', true)) { + object.attr({ + data: data.params.src, + type: typeItem.mimes[0] + }); + } else { + object.attr({ + classid: "clsid:" + typeItem.clsids[0], + codebase: typeItem.codebase + }); + + embed = new Node('embed', 1); + embed.shortEnded = true; + embed.attr({ + id: node.attr('id'), + width: node.attr('width'), + height: node.attr('height'), + style : style, + type: typeItem.mimes[0] + }); + + for (name in data.params) + embed.attr(name, data.params[name]); + + tinymce.each(rootAttributes, function(name) { + if (data[name] && name != 'type') + embed.attr(name, data[name]); + }); + + object.append(embed); + } + + // Insert raw HTML + if (data.object_html) { + value = new Node('#text', 3); + value.raw = true; + value.value = data.object_html; + object.append(value); + } + + // Append object to video element if it exists + if (video) + video.append(object); + } + + if (video) { + // Insert raw HTML + if (data.video_html) { + value = new Node('#text', 3); + value.raw = true; + value.value = data.video_html; + video.append(value); + } + } + + if (video || object) + node.replace(video || object); + else + node.remove(); + }, + + /** + * Converts a tinymce.html.Node video/object/embed to an img element. + * + * The video/object/embed will be converted into an image placeholder with a JSON data attribute like this: + * + * + * The JSON structure will be like this: + * {'params':{'flashvars':'something','quality':'high','src':'someurl'}, 'video':{'sources':[{src: 'someurl', type: 'video/mp4'}]}} + */ + objectToImg : function(node) { + var object, embed, video, iframe, img, name, id, width, height, style, i, html, + param, params, source, sources, data, type, lookup = this.lookup, + matches, attrs, urlConverter = this.editor.settings.url_converter, + urlConverterScope = this.editor.settings.url_converter_scope; + + function getInnerHTML(node) { + return new tinymce.html.Serializer({ + inner: true, + validate: false + }).serialize(node); + }; + + // If node isn't in document + if (!node.parent) + return; + + // Handle media scripts + if (node.name === 'script') { + if (node.firstChild) + matches = scriptRegExp.exec(node.firstChild.value); + + if (!matches) return; + + type = matches[1]; + data = {video : {}, params : JSON.parse(matches[2])}; + width = data.params.width; + height = data.params.height; + } + + // Setup data objects + data = data || { + video : {}, + params : {} + }; + + // Setup new image object + img = new Node('img', 1); + img.attr({ + src : this.editor.theme.url + '/img/trans.gif' + }); + + // Video element + name = node.name; + if (name === 'video') { + video = node; + object = node.getAll('object')[0]; + embed = node.getAll('embed')[0]; + width = video.attr('width'); + height = video.attr('height'); + id = video.attr('id'); + data.video = {attrs : {}, sources : []}; + + // Get all video attributes + attrs = data.video.attrs; + for (name in video.attributes.map) + attrs[name] = video.attributes.map[name]; + + source = node.attr('src'); + if (source) + data.video.sources.push({src : urlConverter.call(urlConverterScope, source, 'src', 'video')}); + + // Get all sources + sources = video.getAll("source"); + for (i = 0; i < sources.length; i++) { + source = sources[i].remove(); + + data.video.sources.push({ + src: urlConverter.call(urlConverterScope, source.attr('src'), 'src', 'source'), + type: source.attr('type'), + media: source.attr('media') + }); } - // Convert embed into image - if (dom.getAttrib(n, 'class') == 'mceItemEmbed') { - switch (dom.getAttrib(n, 'type')) { - case 'application/x-shockwave-flash': - dom.replace(t._createImg('mceItemFlash', n), n); - break; + // Convert the poster URL + if (attrs.poster) + attrs.poster = urlConverter.call(urlConverterScope, attrs.poster, 'poster', 'video'); + } - case 'application/x-director': - dom.replace(t._createImg('mceItemShockWave', n), n); - break; + // Object element + if (node.name === 'object') { + object = node; + embed = node.getAll('embed')[0]; + } - case 'application/x-mplayer2': - dom.replace(t._createImg('mceItemWindowsMedia', n), n); - break; + // Embed element + if (node.name === 'embed') + embed = node; - case 'video/quicktime': - dom.replace(t._createImg('mceItemQuickTime', n), n); - break; + // Iframe element + if (node.name === 'iframe') { + iframe = node; + type = 'Iframe'; + } - case 'audio/x-pn-realaudio-plugin': - dom.replace(t._createImg('mceItemRealMedia', n), n); - break; + if (object) { + // Get width/height + width = width || object.attr('width'); + height = height || object.attr('height'); + style = style || object.attr('style'); + id = id || object.attr('id'); - default: - dom.replace(t._createImg('mceItemFlash', n), n); - } - } - }); - }, + // Get all object params + params = object.getAll("param"); + for (i = 0; i < params.length; i++) { + param = params[i]; + name = param.remove().attr('name'); - _createImg : function(cl, n) { - var im, dom = this.editor.dom, pa = {}, ti = '', args; + if (!excludedAttrs[name]) + data.params[name] = param.attr('value'); + } - args = ['id', 'name', 'width', 'height', 'bgcolor', 'align', 'flashvars', 'src', 'wmode', 'allowfullscreen', 'quality', 'data']; + data.params.src = data.params.src || object.attr('data'); + } - // Create image - im = dom.create('img', { - src : this.url + '/img/trans.gif', - width : dom.getAttrib(n, 'width') || 100, - height : dom.getAttrib(n, 'height') || 100, - style : dom.getAttrib(n, 'style'), - 'class' : cl - }); + if (embed) { + // Get width/height + width = width || embed.attr('width'); + height = height || embed.attr('height'); + style = style || embed.attr('style'); + id = id || embed.attr('id'); - // Setup base parameters - each(args, function(na) { - var v = dom.getAttrib(n, na); + // Get all embed attributes + for (name in embed.attributes.map) { + if (!excludedAttrs[name] && !data.params[name]) + data.params[name] = embed.attributes.map[name]; + } + } - if (v) - pa[na] = v; - }); + if (iframe) { + // Get width/height + width = iframe.attr('width'); + height = iframe.attr('height'); + style = style || iframe.attr('style'); + id = iframe.attr('id'); - // Add optional parameters - each(dom.select('span', n), function(n) { - if (dom.hasClass(n, 'mceItemParam')) - pa[dom.getAttrib(n, 'name')] = dom.getAttrib(n, '_mce_value'); - }); + tinymce.each(rootAttributes, function(name) { + img.attr(name, iframe.attr(name)); + }); + + // Get all iframe attributes + for (name in iframe.attributes.map) { + if (!excludedAttrs[name] && !data.params[name]) + data.params[name] = iframe.attributes.map[name]; + } + } // Use src not movie - if (pa.movie) { - pa.src = pa.movie; - delete pa.movie; + if (data.params.movie) { + data.params.src = data.params.src || data.params.movie; + delete data.params.movie; } - // No src try data - if (!pa.src) { - pa.src = pa.data; - delete pa.data; + // Convert the URL to relative/absolute depending on configuration + if (data.params.src) + data.params.src = urlConverter.call(urlConverterScope, data.params.src, 'src', 'object'); + + if (video) + type = lookup.video.name; + + if (object && !type) + type = (lookup[(object.attr('clsid') || '').toLowerCase()] || lookup[(object.attr('type') || '').toLowerCase()] || {}).name; + + if (embed && !type) + type = (lookup[(embed.attr('type') || '').toLowerCase()] || {}).name; + + // Replace the video/object/embed element with a placeholder image containing the data + node.replace(img); + + // Remove embed + if (embed) + embed.remove(); + + // Serialize the inner HTML of the object element + if (object) { + html = getInnerHTML(object.remove()); + + if (html) + data.object_html = html; } - // Merge with embed args - n = dom.select('.mceItemEmbed', n)[0]; - if (n) { - each(args, function(na) { - var v = dom.getAttrib(n, na); + // Serialize the inner HTML of the video element + if (video) { + html = getInnerHTML(video.remove()); - if (v && !pa[na]) - pa[na] = v; - }); + if (html) + data.video_html = html; } - delete pa.width; - delete pa.height; - - im.title = this._serialize(pa); - - return im; - }, - - _parse : function(s) { - return tinymce.util.JSON.parse('{' + s + '}'); - }, - - _serialize : function(o) { - return tinymce.util.JSON.serialize(o).replace(/[{}]/g, ''); + // Set width/height of placeholder + img.attr({ + id : id, + 'class' : 'mceItemMedia mceItem' + (type || 'Flash'), + style : style, + width : width || "320", + height : height || "240", + "data-mce-json" : JSON.serialize(data, "'") + }); } }); diff --git a/plugins/TinyMCE/js/plugins/media/img/flash.gif b/plugins/TinyMCE/js/plugins/media/img/flash.gif deleted file mode 100644 index cb192e6ced..0000000000 Binary files a/plugins/TinyMCE/js/plugins/media/img/flash.gif and /dev/null differ diff --git a/plugins/TinyMCE/js/plugins/media/img/flv_player.swf b/plugins/TinyMCE/js/plugins/media/img/flv_player.swf deleted file mode 100644 index 042c2ab969..0000000000 Binary files a/plugins/TinyMCE/js/plugins/media/img/flv_player.swf and /dev/null differ diff --git a/plugins/TinyMCE/js/plugins/media/img/quicktime.gif b/plugins/TinyMCE/js/plugins/media/img/quicktime.gif deleted file mode 100644 index 3b0499145b..0000000000 Binary files a/plugins/TinyMCE/js/plugins/media/img/quicktime.gif and /dev/null differ diff --git a/plugins/TinyMCE/js/plugins/media/img/shockwave.gif b/plugins/TinyMCE/js/plugins/media/img/shockwave.gif deleted file mode 100644 index 5f235dfc73..0000000000 Binary files a/plugins/TinyMCE/js/plugins/media/img/shockwave.gif and /dev/null differ diff --git a/plugins/TinyMCE/js/plugins/media/js/media.js b/plugins/TinyMCE/js/plugins/media/js/media.js index 86cfa98563..a8acdd12d1 100644 --- a/plugins/TinyMCE/js/plugins/media/js/media.js +++ b/plugins/TinyMCE/js/plugins/media/js/media.js @@ -1,630 +1,355 @@ -tinyMCEPopup.requireLangPack(); +(function() { + var url; -var oldWidth, oldHeight, ed, url; + if (url = tinyMCEPopup.getParam("media_external_list_url")) + document.write(''); -if (url = tinyMCEPopup.getParam("media_external_list_url")) - document.write(''); + function get(id) { + return document.getElementById(id); + } -function init() { - var pl = "", f, val; - var type = "flash", fe, i; + function getVal(id) { + var elm = get(id); - ed = tinyMCEPopup.editor; + if (elm.nodeName == "SELECT") + return elm.options[elm.selectedIndex].value; - tinyMCEPopup.resizeToInnerSize(); - f = document.forms[0] + if (elm.type == "checkbox") + return elm.checked; - fe = ed.selection.getNode(); - if (/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(ed.dom.getAttrib(fe, 'class'))) { - pl = fe.title; + return elm.value; + } - switch (ed.dom.getAttrib(fe, 'class')) { - case 'mceItemFlash': - type = 'flash'; - break; + function setVal(id, value, name) { + if (typeof(value) != 'undefined') { + var elm = get(id); - case 'mceItemFlashVideo': - type = 'flv'; - break; - - case 'mceItemShockWave': - type = 'shockwave'; - break; - - case 'mceItemWindowsMedia': - type = 'wmp'; - break; - - case 'mceItemQuickTime': - type = 'qt'; - break; - - case 'mceItemRealMedia': - type = 'rmp'; - break; + if (elm.nodeName == "SELECT") + selectByValue(document.forms[0], id, value); + else if (elm.type == "checkbox") { + if (typeof(value) == 'string') { + value = value.toLowerCase(); + value = (!name && value === 'true') || (name && value === name.toLowerCase()); + } + elm.checked = !!value; + } else + elm.value = value; } - - document.forms[0].insert.value = ed.getLang('update', 'Insert', true); } - document.getElementById('filebrowsercontainer').innerHTML = getBrowserHTML('filebrowser','src','media','media'); - document.getElementById('qtsrcfilebrowsercontainer').innerHTML = getBrowserHTML('qtsrcfilebrowser','qt_qtsrc','media','media'); - document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); - - var html = getMediaListHTML('medialist','src','media','media'); - if (html == "") - document.getElementById("linklistrow").style.display = 'none'; - else - document.getElementById("linklistcontainer").innerHTML = html; - - // Resize some elements - if (isVisible('filebrowser')) - document.getElementById('src').style.width = '230px'; - - // Setup form - if (pl != "") { - pl = tinyMCEPopup.editor.plugins.media._parse(pl); - - switch (type) { - case "flash": - setBool(pl, 'flash', 'play'); - setBool(pl, 'flash', 'loop'); - setBool(pl, 'flash', 'menu'); - setBool(pl, 'flash', 'swliveconnect'); - setStr(pl, 'flash', 'quality'); - setStr(pl, 'flash', 'scale'); - setStr(pl, 'flash', 'salign'); - setStr(pl, 'flash', 'wmode'); - setStr(pl, 'flash', 'base'); - setStr(pl, 'flash', 'flashvars'); - break; - - case "qt": - setBool(pl, 'qt', 'loop'); - setBool(pl, 'qt', 'autoplay'); - setBool(pl, 'qt', 'cache'); - setBool(pl, 'qt', 'controller'); - setBool(pl, 'qt', 'correction'); - setBool(pl, 'qt', 'enablejavascript'); - setBool(pl, 'qt', 'kioskmode'); - setBool(pl, 'qt', 'autohref'); - setBool(pl, 'qt', 'playeveryframe'); - setBool(pl, 'qt', 'tarsetcache'); - setStr(pl, 'qt', 'scale'); - setStr(pl, 'qt', 'starttime'); - setStr(pl, 'qt', 'endtime'); - setStr(pl, 'qt', 'tarset'); - setStr(pl, 'qt', 'qtsrcchokespeed'); - setStr(pl, 'qt', 'volume'); - setStr(pl, 'qt', 'qtsrc'); - break; - - case "shockwave": - setBool(pl, 'shockwave', 'sound'); - setBool(pl, 'shockwave', 'progress'); - setBool(pl, 'shockwave', 'autostart'); - setBool(pl, 'shockwave', 'swliveconnect'); - setStr(pl, 'shockwave', 'swvolume'); - setStr(pl, 'shockwave', 'swstretchstyle'); - setStr(pl, 'shockwave', 'swstretchhalign'); - setStr(pl, 'shockwave', 'swstretchvalign'); - break; - - case "wmp": - setBool(pl, 'wmp', 'autostart'); - setBool(pl, 'wmp', 'enabled'); - setBool(pl, 'wmp', 'enablecontextmenu'); - setBool(pl, 'wmp', 'fullscreen'); - setBool(pl, 'wmp', 'invokeurls'); - setBool(pl, 'wmp', 'mute'); - setBool(pl, 'wmp', 'stretchtofit'); - setBool(pl, 'wmp', 'windowlessvideo'); - setStr(pl, 'wmp', 'balance'); - setStr(pl, 'wmp', 'baseurl'); - setStr(pl, 'wmp', 'captioningid'); - setStr(pl, 'wmp', 'currentmarker'); - setStr(pl, 'wmp', 'currentposition'); - setStr(pl, 'wmp', 'defaultframe'); - setStr(pl, 'wmp', 'playcount'); - setStr(pl, 'wmp', 'rate'); - setStr(pl, 'wmp', 'uimode'); - setStr(pl, 'wmp', 'volume'); - break; - - case "rmp": - setBool(pl, 'rmp', 'autostart'); - setBool(pl, 'rmp', 'loop'); - setBool(pl, 'rmp', 'autogotourl'); - setBool(pl, 'rmp', 'center'); - setBool(pl, 'rmp', 'imagestatus'); - setBool(pl, 'rmp', 'maintainaspect'); - setBool(pl, 'rmp', 'nojava'); - setBool(pl, 'rmp', 'prefetch'); - setBool(pl, 'rmp', 'shuffle'); - setStr(pl, 'rmp', 'console'); - setStr(pl, 'rmp', 'controls'); - setStr(pl, 'rmp', 'numloop'); - setStr(pl, 'rmp', 'scriptcallbacks'); - break; - } - - setStr(pl, null, 'src'); - setStr(pl, null, 'id'); - setStr(pl, null, 'name'); - setStr(pl, null, 'vspace'); - setStr(pl, null, 'hspace'); - setStr(pl, null, 'bgcolor'); - setStr(pl, null, 'align'); - setStr(pl, null, 'width'); - setStr(pl, null, 'height'); - - if ((val = ed.dom.getAttrib(fe, "width")) != "") - pl.width = f.width.value = val; - - if ((val = ed.dom.getAttrib(fe, "height")) != "") - pl.height = f.height.value = val; - - oldWidth = pl.width ? parseInt(pl.width) : 0; - oldHeight = pl.height ? parseInt(pl.height) : 0; - } else - oldWidth = oldHeight = 0; - - selectByValue(f, 'media_type', type); - changedType(type); - updateColor('bgcolor_pick', 'bgcolor'); - - TinyMCE_EditableSelects.init(); - generatePreview(); -} - -function insertMedia() { - var fe, f = document.forms[0], h; - - tinyMCEPopup.restoreSelection(); - - if (!AutoValidator.validate(f)) { - tinyMCEPopup.alert(ed.getLang('invalid_data')); - return false; - } - - f.width.value = f.width.value == "" ? 100 : f.width.value; - f.height.value = f.height.value == "" ? 100 : f.height.value; - - fe = ed.selection.getNode(); - if (fe != null && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(ed.dom.getAttrib(fe, 'class'))) { - switch (f.media_type.options[f.media_type.selectedIndex].value) { - case "flash": - fe.className = "mceItemFlash"; - break; - - case "flv": - fe.className = "mceItemFlashVideo"; - break; - - case "shockwave": - fe.className = "mceItemShockWave"; - break; - - case "qt": - fe.className = "mceItemQuickTime"; - break; - - case "wmp": - fe.className = "mceItemWindowsMedia"; - break; - - case "rmp": - fe.className = "mceItemRealMedia"; - break; - } - - if (fe.width != f.width.value || fe.height != f.height.value) - ed.execCommand('mceRepaint'); - - fe.title = serializeParameters(); - fe.width = f.width.value; - fe.height = f.height.value; - fe.style.width = f.width.value + (f.width.value.indexOf('%') == -1 ? 'px' : ''); - fe.style.height = f.height.value + (f.height.value.indexOf('%') == -1 ? 'px' : ''); - fe.align = f.align.options[f.align.selectedIndex].value; - } else { - h = ' 0) { - var html = ""; - - html += ''; - - return html; - } - - return ""; -} - -function getType(v) { - var fo, i, c, el, x, f = document.forms[0]; - - fo = ed.getParam("media_types", "flash=swf;flv=flv;shockwave=dcr;qt=mov,qt,mpg,mp3,mp4,mpeg;shockwave=dcr;wmp=avi,wmv,wm,asf,asx,wmx,wvx;rmp=rm,ra,ram").split(';'); - - // YouTube - if (v.match(/watch\?v=(.+)(.*)/)) { - f.width.value = '425'; - f.height.value = '350'; - f.src.value = 'http://www.youtube.com/v/' + v.match(/v=(.*)(.*)/)[0].split('=')[1]; - return 'flash'; - } - - // Google video - if (v.indexOf('http://video.google.com/videoplay?docid=') == 0) { - f.width.value = '425'; - f.height.value = '326'; - f.src.value = 'http://video.google.com/googleplayer.swf?docId=' + v.substring('http://video.google.com/videoplay?docid='.length) + '&hl=en'; - return 'flash'; - } - - for (i=0; i 0 ? s.substring(0, s.length - 1) : s; - - return s; -} - -function setBool(pl, p, n) { - if (typeof(pl[n]) == "undefined") - return; - - document.forms[0].elements[p + "_" + n].checked = pl[n] != 'false'; -} - -function setStr(pl, p, n) { - var f = document.forms[0], e = f.elements[(p != null ? p + "_" : '') + n]; - - if (typeof(pl[n]) == "undefined") - return; - - if (e.type == "text") - e.value = pl[n]; - else - selectByValue(f, (p != null ? p + "_" : '') + n, pl[n]); -} - -function getBool(p, n, d, tv, fv) { - var v = document.forms[0].elements[p + "_" + n].checked; - - tv = typeof(tv) == 'undefined' ? 'true' : "'" + jsEncode(tv) + "'"; - fv = typeof(fv) == 'undefined' ? 'false' : "'" + jsEncode(fv) + "'"; - - return (v == d) ? '' : n + (v ? ':' + tv + ',' : ":\'" + fv + "\',"); -} - -function getStr(p, n, d) { - var e = document.forms[0].elements[(p != null ? p + "_" : "") + n]; - var v = e.type == "text" ? e.value : e.options[e.selectedIndex].value; - - if (n == 'src') - v = tinyMCEPopup.editor.convertURL(v, 'src', null); - - return ((n == d || v == '') ? '' : n + ":'" + jsEncode(v) + "',"); -} - -function getInt(p, n, d) { - var e = document.forms[0].elements[(p != null ? p + "_" : "") + n]; - var v = e.type == "text" ? e.value : e.options[e.selectedIndex].value; - - return ((n == d || v == '') ? '' : n + ":" + v.replace(/[^0-9]+/g, '') + ","); -} - -function jsEncode(s) { - s = s.replace(new RegExp('\\\\', 'g'), '\\\\'); - s = s.replace(new RegExp('"', 'g'), '\\"'); - s = s.replace(new RegExp("'", 'g'), "\\'"); - - return s; -} - -function generatePreview(c) { - var f = document.forms[0], p = document.getElementById('prev'), h = '', cls, pl, n, type, codebase, wp, hp, nw, nh; - - p.innerHTML = ''; - - nw = parseInt(f.width.value); - nh = parseInt(f.height.value); - - if (f.width.value != "" && f.height.value != "") { - if (f.constrain.checked) { - if (c == 'width' && oldWidth != 0) { - wp = nw / oldWidth; - nh = Math.round(wp * nh); - f.height.value = nh; - } else if (c == 'height' && oldHeight != 0) { - hp = nh / oldHeight; - nw = Math.round(hp * nw); - f.width.value = nw; + window.Media = { + init : function() { + var html, editor; + + this.editor = editor = tinyMCEPopup.editor; + + // Setup file browsers and color pickers + get('filebrowsercontainer').innerHTML = getBrowserHTML('filebrowser','src','media','media'); + get('qtsrcfilebrowsercontainer').innerHTML = getBrowserHTML('qtsrcfilebrowser','quicktime_qtsrc','media','media'); + get('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); + get('video_altsource1_filebrowser').innerHTML = getBrowserHTML('filebrowser_altsource1','video_altsource1','media','media'); + get('video_altsource2_filebrowser').innerHTML = getBrowserHTML('filebrowser_altsource2','video_altsource2','media','media'); + get('video_poster_filebrowser').innerHTML = getBrowserHTML('filebrowser_poster','video_poster','media','image'); + + html = this.getMediaListHTML('medialist', 'src', 'media', 'media'); + if (html == "") + get("linklistrow").style.display = 'none'; + else + get("linklistcontainer").innerHTML = html; + + if (isVisible('filebrowser')) + get('src').style.width = '230px'; + + if (isVisible('filebrowser_altsource1')) + get('video_altsource1').style.width = '220px'; + + if (isVisible('filebrowser_altsource2')) + get('video_altsource2').style.width = '220px'; + + if (isVisible('filebrowser_poster')) + get('video_poster').style.width = '220px'; + + this.data = tinyMCEPopup.getWindowArg('data'); + this.dataToForm(); + this.preview(); + }, + + insert : function() { + var editor = tinyMCEPopup.editor; + + this.formToData(); + editor.execCommand('mceRepaint'); + tinyMCEPopup.restoreSelection(); + editor.selection.setNode(editor.plugins.media.dataToImg(this.data)); + tinyMCEPopup.close(); + }, + + preview : function() { + get('prev').innerHTML = this.editor.plugins.media.dataToHtml(this.data, true); + }, + + moveStates : function(to_form, field) { + var data = this.data, editor = this.editor, data = this.data, + mediaPlugin = editor.plugins.media, ext, src, typeInfo, defaultStates, src; + + defaultStates = { + // QuickTime + quicktime_autoplay : true, + quicktime_controller : true, + + // Flash + flash_play : true, + flash_loop : true, + flash_menu : true, + + // WindowsMedia + windowsmedia_autostart : true, + windowsmedia_enablecontextmenu : true, + windowsmedia_invokeurls : true, + + // RealMedia + realmedia_autogotourl : true, + realmedia_imagestatus : true + }; + + function parseQueryParams(str) { + var out = {}; + + if (str) { + tinymce.each(str.split('&'), function(item) { + var parts = item.split('='); + + out[unescape(parts[0])] = unescape(parts[1]); + }); + } + + return out; + }; + + function setOptions(type, names) { + var i, name, formItemName, value, list; + + if (type == data.type || type == 'global') { + names = tinymce.explode(names); + for (i = 0; i < names.length; i++) { + name = names[i]; + formItemName = type == 'global' ? name : type + '_' + name; + + if (type == 'global') + list = data; + else if (type == 'video') { + list = data.video.attrs; + + if (!list && !to_form) + data.video.attrs = list = {}; + } else + list = data.params; + + if (list) { + if (to_form) { + setVal(formItemName, list[name], type == 'video' ? name : ''); + } else { + delete list[name]; + + value = getVal(formItemName); + if (type == 'video' && value === true) + value = name; + + if (defaultStates[formItemName]) { + if (value !== defaultStates[formItemName]) { + value = "" + value; + list[name] = value; + } + } else if (value) { + value = "" + value; + list[name] = value; + } + } + } + } + } } + + if (!to_form) { + data.type = get('media_type').options[get('media_type').selectedIndex].value; + data.width = getVal('width'); + data.height = getVal('height'); + + // Switch type based on extension + src = getVal('src'); + if (field == 'src') { + ext = src.replace(/^.*\.([^.]+)$/, '$1'); + if (typeInfo = mediaPlugin.getType(ext)) + data.type = typeInfo.name.toLowerCase(); + + setVal('media_type', data.type); + } + + if (data.type == "video") { + if (!data.video.sources) + data.video.sources = []; + + data.video.sources[0] = {src: getVal('src')}; + } + } + + // Hide all fieldsets and show the one active + get('video_options').style.display = 'none'; + get('flash_options').style.display = 'none'; + get('quicktime_options').style.display = 'none'; + get('shockwave_options').style.display = 'none'; + get('windowsmedia_options').style.display = 'none'; + get('realmedia_options').style.display = 'none'; + + if (get(data.type + '_options')) + get(data.type + '_options').style.display = 'block'; + + setVal('media_type', data.type); + + setOptions('flash', 'play,loop,menu,swliveconnect,quality,scale,salign,wmode,base,flashvars'); + setOptions('quicktime', 'loop,autoplay,cache,controller,correction,enablejavascript,kioskmode,autohref,playeveryframe,targetcache,scale,starttime,endtime,target,qtsrcchokespeed,volume,qtsrc'); + setOptions('shockwave', 'sound,progress,autostart,swliveconnect,swvolume,swstretchstyle,swstretchhalign,swstretchvalign'); + setOptions('windowsmedia', 'autostart,enabled,enablecontextmenu,fullscreen,invokeurls,mute,stretchtofit,windowlessvideo,balance,baseurl,captioningid,currentmarker,currentposition,defaultframe,playcount,rate,uimode,volume'); + setOptions('realmedia', 'autostart,loop,autogotourl,center,imagestatus,maintainaspect,nojava,prefetch,shuffle,console,controls,numloop,scriptcallbacks'); + setOptions('video', 'poster,autoplay,loop,preload,controls'); + setOptions('global', 'id,name,vspace,hspace,bgcolor,align,width,height'); + + if (to_form) { + if (data.type == 'video') { + if (data.video.sources[0]) + setVal('src', data.video.sources[0].src); + + src = data.video.sources[1]; + if (src) + setVal('video_altsource1', src.src); + + src = data.video.sources[2]; + if (src) + setVal('video_altsource2', src.src); + } else { + // Check flash vars + if (data.type == 'flash') { + tinymce.each(editor.getParam('flash_video_player_flashvars', {url : '$url', poster : '$poster'}), function(value, name) { + if (value == '$url') + data.params.src = parseQueryParams(data.params.flashvars)[name] || data.params.src; + }); + } + + setVal('src', data.params.src); + } + } else { + src = getVal("src"); + + // YouTube + if (src.match(/youtube.com(.+)v=([^&]+)/)) { + data.width = 425; + data.height = 350; + data.params.frameborder = '0'; + data.type = 'iframe'; + src = 'http://www.youtube.com/embed/' + src.match(/v=([^&]+)/)[1]; + setVal('src', src); + setVal('media_type', data.type); + } + + // Google video + if (src.match(/video.google.com(.+)docid=([^&]+)/)) { + data.width = 425; + data.height = 326; + data.type = 'flash'; + src = 'http://video.google.com/googleplayer.swf?docId=' + src.match(/docid=([^&]+)/)[1] + '&hl=en'; + setVal('src', src); + setVal('media_type', data.type); + } + + if (data.type == 'video') { + if (!data.video.sources) + data.video.sources = []; + + data.video.sources[0] = {src : src}; + + src = getVal("video_altsource1"); + if (src) + data.video.sources[1] = {src : src}; + + src = getVal("video_altsource2"); + if (src) + data.video.sources[2] = {src : src}; + } else + data.params.src = src; + + // Set default size + setVal('width', data.width || 320); + setVal('height', data.height || 240); + } + }, + + dataToForm : function() { + this.moveStates(true); + }, + + formToData : function(field) { + if (field == "width" || field == "height") + this.changeSize(field); + + if (field == 'source') { + this.moveStates(false, field); + setVal('source', this.editor.plugins.media.dataToHtml(this.data)); + this.panel = 'source'; + } else { + if (this.panel == 'source') { + this.data = this.editor.plugins.media.htmlToData(getVal('source')); + this.dataToForm(); + this.panel = ''; + } + + this.moveStates(false, field); + this.preview(); + } + }, + + beforeResize : function() { + this.width = parseInt(getVal('width') || "320", 10); + this.height = parseInt(getVal('height') || "240", 10); + }, + + changeSize : function(type) { + var width, height, scale, size; + + if (get('constrain').checked) { + width = parseInt(getVal('width') || "320", 10); + height = parseInt(getVal('height') || "240", 10); + + if (type == 'width') { + this.height = Math.round((width / this.width) * height); + setVal('height', this.height); + } else { + this.width = Math.round((height / this.height) * width); + setVal('width', this.width); + } + } + }, + + getMediaListHTML : function() { + if (typeof(tinyMCEMediaList) != "undefined" && tinyMCEMediaList.length > 0) { + var html = ""; + + html += ''; + + return html; + } + + return ""; } - } + }; - if (f.width.value != "") - oldWidth = nw; - - if (f.height.value != "") - oldHeight = nh; - - // After constrain - pl = serializeParameters(); - - switch (f.media_type.options[f.media_type.selectedIndex].value) { - case "flash": - cls = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'; - codebase = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0'; - type = 'application/x-shockwave-flash'; - break; - - case "shockwave": - cls = 'clsid:166B1BCA-3F9C-11CF-8075-444553540000'; - codebase = 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0'; - type = 'application/x-director'; - break; - - case "qt": - cls = 'clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B'; - codebase = 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0'; - type = 'video/quicktime'; - break; - - case "wmp": - cls = ed.getParam('media_wmp6_compatible') ? 'clsid:05589FA1-C356-11CE-BF01-00AA0055595A' : 'clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6'; - codebase = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701'; - type = 'application/x-mplayer2'; - break; - - case "rmp": - cls = 'clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA'; - codebase = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701'; - type = 'audio/x-pn-realaudio-plugin'; - break; - } - - if (pl == '') { - p.innerHTML = ''; - return; - } - - pl = tinyMCEPopup.editor.plugins.media._parse(pl); - - if (!pl.src) { - p.innerHTML = ''; - return; - } - - pl.src = tinyMCEPopup.editor.documentBaseURI.toAbsolute(pl.src); - pl.width = !pl.width ? 100 : pl.width; - pl.height = !pl.height ? 100 : pl.height; - pl.id = !pl.id ? 'obj' : pl.id; - pl.name = !pl.name ? 'eobj' : pl.name; - pl.align = !pl.align ? '' : pl.align; - - // Avoid annoying warning about insecure items - if (!tinymce.isIE || document.location.protocol != 'https:') { - h += ''; - - for (n in pl) { - h += ''; - - // Add extra url parameter if it's an absolute URL - if (n == 'src' && pl[n].indexOf('://') != -1) - h += ''; - } - } - - h += ' - -
        -
        + + + @@ -24,28 +25,29 @@
        {#media_dlg.general} - +
        -
        - + - - + - - + + +
        - - - + @@ -56,10 +58,10 @@
        + + + - +
         
        - +
        - - + +
        x    x   
        @@ -78,18 +80,18 @@
        {#media_dlg.advanced} - +
        - + - + - + - + + +
        - @@ -100,9 +102,9 @@ - +
        - +
         
        @@ -111,9 +113,91 @@
        +
        + +
        + {#media_dlg.html5_video_options} + + + + + + + + + + + + + + + + +
        + + + + + +
         
        +
        + + + + + +
         
        +
        + + + + + +
         
        +
        + + + + + + + + + +
        + + + + + +
        +
        + + + + + +
        +
        + + + + + +
        +
        + + + + + +
        +
        @@ -121,11 +205,11 @@
        {#media_dlg.flash_options} - +
        - @@ -137,7 +221,7 @@ - @@ -150,7 +234,7 @@
        - @@ -160,7 +244,7 @@ - @@ -176,18 +260,18 @@
        - +
        - +
        - +
        - +
        @@ -196,18 +280,18 @@
        - +
        - +
        - +
        - +
        @@ -215,134 +299,38 @@
        - +
        - + - +
        -
        - {#media_dlg.flv_options} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        - -
        - - - - - -
        -
        - - - - - -
        -
        - - - - - -
        -
        - - - - - -
        -
        - - - - - -
        -
        - - - - - -
        -
        -
        - -
        +
        {#media_dlg.qt_options} - +
        @@ -350,19 +338,19 @@ @@ -370,19 +358,19 @@ @@ -390,19 +378,19 @@ @@ -410,27 +398,27 @@ - - + - - + + - - + + - - + + - - + + - - + + - - + + - +
        - +
        - - + +
        - +
        - - + +
        - +
        - - + +
        - +
        - - + +
        - +
        - - + +
        - +
        - - + +
        - +
        - - + +
        - +
        - - + +
        - +
        - - + +
        - +
        - - + +
        - - - - - -
         
        + + + + + +
         
        -
        +
        {#media_dlg.wmp_options} - +
        @@ -504,19 +492,19 @@ @@ -524,19 +512,19 @@ @@ -544,86 +532,86 @@ - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + +
        - +
        - - + +
        - +
        - - + +
        - +
        - - + +
        - +
        - - + +
        - +
        - - + +
        - +
        - - + +
        - +
        - - + +
        - +
        - - + +
        -
        +
        {#media_dlg.rmp_options} - +
        @@ -631,19 +619,19 @@ @@ -651,19 +639,19 @@ @@ -671,19 +659,19 @@ @@ -691,10 +679,10 @@ @@ -705,19 +693,19 @@ - - + + - - + + - - + + - - + +
        - +
        - - + +
        - +
        - - + +
        - +
        - - + +
        - +
        - - + +
        - +
        - - + +
        - +
        - - + +
        - +
        - - + +
        - +
        - - + +
        - +
        - - + +
        @@ -725,11 +713,11 @@
        {#media_dlg.shockwave_options} - +
        - +
        - @@ -738,13 +726,13 @@
        - @@ -754,7 +742,7 @@ - @@ -765,18 +753,18 @@
        - +
        - +
        - +
        - +
        @@ -786,18 +774,18 @@
        - +
        - +
        - +
        - +
        @@ -806,6 +794,13 @@
        + +
        +
        + {#media_dlg.source} + +
        +
        diff --git a/plugins/TinyMCE/js/plugins/media/moxieplayer.swf b/plugins/TinyMCE/js/plugins/media/moxieplayer.swf new file mode 100644 index 0000000000..2a040358df Binary files /dev/null and b/plugins/TinyMCE/js/plugins/media/moxieplayer.swf differ diff --git a/plugins/TinyMCE/js/plugins/nonbreaking/editor_plugin.js b/plugins/TinyMCE/js/plugins/nonbreaking/editor_plugin.js index eb40a6a39c..73947355f0 100644 --- a/plugins/TinyMCE/js/plugins/nonbreaking/editor_plugin.js +++ b/plugins/TinyMCE/js/plugins/nonbreaking/editor_plugin.js @@ -1 +1 @@ -(function(){tinymce.create("tinymce.plugins.Nonbreaking",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceNonBreaking",function(){a.execCommand("mceInsertContent",false,(a.plugins.visualchars&&a.plugins.visualchars.state)?' ':" ")});a.addButton("nonbreaking",{title:"nonbreaking.nonbreaking_desc",cmd:"mceNonBreaking"});if(a.getParam("nonbreaking_force_tab")){a.onKeyDown.add(function(d,f){if(tinymce.isIE&&f.keyCode==9){d.execCommand("mceNonBreaking");d.execCommand("mceNonBreaking");d.execCommand("mceNonBreaking");tinymce.dom.Event.cancel(f)}})}},getInfo:function(){return{longname:"Nonbreaking space",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/nonbreaking",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("nonbreaking",tinymce.plugins.Nonbreaking)})(); \ No newline at end of file +(function(){tinymce.create("tinymce.plugins.Nonbreaking",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceNonBreaking",function(){a.execCommand("mceInsertContent",false,(a.plugins.visualchars&&a.plugins.visualchars.state)?' ':" ")});a.addButton("nonbreaking",{title:"nonbreaking.nonbreaking_desc",cmd:"mceNonBreaking"});if(a.getParam("nonbreaking_force_tab")){a.onKeyDown.add(function(d,f){if(tinymce.isIE&&f.keyCode==9){d.execCommand("mceNonBreaking");d.execCommand("mceNonBreaking");d.execCommand("mceNonBreaking");tinymce.dom.Event.cancel(f)}})}},getInfo:function(){return{longname:"Nonbreaking space",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/nonbreaking",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("nonbreaking",tinymce.plugins.Nonbreaking)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/nonbreaking/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/nonbreaking/editor_plugin_src.js index ca83ee26e5..b3ea82ee03 100644 --- a/plugins/TinyMCE/js/plugins/nonbreaking/editor_plugin_src.js +++ b/plugins/TinyMCE/js/plugins/nonbreaking/editor_plugin_src.js @@ -17,7 +17,7 @@ // Register commands ed.addCommand('mceNonBreaking', function() { - ed.execCommand('mceInsertContent', false, (ed.plugins.visualchars && ed.plugins.visualchars.state) ? ' ' : ' '); + ed.execCommand('mceInsertContent', false, (ed.plugins.visualchars && ed.plugins.visualchars.state) ? ' ' : ' '); }); // Register buttons diff --git a/plugins/TinyMCE/js/plugins/noneditable/editor_plugin.js b/plugins/TinyMCE/js/plugins/noneditable/editor_plugin.js index 9945cd8580..cc7de78466 100644 --- a/plugins/TinyMCE/js/plugins/noneditable/editor_plugin.js +++ b/plugins/TinyMCE/js/plugins/noneditable/editor_plugin.js @@ -1 +1 @@ -(function(){var a=tinymce.dom.Event;tinymce.create("tinymce.plugins.NonEditablePlugin",{init:function(d,e){var f=this,c,b;f.editor=d;c=d.getParam("noneditable_editable_class","mceEditable");b=d.getParam("noneditable_noneditable_class","mceNonEditable");d.onNodeChange.addToTop(function(h,g,k){var j,i;j=h.dom.getParent(h.selection.getStart(),function(l){return h.dom.hasClass(l,b)});i=h.dom.getParent(h.selection.getEnd(),function(l){return h.dom.hasClass(l,b)});if(j||i){f._setDisabled(1);return false}else{f._setDisabled(0)}})},getInfo:function(){return{longname:"Non editable elements",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/noneditable",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_block:function(c,d){var b=d.keyCode;if((b>32&&b<41)||(b>111&&b<124)){return}return a.cancel(d)},_setDisabled:function(d){var c=this,b=c.editor;tinymce.each(b.controlManager.controls,function(e){e.setDisabled(d)});if(d!==c.disabled){if(d){b.onKeyDown.addToTop(c._block);b.onKeyPress.addToTop(c._block);b.onKeyUp.addToTop(c._block);b.onPaste.addToTop(c._block)}else{b.onKeyDown.remove(c._block);b.onKeyPress.remove(c._block);b.onKeyUp.remove(c._block);b.onPaste.remove(c._block)}c.disabled=d}}});tinymce.PluginManager.add("noneditable",tinymce.plugins.NonEditablePlugin)})(); \ No newline at end of file +(function(){var a=tinymce.dom.Event;tinymce.create("tinymce.plugins.NonEditablePlugin",{init:function(d,e){var f=this,c,b;f.editor=d;c=d.getParam("noneditable_editable_class","mceEditable");b=d.getParam("noneditable_noneditable_class","mceNonEditable");d.onNodeChange.addToTop(function(h,g,k){var j,i;j=h.dom.getParent(h.selection.getStart(),function(l){return h.dom.hasClass(l,b)});i=h.dom.getParent(h.selection.getEnd(),function(l){return h.dom.hasClass(l,b)});if(j||i){f._setDisabled(1);return false}else{f._setDisabled(0)}})},getInfo:function(){return{longname:"Non editable elements",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/noneditable",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_block:function(c,d){var b=d.keyCode;if((b>32&&b<41)||(b>111&&b<124)){return}return a.cancel(d)},_setDisabled:function(d){var c=this,b=c.editor;tinymce.each(b.controlManager.controls,function(e){e.setDisabled(d)});if(d!==c.disabled){if(d){b.onKeyDown.addToTop(c._block);b.onKeyPress.addToTop(c._block);b.onKeyUp.addToTop(c._block);b.onPaste.addToTop(c._block);b.onContextMenu.addToTop(c._block)}else{b.onKeyDown.remove(c._block);b.onKeyPress.remove(c._block);b.onKeyUp.remove(c._block);b.onPaste.remove(c._block);b.onContextMenu.remove(c._block)}c.disabled=d}}});tinymce.PluginManager.add("noneditable",tinymce.plugins.NonEditablePlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/noneditable/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/noneditable/editor_plugin_src.js index 656c971b8c..b6cf15430b 100644 --- a/plugins/TinyMCE/js/plugins/noneditable/editor_plugin_src.js +++ b/plugins/TinyMCE/js/plugins/noneditable/editor_plugin_src.js @@ -73,11 +73,13 @@ ed.onKeyPress.addToTop(t._block); ed.onKeyUp.addToTop(t._block); ed.onPaste.addToTop(t._block); + ed.onContextMenu.addToTop(t._block); } else { ed.onKeyDown.remove(t._block); ed.onKeyPress.remove(t._block); ed.onKeyUp.remove(t._block); ed.onPaste.remove(t._block); + ed.onContextMenu.remove(t._block); } t.disabled = s; diff --git a/plugins/TinyMCE/js/plugins/pagebreak/css/content.css b/plugins/TinyMCE/js/plugins/pagebreak/css/content.css deleted file mode 100644 index c949d58cc4..0000000000 --- a/plugins/TinyMCE/js/plugins/pagebreak/css/content.css +++ /dev/null @@ -1 +0,0 @@ -.mcePageBreak {display:block;border:0;width:100%;height:12px;border-top:1px dotted #ccc;margin-top:15px;background:#fff url(../img/pagebreak.gif) no-repeat center top;} diff --git a/plugins/TinyMCE/js/plugins/pagebreak/editor_plugin.js b/plugins/TinyMCE/js/plugins/pagebreak/editor_plugin.js index a212f69633..35085e8adc 100644 --- a/plugins/TinyMCE/js/plugins/pagebreak/editor_plugin.js +++ b/plugins/TinyMCE/js/plugins/pagebreak/editor_plugin.js @@ -1 +1 @@ -(function(){tinymce.create("tinymce.plugins.PageBreakPlugin",{init:function(b,d){var f='',a="mcePageBreak",c=b.getParam("pagebreak_separator",""),e;e=new RegExp(c.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g,function(g){return"\\"+g}),"g");b.addCommand("mcePageBreak",function(){b.execCommand("mceInsertContent",0,f)});b.addButton("pagebreak",{title:"pagebreak.desc",cmd:a});b.onInit.add(function(){if(b.settings.content_css!==false){b.dom.loadCSS(d+"/css/content.css")}if(b.theme.onResolveName){b.theme.onResolveName.add(function(g,h){if(h.node.nodeName=="IMG"&&b.dom.hasClass(h.node,a)){h.name="pagebreak"}})}});b.onClick.add(function(g,h){h=h.target;if(h.nodeName==="IMG"&&g.dom.hasClass(h,a)){g.selection.select(h)}});b.onNodeChange.add(function(h,g,i){g.setActive("pagebreak",i.nodeName==="IMG"&&h.dom.hasClass(i,a))});b.onBeforeSetContent.add(function(g,h){h.content=h.content.replace(e,f)});b.onPostProcess.add(function(g,h){if(h.get){h.content=h.content.replace(/]+>/g,function(i){if(i.indexOf('class="mcePageBreak')!==-1){i=c}return i})}})},getInfo:function(){return{longname:"PageBreak",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/pagebreak",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("pagebreak",tinymce.plugins.PageBreakPlugin)})(); \ No newline at end of file +(function(){tinymce.create("tinymce.plugins.PageBreakPlugin",{init:function(b,d){var f='',a="mcePageBreak",c=b.getParam("pagebreak_separator",""),e;e=new RegExp(c.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g,function(g){return"\\"+g}),"g");b.addCommand("mcePageBreak",function(){b.execCommand("mceInsertContent",0,f)});b.addButton("pagebreak",{title:"pagebreak.desc",cmd:a});b.onInit.add(function(){if(b.theme.onResolveName){b.theme.onResolveName.add(function(g,h){if(h.node.nodeName=="IMG"&&b.dom.hasClass(h.node,a)){h.name="pagebreak"}})}});b.onClick.add(function(g,h){h=h.target;if(h.nodeName==="IMG"&&g.dom.hasClass(h,a)){g.selection.select(h)}});b.onNodeChange.add(function(h,g,i){g.setActive("pagebreak",i.nodeName==="IMG"&&h.dom.hasClass(i,a))});b.onBeforeSetContent.add(function(g,h){h.content=h.content.replace(e,f)});b.onPostProcess.add(function(g,h){if(h.get){h.content=h.content.replace(/]+>/g,function(i){if(i.indexOf('class="mcePageBreak')!==-1){i=c}return i})}})},getInfo:function(){return{longname:"PageBreak",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/pagebreak",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("pagebreak",tinymce.plugins.PageBreakPlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/pagebreak/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/pagebreak/editor_plugin_src.js index 4e1eb0a7aa..a094c19162 100644 --- a/plugins/TinyMCE/js/plugins/pagebreak/editor_plugin_src.js +++ b/plugins/TinyMCE/js/plugins/pagebreak/editor_plugin_src.js @@ -11,7 +11,7 @@ (function() { tinymce.create('tinymce.plugins.PageBreakPlugin', { init : function(ed, url) { - var pb = '', cls = 'mcePageBreak', sep = ed.getParam('pagebreak_separator', ''), pbRE; + var pb = '', cls = 'mcePageBreak', sep = ed.getParam('pagebreak_separator', ''), pbRE; pbRE = new RegExp(sep.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g, function(a) {return '\\' + a;}), 'g'); @@ -24,9 +24,6 @@ ed.addButton('pagebreak', {title : 'pagebreak.desc', cmd : cls}); ed.onInit.add(function() { - if (ed.settings.content_css !== false) - ed.dom.loadCSS(url + "/css/content.css"); - if (ed.theme.onResolveName) { ed.theme.onResolveName.add(function(th, o) { if (o.node.nodeName == 'IMG' && ed.dom.hasClass(o.node, cls)) diff --git a/plugins/TinyMCE/js/plugins/pagebreak/img/trans.gif b/plugins/TinyMCE/js/plugins/pagebreak/img/trans.gif deleted file mode 100644 index 388486517f..0000000000 Binary files a/plugins/TinyMCE/js/plugins/pagebreak/img/trans.gif and /dev/null differ diff --git a/plugins/TinyMCE/js/plugins/paste/editor_plugin.js b/plugins/TinyMCE/js/plugins/paste/editor_plugin.js index 3785ab2d09..22149cc6a3 100644 --- a/plugins/TinyMCE/js/plugins/paste/editor_plugin.js +++ b/plugins/TinyMCE/js/plugins/paste/editor_plugin.js @@ -1 +1 @@ -(function(){var c=tinymce.each,d=null,a={paste_auto_cleanup_on_paste:true,paste_block_drop:false,paste_retain_style_properties:"none",paste_strip_class_attributes:"mso",paste_remove_spans:false,paste_remove_styles:false,paste_remove_styles_if_webkit:true,paste_convert_middot_lists:true,paste_convert_headers_to_strong:false,paste_dialog_width:"450",paste_dialog_height:"400",paste_text_use_dialog:false,paste_text_sticky:false,paste_text_notifyalways:false,paste_text_linebreaktype:"p",paste_text_replacements:[[/\u2026/g,"..."],[/[\x93\x94\u201c\u201d]/g,'"'],[/[\x60\x91\x92\u2018\u2019]/g,"'"]]};function b(e,f){return e.getParam(f,a[f])}tinymce.create("tinymce.plugins.PastePlugin",{init:function(e,f){var g=this;g.editor=e;g.url=f;g.onPreProcess=new tinymce.util.Dispatcher(g);g.onPostProcess=new tinymce.util.Dispatcher(g);g.onPreProcess.add(g._preProcess);g.onPostProcess.add(g._postProcess);g.onPreProcess.add(function(j,k){e.execCallback("paste_preprocess",j,k)});g.onPostProcess.add(function(j,k){e.execCallback("paste_postprocess",j,k)});e.pasteAsPlainText=false;function i(l,j){var k=e.dom;g.onPreProcess.dispatch(g,l);l.node=k.create("div",0,l.content);g.onPostProcess.dispatch(g,l);l.content=e.serializer.serialize(l.node,{getInner:1});if((!j)&&(e.pasteAsPlainText)){g._insertPlainText(e,k,l.content);if(!b(e,"paste_text_sticky")){e.pasteAsPlainText=false;e.controlManager.setActive("pastetext",false)}}else{if(/<(p|h[1-6]|ul|ol)/.test(l.content)){g._insertBlockContent(e,k,l.content)}else{g._insert(l.content)}}}e.addCommand("mceInsertClipboardContent",function(j,k){i(k,true)});if(!b(e,"paste_text_use_dialog")){e.addCommand("mcePasteText",function(k,j){var l=tinymce.util.Cookie;e.pasteAsPlainText=!e.pasteAsPlainText;e.controlManager.setActive("pastetext",e.pasteAsPlainText);if((e.pasteAsPlainText)&&(!l.get("tinymcePasteText"))){if(b(e,"paste_text_sticky")){e.windowManager.alert(e.translate("paste.plaintext_mode_sticky"))}else{e.windowManager.alert(e.translate("paste.plaintext_mode_sticky"))}if(!b(e,"paste_text_notifyalways")){l.set("tinymcePasteText","1",new Date(new Date().getFullYear()+1,12,31))}}})}e.addButton("pastetext",{title:"paste.paste_text_desc",cmd:"mcePasteText"});e.addButton("selectall",{title:"paste.selectall_desc",cmd:"selectall"});function h(s){var m,q,k,l=e.selection,p=e.dom,r=e.getBody(),j;if(e.pasteAsPlainText&&(s.clipboardData||p.doc.dataTransfer)){s.preventDefault();i({content:(s.clipboardData||p.doc.dataTransfer).getData("Text")},true);return}if(p.get("_mcePaste")){return}m=p.add(r,"div",{id:"_mcePaste","class":"mcePaste"},'\uFEFF
        ');if(r!=e.getDoc().body){j=p.getPos(e.selection.getStart(),r).y}else{j=r.scrollTop}p.setStyles(m,{position:"absolute",left:-10000,top:j,width:1,height:1,overflow:"hidden"});if(tinymce.isIE){k=p.doc.body.createTextRange();k.moveToElementText(m);k.execCommand("Paste");p.remove(m);if(m.innerHTML==="\uFEFF"){e.execCommand("mcePasteWord");s.preventDefault();return}i({content:m.innerHTML});return tinymce.dom.Event.cancel(s)}else{function o(n){n.preventDefault()}p.bind(e.getDoc(),"mousedown",o);p.bind(e.getDoc(),"keydown",o);q=e.selection.getRng();m=m.firstChild;k=e.getDoc().createRange();k.setStart(m,0);k.setEnd(m,1);l.setRng(k);window.setTimeout(function(){var t="",n=p.select("div.mcePaste");c(n,function(v){var u=v.firstChild;if(u&&u.nodeName=="DIV"&&u.style.marginTop&&u.style.backgroundColor){p.remove(u,1)}c(p.select("div.mcePaste",v),function(w){p.remove(w,1)});c(p.select("span.Apple-style-span",v),function(w){p.remove(w,1)});c(p.select("br[_mce_bogus]",v),function(w){p.remove(w)});t+=v.innerHTML});c(n,function(u){p.remove(u)});if(q){l.setRng(q)}i({content:t});p.unbind(e.getDoc(),"mousedown",o);p.unbind(e.getDoc(),"keydown",o)},0)}}if(b(e,"paste_auto_cleanup_on_paste")){if(tinymce.isOpera||/Firefox\/2/.test(navigator.userAgent)){e.onKeyDown.add(function(j,k){if(((tinymce.isMac?k.metaKey:k.ctrlKey)&&k.keyCode==86)||(k.shiftKey&&k.keyCode==45)){h(k)}})}else{e.onPaste.addToTop(function(j,k){return h(k)})}}if(b(e,"paste_block_drop")){e.onInit.add(function(){e.dom.bind(e.getBody(),["dragend","dragover","draggesture","dragdrop","drop","drag"],function(j){j.preventDefault();j.stopPropagation();return false})})}g._legacySupport()},getInfo:function(){return{longname:"Paste text/word",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_preProcess:function(i,f){var l=this.editor,k=f.content,q=tinymce.grep,p=tinymce.explode,g=tinymce.trim,m,j;function e(h){c(h,function(o){if(o.constructor==RegExp){k=k.replace(o,"")}else{k=k.replace(o[0],o[1])}})}if(/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(k)||f.wordContent){f.wordContent=true;e([/^\s*( )+/gi,/( |]*>)+\s*$/gi]);if(b(l,"paste_convert_headers_to_strong")){k=k.replace(/

        ]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,"

        $1

        ")}if(b(l,"paste_convert_middot_lists")){e([[//gi,"$&__MCE_ITEM__"],[/(]+(?:mso-list:|:\s*symbol)[^>]+>)/gi,"$1__MCE_ITEM__"]])}e([//gi,/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,[/<(\/?)s>/gi,"<$1strike>"],[/ /gi,"\u00a0"]]);do{m=k.length;k=k.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi,"$1")}while(m!=k.length);if(b(l,"paste_retain_style_properties").replace(/^none$/i,"").length==0){k=k.replace(/<\/?span[^>]*>/gi,"")}else{e([[/([\s\u00a0]*)<\/span>/gi,function(o,h){return(h.length>0)?h.replace(/./," ").slice(Math.floor(h.length/2)).split("").join("\u00a0"):""}],[/(<[a-z][^>]*)\sstyle="([^"]*)"/gi,function(u,h,t){var v=[],o=0,r=p(g(t).replace(/"/gi,"'"),";");c(r,function(s){var w,y,z=p(s,":");function x(A){return A+((A!=="0")&&(/\d$/.test(A)))?"px":""}if(z.length==2){w=z[0].toLowerCase();y=z[1].toLowerCase();switch(w){case"mso-padding-alt":case"mso-padding-top-alt":case"mso-padding-right-alt":case"mso-padding-bottom-alt":case"mso-padding-left-alt":case"mso-margin-alt":case"mso-margin-top-alt":case"mso-margin-right-alt":case"mso-margin-bottom-alt":case"mso-margin-left-alt":case"mso-table-layout-alt":case"mso-height":case"mso-width":case"mso-vertical-align-alt":v[o++]=w.replace(/^mso-|-alt$/g,"")+":"+x(y);return;case"horiz-align":v[o++]="text-align:"+y;return;case"vert-align":v[o++]="vertical-align:"+y;return;case"font-color":case"mso-foreground":v[o++]="color:"+y;return;case"mso-background":case"mso-highlight":v[o++]="background:"+y;return;case"mso-default-height":v[o++]="min-height:"+x(y);return;case"mso-default-width":v[o++]="min-width:"+x(y);return;case"mso-padding-between-alt":v[o++]="border-collapse:separate;border-spacing:"+x(y);return;case"text-line-through":if((y=="single")||(y=="double")){v[o++]="text-decoration:line-through"}return;case"mso-zero-height":if(y=="yes"){v[o++]="display:none"}return}if(/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?!align|decor|indent|trans)|top-bar|version|vnd|word-break)/.test(w)){return}v[o++]=w+":"+z[1]}});if(o>0){return h+' style="'+v.join(";")+'"'}else{return h}}]])}}if(b(l,"paste_convert_headers_to_strong")){e([[/]*>/gi,"

        "],[/<\/h[1-6][^>]*>/gi,"

        "]])}j=b(l,"paste_strip_class_attributes");if(j!=="none"){function n(r,o){if(j==="all"){return""}var h=q(p(o.replace(/^(["'])(.*)\1$/,"$2")," "),function(s){return(/^(?!mso)/i.test(s))});return h.length?' class="'+h.join(" ")+'"':""}k=k.replace(/ class="([^"]+)"/gi,n);k=k.replace(/ class=(\w+)/gi,n)}if(b(l,"paste_remove_spans")){k=k.replace(/<\/?span[^>]*>/gi,"")}f.content=k},_postProcess:function(h,j){var g=this,f=g.editor,i=f.dom,e;if(j.wordContent){c(i.select("a",j.node),function(k){if(!k.href||k.href.indexOf("#_Toc")!=-1){i.remove(k,1)}});if(b(f,"paste_convert_middot_lists")){g._convertLists(h,j)}e=b(f,"paste_retain_style_properties");if((tinymce.is(e,"string"))&&(e!=="all")&&(e!=="*")){e=tinymce.explode(e.replace(/^none$/i,""));c(i.select("*",j.node),function(n){var o={},l=0,m,p,k;if(e){for(m=0;m0){i.setStyles(n,o)}else{if(n.nodeName=="SPAN"&&!n.className){i.remove(n,true)}}})}}if(b(f,"paste_remove_styles")||(b(f,"paste_remove_styles_if_webkit")&&tinymce.isWebKit)){c(i.select("*[style]",j.node),function(k){k.removeAttribute("style");k.removeAttribute("_mce_style")})}else{if(tinymce.isWebKit){c(i.select("*",j.node),function(k){k.removeAttribute("_mce_style")})}}},_convertLists:function(h,f){var j=h.editor.dom,i,m,e=-1,g,n=[],l,k;c(j.select("p",f.node),function(u){var r,v="",t,s,o,q;for(r=u.firstChild;r&&r.nodeType==3;r=r.nextSibling){v+=r.nodeValue}v=u.innerHTML.replace(/<\/?\w+[^>]*>/gi,"").replace(/ /g,"\u00a0");if(/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o]\s*\u00a0*/.test(v)){t="ul"}if(/^__MCE_ITEM__\s*\w+\.\s*\u00a0{2,}/.test(v)){t="ol"}if(t){g=parseFloat(u.style.marginLeft||0);if(g>e){n.push(g)}if(!i||t!=l){i=j.create(t);j.insertAfter(i,u)}else{if(g>e){i=m.appendChild(j.create(t))}else{if(g]*>/gi,"");if(t=="ul"&&/^[\u2022\u00b7\u00a7\u00d8o]/.test(p)){j.remove(w)}else{if(/^[\s\S]*\w+\.( |\u00a0)*\s*/.test(p)){j.remove(w)}}});s=u.innerHTML;if(t=="ul"){s=u.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^[\u2022\u00b7\u00a7\u00d8o]\s*( |\u00a0)+\s*/,"")}else{s=u.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^\s*\w+\.( |\u00a0)+\s*/,"")}m=i.appendChild(j.create("li",0,s));j.remove(u);e=g;l=t}else{i=e=0}});k=f.node.innerHTML;if(k.indexOf("__MCE_ITEM__")!=-1){f.node.innerHTML=k.replace(/__MCE_ITEM__/g,"")}},_insertBlockContent:function(l,h,m){var f,j,g=l.selection,q,n,e,o,i,k="mce_marker";function p(t){var s;if(tinymce.isIE){s=l.getDoc().body.createTextRange();s.moveToElementText(t);s.collapse(false);s.select()}else{g.select(t,1);g.collapse(false)}}this._insert('',1);j=h.get(k);f=h.getParent(j,"p,h1,h2,h3,h4,h5,h6,ul,ol,th,td");if(f&&!/TD|TH/.test(f.nodeName)){j=h.split(f,j);c(h.create("div",0,m).childNodes,function(r){q=j.parentNode.insertBefore(r.cloneNode(true),j)});p(q)}else{h.setOuterHTML(j,m);g.select(l.getBody(),1);g.collapse(0)}while(n=h.get(k)){h.remove(n)}n=g.getStart();e=h.getViewPort(l.getWin());o=l.dom.getPos(n).y;i=n.clientHeight;if(oe.y+e.h){l.getDoc().body.scrollTop=o0)){if(!d){d=("34,quot,38,amp,39,apos,60,lt,62,gt,"+j.serializer.settings.entities).split(",")}if(/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(v)){q([/[\n\r]+/g])}else{q([/\r+/g])}q([[/<\/(?:p|h[1-6]|ul|ol|dl|table|div|blockquote|fieldset|pre|address|center)>/gi,"\n\n"],[/]*>|<\/tr>/gi,"\n"],[/<\/t[dh]>\s*]*>/gi,"\t"],/<[a-z!\/?][^>]*>/gi,[/ /gi," "],[/&(#\d+|[a-z0-9]{1,10});/gi,function(i,h){if(h.charAt(0)==="#"){return String.fromCharCode(h.slice(1))}else{return((i=y(d,h))>0)?String.fromCharCode(d[i-1]):" "}}],[/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi,"$1"],[/\n{3,}/g,"\n\n"],/^\s+|\s+$/g]);v=x.encode(v);if(!s.isCollapsed()){z.execCommand("Delete",false,null)}if(m(o,"array")||(m(o,"array"))){q(o)}else{if(m(o,"string")){q(new RegExp(o,"gi"))}}if(g=="none"){q([[/\n+/g," "]])}else{if(g=="br"){q([[/\n/g,"
        "]])}else{q([/^\s+|\s+$/g,[/\n\n/g,"

        "],[/\n/g,"
        "]])}}if((l=v.indexOf("

        "))!=-1){k=v.lastIndexOf("

        ");r=s.getNode();e=[];do{if(r.nodeType==1){if(r.nodeName=="TD"||r.nodeName=="BODY"){break}e[e.length]=r}}while(r=r.parentNode);if(e.length>0){p=v.substring(0,l);f="";for(t=0,u=e.length;t";f+="<"+e[e.length-t-1].nodeName.toLowerCase()+">"}if(l==k){v=p+f+v.substring(l+7)}else{v=p+v.substring(l+4,k+4)+f+v.substring(k+7)}}}j.execCommand("mceInsertRawHTML",false,v+' ');window.setTimeout(function(){var h=x.get("_plain_text_marker"),B,i,A,w;s.select(h,false);z.execCommand("Delete",false,null);h=null;B=s.getStart();i=x.getViewPort(n);A=x.getPos(B).y;w=B.clientHeight;if((Ai.y+i.h)){z.body.scrollTop=A")});return}}if(o.get("_mcePaste")){return}l=o.add(q,"div",{id:"_mcePaste","class":"mcePaste","data-mce-bogus":"1"},"\uFEFF\uFEFF");if(q!=d.getDoc().body){i=o.getPos(d.selection.getStart(),q).y}else{i=q.scrollTop+o.getViewPort(d.getWin()).y}o.setStyles(l,{position:"absolute",left:tinymce.isGecko?-40:0,top:i-25,width:1,height:1,overflow:"hidden"});if(tinymce.isIE){t=k.getRng();j=o.doc.body.createTextRange();j.moveToElementText(l);j.execCommand("Paste");o.remove(l);if(l.innerHTML==="\uFEFF\uFEFF"){d.execCommand("mcePasteWord");s.preventDefault();return}k.setRng(t);k.setContent("");setTimeout(function(){h({content:l.innerHTML})},0);return tinymce.dom.Event.cancel(s)}else{function m(n){n.preventDefault()}o.bind(d.getDoc(),"mousedown",m);o.bind(d.getDoc(),"keydown",m);p=d.selection.getRng();l=l.firstChild;j=d.getDoc().createRange();j.setStart(l,0);j.setEnd(l,2);k.setRng(j);window.setTimeout(function(){var u="",n;if(!o.select("div.mcePaste > div.mcePaste").length){n=o.select("div.mcePaste");c(n,function(w){var v=w.firstChild;if(v&&v.nodeName=="DIV"&&v.style.marginTop&&v.style.backgroundColor){o.remove(v,1)}c(o.select("span.Apple-style-span",w),function(x){o.remove(x,1)});c(o.select("br[data-mce-bogus]",w),function(x){o.remove(x)});if(w.parentNode.className!="mcePaste"){u+=w.innerHTML}})}else{u="

        "+o.encode(r).replace(/\r?\n/g,"
        ")+"
        "}c(o.select("div.mcePaste"),function(v){o.remove(v)});if(p){k.setRng(p)}h({content:u});o.unbind(d.getDoc(),"mousedown",m);o.unbind(d.getDoc(),"keydown",m)},0)}}if(b(d,"paste_auto_cleanup_on_paste")){if(tinymce.isOpera||/Firefox\/2/.test(navigator.userAgent)){d.onKeyDown.addToTop(function(i,j){if(((tinymce.isMac?j.metaKey:j.ctrlKey)&&j.keyCode==86)||(j.shiftKey&&j.keyCode==45)){g(j)}})}else{d.onPaste.addToTop(function(i,j){return g(j)})}}d.onInit.add(function(){d.controlManager.setActive("pastetext",d.pasteAsPlainText);if(b(d,"paste_block_drop")){d.dom.bind(d.getBody(),["dragend","dragover","draggesture","dragdrop","drop","drag"],function(i){i.preventDefault();i.stopPropagation();return false})}});f._legacySupport()},getInfo:function(){return{longname:"Paste text/word",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_preProcess:function(g,e){var k=this.editor,j=e.content,p=tinymce.grep,n=tinymce.explode,f=tinymce.trim,l,i;function d(h){c(h,function(o){if(o.constructor==RegExp){j=j.replace(o,"")}else{j=j.replace(o[0],o[1])}})}if(k.settings.paste_enable_default_filters==false){return}if(tinymce.isIE&&document.documentMode>=9){d([[/(?:
         [\s\r\n]+|
        )*(<\/?(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)[^>]*>)(?:
         [\s\r\n]+|
        )*/g,"$1"]]);d([[/

        /g,"

        "],[/
        /g," "],[/

        /g,"
        "],])}if(/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(j)||e.wordContent){e.wordContent=true;d([/^\s*( )+/gi,/( |]*>)+\s*$/gi]);if(b(k,"paste_convert_headers_to_strong")){j=j.replace(/

        ]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,"

        $1

        ")}if(b(k,"paste_convert_middot_lists")){d([[//gi,"$&__MCE_ITEM__"],[/(]+(?:mso-list:|:\s*symbol)[^>]+>)/gi,"$1__MCE_ITEM__"],[/(]+(?:MsoListParagraph)[^>]+>)/gi,"$1__MCE_ITEM__"]])}d([//gi,/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,[/<(\/?)s>/gi,"<$1strike>"],[/ /gi,"\u00a0"]]);do{l=j.length;j=j.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi,"$1")}while(l!=j.length);if(b(k,"paste_retain_style_properties").replace(/^none$/i,"").length==0){j=j.replace(/<\/?span[^>]*>/gi,"")}else{d([[/([\s\u00a0]*)<\/span>/gi,function(o,h){return(h.length>0)?h.replace(/./," ").slice(Math.floor(h.length/2)).split("").join("\u00a0"):""}],[/(<[a-z][^>]*)\sstyle="([^"]*)"/gi,function(t,h,r){var u=[],o=0,q=n(f(r).replace(/"/gi,"'"),";");c(q,function(s){var w,y,z=n(s,":");function x(A){return A+((A!=="0")&&(/\d$/.test(A)))?"px":""}if(z.length==2){w=z[0].toLowerCase();y=z[1].toLowerCase();switch(w){case"mso-padding-alt":case"mso-padding-top-alt":case"mso-padding-right-alt":case"mso-padding-bottom-alt":case"mso-padding-left-alt":case"mso-margin-alt":case"mso-margin-top-alt":case"mso-margin-right-alt":case"mso-margin-bottom-alt":case"mso-margin-left-alt":case"mso-table-layout-alt":case"mso-height":case"mso-width":case"mso-vertical-align-alt":u[o++]=w.replace(/^mso-|-alt$/g,"")+":"+x(y);return;case"horiz-align":u[o++]="text-align:"+y;return;case"vert-align":u[o++]="vertical-align:"+y;return;case"font-color":case"mso-foreground":u[o++]="color:"+y;return;case"mso-background":case"mso-highlight":u[o++]="background:"+y;return;case"mso-default-height":u[o++]="min-height:"+x(y);return;case"mso-default-width":u[o++]="min-width:"+x(y);return;case"mso-padding-between-alt":u[o++]="border-collapse:separate;border-spacing:"+x(y);return;case"text-line-through":if((y=="single")||(y=="double")){u[o++]="text-decoration:line-through"}return;case"mso-zero-height":if(y=="yes"){u[o++]="display:none"}return}if(/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?!align|decor|indent|trans)|top-bar|version|vnd|word-break)/.test(w)){return}u[o++]=w+":"+z[1]}});if(o>0){return h+' style="'+u.join(";")+'"'}else{return h}}]])}}if(b(k,"paste_convert_headers_to_strong")){d([[/]*>/gi,"

        "],[/<\/h[1-6][^>]*>/gi,"

        "]])}d([[/Version:[\d.]+\nStartHTML:\d+\nEndHTML:\d+\nStartFragment:\d+\nEndFragment:\d+/gi,""]]);i=b(k,"paste_strip_class_attributes");if(i!=="none"){function m(q,o){if(i==="all"){return""}var h=p(n(o.replace(/^(["'])(.*)\1$/,"$2")," "),function(r){return(/^(?!mso)/i.test(r))});return h.length?' class="'+h.join(" ")+'"':""}j=j.replace(/ class="([^"]+)"/gi,m);j=j.replace(/ class=([\-\w]+)/gi,m)}if(b(k,"paste_remove_spans")){j=j.replace(/<\/?span[^>]*>/gi,"")}e.content=j},_postProcess:function(g,i){var f=this,e=f.editor,h=e.dom,d;if(e.settings.paste_enable_default_filters==false){return}if(i.wordContent){c(h.select("a",i.node),function(j){if(!j.href||j.href.indexOf("#_Toc")!=-1){h.remove(j,1)}});if(b(e,"paste_convert_middot_lists")){f._convertLists(g,i)}d=b(e,"paste_retain_style_properties");if((tinymce.is(d,"string"))&&(d!=="all")&&(d!=="*")){d=tinymce.explode(d.replace(/^none$/i,""));c(h.select("*",i.node),function(m){var n={},k=0,l,o,j;if(d){for(l=0;l0){h.setStyles(m,n)}else{if(m.nodeName=="SPAN"&&!m.className){h.remove(m,true)}}})}}if(b(e,"paste_remove_styles")||(b(e,"paste_remove_styles_if_webkit")&&tinymce.isWebKit)){c(h.select("*[style]",i.node),function(j){j.removeAttribute("style");j.removeAttribute("data-mce-style")})}else{if(tinymce.isWebKit){c(h.select("*",i.node),function(j){j.removeAttribute("data-mce-style")})}}},_convertLists:function(g,e){var i=g.editor.dom,h,l,d=-1,f,m=[],k,j;c(i.select("p",e.node),function(t){var q,u="",s,r,n,o;for(q=t.firstChild;q&&q.nodeType==3;q=q.nextSibling){u+=q.nodeValue}u=t.innerHTML.replace(/<\/?\w+[^>]*>/gi,"").replace(/ /g,"\u00a0");if(/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*\u00a0*/.test(u)){s="ul"}if(/^__MCE_ITEM__\s*\w+\.\s*\u00a0+/.test(u)){s="ol"}if(s){f=parseFloat(t.style.marginLeft||0);if(f>d){m.push(f)}if(!h||s!=k){h=i.create(s);i.insertAfter(h,t)}else{if(f>d){h=l.appendChild(i.create(s))}else{if(f]*>/gi,"");if(s=="ul"&&/^__MCE_ITEM__[\u2022\u00b7\u00a7\u00d8o\u25CF]/.test(p)){i.remove(v)}else{if(/^__MCE_ITEM__[\s\S]*\w+\.( |\u00a0)*\s*/.test(p)){i.remove(v)}}});r=t.innerHTML;if(s=="ul"){r=t.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*( |\u00a0)+\s*/,"")}else{r=t.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^\s*\w+\.( |\u00a0)+\s*/,"")}l=h.appendChild(i.create("li",0,r));i.remove(t);d=f;k=s}else{h=d=0}});j=e.node.innerHTML;if(j.indexOf("__MCE_ITEM__")!=-1){e.node.innerHTML=j.replace(/__MCE_ITEM__/g,"")}},_insert:function(f,d){var e=this.editor,g=e.selection.getRng();if(!e.selection.isCollapsed()&&g.startContainer!=g.endContainer){e.getDoc().execCommand("Delete",false,null)}e.execCommand("mceInsertContent",false,f,{skip_undo:d})},_insertPlainText:function(j,x,v){var t,u,l,k,r,e,p,f,n=j.getWin(),z=j.getDoc(),s=j.selection,m=tinymce.is,y=tinymce.inArray,g=b(j,"paste_text_linebreaktype"),o=b(j,"paste_text_replacements");function q(d){c(d,function(h){if(h.constructor==RegExp){v=v.replace(h,"")}else{v=v.replace(h[0],h[1])}})}if((typeof(v)==="string")&&(v.length>0)){if(/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(v)){q([/[\n\r]+/g])}else{q([/\r+/g])}q([[/<\/(?:p|h[1-6]|ul|ol|dl|table|div|blockquote|fieldset|pre|address|center)>/gi,"\n\n"],[/]*>|<\/tr>/gi,"\n"],[/<\/t[dh]>\s*]*>/gi,"\t"],/<[a-z!\/?][^>]*>/gi,[/ /gi," "],[/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi,"$1"],[/\n{3,}/g,"\n\n"],/^\s+|\s+$/g]);v=x.decode(tinymce.html.Entities.encodeRaw(v));if(!s.isCollapsed()){z.execCommand("Delete",false,null)}if(m(o,"array")||(m(o,"array"))){q(o)}else{if(m(o,"string")){q(new RegExp(o,"gi"))}}if(g=="none"){q([[/\n+/g," "]])}else{if(g=="br"){q([[/\n/g,"
        "]])}else{q([/^\s+|\s+$/g,[/\n\n/g,"

        "],[/\n/g,"
        "]])}}if((l=v.indexOf("

        "))!=-1){k=v.lastIndexOf("

        ");r=s.getNode();e=[];do{if(r.nodeType==1){if(r.nodeName=="TD"||r.nodeName=="BODY"){break}e[e.length]=r}}while(r=r.parentNode);if(e.length>0){p=v.substring(0,l);f="";for(t=0,u=e.length;t";f+="<"+e[e.length-t-1].nodeName.toLowerCase()+">"}if(l==k){v=p+f+v.substring(l+7)}else{v=p+v.substring(l+4,k+4)+f+v.substring(k+7)}}}j.execCommand("mceInsertRawHTML",false,v+' ');window.setTimeout(function(){var d=x.get("_plain_text_marker"),A,h,w,i;s.select(d,false);z.execCommand("Delete",false,null);d=null;A=s.getStart();h=x.getViewPort(n);w=x.getPos(A).y;i=A.clientHeight;if((wh.y+h.h)){z.body.scrollTop=w

        ' + dom.encode(textContent).replace(/\r?\n/g, '
        ') + '
        '; + } // Remove the nodes - each(nl, function(n) { + each(dom.select('div.mcePaste'), function(n) { dom.remove(n); }); @@ -256,7 +293,7 @@ if (getParam(ed, "paste_auto_cleanup_on_paste")) { // Is it's Opera or older FF use key handler if (tinymce.isOpera || /Firefox\/2/.test(navigator.userAgent)) { - ed.onKeyDown.add(function(ed, e) { + ed.onKeyDown.addToTop(function(ed, e) { if (((tinymce.isMac ? e.metaKey : e.ctrlKey) && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45)) grabContent(e); }); @@ -268,17 +305,19 @@ } } - // Block all drag/drop events - if (getParam(ed, "paste_block_drop")) { - ed.onInit.add(function() { + ed.onInit.add(function() { + ed.controlManager.setActive("pastetext", ed.pasteAsPlainText); + + // Block all drag/drop events + if (getParam(ed, "paste_block_drop")) { ed.dom.bind(ed.getBody(), ['dragend', 'dragover', 'draggesture', 'dragdrop', 'drop', 'drag'], function(e) { e.preventDefault(); e.stopPropagation(); return false; }); - }); - } + } + }); // Add legacy support t._legacySupport(); @@ -295,8 +334,6 @@ }, _preProcess : function(pl, o) { - //console.log('Before preprocess:' + o.content); - var ed = this.editor, h = o.content, grep = tinymce.grep, @@ -304,6 +341,8 @@ trim = tinymce.trim, len, stripClass; + //console.log('Before preprocess:' + o.content); + function process(items) { each(items, function(v) { // Remove or replace @@ -313,6 +352,23 @@ h = h.replace(v[0], v[1]); }); } + + if (ed.settings.paste_enable_default_filters == false) { + return; + } + + // IE9 adds BRs before/after block elements when contents is pasted from word or for example another browser + if (tinymce.isIE && document.documentMode >= 9) { + // IE9 adds BRs before/after block elements when contents is pasted from word or for example another browser + process([[/(?:
         [\s\r\n]+|
        )*(<\/?(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)[^>]*>)(?:
         [\s\r\n]+|
        )*/g, '$1']]); + + // IE9 also adds an extra BR element for each soft-linefeed and it also adds a BR for each word wrap break + process([ + [/

        /g, '

        '], // Replace multiple BR elements with uppercase BR to keep them intact + [/
        /g, ' '], // Replace single br elements with space since they are word wrap BR:s + [/

        /g, '
        '], // Replace back the double brs but into a single BR + ]); + } // Detect Word content and process it more aggressive if (/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(h) || o.wordContent) { @@ -332,7 +388,8 @@ if (getParam(ed, "paste_convert_middot_lists")) { process([ [//gi, '$&__MCE_ITEM__'], // Convert supportLists to a list item marker - [/(]+(?:mso-list:|:\s*symbol)[^>]+>)/gi, '$1__MCE_ITEM__'] // Convert mso-list and symbol spans to item markers + [/(]+(?:mso-list:|:\s*symbol)[^>]+>)/gi, '$1__MCE_ITEM__'], // Convert mso-list and symbol spans to item markers + [/(]+(?:MsoListParagraph)[^>]+>)/gi, '$1__MCE_ITEM__'] // Convert mso-list and symbol paragraphs to item markers (FF) ]); } @@ -484,6 +541,11 @@ ]); } + process([ + // Copy paste from Java like Open Office will produce this junk on FF + [/Version:[\d.]+\nStartHTML:\d+\nEndHTML:\d+\nStartFragment:\d+\nEndFragment:\d+/gi, ''] + ]); + // Class attribute options are: leave all as-is ("none"), remove all ("all"), or remove only those starting with mso ("mso"). // Note:- paste_strip_class_attributes: "none", verify_css_classes: true is also a good variation. stripClass = getParam(ed, "paste_strip_class_attributes"); @@ -503,7 +565,7 @@ }; h = h.replace(/ class="([^"]+)"/gi, removeClasses); - h = h.replace(/ class=(\w+)/gi, removeClasses); + h = h.replace(/ class=([\-\w]+)/gi, removeClasses); } // Remove spans option @@ -522,6 +584,10 @@ _postProcess : function(pl, o) { var t = this, ed = t.editor, dom = ed.dom, styleProps; + if (ed.settings.paste_enable_default_filters == false) { + return; + } + if (o.wordContent) { // Remove named anchors or TOC links each(dom.select('a', o.node), function(a) { @@ -573,14 +639,14 @@ if (getParam(ed, "paste_remove_styles") || (getParam(ed, "paste_remove_styles_if_webkit") && tinymce.isWebKit)) { each(dom.select('*[style]', o.node), function(el) { el.removeAttribute('style'); - el.removeAttribute('_mce_style'); + el.removeAttribute('data-mce-style'); }); } else { if (tinymce.isWebKit) { // We need to compress the styles on WebKit since if you paste it will become // Removing the mce_style that contains the real value will force the Serializer engine to compress the styles each(dom.select('*', o.node), function(el) { - el.removeAttribute('_mce_style'); + el.removeAttribute('data-mce-style'); }); } } @@ -603,11 +669,11 @@ val = p.innerHTML.replace(/<\/?\w+[^>]*>/gi, '').replace(/ /g, '\u00a0'); // Detect unordered lists look for bullets - if (/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o]\s*\u00a0*/.test(val)) + if (/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*\u00a0*/.test(val)) type = 'ul'; // Detect ordered lists 1., a. or ixv. - if (/^__MCE_ITEM__\s*\w+\.\s*\u00a0{2,}/.test(val)) + if (/^__MCE_ITEM__\s*\w+\.\s*\u00a0+/.test(val)) type = 'ol'; // Check if node value matches the list pattern: o   @@ -637,9 +703,9 @@ var html = span.innerHTML.replace(/<\/?\w+[^>]*>/gi, ''); // Remove span with the middot or the number - if (type == 'ul' && /^[\u2022\u00b7\u00a7\u00d8o]/.test(html)) + if (type == 'ul' && /^__MCE_ITEM__[\u2022\u00b7\u00a7\u00d8o\u25CF]/.test(html)) dom.remove(span); - else if (/^[\s\S]*\w+\.( |\u00a0)*\s*/.test(html)) + else if (/^__MCE_ITEM__[\s\S]*\w+\.( |\u00a0)*\s*/.test(html)) dom.remove(span); }); @@ -647,7 +713,7 @@ // Remove middot/list items if (type == 'ul') - html = p.innerHTML.replace(/__MCE_ITEM__/g, '').replace(/^[\u2022\u00b7\u00a7\u00d8o]\s*( |\u00a0)+\s*/, ''); + html = p.innerHTML.replace(/__MCE_ITEM__/g, '').replace(/^[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*( |\u00a0)+\s*/, ''); else html = p.innerHTML.replace(/__MCE_ITEM__/g, '').replace(/^\s*\w+\.( |\u00a0)+\s*/, ''); @@ -667,65 +733,6 @@ o.node.innerHTML = html.replace(/__MCE_ITEM__/g, ''); }, - /** - * This method will split the current block parent and insert the contents inside the split position. - * This logic can be improved so text nodes at the start/end remain in the start/end block elements - */ - _insertBlockContent : function(ed, dom, content) { - var parentBlock, marker, sel = ed.selection, last, elm, vp, y, elmHeight, markerId = 'mce_marker'; - - function select(n) { - var r; - - if (tinymce.isIE) { - r = ed.getDoc().body.createTextRange(); - r.moveToElementText(n); - r.collapse(false); - r.select(); - } else { - sel.select(n, 1); - sel.collapse(false); - } - } - - // Insert a marker for the caret position - this._insert('', 1); - marker = dom.get(markerId); - parentBlock = dom.getParent(marker, 'p,h1,h2,h3,h4,h5,h6,ul,ol,th,td'); - - // If it's a parent block but not a table cell - if (parentBlock && !/TD|TH/.test(parentBlock.nodeName)) { - // Split parent block - marker = dom.split(parentBlock, marker); - - // Insert nodes before the marker - each(dom.create('div', 0, content).childNodes, function(n) { - last = marker.parentNode.insertBefore(n.cloneNode(true), marker); - }); - - // Move caret after marker - select(last); - } else { - dom.setOuterHTML(marker, content); - sel.select(ed.getBody(), 1); - sel.collapse(0); - } - - // Remove marker if it's left - while (elm = dom.get(markerId)) - dom.remove(elm); - - // Get element, position and height - elm = sel.getStart(); - vp = dom.getViewPort(ed.getWin()); - y = ed.dom.getPos(elm).y; - elmHeight = elm.clientHeight; - - // Is element within viewport if not then scroll it into view - if (y < vp.y || y + elmHeight > vp.y + vp.h) - ed.getDoc().body.scrollTop = y < vp.y ? y : y - vp.h + 25; - }, - /** * Inserts the specified contents at the caret position. */ @@ -736,8 +743,7 @@ if (!ed.selection.isCollapsed() && r.startContainer != r.endContainer) ed.getDoc().execCommand('Delete', false, null); - // It's better to use the insertHTML method on Gecko since it will combine paragraphs correctly before inserting the contents - ed.execCommand(tinymce.isGecko ? 'insertHTML' : 'mceInsertContent', false, h, {skip_undo : skip_undo}); + ed.execCommand('mceInsertContent', false, h, {skip_undo : skip_undo}); }, /** @@ -769,9 +775,6 @@ }; if ((typeof(h) === "string") && (h.length > 0)) { - if (!entities) - entities = ("34,quot,38,amp,39,apos,60,lt,62,gt," + ed.serializer.settings.entities).split(","); - // If HTML content with line-breaking tags, then remove all cr/lf chars because only tags will break a line if (/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(h)) { process([ @@ -790,26 +793,12 @@ [/<\/t[dh]>\s*]*>/gi, "\t"], // Table cells get tabs betweem them /<[a-z!\/?][^>]*>/gi, // Delete all remaining tags [/ /gi, " "], // Convert non-break spaces to regular spaces (remember, *plain text*) - [ - // HTML entity - /&(#\d+|[a-z0-9]{1,10});/gi, - - // Replace with actual character - function(e, s) { - if (s.charAt(0) === "#") { - return String.fromCharCode(s.slice(1)); - } - else { - return ((e = inArray(entities, s)) > 0)? String.fromCharCode(entities[e-1]) : " "; - } - } - ], [/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi, "$1"], // Cool little RegExp deletes whitespace around linebreak chars. [/\n{3,}/g, "\n\n"], // Max. 2 consecutive linebreaks /^\s+|\s+$/g // Trim the front & back ]); - h = dom.encode(h); + h = dom.decode(tinymce.html.Entities.encodeRaw(h)); // Delete any highlighted text before pasting if (!sel.isCollapsed()) { diff --git a/plugins/TinyMCE/js/plugins/searchreplace/editor_plugin.js b/plugins/TinyMCE/js/plugins/searchreplace/editor_plugin.js index cd9c985b7a..165bc12df5 100644 --- a/plugins/TinyMCE/js/plugins/searchreplace/editor_plugin.js +++ b/plugins/TinyMCE/js/plugins/searchreplace/editor_plugin.js @@ -1 +1 @@ -(function(){tinymce.create("tinymce.plugins.SearchReplacePlugin",{init:function(a,c){function b(d){a.windowManager.open({file:c+"/searchreplace.htm",width:420+parseInt(a.getLang("searchreplace.delta_width",0)),height:170+parseInt(a.getLang("searchreplace.delta_height",0)),inline:1,auto_focus:0},{mode:d,search_string:a.selection.getContent({format:"text"}),plugin_url:c})}a.addCommand("mceSearch",function(){b("search")});a.addCommand("mceReplace",function(){b("replace")});a.addButton("search",{title:"searchreplace.search_desc",cmd:"mceSearch"});a.addButton("replace",{title:"searchreplace.replace_desc",cmd:"mceReplace"});a.addShortcut("ctrl+f","searchreplace.search_desc","mceSearch")},getInfo:function(){return{longname:"Search/Replace",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/searchreplace",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("searchreplace",tinymce.plugins.SearchReplacePlugin)})(); \ No newline at end of file +(function(){tinymce.create("tinymce.plugins.SearchReplacePlugin",{init:function(a,c){function b(d){window.focus();a.windowManager.open({file:c+"/searchreplace.htm",width:420+parseInt(a.getLang("searchreplace.delta_width",0)),height:170+parseInt(a.getLang("searchreplace.delta_height",0)),inline:1,auto_focus:0},{mode:d,search_string:a.selection.getContent({format:"text"}),plugin_url:c})}a.addCommand("mceSearch",function(){b("search")});a.addCommand("mceReplace",function(){b("replace")});a.addButton("search",{title:"searchreplace.search_desc",cmd:"mceSearch"});a.addButton("replace",{title:"searchreplace.replace_desc",cmd:"mceReplace"});a.addShortcut("ctrl+f","searchreplace.search_desc","mceSearch")},getInfo:function(){return{longname:"Search/Replace",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/searchreplace",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("searchreplace",tinymce.plugins.SearchReplacePlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/searchreplace/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/searchreplace/editor_plugin_src.js index 1433a06a4a..4c87e8fa79 100644 --- a/plugins/TinyMCE/js/plugins/searchreplace/editor_plugin_src.js +++ b/plugins/TinyMCE/js/plugins/searchreplace/editor_plugin_src.js @@ -12,6 +12,10 @@ tinymce.create('tinymce.plugins.SearchReplacePlugin', { init : function(ed, url) { function open(m) { + // Keep IE from writing out the f/r character to the editor + // instance while initializing a new dialog. See: #3131190 + window.focus(); + ed.windowManager.open({ file : url + '/searchreplace.htm', width : 420 + parseInt(ed.getLang('searchreplace.delta_width', 0)), diff --git a/plugins/TinyMCE/js/plugins/searchreplace/js/searchreplace.js b/plugins/TinyMCE/js/plugins/searchreplace/js/searchreplace.js index c0a6243297..80284b9f3f 100644 --- a/plugins/TinyMCE/js/plugins/searchreplace/js/searchreplace.js +++ b/plugins/TinyMCE/js/plugins/searchreplace/js/searchreplace.js @@ -2,14 +2,18 @@ tinyMCEPopup.requireLangPack(); var SearchReplaceDialog = { init : function(ed) { - var f = document.forms[0], m = tinyMCEPopup.getWindowArg("mode"); + var t = this, f = document.forms[0], m = tinyMCEPopup.getWindowArg("mode"); - this.switchMode(m); + t.switchMode(m); f[m + '_panel_searchstring'].value = tinyMCEPopup.getWindowArg("search_string"); // Focus input field f[m + '_panel_searchstring'].focus(); + + mcTabs.onChange.add(function(tab_id, panel_id) { + t.switchMode(tab_id.substring(0, tab_id.indexOf('_'))); + }); }, switchMode : function(m) { @@ -42,21 +46,23 @@ var SearchReplaceDialog = { ca = f[m + '_panel_casesensitivebox'].checked; rs = f['replace_panel_replacestring'].value; + if (tinymce.isIE) { + r = ed.getDoc().selection.createRange(); + } + if (s == '') return; function fix() { // Correct Firefox graphics glitches + // TODO: Verify if this is actually needed any more, maybe it was for very old FF versions? r = se.getRng().cloneRange(); ed.getDoc().execCommand('SelectAll', false, null); se.setRng(r); }; function replace() { - if (tinymce.isIE) - ed.selection.getRng().duplicate().pasteHTML(rs); // Needs to be duplicated due to selection bug in IE - else - ed.getDoc().execCommand('InsertHTML', false, rs); + ed.selection.setContent(rs); // Needs to be duplicated due to selection bug in IE }; // IE flags @@ -70,6 +76,9 @@ var SearchReplaceDialog = { ed.selection.collapse(true); if (tinymce.isIE) { + ed.focus(); + r = ed.getDoc().selection.createRange(); + while (r.findText(s, b ? -1 : 1, fl)) { r.scrollIntoView(); r.select(); @@ -111,6 +120,9 @@ var SearchReplaceDialog = { return; if (tinymce.isIE) { + ed.focus(); + r = ed.getDoc().selection.createRange(); + if (r.findText(s, b ? -1 : 1, fl)) { r.scrollIntoView(); r.select(); diff --git a/plugins/TinyMCE/js/plugins/searchreplace/searchreplace.htm b/plugins/TinyMCE/js/plugins/searchreplace/searchreplace.htm index d0424cfc9b..5a22d8aa4d 100644 --- a/plugins/TinyMCE/js/plugins/searchreplace/searchreplace.htm +++ b/plugins/TinyMCE/js/plugins/searchreplace/searchreplace.htm @@ -8,27 +8,28 @@ - + +
        - +
        - +
        - - - +
        + + @@ -39,7 +40,7 @@ + + + + + +
        {#style_dlg.padding} - +
        @@ -288,11 +328,14 @@ @@ -300,11 +343,14 @@ @@ -312,11 +358,14 @@ @@ -324,11 +373,14 @@ @@ -341,7 +393,7 @@
        {#style_dlg.margin} -
         
        - +
        - +
          + + +
        - +
        - +
          + + +
        - +
        - +
          + + +
        - +
        - +
          + + +
        +
        @@ -349,11 +401,14 @@ @@ -361,11 +416,14 @@ @@ -373,11 +431,14 @@ @@ -385,11 +446,14 @@ @@ -401,131 +465,148 @@
        -
         
        - +
        - +
          + + +
        - +
        - +
          + + +
        - +
        - +
          + + +
        - +
        - +
          + + +
        - - - - - - - - - +
        + {#style_dlg.border} +
          {#style_dlg.style} {#style_dlg.width} {#style_dlg.color}
        + + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - -
          {#style_dlg.style} {#style_dlg.width} {#style_dlg.color}
              
              
        {#style_dlg.top}   - - - - - - -
         
        -
          - - - - - -
         
        -
        {#style_dlg.top}   + + + + + + +
          + + +
        +
          + + + + + +
         
        +
        {#style_dlg.right}   - - - - - - -
         
        -
          - - - - - -
         
        -
        {#style_dlg.right}   + + + + + + +
          + + +
        +
          + + + + + +
         
        +
        {#style_dlg.bottom}   - - - - - - -
         
        -
          - - - - - -
         
        -
        {#style_dlg.bottom}   + + + + + + +
          + + +
        +
          + + + + + +
         
        +
        {#style_dlg.left}   - - - - - - + + + + + + + + +
         
        {#style_dlg.left}   + + + + + + +
          + + +
        +
          + + + + + +
         
        +
        -
          - - - - - -
         
        -
        +
        - +
        + {#style_dlg.list} +
        @@ -541,10 +622,13 @@
        +
        - +
        + {#style_dlg.position} +
        @@ -555,11 +639,14 @@ @@ -570,11 +657,14 @@ @@ -587,7 +677,7 @@
        {#style_dlg.placement} -
        - +
        - +
          + + +
        - +
        - +
          + + +
        +
        @@ -595,11 +685,14 @@ @@ -607,11 +700,14 @@ @@ -619,11 +715,14 @@ @@ -631,11 +730,14 @@ @@ -648,7 +750,7 @@
        {#style_dlg.clip} -
         
        {#style_dlg.top} - +
        - +
          + + +
        {#style_dlg.right} - +
        - +
          + + +
        {#style_dlg.bottom} - +
        - +
          + + +
        {#style_dlg.left} - +
        - +
          + + +
        +
        @@ -656,11 +758,14 @@ @@ -668,11 +773,14 @@ @@ -680,11 +788,14 @@ @@ -692,11 +803,14 @@ @@ -706,6 +820,7 @@
        +
        diff --git a/plugins/TinyMCE/js/plugins/tabfocus/editor_plugin.js b/plugins/TinyMCE/js/plugins/tabfocus/editor_plugin.js index 27d2440222..d18689ddb9 100644 --- a/plugins/TinyMCE/js/plugins/tabfocus/editor_plugin.js +++ b/plugins/TinyMCE/js/plugins/tabfocus/editor_plugin.js @@ -1 +1 @@ -(function(){var c=tinymce.DOM,a=tinymce.dom.Event,d=tinymce.each,b=tinymce.explode;tinymce.create("tinymce.plugins.TabFocusPlugin",{init:function(f,g){function e(i,j){if(j.keyCode===9){return a.cancel(j)}}function h(l,p){var j,m,o,n,k;function q(i){o=c.getParent(l.id,"form");n=o.elements;if(o){d(n,function(s,r){if(s.id==l.id){j=r;return false}});if(i>0){for(m=j+1;m=0;m--){if(n[m].type!="hidden"){return n[m]}}}}return null}if(p.keyCode===9){k=b(l.getParam("tab_focus",l.getParam("tabfocus_elements",":prev,:next")));if(k.length==1){k[1]=k[0];k[0]=":prev"}if(p.shiftKey){if(k[0]==":prev"){n=q(-1)}else{n=c.get(k[0])}}else{if(k[1]==":next"){n=q(1)}else{n=c.get(k[1])}}if(n){if(l=tinymce.get(n.id||n.name)){l.focus()}else{window.setTimeout(function(){window.focus();n.focus()},10)}return a.cancel(p)}}}f.onKeyUp.add(e);if(tinymce.isGecko){f.onKeyPress.add(h);f.onKeyDown.add(e)}else{f.onKeyDown.add(h)}f.onInit.add(function(){d(c.select("a:first,a:last",f.getContainer()),function(i){a.add(i,"focus",function(){f.focus()})})})},getInfo:function(){return{longname:"Tabfocus",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("tabfocus",tinymce.plugins.TabFocusPlugin)})(); \ No newline at end of file +(function(){var c=tinymce.DOM,a=tinymce.dom.Event,d=tinymce.each,b=tinymce.explode;tinymce.create("tinymce.plugins.TabFocusPlugin",{init:function(f,g){function e(i,j){if(j.keyCode===9){return a.cancel(j)}}function h(l,p){var j,m,o,n,k;function q(r){n=c.select(":input:enabled,*[tabindex]");function i(s){return s.type!="hidden"&&s.tabIndex!="-1"&&!(n[m].style.display=="none")&&!(n[m].style.visibility=="hidden")}d(n,function(t,s){if(t.id==l.id){j=s;return false}});if(r>0){for(m=j+1;m=0;m--){if(i(n[m])){return n[m]}}}return null}if(p.keyCode===9){k=b(l.getParam("tab_focus",l.getParam("tabfocus_elements",":prev,:next")));if(k.length==1){k[1]=k[0];k[0]=":prev"}if(p.shiftKey){if(k[0]==":prev"){n=q(-1)}else{n=c.get(k[0])}}else{if(k[1]==":next"){n=q(1)}else{n=c.get(k[1])}}if(n){if(n.id&&(l=tinymce.get(n.id||n.name))){l.focus()}else{window.setTimeout(function(){if(!tinymce.isWebKit){window.focus()}n.focus()},10)}return a.cancel(p)}}}f.onKeyUp.add(e);if(tinymce.isGecko){f.onKeyPress.add(h);f.onKeyDown.add(e)}else{f.onKeyDown.add(h)}},getInfo:function(){return{longname:"Tabfocus",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("tabfocus",tinymce.plugins.TabFocusPlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/tabfocus/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/tabfocus/editor_plugin_src.js index c2be2f40a6..f4545e1670 100644 --- a/plugins/TinyMCE/js/plugins/tabfocus/editor_plugin_src.js +++ b/plugins/TinyMCE/js/plugins/tabfocus/editor_plugin_src.js @@ -22,27 +22,30 @@ var x, i, f, el, v; function find(d) { - f = DOM.getParent(ed.id, 'form'); - el = f.elements; + el = DOM.select(':input:enabled,*[tabindex]'); + function canSelect(e) { + return e.type != 'hidden' && + e.tabIndex != '-1' && + !(el[i].style.display == "none") && + !(el[i].style.visibility == "hidden"); + } - if (f) { - each(el, function(e, i) { - if (e.id == ed.id) { - x = i; - return false; - } - }); + each(el, function(e, i) { + if (e.id == ed.id) { + x = i; + return false; + } + }); - if (d > 0) { - for (i = x + 1; i < el.length; i++) { - if (el[i].type != 'hidden') - return el[i]; - } - } else { - for (i = x - 1; i >= 0; i--) { - if (el[i].type != 'hidden') - return el[i]; - } + if (d > 0) { + for (i = x + 1; i < el.length; i++) { + if (canSelect(el[i])) + return el[i]; + } + } else { + for (i = x - 1; i >= 0; i--) { + if (canSelect(el[i])) + return el[i]; } } @@ -71,10 +74,14 @@ } if (el) { - if (ed = tinymce.get(el.id || el.name)) + if (el.id && (ed = tinymce.get(el.id || el.name))) ed.focus(); else - window.setTimeout(function() {window.focus();el.focus();}, 10); + window.setTimeout(function() { + if (!tinymce.isWebKit) + window.focus(); + el.focus(); + }, 10); return Event.cancel(e); } @@ -89,11 +96,6 @@ } else ed.onKeyDown.add(tabHandler); - ed.onInit.add(function() { - each(DOM.select('a:first,a:last', ed.getContainer()), function(n) { - Event.add(n, 'focus', function() {ed.focus();}); - }); - }); }, getInfo : function() { diff --git a/plugins/TinyMCE/js/plugins/table/cell.htm b/plugins/TinyMCE/js/plugins/table/cell.htm index d243e1d833..a72a8d6973 100644 --- a/plugins/TinyMCE/js/plugins/table/cell.htm +++ b/plugins/TinyMCE/js/plugins/table/cell.htm @@ -5,16 +5,17 @@ + - + @@ -23,7 +24,7 @@
        {#table_dlg.general_props} -
         
        {#style_dlg.top} - +
        - +
          + + +
        {#style_dlg.right} - +
        - +
          + + +
        {#style_dlg.bottom} - +
        - +
          + + +
        {#style_dlg.left} - +
        - +
          + + +
        +
        - + - + @@ -92,7 +93,7 @@
        {#table_dlg.advanced_props} -
        @@ -70,10 +71,10 @@
        +
        @@ -124,7 +125,7 @@
        - +
        @@ -133,10 +134,10 @@ - - + +
         
        - +
        @@ -145,10 +146,10 @@ - - + +
         
        - +
        @@ -166,6 +167,7 @@ diff --git a/plugins/TinyMCE/js/plugins/table/editor_plugin.js b/plugins/TinyMCE/js/plugins/table/editor_plugin.js index 266d7d5371..f0100315b4 100644 --- a/plugins/TinyMCE/js/plugins/table/editor_plugin.js +++ b/plugins/TinyMCE/js/plugins/table/editor_plugin.js @@ -1 +1 @@ -(function(b){var c=b.each;function a(F,E,I){var e,J,B,n;r();n=E.getParent(I.getStart(),"th,td");if(n){J=D(n);B=G();n=v(J.x,J.y)}function w(L,K){L=L.cloneNode(K);L.removeAttribute("id");return L}function r(){var K=0;e=[];c(["thead","tbody","tfoot"],function(L){var M=E.select(L+" tr",F);c(M,function(N,O){O+=K;c(E.select("td,th",N),function(U,P){var Q,R,S,T;if(e[O]){while(e[O][P]){P++}}S=g(U,"rowspan");T=g(U,"colspan");for(R=O;R'}return false}},"childNodes");K=w(K,false);K.rowSpan=K.colSpan=1;if(L){K.appendChild(L)}else{if(!b.isIE){K.innerHTML='
        '}}return K}function p(){var K=E.createRng();c(E.select("tr",F),function(L){if(L.cells.length==0){E.remove(L)}});if(E.select("tr",F).length==0){K.setStartAfter(F);K.setEndAfter(F);I.setRng(K);E.remove(F);return}c(E.select("thead,tbody,tfoot",F),function(L){if(L.rows.length==0){E.remove(L)}});r();row=e[Math.min(e.length-1,J.y)];if(row){I.select(row[Math.min(row.length-1,J.x)].elm,true);I.collapse(true)}}function s(Q,O,S,P){var N,L,K,M,R;N=e[O][Q].elm.parentNode;for(K=1;K<=S;K++){N=E.getNext(N,"tr");if(N){for(L=Q;L>=0;L--){R=e[O+K][L].elm;if(R.parentNode==N){for(M=1;M<=P;M++){E.insertAfter(d(R),R)}break}}if(L==-1){for(M=1;M<=P;M++){N.insertBefore(d(N.cells[0]),N.cells[0])}}}}}function A(){c(e,function(K,L){c(K,function(N,M){var Q,P,R,O;if(h(N)){N=N.elm;Q=g(N,"colspan");P=g(N,"rowspan");if(Q>1||P>1){N.colSpan=N.rowSpan=1;for(O=0;O1){P.rowSpan=rowSpan+1;continue}}else{if(K>0&&e[K-1][O]){S=e[K-1][O].elm;rowSpan=g(S,"rowspan");if(rowSpan>1){S.rowSpan=rowSpan+1;continue}}}L=d(P);L.colSpan=P.colSpan;R.appendChild(L);M=P}}if(R.hasChildNodes()){if(!N){E.insertAfter(R,Q)}else{Q.parentNode.insertBefore(R,Q)}}}function f(L){var M,K;c(e,function(N,O){c(N,function(Q,P){if(h(Q)){M=P;if(L){return false}}});if(L){return !M}});c(e,function(Q,R){var N=Q[M].elm,O,P;if(N!=K){P=g(N,"colspan");O=g(N,"rowspan");if(P==1){if(!L){E.insertAfter(d(N),N);s(M,R,O-1,P)}else{N.parentNode.insertBefore(d(N),N);s(M,R,O-1,P)}}else{N.colSpan++}K=N}})}function m(){var K=[];c(e,function(L,M){c(L,function(O,N){if(h(O)&&b.inArray(K,N)===-1){c(e,function(R){var P=R[N].elm,Q;Q=g(P,"colspan");if(Q>1){P.colSpan=Q-1}else{E.remove(P)}});K.push(N)}})});p()}function l(){var L;function K(O){var N,P,M;N=E.getNext(O,"tr");c(O.cells,function(Q){var R=g(Q,"rowspan");if(R>1){Q.rowSpan=R-1;P=D(Q);s(P.x,P.y,1,1)}});P=D(O.cells[0]);c(e[P.y],function(Q){var R;Q=Q.elm;if(Q!=M){R=g(Q,"rowspan");if(R<=1){E.remove(Q)}else{Q.rowSpan=R-1}M=Q}})}L=j();c(L.reverse(),function(M){K(M)});p()}function C(){var K=j();E.remove(K);p();return K}function H(){var K=j();c(K,function(M,L){K[L]=w(M,true)});return K}function z(M,L){var N=j(),K=N[L?0:N.length-1],O=K.cells.length;c(e,function(Q){var P;O=0;c(Q,function(S,R){if(S.real){O+=S.colspan}if(S.elm.parentNode==K){P=1}});if(P){return false}});if(!L){M.reverse()}c(M,function(R){var Q=R.cells.length,P;for(i=0;iL){L=P}if(O>K){K=O}if(Q.real){S=Q.colspan-1;R=Q.rowspan-1;if(S){if(P+S>L){L=P+S}}if(R){if(O+R>K){K=O+R}}}}})});return{x:L,y:K}}function t(Q){var N,M,S,R,L,K,O,P;B=D(Q);if(J&&B){N=Math.min(J.x,B.x);M=Math.min(J.y,B.y);S=Math.max(J.x,B.x);R=Math.max(J.y,B.y);L=S;K=R;for(y=M;y<=K;y++){Q=e[y][N];if(!Q.real){if(N-(Q.colspan-1)L){L=x+O}}if(P){if(y+P>K){K=y+P}}}}}E.removeClass(E.select("td.mceSelected,th.mceSelected"),"mceSelected");for(y=M;y<=K;y++){for(x=N;x<=L;x++){E.addClass(e[y][x].elm,"mceSelected")}}}}b.extend(this,{deleteTable:q,split:A,merge:o,insertRow:k,insertCol:f,deleteCols:m,deleteRows:l,cutRows:C,copyRows:H,pasteRows:z,getPos:D,setStartCell:u,setEndCell:t})}b.create("tinymce.plugins.TablePlugin",{init:function(e,f){var d,j;function h(m){var l=e.selection,k=e.dom.getParent(m||l.getNode(),"table");if(k){return new a(k,e.dom,l)}}function g(){e.getBody().style.webkitUserSelect="";e.dom.removeClass(e.dom.select("td.mceSelected,th.mceSelected"),"mceSelected")}c([["table","table.desc","mceInsertTable",true],["delete_table","table.del","mceTableDelete"],["delete_col","table.delete_col_desc","mceTableDeleteCol"],["delete_row","table.delete_row_desc","mceTableDeleteRow"],["col_after","table.col_after_desc","mceTableInsertColAfter"],["col_before","table.col_before_desc","mceTableInsertColBefore"],["row_after","table.row_after_desc","mceTableInsertRowAfter"],["row_before","table.row_before_desc","mceTableInsertRowBefore"],["row_props","table.row_desc","mceTableRowProps",true],["cell_props","table.cell_desc","mceTableCellProps",true],["split_cells","table.split_cells_desc","mceTableSplitCells",true],["merge_cells","table.merge_cells_desc","mceTableMergeCells",true]],function(k){e.addButton(k[0],{title:k[1],cmd:k[2],ui:k[3]})});if(!b.isIE){e.onClick.add(function(k,l){l=l.target;if(l.nodeName==="TABLE"){k.selection.select(l)}})}e.onNodeChange.add(function(l,k,o){var m;o=l.selection.getStart();m=l.dom.getParent(o,"td,th,caption");k.setActive("table",o.nodeName==="TABLE"||!!m);if(m&&m.nodeName==="CAPTION"){m=0}k.setDisabled("delete_table",!m);k.setDisabled("delete_col",!m);k.setDisabled("delete_table",!m);k.setDisabled("delete_row",!m);k.setDisabled("col_after",!m);k.setDisabled("col_before",!m);k.setDisabled("row_after",!m);k.setDisabled("row_before",!m);k.setDisabled("row_props",!m);k.setDisabled("cell_props",!m);k.setDisabled("split_cells",!m);k.setDisabled("merge_cells",!m)});e.onInit.add(function(l){var k,o,p=l.dom,m;d=l.windowManager;l.onMouseDown.add(function(q,r){if(r.button!=2){g();o=p.getParent(r.target,"td,th");k=p.getParent(o,"table")}});p.bind(l.getDoc(),"mouseover",function(t){var r,q,s=t.target;if(o&&(m||s!=o)&&(s.nodeName=="TD"||s.nodeName=="TH")){q=p.getParent(s,"table");if(q==k){if(!m){m=h(q);m.setStartCell(o);l.getBody().style.webkitUserSelect="none"}m.setEndCell(s)}r=l.selection.getSel();if(r.removeAllRanges){r.removeAllRanges()}else{r.empty()}t.preventDefault()}});l.onMouseUp.add(function(z,A){var r,t=z.selection,B,C=t.getSel(),q,u,s,w;if(o){if(m){z.getBody().style.webkitUserSelect=""}function v(D,F){var E=new b.dom.TreeWalker(D,D);do{if(D.nodeType==3&&b.trim(D.nodeValue).length!=0){if(F){r.setStart(D,0)}else{r.setEnd(D,D.nodeValue.length)}return}if(D.nodeName=="BR"){if(F){r.setStartBefore(D)}else{r.setEndBefore(D)}return}}while(D=(F?E.next():E.prev()))}B=p.select("td.mceSelected,th.mceSelected");if(B.length>0){r=p.createRng();u=B[0];w=B[B.length-1];v(u,1);q=new b.dom.TreeWalker(u,p.getParent(B[0],"table"));do{if(u.nodeName=="TD"||u.nodeName=="TH"){if(!p.hasClass(u,"mceSelected")){break}s=u}}while(u=q.next());v(s);t.setRng(r)}z.nodeChanged();o=m=k=null}});l.onKeyUp.add(function(q,r){g()});if(l&&l.plugins.contextmenu){l.plugins.contextmenu.onContextMenu.add(function(s,q,u){var v,t=l.selection,r=t.getNode()||l.getBody();if(l.dom.getParent(u,"td")||l.dom.getParent(u,"th")||l.dom.select("td.mceSelected,th.mceSelected").length){q.removeAll();if(r.nodeName=="A"&&!l.dom.getAttrib(r,"name")){q.add({title:"advanced.link_desc",icon:"link",cmd:l.plugins.advlink?"mceAdvLink":"mceLink",ui:true});q.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"});q.addSeparator()}if(r.nodeName=="IMG"&&r.className.indexOf("mceItem")==-1){q.add({title:"advanced.image_desc",icon:"image",cmd:l.plugins.advimage?"mceAdvImage":"mceImage",ui:true});q.addSeparator()}q.add({title:"table.desc",icon:"table",cmd:"mceInsertTable",value:{action:"insert"}});q.add({title:"table.props_desc",icon:"table_props",cmd:"mceInsertTable"});q.add({title:"table.del",icon:"delete_table",cmd:"mceTableDelete"});q.addSeparator();v=q.addMenu({title:"table.cell"});v.add({title:"table.cell_desc",icon:"cell_props",cmd:"mceTableCellProps"});v.add({title:"table.split_cells_desc",icon:"split_cells",cmd:"mceTableSplitCells"});v.add({title:"table.merge_cells_desc",icon:"merge_cells",cmd:"mceTableMergeCells"});v=q.addMenu({title:"table.row"});v.add({title:"table.row_desc",icon:"row_props",cmd:"mceTableRowProps"});v.add({title:"table.row_before_desc",icon:"row_before",cmd:"mceTableInsertRowBefore"});v.add({title:"table.row_after_desc",icon:"row_after",cmd:"mceTableInsertRowAfter"});v.add({title:"table.delete_row_desc",icon:"delete_row",cmd:"mceTableDeleteRow"});v.addSeparator();v.add({title:"table.cut_row_desc",icon:"cut",cmd:"mceTableCutRow"});v.add({title:"table.copy_row_desc",icon:"copy",cmd:"mceTableCopyRow"});v.add({title:"table.paste_row_before_desc",icon:"paste",cmd:"mceTablePasteRowBefore"}).setDisabled(!j);v.add({title:"table.paste_row_after_desc",icon:"paste",cmd:"mceTablePasteRowAfter"}).setDisabled(!j);v=q.addMenu({title:"table.col"});v.add({title:"table.col_before_desc",icon:"col_before",cmd:"mceTableInsertColBefore"});v.add({title:"table.col_after_desc",icon:"col_after",cmd:"mceTableInsertColAfter"});v.add({title:"table.delete_col_desc",icon:"delete_col",cmd:"mceTableDeleteCol"})}else{q.add({title:"table.desc",icon:"table",cmd:"mceInsertTable"})}})}if(!b.isIE){function n(){var q;for(q=l.getBody().lastChild;q&&q.nodeType==3&&!q.nodeValue.length;q=q.previousSibling){}if(q&&q.nodeName=="TABLE"){l.dom.add(l.getBody(),"p",null,'
        ')}}if(b.isGecko){l.onKeyDown.add(function(r,t){var q,s,u=r.dom;if(t.keyCode==37||t.keyCode==38){q=r.selection.getRng();s=u.getParent(q.startContainer,"table");if(s&&r.getBody().firstChild==s){if(isAtStart(q,s)){q=u.createRng();q.setStartBefore(s);q.setEndBefore(s);r.selection.setRng(q);t.preventDefault()}}}})}l.onKeyUp.add(n);l.onSetContent.add(n);l.onVisualAid.add(n);l.onPreProcess.add(function(q,s){var r=s.node.lastChild;if(r&&r.childNodes.length==1&&r.firstChild.nodeName=="BR"){q.dom.remove(r)}});n()}});c({mceTableSplitCells:function(k){k.split()},mceTableMergeCells:function(l){var m,n,k;k=e.dom.getParent(e.selection.getNode(),"th,td");if(k){m=k.rowSpan;n=k.colSpan}if(!e.dom.select("td.mceSelected,th.mceSelected").length){d.open({url:f+"/merge_cells.htm",width:240+parseInt(e.getLang("table.merge_cells_delta_width",0)),height:110+parseInt(e.getLang("table.merge_cells_delta_height",0)),inline:1},{rows:m,cols:n,onaction:function(o){l.merge(k,o.cols,o.rows)},plugin_url:f})}else{l.merge()}},mceTableInsertRowBefore:function(k){k.insertRow(true)},mceTableInsertRowAfter:function(k){k.insertRow()},mceTableInsertColBefore:function(k){k.insertCol(true)},mceTableInsertColAfter:function(k){k.insertCol()},mceTableDeleteCol:function(k){k.deleteCols()},mceTableDeleteRow:function(k){k.deleteRows()},mceTableCutRow:function(k){j=k.cutRows()},mceTableCopyRow:function(k){j=k.copyRows()},mceTablePasteRowBefore:function(k){k.pasteRows(j,true)},mceTablePasteRowAfter:function(k){k.pasteRows(j)},mceTableDelete:function(k){k.deleteTable()}},function(l,k){e.addCommand(k,function(){var m=h();if(m){l(m);e.execCommand("mceRepaint");g()}})});c({mceInsertTable:function(k){d.open({url:f+"/table.htm",width:400+parseInt(e.getLang("table.table_delta_width",0)),height:320+parseInt(e.getLang("table.table_delta_height",0)),inline:1},{plugin_url:f,action:k?k.action:0})},mceTableRowProps:function(){d.open({url:f+"/row.htm",width:400+parseInt(e.getLang("table.rowprops_delta_width",0)),height:295+parseInt(e.getLang("table.rowprops_delta_height",0)),inline:1},{plugin_url:f})},mceTableCellProps:function(){d.open({url:f+"/cell.htm",width:400+parseInt(e.getLang("table.cellprops_delta_width",0)),height:295+parseInt(e.getLang("table.cellprops_delta_height",0)),inline:1},{plugin_url:f})}},function(l,k){e.addCommand(k,function(m,n){l(n)})})}});b.PluginManager.add("table",b.plugins.TablePlugin)})(tinymce); \ No newline at end of file +(function(c){var d=c.each;function b(f,g){var h=g.ownerDocument,e=h.createRange(),j;e.setStartBefore(g);e.setEnd(f.endContainer,f.endOffset);j=h.createElement("body");j.appendChild(e.cloneContents());return j.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi,"-").replace(/<[^>]+>/g,"").length==0}function a(H,G,K){var f,L,D,o;t();o=G.getParent(K.getStart(),"th,td");if(o){L=F(o);D=I();o=z(L.x,L.y)}function A(N,M){N=N.cloneNode(M);N.removeAttribute("id");return N}function t(){var M=0;f=[];d(["thead","tbody","tfoot"],function(N){var O=G.select("> "+N+" tr",H);d(O,function(P,Q){Q+=M;d(G.select("> td, > th",P),function(W,R){var S,T,U,V;if(f[Q]){while(f[Q][R]){R++}}U=h(W,"rowspan");V=h(W,"colspan");for(T=Q;T'}return false}},"childNodes");M=A(M,false);s(M,"rowSpan",1);s(M,"colSpan",1);if(N){M.appendChild(N)}else{if(!c.isIE){M.innerHTML='
        '}}return M}function q(){var M=G.createRng();d(G.select("tr",H),function(N){if(N.cells.length==0){G.remove(N)}});if(G.select("tr",H).length==0){M.setStartAfter(H);M.setEndAfter(H);K.setRng(M);G.remove(H);return}d(G.select("thead,tbody,tfoot",H),function(N){if(N.rows.length==0){G.remove(N)}});t();row=f[Math.min(f.length-1,L.y)];if(row){K.select(row[Math.min(row.length-1,L.x)].elm,true);K.collapse(true)}}function u(S,Q,U,R){var P,N,M,O,T;P=f[Q][S].elm.parentNode;for(M=1;M<=U;M++){P=G.getNext(P,"tr");if(P){for(N=S;N>=0;N--){T=f[Q+M][N].elm;if(T.parentNode==P){for(O=1;O<=R;O++){G.insertAfter(e(T),T)}break}}if(N==-1){for(O=1;O<=R;O++){P.insertBefore(e(P.cells[0]),P.cells[0])}}}}}function C(){d(f,function(M,N){d(M,function(P,O){var S,R,T,Q;if(j(P)){P=P.elm;S=h(P,"colspan");R=h(P,"rowspan");if(S>1||R>1){s(P,"rowSpan",1);s(P,"colSpan",1);for(Q=0;Q1){s(S,"rowSpan",O+1);continue}}else{if(M>0&&f[M-1][R]){V=f[M-1][R].elm;O=h(V,"rowSpan");if(O>1){s(V,"rowSpan",O+1);continue}}}N=e(S);s(N,"colSpan",S.colSpan);U.appendChild(N);P=S}}if(U.hasChildNodes()){if(!Q){G.insertAfter(U,T)}else{T.parentNode.insertBefore(U,T)}}}function g(N){var O,M;d(f,function(P,Q){d(P,function(S,R){if(j(S)){O=R;if(N){return false}}});if(N){return !O}});d(f,function(S,T){var P,Q,R;if(!S[O]){return}P=S[O].elm;if(P!=M){R=h(P,"colspan");Q=h(P,"rowspan");if(R==1){if(!N){G.insertAfter(e(P),P);u(O,T,Q-1,R)}else{P.parentNode.insertBefore(e(P),P);u(O,T,Q-1,R)}}else{s(P,"colSpan",P.colSpan+1)}M=P}})}function n(){var M=[];d(f,function(N,O){d(N,function(Q,P){if(j(Q)&&c.inArray(M,P)===-1){d(f,function(T){var R=T[P].elm,S;S=h(R,"colSpan");if(S>1){s(R,"colSpan",S-1)}else{G.remove(R)}});M.push(P)}})});q()}function m(){var N;function M(Q){var P,R,O;P=G.getNext(Q,"tr");d(Q.cells,function(S){var T=h(S,"rowSpan");if(T>1){s(S,"rowSpan",T-1);R=F(S);u(R.x,R.y,1,1)}});R=F(Q.cells[0]);d(f[R.y],function(S){var T;S=S.elm;if(S!=O){T=h(S,"rowSpan");if(T<=1){G.remove(S)}else{s(S,"rowSpan",T-1)}O=S}})}N=k();d(N.reverse(),function(O){M(O)});q()}function E(){var M=k();G.remove(M);q();return M}function J(){var M=k();d(M,function(O,N){M[N]=A(O,true)});return M}function B(O,N){var P=k(),M=P[N?0:P.length-1],Q=M.cells.length;d(f,function(S){var R;Q=0;d(S,function(U,T){if(U.real){Q+=U.colspan}if(U.elm.parentNode==M){R=1}});if(R){return false}});if(!N){O.reverse()}d(O,function(T){var S=T.cells.length,R;for(i=0;iN){N=R}if(Q>M){M=Q}if(S.real){U=S.colspan-1;T=S.rowspan-1;if(U){if(R+U>N){N=R+U}}if(T){if(Q+T>M){M=Q+T}}}}})});return{x:N,y:M}}function v(S){var P,O,U,T,N,M,Q,R;D=F(S);if(L&&D){P=Math.min(L.x,D.x);O=Math.min(L.y,D.y);U=Math.max(L.x,D.x);T=Math.max(L.y,D.y);N=U;M=T;for(y=O;y<=M;y++){S=f[y][P];if(!S.real){if(P-(S.colspan-1)N){N=x+Q}}if(R){if(y+R>M){M=y+R}}}}}G.removeClass(G.select("td.mceSelected,th.mceSelected"),"mceSelected");for(y=O;y<=M;y++){for(x=P;x<=N;x++){if(f[y][x]){G.addClass(f[y][x].elm,"mceSelected")}}}}}c.extend(this,{deleteTable:r,split:C,merge:p,insertRow:l,insertCol:g,deleteCols:n,deleteRows:m,cutRows:E,copyRows:J,pasteRows:B,getPos:F,setStartCell:w,setEndCell:v})}c.create("tinymce.plugins.TablePlugin",{init:function(f,g){var e,l,h=true;function k(o){var n=f.selection,m=f.dom.getParent(o||n.getNode(),"table");if(m){return new a(m,f.dom,n)}}function j(){f.getBody().style.webkitUserSelect="";if(h){f.dom.removeClass(f.dom.select("td.mceSelected,th.mceSelected"),"mceSelected");h=false}}d([["table","table.desc","mceInsertTable",true],["delete_table","table.del","mceTableDelete"],["delete_col","table.delete_col_desc","mceTableDeleteCol"],["delete_row","table.delete_row_desc","mceTableDeleteRow"],["col_after","table.col_after_desc","mceTableInsertColAfter"],["col_before","table.col_before_desc","mceTableInsertColBefore"],["row_after","table.row_after_desc","mceTableInsertRowAfter"],["row_before","table.row_before_desc","mceTableInsertRowBefore"],["row_props","table.row_desc","mceTableRowProps",true],["cell_props","table.cell_desc","mceTableCellProps",true],["split_cells","table.split_cells_desc","mceTableSplitCells",true],["merge_cells","table.merge_cells_desc","mceTableMergeCells",true]],function(m){f.addButton(m[0],{title:m[1],cmd:m[2],ui:m[3]})});if(!c.isIE){f.onClick.add(function(m,n){n=n.target;if(n.nodeName==="TABLE"){m.selection.select(n);m.nodeChanged()}})}f.onPreProcess.add(function(n,o){var m,p,q,s=n.dom,r;m=s.select("table",o.node);p=m.length;while(p--){q=m[p];s.setAttrib(q,"data-mce-style","");if((r=s.getAttrib(q,"width"))){s.setStyle(q,"width",r);s.setAttrib(q,"width","")}if((r=s.getAttrib(q,"height"))){s.setStyle(q,"height",r);s.setAttrib(q,"height","")}}});f.onNodeChange.add(function(o,m,r){var q;r=o.selection.getStart();q=o.dom.getParent(r,"td,th,caption");m.setActive("table",r.nodeName==="TABLE"||!!q);if(q&&q.nodeName==="CAPTION"){q=0}m.setDisabled("delete_table",!q);m.setDisabled("delete_col",!q);m.setDisabled("delete_table",!q);m.setDisabled("delete_row",!q);m.setDisabled("col_after",!q);m.setDisabled("col_before",!q);m.setDisabled("row_after",!q);m.setDisabled("row_before",!q);m.setDisabled("row_props",!q);m.setDisabled("cell_props",!q);m.setDisabled("split_cells",!q);m.setDisabled("merge_cells",!q)});f.onInit.add(function(n){var m,q,r=n.dom,o;e=n.windowManager;n.onMouseDown.add(function(s,t){if(t.button!=2){j();q=r.getParent(t.target,"td,th");m=r.getParent(q,"table")}});r.bind(n.getDoc(),"mouseover",function(w){var u,t,v=w.target;if(q&&(o||v!=q)&&(v.nodeName=="TD"||v.nodeName=="TH")){t=r.getParent(v,"table");if(t==m){if(!o){o=k(t);o.setStartCell(q);n.getBody().style.webkitUserSelect="none"}o.setEndCell(v);h=true}u=n.selection.getSel();try{if(u.removeAllRanges){u.removeAllRanges()}else{u.empty()}}catch(s){}w.preventDefault()}});n.onMouseUp.add(function(B,C){var t,v=B.selection,D,E=v.getSel(),s,w,u,A;if(q){if(o){B.getBody().style.webkitUserSelect=""}function z(F,H){var G=new c.dom.TreeWalker(F,F);do{if(F.nodeType==3&&c.trim(F.nodeValue).length!=0){if(H){t.setStart(F,0)}else{t.setEnd(F,F.nodeValue.length)}return}if(F.nodeName=="BR"){if(H){t.setStartBefore(F)}else{t.setEndBefore(F)}return}}while(F=(H?G.next():G.prev()))}D=r.select("td.mceSelected,th.mceSelected");if(D.length>0){t=r.createRng();w=D[0];A=D[D.length-1];t.setStart(w);t.setEnd(w);z(w,1);s=new c.dom.TreeWalker(w,r.getParent(D[0],"table"));do{if(w.nodeName=="TD"||w.nodeName=="TH"){if(!r.hasClass(w,"mceSelected")){break}u=w}}while(w=s.next());z(u);v.setRng(t)}B.nodeChanged();q=o=m=null}});n.onKeyUp.add(function(s,t){j()});if(n&&n.plugins.contextmenu){n.plugins.contextmenu.onContextMenu.add(function(u,s,w){var z,v=n.selection,t=v.getNode()||n.getBody();if(n.dom.getParent(w,"td")||n.dom.getParent(w,"th")||n.dom.select("td.mceSelected,th.mceSelected").length){s.removeAll();if(t.nodeName=="A"&&!n.dom.getAttrib(t,"name")){s.add({title:"advanced.link_desc",icon:"link",cmd:n.plugins.advlink?"mceAdvLink":"mceLink",ui:true});s.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"});s.addSeparator()}if(t.nodeName=="IMG"&&t.className.indexOf("mceItem")==-1){s.add({title:"advanced.image_desc",icon:"image",cmd:n.plugins.advimage?"mceAdvImage":"mceImage",ui:true});s.addSeparator()}s.add({title:"table.desc",icon:"table",cmd:"mceInsertTable",value:{action:"insert"}});s.add({title:"table.props_desc",icon:"table_props",cmd:"mceInsertTable"});s.add({title:"table.del",icon:"delete_table",cmd:"mceTableDelete"});s.addSeparator();z=s.addMenu({title:"table.cell"});z.add({title:"table.cell_desc",icon:"cell_props",cmd:"mceTableCellProps"});z.add({title:"table.split_cells_desc",icon:"split_cells",cmd:"mceTableSplitCells"});z.add({title:"table.merge_cells_desc",icon:"merge_cells",cmd:"mceTableMergeCells"});z=s.addMenu({title:"table.row"});z.add({title:"table.row_desc",icon:"row_props",cmd:"mceTableRowProps"});z.add({title:"table.row_before_desc",icon:"row_before",cmd:"mceTableInsertRowBefore"});z.add({title:"table.row_after_desc",icon:"row_after",cmd:"mceTableInsertRowAfter"});z.add({title:"table.delete_row_desc",icon:"delete_row",cmd:"mceTableDeleteRow"});z.addSeparator();z.add({title:"table.cut_row_desc",icon:"cut",cmd:"mceTableCutRow"});z.add({title:"table.copy_row_desc",icon:"copy",cmd:"mceTableCopyRow"});z.add({title:"table.paste_row_before_desc",icon:"paste",cmd:"mceTablePasteRowBefore"}).setDisabled(!l);z.add({title:"table.paste_row_after_desc",icon:"paste",cmd:"mceTablePasteRowAfter"}).setDisabled(!l);z=s.addMenu({title:"table.col"});z.add({title:"table.col_before_desc",icon:"col_before",cmd:"mceTableInsertColBefore"});z.add({title:"table.col_after_desc",icon:"col_after",cmd:"mceTableInsertColAfter"});z.add({title:"table.delete_col_desc",icon:"delete_col",cmd:"mceTableDeleteCol"})}else{s.add({title:"table.desc",icon:"table",cmd:"mceInsertTable"})}})}if(!c.isIE){function p(){var s;for(s=n.getBody().lastChild;s&&s.nodeType==3&&!s.nodeValue.length;s=s.previousSibling){}if(s&&s.nodeName=="TABLE"){n.dom.add(n.getBody(),"p",null,'
        ')}}if(c.isGecko){n.onKeyDown.add(function(t,v){var s,u,w=t.dom;if(v.keyCode==37||v.keyCode==38){s=t.selection.getRng();u=w.getParent(s.startContainer,"table");if(u&&t.getBody().firstChild==u){if(b(s,u)){s=w.createRng();s.setStartBefore(u);s.setEndBefore(u);t.selection.setRng(s);v.preventDefault()}}}})}n.onKeyUp.add(p);n.onSetContent.add(p);n.onVisualAid.add(p);n.onPreProcess.add(function(s,u){var t=u.node.lastChild;if(t&&t.childNodes.length==1&&t.firstChild.nodeName=="BR"){s.dom.remove(t)}});p()}});d({mceTableSplitCells:function(m){m.split()},mceTableMergeCells:function(n){var o,p,m;m=f.dom.getParent(f.selection.getNode(),"th,td");if(m){o=m.rowSpan;p=m.colSpan}if(!f.dom.select("td.mceSelected,th.mceSelected").length){e.open({url:g+"/merge_cells.htm",width:240+parseInt(f.getLang("table.merge_cells_delta_width",0)),height:110+parseInt(f.getLang("table.merge_cells_delta_height",0)),inline:1},{rows:o,cols:p,onaction:function(q){n.merge(m,q.cols,q.rows)},plugin_url:g})}else{n.merge()}},mceTableInsertRowBefore:function(m){m.insertRow(true)},mceTableInsertRowAfter:function(m){m.insertRow()},mceTableInsertColBefore:function(m){m.insertCol(true)},mceTableInsertColAfter:function(m){m.insertCol()},mceTableDeleteCol:function(m){m.deleteCols()},mceTableDeleteRow:function(m){m.deleteRows()},mceTableCutRow:function(m){l=m.cutRows()},mceTableCopyRow:function(m){l=m.copyRows()},mceTablePasteRowBefore:function(m){m.pasteRows(l,true)},mceTablePasteRowAfter:function(m){m.pasteRows(l)},mceTableDelete:function(m){m.deleteTable()}},function(n,m){f.addCommand(m,function(){var o=k();if(o){n(o);f.execCommand("mceRepaint");j()}})});d({mceInsertTable:function(m){e.open({url:g+"/table.htm",width:400+parseInt(f.getLang("table.table_delta_width",0)),height:320+parseInt(f.getLang("table.table_delta_height",0)),inline:1},{plugin_url:g,action:m?m.action:0})},mceTableRowProps:function(){e.open({url:g+"/row.htm",width:400+parseInt(f.getLang("table.rowprops_delta_width",0)),height:295+parseInt(f.getLang("table.rowprops_delta_height",0)),inline:1},{plugin_url:g})},mceTableCellProps:function(){e.open({url:g+"/cell.htm",width:400+parseInt(f.getLang("table.cellprops_delta_width",0)),height:295+parseInt(f.getLang("table.cellprops_delta_height",0)),inline:1},{plugin_url:g})}},function(n,m){f.addCommand(m,function(o,p){n(p)})})}});c.PluginManager.add("table",c.plugins.TablePlugin)})(tinymce); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/table/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/table/editor_plugin_src.js index c2f307f045..5b9b53d8e6 100644 --- a/plugins/TinyMCE/js/plugins/table/editor_plugin_src.js +++ b/plugins/TinyMCE/js/plugins/table/editor_plugin_src.js @@ -11,6 +11,20 @@ (function(tinymce) { var each = tinymce.each; + // Checks if the selection/caret is at the start of the specified block element + function isAtStart(rng, par) { + var doc = par.ownerDocument, rng2 = doc.createRange(), elm; + + rng2.setStartBefore(par); + rng2.setEnd(rng.endContainer, rng.endOffset); + + elm = doc.createElement('body'); + elm.appendChild(rng2.cloneContents()); + + // Check for text characters of other elements that should be treated as content + return elm.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi, '-').replace(/<[^>]+>/g, '').length == 0; + }; + /** * Table Grid class. */ @@ -38,12 +52,12 @@ grid = []; each(['thead', 'tbody', 'tfoot'], function(part) { - var rows = dom.select(part + ' tr', table); + var rows = dom.select('> ' + part + ' tr', table); each(rows, function(tr, y) { y += startY; - each(dom.select('td,th', tr), function(td, x) { + each(dom.select('> td, > th', tr), function(td, x) { var x2, y2, rowspan, colspan; // Skip over existing cells produced by rowspan @@ -90,8 +104,19 @@ return parseInt(td.getAttribute(name) || 1); }; + function setSpanVal(td, name, val) { + if (td) { + val = parseInt(val); + + if (val === 1) + td.removeAttribute(name, 1); + else + td.setAttribute(name, val, 1); + } + } + function isCellSelected(cell) { - return dom.hasClass(cell.elm, 'mceSelected') || cell == selectedCell; + return cell && (dom.hasClass(cell.elm, 'mceSelected') || cell == selectedCell); }; function getSelectedRows() { @@ -141,20 +166,21 @@ // Add something to the inner node if (curNode) - curNode.innerHTML = tinymce.isIE ? ' ' : '
        '; + curNode.innerHTML = tinymce.isIE ? ' ' : '
        '; return false; } }, 'childNodes'); cell = cloneNode(cell, false); - cell.rowSpan = cell.colSpan = 1; + setSpanVal(cell, 'rowSpan', 1); + setSpanVal(cell, 'colSpan', 1); if (formatNode) { cell.appendChild(formatNode); } else { if (!tinymce.isIE) - cell.innerHTML = '
        '; + cell.innerHTML = '
        '; } return cell; @@ -236,7 +262,8 @@ rowSpan = getSpanVal(cell, 'rowspan'); if (colSpan > 1 || rowSpan > 1) { - cell.colSpan = cell.rowSpan = 1; + setSpanVal(cell, 'rowSpan', 1); + setSpanVal(cell, 'colSpan', 1); // Insert cells right for (i = 0; i < colSpan - 1; i++) @@ -250,7 +277,7 @@ }; function merge(cell, cols, rows) { - var startX, startY, endX, endY, x, y, startCell, endCell, cell, children; + var startX, startY, endX, endY, x, y, startCell, endCell, cell, children, count; // Use specified cell and cols/rows if (cell) { @@ -279,23 +306,34 @@ // Set row/col span to start cell startCell = getCell(startX, startY).elm; - startCell.colSpan = (endX - startX) + 1; - startCell.rowSpan = (endY - startY) + 1; + setSpanVal(startCell, 'colSpan', (endX - startX) + 1); + setSpanVal(startCell, 'rowSpan', (endY - startY) + 1); // Remove other cells and add it's contents to the start cell for (y = startY; y <= endY; y++) { for (x = startX; x <= endX; x++) { + if (!grid[y] || !grid[y][x]) + continue; + cell = grid[y][x].elm; if (cell != startCell) { // Move children to startCell children = tinymce.grep(cell.childNodes); - each(children, function(node, i) { - // Jump over last BR element - if (node.nodeName != 'BR' || i != children.length - 1) - startCell.appendChild(node); + each(children, function(node) { + startCell.appendChild(node); }); + // Remove bogus nodes if there is children in the target cell + if (children.length) { + children = tinymce.grep(startCell.childNodes); + count = 0; + each(children, function(node) { + if (node.nodeName == 'BR' && dom.getAttrib(node, 'data-mce-bogus') && count++ < children.length - 1) + startCell.removeChild(node); + }); + } + // Remove cell dom.remove(cell); } @@ -308,7 +346,7 @@ }; function insertRow(before) { - var posY, cell, lastCell, x, rowElm, newRow, newCell, otherCell; + var posY, cell, lastCell, x, rowElm, newRow, newCell, otherCell, rowSpan; // Find first/last row each(grid, function(row, y) { @@ -329,30 +367,35 @@ }); for (x = 0; x < grid[0].length; x++) { + // Cell not found could be because of an invalid table structure + if (!grid[posY][x]) + continue; + cell = grid[posY][x].elm; if (cell != lastCell) { if (!before) { rowSpan = getSpanVal(cell, 'rowspan'); if (rowSpan > 1) { - cell.rowSpan = rowSpan + 1; + setSpanVal(cell, 'rowSpan', rowSpan + 1); continue; } } else { // Check if cell above can be expanded if (posY > 0 && grid[posY - 1][x]) { otherCell = grid[posY - 1][x].elm; - rowSpan = getSpanVal(otherCell, 'rowspan'); + rowSpan = getSpanVal(otherCell, 'rowSpan'); if (rowSpan > 1) { - otherCell.rowSpan = rowSpan + 1; + setSpanVal(otherCell, 'rowSpan', rowSpan + 1); continue; } } } // Insert new cell into new row - newCell = cloneCell(cell) - newCell.colSpan = cell.colSpan; + newCell = cloneCell(cell); + setSpanVal(newCell, 'colSpan', cell.colSpan); + newRow.appendChild(newCell); lastCell = cell; @@ -386,8 +429,12 @@ }); each(grid, function(row, y) { - var cell = row[posX].elm, rowSpan, colSpan; + var cell, rowSpan, colSpan; + if (!row[posX]) + return; + + cell = row[posX].elm; if (cell != lastCell) { colSpan = getSpanVal(cell, 'colspan'); rowSpan = getSpanVal(cell, 'rowspan'); @@ -401,7 +448,7 @@ fillLeftDown(posX, y, rowSpan - 1, colSpan); } } else - cell.colSpan++; + setSpanVal(cell, 'colSpan', cell.colSpan + 1); lastCell = cell; } @@ -418,10 +465,10 @@ each(grid, function(row) { var cell = row[x].elm, colSpan; - colSpan = getSpanVal(cell, 'colspan'); + colSpan = getSpanVal(cell, 'colSpan'); if (colSpan > 1) - cell.colSpan = colSpan - 1; + setSpanVal(cell, 'colSpan', colSpan - 1); else dom.remove(cell); }); @@ -444,10 +491,10 @@ // Move down row spanned cells each(tr.cells, function(cell) { - var rowSpan = getSpanVal(cell, 'rowspan'); + var rowSpan = getSpanVal(cell, 'rowSpan'); if (rowSpan > 1) { - cell.rowSpan = rowSpan - 1; + setSpanVal(cell, 'rowSpan', rowSpan - 1); pos = getPos(cell); fillLeftDown(pos.x, pos.y, 1, 1); } @@ -461,12 +508,12 @@ cell = cell.elm; if (cell != lastCell) { - rowSpan = getSpanVal(cell, 'rowspan'); + rowSpan = getSpanVal(cell, 'rowSpan'); if (rowSpan <= 1) dom.remove(cell); else - cell.rowSpan = rowSpan - 1; + setSpanVal(cell, 'rowSpan', rowSpan - 1); lastCell = cell; } @@ -534,7 +581,8 @@ // Remove col/rowspans for (i = 0; i < cellCount; i++) { cell = row.cells[i]; - cell.colSpan = cell.rowSpan = 1; + setSpanVal(cell, 'colSpan', 1); + setSpanVal(cell, 'rowSpan', 1); } // Needs more cells @@ -676,8 +724,10 @@ // Add new selection for (y = startY; y <= maxY; y++) { - for (x = startX; x <= maxX; x++) - dom.addClass(grid[y][x].elm, 'mceSelected'); + for (x = startX; x <= maxX; x++) { + if (grid[y][x]) + dom.addClass(grid[y][x].elm, 'mceSelected'); + } } } }; @@ -702,7 +752,7 @@ tinymce.create('tinymce.plugins.TablePlugin', { init : function(ed, url) { - var winMan, clipboardRows; + var winMan, clipboardRows, hasCellSelection = true; // Might be selected cells on reload function createTableGrid(node) { var selection = ed.selection, tblElm = ed.dom.getParent(node || selection.getNode(), 'table'); @@ -714,7 +764,11 @@ function cleanup() { // Restore selection possibilities ed.getBody().style.webkitUserSelect = ''; - ed.dom.removeClass(ed.dom.select('td.mceSelected,th.mceSelected'), 'mceSelected'); + + if (hasCellSelection) { + ed.dom.removeClass(ed.dom.select('td.mceSelected,th.mceSelected'), 'mceSelected'); + hasCellSelection = false; + } }; // Register buttons @@ -740,11 +794,34 @@ ed.onClick.add(function(ed, e) { e = e.target; - if (e.nodeName === 'TABLE') + if (e.nodeName === 'TABLE') { ed.selection.select(e); + ed.nodeChanged(); + } }); } + ed.onPreProcess.add(function(ed, args) { + var nodes, i, node, dom = ed.dom, value; + + nodes = dom.select('table', args.node); + i = nodes.length; + while (i--) { + node = nodes[i]; + dom.setAttrib(node, 'data-mce-style', ''); + + if ((value = dom.getAttrib(node, 'width'))) { + dom.setStyle(node, 'width', value); + dom.setAttrib(node, 'width', ''); + } + + if ((value = dom.getAttrib(node, 'height'))) { + dom.setStyle(node, 'height', value); + dom.setAttrib(node, 'height', ''); + } + } + }); + // Handle node change updates ed.onNodeChange.add(function(ed, cm, n) { var p; @@ -800,15 +877,20 @@ } tableGrid.setEndCell(target); + hasCellSelection = true; } // Remove current selection sel = ed.selection.getSel(); - if (sel.removeAllRanges) - sel.removeAllRanges(); - else - sel.empty(); + try { + if (sel.removeAllRanges) + sel.removeAllRanges(); + else + sel.empty(); + } catch (ex) { + // IE9 might throw errors here + } e.preventDefault(); } @@ -854,6 +936,8 @@ rng = dom.createRng(); node = selectedCells[0]; endNode = selectedCells[selectedCells.length - 1]; + rng.setStart(node); + rng.setEnd(node); setPoint(node, 1); walker = new tinymce.dom.TreeWalker(node, dom.getParent(selectedCells[0], 'table')); diff --git a/plugins/TinyMCE/js/plugins/table/js/cell.js b/plugins/TinyMCE/js/plugins/table/js/cell.js index b5fc1fda3d..d6f3290599 100644 --- a/plugins/TinyMCE/js/plugins/table/js/cell.js +++ b/plugins/TinyMCE/js/plugins/table/js/cell.js @@ -63,6 +63,11 @@ function init() { function updateAction() { var el, inst = ed, tdElm, trElm, tableElm, formObj = document.forms[0]; + if (!AutoValidator.validate(formObj)) { + tinyMCEPopup.alert(AutoValidator.getErrorMessages(formObj).join('. ') + '.'); + return false; + } + tinyMCEPopup.restoreSelection(); el = ed.selection.getStart(); tdElm = ed.dom.getParent(el, "td,th"); @@ -83,8 +88,6 @@ function updateAction() { return; } - ed.execCommand('mceBeginUndoLevel'); - switch (getSelectValue(formObj, 'action')) { case "cell": var celltype = getSelectValue(formObj, 'celltype'); @@ -125,6 +128,36 @@ function updateAction() { break; + case "col": + var curr, col = 0, cell = trElm.firstChild, rows = tableElm.getElementsByTagName("tr"); + + if (cell.nodeName != "TD" && cell.nodeName != "TH") + cell = nextCell(cell); + + do { + if (cell == tdElm) + break; + col += cell.getAttribute("colspan"); + } while ((cell = nextCell(cell)) != null); + + for (var i=0; i - +
        {#table_dlg.merge_cells_title} -
         
        - - - - - - - - -
        {#table_dlg.cols}:
        {#table_dlg.rows}:
        + + + + + + + + + +
        :
        :
        diff --git a/plugins/TinyMCE/js/plugins/table/row.htm b/plugins/TinyMCE/js/plugins/table/row.htm index 092e6c8270..1885401f6b 100644 --- a/plugins/TinyMCE/js/plugins/table/row.htm +++ b/plugins/TinyMCE/js/plugins/table/row.htm @@ -5,16 +5,17 @@ + - + @@ -23,7 +24,7 @@
        {#table_dlg.general_props} - +
        - +
        @@ -70,7 +71,7 @@
        @@ -80,7 +81,7 @@
        {#table_dlg.advanced_props} - +
        @@ -112,7 +113,7 @@
        - +
        @@ -122,14 +123,16 @@ - +
         
        - + +
         
        +
        diff --git a/plugins/TinyMCE/js/plugins/table/table.htm b/plugins/TinyMCE/js/plugins/table/table.htm index f269039228..09d3700f77 100644 --- a/plugins/TinyMCE/js/plugins/table/table.htm +++ b/plugins/TinyMCE/js/plugins/table/table.htm @@ -10,12 +10,13 @@ - + + @@ -23,48 +24,48 @@
        {#table_dlg.general_props} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        -
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        @@ -72,7 +73,7 @@
        {#table_dlg.advanced_props} - +
        @@ -98,7 +99,7 @@ "}else{e+=""}if(f&&j.ListBox){if(f.Button||f.SplitButton){e+=b.createHTML("td",{"class":"mceToolbarStart"},b.createHTML("span",null,""))}}}g="mceToolbarEnd";if(j.Button){g+=" mceToolbarEndButton"}else{if(j.SplitButton){g+=" mceToolbarEndSplitButton"}else{if(j.ListBox){g+=" mceToolbarEndListBox"}}}e+=b.createHTML("td",{"class":g},b.createHTML("span",null,""));return b.createHTML("table",{id:l.id,"class":"mceToolbar"+(m["class"]?" "+m["class"]:""),cellpadding:"0",cellspacing:"0",align:l.settings.align||""},""+e+"")}});(function(b){var a=b.util.Dispatcher,c=b.each;b.create("tinymce.AddOnManager",{items:[],urls:{},lookup:{},onAdd:new a(this),get:function(d){return this.lookup[d]},requireLangPack:function(e){var d=b.settings;if(d&&d.language){b.ScriptLoader.add(this.urls[e]+"/langs/"+d.language+".js")}},add:function(e,d){this.items.push(d);this.lookup[e]=d;this.onAdd.dispatch(this,e,d);return d},load:function(h,e,d,g){var f=this;if(f.urls[h]){return}if(e.indexOf("/")!=0&&e.indexOf("://")==-1){e=b.baseURL+"/"+e}f.urls[h]=e.substring(0,e.lastIndexOf("/"));b.ScriptLoader.add(e,d,g)}});b.PluginManager=new b.AddOnManager();b.ThemeManager=new b.AddOnManager()}(tinymce));(function(j){var g=j.each,d=j.extend,k=j.DOM,i=j.dom.Event,f=j.ThemeManager,b=j.PluginManager,e=j.explode,h=j.util.Dispatcher,a,c=0;j.documentBaseURL=window.location.href.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,"");if(!/[\/\\]$/.test(j.documentBaseURL)){j.documentBaseURL+="/"}j.baseURL=new j.util.URI(j.documentBaseURL).toAbsolute(j.baseURL);j.baseURI=new j.util.URI(j.baseURL);j.onBeforeUnload=new h(j);i.add(window,"beforeunload",function(l){j.onBeforeUnload.dispatch(j,l)});j.onAddEditor=new h(j);j.onRemoveEditor=new h(j);j.EditorManager=d(j,{editors:[],i18n:{},activeEditor:null,init:function(q){var n=this,p,l=j.ScriptLoader,u,o=[],m;function r(x,y,t){var v=x[y];if(!v){return}if(j.is(v,"string")){t=v.replace(/\.\w+$/,"");t=t?j.resolve(t):0;v=j.resolve(v)}return v.apply(t||this,Array.prototype.slice.call(arguments,2))}q=d({theme:"simple",language:"en"},q);n.settings=q;i.add(document,"init",function(){var s,v;r(q,"onpageload");switch(q.mode){case"exact":s=q.elements||"";if(s.length>0){g(e(s),function(x){if(k.get(x)){m=new j.Editor(x,q);o.push(m);m.render(1)}else{g(document.forms,function(y){g(y.elements,function(z){if(z.name===x){x="mce_editor_"+c++;k.setAttrib(z,"id",x);m=new j.Editor(x,q);o.push(m);m.render(1)}})})}})}break;case"textareas":case"specific_textareas":function t(y,x){return x.constructor===RegExp?x.test(y.className):k.hasClass(y,x)}g(k.select("textarea"),function(x){if(q.editor_deselector&&t(x,q.editor_deselector)){return}if(!q.editor_selector||t(x,q.editor_selector)){u=k.get(x.name);if(!x.id&&!u){x.id=x.name}if(!x.id||n.get(x.id)){x.id=k.uniqueId()}m=new j.Editor(x.id,q);o.push(m);m.render(1)}});break}if(q.oninit){s=v=0;g(o,function(x){v++;if(!x.initialized){x.onInit.add(function(){s++;if(s==v){r(q,"oninit")}})}else{s++}if(s==v){r(q,"oninit")}})}})},get:function(l){if(l===a){return this.editors}return this.editors[l]},getInstanceById:function(l){return this.get(l)},add:function(m){var l=this,n=l.editors;n[m.id]=m;n.push(m);l._setActive(m);l.onAddEditor.dispatch(l,m);if(j.adapter){j.adapter.patchEditor(m)}return m},remove:function(n){var m=this,l,o=m.editors;if(!o[n.id]){return null}delete o[n.id];for(l=0;l':"",visual_table_class:"mceItemTable",visual:1,font_size_style_values:"xx-small,x-small,small,medium,large,x-large,xx-large",apply_source_formatting:1,directionality:"ltr",forced_root_block:"p",valid_elements:"@[id|class|style|title|dir';if(F.document_base_url!=m.documentBaseURL){E.iframeHTML+=''}E.iframeHTML+='';if(m.relaxedDomain){E.iframeHTML+=''; + t.iframeHTML += ''; + + // Firefox 2 doesn't load stylesheets correctly this way + if (!isGecko || !/Firefox\/2/.test(navigator.userAgent)) { + for (i = 0; i < t.contentCSS.length; i++) + t.iframeHTML += ''; + + t.contentCSS = []; + } bi = s.body_id || 'tinymce'; if (bi.indexOf('=') != -1) { @@ -8679,19 +11219,19 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { t.iframeHTML += ''; // Domain relaxing enabled, then set document domain - if (tinymce.relaxedDomain) { + if (tinymce.relaxedDomain && (isIE || (tinymce.isOpera && parseFloat(opera.version()) < 11))) { // We need to write the contents here in IE since multiple writes messes up refresh button and back button - if (isIE || (tinymce.isOpera && parseFloat(opera.version()) >= 9.5)) - u = 'javascript:(function(){document.open();document.domain="' + document.domain + '";var ed = window.parent.tinyMCE.get("' + t.id + '");document.write(ed.iframeHTML);document.close();ed.setupIframe();})()'; - else if (tinymce.isOpera) - u = 'javascript:(function(){document.open();document.domain="' + document.domain + '";document.close();ed.setupIframe();})()'; + u = 'javascript:(function(){document.open();document.domain="' + document.domain + '";var ed = window.parent.tinyMCE.get("' + t.id + '");document.write(ed.iframeHTML);document.close();ed.setupIframe();})()'; } // Create iframe - n = DOM.add(o.iframeContainer, 'iframe', { + // TODO: ACC add the appropriate description on this. + n = DOM.add(o.iframeContainer, 'iframe', { id : t.id + "_ifr", src : u || 'javascript:""', // Workaround for HTTPS warning in IE6/7 frameBorder : '0', + allowTransparency : "true", + title : s.aria_label, style : { width : '100%', height : h @@ -8701,45 +11241,78 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { t.contentAreaContainer = o.iframeContainer; DOM.get(o.editorContainer).style.display = t.orgDisplay; DOM.get(t.id).style.display = 'none'; + DOM.setAttrib(t.id, 'aria-hidden', true); - if (!isIE || !tinymce.relaxedDomain) + if (!tinymce.relaxedDomain || !u) t.setupIframe(); e = n = o = null; // Cleanup }, - setupIframe : function() { + setupIframe : function(filled) { var t = this, s = t.settings, e = DOM.get(t.id), d = t.getDoc(), h, b; // Setup iframe body - if (!isIE || !tinymce.relaxedDomain) { + if ((!isIE || !tinymce.relaxedDomain) && !filled) { + // We need to wait for the load event on Gecko + if (isGecko && !s.readonly) { + t.getWin().onload = function() { + window.setTimeout(function() { + var b = t.getBody(), undef; + + // Editable element needs to have some contents or backspace/delete won't work properly for some odd reason on FF 3.6 or older + b.innerHTML = '
        '; + + // Check if Gecko supports contentEditable mode FF2 doesn't + if (b.contentEditable !== undef) { + // Setting the contentEditable off/on seems to force caret mode in the editor and enabled auto focus + b.contentEditable = false; + b.contentEditable = true; + + // Caret doesn't get rendered when you mousedown on the HTML element on FF 3.x + t.onMouseDown.add(function(ed, e) { + if (e.target.nodeName === "HTML") { + d.designMode = 'on'; // Render the caret + + // Remove design mode again after a while so it has some time to execute + window.setTimeout(function() { + d.designMode = 'off'; + t.getBody().focus(); + }, 1); + } + }); + } else + d.designMode = 'on'; + + // Call setup frame once the contentEditable/designMode has been initialized + // since the caret won't be rendered some times otherwise. + t.setupIframe(true); + }, 1); + }; + } + d.open(); d.write(t.iframeHTML); d.close(); + + if (tinymce.relaxedDomain) + d.domain = tinymce.relaxedDomain; + + // Wait for iframe onload event on Gecko + if (isGecko && !s.readonly) + return; } - // Design mode needs to be added here Ctrl+A will fail otherwise - if (!isIE) { - try { - if (!s.readonly) - d.designMode = 'On'; - } catch (ex) { - // Will fail on Gecko if the editor is placed in an hidden container element - // The design mode will be set ones the editor is focused - } - } + // It will not steal focus while setting contentEditable + b = t.getBody(); + b.disabled = true; - // IE needs to use contentEditable or it will display non secure items for HTTPS - if (isIE) { - // It will not steal focus if we hide it while setting contentEditable - b = t.getBody(); - DOM.hide(b); + if (!isGecko && !s.readonly) + b.contentEditable = true; - if (!s.readonly) - b.contentEditable = true; + b.disabled = false; - DOM.show(b); - } + t.schema = new tinymce.html.Schema(s); t.dom = new tinymce.dom.DOMUtils(t.getDoc(), { keep_values : true, @@ -8749,16 +11322,83 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { class_filter : s.class_filter, update_styles : 1, fix_ie_paragraphs : 1, - valid_styles : s.valid_styles + schema : t.schema }); - t.schema = new tinymce.dom.Schema(); + t.parser = new tinymce.html.DomParser(s, t.schema); - t.serializer = new tinymce.dom.Serializer(extend(s, { - valid_elements : s.verify_html === false ? '*[*]' : s.valid_elements, - dom : t.dom, - schema : t.schema - })); + // Force anchor names closed, unless the setting "allow_html_in_named_anchor" is explicitly included. + if (!t.settings.allow_html_in_named_anchor) { + t.parser.addAttributeFilter('name', function(nodes, name) { + var i = nodes.length, sibling, prevSibling, parent, node; + + while (i--) { + node = nodes[i]; + if (node.name === 'a' && node.firstChild) { + parent = node.parent; + + // Move children after current node + sibling = node.lastChild; + do { + prevSibling = sibling.prev; + parent.insert(sibling, node); + sibling = prevSibling; + } while (sibling); + } + } + }); + } + + // Convert src and href into data-mce-src, data-mce-href and data-mce-style + t.parser.addAttributeFilter('src,href,style', function(nodes, name) { + var i = nodes.length, node, dom = t.dom, value, internalName; + + while (i--) { + node = nodes[i]; + value = node.attr(name); + internalName = 'data-mce-' + name; + + // Add internal attribute if we need to we don't on a refresh of the document + if (!node.attributes.map[internalName]) { + if (name === "style") + node.attr(internalName, dom.serializeStyle(dom.parseStyle(value), node.name)); + else + node.attr(internalName, t.convertURL(value, name, node.name)); + } + } + }); + + // Keep scripts from executing + t.parser.addNodeFilter('script', function(nodes, name) { + var i = nodes.length; + + while (i--) + nodes[i].attr('type', 'mce-text/javascript'); + }); + + t.parser.addNodeFilter('#cdata', function(nodes, name) { + var i = nodes.length, node; + + while (i--) { + node = nodes[i]; + node.type = 8; + node.name = '#comment'; + node.value = '[CDATA[' + node.value + ']]'; + } + }); + + t.parser.addNodeFilter('p,h1,h2,h3,h4,h5,h6,div', function(nodes, name) { + var i = nodes.length, node, nonEmptyElements = t.schema.getNonEmptyElements(); + + while (i--) { + node = nodes[i]; + + if (node.isEmpty(nonEmptyElements)) + node.empty().append(new tinymce.html.Node('br', 1)).shortEnded = true; + } + }); + + t.serializer = new tinymce.dom.Serializer(s, t.dom, t.schema); t.selection = new tinymce.dom.Selection(t.dom, t.getWin(), t.serializer); @@ -8768,18 +11408,18 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { t.formatter.register({ alignleft : [ {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'left'}}, - {selector : 'img,table', styles : {'float' : 'left'}} + {selector : 'img,table', collapsed : false, styles : {'float' : 'left'}} ], aligncenter : [ {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'center'}}, - {selector : 'img', styles : {display : 'block', marginLeft : 'auto', marginRight : 'auto'}}, - {selector : 'table', styles : {marginLeft : 'auto', marginRight : 'auto'}} + {selector : 'img', collapsed : false, styles : {display : 'block', marginLeft : 'auto', marginRight : 'auto'}}, + {selector : 'table', collapsed : false, styles : {marginLeft : 'auto', marginRight : 'auto'}} ], alignright : [ {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'right'}}, - {selector : 'img,table', styles : {'float' : 'right'}} + {selector : 'img,table', collapsed : false, styles : {'float' : 'right'}} ], alignfull : [ @@ -8787,33 +11427,35 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { ], bold : [ - {inline : 'strong'}, + {inline : 'strong', remove : 'all'}, {inline : 'span', styles : {fontWeight : 'bold'}}, - {inline : 'b'} + {inline : 'b', remove : 'all'} ], italic : [ - {inline : 'em'}, + {inline : 'em', remove : 'all'}, {inline : 'span', styles : {fontStyle : 'italic'}}, - {inline : 'i'} + {inline : 'i', remove : 'all'} ], underline : [ {inline : 'span', styles : {textDecoration : 'underline'}, exact : true}, - {inline : 'u'} + {inline : 'u', remove : 'all'} ], strikethrough : [ {inline : 'span', styles : {textDecoration : 'line-through'}, exact : true}, - {inline : 'u'} + {inline : 'strike', remove : 'all'} ], - forecolor : {inline : 'span', styles : {color : '%value'}}, - hilitecolor : {inline : 'span', styles : {backgroundColor : '%value'}}, + forecolor : {inline : 'span', styles : {color : '%value'}, wrap_links : false}, + hilitecolor : {inline : 'span', styles : {backgroundColor : '%value'}, wrap_links : false}, fontname : {inline : 'span', styles : {fontFamily : '%value'}}, fontsize : {inline : 'span', styles : {fontSize : '%value'}}, fontsize_class : {inline : 'span', attributes : {'class' : '%value'}}, blockquote : {block : 'blockquote', wrapper : 1, remove : 'all'}, + subscript : {inline : 'sub'}, + superscript : {inline : 'sup'}, removeformat : [ {selector : 'b,strong,em,i,font,u,strike', remove : 'all', split : true, expand : false, block_expand : true, deep : true}, @@ -8834,7 +11476,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { // Pass through t.undoManager.onAdd.add(function(um, l) { - if (!l.initial) + if (um.hasUndo()) return t.onChange.dispatch(t, l, um); }); @@ -8878,29 +11520,6 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { if (s.nowrap) t.getBody().style.whiteSpace = "nowrap"; - if (s.custom_elements) { - function handleCustom(ed, o) { - each(explode(s.custom_elements), function(v) { - var n; - - if (v.indexOf('~') === 0) { - v = v.substring(1); - n = 'span'; - } else - n = 'div'; - - o.content = o.content.replace(new RegExp('<(' + v + ')([^>]*)>', 'g'), '<' + n + ' _mce_name="$1"$2>'); - o.content = o.content.replace(new RegExp('', 'g'), ''); - }); - }; - - t.onBeforeSetContent.add(handleCustom); - t.onPostProcess.add(function(ed, o) { - if (o.set) - handleCustom(ed, o); - }); - } - if (s.handle_node_change_callback) { t.onNodeChange.add(function(ed, cm, n) { t.execCallback('handle_node_change_callback', t.id, n, -1, -1, true, t.selection.isCollapsed()); @@ -8922,6 +11541,18 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { }); } + if (s.protect) { + t.onBeforeSetContent.add(function(ed, o) { + if (s.protect) { + each(s.protect, function(pattern) { + o.content = o.content.replace(pattern, function(str) { + return ''; + }); + }); + } + }); + } + if (s.convert_newlines_to_brs) { t.onBeforeSetContent.add(function(ed, o) { if (o.initial) @@ -8929,12 +11560,6 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { }); } - if (s.fix_nesting && isIE) { - t.onBeforeSetContent.add(function(ed, o) { - o.content = t._fixNesting(o.content); - }); - } - if (s.preformatted) { t.onPostProcess.add(function(ed, o) { o.content = o.content.replace(/^\s*/, ''); @@ -9028,7 +11653,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { var pn = n.parentNode; if (ed.dom.isBlock(pn) && pn.lastChild === n) - ed.dom.add(pn, 'br', {'_mce_bogus' : 1}); + ed.dom.add(pn, 'br', {'data-mce-bogus' : 1}); }); }; @@ -9038,54 +11663,36 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { }); t.onSetContent.add(t.selection.onSetContent.add(fixLinks)); - - if (!s.readonly) { - try { - // Design mode must be set here once again to fix a bug where - // Ctrl+A/Delete/Backspace didn't work if the editor was added using mceAddControl then removed then added again - d.designMode = 'Off'; - d.designMode = 'On'; - } catch (ex) { - // Will fail on Gecko if the editor is placed in an hidden container element - // The design mode will be set ones the editor is focused - } - } } - // A small timeout was needed since firefox will remove. Bug: #1838304 - setTimeout(function () { - if (t.removed) - return; + t.load({initial : true, format : 'html'}); + t.startContent = t.getContent({format : 'raw'}); + t.undoManager.add(); + t.initialized = true; - t.load({initial : true, format : (s.cleanup_on_startup ? 'html' : 'raw')}); - t.startContent = t.getContent({format : 'raw'}); - t.initialized = true; + t.onInit.dispatch(t); + t.execCallback('setupcontent_callback', t.id, t.getBody(), t.getDoc()); + t.execCallback('init_instance_callback', t); + t.focus(true); + t.nodeChanged({initial : 1}); - t.onInit.dispatch(t); - t.execCallback('setupcontent_callback', t.id, t.getBody(), t.getDoc()); - t.execCallback('init_instance_callback', t); - t.focus(true); - t.nodeChanged({initial : 1}); + // Load specified content CSS last + each(t.contentCSS, function(u) { + t.dom.loadCSS(u); + }); - // Load specified content CSS last - if (s.content_css) { - tinymce.each(explode(s.content_css), function(u) { - t.dom.loadCSS(t.documentBaseURI.toAbsolute(u)); - }); - } + // Handle auto focus + if (s.auto_focus) { + setTimeout(function () { + var ed = tinymce.get(s.auto_focus); - // Handle auto focus - if (s.auto_focus) { - setTimeout(function () { - var ed = tinymce.get(s.auto_focus); + ed.selection.select(ed.getBody(), 1); + ed.selection.collapse(1); + ed.getBody().focus(); + ed.getWin().focus(); + }, 100); + } - ed.selection.select(ed.getBody(), 1); - ed.selection.collapse(1); - ed.getWin().focus(); - }, 100); - } - }, 1); - e = null; }, @@ -9188,7 +11795,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { }, nodeChanged : function(o) { - var t = this, s = t.selection, n = (isIE ? s.getNode() : s.getStart()) || t.getBody(); + var t = this, s = t.selection, n = s.getStart() || t.getBody(); // Fix for bug #1896577 it seems that this can not be fired while the editor is loading if (t.initialized) { @@ -9221,16 +11828,16 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { t.buttons[n] = s; }, - addCommand : function(n, f, s) { - this.execCommands[n] = {func : f, scope : s || this}; + addCommand : function(name, callback, scope) { + this.execCommands[name] = {func : callback, scope : scope || this}; }, - addQueryStateHandler : function(n, f, s) { - this.queryStateCommands[n] = {func : f, scope : s || this}; + addQueryStateHandler : function(name, callback, scope) { + this.queryStateCommands[name] = {func : callback, scope : scope || this}; }, - addQueryValueHandler : function(n, f, s) { - this.queryValueCommands[n] = {func : f, scope : s || this}; + addQueryValueHandler : function(name, callback, scope) { + this.queryValueCommands[name] = {func : callback, scope : scope || this}; }, addShortcut : function(pa, desc, cmd_func, sc) { @@ -9333,12 +11940,6 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { return true; } - // Execute global commands - if (tinymce.GlobalCommands.execCommand(t, cmd, ui, val)) { - t.onExecCommand.dispatch(t, cmd, ui, val, a); - return true; - } - // Editor commands if (t.editorCommands.execCommand(cmd, ui, val)) { t.onExecCommand.dispatch(t, cmd, ui, val, a); @@ -9470,7 +12071,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { // Add undo level will trigger onchange event if (!o.no_events) { - t.undoManager.typing = 0; + t.undoManager.typing = false; t.undoManager.add(); } @@ -9502,66 +12103,85 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { return h; }, - setContent : function(h, o) { - var t = this; + setContent : function(content, args) { + var self = this, rootNode, body = self.getBody(), forcedRootBlockName; - o = o || {}; - o.format = o.format || 'html'; - o.set = true; - o.content = h; + // Setup args object + args = args || {}; + args.format = args.format || 'html'; + args.set = true; + args.content = content; - if (!o.no_events) - t.onBeforeSetContent.dispatch(t, o); + // Do preprocessing + if (!args.no_events) + self.onBeforeSetContent.dispatch(self, args); + + content = args.content; // Padd empty content in Gecko and Safari. Commands will otherwise fail on the content // It will also be impossible to place the caret in the editor unless there is a BR element present - if (!tinymce.isIE && (h.length === 0 || /^\s+$/.test(h))) { - o.content = t.dom.setHTML(t.getBody(), '
        '); - o.format = 'raw'; + if (!tinymce.isIE && (content.length === 0 || /^\s+$/.test(content))) { + forcedRootBlockName = self.settings.forced_root_block; + if (forcedRootBlockName) + content = '<' + forcedRootBlockName + '>
        '; + else + content = '
        '; + + body.innerHTML = content; + self.selection.select(body, true); + self.selection.collapse(true); + return; } - o.content = t.dom.setHTML(t.getBody(), tinymce.trim(o.content)); - - if (o.format != 'raw' && t.settings.cleanup) { - o.getInner = true; - o.content = t.dom.setHTML(t.getBody(), t.serializer.serialize(t.getBody(), o)); + // Parse and serialize the html + if (args.format !== 'raw') { + content = new tinymce.html.Serializer({}, self.schema).serialize( + self.parser.parse(content) + ); } - if (!o.no_events) - t.onSetContent.dispatch(t, o); + // Set the new cleaned contents to the editor + args.content = tinymce.trim(content); + self.dom.setHTML(body, args.content); - return o.content; + // Do post processing + if (!args.no_events) + self.onSetContent.dispatch(self, args); + + return args.content; }, - getContent : function(o) { - var t = this, h; + getContent : function(args) { + var self = this, content; - o = o || {}; - o.format = o.format || 'html'; - o.get = true; + // Setup args object + args = args || {}; + args.format = args.format || 'html'; + args.get = true; - if (!o.no_events) - t.onBeforeGetContent.dispatch(t, o); + // Do preprocessing + if (!args.no_events) + self.onBeforeGetContent.dispatch(self, args); - if (o.format != 'raw' && t.settings.cleanup) { - o.getInner = true; - h = t.serializer.serialize(t.getBody(), o); - } else - h = t.getBody().innerHTML; + // Get raw contents or by default the cleaned contents + if (args.format == 'raw') + content = self.getBody().innerHTML; + else + content = self.serializer.serialize(self.getBody(), args); - h = h.replace(/^\s*|\s*$/g, ''); - o.content = h; + args.content = tinymce.trim(content); - if (!o.no_events) - t.onGetContent.dispatch(t, o); + // Do post processing + if (!args.no_events) + self.onGetContent.dispatch(self, args); - return o.content; + return args.content; }, isDirty : function() { - var t = this; + var self = this; - return tinymce.trim(t.startContent) != tinymce.trim(t.getContent({format : 'raw', no_events : 1})) && !t.isNotDirty; + return tinymce.trim(self.startContent) != tinymce.trim(self.getContent({format : 'raw', no_events : 1})) && !self.isNotDirty; }, getContainer : function() { @@ -9739,7 +12359,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { _addEvents : function() { // 'focus', 'blur', 'dblclick', 'beforedeactivate', submit, reset - var t = this, i, s = t.settings, lo = { + var t = this, i, s = t.settings, dom = t.dom, lo = { mouseup : 'onMouseUp', mousedown : 'onMouseDown', click : 'onClick', @@ -9771,35 +12391,26 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { each(lo, function(v, k) { switch (k) { case 'contextmenu': - if (tinymce.isOpera) { - // Fake contextmenu on Opera - t.dom.bind(t.getBody(), 'mousedown', function(e) { - if (e.ctrlKey) { - e.fakeType = 'contextmenu'; - eventHandler(e); - } - }); - } else - t.dom.bind(t.getBody(), k, eventHandler); + dom.bind(t.getDoc(), k, eventHandler); break; case 'paste': - t.dom.bind(t.getBody(), k, function(e) { + dom.bind(t.getBody(), k, function(e) { eventHandler(e); }); break; case 'submit': case 'reset': - t.dom.bind(t.getElement().form || DOM.getParent(t.id, 'form'), k, eventHandler); + dom.bind(t.getElement().form || DOM.getParent(t.id, 'form'), k, eventHandler); break; default: - t.dom.bind(s.content_editable ? t.getBody() : t.getDoc(), k, eventHandler); + dom.bind(s.content_editable ? t.getBody() : t.getDoc(), k, eventHandler); } }); - t.dom.bind(s.content_editable ? t.getBody() : (isGecko ? t.getDoc() : t.getWin()), 'focus', function(e) { + dom.bind(s.content_editable ? t.getBody() : (isGecko ? t.getDoc() : t.getWin()), 'focus', function(e) { t.focus(true); }); @@ -9807,22 +12418,12 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { // Fixes bug where a specified document_base_uri could result in broken images // This will also fix drag drop of images in Gecko if (tinymce.isGecko) { - // Convert all images to absolute URLs -/* t.onSetContent.add(function(ed, o) { - each(ed.dom.select('img'), function(e) { - var v; - - if (v = e.getAttribute('_mce_src')) - e.src = t.documentBaseURI.toAbsolute(v); - }) - });*/ - - t.dom.bind(t.getDoc(), 'DOMNodeInserted', function(e) { + dom.bind(t.getDoc(), 'DOMNodeInserted', function(e) { var v; e = e.target; - if (e.nodeType === 1 && e.nodeName === 'IMG' && (v = e.getAttribute('_mce_src'))) + if (e.nodeType === 1 && e.nodeName === 'IMG' && (v = e.getAttribute('data-mce-src'))) e.src = t.documentBaseURI.toAbsolute(v); }); } @@ -9835,8 +12436,10 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { if (isGecko && !s.readonly) { if (t._isHidden()) { try { - if (!s.content_editable) - d.designMode = 'On'; + if (!s.content_editable) { + d.body.contentEditable = false; + d.body.contentEditable = true; + } } catch (ex) { // Fails if it's hidden } @@ -9863,18 +12466,20 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { t.onMouseDown.add(setOpts); } - // Workaround for bug, http://bugs.webkit.org/show_bug.cgi?id=12250 - // WebKit can't even do simple things like selecting an image - // This also fixes so it's possible to select mceItemAnchors - if (tinymce.isWebKit) { - t.onClick.add(function(ed, e) { - e = e.target; + t.onClick.add(function(ed, e) { + e = e.target; - // Needs tobe the setBaseAndExtend or it will fail to select floated images - if (e.nodeName == 'IMG' || (e.nodeName == 'A' && t.dom.hasClass(e, 'mceItemAnchor'))) - t.selection.getSel().setBaseAndExtent(e, 0, e, 1); - }); - } + // Workaround for bug, http://bugs.webkit.org/show_bug.cgi?id=12250 + // WebKit can't even do simple things like selecting an image + // Needs tobe the setBaseAndExtend or it will fail to select floated images + if (tinymce.isWebKit && e.nodeName == 'IMG') + t.selection.getSel().setBaseAndExtent(e, 0, e, 1); + + if (e.nodeName == 'A' && dom.hasClass(e, 'mceItemAnchor')) + t.selection.select(e); + + t.nodeChanged(); + }); // Add node change handlers t.onMouseUp.add(t.nodeChanged); @@ -9965,7 +12570,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { if (tinymce.isIE) { // Fix so resize will only update the width and height attributes not the styles of an image // It will also block mceItemNoResize items - t.dom.bind(t.getDoc(), 'controlselect', function(e) { + dom.bind(t.getDoc(), 'controlselect', function(e) { var re = t.resizeInfo, cb; e = e.target; @@ -9975,28 +12580,28 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { return; if (re) - t.dom.unbind(re.node, re.ev, re.cb); + dom.unbind(re.node, re.ev, re.cb); - if (!t.dom.hasClass(e, 'mceItemNoResize')) { + if (!dom.hasClass(e, 'mceItemNoResize')) { ev = 'resizeend'; - cb = t.dom.bind(e, ev, function(e) { + cb = dom.bind(e, ev, function(e) { var v; e = e.target; - if (v = t.dom.getStyle(e, 'width')) { - t.dom.setAttrib(e, 'width', v.replace(/[^0-9%]+/g, '')); - t.dom.setStyle(e, 'width', ''); + if (v = dom.getStyle(e, 'width')) { + dom.setAttrib(e, 'width', v.replace(/[^0-9%]+/g, '')); + dom.setStyle(e, 'width', ''); } - if (v = t.dom.getStyle(e, 'height')) { - t.dom.setAttrib(e, 'height', v.replace(/[^0-9%]+/g, '')); - t.dom.setStyle(e, 'height', ''); + if (v = dom.getStyle(e, 'height')) { + dom.setAttrib(e, 'height', v.replace(/[^0-9%]+/g, '')); + dom.setStyle(e, 'height', ''); } }); } else { ev = 'resizestart'; - cb = t.dom.bind(e, 'resizestart', Event.cancel, Event); + cb = dom.bind(e, 'resizestart', Event.cancel, Event); } re = t.resizeInfo = { @@ -10005,27 +12610,6 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { cb : cb }; }); - - t.onKeyDown.add(function(ed, e) { - switch (e.keyCode) { - case 8: - // Fix IE control + backspace browser bug - if (t.selection.getRng().item) { - ed.dom.remove(t.selection.getRng().item(0)); - return Event.cancel(e); - } - } - }); - - /*if (t.dom.boxModel) { - t.getBody().style.height = '100%'; - - Event.add(t.getWin(), 'resize', function(e) { - var docElm = t.getDoc().documentElement; - - docElm.style.height = (docElm.offsetHeight - 10) + 'px'; - }); - }*/ } if (tinymce.isOpera) { @@ -10037,74 +12621,61 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { // Add custom undo/redo handlers if (s.custom_undo_redo) { function addUndo() { - t.undoManager.typing = 0; + t.undoManager.typing = false; t.undoManager.add(); }; - t.dom.bind(t.getDoc(), 'focusout', function(e) { + dom.bind(t.getDoc(), 'focusout', function(e) { if (!t.removed && t.undoManager.typing) addUndo(); }); + // Add undo level when contents is drag/dropped within the editor + t.dom.bind(t.dom.getRoot(), 'dragend', function(e) { + addUndo(); + }); + t.onKeyUp.add(function(ed, e) { - if ((e.keyCode >= 33 && e.keyCode <= 36) || (e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 13 || e.keyCode == 45 || e.ctrlKey) + var keyCode = e.keyCode; + + if ((keyCode >= 33 && keyCode <= 36) || (keyCode >= 37 && keyCode <= 40) || keyCode == 13 || keyCode == 45 || e.ctrlKey) addUndo(); }); t.onKeyDown.add(function(ed, e) { - var rng, parent, bookmark; + var keyCode = e.keyCode, sel; - // IE has a really odd bug where the DOM might include an node that doesn't have - // a proper structure. If you try to access nodeValue it would throw an illegal value exception. - // This seems to only happen when you delete contents and it seems to be avoidable if you refresh the element - // after you delete contents from it. See: #3008923 - if (isIE && e.keyCode == 46) { - rng = t.selection.getRng(); + if (keyCode == 8) { + sel = t.getDoc().selection; - if (rng.parentElement) { - parent = rng.parentElement(); + // Fix IE control + backspace browser bug + if (sel && sel.createRange && sel.createRange().item) { + t.undoManager.beforeChange(); + ed.dom.remove(sel.createRange().item(0)); + addUndo(); - // Select next word when ctrl key is used in combo with delete - if (e.ctrlKey) { - rng.moveEnd('word', 1); - rng.select(); - } - - // Delete contents - t.selection.getSel().clear(); - - // Check if we are within the same parent - if (rng.parentElement() == parent) { - bookmark = t.selection.getBookmark(); - - try { - // Update the HTML and hopefully it will remove the artifacts - parent.innerHTML = parent.innerHTML; - } catch (ex) { - // And since it's IE it can sometimes produce an unknown runtime error - } - - // Restore the caret position - t.selection.moveToBookmark(bookmark); - } - - // Block the default delete behavior since it might be broken - e.preventDefault(); - return; + return Event.cancel(e); } } - // Is caracter positon keys - if ((e.keyCode >= 33 && e.keyCode <= 36) || (e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 13 || e.keyCode == 45) { + // Is caracter positon keys left,right,up,down,home,end,pgdown,pgup,enter + if ((keyCode >= 33 && keyCode <= 36) || (keyCode >= 37 && keyCode <= 40) || keyCode == 13 || keyCode == 45) { + // Add position before enter key is pressed, used by IE since it still uses the default browser behavior + // Todo: Remove this once we normalize enter behavior on IE + if (tinymce.isIE && keyCode == 13) + t.undoManager.beforeChange(); + if (t.undoManager.typing) addUndo(); return; } - if (!t.undoManager.typing) { + // If key isn't shift,ctrl,alt,capslock,metakey + if ((keyCode < 16 || keyCode > 20) && keyCode != 224 && keyCode != 91 && !t.undoManager.typing) { + t.undoManager.beforeChange(); + t.undoManager.typing = true; t.undoManager.add(); - t.undoManager.typing = 1; } }); @@ -10113,6 +12684,53 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { addUndo(); }); } + + // Bug fix for FireFox keeping styles from end of selection instead of start. + if (tinymce.isGecko) { + function getAttributeApplyFunction() { + var template = t.dom.getAttribs(t.selection.getStart().cloneNode(false)); + + return function() { + var target = t.selection.getStart(); + t.dom.removeAllAttribs(target); + each(template, function(attr) { + target.setAttributeNode(attr.cloneNode(true)); + }); + }; + } + + function isSelectionAcrossElements() { + var s = t.selection; + + return !s.isCollapsed() && s.getStart() != s.getEnd(); + } + + t.onKeyPress.add(function(ed, e) { + var applyAttributes; + + if ((e.keyCode == 8 || e.keyCode == 46) && isSelectionAcrossElements()) { + applyAttributes = getAttributeApplyFunction(); + t.getDoc().execCommand('delete', false, null); + applyAttributes(); + + return Event.cancel(e); + } + }); + + t.dom.bind(t.getDoc(), 'cut', function(e) { + var applyAttributes; + + if (isSelectionAcrossElements()) { + applyAttributes = getAttributeApplyFunction(); + t.onKeyUp.addToTop(Event.cancel, Event); + + setTimeout(function() { + applyAttributes(); + t.onKeyUp.remove(Event.cancel, Event); + }, 0); + } + }); + } }, _isHidden : function() { @@ -10124,57 +12742,6 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { // Weird, wheres that cursor selection? s = this.selection.getSel(); return (!s || !s.rangeCount || s.rangeCount == 0); - }, - - // Fix for bug #1867292 - _fixNesting : function(s) { - var d = [], i; - - s = s.replace(/<(\/)?([^\s>]+)[^>]*?>/g, function(a, b, c) { - var e; - - // Handle end element - if (b === '/') { - if (!d.length) - return ''; - - if (c !== d[d.length - 1].tag) { - for (i=d.length - 1; i>=0; i--) { - if (d[i].tag === c) { - d[i].close = 1; - break; - } - } - - return ''; - } else { - d.pop(); - - if (d.length && d[d.length - 1].close) { - a = a + ''; - d.pop(); - } - } - } else { - // Ignore these - if (/^(br|hr|input|meta|img|link|param)$/i.test(c)) - return a; - - // Ignore closed ones - if (/\/>$/.test(a)) - return a; - - d.push({tag : c}); // Push start element - } - - return a; - }); - - // End all open tags - for (i=d.length - 1; i>=0; i--) - s += ''; - - return s; } }); })(tinymce); @@ -10321,6 +12888,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { }); toggleFormat('align' + align); + execCommand('mceRepaint'); }, // Override list commands to fix WebKit bug @@ -10346,7 +12914,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { }, // Override commands to use the text formatter engine - 'Bold,Italic,Underline,Strikethrough' : function(command) { + 'Bold,Italic,Underline,Strikethrough,Superscript,Subscript' : function(command) { toggleFormat(command); }, @@ -10419,12 +12987,138 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { }, mceInsertContent : function(command, ui, value) { - selection.setContent(value); + var parser, serializer, parentNode, rootNode, fragment, args, + marker, nodeRect, viewPortRect, rng, node, node2, bookmarkHtml, viewportBodyElement; + + // Setup parser and serializer + parser = editor.parser; + serializer = new tinymce.html.Serializer({}, editor.schema); + bookmarkHtml = '\uFEFF'; + + // Run beforeSetContent handlers on the HTML to be inserted + args = {content: value, format: 'html'}; + selection.onBeforeSetContent.dispatch(selection, args); + value = args.content; + + // Add caret at end of contents if it's missing + if (value.indexOf('{$caret}') == -1) + value += '{$caret}'; + + // Replace the caret marker with a span bookmark element + value = value.replace(/\{\$caret\}/, bookmarkHtml); + + // Insert node maker where we will insert the new HTML and get it's parent + if (!selection.isCollapsed()) + editor.getDoc().execCommand('Delete', false, null); + + parentNode = selection.getNode(); + + // Parse the fragment within the context of the parent node + args = {context : parentNode.nodeName.toLowerCase()}; + fragment = parser.parse(value, args); + + // Move the caret to a more suitable location + node = fragment.lastChild; + if (node.attr('id') == 'mce_marker') { + marker = node; + + for (node = node.prev; node; node = node.walk(true)) { + if (node.type == 3 || !dom.isBlock(node.name)) { + node.parent.insert(marker, node, node.name === 'br'); + break; + } + } + } + + // If parser says valid we can insert the contents into that parent + if (!args.invalid) { + value = serializer.serialize(fragment); + + // Check if parent is empty or only has one BR element then set the innerHTML of that parent + node = parentNode.firstChild; + node2 = parentNode.lastChild; + if (!node || (node === node2 && node.nodeName === 'BR')) + dom.setHTML(parentNode, value); + else + selection.setContent(value); + } else { + // If the fragment was invalid within that context then we need + // to parse and process the parent it's inserted into + + // Insert bookmark node and get the parent + selection.setContent(bookmarkHtml); + parentNode = editor.selection.getNode(); + rootNode = editor.getBody(); + + // Opera will return the document node when selection is in root + if (parentNode.nodeType == 9) + parentNode = node = rootNode; + else + node = parentNode; + + // Find the ancestor just before the root element + while (node !== rootNode) { + parentNode = node; + node = node.parentNode; + } + + // Get the outer/inner HTML depending on if we are in the root and parser and serialize that + value = parentNode == rootNode ? rootNode.innerHTML : dom.getOuterHTML(parentNode); + value = serializer.serialize( + parser.parse( + // Need to replace by using a function since $ in the contents would otherwise be a problem + value.replace(//i, function() { + return serializer.serialize(fragment); + }) + ) + ); + + // Set the inner/outer HTML depending on if we are in the root or not + if (parentNode == rootNode) + dom.setHTML(rootNode, value); + else + dom.setOuterHTML(parentNode, value); + } + + marker = dom.get('mce_marker'); + + // Scroll range into view scrollIntoView on element can't be used since it will scroll the main view port as well + nodeRect = dom.getRect(marker); + viewPortRect = dom.getViewPort(editor.getWin()); + + // Check if node is out side the viewport if it is then scroll to it + if ((nodeRect.y + nodeRect.h > viewPortRect.y + viewPortRect.h || nodeRect.y < viewPortRect.y) || + (nodeRect.x > viewPortRect.x + viewPortRect.w || nodeRect.x < viewPortRect.x)) { + viewportBodyElement = tinymce.isIE ? editor.getDoc().documentElement : editor.getBody(); + viewportBodyElement.scrollLeft = nodeRect.x; + viewportBodyElement.scrollTop = nodeRect.y - viewPortRect.h + 25; + } + + // Move selection before marker and remove it + rng = dom.createRng(); + + // If previous sibling is a text node set the selection to the end of that node + node = marker.previousSibling; + if (node && node.nodeType == 3) { + rng.setStart(node, node.nodeValue.length); + } else { + // If the previous sibling isn't a text node or doesn't exist set the selection before the marker node + rng.setStartBefore(marker); + rng.setEndBefore(marker); + } + + // Remove the marker node and set the new range + dom.remove(marker); + selection.setRng(rng); + + // Dispatch after event and add any visual elements needed + selection.onSetContent.dispatch(selection, args); + editor.addVisual(); }, mceInsertRawHTML : function(command, ui, value) { selection.setContent('tiny_mce_marker'); - editor.setContent(editor.getContent().replace(/tiny_mce_marker/g, value)); + editor.setContent(editor.getContent().replace(/tiny_mce_marker/g, function() { return value })); }, mceSetContent : function(command, ui, value) { @@ -10474,7 +13168,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { }, InsertHorizontalRule : function() { - selection.setContent('
        '); + editor.execCommand('mceInsertContent', false, '
        '); }, mceToggleVisualAid : function() { @@ -10483,18 +13177,41 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { }, mceReplaceContent : function(command, ui, value) { - selection.setContent(value.replace(/\{\$selection\}/g, selection.getContent({format : 'text'}))); + editor.execCommand('mceInsertContent', false, value.replace(/\{\$selection\}/g, selection.getContent({format : 'text'}))); }, mceInsertLink : function(command, ui, value) { - var link = dom.getParent(selection.getNode(), 'a'); + var link = dom.getParent(selection.getNode(), 'a'), img, style, cls; if (tinymce.is(value, 'string')) value = {href : value}; + // Spaces are never valid in URLs and it's a very common mistake for people to make so we fix it here. + value.href = value.href.replace(' ', '%20'); + if (!link) { + // WebKit can't create links on floated images for some odd reason + // So, just remove styles and restore it later + if (tinymce.isWebKit) { + img = dom.getParent(selection.getNode(), 'img'); + + if (img) { + style = img.style.cssText; + cls = img.className; + img.style.cssText = null; + img.className = null; + } + } + execNativeCommand('CreateLink', FALSE, 'javascript:mctmp(0);'); - each(dom.select('a[href=javascript:mctmp(0);]'), function(link) { + + // Restore styles + if (style) + img.style.cssText = style; + if (cls) + img.className = cls; + + each(dom.select("a[href='javascript:mctmp(0);']"), function(link) { dom.setAttribs(link, value); }); } else { @@ -10522,7 +13239,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { return isFormatMatch('align' + command.substring(7)); }, - 'Bold,Italic,Underline,Strikethrough' : function(command) { + 'Bold,Italic,Underline,Strikethrough,Superscript,Subscript' : function(command) { return isFormatMatch(command); }, @@ -10579,23 +13296,30 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { } }; })(tinymce); + (function(tinymce) { var Dispatcher = tinymce.util.Dispatcher; tinymce.UndoManager = function(editor) { - var self, index = 0, data = []; + var self, index = 0, data = [], beforeBookmark; function getContent() { return tinymce.trim(editor.getContent({format : 'raw', no_events : 1})); }; return self = { - typing : 0, + typing : false, onAdd : new Dispatcher(self), + onUndo : new Dispatcher(self), + onRedo : new Dispatcher(self), + beforeChange : function() { + beforeBookmark = editor.selection.getBookmark(2, true); + }, + add : function(level) { var i, settings = editor.settings, lastLevel; @@ -10604,10 +13328,12 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { // Add undo level if needed lastLevel = data[index]; - if (lastLevel && lastLevel.content == level.content) { - if (index > 0 || data.length == 1) - return null; - } + if (lastLevel && lastLevel.content == level.content) + return null; + + // Set before bookmark on previous level + if (data[index]) + data[index].beforeBookmark = beforeBookmark; // Time to compress if (settings.custom_undo_redo_levels) { @@ -10624,13 +13350,8 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { level.bookmark = editor.selection.getBookmark(2, true); // Crop array if needed - if (index < data.length - 1) { - // Treat first level as initial - if (index == 0) - data = []; - else - data.length = index + 1; - } + if (index < data.length - 1) + data.length = index + 1; data.push(level); index = data.length - 1; @@ -10646,14 +13367,14 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { if (self.typing) { self.add(); - self.typing = 0; + self.typing = false; } if (index > 0) { level = data[--index]; editor.setContent(level.content, {format : 'raw'}); - editor.selection.moveToBookmark(level.bookmark); + editor.selection.moveToBookmark(level.beforeBookmark); self.onUndo.dispatch(self, level); } @@ -10678,15 +13399,16 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { clear : function() { data = []; - index = self.typing = 0; + index = 0; + self.typing = false; }, hasUndo : function() { - return index > 0 || self.typing; + return index > 0 || this.typing; }, hasRedo : function() { - return index < data.length - 1; + return index < data.length - 1 && !this.typing; } }; }; @@ -10735,24 +13457,15 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { return rng2.cloneContents().textContent.length == 0; }; - function isEmpty(n) { - n = n.innerHTML; - - n = n.replace(/<(img|hr|table|input|select|textarea)[ \>]/gi, '-'); // Keep these convert them to - chars - n = n.replace(/<[^>]+>/g, ''); // Remove all tags - - return n.replace(/[ \u00a0\t\r\n]+/g, '') == ''; - }; - function splitList(selection, dom, li) { var listBlock, block; - if (isEmpty(li)) { + if (dom.isEmpty(li)) { listBlock = dom.getParent(li, 'ul,ol'); if (!dom.getParent(listBlock.parentNode, 'ul,ol')) { dom.split(listBlock, li); - block = dom.create('p', 0, '
        '); + block = dom.create('p', 0, '
        '); dom.replace(block, li); selection.select(block, 1); } @@ -10773,45 +13486,94 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { s.element = elm.toUpperCase(); ed.onPreInit.add(t.setup, t); - - t.reOpera = new RegExp('(\\u00a0| | )<\/' + elm + '>', 'gi'); - t.rePadd = new RegExp(']+)><\\\/p>|]+)\\\/>|]+)>\\s+<\\\/p>|

        <\\\/p>||

        \\s+<\\\/p>'.replace(/p/g, elm), 'gi'); - t.reNbsp2BR1 = new RegExp(']+)>[\\s\\u00a0]+<\\\/p>|

        [\\s\\u00a0]+<\\\/p>'.replace(/p/g, elm), 'gi'); - t.reNbsp2BR2 = new RegExp('<%p()([^>]+)>( | )<\\\/%p>|<%p>( | )<\\\/%p>'.replace(/%p/g, elm), 'gi'); - t.reBR2Nbsp = new RegExp(']+)>\\s*
        \\s*<\\\/p>|

        \\s*
        \\s*<\\\/p>'.replace(/p/g, elm), 'gi'); - - function padd(ed, o) { - if (isOpera) - o.content = o.content.replace(t.reOpera, ''); - - o.content = o.content.replace(t.rePadd, '<' + elm + '$1$2$3$4$5$6>\u00a0'); - - if (!isIE && !isOpera && o.set) { - // Use   instead of BR in padded paragraphs - o.content = o.content.replace(t.reNbsp2BR1, '<' + elm + '$1$2>
        '); - o.content = o.content.replace(t.reNbsp2BR2, '<' + elm + '$1$2>
        '); - } else - o.content = o.content.replace(t.reBR2Nbsp, '<' + elm + '$1$2>\u00a0'); - }; - - ed.onBeforeSetContent.add(padd); - ed.onPostProcess.add(padd); - - if (s.forced_root_block) { - ed.onInit.add(t.forceRoots, t); - ed.onSetContent.add(t.forceRoots, t); - ed.onBeforeGetContent.add(t.forceRoots, t); - } }, setup : function() { - var t = this, ed = t.editor, s = ed.settings, dom = ed.dom, selection = ed.selection; + var t = this, ed = t.editor, s = ed.settings, dom = ed.dom, selection = ed.selection, blockElements = ed.schema.getBlockElements(); - // Force root blocks when typing and when getting output + // Force root blocks if (s.forced_root_block) { - ed.onBeforeExecCommand.add(t.forceRoots, t); - ed.onKeyUp.add(t.forceRoots, t); - ed.onPreProcess.add(t.forceRoots, t); + function addRootBlocks() { + var node = selection.getStart(), rootNode = ed.getBody(), rng, startContainer, startOffset, endContainer, endOffset, rootBlockNode, tempNode, offset = -0xFFFFFF; + + if (!node || node.nodeType !== 1) + return; + + // Check if node is wrapped in block + while (node != rootNode) { + if (blockElements[node.nodeName]) + return; + + node = node.parentNode; + } + + // Get current selection + rng = selection.getRng(); + if (rng.setStart) { + startContainer = rng.startContainer; + startOffset = rng.startOffset; + endContainer = rng.endContainer; + endOffset = rng.endOffset; + } else { + // Force control range into text range + if (rng.item) { + rng = ed.getDoc().body.createTextRange(); + rng.moveToElementText(rng.item(0)); + } + + tmpRng = rng.duplicate(); + tmpRng.collapse(true); + startOffset = tmpRng.move('character', offset) * -1; + + if (!tmpRng.collapsed) { + tmpRng = rng.duplicate(); + tmpRng.collapse(false); + endOffset = (tmpRng.move('character', offset) * -1) - startOffset; + } + } + + // Wrap non block elements and text nodes + for (node = rootNode.firstChild; node; node) { + if (node.nodeType === 3 || (node.nodeType == 1 && !blockElements[node.nodeName])) { + if (!rootBlockNode) { + rootBlockNode = dom.create(s.forced_root_block); + node.parentNode.insertBefore(rootBlockNode, node); + } + + tempNode = node; + node = node.nextSibling; + rootBlockNode.appendChild(tempNode); + } else { + rootBlockNode = null; + node = node.nextSibling; + } + } + + if (rng.setStart) { + rng.setStart(startContainer, startOffset); + rng.setEnd(endContainer, endOffset); + selection.setRng(rng); + } else { + try { + rng = ed.getDoc().body.createTextRange(); + rng.moveToElementText(rootNode); + rng.collapse(true); + rng.moveStart('character', startOffset); + + if (endOffset > 0) + rng.moveEnd('character', endOffset); + + rng.select(); + } catch (ex) { + // Ignore + } + } + + ed.nodeChanged(); + }; + + ed.onKeyUp.add(addRootBlocks); + ed.onClick.add(addRootBlocks); } if (s.force_br_newlines) { @@ -10861,12 +13623,12 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { var parent = ed.selection.getStart(), fmt = t._previousFormats; // Parent is an empty block - if (!parent.hasChildNodes()) { + if (!parent.hasChildNodes() && fmt) { parent = dom.getParent(parent, dom.isBlock); - if (parent) { + if (parent && parent.nodeName != 'LI') { parent.innerHTML = ''; - + if (t._previousFormats) { parent.appendChild(fmt.wrapper); fmt.inner.innerHTML = '\uFEFF'; @@ -10874,7 +13636,9 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { parent.innerHTML = '\uFEFF'; selection.select(parent, 1); + selection.collapse(true); ed.getDoc().execCommand('Delete', false, null); + t._previousFormats = 0; } } } @@ -10927,21 +13691,6 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { }); } - // Padd empty inline elements within block elements - // For example:

        becomes

         

        - ed.onPreProcess.add(function(ed, o) { - each(dom.select('p,h1,h2,h3,h4,h5,h6,div', o.node), function(p) { - if (isEmpty(p)) { - each(dom.select('span,em,strong,b,i', o.node), function(n) { - if (!n.hasChildNodes()) { - n.appendChild(ed.getDoc().createTextNode('\u00a0')); - return FALSE; // Break the loop one padding is enough - } - }); - } - }); - }); - // IE specific fixes if (isIE) { // Replaces IE:s auto generated paragraphs with the specified element name @@ -10971,155 +13720,6 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { } }, - find : function(n, t, s) { - var ed = this.editor, w = ed.getDoc().createTreeWalker(n, 4, null, FALSE), c = -1; - - while (n = w.nextNode()) { - c++; - - // Index by node - if (t == 0 && n == s) - return c; - - // Node by index - if (t == 1 && c == s) - return n; - } - - return -1; - }, - - forceRoots : function(ed, e) { - var t = this, ed = t.editor, b = ed.getBody(), d = ed.getDoc(), se = ed.selection, s = se.getSel(), r = se.getRng(), si = -2, ei, so, eo, tr, c = -0xFFFFFF; - var nx, bl, bp, sp, le, nl = b.childNodes, i, n, eid; - - // Fix for bug #1863847 - //if (e && e.keyCode == 13) - // return TRUE; - - // Wrap non blocks into blocks - for (i = nl.length - 1; i >= 0; i--) { - nx = nl[i]; - - // Ignore internal elements - if (nx.nodeType === 1 && nx.getAttribute('_mce_type')) { - bl = null; - continue; - } - - // Is text or non block element - if (nx.nodeType === 3 || (!t.dom.isBlock(nx) && nx.nodeType !== 8 && !/^(script|mce:script|style|mce:style)$/i.test(nx.nodeName))) { - if (!bl) { - // Create new block but ignore whitespace - if (nx.nodeType != 3 || /[^\s]/g.test(nx.nodeValue)) { - // Store selection - if (si == -2 && r) { - if (!isIE) { - // If selection is element then mark it - if (r.startContainer.nodeType == 1 && (n = r.startContainer.childNodes[r.startOffset]) && n.nodeType == 1) { - // Save the id of the selected element - eid = n.getAttribute("id"); - n.setAttribute("id", "__mce"); - } else { - // If element is inside body, might not be the case in contentEdiable mode - if (ed.dom.getParent(r.startContainer, function(e) {return e === b;})) { - so = r.startOffset; - eo = r.endOffset; - si = t.find(b, 0, r.startContainer); - ei = t.find(b, 0, r.endContainer); - } - } - } else { - // Force control range into text range - if (r.item) { - tr = d.body.createTextRange(); - tr.moveToElementText(r.item(0)); - r = tr; - } - - tr = d.body.createTextRange(); - tr.moveToElementText(b); - tr.collapse(1); - bp = tr.move('character', c) * -1; - - tr = r.duplicate(); - tr.collapse(1); - sp = tr.move('character', c) * -1; - - tr = r.duplicate(); - tr.collapse(0); - le = (tr.move('character', c) * -1) - sp; - - si = sp - bp; - ei = le; - } - } - - // Uses replaceChild instead of cloneNode since it removes selected attribute from option elements on IE - // See: http://support.microsoft.com/kb/829907 - bl = ed.dom.create(ed.settings.forced_root_block); - nx.parentNode.replaceChild(bl, nx); - bl.appendChild(nx); - } - } else { - if (bl.hasChildNodes()) - bl.insertBefore(nx, bl.firstChild); - else - bl.appendChild(nx); - } - } else - bl = null; // Time to create new block - } - - // Restore selection - if (si != -2) { - if (!isIE) { - bl = b.getElementsByTagName(ed.settings.element)[0]; - r = d.createRange(); - - // Select last location or generated block - if (si != -1) - r.setStart(t.find(b, 1, si), so); - else - r.setStart(bl, 0); - - // Select last location or generated block - if (ei != -1) - r.setEnd(t.find(b, 1, ei), eo); - else - r.setEnd(bl, 0); - - if (s) { - s.removeAllRanges(); - s.addRange(r); - } - } else { - try { - r = s.createRange(); - r.moveToElementText(b); - r.collapse(1); - r.moveStart('character', si); - r.moveEnd('character', ei); - r.select(); - } catch (ex) { - // Ignore - } - } - } else if (!isIE && (n = ed.dom.get('__mce'))) { - // Restore the id of the selected element - if (eid) - n.setAttribute('id', eid); - else - n.removeAttribute('id'); - - // Move caret before selected element - r = d.createRange(); - r.setStartBefore(n); - r.setEndBefore(n); - se.setRng(r); - } - }, - getParentBlock : function(n) { var d = this.dom; @@ -11130,6 +13730,8 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { var t = this, ed = t.editor, dom = ed.dom, d = ed.getDoc(), se = ed.settings, s = ed.selection.getSel(), r = s.getRangeAt(0), b = d.body; var rb, ra, dir, sn, so, en, eo, sb, eb, bn, bef, aft, sc, ec, n, vp = dom.getViewPort(ed.getWin()), y, ch, car; + ed.undoManager.beforeChange(); + // If root blocks are forced then use Operas default behavior since it's really good // Removed due to bug: #1853816 // if (se.forced_root_block && isOpera) @@ -11305,10 +13907,6 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { if (aft.firstChild && aft.firstChild.nodeName == bn) aft.innerHTML = aft.firstChild.innerHTML; - // Padd empty blocks - if (isEmpty(bef)) - bef.innerHTML = '
        '; - function appendStyles(e, en) { var nl = [], nn, n, i; @@ -11333,14 +13931,18 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { nn = nn.appendChild(nl[i]); // Padd most inner style element - nl[0].innerHTML = isOpera ? ' ' : '
        '; // Extra space for Opera so that the caret can move there + nl[0].innerHTML = isOpera ? '\u00a0' : '
        '; // Extra space for Opera so that the caret can move there return nl[0]; // Move caret to most inner element } else - e.innerHTML = isOpera ? ' ' : '
        '; // Extra space for Opera so that the caret can move there + e.innerHTML = isOpera ? '\u00a0' : '
        '; // Extra space for Opera so that the caret can move there }; + + // Padd empty blocks + if (dom.isEmpty(bef)) + appendStyles(bef, sn); // Fill empty afterblook with current style - if (isEmpty(aft)) + if (dom.isEmpty(aft)) car = appendStyles(aft, en); // Opera needs this one backwards for older versions @@ -11356,27 +13958,26 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { aft.normalize(); bef.normalize(); - function first(n) { - return d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, FALSE).nextNode() || n; - }; - // Move cursor and scroll into view - r = d.createRange(); - r.selectNodeContents(isGecko ? first(car || aft) : car || aft); - r.collapse(1); - s.removeAllRanges(); - s.addRange(r); + ed.selection.select(aft, true); + ed.selection.collapse(true); // scrollIntoView seems to scroll the parent window in most browsers now including FF 3.0b4 so it's time to stop using it and do it our selfs y = ed.dom.getPos(aft).y; - ch = aft.clientHeight; + //ch = aft.clientHeight; // Is element within viewport - if (y < vp.y || y + ch > vp.y + vp.h) { + if (y < vp.y || y + 25 > vp.y + vp.h) { ed.getWin().scrollTo(0, y < vp.y ? y : y - vp.h + 25); // Needs to be hardcoded to roughly one line of text if a huge text block is broken into two blocks - //console.debug('SCROLL!', 'vp.y: ' + vp.y, 'y' + y, 'vp.h' + vp.h, 'clientHeight' + aft.clientHeight, 'yyy: ' + (y < vp.y ? y : y - vp.h + aft.clientHeight)); + + /*console.debug( + 'Element: y=' + y + ', h=' + ch + ', ' + + 'Viewport: y=' + vp.y + ", h=" + vp.h + ', bottom=' + (vp.y + vp.h) + );*/ } + ed.undoManager.add(); + return FALSE; }, @@ -11591,7 +14192,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { c = new tinymce.ui.NativeListBox(id, s); else { cls = cc || t._cls.listbox || tinymce.ui.ListBox; - c = new cls(id, s); + c = new cls(id, s, ed); } t.controls[id] = c; @@ -11646,11 +14247,11 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { if (s.menu_button) { cls = cc || t._cls.menubutton || tinymce.ui.MenuButton; - c = new cls(id, s); + c = new cls(id, s, ed); ed.onMouseDown.add(c.hideMenu, c); } else { cls = t._cls.button || tinymce.ui.Button; - c = new cls(id, s); + c = new cls(id, s, ed); } return t.add(c); @@ -11693,7 +14294,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { id = t.prefix + id; cls = cc || t._cls.splitbutton || tinymce.ui.SplitButton; - c = t.add(new cls(id, s)); + c = t.add(new cls(id, s, ed)); ed.onMouseDown.add(c.hideMenu, c); return c; @@ -11733,7 +14334,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { id = t.prefix + id; cls = cc || t._cls.colorsplitbutton || tinymce.ui.ColorSplitButton; - c = new cls(id, s); + c = new cls(id, s, ed); ed.onMouseDown.add(c.hideMenu, c); // Remove the menu element when the editor is removed @@ -11765,13 +14366,25 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { id = t.prefix + id; cls = cc || t._cls.toolbar || tinymce.ui.Toolbar; - c = new cls(id, s); + c = new cls(id, s, t.editor); if (t.get(id)) return null; return t.add(c); }, + + createToolbarGroup : function(id, s, cc) { + var c, t = this, cls; + id = t.prefix + id; + cls = cc || this._cls.toolbarGroup || tinymce.ui.ToolbarGroup; + c = new cls(id, s, t.editor); + + if (t.get(id)) + return null; + + return t.add(c); + }, createSeparator : function(cc) { var cls = cc || this._cls.separator || tinymce.ui.Separator; @@ -11908,53 +14521,6 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { } }); }(tinymce)); -(function(tinymce) { - function CommandManager() { - var execCommands = {}, queryStateCommands = {}, queryValueCommands = {}; - - function add(collection, cmd, func, scope) { - if (typeof(cmd) == 'string') - cmd = [cmd]; - - tinymce.each(cmd, function(cmd) { - collection[cmd.toLowerCase()] = {func : func, scope : scope}; - }); - }; - - tinymce.extend(this, { - add : function(cmd, func, scope) { - add(execCommands, cmd, func, scope); - }, - - addQueryStateHandler : function(cmd, func, scope) { - add(queryStateCommands, cmd, func, scope); - }, - - addQueryValueHandler : function(cmd, func, scope) { - add(queryValueCommands, cmd, func, scope); - }, - - execCommand : function(scope, cmd, ui, value, args) { - if (cmd = execCommands[cmd.toLowerCase()]) { - if (cmd.func.call(scope || cmd.scope, ui, value, args) !== false) - return true; - } - }, - - queryCommandValue : function() { - if (cmd = queryValueCommands[cmd.toLowerCase()]) - return cmd.func.call(scope || cmd.scope, ui, value, args); - }, - - queryCommandState : function() { - if (cmd = queryStateCommands[cmd.toLowerCase()]) - return cmd.func.call(scope || cmd.scope, ui, value, args); - } - }); - }; - - tinymce.GlobalCommands = new CommandManager(); -})(tinymce); (function(tinymce) { tinymce.Formatter = function(ed) { var formats = {}, @@ -11963,7 +14529,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { selection = ed.selection, TreeWalker = tinymce.dom.TreeWalker, rangeUtils = new tinymce.dom.RangeUtils(dom), - isValid = ed.schema.isValid, + isValid = ed.schema.isValidChild, isBlock = dom.isBlock, forcedRootBlock = ed.settings.forced_root_block, nodeIndex = dom.nodeIndex, @@ -12032,8 +14598,31 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { } }; + var getTextDecoration = function(node) { + var decoration; + + ed.dom.getParent(node, function(n) { + decoration = ed.dom.getStyle(n, 'text-decoration'); + return decoration && decoration !== 'none'; + }); + + return decoration; + }; + + var processUnderlineAndColor = function(node) { + var textDecoration; + if (node.nodeType === 1 && node.parentNode && node.parentNode.nodeType === 1) { + textDecoration = getTextDecoration(node.parentNode); + if (ed.dom.getStyle(node, 'color') && textDecoration) { + ed.dom.setStyle(node, 'text-decoration', textDecoration); + } else if (ed.dom.getStyle(node, 'textdecoration') === textDecoration) { + ed.dom.setStyle(node, 'text-decoration', null); + } + } + }; + function apply(name, vars, node) { - var formatList = get(name), format = formatList[0], bookmark, rng, i; + var formatList = get(name), format = formatList[0], bookmark, rng, i, isCollapsed = selection.isCollapsed(); function moveStart(rng) { var container = rng.startContainer, @@ -12124,6 +14713,11 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { if (format.selector) { // Look for matching formats each(formatList, function(format) { + // Check collapsed state if it exists + if ('collapsed' in format && format.collapsed !== isCollapsed) { + return; + } + if (dom.is(node, format.selector) && !isCaretNode(node)) { setElementFormat(node, format); found = true; @@ -12138,7 +14732,8 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { } // Is it valid to wrap this item - if (isValid(wrapName, nodeName) && isValid(parentName, wrapName)) { + if (isValid(wrapName, nodeName) && isValid(parentName, wrapName) && + !(node.nodeType === 3 && node.nodeValue.length === 1 && node.nodeValue.charCodeAt(0) === 65279)) { // Start wrapping if (!currentWrapElm) { // Wrap the node @@ -12148,6 +14743,19 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { } currentWrapElm.appendChild(node); + } else if (nodeName == 'li') { + // Start wrapping + if (!currentWrapElm) { + // Wrap the node + liTextNode = node.ownerDocument.createTextNode(''); + each(tinymce.grep(node.childNodes), function(n) { if (n.nodeType == 3) { liTextNode.nodeValue += n.nodeValue; n.parentNode.removeChild(n); } }); + currentWrapElm = wrapElm.cloneNode(FALSE); + node.insertBefore(currentWrapElm, node.firstChild); + newWrappers.push(currentWrapElm); + } + + currentWrapElm.appendChild(liTextNode); + } else { // Start a new wrapper for possible children currentWrapElm = 0; @@ -12163,6 +14771,30 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { each(nodes, process); }); + // Wrap links inside as well, for example color inside a link when the wrapper is around the link + if (format.wrap_links === false) { + each(newWrappers, function(node) { + function process(node) { + var i, currentWrapElm, children; + + if (node.nodeName === 'A') { + currentWrapElm = wrapElm.cloneNode(FALSE); + newWrappers.push(currentWrapElm); + + children = tinymce.grep(node.childNodes); + for (i = 0; i < children.length; i++) + currentWrapElm.appendChild(children[i]); + + node.appendChild(currentWrapElm); + } + + each(tinymce.grep(node.childNodes), process); + }; + + process(node); + }); + } + // Cleanup each(newWrappers, function(node) { var childCount; @@ -12202,8 +14834,9 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { childCount = getChildCount(node); - // Remove empty nodes - if (childCount === 0) { + // Remove empty nodes but only if there is multiple wrappers and they are not block + // elements so never remove single

        since that would remove the currrent empty block element where the caret is at + if ((newWrappers.length > 1 || !isBlock(node)) && childCount === 0) { dom.remove(node, 1); return; } @@ -12219,6 +14852,19 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { // this: text // will become: text each(dom.select(format.inline, node), function(child) { + var parent; + + // When wrap_links is set to false we don't want + // to remove the format on children within links + if (format.wrap_links === false) { + parent = child.parentNode; + + do { + if (parent.nodeName === 'A') + return; + } while (parent = parent.parentNode); + } + removeFormat(format, vars, child, format.exact ? child : null); }); }); @@ -12259,11 +14905,20 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { applyRngStyle(expandRng(rng, formatList)); } else { - if (!selection.isCollapsed() || !format.inline) { + if (!isCollapsed || !format.inline || dom.select('td.mceSelected,th.mceSelected').length) { + // Obtain selection node before selection is unselected by applyRngStyle() + var curSelNode = ed.selection.getNode(); + // Apply formatting to selection bookmark = selection.getBookmark(); applyRngStyle(expandRng(selection.getRng(TRUE), formatList)); + // Colored nodes should be underlined so that the color of the underline matches the text color. + if (format.styles && (format.styles.color || format.styles.textDecoration)) { + tinymce.walk(curSelNode, processUnderlineAndColor, 'childNodes'); + processUnderlineAndColor(curSelNode); + } + selection.moveToBookmark(bookmark); selection.setRng(moveStart(selection.getRng(TRUE))); ed.nodeChanged(); @@ -12427,8 +15082,8 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { if (startContainer != endContainer) { // Wrap start/end nodes in span element since these might be cloned/moved - startContainer = wrap(startContainer, 'span', {id : '_start', _mce_type : 'bookmark'}); - endContainer = wrap(endContainer, 'span', {id : '_end', _mce_type : 'bookmark'}); + startContainer = wrap(startContainer, 'span', {id : '_start', 'data-mce-type' : 'bookmark'}); + endContainer = wrap(endContainer, 'span', {id : '_end', 'data-mce-type' : 'bookmark'}); // Split start/end splitToFormatRoot(startContainer); @@ -12451,6 +15106,11 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { rangeUtils.walk(rng, function(nodes) { each(nodes, function(node) { process(node); + + // Remove parent span if it only contains text-decoration: underline, yet a parent node is also underlined. + if (node.nodeType === 1 && ed.dom.getStyle(node, 'text-decoration') === 'underline' && node.parentNode && getTextDecoration(node.parentNode) === 'underline') { + removeFormat({'deep': false, 'exact': true, 'inline': 'span', 'styles': {'textDecoration' : 'underline'}}, null, node); + } }); }); }; @@ -12464,7 +15124,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { return; } - if (!selection.isCollapsed() || !format.inline) { + if (!selection.isCollapsed() || !format.inline || dom.select('td.mceSelected,th.mceSelected').length) { bookmark = selection.getBookmark(); removeRngStyle(selection.getRng(TRUE)); selection.moveToBookmark(bookmark); @@ -12480,7 +15140,9 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { }; function toggle(name, vars, node) { - if (match(name, vars, node)) + var fmt = get(name); + + if (match(name, vars, node) && (!('toggle' in fmt[0]) || fmt[0]['toggle'])) remove(name, vars, node); else apply(name, vars, node); @@ -12744,7 +15406,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { var startContainer = rng.startContainer, startOffset = rng.startOffset, endContainer = rng.endContainer, - endOffset = rng.endOffset, sibling, lastIdx; + endOffset = rng.endOffset, sibling, lastIdx, leaf; // This function walks up the tree if there is no siblings before/after the node function findParentContainer(container, child_name, sibling_name, root) { @@ -12774,6 +15436,19 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { return container; }; + // This function walks down the tree to find the leaf at the selection. + // The offset is also returned as if node initially a leaf, the offset may be in the middle of the text node. + function findLeaf(node, offset) { + if (offset === undefined) + offset = node.nodeType === 3 ? node.length : node.childNodes.length; + while (node && node.hasChildNodes()) { + node = node.childNodes[offset]; + if (node) + offset = node.nodeType === 3 ? node.length : node.childNodes.length; + } + return { node: node, offset: offset }; + } + // If index based start position then resolve it if (startContainer.nodeType == 1 && startContainer.hasChildNodes()) { lastIdx = startContainer.childNodes.length - 1; @@ -12799,12 +15474,36 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { if (isBookmarkNode(startContainer)) startContainer = startContainer.nextSibling || startContainer; - if (isBookmarkNode(endContainer.parentNode)) + if (isBookmarkNode(endContainer.parentNode)) { + endOffset = dom.nodeIndex(endContainer); endContainer = endContainer.parentNode; + } - if (isBookmarkNode(endContainer)) - endContainer = endContainer.previousSibling || endContainer; + if (isBookmarkNode(endContainer) && endContainer.previousSibling) { + endContainer = endContainer.previousSibling; + endOffset = endContainer.length; + } + if (format[0].inline) { + // Avoid applying formatting to a trailing space. + leaf = findLeaf(endContainer, endOffset); + if (leaf.node) { + while (leaf.node && leaf.offset === 0 && leaf.node.previousSibling) + leaf = findLeaf(leaf.node.previousSibling); + + if (leaf.node && leaf.offset > 0 && leaf.node.nodeType === 3 && + leaf.node.nodeValue.charAt(leaf.offset - 1) === ' ') { + + if (leaf.offset > 1) { + endContainer = leaf.node; + endContainer.splitText(leaf.offset - 1); + } else if (leaf.node.previousSibling) { + endContainer = leaf.node.previousSibling; + } + } + } + } + // Move start/end point up the tree if the leaves are sharp and if we are in different containers // Example * becomes !: !

        *texttext*

        ! // This will reduce the number of wrapper elements that needs to be created @@ -12817,7 +15516,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { // Expand start/end container to matching selector if (format[0].selector && format[0].expand !== FALSE && !format[0].inline) { function findSelectorEndPoint(container, sibling_name) { - var parents, i, y; + var parents, i, y, curFormat; if (container.nodeType == 3 && container.nodeValue.length == 0 && container[sibling_name]) container = container[sibling_name]; @@ -12825,7 +15524,13 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { parents = getParents(container); for (i = 0; i < parents.length; i++) { for (y = 0; y < format.length; y++) { - if (dom.is(parents[i], format[y].selector)) + curFormat = format[y]; + + // If collapsed state is set then skip formats that doesn't match that + if ("collapsed" in curFormat && curFormat.collapsed !== rng.collapsed) + continue; + + if (dom.is(parents[i], curFormat.selector)) return parents[i]; } } @@ -12935,7 +15640,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { // Remove style attribute if it's empty if (stylesModified && dom.getAttrib(node, 'style') == '') { node.removeAttribute('style'); - node.removeAttribute('_mce_style'); + node.removeAttribute('data-mce-style'); } // Remove attributes @@ -12976,7 +15681,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { // Remove mce prefixed attributes if (MCE_ATTR_RE.test(name)) - node.removeAttribute('_mce_' + name); + node.removeAttribute('data-mce-' + name); node.removeAttribute(name); } @@ -13061,7 +15766,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { }; function isBookmarkNode(node) { - return node && node.nodeType == 1 && node.getAttribute('_mce_type') == 'bookmark'; + return node && node.nodeType == 1 && node.getAttribute('data-mce-type') == 'bookmark'; }; function mergeSiblings(prev, next) { @@ -13132,7 +15837,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { if (prev && next) { function findElementSibling(node, sibling_name) { for (sibling = node; sibling; sibling = sibling[sibling_name]) { - if (sibling.nodeType == 3 && !isWhiteSpaceNode(sibling)) + if (sibling.nodeType == 3 && sibling.nodeValue.length !== 0) return node; if (sibling.nodeType == 1 && !isBookmarkNode(sibling)) @@ -13209,6 +15914,10 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { // Apply pending formats each(pendingFormats.apply.reverse(), function(item) { apply(item.name, item.vars, caret_node); + + // Colored nodes should be underlined so that the color of the underline matches the text color. + if (item.name === 'forecolor' && item.vars.value) + processUnderlineAndColor(caret_node.parentNode); }); // Remove pending formats @@ -13266,6 +15975,10 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { if (isCaretNode(node)) { textNode = node.firstChild; + // Find the first text node within node + while (textNode && textNode.nodeType != 3) + textNode = textNode.firstChild; + if (textNode) { perform(node); @@ -13298,9 +16011,12 @@ tinymce.onAddEditor.add(function(tinymce, ed) { fontSizes = tinymce.explode(settings.font_size_style_values); function replaceWithSpan(node, styles) { - dom.replace(dom.create('span', { - style : styles - }), node, 1); + tinymce.each(styles, function(value, name) { + if (value) + dom.setStyle(node, name, value); + }); + + dom.rename(node, 'span'); }; filters = { @@ -13337,6 +16053,7 @@ tinymce.onAddEditor.add(function(tinymce, ed) { }; ed.onPreProcess.add(convert); + ed.onSetContent.add(convert); ed.onInit.add(function() { ed.selection.onSetContent.add(convert); diff --git a/plugins/TinyMCE/js/utils/form_utils.js b/plugins/TinyMCE/js/utils/form_utils.js index 2617a26edb..59da01399e 100644 --- a/plugins/TinyMCE/js/utils/form_utils.js +++ b/plugins/TinyMCE/js/utils/form_utils.js @@ -11,10 +11,14 @@ var themeBaseURL = tinyMCEPopup.editor.baseURI.toAbsolute('themes/' + tinyMCEPopup.getParam("theme")); function getColorPickerHTML(id, target_form_element) { - var h = ""; + var h = "", dom = tinyMCEPopup.dom; - h += ''; - h += ' '; + if (label = dom.select('label[for=' + target_form_element + ']')[0]) { + label.id = label.id || dom.uniqueId(); + } + + h += ''; + h += ' '; return h; } @@ -67,6 +71,9 @@ function selectByValue(form_obj, field_name, value, add_custom, ignore_case) { if (!form_obj || !form_obj.elements[field_name]) return; + if (!value) + value = ""; + var sel = form_obj.elements[field_name]; var found = false; @@ -171,7 +178,7 @@ function convertHexToRGB(col) { } function trimSize(size) { - return size.replace(/([0-9\.]+)px|(%|in|cm|mm|em|ex|pt|pc)/, '$1$2'); + return size.replace(/([0-9\.]+)(px|%|in|cm|mm|em|ex|pt|pc)/i, '$1$2'); } function getCSSSize(size) { @@ -183,6 +190,9 @@ function getCSSSize(size) { // Add px if (/^[0-9]+$/.test(size)) size += 'px'; + // Sanity check, IE doesn't like broken values + else if (!(/^[0-9\.]+(px|%|in|cm|mm|em|ex|pt|pc)$/i.test(size))) + return ""; return size; } diff --git a/plugins/TinyMCE/js/utils/mctabs.js b/plugins/TinyMCE/js/utils/mctabs.js index 825d4c1433..458ec86da6 100644 --- a/plugins/TinyMCE/js/utils/mctabs.js +++ b/plugins/TinyMCE/js/utils/mctabs.js @@ -10,6 +10,7 @@ function MCTabs() { this.settings = []; + this.onChange = tinyMCEPopup.editor.windowManager.createInstance('tinymce.util.Dispatcher'); }; MCTabs.prototype.init = function(settings) { @@ -28,26 +29,62 @@ MCTabs.prototype.getParam = function(name, default_value) { return value; }; -MCTabs.prototype.displayTab = function(tab_id, panel_id) { - var panelElm, panelContainerElm, tabElm, tabContainerElm, selectionClass, nodes, i; +MCTabs.prototype.showTab =function(tab){ + tab.className = 'current'; + tab.setAttribute("aria-selected", true); + tab.setAttribute("aria-expanded", true); + tab.tabIndex = 0; +}; + +MCTabs.prototype.hideTab =function(tab){ + var t=this; + + tab.className = ''; + tab.setAttribute("aria-selected", false); + tab.setAttribute("aria-expanded", false); + tab.tabIndex = -1; +}; + +MCTabs.prototype.showPanel = function(panel) { + panel.className = 'current'; + panel.setAttribute("aria-hidden", false); +}; + +MCTabs.prototype.hidePanel = function(panel) { + panel.className = 'panel'; + panel.setAttribute("aria-hidden", true); +}; + +MCTabs.prototype.getPanelForTab = function(tabElm) { + return tinyMCEPopup.dom.getAttrib(tabElm, "aria-controls"); +}; + +MCTabs.prototype.displayTab = function(tab_id, panel_id, avoid_focus) { + var panelElm, panelContainerElm, tabElm, tabContainerElm, selectionClass, nodes, i, t = this; + + tabElm = document.getElementById(tab_id); + + if (panel_id === undefined) { + panel_id = t.getPanelForTab(tabElm); + } panelElm= document.getElementById(panel_id); panelContainerElm = panelElm ? panelElm.parentNode : null; - tabElm = document.getElementById(tab_id); tabContainerElm = tabElm ? tabElm.parentNode : null; - selectionClass = this.getParam('selection_class', 'current'); + selectionClass = t.getParam('selection_class', 'current'); if (tabElm && tabContainerElm) { nodes = tabContainerElm.childNodes; // Hide all other tabs for (i = 0; i < nodes.length; i++) { - if (nodes[i].nodeName == "LI") - nodes[i].className = ''; + if (nodes[i].nodeName == "LI") { + t.hideTab(nodes[i]); + } } // Show selected tab - tabElm.className = 'current'; + t.showTab(tabElm); } if (panelElm && panelContainerElm) { @@ -56,11 +93,15 @@ MCTabs.prototype.displayTab = function(tab_id, panel_id) { // Hide all other panels for (i = 0; i < nodes.length; i++) { if (nodes[i].nodeName == "DIV") - nodes[i].className = 'panel'; + t.hidePanel(nodes[i]); + } + + if (!avoid_focus) { + tabElm.focus(); } // Show selected panel - panelElm.className = 'current'; + t.showPanel(panelElm); } }; @@ -73,5 +114,49 @@ MCTabs.prototype.getAnchor = function() { return ""; }; -// Global instance + +//Global instance var mcTabs = new MCTabs(); + +tinyMCEPopup.onInit.add(function() { + var tinymce = tinyMCEPopup.getWin().tinymce, dom = tinyMCEPopup.dom, each = tinymce.each; + + each(dom.select('div.tabs'), function(tabContainerElm) { + var keyNav; + + dom.setAttrib(tabContainerElm, "role", "tablist"); + + var items = tinyMCEPopup.dom.select('li', tabContainerElm); + var action = function(id) { + mcTabs.displayTab(id, mcTabs.getPanelForTab(id)); + mcTabs.onChange.dispatch(id); + }; + + each(items, function(item) { + dom.setAttrib(item, 'role', 'tab'); + dom.bind(item, 'click', function(evt) { + action(item.id); + }); + }); + + dom.bind(dom.getRoot(), 'keydown', function(evt) { + if (evt.keyCode === 9 && evt.ctrlKey && !evt.altKey) { // Tab + keyNav.moveFocus(evt.shiftKey ? -1 : 1); + tinymce.dom.Event.cancel(evt); + } + }); + + each(dom.select('a', tabContainerElm), function(a) { + dom.setAttrib(a, 'tabindex', '-1'); + }); + + keyNav = tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', { + root: tabContainerElm, + items: items, + onAction: action, + actOnFocus: true, + enableLeftRight: true, + enableUpDown: true + }, tinyMCEPopup.dom); + }); +}); \ No newline at end of file diff --git a/plugins/TinyMCE/js/utils/validate.js b/plugins/TinyMCE/js/utils/validate.js index a6fcf97015..27cbfab811 100644 --- a/plugins/TinyMCE/js/utils/validate.js +++ b/plugins/TinyMCE/js/utils/validate.js @@ -32,7 +32,7 @@ var Validator = { }, isSize : function(s) { - return this.test(s, '^[0-9]+(%|in|cm|mm|em|ex|pt|pc|px)?$'); + return this.test(s, '^[0-9.]+(%|in|cm|mm|em|ex|pt|pc|px)?$'); }, isId : function(s) { @@ -96,8 +96,10 @@ var AutoValidator = { var i, nl, s = this.settings, c = 0; nl = this.tags(f, 'label'); - for (i=0; i\n" "Language-Team: LANGUAGE \n" @@ -16,6 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" +#. TRANS: Plugin description. #: TinyMCEPlugin.php:87 msgid "Use TinyMCE library to allow rich text editing in the browser." msgstr "" diff --git a/plugins/TinyMCE/locale/ca/LC_MESSAGES/TinyMCE.po b/plugins/TinyMCE/locale/ca/LC_MESSAGES/TinyMCE.po index 32743af438..0269928395 100644 --- a/plugins/TinyMCE/locale/ca/LC_MESSAGES/TinyMCE.po +++ b/plugins/TinyMCE/locale/ca/LC_MESSAGES/TinyMCE.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TinyMCE to Catalan (Català) +# Translation of StatusNet - TinyMCE to Catalan (català) # Exported from translatewiki.net # # Author: Toniher @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TinyMCE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:37+0000\n" -"Language-Team: Catalan \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:18+0000\n" +"Language-Team: Catalan \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:28+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ca\n" "X-Message-Group: #out-statusnet-plugin-tinymce\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "Use TinyMCE library to allow rich text editing in the browser." msgstr "" "Fes servir la biblioteca TinyMCE per permetre l'edició de text ric en el " diff --git a/plugins/TinyMCE/locale/de/LC_MESSAGES/TinyMCE.po b/plugins/TinyMCE/locale/de/LC_MESSAGES/TinyMCE.po index c9e600d98d..a41e949f8c 100644 --- a/plugins/TinyMCE/locale/de/LC_MESSAGES/TinyMCE.po +++ b/plugins/TinyMCE/locale/de/LC_MESSAGES/TinyMCE.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TinyMCE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:37+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:18+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:28+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-tinymce\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "Use TinyMCE library to allow rich text editing in the browser." msgstr "" "Benutze die TinyMCE-Bibliothek um Rich-Text-Bearbeitung im Browser zu " diff --git a/plugins/TinyMCE/locale/eo/LC_MESSAGES/TinyMCE.po b/plugins/TinyMCE/locale/eo/LC_MESSAGES/TinyMCE.po index 04fe85318f..87ae53b98a 100644 --- a/plugins/TinyMCE/locale/eo/LC_MESSAGES/TinyMCE.po +++ b/plugins/TinyMCE/locale/eo/LC_MESSAGES/TinyMCE.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TinyMCE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:37+0000\n" -"Language-Team: Esperanto \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:18+0000\n" +"Language-Team: Esperanto \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:28+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: eo\n" "X-Message-Group: #out-statusnet-plugin-tinymce\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "Use TinyMCE library to allow rich text editing in the browser." msgstr "" "Uzas la bibliotekon TinyMCE por ebligi redakton de riĉigita teksto en la " diff --git a/plugins/TinyMCE/locale/es/LC_MESSAGES/TinyMCE.po b/plugins/TinyMCE/locale/es/LC_MESSAGES/TinyMCE.po index 5984981573..b03b0ddf1e 100644 --- a/plugins/TinyMCE/locale/es/LC_MESSAGES/TinyMCE.po +++ b/plugins/TinyMCE/locale/es/LC_MESSAGES/TinyMCE.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TinyMCE to Spanish (Español) +# Translation of StatusNet - TinyMCE to Spanish (español) # Exported from translatewiki.net # # Author: Translationista @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TinyMCE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:37+0000\n" -"Language-Team: Spanish \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:18+0000\n" +"Language-Team: Spanish \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:28+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: es\n" "X-Message-Group: #out-statusnet-plugin-tinymce\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "Use TinyMCE library to allow rich text editing in the browser." msgstr "" "Utiliza la biblioteca TinyMCE para permitir la edición de texto enriquecido " diff --git a/plugins/TinyMCE/locale/fr/LC_MESSAGES/TinyMCE.po b/plugins/TinyMCE/locale/fr/LC_MESSAGES/TinyMCE.po index 418835568c..ab25a97d8e 100644 --- a/plugins/TinyMCE/locale/fr/LC_MESSAGES/TinyMCE.po +++ b/plugins/TinyMCE/locale/fr/LC_MESSAGES/TinyMCE.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TinyMCE to French (Français) +# Translation of StatusNet - TinyMCE to French (français) # Exported from translatewiki.net # # Author: Verdy p @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TinyMCE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:37+0000\n" -"Language-Team: French \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:18+0000\n" +"Language-Team: French \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:28+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-tinymce\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Plugin description. msgid "Use TinyMCE library to allow rich text editing in the browser." msgstr "" "Utiliser la bibliothèque TinyMCE pour permettre la modification de texte " diff --git a/plugins/TinyMCE/locale/gl/LC_MESSAGES/TinyMCE.po b/plugins/TinyMCE/locale/gl/LC_MESSAGES/TinyMCE.po new file mode 100644 index 0000000000..227f52874f --- /dev/null +++ b/plugins/TinyMCE/locale/gl/LC_MESSAGES/TinyMCE.po @@ -0,0 +1,28 @@ +# Translation of StatusNet - TinyMCE to Galician (galego) +# Exported from translatewiki.net +# +# Author: Toliño +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - TinyMCE\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:19+0000\n" +"Language-Team: Galician \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:52:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: gl\n" +"X-Message-Group: #out-statusnet-plugin-tinymce\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin description. +msgid "Use TinyMCE library to allow rich text editing in the browser." +msgstr "" +"Usar a biblioteca TinyMCE para permitir a edición de texto enriquecido no " +"navegador." diff --git a/plugins/TinyMCE/locale/he/LC_MESSAGES/TinyMCE.po b/plugins/TinyMCE/locale/he/LC_MESSAGES/TinyMCE.po index b72d6165e0..0ac20eac9f 100644 --- a/plugins/TinyMCE/locale/he/LC_MESSAGES/TinyMCE.po +++ b/plugins/TinyMCE/locale/he/LC_MESSAGES/TinyMCE.po @@ -9,17 +9,18 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TinyMCE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:37+0000\n" -"Language-Team: Hebrew \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:19+0000\n" +"Language-Team: Hebrew \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:28+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: he\n" "X-Message-Group: #out-statusnet-plugin-tinymce\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "Use TinyMCE library to allow rich text editing in the browser." msgstr "שימוש בספרייה TinyMCE כדי ל×פשר עריכת טקסט עשיר ב×מצעות הדפדפן." diff --git a/plugins/TinyMCE/locale/ia/LC_MESSAGES/TinyMCE.po b/plugins/TinyMCE/locale/ia/LC_MESSAGES/TinyMCE.po index 277a5f39f9..70e76204b4 100644 --- a/plugins/TinyMCE/locale/ia/LC_MESSAGES/TinyMCE.po +++ b/plugins/TinyMCE/locale/ia/LC_MESSAGES/TinyMCE.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TinyMCE to Interlingua (Interlingua) +# Translation of StatusNet - TinyMCE to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TinyMCE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:38+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:19+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:28+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-tinymce\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "Use TinyMCE library to allow rich text editing in the browser." msgstr "" "Usar le bibliotheca TinyMCE pro permitter le modification de texto " diff --git a/plugins/TinyMCE/locale/id/LC_MESSAGES/TinyMCE.po b/plugins/TinyMCE/locale/id/LC_MESSAGES/TinyMCE.po index 3bd9ff9901..fef89c39a5 100644 --- a/plugins/TinyMCE/locale/id/LC_MESSAGES/TinyMCE.po +++ b/plugins/TinyMCE/locale/id/LC_MESSAGES/TinyMCE.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TinyMCE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:38+0000\n" -"Language-Team: Indonesian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:19+0000\n" +"Language-Team: Indonesian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:28+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: id\n" "X-Message-Group: #out-statusnet-plugin-tinymce\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Plugin description. msgid "Use TinyMCE library to allow rich text editing in the browser." msgstr "" "Gunakan pustaka TinyMCE untuk memungkinkan penyuntingan teks kaya pada " diff --git a/plugins/TinyMCE/locale/ja/LC_MESSAGES/TinyMCE.po b/plugins/TinyMCE/locale/ja/LC_MESSAGES/TinyMCE.po new file mode 100644 index 0000000000..dfd08796b4 --- /dev/null +++ b/plugins/TinyMCE/locale/ja/LC_MESSAGES/TinyMCE.po @@ -0,0 +1,24 @@ +# Translation of StatusNet - TinyMCE to Japanese (日本語) +# Exported from translatewiki.net +# +# Author: Shirayuki +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - TinyMCE\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:19+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:52:08+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. TRANS: Plugin description. +msgid "Use TinyMCE library to allow rich text editing in the browser." +msgstr "" +"TinyMCE ライブラリーを使用ã™ã‚‹ã¨ãƒ–ラウザ内ã§ãƒªãƒƒãƒãªãƒ†ã‚­ã‚¹ãƒˆç·¨é›†ãŒã§ãã¾ã™ã€‚" diff --git a/plugins/TinyMCE/locale/mk/LC_MESSAGES/TinyMCE.po b/plugins/TinyMCE/locale/mk/LC_MESSAGES/TinyMCE.po index 6d13005fad..abf72426c5 100644 --- a/plugins/TinyMCE/locale/mk/LC_MESSAGES/TinyMCE.po +++ b/plugins/TinyMCE/locale/mk/LC_MESSAGES/TinyMCE.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TinyMCE to Macedonian (МакедонÑки) +# Translation of StatusNet - TinyMCE to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TinyMCE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:38+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:19+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:28+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-tinymce\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" +#. TRANS: Plugin description. msgid "Use TinyMCE library to allow rich text editing in the browser." msgstr "" "КориÑти ја библиотеката TinyMCE за уредување Ñо збогатен текÑÑ‚ во " diff --git a/plugins/TinyMCE/locale/ms/LC_MESSAGES/TinyMCE.po b/plugins/TinyMCE/locale/ms/LC_MESSAGES/TinyMCE.po index 3581c51776..39393f0c27 100644 --- a/plugins/TinyMCE/locale/ms/LC_MESSAGES/TinyMCE.po +++ b/plugins/TinyMCE/locale/ms/LC_MESSAGES/TinyMCE.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TinyMCE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:38+0000\n" -"Language-Team: Malay \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:19+0000\n" +"Language-Team: Malay \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:28+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ms\n" "X-Message-Group: #out-statusnet-plugin-tinymce\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Plugin description. msgid "Use TinyMCE library to allow rich text editing in the browser." msgstr "" "Gunakan perpustakaan TinyMCE untuk membolehkan penyuntingan teks beraneka " diff --git a/plugins/TinyMCE/locale/nb/LC_MESSAGES/TinyMCE.po b/plugins/TinyMCE/locale/nb/LC_MESSAGES/TinyMCE.po index d474cc3088..db49725fd7 100644 --- a/plugins/TinyMCE/locale/nb/LC_MESSAGES/TinyMCE.po +++ b/plugins/TinyMCE/locale/nb/LC_MESSAGES/TinyMCE.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TinyMCE to Norwegian (bokmÃ¥l)‬ (‪Norsk (bokmÃ¥l)‬) +# Translation of StatusNet - TinyMCE to Norwegian BokmÃ¥l (‪norsk (bokmÃ¥l)‬) # Exported from translatewiki.net # # Author: Nghtwlkr @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TinyMCE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:38+0000\n" -"Language-Team: Norwegian (bokmÃ¥l)‬ \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:19+0000\n" +"Language-Team: Norwegian BokmÃ¥l \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:28+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" -"X-Language-Code: no\n" +"X-POT-Import-Date: 2011-06-05 21:52:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: nb\n" "X-Message-Group: #out-statusnet-plugin-tinymce\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "Use TinyMCE library to allow rich text editing in the browser." msgstr "" "Bruk TinyMCE-biblioteket for Ã¥ tillate rik tekstredigering i nettleseren." diff --git a/plugins/TinyMCE/locale/nl/LC_MESSAGES/TinyMCE.po b/plugins/TinyMCE/locale/nl/LC_MESSAGES/TinyMCE.po index 52e4402028..81cb96e3b1 100644 --- a/plugins/TinyMCE/locale/nl/LC_MESSAGES/TinyMCE.po +++ b/plugins/TinyMCE/locale/nl/LC_MESSAGES/TinyMCE.po @@ -9,17 +9,18 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TinyMCE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:38+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:19+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:28+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-tinymce\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "Use TinyMCE library to allow rich text editing in the browser." msgstr "TinyMCE gebruiken om WYSIWYG-bewerken in de browser mogelijk te maken." diff --git a/plugins/TinyMCE/locale/pt/LC_MESSAGES/TinyMCE.po b/plugins/TinyMCE/locale/pt/LC_MESSAGES/TinyMCE.po index 3bcf97f191..1a53bcaf86 100644 --- a/plugins/TinyMCE/locale/pt/LC_MESSAGES/TinyMCE.po +++ b/plugins/TinyMCE/locale/pt/LC_MESSAGES/TinyMCE.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TinyMCE to Portuguese (Português) +# Translation of StatusNet - TinyMCE to Portuguese (português) # Exported from translatewiki.net # # Author: Waldir @@ -9,17 +9,18 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TinyMCE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:38+0000\n" -"Language-Team: Portuguese \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:19+0000\n" +"Language-Team: Portuguese \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:28+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: pt\n" "X-Message-Group: #out-statusnet-plugin-tinymce\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "Use TinyMCE library to allow rich text editing in the browser." msgstr "Use biblioteca TinyMCE para permitir a edição em rich text no browser." diff --git a/plugins/TinyMCE/locale/pt_BR/LC_MESSAGES/TinyMCE.po b/plugins/TinyMCE/locale/pt_BR/LC_MESSAGES/TinyMCE.po index 83f478b118..c149adebe0 100644 --- a/plugins/TinyMCE/locale/pt_BR/LC_MESSAGES/TinyMCE.po +++ b/plugins/TinyMCE/locale/pt_BR/LC_MESSAGES/TinyMCE.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TinyMCE to Brazilian Portuguese (Português do Brasil) +# Translation of StatusNet - TinyMCE to Brazilian Portuguese (português do Brasil) # Exported from translatewiki.net # # Author: Giro720 @@ -9,19 +9,20 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TinyMCE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:38+0000\n" -"Language-Team: Brazilian Portuguese \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:19+0000\n" +"Language-Team: Brazilian Portuguese \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:28+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: pt-br\n" "X-Message-Group: #out-statusnet-plugin-tinymce\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Plugin description. msgid "Use TinyMCE library to allow rich text editing in the browser." msgstr "" "Utilizar a biblioteca TinyMCE para permitir edição em rich text no navegador." diff --git a/plugins/TinyMCE/locale/ru/LC_MESSAGES/TinyMCE.po b/plugins/TinyMCE/locale/ru/LC_MESSAGES/TinyMCE.po index d6b7b5c7b1..2cafd46d9b 100644 --- a/plugins/TinyMCE/locale/ru/LC_MESSAGES/TinyMCE.po +++ b/plugins/TinyMCE/locale/ru/LC_MESSAGES/TinyMCE.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TinyMCE to Russian (РуÑÑкий) +# Translation of StatusNet - TinyMCE to Russian (руÑÑкий) # Exported from translatewiki.net # # Author: ÐлекÑандр Сигачёв @@ -9,19 +9,20 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TinyMCE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:38+0000\n" -"Language-Team: Russian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:20+0000\n" +"Language-Team: Russian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:28+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ru\n" "X-Message-Group: #out-statusnet-plugin-tinymce\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Plugin description. msgid "Use TinyMCE library to allow rich text editing in the browser." msgstr "" "ИÑпользование библиотеки TinyMCE, Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в браузере." diff --git a/plugins/TinyMCE/locale/tl/LC_MESSAGES/TinyMCE.po b/plugins/TinyMCE/locale/tl/LC_MESSAGES/TinyMCE.po index 9024a7dae4..5c5bf59680 100644 --- a/plugins/TinyMCE/locale/tl/LC_MESSAGES/TinyMCE.po +++ b/plugins/TinyMCE/locale/tl/LC_MESSAGES/TinyMCE.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TinyMCE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:38+0000\n" -"Language-Team: Tagalog \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:20+0000\n" +"Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:28+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-tinymce\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "Use TinyMCE library to allow rich text editing in the browser." msgstr "" "Gamitin ang aklatan ng TinyMCE upang pahintulutan ang pamamatnugot ng " diff --git a/plugins/TinyMCE/locale/uk/LC_MESSAGES/TinyMCE.po b/plugins/TinyMCE/locale/uk/LC_MESSAGES/TinyMCE.po index 6669df54c5..b77701ec48 100644 --- a/plugins/TinyMCE/locale/uk/LC_MESSAGES/TinyMCE.po +++ b/plugins/TinyMCE/locale/uk/LC_MESSAGES/TinyMCE.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TinyMCE to Ukrainian (УкраїнÑька) +# Translation of StatusNet - TinyMCE to Ukrainian (українÑька) # Exported from translatewiki.net # # Author: Boogie @@ -9,19 +9,20 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TinyMCE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:39+0000\n" -"Language-Team: Ukrainian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:20+0000\n" +"Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:28+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:08+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-tinymce\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Plugin description. msgid "Use TinyMCE library to allow rich text editing in the browser." msgstr "" "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ð±Ñ–Ð±Ð»Ñ–Ð¾Ñ‚ÐµÐºÐ¸ TinyMCE Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñтого Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚ÐµÐºÑту у вікні " diff --git a/plugins/TwitterBridge/Notice_to_status.php b/plugins/TwitterBridge/Notice_to_status.php index 3b8f816cfc..313adaeafc 100644 --- a/plugins/TwitterBridge/Notice_to_status.php +++ b/plugins/TwitterBridge/Notice_to_status.php @@ -71,7 +71,6 @@ class Notice_to_status extends Memcached_DataObject * @return Notice_to_status object found, or null for no hits * */ - function staticGet($k, $v=null) { return Memcached_DataObject::staticGet('Notice_to_status', $k, $v); @@ -85,7 +84,6 @@ class Notice_to_status extends Memcached_DataObject * * @return array array of column definitions */ - function table() { return array('notice_id' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL, @@ -102,7 +100,6 @@ class Notice_to_status extends Memcached_DataObject * * @return array list of key field names */ - function keys() { return array_keys($this->keyTypes()); @@ -120,7 +117,6 @@ class Notice_to_status extends Memcached_DataObject * 'K' for primary key: for compound keys, add an entry for each component; * 'U' for unique keys: compound keys are not well supported here. */ - function keyTypes() { return array('notice_id' => 'K', 'status_id' => 'U'); @@ -136,7 +132,6 @@ class Notice_to_status extends Memcached_DataObject * * @return array magic three-false array that stops auto-incrementing. */ - function sequenceKey() { return array(false, false, false); @@ -151,7 +146,6 @@ class Notice_to_status extends Memcached_DataObject * * @return Notice_to_status new object for this value */ - static function saveNew($notice_id, $status_id) { if (empty($notice_id)) { diff --git a/plugins/TwitterBridge/README b/plugins/TwitterBridge/README index 10ea35b2b6..cb3369d1d0 100644 --- a/plugins/TwitterBridge/README +++ b/plugins/TwitterBridge/README @@ -75,13 +75,9 @@ Administration panel As of StatusNet 0.9.0 there is a new administration panel that allows you to configure Twitter bridge settings within StatusNet itself, -instead of having to specify them manually in your config.php. To enable -the administration panel, you will need to add it to the list of active -administration panels. You can do this via your config.php. E.g.: +instead of having to specify them manually in your config.php. - $config['admin']['panels'][] = 'twitter'; - -And to access it, you'll need to use a user with the "administrator" +To access it, you'll need to use a user with the "administrator" role (see: scripts/userrole.php). Sign in with Twitter diff --git a/plugins/TwitterBridge/TwitterBridgePlugin.php b/plugins/TwitterBridge/TwitterBridgePlugin.php index 29192cf53b..cae0dbfcac 100644 --- a/plugins/TwitterBridge/TwitterBridgePlugin.php +++ b/plugins/TwitterBridge/TwitterBridgePlugin.php @@ -148,8 +148,10 @@ class TwitterBridgePlugin extends Plugin if (self::hasKeys() && common_config('twitter', 'signin')) { $action->menuItem( common_local_url('twitterlogin'), - _m('Twitter'), - _m('Login or register using Twitter'), + // TRANS: Menu item in login navigation. + _m('MENU','Twitter'), + // TRANS: Title for menu item in login navigation. + _m('Login or register using Twitter.'), 'twitterlogin' === $action_name ); } @@ -171,7 +173,9 @@ class TwitterBridgePlugin extends Plugin $action->menuItem( common_local_url('twittersettings'), - _m('Twitter'), + // TRANS: Menu item in connection settings navigation. + _m('MENU','Twitter'), + // TRANS: Title for menu item in connection settings navigation. _m('Twitter integration options'), $action_name === 'twittersettings' ); @@ -200,6 +204,7 @@ class TwitterBridgePlugin extends Plugin return false; case 'TwitterOAuthClient': case 'TwitterQueueHandler': + case 'TweetInQueueHandler': case 'TwitterImport': case 'JsonStreamReader': case 'TwitterStreamReader': @@ -283,6 +288,18 @@ class TwitterBridgePlugin extends Plugin return true; } + /** + * If the plugin's installed, this should be accessible to admins + */ + function onAdminPanelCheck($name, &$isOK) + { + if ($name == 'twitter') { + $isOK = true; + return false; + } + return true; + } + /** * Add a Twitter tab to the admin panel * @@ -299,8 +316,10 @@ class TwitterBridgePlugin extends Plugin $nav->out->menuItem( common_local_url('twitteradminpanel'), + // TRANS: Menu item in administrative panel that leads to the Twitter bridge configuration. _m('Twitter'), - _m('Twitter bridge configuration'), + // TRANS: Menu item title in administrative panel that leads to the Twitter bridge configuration. + _m('Twitter bridge configuration page.'), $action_name == 'twitteradminpanel', 'nav_twitter_admin_panel' ); @@ -321,10 +340,10 @@ class TwitterBridgePlugin extends Plugin $versions[] = array( 'name' => 'TwitterBridge', 'version' => self::VERSION, - 'author' => 'Zach Copley, Julien C', + 'author' => 'Zach Copley, Julien C, Jean Baptiste Favre', 'homepage' => 'http://status.net/wiki/Plugin:TwitterBridge', - 'rawdescription' => _m( - 'The Twitter "bridge" plugin allows integration ' . + // TRANS: Plugin description. + 'rawdescription' => _m('The Twitter "bridge" plugin allows integration ' . 'of a StatusNet instance with ' . 'Twitter.' ) @@ -539,4 +558,32 @@ class TwitterBridgePlugin extends Plugin } return true; } + + /** + * Add links in the user's profile block to their Twitter profile URL. + * + * @param Profile $profile The profile being shown + * @param Array &$links Writeable array of arrays (href, text, image). + * + * @return boolean hook value (true) + */ + + function onOtherAccountProfiles($profile, &$links) + { + $fuser = null; + + $flink = Foreign_link::getByUserID($profile->id, TWITTER_SERVICE); + + if (!empty($flink)) { + $fuser = $flink->getForeignUser(); + + if (!empty($fuser)) { + $links[] = array("href" => $fuser->uri, + "text" => sprintf(_("@%s on Twitter"), $fuser->nickname), + "image" => $this->path("icons/twitter-bird-white-on-blue.png")); + } + } + + return true; + } } diff --git a/plugins/TwitterBridge/Twitter_synch_status.php b/plugins/TwitterBridge/Twitter_synch_status.php index a8337862c8..9c61e7e7e0 100644 --- a/plugins/TwitterBridge/Twitter_synch_status.php +++ b/plugins/TwitterBridge/Twitter_synch_status.php @@ -64,7 +64,6 @@ class Twitter_synch_status extends Memcached_DataObject * @param mixed $v Value to lookup * * @return Twitter_synch_status object found, or null for no hits - * */ function staticGet($k, $v=null) { diff --git a/plugins/TwitterBridge/daemons/twitterdaemon.php b/plugins/TwitterBridge/daemons/twitterdaemon.php index d313d2de96..8b774889d1 100644 --- a/plugins/TwitterBridge/daemons/twitterdaemon.php +++ b/plugins/TwitterBridge/daemons/twitterdaemon.php @@ -23,7 +23,7 @@ define('INSTALLDIR', realpath(dirname(__FILE__) . '/../../..')); $shortoptions = 'fi::a'; $longoptions = array('id::', 'foreground', 'all'); -$helptext = <<getDatabaseConnection(); - $this->getTimeline($flink); + $this->getTimeline($flink, 'home_timeline'); + $this->getTimeline($flink, 'mentions_timeline'); $flink->last_friendsync = common_sql_now(); $flink->update(); @@ -149,65 +150,68 @@ class TwitterStatusFetcher extends ParallelizingDaemon unset($_DB_DATAOBJECT['CONNECTIONS']); } - function getTimeline($flink) + function getTimeline($flink, $timelineUri = 'home_timeline') { if (empty($flink)) { - common_log(LOG_WARNING, $this->name() . + common_log(LOG_ERR, $this->name() . " - Can't retrieve Foreign_link for foreign ID $fid"); return; } - common_debug($this->name() . ' - Trying to get timeline for Twitter user ' . - $flink->foreign_id); + common_log(LOG_DEBUG, $this->name() . ' - Trying to get ' . $timelineUri . + ' timeline for Twitter user ' . $flink->foreign_id); $client = null; if (TwitterOAuthClient::isPackedToken($flink->credentials)) { $token = TwitterOAuthClient::unpackToken($flink->credentials); $client = new TwitterOAuthClient($token->key, $token->secret); - common_debug($this->name() . ' - Grabbing friends timeline with OAuth.'); + common_log(LOG_DEBUG, $this->name() . ' - Grabbing ' . $timelineUri . ' timeline with OAuth.'); } else { - common_debug("Skipping friends timeline for $flink->foreign_id since not OAuth."); + common_log(LOG_ERR, "Skipping " . $timelineUri . " timeline for " . + $flink->foreign_id . " since not OAuth."); } $timeline = null; - $lastId = Twitter_synch_status::getLastId($flink->foreign_id, 'home_timeline'); + $lastId = Twitter_synch_status::getLastId($flink->foreign_id, $timelineUri); - common_debug("Got lastId value '{$lastId}' for foreign id '{$flink->foreign_id}' and timeline 'home_timeline'"); + common_log(LOG_DEBUG, "Got lastId value '" . $lastId . "' for foreign id '" . + $flink->foreign_id . "' and timeline '" . $timelineUri. "'"); try { - $timeline = $client->statusesHomeTimeline($lastId); + $timeline = $client->statusesTimeline($lastId, $timelineUri); } catch (Exception $e) { - common_log(LOG_WARNING, $this->name() . - ' - Twitter client unable to get friends timeline for user ' . - $flink->user_id . ' - code: ' . - $e->getCode() . 'msg: ' . $e->getMessage()); + common_log(LOG_ERR, $this->name() . + ' - Unable to get ' . $timelineUri . ' timeline for user ' . $flink->user_id . + ' - code: ' . $e->getCode() . 'msg: ' . $e->getMessage()); } if (empty($timeline)) { - common_log(LOG_WARNING, $this->name() . " - Empty timeline."); + common_log(LOG_WARNING, $this->name() . " - Empty '" . $timelineUri . "' timeline."); return; } - common_debug(LOG_INFO, $this->name() . ' - Retrieved ' . sizeof($timeline) . ' statuses from Twitter.'); - - $importer = new TwitterImport(); - - // Reverse to preserve order - - foreach (array_reverse($timeline) as $status) { - $notice = $importer->importStatus($status); - - if (!empty($notice)) { - Inbox::insertNotice($flink->user_id, $notice->id); - } - } + common_log(LOG_INFO, $this->name() . + ' - Retrieved ' . sizeof($timeline) . ' statuses from ' . $timelineUri . ' timeline' . + ' - for user ' . $flink->user_id); if (!empty($timeline)) { + $qm = QueueManager::get(); + + // Reverse to preserve order + foreach (array_reverse($timeline) as $status) { + $data = array( + 'status' => $status, + 'for_user' => $flink->foreign_id, + ); + $qm->enqueue($data, 'tweetin'); + } + $lastId = twitter_id($timeline[0]); - Twitter_synch_status::setLastId($flink->foreign_id, 'home_timeline', $lastId); - common_debug("Set lastId value '$lastId' for foreign id '{$flink->foreign_id}' and timeline 'home_timeline'"); + Twitter_synch_status::setLastId($flink->foreign_id, $timelineUri, $lastId); + common_debug("Set lastId value '$lastId' for foreign id '{$flink->foreign_id}' and timeline '" . + $timelineUri . "'"); } // Okay, record the time we synced with Twitter for posterity @@ -233,5 +237,5 @@ if (have_option('d') || have_option('debug')) { $debug = true; } -$fetcher = new TwitterStatusFetcher($id, 60, 2, $debug); +$fetcher = new TwitterStatusFetcher($id, POLL_INTERVAL, MAXCHILDREN, $debug); $fetcher->runOnce(); diff --git a/plugins/TwitterBridge/icons/twitter-bird-white-on-blue.png b/plugins/TwitterBridge/icons/twitter-bird-white-on-blue.png new file mode 100644 index 0000000000..2c42b0823e Binary files /dev/null and b/plugins/TwitterBridge/icons/twitter-bird-white-on-blue.png differ diff --git a/plugins/TwitterBridge/jsonstreamreader.php b/plugins/TwitterBridge/jsonstreamreader.php index f6572c9eef..d5852c93e3 100644 --- a/plugins/TwitterBridge/jsonstreamreader.php +++ b/plugins/TwitterBridge/jsonstreamreader.php @@ -63,7 +63,8 @@ abstract class JsonStreamReader } else if ($scheme == 'https') { $rawScheme = 'ssl'; } else { - throw new ServerException('Invalid URL scheme for HTTP stream reader'); + // TRANS: Server exception thrown when an invalid URL scheme is detected. + throw new ServerException(_m('Invalid URL scheme for HTTP stream reader.')); } $host = parse_url($url, PHP_URL_HOST); @@ -180,7 +181,8 @@ abstract class JsonStreamReader public function handleInput($socket) { if ($this->socket !== $socket) { - throw new Exception('Got input from unexpected socket!'); + // TRANS: Exception thrown when input from an inexpected socket is encountered. + throw new Exception(_m('Got input from unexpected socket!')); } try { @@ -210,7 +212,9 @@ abstract class JsonStreamReader $this->handleLineActive($line); break; default: - throw new Exception('Invalid state in handleLine: ' . $this->state); + // TRANS: Exception thrown when an invalid state is encountered in handleLine. + // TRANS: %s is the invalid state. + throw new Exception(sprintf(_m('Invalid state in handleLine: %s.'),$this->state)); } } @@ -222,15 +226,21 @@ abstract class JsonStreamReader { $bits = explode(' ', $line, 3); if (count($bits) != 3) { - throw new Exception("Invalid HTTP response line: $line"); + // TRANS: Exception thrown when an invalid response line is encountered. + // TRANS: %s is the invalid line. + throw new Exception(sprintf(_m('Invalid HTTP response line: %s.'),$line)); } list($http, $status, $text) = $bits; if (substr($http, 0, 5) != 'HTTP/') { - throw new Exception("Invalid HTTP response line chunk '$http': $line"); + // TRANS: Exception thrown when an invalid response line part is encountered. + // TRANS: %1$s is the chunk, %2$s is the line. + throw new Exception(sprintf(_m('Invalid HTTP response line chunk "%1$s": %2$s.'),$http, $line)); } if ($status != '200') { - throw new Exception("Bad HTTP response code $status: $line"); + // TRANS: Exception thrown when an invalid response code is encountered. + // TRANS: %1$s is the response code, %2$s is the line. + throw new Exception(sprintf(_m('Bad HTTP response code %1$s: %2$s.'),$status,$line)); } common_log(LOG_DEBUG, "$this->id $line"); $this->state = 'headers'; diff --git a/plugins/TwitterBridge/locale/TwitterBridge.pot b/plugins/TwitterBridge/locale/TwitterBridge.pot index 947c638244..15e80afa55 100644 --- a/plugins/TwitterBridge/locale/TwitterBridge.pot +++ b/plugins/TwitterBridge/locale/TwitterBridge.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,349 +16,481 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: twittersettings.php:57 +#. TRANS: Title for page with Twitter integration settings. +#: twittersettings.php:58 msgid "Twitter settings" msgstr "" -#: twittersettings.php:68 +#. TRANS: Instructions for page with Twitter integration settings. +#: twittersettings.php:70 msgid "" "Connect your Twitter account to share your updates with your Twitter friends " "and vice-versa." msgstr "" -#: twittersettings.php:115 +#. TRANS: Fieldset legend. +#: twittersettings.php:119 msgid "Twitter account" msgstr "" -#: twittersettings.php:120 +#. TRANS: Form note when a Twitter account has been connected. +#: twittersettings.php:125 msgid "Connected Twitter account" msgstr "" -#: twittersettings.php:125 +#. TRANS: Fieldset legend. +#: twittersettings.php:131 msgid "Disconnect my account from Twitter" msgstr "" -#: twittersettings.php:131 -msgid "Disconnecting your Twitter could make it impossible to log in! Please " -msgstr "" - -#: twittersettings.php:135 -msgid "set a password" -msgstr "" - +#. TRANS: Form guide. %s is a URL to the password settings. +#. TRANS: This message contains a Markdown link in the form [description](link). #: twittersettings.php:137 -msgid " first." +#, php-format +msgid "" +"Disconnecting your Twitter account could make it impossible to log in! " +"Please [set a password](%s) first." msgstr "" -#. TRANS: %1$s is the current website name. -#: twittersettings.php:141 +#. TRANS: Form instructions. %1$s is the StatusNet sitename. +#: twittersettings.php:146 #, php-format msgid "" "Keep your %1$s account but disconnect from Twitter. You can use your %1$s " "password to log in." msgstr "" -#: twittersettings.php:149 +#. TRANS: Button text for disconnecting a Twitter account. +#: twittersettings.php:154 +msgctxt "BUTTON" msgid "Disconnect" msgstr "" -#: twittersettings.php:156 +#. TRANS: Fieldset legend. +#: twittersettings.php:162 msgid "Preferences" msgstr "" -#: twittersettings.php:160 +#. TRANS: Checkbox label. +#: twittersettings.php:167 msgid "Automatically send my notices to Twitter." msgstr "" -#: twittersettings.php:167 +#. TRANS: Checkbox label. +#: twittersettings.php:175 msgid "Send local \"@\" replies to Twitter." msgstr "" -#: twittersettings.php:174 +#. TRANS: Checkbox label. +#: twittersettings.php:183 msgid "Subscribe to my Twitter friends here." msgstr "" -#: twittersettings.php:183 +#. TRANS: Checkbox label. +#: twittersettings.php:193 msgid "Import my friends timeline." msgstr "" -#: twittersettings.php:199 twitteradminpanel.php:293 +#. TRANS: Button text for saving Twitter integration settings. +#. TRANS: Button text for saving the administrative Twitter bridge settings. +#: twittersettings.php:210 twitteradminpanel.php:311 +msgctxt "BUTTON" msgid "Save" msgstr "" -#: twittersettings.php:201 +#. TRANS: Button text for adding Twitter integration. +#: twittersettings.php:213 +msgctxt "BUTTON" msgid "Add" msgstr "" -#: twittersettings.php:225 twitterauthorization.php:120 +#. TRANS: Client error displayed when the session token does not match or is not given. +#: twittersettings.php:238 twitterauthorization.php:121 msgid "There was a problem with your session token. Try again, please." msgstr "" -#: twittersettings.php:235 +#. TRANS: Client error displayed when the submitted form contains unexpected data. +#: twittersettings.php:249 msgid "Unexpected form submission." msgstr "" -#: twittersettings.php:250 +#. TRANS: Client error displayed when trying to remove a connected Twitter account when there isn't one connected. +#: twittersettings.php:265 msgid "No Twitter connection to remove." msgstr "" -#: twittersettings.php:258 -msgid "Couldn't remove Twitter user." +#. TRANS: Server error displayed when trying to remove a connected Twitter account fails. +#: twittersettings.php:274 +msgid "Could not remove Twitter user." msgstr "" -#: twittersettings.php:262 +#. TRANS: Success message displayed after disconnecting a Twitter account. +#: twittersettings.php:279 msgid "Twitter account disconnected." msgstr "" -#: twittersettings.php:282 twittersettings.php:293 -msgid "Couldn't save Twitter preferences." +#. TRANS: Server error displayed when saving Twitter integration preferences fails. +#: twittersettings.php:301 twittersettings.php:314 +msgid "Could not save Twitter preferences." msgstr "" -#: twittersettings.php:301 +#. TRANS: Success message after saving Twitter integration preferences. +#: twittersettings.php:323 msgid "Twitter preferences saved." msgstr "" -#: twitterauthorization.php:126 +#. TRANS: Form validation error displayed when the checkbox to agree to the license has not been checked. +#: twitterauthorization.php:128 msgid "You cannot register if you do not agree to the license." msgstr "" -#: twitterauthorization.php:135 +#. TRANS: Form validation error displayed when an unhandled error occurs. +#: twitterauthorization.php:138 msgid "Something weird happened." msgstr "" -#: twitterauthorization.php:181 +#. TRANS: Server error displayed when linking to a Twitter account fails. +#: twitterauthorization.php:183 twitterauthorization.php:233 +#: twitterauthorization.php:305 msgid "Could not link your Twitter account." msgstr "" -#: twitterauthorization.php:201 -msgid "Couldn't link your Twitter account: oauth_token mismatch." +#. TRANS: Server error displayed when linking to a Twitter account fails because of an incorrect oauth_token. +#: twitterauthorization.php:204 +msgid "Could not link your Twitter account: oauth_token mismatch." msgstr "" -#: twitterauthorization.php:229 twitterauthorization.php:300 -msgid "Couldn't link your Twitter account." -msgstr "" - -#: twitterauthorization.php:312 +#. TRANS: Page instruction. %s is the StatusNet sitename. +#: twitterauthorization.php:318 #, php-format msgid "" -"This is the first time you've logged into %s so we must connect your Twitter " -"account to a local account. You can either create a new account, or connect " -"with your existing account, if you have one." +"This is the first time you have logged into %s so we must connect your " +"Twitter account to a local account. You can either create a new account, or " +"connect with your existing account, if you have one." msgstr "" -#: twitterauthorization.php:318 +#. TRANS: Page title. +#: twitterauthorization.php:325 msgid "Twitter Account Setup" msgstr "" -#: twitterauthorization.php:351 +#. TRANS: Fieldset legend. +#: twitterauthorization.php:359 msgid "Connection options" msgstr "" -#: twitterauthorization.php:360 +#. TRANS: Fieldset legend. +#: twitterauthorization.php:373 +msgid "Create new account" +msgstr "" + +#. TRANS: Sub form introduction text. +#: twitterauthorization.php:376 +msgid "Create a new user with this nickname." +msgstr "" + +#. TRANS: Field label. +#: twitterauthorization.php:384 +msgid "New nickname" +msgstr "" + +#. TRANS: Field title for nickname field. +#: twitterauthorization.php:387 +msgid "1-64 lowercase letters or numbers, no punctuation or spaces." +msgstr "" + +#. TRANS: Field label. +#: twitterauthorization.php:391 +msgctxt "LABEL" +msgid "Email" +msgstr "" + +#. TRANS: Field title for e-mail address field. +#: twitterauthorization.php:393 +msgid "Used only for updates, announcements, and password recovery" +msgstr "" + +#. TRANS: Button text for creating a new StatusNet account in the Twitter connect page. +#: twitterauthorization.php:402 +msgctxt "BUTTON" +msgid "Create" +msgstr "" + +#. TRANS: Fieldset legend. +#: twitterauthorization.php:409 +msgid "Connect existing account" +msgstr "" + +#. TRANS: Sub form introduction text. +#: twitterauthorization.php:412 +msgid "" +"If you already have an account, login with your username and password to " +"connect it to your Twitter account." +msgstr "" + +#. TRANS: Field label. +#: twitterauthorization.php:416 +msgid "Existing nickname" +msgstr "" + +#. TRANS: Field label. +#: twitterauthorization.php:420 +msgid "Password" +msgstr "" + +#. TRANS: Fieldset legend. +#: twitterauthorization.php:428 +msgid "License" +msgstr "" + +#. TRANS: Text for license agreement checkbox. +#. TRANS: %s is the license as configured for the StatusNet site. +#: twitterauthorization.php:439 #, php-format msgid "" "My text and files are available under %s except this private data: password, " "email address, IM address, and phone number." msgstr "" -#: twitterauthorization.php:381 -msgid "Create new account" -msgstr "" - -#: twitterauthorization.php:383 -msgid "Create a new user with this nickname." -msgstr "" - -#: twitterauthorization.php:390 -msgid "New nickname" -msgstr "" - -#: twitterauthorization.php:392 -msgid "1-64 lowercase letters or numbers, no punctuation or spaces." -msgstr "" - -#: twitterauthorization.php:395 -msgctxt "LABEL" -msgid "Email" -msgstr "" - -#: twitterauthorization.php:396 -msgid "Used only for updates, announcements, and password recovery" -msgstr "" - -#: twitterauthorization.php:404 -msgid "Create" -msgstr "" - -#: twitterauthorization.php:409 -msgid "Connect existing account" -msgstr "" - -#: twitterauthorization.php:411 -msgid "" -"If you already have an account, login with your username and password to " -"connect it to your Twitter account." -msgstr "" - -#: twitterauthorization.php:414 -msgid "Existing nickname" -msgstr "" - -#: twitterauthorization.php:417 -msgid "Password" -msgstr "" - -#: twitterauthorization.php:420 +#. TRANS: Button text for connecting an existing StatusNet account in the Twitter connect page.. +#: twitterauthorization.php:453 +msgctxt "BUTTON" msgid "Connect" msgstr "" -#: twitterauthorization.php:466 twitterauthorization.php:475 +#. TRANS: Client error displayed when trying to create a new user while creating new users is not allowed. +#: twitterauthorization.php:498 twitterauthorization.php:508 msgid "Registration not allowed." msgstr "" -#: twitterauthorization.php:482 +#. TRANS: Client error displayed when trying to create a new user with an invalid invitation code. +#: twitterauthorization.php:516 msgid "Not a valid invitation code." msgstr "" -#: twitterauthorization.php:495 +#. TRANS: Client error displayed when trying to create a new user with an invalid username. +#: twitterauthorization.php:530 msgid "Nickname not allowed." msgstr "" -#: twitterauthorization.php:500 +#. TRANS: Client error displayed when trying to create a new user with a username that is already in use. +#: twitterauthorization.php:536 msgid "Nickname already in use. Try another one." msgstr "" -#: twitterauthorization.php:520 +#. TRANS: Server error displayed when creating a new user has failed. +#: twitterauthorization.php:557 msgid "Error registering user." msgstr "" -#: twitterauthorization.php:531 twitterauthorization.php:571 -#: twitterauthorization.php:591 +#. TRANS: Server error displayed when connecting a user to a Twitter user has failed. +#. TRANS: Server error displayed connecting a user to a Twitter user has failed. +#: twitterauthorization.php:569 twitterauthorization.php:612 +#: twitterauthorization.php:633 msgid "Error connecting user to Twitter." msgstr "" -#: twitterauthorization.php:553 +#. TRANS: Form validation error displayed when connecting an existing user to a Twitter user fails because +#. TRANS: the provided username and/or password are incorrect. +#: twitterauthorization.php:593 msgid "Invalid username or password." msgstr "" -#: twitteradminpanel.php:52 TwitterBridgePlugin.php:151 -#: TwitterBridgePlugin.php:174 TwitterBridgePlugin.php:302 +#. TRANS: Page title for Twitter administration panel. +#: twitteradminpanel.php:53 +msgctxt "TITLE" msgid "Twitter" msgstr "" -#: twitteradminpanel.php:62 +#. TRANS: Instructions for Twitter bridge administration page. +#: twitteradminpanel.php:64 msgid "Twitter bridge settings" msgstr "" -#: twitteradminpanel.php:150 -msgid "Invalid consumer key. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer key is invalid because it is too long. +#: twitteradminpanel.php:153 +msgid "Invalid consumer key. Maximum length is 255 characters." msgstr "" -#: twitteradminpanel.php:156 -msgid "Invalid consumer secret. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer secret is invalid because it is too long. +#: twitteradminpanel.php:160 +msgid "Invalid consumer secret. Maximum length is 255 characters." msgstr "" -#: twitteradminpanel.php:212 +#. TRANS: Fieldset legend for Twitter application settings. +#: twitteradminpanel.php:217 msgid "Twitter application settings" msgstr "" -#: twitteradminpanel.php:218 +#. TRANS: Field label for Twitter assigned consumer key. +#: twitteradminpanel.php:224 msgid "Consumer key" msgstr "" -#: twitteradminpanel.php:219 -msgid "Consumer key assigned by Twitter" +#. TRANS: Field title for Twitter assigned consumer key. +#: twitteradminpanel.php:226 +msgid "The consumer key assigned by Twitter." msgstr "" -#: twitteradminpanel.php:227 +#. TRANS: Field label for Twitter assigned consumer secret. +#: twitteradminpanel.php:235 msgid "Consumer secret" msgstr "" -#: twitteradminpanel.php:228 -msgid "Consumer secret assigned by Twitter" +#. TRANS: Field title for Twitter assigned consumer secret. +#: twitteradminpanel.php:237 +msgid "The consumer secret assigned by Twitter." msgstr "" -#: twitteradminpanel.php:238 -msgid "Note: a global consumer key and secret are set." +#. TRANS: Form guide displayed when two required fields have already been provided. +#: twitteradminpanel.php:248 +msgid "Note: A global consumer key and secret are set." msgstr "" -#: twitteradminpanel.php:245 +#. TRANS: Field label for Twitter application name. +#: twitteradminpanel.php:256 msgid "Integration source" msgstr "" -#: twitteradminpanel.php:246 -msgid "Name of your Twitter application" +#. TRANS: Field title for Twitter application name. +#: twitteradminpanel.php:258 +msgid "The name of your Twitter application." msgstr "" -#: twitteradminpanel.php:258 +#. TRANS: Fieldset legend for Twitter integration options. +#: twitteradminpanel.php:271 msgid "Options" msgstr "" -#: twitteradminpanel.php:265 +#. TRANS: Checkbox label for global setting. +#: twitteradminpanel.php:279 msgid "Enable \"Sign-in with Twitter\"" msgstr "" -#: twitteradminpanel.php:267 -msgid "Allow users to login with their Twitter credentials" +#. TRANS: Checkbox title. +#: twitteradminpanel.php:282 +msgid "This allow users to login with their Twitter credentials." msgstr "" -#: twitteradminpanel.php:274 +#. TRANS: Checkbox label for global setting. +#: twitteradminpanel.php:290 msgid "Enable Twitter import" msgstr "" -#: twitteradminpanel.php:276 +#. TRANS: Checkbox title for global setting. +#: twitteradminpanel.php:293 msgid "" "Allow users to import their Twitter friends' timelines. Requires daemons to " "be manually configured." msgstr "" -#: twitteradminpanel.php:293 -msgid "Save Twitter settings" +#. TRANS: Button title for saving the administrative Twitter bridge settings. +#: twitteradminpanel.php:313 +msgid "Save the Twitter bridge settings." msgstr "" -#: TwitterBridgePlugin.php:152 -msgid "Login or register using Twitter" +#. TRANS: Server exception thrown when an invalid URL scheme is detected. +#: jsonstreamreader.php:67 +msgid "Invalid URL scheme for HTTP stream reader." msgstr "" -#: TwitterBridgePlugin.php:175 +#. TRANS: Exception thrown when input from an inexpected socket is encountered. +#: jsonstreamreader.php:185 +msgid "Got input from unexpected socket!" +msgstr "" + +#. TRANS: Exception thrown when an invalid state is encountered in handleLine. +#. TRANS: %s is the invalid state. +#: jsonstreamreader.php:217 +#, php-format +msgid "Invalid state in handleLine: %s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response line is encountered. +#. TRANS: %s is the invalid line. +#: jsonstreamreader.php:231 +#, php-format +msgid "Invalid HTTP response line: %s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response line part is encountered. +#. TRANS: %1$s is the chunk, %2$s is the line. +#: jsonstreamreader.php:238 +#, php-format +msgid "Invalid HTTP response line chunk \"%1$s\": %2$s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response code is encountered. +#. TRANS: %1$s is the response code, %2$s is the line. +#: jsonstreamreader.php:243 +#, php-format +msgid "Bad HTTP response code %1$s: %2$s." +msgstr "" + +#. TRANS: Menu item in login navigation. +#. TRANS: Menu item in connection settings navigation. +#: TwitterBridgePlugin.php:152 TwitterBridgePlugin.php:177 +msgctxt "MENU" +msgid "Twitter" +msgstr "" + +#. TRANS: Title for menu item in login navigation. +#: TwitterBridgePlugin.php:154 +msgid "Login or register using Twitter." +msgstr "" + +#. TRANS: Title for menu item in connection settings navigation. +#: TwitterBridgePlugin.php:179 msgid "Twitter integration options" msgstr "" -#: TwitterBridgePlugin.php:303 -msgid "Twitter bridge configuration" +#. TRANS: Menu item in administrative panel that leads to the Twitter bridge configuration. +#: TwitterBridgePlugin.php:319 +msgid "Twitter" msgstr "" -#: TwitterBridgePlugin.php:327 +#. TRANS: Menu item title in administrative panel that leads to the Twitter bridge configuration. +#: TwitterBridgePlugin.php:321 +msgid "Twitter bridge configuration page." +msgstr "" + +#. TRANS: Plugin description. +#: TwitterBridgePlugin.php:345 msgid "" "The Twitter \"bridge\" plugin allows integration of a StatusNet instance " "with Twitter." msgstr "" -#: twitterlogin.php:56 +#. TRANS: Client error displayed when trying to log in using Twitter while already logged in to StatusNet. +#: twitterlogin.php:57 msgid "Already logged in." msgstr "" -#: twitterlogin.php:64 +#. TRANS: Title for login using Twitter page. +#: twitterlogin.php:66 +msgctxt "TITLE" msgid "Twitter Login" msgstr "" -#: twitterlogin.php:69 +#. TRANS: Instructions for login using Twitter page. +#: twitterlogin.php:72 msgid "Login with your Twitter account" msgstr "" -#: twitterlogin.php:87 +#. TRANS: Alternative text for "sign in with Twitter" image. +#: twitterlogin.php:91 msgid "Sign in with Twitter" msgstr "" #. TRANS: Mail subject after forwarding notices to Twitter has stopped working. -#: twitter.php:428 +#: twitter.php:438 msgid "Your Twitter bridge has been disabled" msgstr "" #. TRANS: Mail body after forwarding notices to Twitter has stopped working. #. TRANS: %1$ is the name of the user the mail is sent to, %2$s is a URL to the #. TRANS: Twitter settings, %3$s is the StatusNet sitename. -#: twitter.php:435 +#: twitter.php:445 #, php-format msgid "" "Hi, %1$s. We're sorry to inform you that your link to Twitter has been " diff --git a/plugins/TwitterBridge/locale/ar/LC_MESSAGES/TwitterBridge.po b/plugins/TwitterBridge/locale/ar/LC_MESSAGES/TwitterBridge.po index 4022e031f4..4354ce8b22 100644 --- a/plugins/TwitterBridge/locale/ar/LC_MESSAGES/TwitterBridge.po +++ b/plugins/TwitterBridge/locale/ar/LC_MESSAGES/TwitterBridge.po @@ -1,6 +1,7 @@ # Translation of StatusNet - TwitterBridge to Arabic (العربية) # Exported from translatewiki.net # +# Author: Majid Al-Dharrab # Author: OsamaK # -- # This file is distributed under the same license as the StatusNet package. @@ -9,274 +10,404 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TwitterBridge\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:44+0000\n" -"Language-Team: Arabic \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:20+0000\n" +"Language-Team: Arabic \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ar\n" "X-Message-Group: #out-statusnet-plugin-twitterbridge\n" "Plural-Forms: nplurals=6; plural=(n == 0) ? 0 : ( (n == 1) ? 1 : ( (n == " "2) ? 2 : ( (n%100 >= 3 && n%100 <= 10) ? 3 : ( (n%100 >= 11 && n%100 <= " "99) ? 4 : 5 ) ) ) );\n" +#. TRANS: Title for page with Twitter integration settings. msgid "Twitter settings" msgstr "إعدادات تويتر" +#. TRANS: Instructions for page with Twitter integration settings. msgid "" "Connect your Twitter account to share your updates with your Twitter friends " "and vice-versa." -msgstr "" +msgstr "اربط حسابك على تويتر لتشارك مستجداتك مع أصدقائك على تويتر والعكس." +#. TRANS: Fieldset legend. msgid "Twitter account" msgstr "حساب تويتر" +#. TRANS: Form note when a Twitter account has been connected. msgid "Connected Twitter account" msgstr "حساب تويتر مربوط" +#. TRANS: Fieldset legend. msgid "Disconnect my account from Twitter" msgstr "اÙصل حسابي عن تويتر" -msgid "Disconnecting your Twitter could make it impossible to log in! Please " +#. TRANS: Form guide. %s is a URL to the password settings. +#. TRANS: This message contains a Markdown link in the form [description](link). +#, php-format +msgid "" +"Disconnecting your Twitter account could make it impossible to log in! " +"Please [set a password](%s) first." msgstr "" +"قد يجعل Ùصل حسابك على تويتر الولوج مستحيلا! الرجاء [تعيين كلمة سر](%s) أولا." -msgid "set a password" -msgstr "" - -msgid " first." -msgstr "" - -#. TRANS: %1$s is the current website name. +#. TRANS: Form instructions. %1$s is the StatusNet sitename. #, php-format msgid "" "Keep your %1$s account but disconnect from Twitter. You can use your %1$s " "password to log in." msgstr "" +"أبق حسابك على %1$s لكن اÙصله من تويتر. يمكن أن تستخدم كلمة سر %1$s للولوج." +#. TRANS: Button text for disconnecting a Twitter account. +msgctxt "BUTTON" msgid "Disconnect" -msgstr "" +msgstr "اقطع الارتباط" +#. TRANS: Fieldset legend. msgid "Preferences" msgstr "تÙضيلات" +#. TRANS: Checkbox label. msgid "Automatically send my notices to Twitter." -msgstr "" +msgstr "أرسل إشعاراتي تلقائيا إلى تويتر." +#. TRANS: Checkbox label. msgid "Send local \"@\" replies to Twitter." -msgstr "" +msgstr "أرسل ردود \"@\" المحلية إلى تويتر." +#. TRANS: Checkbox label. msgid "Subscribe to my Twitter friends here." -msgstr "" +msgstr "اشترك بأصدقائي على تويتر هنا." +#. TRANS: Checkbox label. msgid "Import my friends timeline." -msgstr "" +msgstr "استورد المسار الزمني لأصدقائي." +#. TRANS: Button text for saving Twitter integration settings. +#. TRANS: Button text for saving the administrative Twitter bridge settings. +msgctxt "BUTTON" msgid "Save" msgstr "احÙظ" +#. TRANS: Button text for adding Twitter integration. +msgctxt "BUTTON" msgid "Add" msgstr "أضÙ" +#. TRANS: Client error displayed when the session token does not match or is not given. msgid "There was a problem with your session token. Try again, please." msgstr "" +#. TRANS: Client error displayed when the submitted form contains unexpected data. msgid "Unexpected form submission." msgstr "" +#. TRANS: Client error displayed when trying to remove a connected Twitter account when there isn't one connected. msgid "No Twitter connection to remove." msgstr "" -msgid "Couldn't remove Twitter user." +#. TRANS: Server error displayed when trying to remove a connected Twitter account fails. +msgid "Could not remove Twitter user." msgstr "" +#. TRANS: Success message displayed after disconnecting a Twitter account. msgid "Twitter account disconnected." -msgstr "" +msgstr "قطع الارتباط بحساب تويتر." -msgid "Couldn't save Twitter preferences." -msgstr "" +#. TRANS: Server error displayed when saving Twitter integration preferences fails. +msgid "Could not save Twitter preferences." +msgstr "تعذر Ø­Ùظ تÙضيلات تويتر." +#. TRANS: Success message after saving Twitter integration preferences. msgid "Twitter preferences saved." msgstr "Ø­ÙÙظت تÙضيلات تويتر." +#. TRANS: Form validation error displayed when the checkbox to agree to the license has not been checked. msgid "You cannot register if you do not agree to the license." msgstr "" +#. TRANS: Form validation error displayed when an unhandled error occurs. msgid "Something weird happened." -msgstr "" +msgstr "حدث شيء غريب." +#. TRANS: Server error displayed when linking to a Twitter account fails. msgid "Could not link your Twitter account." msgstr "" -msgid "Couldn't link your Twitter account: oauth_token mismatch." -msgstr "" - -msgid "Couldn't link your Twitter account." +#. TRANS: Server error displayed when linking to a Twitter account fails because of an incorrect oauth_token. +msgid "Could not link your Twitter account: oauth_token mismatch." msgstr "" +#. TRANS: Page instruction. %s is the StatusNet sitename. #, php-format msgid "" -"This is the first time you've logged into %s so we must connect your Twitter " -"account to a local account. You can either create a new account, or connect " -"with your existing account, if you have one." +"This is the first time you have logged into %s so we must connect your " +"Twitter account to a local account. You can either create a new account, or " +"connect with your existing account, if you have one." msgstr "" +#. TRANS: Page title. msgid "Twitter Account Setup" msgstr "إعداد حساب تويتر" +#. TRANS: Fieldset legend. msgid "Connection options" msgstr "خيارات الربط" -#, php-format -msgid "" -"My text and files are available under %s except this private data: password, " -"email address, IM address, and phone number." -msgstr "" - +#. TRANS: Fieldset legend. msgid "Create new account" msgstr "أنشئ حسابًا جديدًا" +#. TRANS: Sub form introduction text. msgid "Create a new user with this nickname." msgstr "أنشئ مستخدمًا جديدًا بهذا الاسم المستعار." +#. TRANS: Field label. msgid "New nickname" msgstr "الاسم المستعار الجديد" +#. TRANS: Field title for nickname field. msgid "1-64 lowercase letters or numbers, no punctuation or spaces." -msgstr "" +msgstr "1-64 حرÙًا إنجليزيًا أو رقمًا، بدون نقاط أو مساÙات." +#. TRANS: Field label. msgctxt "LABEL" msgid "Email" msgstr "البريد الإلكتروني" +#. TRANS: Field title for e-mail address field. msgid "Used only for updates, announcements, and password recovery" msgstr "" +#. TRANS: Button text for creating a new StatusNet account in the Twitter connect page. +msgctxt "BUTTON" msgid "Create" msgstr "أنشئ" +#. TRANS: Fieldset legend. msgid "Connect existing account" msgstr "اربط الحساب الموجود" +#. TRANS: Sub form introduction text. msgid "" "If you already have an account, login with your username and password to " "connect it to your Twitter account." msgstr "" "إذا كان لديك حساب Ùعلا، Ù„Ùج باسم مستخدمك وكلمة سرك لتربطه بحسابك على تويتر." +#. TRANS: Field label. msgid "Existing nickname" msgstr "الاسم المستعار الموجود" +#. TRANS: Field label. msgid "Password" msgstr "كلمة السر" +#. TRANS: Fieldset legend. +msgid "License" +msgstr "" + +#. TRANS: Text for license agreement checkbox. +#. TRANS: %s is the license as configured for the StatusNet site. +#, php-format +msgid "" +"My text and files are available under %s except this private data: password, " +"email address, IM address, and phone number." +msgstr "" +"تخضع نصوصي وملÙاتي Ù„%s إلا البيانات الخاصة التالية: كلمة السر وعنوان البريد " +"الإلكتروني وعنوان المراسلة الÙورية ورقم الهاتÙ." + +#. TRANS: Button text for connecting an existing StatusNet account in the Twitter connect page.. +msgctxt "BUTTON" msgid "Connect" msgstr "اربط" +#. TRANS: Client error displayed when trying to create a new user while creating new users is not allowed. msgid "Registration not allowed." msgstr "لا ÙŠÙسمح بالتسجيل." +#. TRANS: Client error displayed when trying to create a new user with an invalid invitation code. msgid "Not a valid invitation code." msgstr "رمز دعوة غير صالح." +#. TRANS: Client error displayed when trying to create a new user with an invalid username. msgid "Nickname not allowed." msgstr "لا يسمح بهذا الاسم المستعار." +#. TRANS: Client error displayed when trying to create a new user with a username that is already in use. msgid "Nickname already in use. Try another one." msgstr "الاسم المستعار مستخدم بالÙعل. جرّب اسمًا آخرًا." +#. TRANS: Server error displayed when creating a new user has failed. msgid "Error registering user." msgstr "خطأ ÙÙŠ تسجيل مستخدم." +#. TRANS: Server error displayed when connecting a user to a Twitter user has failed. +#. TRANS: Server error displayed connecting a user to a Twitter user has failed. msgid "Error connecting user to Twitter." msgstr "خطأ ÙÙŠ ربط المستخدم بتويتر." +#. TRANS: Form validation error displayed when connecting an existing user to a Twitter user fails because +#. TRANS: the provided username and/or password are incorrect. msgid "Invalid username or password." msgstr "اسم مستخدم أو كلمة سر غير صالحة." +#. TRANS: Page title for Twitter administration panel. +msgctxt "TITLE" msgid "Twitter" msgstr "تويتر" +#. TRANS: Instructions for Twitter bridge administration page. msgid "Twitter bridge settings" msgstr "إعدادات جسر تويتر" -msgid "Invalid consumer key. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer key is invalid because it is too long. +msgid "Invalid consumer key. Maximum length is 255 characters." msgstr "" -msgid "Invalid consumer secret. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer secret is invalid because it is too long. +msgid "Invalid consumer secret. Maximum length is 255 characters." msgstr "" +#. TRANS: Fieldset legend for Twitter application settings. msgid "Twitter application settings" msgstr "" +#. TRANS: Field label for Twitter assigned consumer key. msgid "Consumer key" msgstr "" -msgid "Consumer key assigned by Twitter" +#. TRANS: Field title for Twitter assigned consumer key. +msgid "The consumer key assigned by Twitter." msgstr "" +#. TRANS: Field label for Twitter assigned consumer secret. msgid "Consumer secret" msgstr "" -msgid "Consumer secret assigned by Twitter" +#. TRANS: Field title for Twitter assigned consumer secret. +msgid "The consumer secret assigned by Twitter." msgstr "" -msgid "Note: a global consumer key and secret are set." +#. TRANS: Form guide displayed when two required fields have already been provided. +msgid "Note: A global consumer key and secret are set." msgstr "" +#. TRANS: Field label for Twitter application name. msgid "Integration source" msgstr "" -msgid "Name of your Twitter application" +#. TRANS: Field title for Twitter application name. +msgid "The name of your Twitter application." msgstr "" +#. TRANS: Fieldset legend for Twitter integration options. msgid "Options" msgstr "خيارات" +#. TRANS: Checkbox label for global setting. msgid "Enable \"Sign-in with Twitter\"" msgstr "" -msgid "Allow users to login with their Twitter credentials" +#. TRANS: Checkbox title. +msgid "This allow users to login with their Twitter credentials." msgstr "" +#. TRANS: Checkbox label for global setting. msgid "Enable Twitter import" -msgstr "" +msgstr "مكّن الاستيراد من تويتر" +#. TRANS: Checkbox title for global setting. msgid "" "Allow users to import their Twitter friends' timelines. Requires daemons to " "be manually configured." msgstr "" -msgid "Save Twitter settings" +#. TRANS: Button title for saving the administrative Twitter bridge settings. +msgid "Save the Twitter bridge settings." +msgstr "احÙظ إعدادات جسر تويتر." + +#. TRANS: Server exception thrown when an invalid URL scheme is detected. +msgid "Invalid URL scheme for HTTP stream reader." msgstr "" -msgid "Login or register using Twitter" +#. TRANS: Exception thrown when input from an inexpected socket is encountered. +msgid "Got input from unexpected socket!" msgstr "" +#. TRANS: Exception thrown when an invalid state is encountered in handleLine. +#. TRANS: %s is the invalid state. +#, php-format +msgid "Invalid state in handleLine: %s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response line is encountered. +#. TRANS: %s is the invalid line. +#, php-format +msgid "Invalid HTTP response line: %s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response line part is encountered. +#. TRANS: %1$s is the chunk, %2$s is the line. +#, php-format +msgid "Invalid HTTP response line chunk \"%1$s\": %2$s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response code is encountered. +#. TRANS: %1$s is the response code, %2$s is the line. +#, php-format +msgid "Bad HTTP response code %1$s: %2$s." +msgstr "" + +#. TRANS: Menu item in login navigation. +#. TRANS: Menu item in connection settings navigation. +msgctxt "MENU" +msgid "Twitter" +msgstr "تويتر" + +#. TRANS: Title for menu item in login navigation. +msgid "Login or register using Twitter." +msgstr "Ù„Ùج أو سجّل باستخدام تويتر." + +#. TRANS: Title for menu item in connection settings navigation. msgid "Twitter integration options" +msgstr "خيارات التكامل مع تويتر" + +#. TRANS: Menu item in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter" +msgstr "تويتر" + +#. TRANS: Menu item title in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter bridge configuration page." msgstr "" -msgid "Twitter bridge configuration" -msgstr "" - +#. TRANS: Plugin description. msgid "" "The Twitter \"bridge\" plugin allows integration of a StatusNet instance " "with Twitter." msgstr "" +#. TRANS: Client error displayed when trying to log in using Twitter while already logged in to StatusNet. msgid "Already logged in." msgstr "والج بالÙعل." +#. TRANS: Title for login using Twitter page. +msgctxt "TITLE" msgid "Twitter Login" -msgstr "" +msgstr "ولوج بتويتر" +#. TRANS: Instructions for login using Twitter page. msgid "Login with your Twitter account" -msgstr "" +msgstr "Ù„Ùج بحسابك على تويتر" +#. TRANS: Alternative text for "sign in with Twitter" image. msgid "Sign in with Twitter" -msgstr "" +msgstr "سجل دخولك بتويتر" #. TRANS: Mail subject after forwarding notices to Twitter has stopped working. msgid "Your Twitter bridge has been disabled" @@ -299,9 +430,18 @@ msgid "" "Regards,\n" "%3$s" msgstr "" +"مرحبًا يا %1$s. يؤسÙنا إخبارك أن ارتباطك بتويتر قد عÙطّل. يبدو أنه لم يعد يسمح " +"لنا بتحديث حالتك على تويتر. هل ألغيت السماح Ù„%3$sØŸ\n" +"\n" +"يمكنك إعادة تÙعيل جسر تويتر بزيارة صÙحة إعدادات تويتر:\n" +"\n" +"%2$s\n" +"\n" +"مع تحياتنا،\n" +"%3$s" #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. #, php-format msgid "RT @%1$s %2$s" -msgstr "" +msgstr "RT @%1$s %2$s" diff --git a/plugins/TwitterBridge/locale/br/LC_MESSAGES/TwitterBridge.po b/plugins/TwitterBridge/locale/br/LC_MESSAGES/TwitterBridge.po index 2bda5c3d9c..6961336677 100644 --- a/plugins/TwitterBridge/locale/br/LC_MESSAGES/TwitterBridge.po +++ b/plugins/TwitterBridge/locale/br/LC_MESSAGES/TwitterBridge.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TwitterBridge\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:44+0000\n" +"POT-Creation-Date: 2011-06-18 15:54+0000\n" +"PO-Revision-Date: 2011-06-18 15:57:55+0000\n" "Language-Team: Breton \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" +"X-POT-Import-Date: 2011-06-05 21:52:09+0000\n" +"X-Generator: MediaWiki 1.19alpha (r90318); Translate extension (2011-06-02)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: br\n" "X-Message-Group: #out-statusnet-plugin-twitterbridge\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Title for page with Twitter integration settings. msgid "Twitter settings" msgstr "Arventennoù Twitter" @@ -29,250 +30,382 @@ msgid "" "and vice-versa." msgstr "" +#. TRANS: Fieldset legend. msgid "Twitter account" msgstr "Kont Twitter" +#. TRANS: Form note when a Twitter account has been connected. msgid "Connected Twitter account" msgstr "" +#. TRANS: Fieldset legend. msgid "Disconnect my account from Twitter" msgstr "Digevreañ ma c'hont deus Twitter" -msgid "Disconnecting your Twitter could make it impossible to log in! Please " +#. TRANS: Form guide. %s is a URL to the password settings. +#. TRANS: This message contains a Markdown link in the form [description](link). +#, php-format +msgid "" +"Disconnecting your Twitter account could make it impossible to log in! " +"Please [set a password](%s) first." msgstr "" -msgid "set a password" -msgstr "Termeniñ ur ger-tremen" - -msgid " first." -msgstr "da gentañ." - -#. TRANS: %1$s is the current website name. +#. TRANS: Form instructions. %s is a URL to the password settings. +#. TRANS: %1$s is the StatusNet sitename. #, php-format msgid "" "Keep your %1$s account but disconnect from Twitter. You can use your %1$s " "password to log in." msgstr "" +#. TRANS: Button text for disconnecting a Twitter account. +#, fuzzy +msgctxt "BUTTON" msgid "Disconnect" msgstr "Digevreet" +#. TRANS: Fieldset legend. msgid "Preferences" msgstr "Penndibaboù" +#. TRANS: Checkbox label. msgid "Automatically send my notices to Twitter." msgstr "" +#. TRANS: Checkbox label. msgid "Send local \"@\" replies to Twitter." msgstr "" +#. TRANS: Checkbox label. msgid "Subscribe to my Twitter friends here." msgstr "" +#. TRANS: Checkbox label. msgid "Import my friends timeline." msgstr "" +#. TRANS: Button text for saving Twitter integration settings. +#. TRANS: Button text for saving the administrative Twitter bridge settings. +#, fuzzy +msgctxt "BUTTON" msgid "Save" msgstr "Enrollañ" +#. TRANS: Button text for adding Twitter integration. +#, fuzzy +msgctxt "BUTTON" msgid "Add" msgstr "Ouzhpennañ" +#. TRANS: Client error displayed when the session token does not match or is not given. msgid "There was a problem with your session token. Try again, please." msgstr "" +#. TRANS: Client error displayed when the submitted form contains unexpected data. msgid "Unexpected form submission." msgstr "" +#. TRANS: Client error displayed when trying to remove a connected Twitter account when there isn't one connected. msgid "No Twitter connection to remove." msgstr "" -msgid "Couldn't remove Twitter user." -msgstr "" +#. TRANS: Server error displayed when trying to remove a connected Twitter account fails. +#, fuzzy +msgid "Could not remove Twitter user." +msgstr "Kevreadenn gant ho kont Twitter" +#. TRANS: Success message displayed after disconnecting a Twitter account. msgid "Twitter account disconnected." msgstr "" -msgid "Couldn't save Twitter preferences." +#. TRANS: Server error displayed when saving Twitter integration preferences fails. +msgid "Could not save Twitter preferences." msgstr "" +#. TRANS: Success message after saving Twitter integration preferences. msgid "Twitter preferences saved." msgstr "" +#. TRANS: Form validation error displayed when the checkbox to agree to the license has not been checked. msgid "You cannot register if you do not agree to the license." msgstr "" +#. TRANS: Form validation error displayed when an unhandled error occurs. msgid "Something weird happened." msgstr "" +#. TRANS: Server error displayed when linking to a Twitter account fails. #, fuzzy msgid "Could not link your Twitter account." msgstr "Kevreadenn gant ho kont Twitter" -msgid "Couldn't link your Twitter account: oauth_token mismatch." -msgstr "" - -msgid "Couldn't link your Twitter account." -msgstr "" +#. TRANS: Server error displayed when linking to a Twitter account fails because of an incorrect oauth_token. +#, fuzzy +msgid "Could not link your Twitter account: oauth_token mismatch." +msgstr "Kevreadenn gant ho kont Twitter" +#. TRANS: Page instruction. %s is the StatusNet sitename. #, php-format msgid "" -"This is the first time you've logged into %s so we must connect your Twitter " -"account to a local account. You can either create a new account, or connect " -"with your existing account, if you have one." +"This is the first time you have logged into %s so we must connect your " +"Twitter account to a local account. You can either create a new account, or " +"connect with your existing account, if you have one." msgstr "" +#. TRANS: Page title. msgid "Twitter Account Setup" msgstr "" +#. TRANS: Fieldset legend. msgid "Connection options" msgstr "Dibarzhioù kevreañ" +#. TRANS: Text for license agreement checkbox. +#. TRANS: %s is the license as configured for the StatusNet site. #, php-format msgid "" "My text and files are available under %s except this private data: password, " "email address, IM address, and phone number." msgstr "" +#. TRANS: Fieldset legend. msgid "Create new account" msgstr "Krouiñ ur gont nevez" +#. TRANS: Sub form introduction text. msgid "Create a new user with this nickname." msgstr "Krouiñ un implijer nevez gant al lesanv-se." +#. TRANS: Field label. msgid "New nickname" msgstr "Lesanv nevez" +#. TRANS: Field title for nickname field. msgid "1-64 lowercase letters or numbers, no punctuation or spaces." msgstr "" +#. TRANS: Field label. msgctxt "LABEL" msgid "Email" msgstr "" +#. TRANS: Field title for e-mail address field. msgid "Used only for updates, announcements, and password recovery" msgstr "" +#. TRANS: Button text for creating a new StatusNet account in the Twitter connect page. +#, fuzzy +msgctxt "BUTTON" msgid "Create" msgstr "Krouiñ" +#. TRANS: Fieldset legend. msgid "Connect existing account" msgstr "Kevreañ d'ur gont a zo dioutañ" +#. TRANS: Sub form introduction text. msgid "" "If you already have an account, login with your username and password to " "connect it to your Twitter account." msgstr "" +#. TRANS: Field label. msgid "Existing nickname" msgstr "Lesanv a zo dioutañ" +#. TRANS: Field label. msgid "Password" msgstr "Ger-tremen" +#. TRANS: Button text for connecting an existing StatusNet account in the Twitter connect page.. +#, fuzzy +msgctxt "BUTTON" msgid "Connect" msgstr "Kevreañ" +#. TRANS: Client error displayed when trying to create a new user while creating new users is not allowed. msgid "Registration not allowed." msgstr "N'eo ket aotreet krouiñ kontoù." +#. TRANS: Client error displayed when trying to create a new user with an invalid invitation code. msgid "Not a valid invitation code." msgstr "" +#. TRANS: Client error displayed when trying to create a new user with an invalid username. msgid "Nickname not allowed." msgstr "Lesanv nann-aotreet." +#. TRANS: Client error displayed when trying to create a new user with a username that is already in use. msgid "Nickname already in use. Try another one." msgstr "Implijet eo dija al lesanv-se. Klaskit unan all." +#. TRANS: Server error displayed when creating a new user has failed. msgid "Error registering user." msgstr "" +#. TRANS: Server error displayed when connecting a user to a Twitter user has failed. +#. TRANS: Server error displayed connecting a user to a Twitter user has failed. msgid "Error connecting user to Twitter." msgstr "" +#. TRANS: Form validation error displayed when connecting an existing user to a Twitter user fails because +#. TRANS: the provided username and/or password are incorrect. msgid "Invalid username or password." msgstr "Anv implijer pe ger-tremen direizh." +#. TRANS: Page title for Twitter administration panel. +#, fuzzy +msgctxt "TITLE" msgid "Twitter" msgstr "Twitter" +#. TRANS: Instructions for Twitter bridge administration page. msgid "Twitter bridge settings" msgstr "" -msgid "Invalid consumer key. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer key is invalid because it is too long. +msgid "Invalid consumer key. Maximum length is 255 characters." msgstr "" -msgid "Invalid consumer secret. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer secret is invalid because it is too long. +msgid "Invalid consumer secret. Maximum length is 255 characters." msgstr "" +#. TRANS: Fieldset legend for Twitter application settings. msgid "Twitter application settings" msgstr "" +#. TRANS: Field label for Twitter assigned consumer key. msgid "Consumer key" msgstr "" -msgid "Consumer key assigned by Twitter" +#. TRANS: Field title for Twitter assigned consumer key. +msgid "The consumer key assigned by Twitter." msgstr "" +#. TRANS: Field label for Twitter assigned consumer secret. msgid "Consumer secret" msgstr "" -msgid "Consumer secret assigned by Twitter" +#. TRANS: Field title for Twitter assigned consumer secret. +msgid "The consumer secret assigned by Twitter." msgstr "" -msgid "Note: a global consumer key and secret are set." +#. TRANS: Form guide displayed when two required fields have already been provided. +msgid "Note: A global consumer key and secret are set." msgstr "" +#. TRANS: Field label for Twitter application name. msgid "Integration source" msgstr "" -msgid "Name of your Twitter application" -msgstr "" +#. TRANS: Field title for Twitter application name. +#, fuzzy +msgid "The name of your Twitter application." +msgstr "Kevreadenn gant ho kont Twitter" +#. TRANS: Fieldset legend for Twitter integration options. msgid "Options" msgstr "Dibarzhioù" +#. TRANS: Checkbox label for global setting. msgid "Enable \"Sign-in with Twitter\"" msgstr "" -msgid "Allow users to login with their Twitter credentials" +#. TRANS: Checkbox title. +msgid "This allow users to login with their Twitter credentials." msgstr "" +#. TRANS: Checkbox label for global setting. msgid "Enable Twitter import" msgstr "" +#. TRANS: Checkbox title for global setting. msgid "" "Allow users to import their Twitter friends' timelines. Requires daemons to " "be manually configured." msgstr "" -msgid "Save Twitter settings" +#. TRANS: Button title for saving the administrative Twitter bridge settings. +#, fuzzy +msgid "Save the Twitter bridge settings." msgstr "Enrollañ arventennoù Twitter" -msgid "Login or register using Twitter" +#. TRANS: Server exception thrown when an invalid URL scheme is detected. +msgid "Invalid URL scheme for HTTP stream reader." +msgstr "" + +#. TRANS: Exception thrown when input from an inexpected socket is encountered. +msgid "Got input from unexpected socket!" +msgstr "" + +#. TRANS: Exception thrown when an invalid state is encountered in handleLine. +#. TRANS: %s is the invalid state. +#, php-format +msgid "Invalid state in handleLine: %s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response line is encountered. +#. TRANS: %s is the invalid line. +#, php-format +msgid "Invalid HTTP response line: %s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response line part is encountered. +#. TRANS: %1$s is the chunk, %2$s is the line. +#, php-format +msgid "Invalid HTTP response line chunk \"%1$s\": %2$s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response code is encountered. +#. TRANS: %1$s is the response code, %2$s is the line. +#, php-format +msgid "Bad HTTP response code %1$s: %2$s." +msgstr "" + +#. TRANS: Menu item in login navigation. +#. TRANS: Menu item in connection settings navigation. +#, fuzzy +msgctxt "MENU" +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Title for menu item in login navigation. +#, fuzzy +msgid "Login or register using Twitter." msgstr "Kevreañ pe en em enskrivañ dre Twitter" +#. TRANS: Title for menu item in connection settings navigation. msgid "Twitter integration options" msgstr "Dibarzhioù enframmañ Twitter" +msgid "Twitter" +msgstr "Twitter" + msgid "Twitter bridge configuration" msgstr "" +#. TRANS: Plugin description. msgid "" "The Twitter \"bridge\" plugin allows integration of a StatusNet instance " "with Twitter." msgstr "" +#. TRANS: Client error displayed when trying to log in using Twitter while already logged in to StatusNet. msgid "Already logged in." msgstr "Kevreet oc'h dija." +#. TRANS: Title for login using Twitter page. +#, fuzzy +msgctxt "TITLE" msgid "Twitter Login" msgstr "Keveadenn Twitter" +#. TRANS: Instructions for login using Twitter page. msgid "Login with your Twitter account" msgstr "Kevreadenn gant ho kont Twitter" +#. TRANS: Alternative text for "sign in with Twitter" image. msgid "Sign in with Twitter" msgstr "Kevreañ gant Twitter" @@ -303,3 +436,9 @@ msgstr "" #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" + +#~ msgid "set a password" +#~ msgstr "Termeniñ ur ger-tremen" + +#~ msgid " first." +#~ msgstr "da gentañ." diff --git a/plugins/TwitterBridge/locale/ca/LC_MESSAGES/TwitterBridge.po b/plugins/TwitterBridge/locale/ca/LC_MESSAGES/TwitterBridge.po index 73335383eb..877ef039b3 100644 --- a/plugins/TwitterBridge/locale/ca/LC_MESSAGES/TwitterBridge.po +++ b/plugins/TwitterBridge/locale/ca/LC_MESSAGES/TwitterBridge.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TwitterBridge to Catalan (Català) +# Translation of StatusNet - TwitterBridge to Catalan (català) # Exported from translatewiki.net # # Author: Toniher @@ -9,21 +9,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TwitterBridge\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:44+0000\n" -"Language-Team: Catalan \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:20+0000\n" +"Language-Team: Catalan \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ca\n" "X-Message-Group: #out-statusnet-plugin-twitterbridge\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Title for page with Twitter integration settings. msgid "Twitter settings" msgstr "Paràmetres del Twitter" +#. TRANS: Instructions for page with Twitter integration settings. msgid "" "Connect your Twitter account to share your updates with your Twitter friends " "and vice-versa." @@ -31,27 +33,29 @@ msgstr "" "Connecteu el vostre compte del Twitter per compartir les vostres " "actualitzacions amb els vostres amics del Twitter i viceversa." +#. TRANS: Fieldset legend. msgid "Twitter account" msgstr "Compte del Twitter" +#. TRANS: Form note when a Twitter account has been connected. msgid "Connected Twitter account" msgstr "Compte del Twitter connectat" +#. TRANS: Fieldset legend. msgid "Disconnect my account from Twitter" msgstr "Desconnecta el meu compte del Twitter" -msgid "Disconnecting your Twitter could make it impossible to log in! Please " +#. TRANS: Form guide. %s is a URL to the password settings. +#. TRANS: This message contains a Markdown link in the form [description](link). +#, php-format +msgid "" +"Disconnecting your Twitter account could make it impossible to log in! " +"Please [set a password](%s) first." msgstr "" -"En desconnectar el vostre Twitter podeu impossibilitar que torneu a iniciar " -"una sessió! " +"En desconnectar el vostre Twitter podeu fer que no pogueu tornar a iniciar " +"una sessió! [Definiu-ne una contrasenya](%s) abans de res." -msgid "set a password" -msgstr "Definiu una contrasenya" - -msgid " first." -msgstr " primer." - -#. TRANS: %1$s is the current website name. +#. TRANS: Form instructions. %1$s is the StatusNet sitename. #, php-format msgid "" "Keep your %1$s account but disconnect from Twitter. You can use your %1$s " @@ -60,86 +64,166 @@ msgstr "" "Mantingueu el vostre compte %1$s, però desconnecteu-lo del Twitter. Podeu " "emprar la vostra contrasenya %1$s per iniciar una sessió." +#. TRANS: Button text for disconnecting a Twitter account. +msgctxt "BUTTON" msgid "Disconnect" msgstr "Desconnecta" +#. TRANS: Fieldset legend. msgid "Preferences" msgstr "Preferències" +#. TRANS: Checkbox label. msgid "Automatically send my notices to Twitter." msgstr "Envia automàticament els meus avisos al Twitter." +#. TRANS: Checkbox label. msgid "Send local \"@\" replies to Twitter." msgstr "Envia les respostes locals «@» al Twitter." +#. TRANS: Checkbox label. msgid "Subscribe to my Twitter friends here." msgstr "Subscriu els meus amics del Twitter aquí." +#. TRANS: Checkbox label. msgid "Import my friends timeline." msgstr "Importa la línia temporal d'amics." +#. TRANS: Button text for saving Twitter integration settings. +#. TRANS: Button text for saving the administrative Twitter bridge settings. +msgctxt "BUTTON" msgid "Save" msgstr "Desa" +#. TRANS: Button text for adding Twitter integration. +msgctxt "BUTTON" msgid "Add" msgstr "Afegeix" +#. TRANS: Client error displayed when the session token does not match or is not given. msgid "There was a problem with your session token. Try again, please." msgstr "" "S'ha produït un problema amb el vostre testimoni de sessió. Torneu-ho a " "provar." +#. TRANS: Client error displayed when the submitted form contains unexpected data. msgid "Unexpected form submission." msgstr "Enviament de formulari inesperat." +#. TRANS: Client error displayed when trying to remove a connected Twitter account when there isn't one connected. msgid "No Twitter connection to remove." msgstr "No hi ha cap connexió del Twitter a suprimir." -msgid "Couldn't remove Twitter user." -msgstr "No s'ha pogut suprimir l'usuari del Twitter." +#. TRANS: Server error displayed when trying to remove a connected Twitter account fails. +msgid "Could not remove Twitter user." +msgstr "No s'ha pogut eliminar l'usuari del Twitter." +#. TRANS: Success message displayed after disconnecting a Twitter account. msgid "Twitter account disconnected." msgstr "S'ha desconnectat el compte del Twitter." -msgid "Couldn't save Twitter preferences." +#. TRANS: Server error displayed when saving Twitter integration preferences fails. +msgid "Could not save Twitter preferences." msgstr "No s'han pogut desar les preferències del Twitter." +#. TRANS: Success message after saving Twitter integration preferences. msgid "Twitter preferences saved." msgstr "S'han desat les preferències del Twitter." +#. TRANS: Form validation error displayed when the checkbox to agree to the license has not been checked. msgid "You cannot register if you do not agree to the license." msgstr "No podeu registrar-vos-hi si no accepteu la llicència." +#. TRANS: Form validation error displayed when an unhandled error occurs. msgid "Something weird happened." msgstr "Ha passat quelcom estrany." +#. TRANS: Server error displayed when linking to a Twitter account fails. msgid "Could not link your Twitter account." msgstr "No s'ha pogut enllaçar amb el compte del Twitter." -msgid "Couldn't link your Twitter account: oauth_token mismatch." +#. TRANS: Server error displayed when linking to a Twitter account fails because of an incorrect oauth_token. +msgid "Could not link your Twitter account: oauth_token mismatch." msgstr "" -"No s'ha pogut enllaçar amb el vostre compte del Twitter: no coincidència de " -"l'oath_token." - -msgid "Couldn't link your Twitter account." -msgstr "No s'ha pogut enllaçar amb el compte del Twitter." +"No s'ha pogut enllaçar amb el vostre compte del Twitter: no hi ha " +"coincidència de l'oath_token." +#. TRANS: Page instruction. %s is the StatusNet sitename. #, php-format msgid "" -"This is the first time you've logged into %s so we must connect your Twitter " -"account to a local account. You can either create a new account, or connect " -"with your existing account, if you have one." +"This is the first time you have logged into %s so we must connect your " +"Twitter account to a local account. You can either create a new account, or " +"connect with your existing account, if you have one." msgstr "" "Aquesta és la primera vegada que inicieu una sessió a %s, per tant hem de " "connectar el vostre compte del Twitter al vostre compte local. Podeu crear " "un compte nou, o bé connectar-vos amb un compte ja existent si en teniu un." +#. TRANS: Page title. msgid "Twitter Account Setup" msgstr "Configuració del compte del Twitter" +#. TRANS: Fieldset legend. msgid "Connection options" msgstr "Opcions de connexió" +#. TRANS: Fieldset legend. +msgid "Create new account" +msgstr "Crea un compte nou" + +#. TRANS: Sub form introduction text. +msgid "Create a new user with this nickname." +msgstr "Crea un usuari nom amb aquest sobrenom." + +#. TRANS: Field label. +msgid "New nickname" +msgstr "Nou sobrenom" + +#. TRANS: Field title for nickname field. +msgid "1-64 lowercase letters or numbers, no punctuation or spaces." +msgstr "1-64 lletres en minúscules o nombres, sense puntuació o espais." + +#. TRANS: Field label. +msgctxt "LABEL" +msgid "Email" +msgstr "Correu electrònic" + +#. TRANS: Field title for e-mail address field. +msgid "Used only for updates, announcements, and password recovery" +msgstr "" +"S'utilitza per a actualitzacions, anuncis i per recuperar la contrasenya" + +#. TRANS: Button text for creating a new StatusNet account in the Twitter connect page. +msgctxt "BUTTON" +msgid "Create" +msgstr "Crea" + +#. TRANS: Fieldset legend. +msgid "Connect existing account" +msgstr "Connecta un compte ja existent" + +#. TRANS: Sub form introduction text. +msgid "" +"If you already have an account, login with your username and password to " +"connect it to your Twitter account." +msgstr "" +"Si ja teniu un compte, inicieu una sessió amb el vostre usuari i contrasenya " +"per connectar-lo al vostre compte del Twitter." + +#. TRANS: Field label. +msgid "Existing nickname" +msgstr "Sobrenom ja existent" + +#. TRANS: Field label. +msgid "Password" +msgstr "Contrasenya" + +#. TRANS: Fieldset legend. +msgid "License" +msgstr "Llicència" + +#. TRANS: Text for license agreement checkbox. +#. TRANS: %s is the license as configured for the StatusNet site. #, php-format msgid "" "My text and files are available under %s except this private data: password, " @@ -149,118 +233,108 @@ msgstr "" "dades privades: contrasenya, adreça de correu electrònic i MI, i número de " "telèfon." -msgid "Create new account" -msgstr "Crea un compte nou" - -msgid "Create a new user with this nickname." -msgstr "Crea un usuari nom amb aquest sobrenom." - -msgid "New nickname" -msgstr "Nou sobrenom" - -msgid "1-64 lowercase letters or numbers, no punctuation or spaces." -msgstr "1-64 lletres en minúscules o nombres, sense puntuació o espais." - -msgctxt "LABEL" -msgid "Email" -msgstr "Correu electrònic" - -msgid "Used only for updates, announcements, and password recovery" -msgstr "" -"S'utilitza per a actualitzacions, anuncis i per recuperar la contrasenya" - -msgid "Create" -msgstr "Crea" - -msgid "Connect existing account" -msgstr "Connecta un compte ja existent" - -msgid "" -"If you already have an account, login with your username and password to " -"connect it to your Twitter account." -msgstr "" -"Si ja teniu un compte, inicieu una sessió amb el vostre usuari i contrasenya " -"per connectar-lo al vostre compte del Twitter." - -msgid "Existing nickname" -msgstr "Sobrenom ja existent" - -msgid "Password" -msgstr "Contrasenya" - +#. TRANS: Button text for connecting an existing StatusNet account in the Twitter connect page.. +msgctxt "BUTTON" msgid "Connect" msgstr "Connecta" +#. TRANS: Client error displayed when trying to create a new user while creating new users is not allowed. msgid "Registration not allowed." msgstr "No es permet el registre." +#. TRANS: Client error displayed when trying to create a new user with an invalid invitation code. msgid "Not a valid invitation code." msgstr "No és un codi d'invitació vàlid." +#. TRANS: Client error displayed when trying to create a new user with an invalid username. msgid "Nickname not allowed." msgstr "El sobrenom no és permès." +#. TRANS: Client error displayed when trying to create a new user with a username that is already in use. msgid "Nickname already in use. Try another one." msgstr "El sobrenom ja és en ús. Proveu-ne un altre." +#. TRANS: Server error displayed when creating a new user has failed. msgid "Error registering user." msgstr "Error en registrar l'usuari." +#. TRANS: Server error displayed when connecting a user to a Twitter user has failed. +#. TRANS: Server error displayed connecting a user to a Twitter user has failed. msgid "Error connecting user to Twitter." msgstr "Error en connectar l'usuari al Twitter." +#. TRANS: Form validation error displayed when connecting an existing user to a Twitter user fails because +#. TRANS: the provided username and/or password are incorrect. msgid "Invalid username or password." msgstr "Nom d'usuari o contrasenya no vàlida." +#. TRANS: Page title for Twitter administration panel. +msgctxt "TITLE" msgid "Twitter" msgstr "Twitter" +#. TRANS: Instructions for Twitter bridge administration page. msgid "Twitter bridge settings" msgstr "Paràmetres del pont del Twitter" -msgid "Invalid consumer key. Max length is 255 characters." -msgstr "Clau de consumidor no vàlida. La llargada màxima és 255 caràcters." +#. TRANS: Client error displayed when a consumer key is invalid because it is too long. +msgid "Invalid consumer key. Maximum length is 255 characters." +msgstr "Clau de consumidor no vàlida. La longitud màxima és 255 caràcters." -msgid "Invalid consumer secret. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer secret is invalid because it is too long. +msgid "Invalid consumer secret. Maximum length is 255 characters." msgstr "" -"Clau secreta de consumidor no vàlida. La llargada màxima és 255 caràcters." +"Clau secreta de consumidor no vàlida. La longitud màxima és 255 caràcters." +#. TRANS: Fieldset legend for Twitter application settings. msgid "Twitter application settings" msgstr "Paràmetres de l'aplicació del Twitter" +#. TRANS: Field label for Twitter assigned consumer key. msgid "Consumer key" msgstr "Clau de consumidor" -msgid "Consumer key assigned by Twitter" -msgstr "Clau de consumidor assignada pel Twitter" +#. TRANS: Field title for Twitter assigned consumer key. +msgid "The consumer key assigned by Twitter." +msgstr "Clau de consumidor assignada pel Twitter." +#. TRANS: Field label for Twitter assigned consumer secret. msgid "Consumer secret" msgstr "Clau secreta de consumidor" -msgid "Consumer secret assigned by Twitter" -msgstr "Clau secreta de consumidor assignada pel Twitter" +#. TRANS: Field title for Twitter assigned consumer secret. +msgid "The consumer secret assigned by Twitter." +msgstr "Clau secreta de consumidor assignada pel Twitter." -msgid "Note: a global consumer key and secret are set." -msgstr "Nota: es defineixen una clau pública i secreta de consumidor." +#. TRANS: Form guide displayed when two required fields have already been provided. +msgid "Note: A global consumer key and secret are set." +msgstr "Nota: es defineix una clau pública i secreta de consumidor global." +#. TRANS: Field label for Twitter application name. msgid "Integration source" msgstr "Font d'integració" -msgid "Name of your Twitter application" -msgstr "Nom de la vostra aplicació del Twitter" +#. TRANS: Field title for Twitter application name. +msgid "The name of your Twitter application." +msgstr "El nom de la vostra aplicació del Twitter." +#. TRANS: Fieldset legend for Twitter integration options. msgid "Options" msgstr "Opcions" +#. TRANS: Checkbox label for global setting. msgid "Enable \"Sign-in with Twitter\"" msgstr "Habilita l'inici de sessió amb el Twitter" -msgid "Allow users to login with their Twitter credentials" -msgstr "Permet als usuaris iniciar una sessió amb les credencials del Twitter" +#. TRANS: Checkbox title. +msgid "This allow users to login with their Twitter credentials." +msgstr "Permet als usuaris iniciar una sessió amb les credencials del Twitter." +#. TRANS: Checkbox label for global setting. msgid "Enable Twitter import" msgstr "Habilita la importació del Twitter" +#. TRANS: Checkbox title for global setting. msgid "" "Allow users to import their Twitter friends' timelines. Requires daemons to " "be manually configured." @@ -268,18 +342,65 @@ msgstr "" "Permet als usuaris importar les línies temporals dels amics al Twitter. Cal " "que es configurin els dimonis manualment." -msgid "Save Twitter settings" -msgstr "Desa els paràmetres del Twitter" +#. TRANS: Button title for saving the administrative Twitter bridge settings. +msgid "Save the Twitter bridge settings." +msgstr "Desa els paràmetres del pont del Twitter." -msgid "Login or register using Twitter" -msgstr "Inicieu una sessió o registreu-vos fent servir el Twitter" +#. TRANS: Server exception thrown when an invalid URL scheme is detected. +msgid "Invalid URL scheme for HTTP stream reader." +msgstr "" +#. TRANS: Exception thrown when input from an inexpected socket is encountered. +msgid "Got input from unexpected socket!" +msgstr "" + +#. TRANS: Exception thrown when an invalid state is encountered in handleLine. +#. TRANS: %s is the invalid state. +#, php-format +msgid "Invalid state in handleLine: %s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response line is encountered. +#. TRANS: %s is the invalid line. +#, php-format +msgid "Invalid HTTP response line: %s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response line part is encountered. +#. TRANS: %1$s is the chunk, %2$s is the line. +#, php-format +msgid "Invalid HTTP response line chunk \"%1$s\": %2$s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response code is encountered. +#. TRANS: %1$s is the response code, %2$s is the line. +#, php-format +msgid "Bad HTTP response code %1$s: %2$s." +msgstr "" + +#. TRANS: Menu item in login navigation. +#. TRANS: Menu item in connection settings navigation. +msgctxt "MENU" +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Title for menu item in login navigation. +msgid "Login or register using Twitter." +msgstr "Inicieu una sessió o registreu-vos fent servir el Twitter." + +#. TRANS: Title for menu item in connection settings navigation. msgid "Twitter integration options" msgstr "Opcions d'integració del Twitter" -msgid "Twitter bridge configuration" -msgstr "Configuració del pont del Twitter" +#. TRANS: Menu item in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter" +msgstr "Twitter" +#. TRANS: Menu item title in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter bridge configuration page." +msgstr "Pàgina de configuració del pont del Twitter." + +#. TRANS: Plugin description. msgid "" "The Twitter \"bridge\" plugin allows integration of a StatusNet instance " "with Twitter." @@ -287,15 +408,20 @@ msgstr "" "El connector del pont del Twitter permet integrar una instància de " "l'StatusNet amb el Twitter." +#. TRANS: Client error displayed when trying to log in using Twitter while already logged in to StatusNet. msgid "Already logged in." msgstr "Ja heu iniciat una sessió." +#. TRANS: Title for login using Twitter page. +msgctxt "TITLE" msgid "Twitter Login" msgstr "Inici de sessió del Twitter" +#. TRANS: Instructions for login using Twitter page. msgid "Login with your Twitter account" msgstr "Inicieu una sessió amb el vostre compte del Twitter" +#. TRANS: Alternative text for "sign in with Twitter" image. msgid "Sign in with Twitter" msgstr "Inici de sessió amb el Twitter" diff --git a/plugins/TwitterBridge/locale/de/LC_MESSAGES/TwitterBridge.po b/plugins/TwitterBridge/locale/de/LC_MESSAGES/TwitterBridge.po index 30a1c8f4ca..0901de5ef7 100644 --- a/plugins/TwitterBridge/locale/de/LC_MESSAGES/TwitterBridge.po +++ b/plugins/TwitterBridge/locale/de/LC_MESSAGES/TwitterBridge.po @@ -1,10 +1,13 @@ # Translation of StatusNet - TwitterBridge to German (Deutsch) # Exported from translatewiki.net # +# Author: Alphakilo # Author: George Animal # Author: Giftpflanze # Author: Habi +# Author: Marcel083 # Author: Michael +# Author: Tiin # -- # This file is distributed under the same license as the StatusNet package. # @@ -12,21 +15,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TwitterBridge\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:44+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:20+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-twitterbridge\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Title for page with Twitter integration settings. msgid "Twitter settings" msgstr "Twittereinstellungen" +#. TRANS: Instructions for page with Twitter integration settings. msgid "" "Connect your Twitter account to share your updates with your Twitter friends " "and vice-versa." @@ -34,26 +39,29 @@ msgstr "" "Verbinde dein Twitterkonto, um deine Aktualisierungen mit Twitterfreunden " "und umgekehrt zu teilen." +#. TRANS: Fieldset legend. msgid "Twitter account" msgstr "Twitterkonto" +#. TRANS: Form note when a Twitter account has been connected. msgid "Connected Twitter account" msgstr "Verbundenes Twitterkonto" +#. TRANS: Fieldset legend. msgid "Disconnect my account from Twitter" msgstr "Trenne mein Konto von Twitter" -msgid "Disconnecting your Twitter could make it impossible to log in! Please " +#. TRANS: Form guide. %s is a URL to the password settings. +#. TRANS: This message contains a Markdown link in the form [description](link). +#, php-format +msgid "" +"Disconnecting your Twitter account could make it impossible to log in! " +"Please [set a password](%s) first." msgstr "" -"Die Trennung von Twitter könnte es unmöglich machen, sich anzumelden! Bitte " +"Die Trennung von deinem Twitterkonto könnte es unmöglich machen, sich " +"anzumelden! Bitte erst [ein Kennwort festlegen](%s)." -msgid "set a password" -msgstr "setze ein Passwort" - -msgid " first." -msgstr "bevor du das tust." - -#. TRANS: %1$s is the current website name. +#. TRANS: Form instructions. %1$s is the StatusNet sitename. #, php-format msgid "" "Keep your %1$s account but disconnect from Twitter. You can use your %1$s " @@ -62,86 +70,167 @@ msgstr "" "Behalte dein Konto auf %1$s, aber trenne von Twitter. Du kannst dein %1$s-" "Passwort benutzen, um dich anzumelden." +#. TRANS: Button text for disconnecting a Twitter account. +msgctxt "BUTTON" msgid "Disconnect" msgstr "Trennen" +#. TRANS: Fieldset legend. msgid "Preferences" msgstr "Einstellungen" +#. TRANS: Checkbox label. msgid "Automatically send my notices to Twitter." msgstr "Sende meine Nachrichten automatisch zu Twitter." +#. TRANS: Checkbox label. msgid "Send local \"@\" replies to Twitter." msgstr "Sende lokale @-Antworten zu Twitter." +#. TRANS: Checkbox label. msgid "Subscribe to my Twitter friends here." msgstr "Abonniere meine Twitterfreunde hier." +#. TRANS: Checkbox label. msgid "Import my friends timeline." msgstr "Importiere meine Freundezeitleiste." +#. TRANS: Button text for saving Twitter integration settings. +#. TRANS: Button text for saving the administrative Twitter bridge settings. +msgctxt "BUTTON" msgid "Save" msgstr "Speichern" +#. TRANS: Button text for adding Twitter integration. +msgctxt "BUTTON" msgid "Add" msgstr "Hinzufügen" +#. TRANS: Client error displayed when the session token does not match or is not given. msgid "There was a problem with your session token. Try again, please." msgstr "" "Es gab ein Problem mit deinem Sitzungstoken. Bitte noch einmal versuchen." +#. TRANS: Client error displayed when the submitted form contains unexpected data. msgid "Unexpected form submission." msgstr "Unerwartete Formulareingabe." +#. TRANS: Client error displayed when trying to remove a connected Twitter account when there isn't one connected. msgid "No Twitter connection to remove." msgstr "Keine Twitterverbindung zu entfernen." -msgid "Couldn't remove Twitter user." +#. TRANS: Server error displayed when trying to remove a connected Twitter account fails. +msgid "Could not remove Twitter user." msgstr "Konnte Twitterbenutzer nicht entfernen." +#. TRANS: Success message displayed after disconnecting a Twitter account. msgid "Twitter account disconnected." msgstr "Twitterkonto getrennt." -msgid "Couldn't save Twitter preferences." +#. TRANS: Server error displayed when saving Twitter integration preferences fails. +msgid "Could not save Twitter preferences." msgstr "Konnte Twittereinstellungen nicht speichern." +#. TRANS: Success message after saving Twitter integration preferences. msgid "Twitter preferences saved." msgstr "Twittereinstellungen gespeichert." +#. TRANS: Form validation error displayed when the checkbox to agree to the license has not been checked. msgid "You cannot register if you do not agree to the license." msgstr "Du kannst dich nicht registrieren, wenn du der Lizenz nicht zustimmst." +#. TRANS: Form validation error displayed when an unhandled error occurs. msgid "Something weird happened." msgstr "Etwas merkwürdiges ist passiert." +#. TRANS: Server error displayed when linking to a Twitter account fails. msgid "Could not link your Twitter account." msgstr "Konnte nicht mit deinem Twitterkonto verbinden." -msgid "Couldn't link your Twitter account: oauth_token mismatch." +#. TRANS: Server error displayed when linking to a Twitter account fails because of an incorrect oauth_token. +msgid "Could not link your Twitter account: oauth_token mismatch." msgstr "" "Konnte nicht mit deinem Twitterkonto verbinden: oauth_token passt nicht " "zusammen." -msgid "Couldn't link your Twitter account." -msgstr "Konnte dein Twitterkonto nicht verbinden." - +#. TRANS: Page instruction. %s is the StatusNet sitename. #, php-format msgid "" -"This is the first time you've logged into %s so we must connect your Twitter " -"account to a local account. You can either create a new account, or connect " -"with your existing account, if you have one." +"This is the first time you have logged into %s so we must connect your " +"Twitter account to a local account. You can either create a new account, or " +"connect with your existing account, if you have one." msgstr "" "Dies ist das erste Mal, dass du dich bei %s angemeldet hast, sodass wir dein " "Twitterkonto mit einem lokalen Konto verbinden müssen. Du kannst entweder " "ein neues Konto einrichten, oder mit einem bereits vorhandenen Konto " "verbinden, wenn du eines hast." +#. TRANS: Page title. msgid "Twitter Account Setup" msgstr "Einrichten des Twitterkontos" +#. TRANS: Fieldset legend. msgid "Connection options" msgstr "Verbindungsoptionen" +#. TRANS: Fieldset legend. +msgid "Create new account" +msgstr "Neues Konto erstellen" + +#. TRANS: Sub form introduction text. +msgid "Create a new user with this nickname." +msgstr "Erstelle einen neuen Benutzer mit diesem Namen." + +#. TRANS: Field label. +msgid "New nickname" +msgstr "Neuer Benutzername" + +#. TRANS: Field title for nickname field. +msgid "1-64 lowercase letters or numbers, no punctuation or spaces." +msgstr "" +"1–64 Kleinbuchstaben oder Ziffern, keine Interpunktion oder Leerzeichen." + +#. TRANS: Field label. +msgctxt "LABEL" +msgid "Email" +msgstr "E-Mail" + +#. TRANS: Field title for e-mail address field. +msgid "Used only for updates, announcements, and password recovery" +msgstr "" +"Nur für Updates, Bekanntmachungen und Passwortwiederherstellung verwendet" + +#. TRANS: Button text for creating a new StatusNet account in the Twitter connect page. +msgctxt "BUTTON" +msgid "Create" +msgstr "Erstellen" + +#. TRANS: Fieldset legend. +msgid "Connect existing account" +msgstr "Bereits vorhandenes Konto verbinden" + +#. TRANS: Sub form introduction text. +msgid "" +"If you already have an account, login with your username and password to " +"connect it to your Twitter account." +msgstr "" +"Wenn du bereits ein Konto hast, melde dich mit deinem Benutzernamen und " +"Passwort an um es mit deinem Twitterkonto zu verbinden." + +#. TRANS: Field label. +msgid "Existing nickname" +msgstr "Bereits vorhandener Benutzername" + +#. TRANS: Field label. +msgid "Password" +msgstr "Passwort" + +#. TRANS: Fieldset legend. +msgid "License" +msgstr "Lizenz" + +#. TRANS: Text for license agreement checkbox. +#. TRANS: %s is the license as configured for the StatusNet site. #, php-format msgid "" "My text and files are available under %s except this private data: password, " @@ -150,120 +239,109 @@ msgstr "" "Meine Daten, außer Passwort, E-Mail-Adresse, IM-Adresse und Telefonnummer, " "sind unter %s verfügbar." -msgid "Create new account" -msgstr "Neues Konto erstellen" - -msgid "Create a new user with this nickname." -msgstr "Erstelle einen neuen Benutzer mit diesem Namen." - -msgid "New nickname" -msgstr "Neuer Benutzername" - -msgid "1-64 lowercase letters or numbers, no punctuation or spaces." -msgstr "" -"1–64 Kleinbuchstaben oder Ziffern, keine Interpunktion oder Leerzeichen." - -msgctxt "LABEL" -msgid "Email" -msgstr "E-Mail" - -msgid "Used only for updates, announcements, and password recovery" -msgstr "" -"Nur für Updates, Bekanntmachungen und Passwortwiederherstellung verwendet" - -msgid "Create" -msgstr "Erstellen" - -msgid "Connect existing account" -msgstr "Bereits vorhandenes Konto verbinden" - -msgid "" -"If you already have an account, login with your username and password to " -"connect it to your Twitter account." -msgstr "" -"Wenn du bereits ein Konto hast, melde dich mit deinem Benutzernamen und " -"Passwort an um es mit deinem Twitterkonto zu verbinden." - -msgid "Existing nickname" -msgstr "Bereits vorhandener Benutzername" - -msgid "Password" -msgstr "Passwort" - +#. TRANS: Button text for connecting an existing StatusNet account in the Twitter connect page.. +msgctxt "BUTTON" msgid "Connect" msgstr "Verbinden" +#. TRANS: Client error displayed when trying to create a new user while creating new users is not allowed. msgid "Registration not allowed." msgstr "Registrierung nicht erlaubt." +#. TRANS: Client error displayed when trying to create a new user with an invalid invitation code. msgid "Not a valid invitation code." msgstr "Kein gültiger Einladungscode." +#. TRANS: Client error displayed when trying to create a new user with an invalid username. msgid "Nickname not allowed." msgstr "Benutzername nicht erlaubt." +#. TRANS: Client error displayed when trying to create a new user with a username that is already in use. msgid "Nickname already in use. Try another one." msgstr "Benutzername bereits in Verwendung. Versuche einen anderen." +#. TRANS: Server error displayed when creating a new user has failed. msgid "Error registering user." msgstr "Fehler bei der Benutzerregistrierung." +#. TRANS: Server error displayed when connecting a user to a Twitter user has failed. +#. TRANS: Server error displayed connecting a user to a Twitter user has failed. msgid "Error connecting user to Twitter." msgstr "Fehler bei der Verbindung des Benutzers zu Twitter." +#. TRANS: Form validation error displayed when connecting an existing user to a Twitter user fails because +#. TRANS: the provided username and/or password are incorrect. msgid "Invalid username or password." msgstr "Ungültiger Benutzername oder ungültiges Passwort." +#. TRANS: Page title for Twitter administration panel. +msgctxt "TITLE" msgid "Twitter" msgstr "Twitter" +#. TRANS: Instructions for Twitter bridge administration page. msgid "Twitter bridge settings" msgstr "Einstellungen für Twitterüberbrückung" -msgid "Invalid consumer key. Max length is 255 characters." -msgstr "Ungültiger Verbraucherschlüssel. Maximallänge beträgt 255 Zeichen." +#. TRANS: Client error displayed when a consumer key is invalid because it is too long. +msgid "Invalid consumer key. Maximum length is 255 characters." +msgstr "Ungültiger Verbraucherschlüssel. Maximale Länge beträgt 255 Zeichen." -msgid "Invalid consumer secret. Max length is 255 characters." -msgstr "Ungültiges Verbrauchergeheimnis. Maximallänge beträgt 255 Zeichen." +#. TRANS: Client error displayed when a consumer secret is invalid because it is too long. +msgid "Invalid consumer secret. Maximum length is 255 characters." +msgstr "Ungültiges Verbrauchergeheimnis. Maximale Länge beträgt 255 Zeichen." +#. TRANS: Fieldset legend for Twitter application settings. msgid "Twitter application settings" msgstr "Einstellungen für Twitteranwendung" +#. TRANS: Field label for Twitter assigned consumer key. msgid "Consumer key" msgstr "Verbraucherschlüssel" -msgid "Consumer key assigned by Twitter" -msgstr "Von Twitter vergebener Verbraucherschlüssel" +#. TRANS: Field title for Twitter assigned consumer key. +msgid "The consumer key assigned by Twitter." +msgstr "Von Twitter vergebener Verbraucherschlüssel." +#. TRANS: Field label for Twitter assigned consumer secret. msgid "Consumer secret" msgstr "Verbrauchergeheimnis" -msgid "Consumer secret assigned by Twitter" -msgstr "Von Twitter vergebenes Verbrauchergeheimnis" +#. TRANS: Field title for Twitter assigned consumer secret. +msgid "The consumer secret assigned by Twitter." +msgstr "Von Twitter vergebenes Verbrauchergeheimnis." -msgid "Note: a global consumer key and secret are set." +#. TRANS: Form guide displayed when two required fields have already been provided. +msgid "Note: A global consumer key and secret are set." msgstr "" -"Hinweis: Globaler Verbraucherschlüssel und globals Verbrauchergeheimnis " +"Hinweis: Globaler Verbraucherschlüssel und globales Verbrauchergeheimnis " "gesetzt." +#. TRANS: Field label for Twitter application name. msgid "Integration source" msgstr "Integrationsquelle" -msgid "Name of your Twitter application" -msgstr "Name deiner Twitteranwendung" +#. TRANS: Field title for Twitter application name. +msgid "The name of your Twitter application." +msgstr "Name deiner Twitteranwendung." +#. TRANS: Fieldset legend for Twitter integration options. msgid "Options" msgstr "Optionen" +#. TRANS: Checkbox label for global setting. msgid "Enable \"Sign-in with Twitter\"" msgstr "Ermögliche „Anmelden mit Twitter“" -msgid "Allow users to login with their Twitter credentials" -msgstr "Ermögliche Benutzern, sich mit ihren Twitteranmeldedaten anzumelden" +#. TRANS: Checkbox title. +msgid "This allow users to login with their Twitter credentials." +msgstr "Ermöglicht Benutzern, sich mit ihren Twitteranmeldedaten anzumelden." +#. TRANS: Checkbox label for global setting. msgid "Enable Twitter import" msgstr "Ermögliche Twitterimport" +#. TRANS: Checkbox title for global setting. msgid "" "Allow users to import their Twitter friends' timelines. Requires daemons to " "be manually configured." @@ -271,18 +349,65 @@ msgstr "" "Ermögliche Benutzern, ihre Twitterfreunde-Zeitleisten zu importieren. " "Erfordert, dass Dämons manuell konfiguriert werden." -msgid "Save Twitter settings" -msgstr "Speichere Twittereinstellungen" +#. TRANS: Button title for saving the administrative Twitter bridge settings. +msgid "Save the Twitter bridge settings." +msgstr "Einstellungen für Twitterüberbrückung speichern." -msgid "Login or register using Twitter" -msgstr "Anmeldung oder Registrierung, um Twitter zu benutzen" +#. TRANS: Server exception thrown when an invalid URL scheme is detected. +msgid "Invalid URL scheme for HTTP stream reader." +msgstr "Ungültiges URL-Schema für den HTTP-Stream-Reader." +#. TRANS: Exception thrown when input from an inexpected socket is encountered. +msgid "Got input from unexpected socket!" +msgstr "Eingabe erfolgte durch unerwarteten Socket" + +#. TRANS: Exception thrown when an invalid state is encountered in handleLine. +#. TRANS: %s is the invalid state. +#, php-format +msgid "Invalid state in handleLine: %s." +msgstr "Ungültiger Status der HandleZeile: %s." + +#. TRANS: Exception thrown when an invalid response line is encountered. +#. TRANS: %s is the invalid line. +#, php-format +msgid "Invalid HTTP response line: %s." +msgstr "Ungültige HTTP-Antwortzeile: %s." + +#. TRANS: Exception thrown when an invalid response line part is encountered. +#. TRANS: %1$s is the chunk, %2$s is the line. +#, php-format +msgid "Invalid HTTP response line chunk \"%1$s\": %2$s." +msgstr "Ungültiges HTTP-Antwortzeilenstück „%1$s“: %2$s." + +#. TRANS: Exception thrown when an invalid response code is encountered. +#. TRANS: %1$s is the response code, %2$s is the line. +#, php-format +msgid "Bad HTTP response code %1$s: %2$s." +msgstr "Falscher HTTP-Antwortcode %1$s: %2$s." + +#. TRANS: Menu item in login navigation. +#. TRANS: Menu item in connection settings navigation. +msgctxt "MENU" +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Title for menu item in login navigation. +msgid "Login or register using Twitter." +msgstr "Mit Twitter anmelden oder registrieren." + +#. TRANS: Title for menu item in connection settings navigation. msgid "Twitter integration options" msgstr "Twitterintegrationsoptionen" -msgid "Twitter bridge configuration" -msgstr "Konfiguration der Twitterüberbrückung" +#. TRANS: Menu item in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter" +msgstr "Twitter" +#. TRANS: Menu item title in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter bridge configuration page." +msgstr "Konfigurationsseite der Twitterüberbrückung." + +#. TRANS: Plugin description. msgid "" "The Twitter \"bridge\" plugin allows integration of a StatusNet instance " "with Twitter." @@ -290,15 +415,20 @@ msgstr "" "Das Twitterüberbrückungsplugin ermöglicht die Integration einer StatusNet-" "Instanz mit Twitter." +#. TRANS: Client error displayed when trying to log in using Twitter while already logged in to StatusNet. msgid "Already logged in." msgstr "Schon angemeldet." +#. TRANS: Title for login using Twitter page. +msgctxt "TITLE" msgid "Twitter Login" -msgstr "Twitter Login" +msgstr "Twitter-Login" +#. TRANS: Instructions for login using Twitter page. msgid "Login with your Twitter account" msgstr "Melden Sie sich mit Ihrem Twitter-Account an" +#. TRANS: Alternative text for "sign in with Twitter" image. msgid "Sign in with Twitter" msgstr "Mit Twitter anmelden" diff --git a/plugins/TwitterBridge/locale/es/LC_MESSAGES/TwitterBridge.po b/plugins/TwitterBridge/locale/es/LC_MESSAGES/TwitterBridge.po new file mode 100644 index 0000000000..9a2510273a --- /dev/null +++ b/plugins/TwitterBridge/locale/es/LC_MESSAGES/TwitterBridge.po @@ -0,0 +1,467 @@ +# Translation of StatusNet - TwitterBridge to Spanish (español) +# Exported from translatewiki.net +# +# Author: Armando-Martin +# Author: Peter17 +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - TwitterBridge\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:20+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:51:38+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Title for page with Twitter integration settings. +msgid "Twitter settings" +msgstr "Configuración de Twitter" + +#. TRANS: Instructions for page with Twitter integration settings. +msgid "" +"Connect your Twitter account to share your updates with your Twitter friends " +"and vice-versa." +msgstr "" +"Conecte su cuenta de Twitter para compartir sus actualizaciones con sus " +"amigos de Twitter y viceversa." + +#. TRANS: Fieldset legend. +msgid "Twitter account" +msgstr "Cuenta de Twitter" + +#. TRANS: Form note when a Twitter account has been connected. +msgid "Connected Twitter account" +msgstr "Cuenta de Twitter conectada" + +#. TRANS: Fieldset legend. +msgid "Disconnect my account from Twitter" +msgstr "Desconectar mi cuenta de Twitter" + +#. TRANS: Form guide. %s is a URL to the password settings. +#. TRANS: This message contains a Markdown link in the form [description](link). +#, php-format +msgid "" +"Disconnecting your Twitter account could make it impossible to log in! " +"Please [set a password](%s) first." +msgstr "" +"¡Si desconecta su cuenta de Twitter podría ser imposible iniciar sesión! Por " +"favor [establezca una contraseña] (%s) primero." + +#. TRANS: Form instructions. %1$s is the StatusNet sitename. +#, php-format +msgid "" +"Keep your %1$s account but disconnect from Twitter. You can use your %1$s " +"password to log in." +msgstr "" +"Mantener su cuenta %1$s pero desconectarse de Facebook. Puede usar su " +"contraseña %1$s para iniciar sesión." + +#. TRANS: Button text for disconnecting a Twitter account. +msgctxt "BUTTON" +msgid "Disconnect" +msgstr "Desconectarse" + +#. TRANS: Fieldset legend. +msgid "Preferences" +msgstr "Preferencias" + +#. TRANS: Checkbox label. +msgid "Automatically send my notices to Twitter." +msgstr "Enviar automáticamente mis mensajes a Twitter." + +#. TRANS: Checkbox label. +msgid "Send local \"@\" replies to Twitter." +msgstr "Enviar respuestas \"@\" locales a Twitter." + +#. TRANS: Checkbox label. +msgid "Subscribe to my Twitter friends here." +msgstr "Suscribirse a Mis amigos de Twitter aquí." + +#. TRANS: Checkbox label. +msgid "Import my friends timeline." +msgstr "Importar la agenda de mis amigos." + +#. TRANS: Button text for saving Twitter integration settings. +#. TRANS: Button text for saving the administrative Twitter bridge settings. +msgctxt "BUTTON" +msgid "Save" +msgstr "Guardar" + +#. TRANS: Button text for adding Twitter integration. +msgctxt "BUTTON" +msgid "Add" +msgstr "Añadir" + +#. TRANS: Client error displayed when the session token does not match or is not given. +msgid "There was a problem with your session token. Try again, please." +msgstr "" +"Hubo un problema con su clave (token) de sesión. Inténtelo de nuevo, por " +"favor." + +#. TRANS: Client error displayed when the submitted form contains unexpected data. +msgid "Unexpected form submission." +msgstr "Envío de formulario inesperado." + +#. TRANS: Client error displayed when trying to remove a connected Twitter account when there isn't one connected. +msgid "No Twitter connection to remove." +msgstr "No hay ninguna conexión de Twitter para eliminar." + +#. TRANS: Server error displayed when trying to remove a connected Twitter account fails. +msgid "Could not remove Twitter user." +msgstr "No se pudo eliminar el usuario de Twitter." + +#. TRANS: Success message displayed after disconnecting a Twitter account. +msgid "Twitter account disconnected." +msgstr "Cuenta de Twitter desconectada." + +#. TRANS: Server error displayed when saving Twitter integration preferences fails. +msgid "Could not save Twitter preferences." +msgstr "No se pudieron guardar las preferencias de Twitter." + +#. TRANS: Success message after saving Twitter integration preferences. +msgid "Twitter preferences saved." +msgstr "Preferencias de Twitter guardadas." + +#. TRANS: Form validation error displayed when the checkbox to agree to the license has not been checked. +msgid "You cannot register if you do not agree to the license." +msgstr "No puede registrarse si no acepta la licencia." + +#. TRANS: Form validation error displayed when an unhandled error occurs. +msgid "Something weird happened." +msgstr "Ocurrió algo extraño." + +#. TRANS: Server error displayed when linking to a Twitter account fails. +msgid "Could not link your Twitter account." +msgstr "No se pudo enlazar a su cuenta de Twitter." + +#. TRANS: Server error displayed when linking to a Twitter account fails because of an incorrect oauth_token. +msgid "Could not link your Twitter account: oauth_token mismatch." +msgstr "" +"No se pudo enlazar a su cuenta de Twitter: La clave oauth_token no coincide." + +#. TRANS: Page instruction. %s is the StatusNet sitename. +#, php-format +msgid "" +"This is the first time you have logged into %s so we must connect your " +"Twitter account to a local account. You can either create a new account, or " +"connect with your existing account, if you have one." +msgstr "" +"Esta es la primera vez que ha iniciado sesión en %s por lo que debemos " +"conectar su cuenta Twitter a una cuenta local. Puede crear una nueva cuenta " +"o conectarse con una cuenta existente si ya tiene una." + +#. TRANS: Page title. +msgid "Twitter Account Setup" +msgstr "Configuración de la cuenta de Twitter" + +#. TRANS: Fieldset legend. +msgid "Connection options" +msgstr "Opciones de conexión" + +#. TRANS: Fieldset legend. +msgid "Create new account" +msgstr "Crear nueva cuenta" + +#. TRANS: Sub form introduction text. +msgid "Create a new user with this nickname." +msgstr "Crear un nuevo usuario con este alias." + +#. TRANS: Field label. +msgid "New nickname" +msgstr "Nuevo alias" + +#. TRANS: Field title for nickname field. +msgid "1-64 lowercase letters or numbers, no punctuation or spaces." +msgstr "" +"De 1 a 64 letras en minúscula o números, sin signos de puntuación ni " +"espacios." + +#. TRANS: Field label. +msgctxt "LABEL" +msgid "Email" +msgstr "Correo electrónico" + +#. TRANS: Field title for e-mail address field. +msgid "Used only for updates, announcements, and password recovery" +msgstr "" +"Sólo se usa para actualizaciones, anuncios y recuperación de contraseñas" + +#. TRANS: Button text for creating a new StatusNet account in the Twitter connect page. +msgctxt "BUTTON" +msgid "Create" +msgstr "Crear" + +#. TRANS: Fieldset legend. +msgid "Connect existing account" +msgstr "Conectar a una cuenta existente" + +#. TRANS: Sub form introduction text. +msgid "" +"If you already have an account, login with your username and password to " +"connect it to your Twitter account." +msgstr "" +"Si ya tiene una cuenta, inicie sesión con su nombre de usuario y contraseña " +"para conectarse a su cuenta de Facebook." + +#. TRANS: Field label. +msgid "Existing nickname" +msgstr "Alias existente" + +#. TRANS: Field label. +msgid "Password" +msgstr "Contraseña" + +#. TRANS: Fieldset legend. +msgid "License" +msgstr "Licencia" + +#. TRANS: Text for license agreement checkbox. +#. TRANS: %s is the license as configured for the StatusNet site. +#, php-format +msgid "" +"My text and files are available under %s except this private data: password, " +"email address, IM address, and phone number." +msgstr "" +"Mi texto y archivos están disponibles bajo %s con excepción de esta " +"información privada: contraseña, dirección de correo electrónico, dirección " +"de mensajería instantánea IM y número de teléfono." + +#. TRANS: Button text for connecting an existing StatusNet account in the Twitter connect page.. +msgctxt "BUTTON" +msgid "Connect" +msgstr "Conectar" + +#. TRANS: Client error displayed when trying to create a new user while creating new users is not allowed. +msgid "Registration not allowed." +msgstr "Registro de usuario no permitido." + +#. TRANS: Client error displayed when trying to create a new user with an invalid invitation code. +msgid "Not a valid invitation code." +msgstr "No es un código de invitación válido." + +#. TRANS: Client error displayed when trying to create a new user with an invalid username. +msgid "Nickname not allowed." +msgstr "Alias no permitido." + +#. TRANS: Client error displayed when trying to create a new user with a username that is already in use. +msgid "Nickname already in use. Try another one." +msgstr "El alias ya existe. Pruebe con otro." + +#. TRANS: Server error displayed when creating a new user has failed. +msgid "Error registering user." +msgstr "Error al registrar el usuario." + +#. TRANS: Server error displayed when connecting a user to a Twitter user has failed. +#. TRANS: Server error displayed connecting a user to a Twitter user has failed. +msgid "Error connecting user to Twitter." +msgstr "Error al conectar el usuario a Twitter." + +#. TRANS: Form validation error displayed when connecting an existing user to a Twitter user fails because +#. TRANS: the provided username and/or password are incorrect. +msgid "Invalid username or password." +msgstr "Nombre de usuario o contraseña incorrectos." + +#. TRANS: Page title for Twitter administration panel. +msgctxt "TITLE" +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Instructions for Twitter bridge administration page. +msgid "Twitter bridge settings" +msgstr "Configuración de la pasarela a Twitter" + +#. TRANS: Client error displayed when a consumer key is invalid because it is too long. +msgid "Invalid consumer key. Maximum length is 255 characters." +msgstr "" +"Clave de consumidor no válida. La longitud máxima es de 255 caracteres." + +#. TRANS: Client error displayed when a consumer secret is invalid because it is too long. +msgid "Invalid consumer secret. Maximum length is 255 characters." +msgstr "" +"La frase secreta de consumidor es incorrecta. La longitud máxima es de 255 " +"caracteres." + +#. TRANS: Fieldset legend for Twitter application settings. +msgid "Twitter application settings" +msgstr "Configuración de la aplicación de Twitter" + +#. TRANS: Field label for Twitter assigned consumer key. +msgid "Consumer key" +msgstr "Clave de consumidor" + +#. TRANS: Field title for Twitter assigned consumer key. +msgid "The consumer key assigned by Twitter." +msgstr "La clave de consumidor asignada por Twitter." + +#. TRANS: Field label for Twitter assigned consumer secret. +msgid "Consumer secret" +msgstr "Frase secreta del consumidor" + +#. TRANS: Field title for Twitter assigned consumer secret. +msgid "The consumer secret assigned by Twitter." +msgstr "La frase secreta de consumidor asignada por Twitter." + +#. TRANS: Form guide displayed when two required fields have already been provided. +msgid "Note: A global consumer key and secret are set." +msgstr "Nota: Se establecen una clave y frase secreta de consumidor global." + +#. TRANS: Field label for Twitter application name. +msgid "Integration source" +msgstr "Fuente de integración" + +#. TRANS: Field title for Twitter application name. +msgid "The name of your Twitter application." +msgstr "El nombre de su aplicación de Twitter." + +#. TRANS: Fieldset legend for Twitter integration options. +msgid "Options" +msgstr "Opciones" + +#. TRANS: Checkbox label for global setting. +msgid "Enable \"Sign-in with Twitter\"" +msgstr "Habilitar \"Registrarse con Twitter\"" + +#. TRANS: Checkbox title. +msgid "This allow users to login with their Twitter credentials." +msgstr "" +"Esto permitir a los usuarios iniciar sesión con sus credenciales de Twitter." + +#. TRANS: Checkbox label for global setting. +msgid "Enable Twitter import" +msgstr "Activar la importación de Twitter" + +#. TRANS: Checkbox title for global setting. +msgid "" +"Allow users to import their Twitter friends' timelines. Requires daemons to " +"be manually configured." +msgstr "" +"Permitir a los usuarios importar agendas de sus amigos de Twitter. Requiere " +"configurar manualmente los servicios." + +#. TRANS: Button title for saving the administrative Twitter bridge settings. +msgid "Save the Twitter bridge settings." +msgstr "Guardar la configuración de la pasarela de Twitter." + +#. TRANS: Server exception thrown when an invalid URL scheme is detected. +msgid "Invalid URL scheme for HTTP stream reader." +msgstr "Esquema de URL no válido para lector de secuencia HTTP." + +#. TRANS: Exception thrown when input from an inexpected socket is encountered. +msgid "Got input from unexpected socket!" +msgstr "¡Recibió una entrada desde un conector (socket) inesperado!" + +#. TRANS: Exception thrown when an invalid state is encountered in handleLine. +#. TRANS: %s is the invalid state. +#, php-format +msgid "Invalid state in handleLine: %s." +msgstr "Estado no válido en handleLine: %s." + +#. TRANS: Exception thrown when an invalid response line is encountered. +#. TRANS: %s is the invalid line. +#, php-format +msgid "Invalid HTTP response line: %s." +msgstr "Línea de respuesta HTTP no válida: %s." + +#. TRANS: Exception thrown when an invalid response line part is encountered. +#. TRANS: %1$s is the chunk, %2$s is the line. +#, php-format +msgid "Invalid HTTP response line chunk \"%1$s\": %2$s." +msgstr "Fragmento de línea de respuesta HTTP no válido \"%1$s\": %2$s ." + +#. TRANS: Exception thrown when an invalid response code is encountered. +#. TRANS: %1$s is the response code, %2$s is the line. +#, php-format +msgid "Bad HTTP response code %1$s: %2$s." +msgstr "Código de respuesta HTTP erróneo %1$s: %2$s." + +#. TRANS: Menu item in login navigation. +#. TRANS: Menu item in connection settings navigation. +msgctxt "MENU" +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Title for menu item in login navigation. +msgid "Login or register using Twitter." +msgstr "Inicie sesión o regístrese mediante Twitter." + +#. TRANS: Title for menu item in connection settings navigation. +msgid "Twitter integration options" +msgstr "Opciones de integración de Twitter" + +#. TRANS: Menu item in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Menu item title in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter bridge configuration page." +msgstr "Página de configuración de la pasarela de Twitter." + +#. TRANS: Plugin description. +msgid "" +"The Twitter \"bridge\" plugin allows integration of a StatusNet instance " +"with Twitter." +msgstr "" +"El complemento (plugin) de \"pasarela\" de Twitter permite la integración de " +"una instancia de StatusNet con Twitter." + +#. TRANS: Client error displayed when trying to log in using Twitter while already logged in to StatusNet. +msgid "Already logged in." +msgstr "Ya has iniciado sesión" + +#. TRANS: Title for login using Twitter page. +msgctxt "TITLE" +msgid "Twitter Login" +msgstr "Inicio de sesión de Twitter" + +#. TRANS: Instructions for login using Twitter page. +msgid "Login with your Twitter account" +msgstr "Inicie sesión con su cuenta de Twitter" + +#. TRANS: Alternative text for "sign in with Twitter" image. +msgid "Sign in with Twitter" +msgstr "Registrarse con Twitter" + +#. TRANS: Mail subject after forwarding notices to Twitter has stopped working. +msgid "Your Twitter bridge has been disabled" +msgstr "Se ha deshabilitado su pasarela de Twitter" + +#. TRANS: Mail body after forwarding notices to Twitter has stopped working. +#. TRANS: %1$ is the name of the user the mail is sent to, %2$s is a URL to the +#. TRANS: Twitter settings, %3$s is the StatusNet sitename. +#, php-format +msgid "" +"Hi, %1$s. We're sorry to inform you that your link to Twitter has been " +"disabled. We no longer seem to have permission to update your Twitter " +"status. Did you maybe revoke %3$s's access?\n" +"\n" +"You can re-enable your Twitter bridge by visiting your Twitter settings " +"page:\n" +"\n" +"\t%2$s\n" +"\n" +"Regards,\n" +"%3$s" +msgstr "" +"Hola, %1$s. Lamentamos informarle de que su enlace a Twitter se ha " +"deshabilitado. Parece que ya no tenemos permiso para actualizar tu estado de " +"Twitter. ¿Tal vez ha revocado el acceso de %3$s?\n" +"\n" +"Puede volver a habilitar la pasarela de Twitter visitando la página de " +"configuración de Twitter:\n" +"\n" +"%2$s\n" +"\n" +"Saludos,\n" +"%3$s" + +#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. +#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. +#, php-format +msgid "RT @%1$s %2$s" +msgstr "RT @%1$s %2$s" diff --git a/plugins/TwitterBridge/locale/eu/LC_MESSAGES/TwitterBridge.po b/plugins/TwitterBridge/locale/eu/LC_MESSAGES/TwitterBridge.po new file mode 100644 index 0000000000..a8df3c9082 --- /dev/null +++ b/plugins/TwitterBridge/locale/eu/LC_MESSAGES/TwitterBridge.po @@ -0,0 +1,440 @@ +# Translation of StatusNet - TwitterBridge to Basque (euskara) +# Exported from translatewiki.net +# +# Author: Artsuaga +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - TwitterBridge\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:21+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:51:38+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Title for page with Twitter integration settings. +msgid "Twitter settings" +msgstr "Twitter aukerak" + +#. TRANS: Instructions for page with Twitter integration settings. +msgid "" +"Connect your Twitter account to share your updates with your Twitter friends " +"and vice-versa." +msgstr "" + +#. TRANS: Fieldset legend. +msgid "Twitter account" +msgstr "Twitter kontua" + +#. TRANS: Form note when a Twitter account has been connected. +msgid "Connected Twitter account" +msgstr "Kontektaturiko Twitter kontua" + +#. TRANS: Fieldset legend. +msgid "Disconnect my account from Twitter" +msgstr "Deskonektatu nere kontua Twitterretik" + +#. TRANS: Form guide. %s is a URL to the password settings. +#. TRANS: This message contains a Markdown link in the form [description](link). +#, php-format +msgid "" +"Disconnecting your Twitter account could make it impossible to log in! " +"Please [set a password](%s) first." +msgstr "" + +#. TRANS: Form instructions. %1$s is the StatusNet sitename. +#, php-format +msgid "" +"Keep your %1$s account but disconnect from Twitter. You can use your %1$s " +"password to log in." +msgstr "" +"Mantendu zure %1$s kontua baina Twitterretik deskonektatu. Zure %1$s " +"pasahitza erabiliko duzu saioa hasteko." + +#. TRANS: Button text for disconnecting a Twitter account. +msgctxt "BUTTON" +msgid "Disconnect" +msgstr "Eten." + +#. TRANS: Fieldset legend. +msgid "Preferences" +msgstr "Hobespenak" + +#. TRANS: Checkbox label. +msgid "Automatically send my notices to Twitter." +msgstr "Automatikoki bidali nere oharrak Twitterrera." + +#. TRANS: Checkbox label. +msgid "Send local \"@\" replies to Twitter." +msgstr "Bidali \"@\" lokalen erantzuntak Twitterrera." + +#. TRANS: Checkbox label. +msgid "Subscribe to my Twitter friends here." +msgstr "Harpidetu nere Twitter kontaktuetara hemen." + +#. TRANS: Checkbox label. +msgid "Import my friends timeline." +msgstr "Importatu nere lagunen denbora lerroa." + +#. TRANS: Button text for saving Twitter integration settings. +#. TRANS: Button text for saving the administrative Twitter bridge settings. +msgctxt "BUTTON" +msgid "Save" +msgstr "Gorde" + +#. TRANS: Button text for adding Twitter integration. +msgctxt "BUTTON" +msgid "Add" +msgstr "Gehitu" + +#. TRANS: Client error displayed when the session token does not match or is not given. +msgid "There was a problem with your session token. Try again, please." +msgstr "Zure saio tokenarekin arazo bat egon da. Saiatu berriro, mesedez." + +#. TRANS: Client error displayed when the submitted form contains unexpected data. +msgid "Unexpected form submission." +msgstr "Ustekabeko inprimaki bidalketa." + +#. TRANS: Client error displayed when trying to remove a connected Twitter account when there isn't one connected. +msgid "No Twitter connection to remove." +msgstr "Ez dago Twitter koneksiorik ezabatzeko." + +#. TRANS: Server error displayed when trying to remove a connected Twitter account fails. +msgid "Could not remove Twitter user." +msgstr "Ezin izan da Twitter erabiltzailea ezabatu." + +#. TRANS: Success message displayed after disconnecting a Twitter account. +msgid "Twitter account disconnected." +msgstr "Twitter kontua deskonektaturik." + +#. TRANS: Server error displayed when saving Twitter integration preferences fails. +msgid "Could not save Twitter preferences." +msgstr "Ezin izan dira Twitter hobespenak gorde." + +#. TRANS: Success message after saving Twitter integration preferences. +msgid "Twitter preferences saved." +msgstr "Twitter hobespenak gorderik." + +#. TRANS: Form validation error displayed when the checkbox to agree to the license has not been checked. +msgid "You cannot register if you do not agree to the license." +msgstr "Ezin duzu izenik eman ez bazaude lizentziarekin ados." + +#. TRANS: Form validation error displayed when an unhandled error occurs. +msgid "Something weird happened." +msgstr "Zerbait arraroa gertatu da." + +#. TRANS: Server error displayed when linking to a Twitter account fails. +msgid "Could not link your Twitter account." +msgstr "Ezin izan da zure Twitter kontua estekatu." + +#. TRANS: Server error displayed when linking to a Twitter account fails because of an incorrect oauth_token. +msgid "Could not link your Twitter account: oauth_token mismatch." +msgstr "Ezin izan da zure Twitter kontua estekatu: oauth_token doitugabea." + +#. TRANS: Page instruction. %s is the StatusNet sitename. +#, php-format +msgid "" +"This is the first time you have logged into %s so we must connect your " +"Twitter account to a local account. You can either create a new account, or " +"connect with your existing account, if you have one." +msgstr "" +"%s gunean sartzen zaren lehen aldia da, zure Twitter kontua kontu lokal " +"batekin lotuko dugu. Bestela kontu berri bat sor dezakezu, edo lehendik " +"beste kontu bat bazenuen, kontu harekin lotu." + +#. TRANS: Page title. +msgid "Twitter Account Setup" +msgstr "Twitter Kontu Kudeaketa" + +#. TRANS: Fieldset legend. +msgid "Connection options" +msgstr "Koneksio aukerak" + +#. TRANS: Fieldset legend. +msgid "Create new account" +msgstr "Sortu kontu berria" + +#. TRANS: Sub form introduction text. +msgid "Create a new user with this nickname." +msgstr "Sortu erabiltzaile berria goitizen honentzat." + +#. TRANS: Field label. +msgid "New nickname" +msgstr "Goitizen berria" + +#. TRANS: Field title for nickname field. +msgid "1-64 lowercase letters or numbers, no punctuation or spaces." +msgstr "1-64 letra xehe edo zenbaki, puntuazio edo espaziorik gabe." + +#. TRANS: Field label. +msgctxt "LABEL" +msgid "Email" +msgstr "Eposta" + +#. TRANS: Field title for e-mail address field. +msgid "Used only for updates, announcements, and password recovery" +msgstr "" +"Eguneraketetarako, iragarkietarako eta pasahitza berreskuratzeko soilik " +"erabiltzen da." + +#. TRANS: Button text for creating a new StatusNet account in the Twitter connect page. +msgctxt "BUTTON" +msgid "Create" +msgstr "Sortu" + +#. TRANS: Fieldset legend. +msgid "Connect existing account" +msgstr "Konektatu sortutako kontua" + +#. TRANS: Sub form introduction text. +msgid "" +"If you already have an account, login with your username and password to " +"connect it to your Twitter account." +msgstr "" +"Dagoeneko kontu bat baduzu, hasi saioa zure erabiltzaile eta pasahitzarekin " +"zure Twitterrera konektatzeko." + +#. TRANS: Field label. +msgid "Existing nickname" +msgstr "Goitizena existitzen da" + +#. TRANS: Field label. +msgid "Password" +msgstr "Pasahitza" + +#. TRANS: Fieldset legend. +msgid "License" +msgstr "Lizentzia" + +#. TRANS: Text for license agreement checkbox. +#. TRANS: %s is the license as configured for the StatusNet site. +#, php-format +msgid "" +"My text and files are available under %s except this private data: password, " +"email address, IM address, and phone number." +msgstr "" +"Nire testu eta fitxategiak %s lizentziapean daude, datu pribatu hauek izan " +"ezik: pasahitza, helbide elektronikoa, BM helbidea eta telefono zenbakia." + +#. TRANS: Button text for connecting an existing StatusNet account in the Twitter connect page.. +msgctxt "BUTTON" +msgid "Connect" +msgstr "Konektatu" + +#. TRANS: Client error displayed when trying to create a new user while creating new users is not allowed. +msgid "Registration not allowed." +msgstr "Erregistroa ez dago baimenduta." + +#. TRANS: Client error displayed when trying to create a new user with an invalid invitation code. +msgid "Not a valid invitation code." +msgstr "Gonbidapen kodea ez da baliozkoa." + +#. TRANS: Client error displayed when trying to create a new user with an invalid username. +msgid "Nickname not allowed." +msgstr "Goitizen hori ez da onartzen." + +#. TRANS: Client error displayed when trying to create a new user with a username that is already in use. +msgid "Nickname already in use. Try another one." +msgstr "Goitizen hori hartua dago. Saiatu beste batekin." + +#. TRANS: Server error displayed when creating a new user has failed. +msgid "Error registering user." +msgstr "Akatsa erabiltzailea erregistratzerakoan." + +#. TRANS: Server error displayed when connecting a user to a Twitter user has failed. +#. TRANS: Server error displayed connecting a user to a Twitter user has failed. +msgid "Error connecting user to Twitter." +msgstr "Akatsa erabiltzailea Twitterrera konektatzean." + +#. TRANS: Form validation error displayed when connecting an existing user to a Twitter user fails because +#. TRANS: the provided username and/or password are incorrect. +msgid "Invalid username or password." +msgstr "Baliogabeko erabiltzaile edo pasahitza." + +#. TRANS: Page title for Twitter administration panel. +msgctxt "TITLE" +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Instructions for Twitter bridge administration page. +msgid "Twitter bridge settings" +msgstr "Twitter bridge aukerak" + +#. TRANS: Client error displayed when a consumer key is invalid because it is too long. +msgid "Invalid consumer key. Maximum length is 255 characters." +msgstr "Kontsumitzaile gako okerra. Luzera maximoa 255 karakterekoa da." + +#. TRANS: Client error displayed when a consumer secret is invalid because it is too long. +msgid "Invalid consumer secret. Maximum length is 255 characters." +msgstr "Kontsumitzaile sekretu okerra. Luzera maximoa 255 karakterekoa da." + +#. TRANS: Fieldset legend for Twitter application settings. +msgid "Twitter application settings" +msgstr "Twitter aplikazio aukerak" + +#. TRANS: Field label for Twitter assigned consumer key. +msgid "Consumer key" +msgstr "Kontsumitzaile gakoa" + +#. TRANS: Field title for Twitter assigned consumer key. +msgid "The consumer key assigned by Twitter." +msgstr "Twitterrek emandako kontsumitzaile gakoa." + +#. TRANS: Field label for Twitter assigned consumer secret. +msgid "Consumer secret" +msgstr "Kontsumitzaile sekretua" + +#. TRANS: Field title for Twitter assigned consumer secret. +msgid "The consumer secret assigned by Twitter." +msgstr "Twitterrek emandako kontsumitzaile sekretua." + +#. TRANS: Form guide displayed when two required fields have already been provided. +msgid "Note: A global consumer key and secret are set." +msgstr "Oharra: kontsumitzaile gako eta sekretu orokorra ezarriak." + +#. TRANS: Field label for Twitter application name. +msgid "Integration source" +msgstr "Integrazio iturburua." + +#. TRANS: Field title for Twitter application name. +msgid "The name of your Twitter application." +msgstr "Zure Twitter aplikazioaren izena." + +#. TRANS: Fieldset legend for Twitter integration options. +msgid "Options" +msgstr "Hobespenak" + +#. TRANS: Checkbox label for global setting. +msgid "Enable \"Sign-in with Twitter\"" +msgstr "Gaitu \"Sartu Twitterrekin\"" + +#. TRANS: Checkbox title. +msgid "This allow users to login with their Twitter credentials." +msgstr "Twitterreko kontuarekin saio hasteko aukera ematen du." + +#. TRANS: Checkbox label for global setting. +msgid "Enable Twitter import" +msgstr "Gaitu Twitter inportazioa" + +#. TRANS: Checkbox title for global setting. +msgid "" +"Allow users to import their Twitter friends' timelines. Requires daemons to " +"be manually configured." +msgstr "" +"Twitterreko lagunen denbora-lerroak inportatzen uzten du. Daemonak " +"beharrezkoak eskuz konfiguratzeko." + +#. TRANS: Button title for saving the administrative Twitter bridge settings. +msgid "Save the Twitter bridge settings." +msgstr "Gorde Twitter bridge aukerak." + +#. TRANS: Server exception thrown when an invalid URL scheme is detected. +msgid "Invalid URL scheme for HTTP stream reader." +msgstr "URL amarru baliogabea HTTP jario irakurgailuarentzat." + +#. TRANS: Exception thrown when input from an inexpected socket is encountered. +msgid "Got input from unexpected socket!" +msgstr "" + +#. TRANS: Exception thrown when an invalid state is encountered in handleLine. +#. TRANS: %s is the invalid state. +#, php-format +msgid "Invalid state in handleLine: %s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response line is encountered. +#. TRANS: %s is the invalid line. +#, php-format +msgid "Invalid HTTP response line: %s." +msgstr "HTTP erantzun lerro baliogabea: %s." + +#. TRANS: Exception thrown when an invalid response line part is encountered. +#. TRANS: %1$s is the chunk, %2$s is the line. +#, php-format +msgid "Invalid HTTP response line chunk \"%1$s\": %2$s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response code is encountered. +#. TRANS: %1$s is the response code, %2$s is the line. +#, php-format +msgid "Bad HTTP response code %1$s: %2$s." +msgstr "HTTP erantzun okerraren kodea %1$s: %2$s." + +#. TRANS: Menu item in login navigation. +#. TRANS: Menu item in connection settings navigation. +msgctxt "MENU" +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Title for menu item in login navigation. +msgid "Login or register using Twitter." +msgstr "Saioa hasi edo erregistratu Twitter erabiliz." + +#. TRANS: Title for menu item in connection settings navigation. +msgid "Twitter integration options" +msgstr "Twitter integrazio aukerak" + +#. TRANS: Menu item in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Menu item title in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter bridge configuration page." +msgstr "Twitter bridge konfigurazio orria." + +#. TRANS: Plugin description. +msgid "" +"The Twitter \"bridge\" plugin allows integration of a StatusNet instance " +"with Twitter." +msgstr "" + +#. TRANS: Client error displayed when trying to log in using Twitter while already logged in to StatusNet. +msgid "Already logged in." +msgstr "Dagoeneko saioa hasita." + +#. TRANS: Title for login using Twitter page. +msgctxt "TITLE" +msgid "Twitter Login" +msgstr "Twitter Saio Hasera" + +#. TRANS: Instructions for login using Twitter page. +msgid "Login with your Twitter account" +msgstr "Saioa hasi zure Twitter kontuarekin" + +#. TRANS: Alternative text for "sign in with Twitter" image. +msgid "Sign in with Twitter" +msgstr "Erregistratu Twitterrekin" + +#. TRANS: Mail subject after forwarding notices to Twitter has stopped working. +msgid "Your Twitter bridge has been disabled" +msgstr "" + +#. TRANS: Mail body after forwarding notices to Twitter has stopped working. +#. TRANS: %1$ is the name of the user the mail is sent to, %2$s is a URL to the +#. TRANS: Twitter settings, %3$s is the StatusNet sitename. +#, php-format +msgid "" +"Hi, %1$s. We're sorry to inform you that your link to Twitter has been " +"disabled. We no longer seem to have permission to update your Twitter " +"status. Did you maybe revoke %3$s's access?\n" +"\n" +"You can re-enable your Twitter bridge by visiting your Twitter settings " +"page:\n" +"\n" +"\t%2$s\n" +"\n" +"Regards,\n" +"%3$s" +msgstr "" + +#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. +#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. +#, php-format +msgid "RT @%1$s %2$s" +msgstr "RT @%1$s %2$s" diff --git a/plugins/TwitterBridge/locale/fa/LC_MESSAGES/TwitterBridge.po b/plugins/TwitterBridge/locale/fa/LC_MESSAGES/TwitterBridge.po index 8b4a0dc343..94bfbec889 100644 --- a/plugins/TwitterBridge/locale/fa/LC_MESSAGES/TwitterBridge.po +++ b/plugins/TwitterBridge/locale/fa/LC_MESSAGES/TwitterBridge.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TwitterBridge\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:44+0000\n" +"POT-Creation-Date: 2011-06-18 15:54+0000\n" +"PO-Revision-Date: 2011-06-18 15:57:55+0000\n" "Language-Team: Persian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" +"X-POT-Import-Date: 2011-06-05 21:52:09+0000\n" +"X-Generator: MediaWiki 1.19alpha (r90318); Translate extension (2011-06-02)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: fa\n" "X-Message-Group: #out-statusnet-plugin-twitterbridge\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Title for page with Twitter integration settings. msgid "Twitter settings" msgstr "تنظیمات توییتر" @@ -29,250 +30,383 @@ msgid "" "and vice-versa." msgstr "" +#. TRANS: Fieldset legend. msgid "Twitter account" msgstr "حساب کاربری توییتر" +#. TRANS: Form note when a Twitter account has been connected. msgid "Connected Twitter account" msgstr "حساب کاربری توییتر متصل شد" +#. TRANS: Fieldset legend. msgid "Disconnect my account from Twitter" msgstr "قطع ارتباط حساب کاربری من از توییتر" -msgid "Disconnecting your Twitter could make it impossible to log in! Please " +#. TRANS: Form guide. %s is a URL to the password settings. +#. TRANS: This message contains a Markdown link in the form [description](link). +#, php-format +msgid "" +"Disconnecting your Twitter account could make it impossible to log in! " +"Please [set a password](%s) first." msgstr "" -msgid "set a password" -msgstr "تنظیم رمز عبور" - -msgid " first." -msgstr " ابتدا." - -#. TRANS: %1$s is the current website name. +#. TRANS: Form instructions. %s is a URL to the password settings. +#. TRANS: %1$s is the StatusNet sitename. #, php-format msgid "" "Keep your %1$s account but disconnect from Twitter. You can use your %1$s " "password to log in." msgstr "" +#. TRANS: Button text for disconnecting a Twitter account. +#, fuzzy +msgctxt "BUTTON" msgid "Disconnect" msgstr "قطع اتصال" +#. TRANS: Fieldset legend. msgid "Preferences" msgstr "ترجیحات" +#. TRANS: Checkbox label. msgid "Automatically send my notices to Twitter." msgstr "" +#. TRANS: Checkbox label. msgid "Send local \"@\" replies to Twitter." msgstr "" +#. TRANS: Checkbox label. msgid "Subscribe to my Twitter friends here." msgstr "" +#. TRANS: Checkbox label. msgid "Import my friends timeline." msgstr "" +#. TRANS: Button text for saving Twitter integration settings. +#. TRANS: Button text for saving the administrative Twitter bridge settings. +#, fuzzy +msgctxt "BUTTON" msgid "Save" msgstr "ذخیره" +#. TRANS: Button text for adding Twitter integration. +#, fuzzy +msgctxt "BUTTON" msgid "Add" msgstr "اÙزودن" +#. TRANS: Client error displayed when the session token does not match or is not given. msgid "There was a problem with your session token. Try again, please." msgstr "" +#. TRANS: Client error displayed when the submitted form contains unexpected data. msgid "Unexpected form submission." msgstr "" +#. TRANS: Client error displayed when trying to remove a connected Twitter account when there isn't one connected. msgid "No Twitter connection to remove." msgstr "هیچ ارتباط توییتری برای حذ٠وجود ندارد." -msgid "Couldn't remove Twitter user." +#. TRANS: Server error displayed when trying to remove a connected Twitter account fails. +#, fuzzy +msgid "Could not remove Twitter user." msgstr "نمی‌توان کاربر توییتر را حذ٠کرد." +#. TRANS: Success message displayed after disconnecting a Twitter account. msgid "Twitter account disconnected." msgstr "حساب توییتر قطع شده است." -msgid "Couldn't save Twitter preferences." +#. TRANS: Server error displayed when saving Twitter integration preferences fails. +#, fuzzy +msgid "Could not save Twitter preferences." msgstr "نمی‌توان ترجیحات توییتر را ذخیره کرد." +#. TRANS: Success message after saving Twitter integration preferences. msgid "Twitter preferences saved." msgstr "تنظیمات توییتر ذخیره شد." +#. TRANS: Form validation error displayed when the checkbox to agree to the license has not been checked. msgid "You cannot register if you do not agree to the license." msgstr "" +#. TRANS: Form validation error displayed when an unhandled error occurs. msgid "Something weird happened." msgstr "" +#. TRANS: Server error displayed when linking to a Twitter account fails. #, fuzzy msgid "Could not link your Twitter account." msgstr "حساب کاربری توییتر متصل شد" -msgid "Couldn't link your Twitter account: oauth_token mismatch." -msgstr "" - -msgid "Couldn't link your Twitter account." -msgstr "" +#. TRANS: Server error displayed when linking to a Twitter account fails because of an incorrect oauth_token. +#, fuzzy +msgid "Could not link your Twitter account: oauth_token mismatch." +msgstr "حساب کاربری توییتر متصل شد" +#. TRANS: Page instruction. %s is the StatusNet sitename. #, php-format msgid "" -"This is the first time you've logged into %s so we must connect your Twitter " -"account to a local account. You can either create a new account, or connect " -"with your existing account, if you have one." +"This is the first time you have logged into %s so we must connect your " +"Twitter account to a local account. You can either create a new account, or " +"connect with your existing account, if you have one." msgstr "" +#. TRANS: Page title. msgid "Twitter Account Setup" msgstr "تنظیم حساب کاربری توییتر" +#. TRANS: Fieldset legend. msgid "Connection options" msgstr "تنظیمات اتصال" +#. TRANS: Text for license agreement checkbox. +#. TRANS: %s is the license as configured for the StatusNet site. #, php-format msgid "" "My text and files are available under %s except this private data: password, " "email address, IM address, and phone number." msgstr "" +#. TRANS: Fieldset legend. msgid "Create new account" msgstr "ایجاد حساب کاربری جدید" +#. TRANS: Sub form introduction text. msgid "Create a new user with this nickname." msgstr "ایجاد یک کاربر جدید با این نام مستعار." +#. TRANS: Field label. msgid "New nickname" msgstr "نام مستعار جدید" +#. TRANS: Field title for nickname field. msgid "1-64 lowercase letters or numbers, no punctuation or spaces." msgstr "" +#. TRANS: Field label. msgctxt "LABEL" msgid "Email" msgstr "" +#. TRANS: Field title for e-mail address field. msgid "Used only for updates, announcements, and password recovery" msgstr "" +#. TRANS: Button text for creating a new StatusNet account in the Twitter connect page. +#, fuzzy +msgctxt "BUTTON" msgid "Create" msgstr "ایجاد" +#. TRANS: Fieldset legend. msgid "Connect existing account" msgstr "اتصال به حساب کاربری موجود" +#. TRANS: Sub form introduction text. msgid "" "If you already have an account, login with your username and password to " "connect it to your Twitter account." msgstr "" +#. TRANS: Field label. msgid "Existing nickname" msgstr "نام مستعار موجود" +#. TRANS: Field label. msgid "Password" msgstr "رمز عبور" +#. TRANS: Button text for connecting an existing StatusNet account in the Twitter connect page.. +#, fuzzy +msgctxt "BUTTON" msgid "Connect" msgstr "اتصال" +#. TRANS: Client error displayed when trying to create a new user while creating new users is not allowed. msgid "Registration not allowed." msgstr "اجازهٔ ثبت‌نام داده نشده است." +#. TRANS: Client error displayed when trying to create a new user with an invalid invitation code. msgid "Not a valid invitation code." msgstr "کد دعوت نامعتبر است." +#. TRANS: Client error displayed when trying to create a new user with an invalid username. msgid "Nickname not allowed." msgstr "نام مستعار مجاز نیست." +#. TRANS: Client error displayed when trying to create a new user with a username that is already in use. msgid "Nickname already in use. Try another one." msgstr "این نام مستعار در حال حاضر مورد استÙاده است. یکی دیگر را بیازمایید." +#. TRANS: Server error displayed when creating a new user has failed. msgid "Error registering user." msgstr "خطا در ثبت نام کاربر." +#. TRANS: Server error displayed when connecting a user to a Twitter user has failed. +#. TRANS: Server error displayed connecting a user to a Twitter user has failed. msgid "Error connecting user to Twitter." msgstr "خطا در اتصال کاربر به توییتر." +#. TRANS: Form validation error displayed when connecting an existing user to a Twitter user fails because +#. TRANS: the provided username and/or password are incorrect. msgid "Invalid username or password." msgstr "نام کاربری یا رمز عبور اشتباه است." +#. TRANS: Page title for Twitter administration panel. +#, fuzzy +msgctxt "TITLE" msgid "Twitter" msgstr "توییتر" +#. TRANS: Instructions for Twitter bridge administration page. msgid "Twitter bridge settings" msgstr "تنظیمات پل توییتر" -msgid "Invalid consumer key. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer key is invalid because it is too long. +msgid "Invalid consumer key. Maximum length is 255 characters." msgstr "" -msgid "Invalid consumer secret. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer secret is invalid because it is too long. +msgid "Invalid consumer secret. Maximum length is 255 characters." msgstr "" +#. TRANS: Fieldset legend for Twitter application settings. msgid "Twitter application settings" msgstr "" +#. TRANS: Field label for Twitter assigned consumer key. msgid "Consumer key" msgstr "" -msgid "Consumer key assigned by Twitter" +#. TRANS: Field title for Twitter assigned consumer key. +msgid "The consumer key assigned by Twitter." msgstr "" +#. TRANS: Field label for Twitter assigned consumer secret. msgid "Consumer secret" msgstr "" -msgid "Consumer secret assigned by Twitter" +#. TRANS: Field title for Twitter assigned consumer secret. +msgid "The consumer secret assigned by Twitter." msgstr "" -msgid "Note: a global consumer key and secret are set." +#. TRANS: Form guide displayed when two required fields have already been provided. +msgid "Note: A global consumer key and secret are set." msgstr "" +#. TRANS: Field label for Twitter application name. msgid "Integration source" msgstr "" -msgid "Name of your Twitter application" -msgstr "" +#. TRANS: Field title for Twitter application name. +#, fuzzy +msgid "The name of your Twitter application." +msgstr "حساب کاربری توییتر متصل شد" +#. TRANS: Fieldset legend for Twitter integration options. msgid "Options" msgstr "تنظیمات" +#. TRANS: Checkbox label for global setting. msgid "Enable \"Sign-in with Twitter\"" msgstr "" -msgid "Allow users to login with their Twitter credentials" +#. TRANS: Checkbox title. +msgid "This allow users to login with their Twitter credentials." msgstr "" +#. TRANS: Checkbox label for global setting. msgid "Enable Twitter import" msgstr "" +#. TRANS: Checkbox title for global setting. msgid "" "Allow users to import their Twitter friends' timelines. Requires daemons to " "be manually configured." msgstr "" -msgid "Save Twitter settings" -msgstr "ذخیره تنظیمات توییتر" +#. TRANS: Button title for saving the administrative Twitter bridge settings. +#, fuzzy +msgid "Save the Twitter bridge settings." +msgstr "تنظیمات پل توییتر" -msgid "Login or register using Twitter" +#. TRANS: Server exception thrown when an invalid URL scheme is detected. +msgid "Invalid URL scheme for HTTP stream reader." +msgstr "" + +#. TRANS: Exception thrown when input from an inexpected socket is encountered. +msgid "Got input from unexpected socket!" +msgstr "" + +#. TRANS: Exception thrown when an invalid state is encountered in handleLine. +#. TRANS: %s is the invalid state. +#, php-format +msgid "Invalid state in handleLine: %s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response line is encountered. +#. TRANS: %s is the invalid line. +#, php-format +msgid "Invalid HTTP response line: %s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response line part is encountered. +#. TRANS: %1$s is the chunk, %2$s is the line. +#, php-format +msgid "Invalid HTTP response line chunk \"%1$s\": %2$s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response code is encountered. +#. TRANS: %1$s is the response code, %2$s is the line. +#, php-format +msgid "Bad HTTP response code %1$s: %2$s." +msgstr "" + +#. TRANS: Menu item in login navigation. +#. TRANS: Menu item in connection settings navigation. +#, fuzzy +msgctxt "MENU" +msgid "Twitter" +msgstr "توییتر" + +#. TRANS: Title for menu item in login navigation. +#, fuzzy +msgid "Login or register using Twitter." msgstr "برای استÙاده از توییتر، وارد شوید یا ثبت نام کنید" +#. TRANS: Title for menu item in connection settings navigation. msgid "Twitter integration options" msgstr "تنظیمات پیوسته توییتر" +msgid "Twitter" +msgstr "توییتر" + msgid "Twitter bridge configuration" msgstr "پیکربندی پل توییتر" +#. TRANS: Plugin description. msgid "" "The Twitter \"bridge\" plugin allows integration of a StatusNet instance " "with Twitter." msgstr "" +#. TRANS: Client error displayed when trying to log in using Twitter while already logged in to StatusNet. msgid "Already logged in." msgstr "در حال حاضر وارد شده‌اید." +#. TRANS: Title for login using Twitter page. +#, fuzzy +msgctxt "TITLE" msgid "Twitter Login" msgstr "ورود به توییتر" +#. TRANS: Instructions for login using Twitter page. msgid "Login with your Twitter account" msgstr "" +#. TRANS: Alternative text for "sign in with Twitter" image. msgid "Sign in with Twitter" msgstr "با حساب کاربری توییتر وارد شوید" @@ -304,3 +438,12 @@ msgstr "" #, php-format msgid "RT @%1$s %2$s" msgstr "" + +#~ msgid "set a password" +#~ msgstr "تنظیم رمز عبور" + +#~ msgid " first." +#~ msgstr " ابتدا." + +#~ msgid "Save Twitter settings" +#~ msgstr "ذخیره تنظیمات توییتر" diff --git a/plugins/TwitterBridge/locale/fr/LC_MESSAGES/TwitterBridge.po b/plugins/TwitterBridge/locale/fr/LC_MESSAGES/TwitterBridge.po index 8e35417471..54ec84d3ca 100644 --- a/plugins/TwitterBridge/locale/fr/LC_MESSAGES/TwitterBridge.po +++ b/plugins/TwitterBridge/locale/fr/LC_MESSAGES/TwitterBridge.po @@ -1,8 +1,11 @@ -# Translation of StatusNet - TwitterBridge to French (Français) +# Translation of StatusNet - TwitterBridge to French (français) # Exported from translatewiki.net # +# Author: Gomoko # Author: Od1n # Author: Peter17 +# Author: Tititou36 +# Author: Valeryan 24 # Author: Verdy p # -- # This file is distributed under the same license as the StatusNet package. @@ -11,21 +14,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TwitterBridge\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:45+0000\n" -"Language-Team: French \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:21+0000\n" +"Language-Team: French \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-twitterbridge\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Title for page with Twitter integration settings. msgid "Twitter settings" msgstr "Paramètres Twitter" +#. TRANS: Instructions for page with Twitter integration settings. msgid "" "Connect your Twitter account to share your updates with your Twitter friends " "and vice-versa." @@ -33,27 +38,29 @@ msgstr "" "Connectez votre compte Twitter pour partager vos mises à jour avec vos amis " "Twitter et vice-versa." +#. TRANS: Fieldset legend. msgid "Twitter account" msgstr "Compte Twitter" +#. TRANS: Form note when a Twitter account has been connected. msgid "Connected Twitter account" msgstr "Compte Twitter connecté" +#. TRANS: Fieldset legend. msgid "Disconnect my account from Twitter" msgstr "Déconnecter mon compte de Twitter" -msgid "Disconnecting your Twitter could make it impossible to log in! Please " +#. TRANS: Form guide. %s is a URL to the password settings. +#. TRANS: This message contains a Markdown link in the form [description](link). +#, php-format +msgid "" +"Disconnecting your Twitter account could make it impossible to log in! " +"Please [set a password](%s) first." msgstr "" -"La déconnexion de votre compte Twitter ne vous permettrait plus de vous " -"connecter ! S’il vous plaît " +"Vous déconnecter de votre compte Twitter pourrait vous empêcher de vous " +"connecter! Veuillez d'abord [définir un mot de passe](%s)." -msgid "set a password" -msgstr "définissez un mot de passe" - -msgid " first." -msgstr " tout d’abord." - -#. TRANS: %1$s is the current website name. +#. TRANS: Form instructions. %1$s is the StatusNet sitename. #, php-format msgid "" "Keep your %1$s account but disconnect from Twitter. You can use your %1$s " @@ -62,87 +69,166 @@ msgstr "" "Gardez votre compte %1$s, mais déconnectez-vous de Twitter. Vous pouvez " "utiliser votre mot de passe %1$s pour vous connecter." +#. TRANS: Button text for disconnecting a Twitter account. +msgctxt "BUTTON" msgid "Disconnect" msgstr "Déconnecter" +#. TRANS: Fieldset legend. msgid "Preferences" msgstr "Préférences" +#. TRANS: Checkbox label. msgid "Automatically send my notices to Twitter." msgstr "Envoyer automatiquement mes avis sur Twitter." +#. TRANS: Checkbox label. msgid "Send local \"@\" replies to Twitter." msgstr "Envoyer des réponses \"@\" locales à Twitter." +#. TRANS: Checkbox label. msgid "Subscribe to my Twitter friends here." msgstr "S’abonner à mes amis Twitter ici." +#. TRANS: Checkbox label. msgid "Import my friends timeline." msgstr "Importer l’agenda de mes amis." +#. TRANS: Button text for saving Twitter integration settings. +#. TRANS: Button text for saving the administrative Twitter bridge settings. +msgctxt "BUTTON" msgid "Save" -msgstr "Sauvegarder" +msgstr "Enregistrer" +#. TRANS: Button text for adding Twitter integration. +msgctxt "BUTTON" msgid "Add" msgstr "Ajouter" +#. TRANS: Client error displayed when the session token does not match or is not given. msgid "There was a problem with your session token. Try again, please." msgstr "" "Un problème est survenu avec votre jeton de session. Veuillez essayer à " "nouveau." +#. TRANS: Client error displayed when the submitted form contains unexpected data. msgid "Unexpected form submission." msgstr "Soumission de formulaire inattendue." +#. TRANS: Client error displayed when trying to remove a connected Twitter account when there isn't one connected. msgid "No Twitter connection to remove." msgstr "Aucune connexion Twitter à retirer." -msgid "Couldn't remove Twitter user." +#. TRANS: Server error displayed when trying to remove a connected Twitter account fails. +msgid "Could not remove Twitter user." msgstr "Impossible de supprimer l’utilisateur Twitter." +#. TRANS: Success message displayed after disconnecting a Twitter account. msgid "Twitter account disconnected." msgstr "Compte Twitter déconnecté." -msgid "Couldn't save Twitter preferences." +#. TRANS: Server error displayed when saving Twitter integration preferences fails. +msgid "Could not save Twitter preferences." msgstr "Impossible de sauvegarder les préférences Twitter." +#. TRANS: Success message after saving Twitter integration preferences. msgid "Twitter preferences saved." msgstr "Préférences Twitter enregistrées." +#. TRANS: Form validation error displayed when the checkbox to agree to the license has not been checked. msgid "You cannot register if you do not agree to the license." msgstr "Vous ne pouvez pas vous inscrire si vous n’acceptez pas la licence." +#. TRANS: Form validation error displayed when an unhandled error occurs. msgid "Something weird happened." msgstr "Quelque chose de bizarre s’est passé." +#. TRANS: Server error displayed when linking to a Twitter account fails. msgid "Could not link your Twitter account." msgstr "Impossible de lier votre compte Twitter." -msgid "Couldn't link your Twitter account: oauth_token mismatch." +#. TRANS: Server error displayed when linking to a Twitter account fails because of an incorrect oauth_token. +msgid "Could not link your Twitter account: oauth_token mismatch." msgstr "" -"Impossible de lier votre compte Twitter : le jeton d’authentification ne " -"correspond pas." - -msgid "Couldn't link your Twitter account." -msgstr "Impossible de lier votre compte Twitter." +"Impossible de lier votre compte Twitter: oauth_token ne correspond pas." +#. TRANS: Page instruction. %s is the StatusNet sitename. #, php-format msgid "" -"This is the first time you've logged into %s so we must connect your Twitter " -"account to a local account. You can either create a new account, or connect " -"with your existing account, if you have one." +"This is the first time you have logged into %s so we must connect your " +"Twitter account to a local account. You can either create a new account, or " +"connect with your existing account, if you have one." msgstr "" -"C’est la première fois que vous êtes connecté à %s via Twitter, il nous faut " -"donc lier votre compte Twitter à un compte local. Vous pouvez soit créer un " -"nouveau compte, soit vous connecter avec votre compte local existant si vous " -"en avez un." +"C’est la première fois que vous êtes connecté sous %s, vous devez donc lier " +"votre compte Twitter à un compte local. Vous pouvez soit créer un nouveau " +"compte, soit vous connecter avec votre compte existant, si vous en avez un." +#. TRANS: Page title. msgid "Twitter Account Setup" msgstr "Configuration du compte Twitter" +#. TRANS: Fieldset legend. msgid "Connection options" msgstr "Options de connexion" +#. TRANS: Fieldset legend. +msgid "Create new account" +msgstr "Créer un nouveau compte" + +#. TRANS: Sub form introduction text. +msgid "Create a new user with this nickname." +msgstr "Créer un nouvel utilisateur avec ce pseudonyme." + +#. TRANS: Field label. +msgid "New nickname" +msgstr "Nouveau pseudonyme" + +#. TRANS: Field title for nickname field. +msgid "1-64 lowercase letters or numbers, no punctuation or spaces." +msgstr "1 à 64 lettres minuscules ou chiffres, sans ponctuation ni espaces." + +#. TRANS: Field label. +msgctxt "LABEL" +msgid "Email" +msgstr "Courriel" + +#. TRANS: Field title for e-mail address field. +msgid "Used only for updates, announcements, and password recovery" +msgstr "" +"Utilisé uniquement pour les mises à jour, les annonces, et la récupération " +"de mot de passe" + +#. TRANS: Button text for creating a new StatusNet account in the Twitter connect page. +msgctxt "BUTTON" +msgid "Create" +msgstr "Créer" + +#. TRANS: Fieldset legend. +msgid "Connect existing account" +msgstr "Se connecter à un compte existant" + +#. TRANS: Sub form introduction text. +msgid "" +"If you already have an account, login with your username and password to " +"connect it to your Twitter account." +msgstr "" +"Si vous avez déjà un compte ici, connectez-vous avec votre nom d’utilisateur " +"et mot de passe pour l’associer à votre compte Twitter." + +#. TRANS: Field label. +msgid "Existing nickname" +msgstr "Pseudonyme existant" + +#. TRANS: Field label. +msgid "Password" +msgstr "Mot de passe" + +#. TRANS: Fieldset legend. +msgid "License" +msgstr "Licence" + +#. TRANS: Text for license agreement checkbox. +#. TRANS: %s is the license as configured for the StatusNet site. #, php-format msgid "" "My text and files are available under %s except this private data: password, " @@ -152,120 +238,109 @@ msgstr "" "des données privées suivantes : mot de passe, adresse courriel, adresse de " "messagerie instantanée et numéro de téléphone." -msgid "Create new account" -msgstr "Créer un nouveau compte" - -msgid "Create a new user with this nickname." -msgstr "Créer un nouvel utilisateur avec ce pseudonyme." - -msgid "New nickname" -msgstr "Nouveau pseudonyme" - -msgid "1-64 lowercase letters or numbers, no punctuation or spaces." -msgstr "1 à 64 lettres minuscules ou chiffres, sans ponctuation ni espaces." - -msgctxt "LABEL" -msgid "Email" -msgstr "Courriel" - -msgid "Used only for updates, announcements, and password recovery" -msgstr "" -"Utilisé uniquement pour les mises à jour, les annonces, et la récupération " -"de mot de passe" - -msgid "Create" -msgstr "Créer" - -msgid "Connect existing account" -msgstr "Se connecter à un compte existant" - -msgid "" -"If you already have an account, login with your username and password to " -"connect it to your Twitter account." -msgstr "" -"Si vous avez déjà un compte ici, connectez-vous avec votre nom d’utilisateur " -"et mot de passe pour l’associer à votre compte Twitter." - -msgid "Existing nickname" -msgstr "Pseudonyme existant" - -msgid "Password" -msgstr "Mot de passe" - +#. TRANS: Button text for connecting an existing StatusNet account in the Twitter connect page.. +msgctxt "BUTTON" msgid "Connect" msgstr "Connexion" +#. TRANS: Client error displayed when trying to create a new user while creating new users is not allowed. msgid "Registration not allowed." msgstr "Inscription non autorisée." +#. TRANS: Client error displayed when trying to create a new user with an invalid invitation code. msgid "Not a valid invitation code." msgstr "Le code d’invitation n’est pas valide." +#. TRANS: Client error displayed when trying to create a new user with an invalid username. msgid "Nickname not allowed." msgstr "Pseudonyme non autorisé." +#. TRANS: Client error displayed when trying to create a new user with a username that is already in use. msgid "Nickname already in use. Try another one." msgstr "Pseudonyme déjà utilisé. Essayez-en un autre." +#. TRANS: Server error displayed when creating a new user has failed. msgid "Error registering user." msgstr "Erreur lors de l’inscription de l’utilisateur." +#. TRANS: Server error displayed when connecting a user to a Twitter user has failed. +#. TRANS: Server error displayed connecting a user to a Twitter user has failed. msgid "Error connecting user to Twitter." msgstr "Erreur de connexion de l’utilisateur à Twitter." +#. TRANS: Form validation error displayed when connecting an existing user to a Twitter user fails because +#. TRANS: the provided username and/or password are incorrect. msgid "Invalid username or password." msgstr "Nom d’utilisateur ou mot de passe incorrect." +#. TRANS: Page title for Twitter administration panel. +msgctxt "TITLE" msgid "Twitter" msgstr "Twitter" +#. TRANS: Instructions for Twitter bridge administration page. msgid "Twitter bridge settings" msgstr "Paramètres de la passerelle Twitter" -msgid "Invalid consumer key. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer key is invalid because it is too long. +msgid "Invalid consumer key. Maximum length is 255 characters." msgstr "Clé de client invalide. La longueur maximum est de 255 caractères." -msgid "Invalid consumer secret. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer secret is invalid because it is too long. +msgid "Invalid consumer secret. Maximum length is 255 characters." msgstr "" "Code secret du client invalide. La longueur maximum est de 255 caractères." +#. TRANS: Fieldset legend for Twitter application settings. msgid "Twitter application settings" msgstr "Paramètres de l’application Twitter" +#. TRANS: Field label for Twitter assigned consumer key. msgid "Consumer key" msgstr "Clé du client" -msgid "Consumer key assigned by Twitter" -msgstr "Clé du client assignée par Twitter" +#. TRANS: Field title for Twitter assigned consumer key. +msgid "The consumer key assigned by Twitter." +msgstr "La clé du client assignée par Twitter." +#. TRANS: Field label for Twitter assigned consumer secret. msgid "Consumer secret" msgstr "Code secret du client" -msgid "Consumer secret assigned by Twitter" -msgstr "Code secret du client assigné par Twitter" +#. TRANS: Field title for Twitter assigned consumer secret. +msgid "The consumer secret assigned by Twitter." +msgstr "Le code secret du client assigné par Twitter." -msgid "Note: a global consumer key and secret are set." -msgstr "Note : une clé et un code secret de client global sont définis." +#. TRANS: Form guide displayed when two required fields have already been provided. +msgid "Note: A global consumer key and secret are set." +msgstr "Note : Une clé globale et un code secret du client sont définis." +#. TRANS: Field label for Twitter application name. msgid "Integration source" msgstr "Source d’intégration" -msgid "Name of your Twitter application" -msgstr "Nom de votre application Twitter" +#. TRANS: Field title for Twitter application name. +msgid "The name of your Twitter application." +msgstr "Le nom de votre application Twitter." +#. TRANS: Fieldset legend for Twitter integration options. msgid "Options" msgstr "Options" +#. TRANS: Checkbox label for global setting. msgid "Enable \"Sign-in with Twitter\"" msgstr "Activer « S’inscrire avec Twitter »" -msgid "Allow users to login with their Twitter credentials" +#. TRANS: Checkbox title. +msgid "This allow users to login with their Twitter credentials." msgstr "" -"Permet aux utilisateurs de se connecter avec leurs identifiants Twitter" +"Cela permet aux utilisateurs de se connecter avec leurs identifiants Twitter." +#. TRANS: Checkbox label for global setting. msgid "Enable Twitter import" msgstr "Activer l’importation Twitter" +#. TRANS: Checkbox title for global setting. msgid "" "Allow users to import their Twitter friends' timelines. Requires daemons to " "be manually configured." @@ -273,18 +348,65 @@ msgstr "" "Permettre aux utilisateurs d’importer les agendas de leurs amis Twitter. " "Exige que les démons soient configurés manuellement." -msgid "Save Twitter settings" -msgstr "Sauvegarder les paramètres Twitter" +#. TRANS: Button title for saving the administrative Twitter bridge settings. +msgid "Save the Twitter bridge settings." +msgstr "Enregistrer les paramètres de la passerelle Twitter." -msgid "Login or register using Twitter" +#. TRANS: Server exception thrown when an invalid URL scheme is detected. +msgid "Invalid URL scheme for HTTP stream reader." +msgstr "Schéma d'URL non valide pour le lecteur de flux HTTP." + +#. TRANS: Exception thrown when input from an inexpected socket is encountered. +msgid "Got input from unexpected socket!" +msgstr "Entrée reçue d'une socket non attendue!" + +#. TRANS: Exception thrown when an invalid state is encountered in handleLine. +#. TRANS: %s is the invalid state. +#, php-format +msgid "Invalid state in handleLine: %s." +msgstr "État non valide dans handleLine: %s." + +#. TRANS: Exception thrown when an invalid response line is encountered. +#. TRANS: %s is the invalid line. +#, php-format +msgid "Invalid HTTP response line: %s." +msgstr "Ligne de réponse HTTP invalide: %s." + +#. TRANS: Exception thrown when an invalid response line part is encountered. +#. TRANS: %1$s is the chunk, %2$s is the line. +#, php-format +msgid "Invalid HTTP response line chunk \"%1$s\": %2$s." +msgstr "Partie de ligne de réponse HTTP invalide \"%1$s\": %2$s." + +#. TRANS: Exception thrown when an invalid response code is encountered. +#. TRANS: %1$s is the response code, %2$s is the line. +#, php-format +msgid "Bad HTTP response code %1$s: %2$s." +msgstr "Mauvais code de réponse HTTP %1$s : %2$s." + +#. TRANS: Menu item in login navigation. +#. TRANS: Menu item in connection settings navigation. +msgctxt "MENU" +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Title for menu item in login navigation. +msgid "Login or register using Twitter." msgstr "Se connecter ou s’inscrire via Twitter" +#. TRANS: Title for menu item in connection settings navigation. msgid "Twitter integration options" msgstr "Options d’intégration de Twitter" -msgid "Twitter bridge configuration" -msgstr "Configuration de la passerelle Twitter" +#. TRANS: Menu item in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter" +msgstr "Twitter" +#. TRANS: Menu item title in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter bridge configuration page." +msgstr "Page de configuration de la passerelle Twitter" + +#. TRANS: Plugin description. msgid "" "The Twitter \"bridge\" plugin allows integration of a StatusNet instance " "with Twitter." @@ -292,15 +414,20 @@ msgstr "" "Le greffon de « passerelle » Twitter permet l’intégration d’une instance de " "StatusNet avec Twitter." +#. TRANS: Client error displayed when trying to log in using Twitter while already logged in to StatusNet. msgid "Already logged in." msgstr "Déjà connecté." +#. TRANS: Title for login using Twitter page. +msgctxt "TITLE" msgid "Twitter Login" msgstr "Connexion Twitter" +#. TRANS: Instructions for login using Twitter page. msgid "Login with your Twitter account" msgstr "Connexion avec votre compte Twitter" +#. TRANS: Alternative text for "sign in with Twitter" image. msgid "Sign in with Twitter" msgstr "S’inscrire avec Twitter" diff --git a/plugins/TwitterBridge/locale/fur/LC_MESSAGES/TwitterBridge.po b/plugins/TwitterBridge/locale/fur/LC_MESSAGES/TwitterBridge.po index 7e60e731ff..8307c51c45 100644 --- a/plugins/TwitterBridge/locale/fur/LC_MESSAGES/TwitterBridge.po +++ b/plugins/TwitterBridge/locale/fur/LC_MESSAGES/TwitterBridge.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TwitterBridge to Friulian (Furlan) +# Translation of StatusNet - TwitterBridge to Friulian (furlan) # Exported from translatewiki.net # # Author: Klenje @@ -9,271 +9,397 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TwitterBridge\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:45+0000\n" -"Language-Team: Friulian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:21+0000\n" +"Language-Team: Friulian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fur\n" "X-Message-Group: #out-statusnet-plugin-twitterbridge\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Title for page with Twitter integration settings. msgid "Twitter settings" msgstr "Impuestazions di Twitter" +#. TRANS: Instructions for page with Twitter integration settings. msgid "" "Connect your Twitter account to share your updates with your Twitter friends " "and vice-versa." msgstr "" +#. TRANS: Fieldset legend. msgid "Twitter account" msgstr "Identitât su Twitter" +#. TRANS: Form note when a Twitter account has been connected. msgid "Connected Twitter account" msgstr "Identitât su Twitter conetude" +#. TRANS: Fieldset legend. msgid "Disconnect my account from Twitter" msgstr "" -msgid "Disconnecting your Twitter could make it impossible to log in! Please " +#. TRANS: Form guide. %s is a URL to the password settings. +#. TRANS: This message contains a Markdown link in the form [description](link). +#, php-format +msgid "" +"Disconnecting your Twitter account could make it impossible to log in! " +"Please [set a password](%s) first." msgstr "" -msgid "set a password" -msgstr "" - -msgid " first." -msgstr "" - -#. TRANS: %1$s is the current website name. +#. TRANS: Form instructions. %1$s is the StatusNet sitename. #, php-format msgid "" "Keep your %1$s account but disconnect from Twitter. You can use your %1$s " "password to log in." msgstr "" +#. TRANS: Button text for disconnecting a Twitter account. +msgctxt "BUTTON" msgid "Disconnect" msgstr "Disconetiti" +#. TRANS: Fieldset legend. msgid "Preferences" msgstr "Preferencis" +#. TRANS: Checkbox label. msgid "Automatically send my notices to Twitter." msgstr "Mande in automatic i miei avîs su Twitter." +#. TRANS: Checkbox label. msgid "Send local \"@\" replies to Twitter." msgstr "Mande lis rispuestis locâls cun \"@\" a Twitter." +#. TRANS: Checkbox label. msgid "Subscribe to my Twitter friends here." -msgstr "" +msgstr "Sotscrivimi culì ai miei amîs di Twitter." +#. TRANS: Checkbox label. msgid "Import my friends timeline." msgstr "Impuarte la ativitât dai miei amîs." +#. TRANS: Button text for saving Twitter integration settings. +#. TRANS: Button text for saving the administrative Twitter bridge settings. +msgctxt "BUTTON" msgid "Save" msgstr "Salve" +#. TRANS: Button text for adding Twitter integration. +msgctxt "BUTTON" msgid "Add" msgstr "Zonte" +#. TRANS: Client error displayed when the session token does not match or is not given. msgid "There was a problem with your session token. Try again, please." msgstr "" +#. TRANS: Client error displayed when the submitted form contains unexpected data. msgid "Unexpected form submission." msgstr "" +#. TRANS: Client error displayed when trying to remove a connected Twitter account when there isn't one connected. msgid "No Twitter connection to remove." msgstr "" -msgid "Couldn't remove Twitter user." +#. TRANS: Server error displayed when trying to remove a connected Twitter account fails. +msgid "Could not remove Twitter user." msgstr "" +#. TRANS: Success message displayed after disconnecting a Twitter account. msgid "Twitter account disconnected." msgstr "" -msgid "Couldn't save Twitter preferences." -msgstr "" +#. TRANS: Server error displayed when saving Twitter integration preferences fails. +msgid "Could not save Twitter preferences." +msgstr "No si à podût salvâ lis preferencis di Twitter." +#. TRANS: Success message after saving Twitter integration preferences. msgid "Twitter preferences saved." msgstr "Preferencis di Twitter salvadis." +#. TRANS: Form validation error displayed when the checkbox to agree to the license has not been checked. msgid "You cannot register if you do not agree to the license." msgstr "No tu puedis regjistrâti se no tu sês dacuardi cu la licence." +#. TRANS: Form validation error displayed when an unhandled error occurs. msgid "Something weird happened." msgstr "" +#. TRANS: Server error displayed when linking to a Twitter account fails. msgid "Could not link your Twitter account." msgstr "" -msgid "Couldn't link your Twitter account: oauth_token mismatch." -msgstr "" - -msgid "Couldn't link your Twitter account." +#. TRANS: Server error displayed when linking to a Twitter account fails because of an incorrect oauth_token. +msgid "Could not link your Twitter account: oauth_token mismatch." msgstr "" +#. TRANS: Page instruction. %s is the StatusNet sitename. #, php-format msgid "" -"This is the first time you've logged into %s so we must connect your Twitter " -"account to a local account. You can either create a new account, or connect " -"with your existing account, if you have one." +"This is the first time you have logged into %s so we must connect your " +"Twitter account to a local account. You can either create a new account, or " +"connect with your existing account, if you have one." msgstr "" +#. TRANS: Page title. msgid "Twitter Account Setup" msgstr "" +#. TRANS: Fieldset legend. msgid "Connection options" msgstr "Opzions di conession" +#. TRANS: Fieldset legend. +msgid "Create new account" +msgstr "Cree une gnove identitât" + +#. TRANS: Sub form introduction text. +msgid "Create a new user with this nickname." +msgstr "Cree un gnûf utent cun chest sorenon." + +#. TRANS: Field label. +msgid "New nickname" +msgstr "Gnûf sorenon" + +#. TRANS: Field title for nickname field. +msgid "1-64 lowercase letters or numbers, no punctuation or spaces." +msgstr "1-64 letaris minusculis o numars, cence segns di puntuazion o spazis." + +#. TRANS: Field label. +msgctxt "LABEL" +msgid "Email" +msgstr "Pueste eletroniche" + +#. TRANS: Field title for e-mail address field. +msgid "Used only for updates, announcements, and password recovery" +msgstr "Doprât dome par inzornaments, comunicazions e recupar de password.ì" + +#. TRANS: Button text for creating a new StatusNet account in the Twitter connect page. +msgctxt "BUTTON" +msgid "Create" +msgstr "Cree" + +#. TRANS: Fieldset legend. +msgid "Connect existing account" +msgstr "Conet une identitât che esist za" + +#. TRANS: Sub form introduction text. +msgid "" +"If you already have an account, login with your username and password to " +"connect it to your Twitter account." +msgstr "" + +#. TRANS: Field label. +msgid "Existing nickname" +msgstr "Sorenon esistint" + +#. TRANS: Field label. +msgid "Password" +msgstr "Password" + +#. TRANS: Fieldset legend. +msgid "License" +msgstr "" + +#. TRANS: Text for license agreement checkbox. +#. TRANS: %s is the license as configured for the StatusNet site. #, php-format msgid "" "My text and files are available under %s except this private data: password, " "email address, IM address, and phone number." msgstr "" -msgid "Create new account" -msgstr "Cree une gnove identitât" - -msgid "Create a new user with this nickname." -msgstr "Cree un gnûf utent cun chest sorenon." - -msgid "New nickname" -msgstr "Gnûf sorenon" - -msgid "1-64 lowercase letters or numbers, no punctuation or spaces." -msgstr "1-64 letaris minusculis o numars, cence segns di puntuazion o spazis." - -msgctxt "LABEL" -msgid "Email" -msgstr "Pueste eletroniche" - -msgid "Used only for updates, announcements, and password recovery" -msgstr "Doprât dome par inzornaments, comunicazions e recupar de password.ì" - -msgid "Create" -msgstr "Cree" - -msgid "Connect existing account" -msgstr "Conet une identitât che esist za" - -msgid "" -"If you already have an account, login with your username and password to " -"connect it to your Twitter account." -msgstr "" - -msgid "Existing nickname" -msgstr "Sorenon esistint" - -msgid "Password" -msgstr "Password" - +#. TRANS: Button text for connecting an existing StatusNet account in the Twitter connect page.. +msgctxt "BUTTON" msgid "Connect" msgstr "Conetiti" +#. TRANS: Client error displayed when trying to create a new user while creating new users is not allowed. msgid "Registration not allowed." msgstr "Regjistrazion no permitude." +#. TRANS: Client error displayed when trying to create a new user with an invalid invitation code. msgid "Not a valid invitation code." msgstr "" +#. TRANS: Client error displayed when trying to create a new user with an invalid username. msgid "Nickname not allowed." msgstr "Il sorenon nol è permetût." +#. TRANS: Client error displayed when trying to create a new user with a username that is already in use. msgid "Nickname already in use. Try another one." msgstr "Il sorenon al è za doprât. Provent un altri." +#. TRANS: Server error displayed when creating a new user has failed. msgid "Error registering user." msgstr "" +#. TRANS: Server error displayed when connecting a user to a Twitter user has failed. +#. TRANS: Server error displayed connecting a user to a Twitter user has failed. msgid "Error connecting user to Twitter." msgstr "" +#. TRANS: Form validation error displayed when connecting an existing user to a Twitter user fails because +#. TRANS: the provided username and/or password are incorrect. msgid "Invalid username or password." msgstr "Il non utent o la password no son valits." +#. TRANS: Page title for Twitter administration panel. +msgctxt "TITLE" msgid "Twitter" msgstr "Twitter" +#. TRANS: Instructions for Twitter bridge administration page. msgid "Twitter bridge settings" msgstr "" -msgid "Invalid consumer key. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer key is invalid because it is too long. +msgid "Invalid consumer key. Maximum length is 255 characters." msgstr "" -msgid "Invalid consumer secret. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer secret is invalid because it is too long. +msgid "Invalid consumer secret. Maximum length is 255 characters." msgstr "" +#. TRANS: Fieldset legend for Twitter application settings. msgid "Twitter application settings" msgstr "" +#. TRANS: Field label for Twitter assigned consumer key. msgid "Consumer key" msgstr "" -msgid "Consumer key assigned by Twitter" +#. TRANS: Field title for Twitter assigned consumer key. +msgid "The consumer key assigned by Twitter." msgstr "" +#. TRANS: Field label for Twitter assigned consumer secret. msgid "Consumer secret" msgstr "" -msgid "Consumer secret assigned by Twitter" +#. TRANS: Field title for Twitter assigned consumer secret. +msgid "The consumer secret assigned by Twitter." msgstr "" -msgid "Note: a global consumer key and secret are set." +#. TRANS: Form guide displayed when two required fields have already been provided. +msgid "Note: A global consumer key and secret are set." msgstr "" +#. TRANS: Field label for Twitter application name. msgid "Integration source" msgstr "" -msgid "Name of your Twitter application" +#. TRANS: Field title for Twitter application name. +msgid "The name of your Twitter application." msgstr "Non de tô aplicazion Twitter" +#. TRANS: Fieldset legend for Twitter integration options. msgid "Options" msgstr "Opzions" +#. TRANS: Checkbox label for global setting. msgid "Enable \"Sign-in with Twitter\"" msgstr "" -msgid "Allow users to login with their Twitter credentials" +#. TRANS: Checkbox title. +msgid "This allow users to login with their Twitter credentials." msgstr "" +#. TRANS: Checkbox label for global setting. msgid "Enable Twitter import" msgstr "" +#. TRANS: Checkbox title for global setting. msgid "" "Allow users to import their Twitter friends' timelines. Requires daemons to " "be manually configured." msgstr "" -msgid "Save Twitter settings" -msgstr "Salve lis impuestazions di Twitter" +#. TRANS: Button title for saving the administrative Twitter bridge settings. +msgid "Save the Twitter bridge settings." +msgstr "Salve lis impuestazions dal puint par Twitter." -msgid "Login or register using Twitter" +#. TRANS: Server exception thrown when an invalid URL scheme is detected. +msgid "Invalid URL scheme for HTTP stream reader." msgstr "" +#. TRANS: Exception thrown when input from an inexpected socket is encountered. +msgid "Got input from unexpected socket!" +msgstr "" + +#. TRANS: Exception thrown when an invalid state is encountered in handleLine. +#. TRANS: %s is the invalid state. +#, php-format +msgid "Invalid state in handleLine: %s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response line is encountered. +#. TRANS: %s is the invalid line. +#, php-format +msgid "Invalid HTTP response line: %s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response line part is encountered. +#. TRANS: %1$s is the chunk, %2$s is the line. +#, php-format +msgid "Invalid HTTP response line chunk \"%1$s\": %2$s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response code is encountered. +#. TRANS: %1$s is the response code, %2$s is the line. +#, php-format +msgid "Bad HTTP response code %1$s: %2$s." +msgstr "" + +#. TRANS: Menu item in login navigation. +#. TRANS: Menu item in connection settings navigation. +msgctxt "MENU" +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Title for menu item in login navigation. +msgid "Login or register using Twitter." +msgstr "Jentre o regjistriti doprant Twitter." + +#. TRANS: Title for menu item in connection settings navigation. msgid "Twitter integration options" msgstr "" -msgid "Twitter bridge configuration" +#. TRANS: Menu item in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Menu item title in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter bridge configuration page." msgstr "" +#. TRANS: Plugin description. msgid "" "The Twitter \"bridge\" plugin allows integration of a StatusNet instance " "with Twitter." msgstr "" +#. TRANS: Client error displayed when trying to log in using Twitter while already logged in to StatusNet. msgid "Already logged in." msgstr "Tu sês za jentrât." +#. TRANS: Title for login using Twitter page. +msgctxt "TITLE" msgid "Twitter Login" -msgstr "" +msgstr "Jentre su Twitter" +#. TRANS: Instructions for login using Twitter page. msgid "Login with your Twitter account" -msgstr "" +msgstr "Jentre cu la tô identitât su Twitter" +#. TRANS: Alternative text for "sign in with Twitter" image. msgid "Sign in with Twitter" -msgstr "" +msgstr "Jentre cun Twitter" #. TRANS: Mail subject after forwarding notices to Twitter has stopped working. msgid "Your Twitter bridge has been disabled" diff --git a/plugins/TwitterBridge/locale/gl/LC_MESSAGES/TwitterBridge.po b/plugins/TwitterBridge/locale/gl/LC_MESSAGES/TwitterBridge.po index c6fbbd1824..f3d2f73c51 100644 --- a/plugins/TwitterBridge/locale/gl/LC_MESSAGES/TwitterBridge.po +++ b/plugins/TwitterBridge/locale/gl/LC_MESSAGES/TwitterBridge.po @@ -1,5 +1,5 @@ -# Translation of StatusNet - TwitterBridge to Galician (Galego) -# Expored from translatewiki.net +# Translation of StatusNet - TwitterBridge to Galician (galego) +# Exported from translatewiki.net # # Author: Toliño # -- @@ -9,30 +9,431 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TwitterBridge\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-01-14 10:29+0000\n" -"PO-Revision-Date: 2011-01-14 10:34:14+0000\n" -"Language-Team: Galician \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:21+0000\n" +"Language-Team: Galician \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-01-10 18:27:23+0000\n" -"X-Generator: MediaWiki 1.18alpha (r80246); Translate extension (2010-09-17)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: gl\n" "X-Message-Group: #out-statusnet-plugin-twitterbridge\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. -#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: twitterimport.php:114 +#. TRANS: Title for page with Twitter integration settings. +msgid "Twitter settings" +msgstr "Configuración do Twitter" + +#. TRANS: Instructions for page with Twitter integration settings. +msgid "" +"Connect your Twitter account to share your updates with your Twitter friends " +"and vice-versa." +msgstr "" +"Conecte a súa conta do Twitter para compartir as súas actualizacións cos " +"seus amigos do Twitter e viceversa." + +#. TRANS: Fieldset legend. +msgid "Twitter account" +msgstr "Conta do Twitter" + +#. TRANS: Form note when a Twitter account has been connected. +msgid "Connected Twitter account" +msgstr "Conta do Twitter conectada" + +#. TRANS: Fieldset legend. +msgid "Disconnect my account from Twitter" +msgstr "Desconectar a miña conta do Twitter" + +#. TRANS: Form guide. %s is a URL to the password settings. +#. TRANS: This message contains a Markdown link in the form [description](link). #, php-format -msgid "RT @%1$s %2$s" +msgid "" +"Disconnecting your Twitter account could make it impossible to log in! " +"Please [set a password](%s) first." msgstr "" +"Ao desconectar o Twitter será imposible acceder ao sistema! [Defina un " +"contrasinal](%s) primeiro." -#: twitter.php:407 -msgid "Your Twitter bridge has been disabled." +#. TRANS: Form instructions. %1$s is the StatusNet sitename. +#, php-format +msgid "" +"Keep your %1$s account but disconnect from Twitter. You can use your %1$s " +"password to log in." msgstr "" +"Manter a conta de %1$s pero desconectala do Twitter. Agora usará o seu " +"contrasinal de %1$s para acceder ao sistema." -#: twitter.php:411 +#. TRANS: Button text for disconnecting a Twitter account. +msgctxt "BUTTON" +msgid "Disconnect" +msgstr "Desconectarse" + +#. TRANS: Fieldset legend. +msgid "Preferences" +msgstr "Preferencias" + +#. TRANS: Checkbox label. +msgid "Automatically send my notices to Twitter." +msgstr "Enviar automaticamente as notas ao Twitter." + +#. TRANS: Checkbox label. +msgid "Send local \"@\" replies to Twitter." +msgstr "Enviar as respostas \"@\" locais ao Twitter." + +#. TRANS: Checkbox label. +msgid "Subscribe to my Twitter friends here." +msgstr "Subscribirse aos amigos do Twitter aquí." + +#. TRANS: Checkbox label. +msgid "Import my friends timeline." +msgstr "Importar a liña do tempo dos amigos." + +#. TRANS: Button text for saving Twitter integration settings. +#. TRANS: Button text for saving the administrative Twitter bridge settings. +msgctxt "BUTTON" +msgid "Save" +msgstr "Gardar" + +#. TRANS: Button text for adding Twitter integration. +msgctxt "BUTTON" +msgid "Add" +msgstr "Engadir" + +#. TRANS: Client error displayed when the session token does not match or is not given. +msgid "There was a problem with your session token. Try again, please." +msgstr "Houbo un erro co seu pase. Inténteo de novo." + +#. TRANS: Client error displayed when the submitted form contains unexpected data. +msgid "Unexpected form submission." +msgstr "Envío de formulario inesperado." + +#. TRANS: Client error displayed when trying to remove a connected Twitter account when there isn't one connected. +msgid "No Twitter connection to remove." +msgstr "Non hai ningunha conexión ao Twitter que eliminar." + +#. TRANS: Server error displayed when trying to remove a connected Twitter account fails. +msgid "Could not remove Twitter user." +msgstr "Non se puido eliminar o usuario do Twitter." + +#. TRANS: Success message displayed after disconnecting a Twitter account. +msgid "Twitter account disconnected." +msgstr "Conta do Twitter desconectada." + +#. TRANS: Server error displayed when saving Twitter integration preferences fails. +msgid "Could not save Twitter preferences." +msgstr "Non se puideron gardar as preferencias do Twitter." + +#. TRANS: Success message after saving Twitter integration preferences. +msgid "Twitter preferences saved." +msgstr "Gardáronse as preferencias do Twitter." + +#. TRANS: Form validation error displayed when the checkbox to agree to the license has not been checked. +msgid "You cannot register if you do not agree to the license." +msgstr "Non pode rexistrarse se non acepta a licenza." + +#. TRANS: Form validation error displayed when an unhandled error occurs. +msgid "Something weird happened." +msgstr "Ocorreu algo estraño." + +#. TRANS: Server error displayed when linking to a Twitter account fails. +msgid "Could not link your Twitter account." +msgstr "Non se puido ligar a súa conta do Twitter." + +#. TRANS: Server error displayed when linking to a Twitter account fails because of an incorrect oauth_token. +msgid "Could not link your Twitter account: oauth_token mismatch." +msgstr "" +"Non se puido ligar a súa conta do Twitter: O pase de autenticación " +"oauth_token non coincide." + +#. TRANS: Page instruction. %s is the StatusNet sitename. +#, php-format +msgid "" +"This is the first time you have logged into %s so we must connect your " +"Twitter account to a local account. You can either create a new account, or " +"connect with your existing account, if you have one." +msgstr "" +"Esta é a primeira vez que accede ao sistema de %s, de modo que debemos " +"conectar a súa conta do Twitter cunha conta local. Pode crear unha nova " +"conta local ou ben conectar con outra conta local existente." + +#. TRANS: Page title. +msgid "Twitter Account Setup" +msgstr "Configuración da conta do Twitter" + +#. TRANS: Fieldset legend. +msgid "Connection options" +msgstr "Opcións de conexión" + +#. TRANS: Fieldset legend. +msgid "Create new account" +msgstr "Crear unha conta nova" + +#. TRANS: Sub form introduction text. +msgid "Create a new user with this nickname." +msgstr "Crear un novo usuario con este alcume." + +#. TRANS: Field label. +msgid "New nickname" +msgstr "Novo alcume" + +#. TRANS: Field title for nickname field. +msgid "1-64 lowercase letters or numbers, no punctuation or spaces." +msgstr "" +"Entre 1 e 64 letras minúsculas ou números, sen signos de puntuación, " +"espazos, tiles ou eñes." + +#. TRANS: Field label. +msgctxt "LABEL" +msgid "Email" +msgstr "Correo electrónico" + +#. TRANS: Field title for e-mail address field. +msgid "Used only for updates, announcements, and password recovery" +msgstr "" +"Só se utiliza para actualizacións, anuncios e recuperación de contrasinais" + +#. TRANS: Button text for creating a new StatusNet account in the Twitter connect page. +msgctxt "BUTTON" +msgid "Create" +msgstr "Crear" + +#. TRANS: Fieldset legend. +msgid "Connect existing account" +msgstr "Conectar cunha conta existente" + +#. TRANS: Sub form introduction text. +msgid "" +"If you already have an account, login with your username and password to " +"connect it to your Twitter account." +msgstr "" +"Se xa ten unha conta, acceda ao sistema co seu nome de usuario e contrasinal " +"para conectala coa do Twitter." + +#. TRANS: Field label. +msgid "Existing nickname" +msgstr "Alcume existente" + +#. TRANS: Field label. +msgid "Password" +msgstr "Contrasinal" + +#. TRANS: Fieldset legend. +msgid "License" +msgstr "Licenza" + +#. TRANS: Text for license agreement checkbox. +#. TRANS: %s is the license as configured for the StatusNet site. +#, php-format +msgid "" +"My text and files are available under %s except this private data: password, " +"email address, IM address, and phone number." +msgstr "" +"Os meus textos e ficheiros están dispoñibles baixo %s, salvo os seguintes " +"datos privados: contrasinais, enderezos de correo electrónico e mensaxería " +"instantánea e números de teléfono." + +#. TRANS: Button text for connecting an existing StatusNet account in the Twitter connect page.. +msgctxt "BUTTON" +msgid "Connect" +msgstr "Conectar" + +#. TRANS: Client error displayed when trying to create a new user while creating new users is not allowed. +msgid "Registration not allowed." +msgstr "Non se permite o rexistro." + +#. TRANS: Client error displayed when trying to create a new user with an invalid invitation code. +msgid "Not a valid invitation code." +msgstr "O código da invitación é incorrecto." + +#. TRANS: Client error displayed when trying to create a new user with an invalid username. +msgid "Nickname not allowed." +msgstr "Alcume non permitido." + +#. TRANS: Client error displayed when trying to create a new user with a username that is already in use. +msgid "Nickname already in use. Try another one." +msgstr "Ese alcume xa está en uso. Probe con outro." + +#. TRANS: Server error displayed when creating a new user has failed. +msgid "Error registering user." +msgstr "Erro ao rexistrar o usuario." + +#. TRANS: Server error displayed when connecting a user to a Twitter user has failed. +#. TRANS: Server error displayed connecting a user to a Twitter user has failed. +msgid "Error connecting user to Twitter." +msgstr "Erro ao conectar o usuario co Twitter." + +#. TRANS: Form validation error displayed when connecting an existing user to a Twitter user fails because +#. TRANS: the provided username and/or password are incorrect. +msgid "Invalid username or password." +msgstr "O nome de usuario ou contrasinal non son correctos." + +#. TRANS: Page title for Twitter administration panel. +msgctxt "TITLE" +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Instructions for Twitter bridge administration page. +msgid "Twitter bridge settings" +msgstr "Configuración da ponte ata o Twitter" + +#. TRANS: Client error displayed when a consumer key is invalid because it is too long. +msgid "Invalid consumer key. Maximum length is 255 characters." +msgstr "" +"Clave de consumidor incorrecta. A extensión máxima é de 255 caracteres." + +#. TRANS: Client error displayed when a consumer secret is invalid because it is too long. +msgid "Invalid consumer secret. Maximum length is 255 characters." +msgstr "" +"Frase secreta de consumidor incorrecta. A extensión máxima é de 255 " +"caracteres." + +#. TRANS: Fieldset legend for Twitter application settings. +msgid "Twitter application settings" +msgstr "Configuración da aplicación do Twitter" + +#. TRANS: Field label for Twitter assigned consumer key. +msgid "Consumer key" +msgstr "Clave do consumidor" + +#. TRANS: Field title for Twitter assigned consumer key. +msgid "The consumer key assigned by Twitter." +msgstr "A clave de consumidor asignada polo Twitter." + +#. TRANS: Field label for Twitter assigned consumer secret. +msgid "Consumer secret" +msgstr "Pregunta secreta do consumidor" + +#. TRANS: Field title for Twitter assigned consumer secret. +msgid "The consumer secret assigned by Twitter." +msgstr "A pregunta secreta do consumidor asignada polo Twitter." + +#. TRANS: Form guide displayed when two required fields have already been provided. +msgid "Note: A global consumer key and secret are set." +msgstr "Nota: Están definidas a clave e a pregunta secreta de consumidor." + +#. TRANS: Field label for Twitter application name. +msgid "Integration source" +msgstr "Fonte de integración" + +#. TRANS: Field title for Twitter application name. +msgid "The name of your Twitter application." +msgstr "O nome da súa aplicación do Twitter." + +#. TRANS: Fieldset legend for Twitter integration options. +msgid "Options" +msgstr "Opcións" + +#. TRANS: Checkbox label for global setting. +msgid "Enable \"Sign-in with Twitter\"" +msgstr "Activar \"Rexistrarse co Twitter\"" + +#. TRANS: Checkbox title. +msgid "This allow users to login with their Twitter credentials." +msgstr "Isto permite aos usuarios rexistrarse coas credenciais do Twitter." + +#. TRANS: Checkbox label for global setting. +msgid "Enable Twitter import" +msgstr "Activar a importación desde o Twitter" + +#. TRANS: Checkbox title for global setting. +msgid "" +"Allow users to import their Twitter friends' timelines. Requires daemons to " +"be manually configured." +msgstr "" +"Permitir aos usuarios importar as liñas do tempo dos amigos do Twitter. " +"Cómpre configurar manualmente os servizos." + +#. TRANS: Button title for saving the administrative Twitter bridge settings. +msgid "Save the Twitter bridge settings." +msgstr "Gardar a configuración da ponte ata o Twitter." + +#. TRANS: Server exception thrown when an invalid URL scheme is detected. +msgid "Invalid URL scheme for HTTP stream reader." +msgstr "Esquema de URL inválido para o lector de fluxo HTTP." + +#. TRANS: Exception thrown when input from an inexpected socket is encountered. +msgid "Got input from unexpected socket!" +msgstr "Recibiuse unha entrada desde un conectador non esperado!" + +#. TRANS: Exception thrown when an invalid state is encountered in handleLine. +#. TRANS: %s is the invalid state. +#, php-format +msgid "Invalid state in handleLine: %s." +msgstr "Estado inválido en handleLine: %s." + +#. TRANS: Exception thrown when an invalid response line is encountered. +#. TRANS: %s is the invalid line. +#, php-format +msgid "Invalid HTTP response line: %s." +msgstr "Liña de resposta HTTP inválida: %s." + +#. TRANS: Exception thrown when an invalid response line part is encountered. +#. TRANS: %1$s is the chunk, %2$s is the line. +#, php-format +msgid "Invalid HTTP response line chunk \"%1$s\": %2$s." +msgstr "Fragmento de liña de resposta HTTP inválido \"%1$s\": %2$s." + +#. TRANS: Exception thrown when an invalid response code is encountered. +#. TRANS: %1$s is the response code, %2$s is the line. +#, php-format +msgid "Bad HTTP response code %1$s: %2$s." +msgstr "Código de resposta HTTP erróneo %1$s: %2$s." + +#. TRANS: Menu item in login navigation. +#. TRANS: Menu item in connection settings navigation. +msgctxt "MENU" +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Title for menu item in login navigation. +msgid "Login or register using Twitter." +msgstr "Acceda ou rexístrese mediante o Twitter." + +#. TRANS: Title for menu item in connection settings navigation. +msgid "Twitter integration options" +msgstr "Opcións de integración do Twitter" + +#. TRANS: Menu item in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Menu item title in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter bridge configuration page." +msgstr "Páxina de configuración da ponte ata o Twitter." + +#. TRANS: Plugin description. +msgid "" +"The Twitter \"bridge\" plugin allows integration of a StatusNet instance " +"with Twitter." +msgstr "" +"O complemento de \"ponte\" ata o Twitter permite a integración dunha " +"instancia do StatusNet co Twitter." + +#. TRANS: Client error displayed when trying to log in using Twitter while already logged in to StatusNet. +msgid "Already logged in." +msgstr "Xa se identificou." + +#. TRANS: Title for login using Twitter page. +msgctxt "TITLE" +msgid "Twitter Login" +msgstr "Rexistro do Twitter" + +#. TRANS: Instructions for login using Twitter page. +msgid "Login with your Twitter account" +msgstr "Acceder coa conta do Twitter" + +#. TRANS: Alternative text for "sign in with Twitter" image. +msgid "Sign in with Twitter" +msgstr "Rexistrarse co Twitter" + +#. TRANS: Mail subject after forwarding notices to Twitter has stopped working. +msgid "Your Twitter bridge has been disabled" +msgstr "Desactivouse a súa ponte ata o Twitter" + +#. TRANS: Mail body after forwarding notices to Twitter has stopped working. +#. TRANS: %1$ is the name of the user the mail is sent to, %2$s is a URL to the +#. TRANS: Twitter settings, %3$s is the StatusNet sitename. #, php-format msgid "" "Hi, %1$s. We're sorry to inform you that your link to Twitter has been " @@ -47,325 +448,20 @@ msgid "" "Regards,\n" "%3$s" msgstr "" +"Ola, %1$s. Sentimos informar de que a súa ligazón cara ao Twitter está " +"desctivada. Semella que xa non temos permiso para actualizar o seu estado no " +"Twitter. Poida que revogase o acceso que tiña %3$s?\n" +"\n" +"Pode volver activar a súa ponte ata o Twitter visitando a páxina de " +"configuración do Twitter:\n" +"\n" +"\t%2$s\n" +"\n" +"Atentamente,\n" +"%3$s" -#: TwitterBridgePlugin.php:151 TwitterBridgePlugin.php:174 -#: TwitterBridgePlugin.php:302 twitteradminpanel.php:52 -msgid "Twitter" -msgstr "Twitter" - -#: TwitterBridgePlugin.php:152 -msgid "Login or register using Twitter" -msgstr "" - -#: TwitterBridgePlugin.php:175 -msgid "Twitter integration options" -msgstr "" - -#: TwitterBridgePlugin.php:303 -msgid "Twitter bridge configuration" -msgstr "" - -#: TwitterBridgePlugin.php:327 -msgid "" -"The Twitter \"bridge\" plugin allows integration of a StatusNet instance " -"with Twitter." -msgstr "" - -#: twitteradminpanel.php:62 -msgid "Twitter bridge settings" -msgstr "" - -#: twitteradminpanel.php:150 -msgid "Invalid consumer key. Max length is 255 characters." -msgstr "" - -#: twitteradminpanel.php:156 -msgid "Invalid consumer secret. Max length is 255 characters." -msgstr "" - -#: twitteradminpanel.php:212 -msgid "Twitter application settings" -msgstr "" - -#: twitteradminpanel.php:218 -msgid "Consumer key" -msgstr "Clave do consumidor" - -#: twitteradminpanel.php:219 -msgid "Consumer key assigned by Twitter" -msgstr "Clave do consumidor asignada polo Twitter" - -#: twitteradminpanel.php:227 -msgid "Consumer secret" -msgstr "Pregunta secreta do consumidor" - -#: twitteradminpanel.php:228 -msgid "Consumer secret assigned by Twitter" -msgstr "Pregunta secreta do consumidor asignada polo Twitter" - -#: twitteradminpanel.php:238 -msgid "Note: a global consumer key and secret are set." -msgstr "" - -#: twitteradminpanel.php:245 -msgid "Integration source" -msgstr "Fonte de integración" - -#: twitteradminpanel.php:246 -msgid "Name of your Twitter application" -msgstr "" - -#: twitteradminpanel.php:258 -msgid "Options" -msgstr "Opcións" - -#: twitteradminpanel.php:265 -msgid "Enable \"Sign-in with Twitter\"" -msgstr "" - -#: twitteradminpanel.php:267 -msgid "Allow users to login with their Twitter credentials" -msgstr "" - -#: twitteradminpanel.php:274 -msgid "Enable Twitter import" -msgstr "" - -#: twitteradminpanel.php:276 -msgid "" -"Allow users to import their Twitter friends' timelines. Requires daemons to " -"be manually configured." -msgstr "" - -#: twitteradminpanel.php:293 twittersettings.php:200 -msgid "Save" -msgstr "Gardar" - -#: twitteradminpanel.php:293 -msgid "Save Twitter settings" -msgstr "" - -#: twitterlogin.php:56 -msgid "Already logged in." -msgstr "" - -#: twitterlogin.php:64 -msgid "Twitter Login" -msgstr "" - -#: twitterlogin.php:69 -msgid "Login with your Twitter account" -msgstr "" - -#: twitterlogin.php:87 -msgid "Sign in with Twitter" -msgstr "" - -#: twitterauthorization.php:120 twittersettings.php:226 -msgid "There was a problem with your session token. Try again, please." -msgstr "" - -#: twitterauthorization.php:126 -msgid "You can't register if you don't agree to the license." -msgstr "" - -#: twitterauthorization.php:135 -msgid "Something weird happened." -msgstr "" - -#: twitterauthorization.php:181 twitterauthorization.php:229 -#: twitterauthorization.php:300 -msgid "Couldn't link your Twitter account." -msgstr "" - -#: twitterauthorization.php:201 -msgid "Couldn't link your Twitter account: oauth_token mismatch." -msgstr "" - -#: twitterauthorization.php:312 +#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. +#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. #, php-format -msgid "" -"This is the first time you've logged into %s so we must connect your Twitter " -"account to a local account. You can either create a new account, or connect " -"with your existing account, if you have one." -msgstr "" - -#: twitterauthorization.php:318 -msgid "Twitter Account Setup" -msgstr "" - -#: twitterauthorization.php:351 -msgid "Connection options" -msgstr "" - -#: twitterauthorization.php:360 -#, php-format -msgid "" -"My text and files are available under %s except this private data: password, " -"email address, IM address, and phone number." -msgstr "" - -#: twitterauthorization.php:381 -msgid "Create new account" -msgstr "" - -#: twitterauthorization.php:383 -msgid "Create a new user with this nickname." -msgstr "" - -#: twitterauthorization.php:386 -msgid "New nickname" -msgstr "" - -#: twitterauthorization.php:388 -msgid "1-64 lowercase letters or numbers, no punctuation or spaces" -msgstr "" - -#: twitterauthorization.php:391 -msgid "Create" -msgstr "Crear" - -#: twitterauthorization.php:396 -msgid "Connect existing account" -msgstr "" - -#: twitterauthorization.php:398 -msgid "" -"If you already have an account, login with your username and password to " -"connect it to your Twitter account." -msgstr "" - -#: twitterauthorization.php:401 -msgid "Existing nickname" -msgstr "" - -#: twitterauthorization.php:404 -msgid "Password" -msgstr "Contrasinal" - -#: twitterauthorization.php:407 -msgid "Connect" -msgstr "Conectar" - -#: twitterauthorization.php:423 twitterauthorization.php:432 -msgid "Registration not allowed." -msgstr "" - -#: twitterauthorization.php:439 -msgid "Not a valid invitation code." -msgstr "" - -#: twitterauthorization.php:452 -msgid "Nickname not allowed." -msgstr "" - -#: twitterauthorization.php:457 -msgid "Nickname already in use. Try another one." -msgstr "" - -#: twitterauthorization.php:472 -msgid "Error registering user." -msgstr "" - -#: twitterauthorization.php:483 twitterauthorization.php:521 -#: twitterauthorization.php:541 -msgid "Error connecting user to Twitter." -msgstr "" - -#: twitterauthorization.php:503 -msgid "Invalid username or password." -msgstr "" - -#: twittersettings.php:58 -msgid "Twitter settings" -msgstr "Configuración do Twitter" - -#: twittersettings.php:69 -msgid "" -"Connect your Twitter account to share your updates with your Twitter friends " -"and vice-versa." -msgstr "" - -#: twittersettings.php:116 -msgid "Twitter account" -msgstr "Conta do Twitter" - -#: twittersettings.php:121 -msgid "Connected Twitter account" -msgstr "" - -#: twittersettings.php:126 -msgid "Disconnect my account from Twitter" -msgstr "" - -#: twittersettings.php:132 -msgid "Disconnecting your Twitter could make it impossible to log in! Please " -msgstr "" - -#: twittersettings.php:136 -msgid "set a password" -msgstr "" - -#: twittersettings.php:138 -msgid " first." -msgstr " primeiro." - -#. TRANS: %1$s is the current website name. -#: twittersettings.php:142 -#, php-format -msgid "" -"Keep your %1$s account but disconnect from Twitter. You can use your %1$s " -"password to log in." -msgstr "" - -#: twittersettings.php:150 -msgid "Disconnect" -msgstr "Desconectarse" - -#: twittersettings.php:157 -msgid "Preferences" -msgstr "Preferencias" - -#: twittersettings.php:161 -msgid "Automatically send my notices to Twitter." -msgstr "" - -#: twittersettings.php:168 -msgid "Send local \"@\" replies to Twitter." -msgstr "" - -#: twittersettings.php:175 -msgid "Subscribe to my Twitter friends here." -msgstr "" - -#: twittersettings.php:184 -msgid "Import my friends timeline." -msgstr "" - -#: twittersettings.php:202 -msgid "Add" -msgstr "Engadir" - -#: twittersettings.php:236 -msgid "Unexpected form submission." -msgstr "" - -#: twittersettings.php:251 -msgid "No Twitter connection to remove." -msgstr "" - -#: twittersettings.php:259 -msgid "Couldn't remove Twitter user." -msgstr "" - -#: twittersettings.php:263 -msgid "Twitter account disconnected." -msgstr "" - -#: twittersettings.php:283 twittersettings.php:294 -msgid "Couldn't save Twitter preferences." -msgstr "" - -#: twittersettings.php:302 -msgid "Twitter preferences saved." -msgstr "" +msgid "RT @%1$s %2$s" +msgstr "RT @%1$s %2$s" diff --git a/plugins/TwitterBridge/locale/ia/LC_MESSAGES/TwitterBridge.po b/plugins/TwitterBridge/locale/ia/LC_MESSAGES/TwitterBridge.po index 09160072ea..7dafc86864 100644 --- a/plugins/TwitterBridge/locale/ia/LC_MESSAGES/TwitterBridge.po +++ b/plugins/TwitterBridge/locale/ia/LC_MESSAGES/TwitterBridge.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TwitterBridge to Interlingua (Interlingua) +# Translation of StatusNet - TwitterBridge to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,49 +9,53 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TwitterBridge\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:45+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:21+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-twitterbridge\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Title for page with Twitter integration settings. msgid "Twitter settings" msgstr "Configuration de Twitter" +#. TRANS: Instructions for page with Twitter integration settings. msgid "" "Connect your Twitter account to share your updates with your Twitter friends " "and vice-versa." msgstr "" -"Connecte tu conto de Twitter pro condivider tu actualisationes con tu amicos " -"de Twitter e vice versa." +"Connecte tu conto de Twitter pro divider tu actualitates con tu amicos de " +"Twitter e vice versa." +#. TRANS: Fieldset legend. msgid "Twitter account" msgstr "Conto de Twitter" +#. TRANS: Form note when a Twitter account has been connected. msgid "Connected Twitter account" msgstr "Conto de Twitter connectite" +#. TRANS: Fieldset legend. msgid "Disconnect my account from Twitter" msgstr "Disconnecter mi conto ab Twitter" -msgid "Disconnecting your Twitter could make it impossible to log in! Please " +#. TRANS: Form guide. %s is a URL to the password settings. +#. TRANS: This message contains a Markdown link in the form [description](link). +#, php-format +msgid "" +"Disconnecting your Twitter account could make it impossible to log in! " +"Please [set a password](%s) first." msgstr "" "Le disconnexion de tu conto de Twitter renderea le authentication " -"impossibile! Per favor " +"impossibile! Per favor [defini un contrasigno](%s) primo." -msgid "set a password" -msgstr "defini un contrasigno" - -msgid " first." -msgstr " primo." - -#. TRANS: %1$s is the current website name. +#. TRANS: Form instructions. %1$s is the StatusNet sitename. #, php-format msgid "" "Keep your %1$s account but disconnect from Twitter. You can use your %1$s " @@ -60,82 +64,163 @@ msgstr "" "Retene tu conto de %1$s ma disconnecte ab Twitter. Tu pote usar tu " "contrasigno de %1$s pro aperir session." +#. TRANS: Button text for disconnecting a Twitter account. +msgctxt "BUTTON" msgid "Disconnect" msgstr "Disconnecter" +#. TRANS: Fieldset legend. msgid "Preferences" msgstr "Preferentias" +#. TRANS: Checkbox label. msgid "Automatically send my notices to Twitter." msgstr "Automaticamente inviar mi notas a Twitter." +#. TRANS: Checkbox label. msgid "Send local \"@\" replies to Twitter." msgstr "Inviar responsas \"@\" local a Twitter." +#. TRANS: Checkbox label. msgid "Subscribe to my Twitter friends here." msgstr "Subscriber hic a mi amicos de Twitter." +#. TRANS: Checkbox label. msgid "Import my friends timeline." msgstr "Importar le chronologia de mi amicos." +#. TRANS: Button text for saving Twitter integration settings. +#. TRANS: Button text for saving the administrative Twitter bridge settings. +msgctxt "BUTTON" msgid "Save" msgstr "Salveguardar" +#. TRANS: Button text for adding Twitter integration. +msgctxt "BUTTON" msgid "Add" msgstr "Adder" +#. TRANS: Client error displayed when the session token does not match or is not given. msgid "There was a problem with your session token. Try again, please." msgstr "Occurreva un problema con le indicio de tu session. Per favor reproba." +#. TRANS: Client error displayed when the submitted form contains unexpected data. msgid "Unexpected form submission." msgstr "Submission de formulario inexpectate." +#. TRANS: Client error displayed when trying to remove a connected Twitter account when there isn't one connected. msgid "No Twitter connection to remove." msgstr "Nulle connexion Twitter a remover." -msgid "Couldn't remove Twitter user." +#. TRANS: Server error displayed when trying to remove a connected Twitter account fails. +msgid "Could not remove Twitter user." msgstr "Non poteva remover le usator de Twitter." +#. TRANS: Success message displayed after disconnecting a Twitter account. msgid "Twitter account disconnected." msgstr "Conto de Twitter disconnectite." -msgid "Couldn't save Twitter preferences." +#. TRANS: Server error displayed when saving Twitter integration preferences fails. +msgid "Could not save Twitter preferences." msgstr "Non poteva salveguardar le preferentias de Twitter." +#. TRANS: Success message after saving Twitter integration preferences. msgid "Twitter preferences saved." msgstr "Preferentias de Twitter salveguardate." +#. TRANS: Form validation error displayed when the checkbox to agree to the license has not been checked. msgid "You cannot register if you do not agree to the license." msgstr "Tu non pote crear un conto si tu non accepta le licentia." +#. TRANS: Form validation error displayed when an unhandled error occurs. msgid "Something weird happened." msgstr "Qualcosa de bizarre occurreva." +#. TRANS: Server error displayed when linking to a Twitter account fails. msgid "Could not link your Twitter account." msgstr "Non poteva ligar tu conto de Twitter." -msgid "Couldn't link your Twitter account: oauth_token mismatch." +#. TRANS: Server error displayed when linking to a Twitter account fails because of an incorrect oauth_token. +msgid "Could not link your Twitter account: oauth_token mismatch." msgstr "Non poteva ligar a tu conto de Twitter: oauth_token non corresponde." -msgid "Couldn't link your Twitter account." -msgstr "Non poteva ligar a tu conto de Twitter." - +#. TRANS: Page instruction. %s is the StatusNet sitename. #, php-format msgid "" -"This is the first time you've logged into %s so we must connect your Twitter " -"account to a local account. You can either create a new account, or connect " -"with your existing account, if you have one." +"This is the first time you have logged into %s so we must connect your " +"Twitter account to a local account. You can either create a new account, or " +"connect with your existing account, if you have one." msgstr "" "Isto es le prime vice que tu ha aperite un session in %s; dunque, nos debe " "connecter tu conto de Twitter a un conto local. Tu pote crear un nove conto, " "o connecter con tu conto existente, si tu ha un." +#. TRANS: Page title. msgid "Twitter Account Setup" msgstr "Configuration del conto de Twitter" +#. TRANS: Fieldset legend. msgid "Connection options" msgstr "Optiones de connexion" +#. TRANS: Fieldset legend. +msgid "Create new account" +msgstr "Crear nove conto" + +#. TRANS: Sub form introduction text. +msgid "Create a new user with this nickname." +msgstr "Crear un nove usator con iste pseudonymo." + +#. TRANS: Field label. +msgid "New nickname" +msgstr "Nove pseudonymo" + +#. TRANS: Field title for nickname field. +msgid "1-64 lowercase letters or numbers, no punctuation or spaces." +msgstr "1-64 minusculas o numeros, sin punctuation o spatios." + +#. TRANS: Field label. +msgctxt "LABEL" +msgid "Email" +msgstr "E-mail" + +#. TRANS: Field title for e-mail address field. +msgid "Used only for updates, announcements, and password recovery" +msgstr "" +"Usate solmente pro actualisationes, notificationes e recuperation de " +"contrasigno" + +#. TRANS: Button text for creating a new StatusNet account in the Twitter connect page. +msgctxt "BUTTON" +msgid "Create" +msgstr "Crear" + +#. TRANS: Fieldset legend. +msgid "Connect existing account" +msgstr "Connecter conto existente" + +#. TRANS: Sub form introduction text. +msgid "" +"If you already have an account, login with your username and password to " +"connect it to your Twitter account." +msgstr "" +"Si tu ha jam un conto, aperi session con tu nomine de usator e contrasigno " +"pro connecter lo a tu conto de Twitter." + +#. TRANS: Field label. +msgid "Existing nickname" +msgstr "Pseudonymo existente" + +#. TRANS: Field label. +msgid "Password" +msgstr "Contrasigno" + +#. TRANS: Fieldset legend. +msgid "License" +msgstr "Licentia" + +#. TRANS: Text for license agreement checkbox. +#. TRANS: %s is the license as configured for the StatusNet site. #, php-format msgid "" "My text and files are available under %s except this private data: password, " @@ -145,118 +230,107 @@ msgstr "" "contrasigno, adresse de e-mail, adresse de messageria instantanee, numero de " "telephono." -msgid "Create new account" -msgstr "Crear nove conto" - -msgid "Create a new user with this nickname." -msgstr "Crear un nove usator con iste pseudonymo." - -msgid "New nickname" -msgstr "Nove pseudonymo" - -msgid "1-64 lowercase letters or numbers, no punctuation or spaces." -msgstr "1-64 minusculas o numeros, sin punctuation o spatios." - -msgctxt "LABEL" -msgid "Email" -msgstr "E-mail" - -msgid "Used only for updates, announcements, and password recovery" -msgstr "" -"Usate solmente pro actualisationes, notificationes e recuperation de " -"contrasigno" - -msgid "Create" -msgstr "Crear" - -msgid "Connect existing account" -msgstr "Connecter conto existente" - -msgid "" -"If you already have an account, login with your username and password to " -"connect it to your Twitter account." -msgstr "" -"Si tu ha jam un conto, aperi session con tu nomine de usator e contrasigno " -"pro connecter lo a tu conto de Twitter." - -msgid "Existing nickname" -msgstr "Pseudonymo existente" - -msgid "Password" -msgstr "Contrasigno" - +#. TRANS: Button text for connecting an existing StatusNet account in the Twitter connect page.. +msgctxt "BUTTON" msgid "Connect" msgstr "Connecter" +#. TRANS: Client error displayed when trying to create a new user while creating new users is not allowed. msgid "Registration not allowed." msgstr "Creation de conto non permittite." +#. TRANS: Client error displayed when trying to create a new user with an invalid invitation code. msgid "Not a valid invitation code." msgstr "Le codice de invitation es invalide." +#. TRANS: Client error displayed when trying to create a new user with an invalid username. msgid "Nickname not allowed." msgstr "Pseudonymo non permittite." +#. TRANS: Client error displayed when trying to create a new user with a username that is already in use. msgid "Nickname already in use. Try another one." msgstr "Pseudonymo ja in uso. Proba un altere." +#. TRANS: Server error displayed when creating a new user has failed. msgid "Error registering user." msgstr "Error durante le registration del usator." +#. TRANS: Server error displayed when connecting a user to a Twitter user has failed. +#. TRANS: Server error displayed connecting a user to a Twitter user has failed. msgid "Error connecting user to Twitter." msgstr "Error durante le connexion del usator a Twitter." +#. TRANS: Form validation error displayed when connecting an existing user to a Twitter user fails because +#. TRANS: the provided username and/or password are incorrect. msgid "Invalid username or password." msgstr "Nomine de usator o contrasigno invalide." +#. TRANS: Page title for Twitter administration panel. +msgctxt "TITLE" msgid "Twitter" msgstr "Twitter" +#. TRANS: Instructions for Twitter bridge administration page. msgid "Twitter bridge settings" msgstr "Configuration del ponte a Twitter" -msgid "Invalid consumer key. Max length is 255 characters." -msgstr "Clave de consumitor invalide. Longitude maximal es 255 characteres." +#. TRANS: Client error displayed when a consumer key is invalid because it is too long. +msgid "Invalid consumer key. Maximum length is 255 characters." +msgstr "Clave de consumitor invalide. Longitude maxime es 255 characteres." -msgid "Invalid consumer secret. Max length is 255 characters." -msgstr "Secreto de consumitor invalide. Longitude maximal es 255 characteres." +#. TRANS: Client error displayed when a consumer secret is invalid because it is too long. +msgid "Invalid consumer secret. Maximum length is 255 characters." +msgstr "Secreto de consumitor invalide. Longitude maxime es 255 characteres." +#. TRANS: Fieldset legend for Twitter application settings. msgid "Twitter application settings" msgstr "Configuration del application Twitter" +#. TRANS: Field label for Twitter assigned consumer key. msgid "Consumer key" msgstr "Clave de consumitor" -msgid "Consumer key assigned by Twitter" -msgstr "Clave de consumitor assignate per Twitter" +#. TRANS: Field title for Twitter assigned consumer key. +msgid "The consumer key assigned by Twitter." +msgstr "Le clave de consumitor assignate per Twitter." +#. TRANS: Field label for Twitter assigned consumer secret. msgid "Consumer secret" msgstr "Secreto de consumitor" -msgid "Consumer secret assigned by Twitter" -msgstr "Secreto de consumitor assignate per Twitter" +#. TRANS: Field title for Twitter assigned consumer secret. +msgid "The consumer secret assigned by Twitter." +msgstr "Le secreto de consumitor assignate per Twitter." -msgid "Note: a global consumer key and secret are set." -msgstr "Nota: un clave e un secreto de consumitor global es definite." +#. TRANS: Form guide displayed when two required fields have already been provided. +msgid "Note: A global consumer key and secret are set." +msgstr "Nota: Un clave e un secreto de consumitor global es definite." +#. TRANS: Field label for Twitter application name. msgid "Integration source" msgstr "Fonte de integration" -msgid "Name of your Twitter application" -msgstr "Nomine de tu application Twitter" +#. TRANS: Field title for Twitter application name. +msgid "The name of your Twitter application." +msgstr "Le nomine de tu application Twitter." +#. TRANS: Fieldset legend for Twitter integration options. msgid "Options" msgstr "Optiones" +#. TRANS: Checkbox label for global setting. msgid "Enable \"Sign-in with Twitter\"" msgstr "Activar \"Aperir session con Twitter\"" -msgid "Allow users to login with their Twitter credentials" -msgstr "Permitte que usatores aperi session con lor conto de Twitter" +#. TRANS: Checkbox title. +msgid "This allow users to login with their Twitter credentials." +msgstr "Isto permitte que usatores aperi session con lor conto de Twitter." +#. TRANS: Checkbox label for global setting. msgid "Enable Twitter import" msgstr "Activar le importation de Twitter" +#. TRANS: Checkbox title for global setting. msgid "" "Allow users to import their Twitter friends' timelines. Requires daemons to " "be manually configured." @@ -264,18 +338,65 @@ msgstr "" "Permitte que usatores importa le chronologias de lor amicos de Twitter. " "Require que le demones sia configurate manualmente." -msgid "Save Twitter settings" -msgstr "Salveguardar configurationes de Twitter" +#. TRANS: Button title for saving the administrative Twitter bridge settings. +msgid "Save the Twitter bridge settings." +msgstr "Salveguardar le configuration del ponte a Twitter." -msgid "Login or register using Twitter" -msgstr "Aperir session o crear conto usante Twitter" +#. TRANS: Server exception thrown when an invalid URL scheme is detected. +msgid "Invalid URL scheme for HTTP stream reader." +msgstr "Schema de URL invalide pro le lector de fluxo HTTP." +#. TRANS: Exception thrown when input from an inexpected socket is encountered. +msgid "Got input from unexpected socket!" +msgstr "Recipeva datos ab un prisa inexpectate!" + +#. TRANS: Exception thrown when an invalid state is encountered in handleLine. +#. TRANS: %s is the invalid state. +#, php-format +msgid "Invalid state in handleLine: %s." +msgstr "Stato invalide in \"handleLine\": %s." + +#. TRANS: Exception thrown when an invalid response line is encountered. +#. TRANS: %s is the invalid line. +#, php-format +msgid "Invalid HTTP response line: %s." +msgstr "Linea de responsa HTTP invalide: %s." + +#. TRANS: Exception thrown when an invalid response line part is encountered. +#. TRANS: %1$s is the chunk, %2$s is the line. +#, php-format +msgid "Invalid HTTP response line chunk \"%1$s\": %2$s." +msgstr "Parte de linea de responsa HTTP invalide \"%1$s\": %2$s." + +#. TRANS: Exception thrown when an invalid response code is encountered. +#. TRANS: %1$s is the response code, %2$s is the line. +#, php-format +msgid "Bad HTTP response code %1$s: %2$s." +msgstr "Mal codice de responsa HTTP %1$s: %2$s." + +#. TRANS: Menu item in login navigation. +#. TRANS: Menu item in connection settings navigation. +msgctxt "MENU" +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Title for menu item in login navigation. +msgid "Login or register using Twitter." +msgstr "Aperir session o crear conto usante Twitter." + +#. TRANS: Title for menu item in connection settings navigation. msgid "Twitter integration options" msgstr "Optiones de integration de Twitter" -msgid "Twitter bridge configuration" -msgstr "Configuration del ponte a Twitter" +#. TRANS: Menu item in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter" +msgstr "Twitter" +#. TRANS: Menu item title in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter bridge configuration page." +msgstr "Pagina de configuration del ponte a Twitter." + +#. TRANS: Plugin description. msgid "" "The Twitter \"bridge\" plugin allows integration of a StatusNet instance " "with Twitter." @@ -283,15 +404,20 @@ msgstr "" "Le plug-in de \"ponte\" a Twitter permitte le integration de un installation " "de StatusNet con Twitter." +#. TRANS: Client error displayed when trying to log in using Twitter while already logged in to StatusNet. msgid "Already logged in." msgstr "Tu es jam authenticate." +#. TRANS: Title for login using Twitter page. +msgctxt "TITLE" msgid "Twitter Login" msgstr "Apertura de session con Twitter" +#. TRANS: Instructions for login using Twitter page. msgid "Login with your Twitter account" msgstr "Aperir session con tu conto de Twitter" +#. TRANS: Alternative text for "sign in with Twitter" image. msgid "Sign in with Twitter" msgstr "Aperir session con Twitter" diff --git a/plugins/TwitterBridge/locale/ko/LC_MESSAGES/TwitterBridge.po b/plugins/TwitterBridge/locale/ko/LC_MESSAGES/TwitterBridge.po index 26f941f396..29e4b1a216 100644 --- a/plugins/TwitterBridge/locale/ko/LC_MESSAGES/TwitterBridge.po +++ b/plugins/TwitterBridge/locale/ko/LC_MESSAGES/TwitterBridge.po @@ -9,21 +9,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TwitterBridge\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:45+0000\n" -"Language-Team: Korean \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:21+0000\n" +"Language-Team: Korean \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ko\n" "X-Message-Group: #out-statusnet-plugin-twitterbridge\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Title for page with Twitter integration settings. msgid "Twitter settings" msgstr "트위터 설정" +#. TRANS: Instructions for page with Twitter integration settings. msgid "" "Connect your Twitter account to share your updates with your Twitter friends " "and vice-versa." @@ -31,25 +33,27 @@ msgstr "" "트위터 ê³„ì •ì„ ì—°ê²°í•©ë‹ˆë‹¤. ë‚´ ê¸€ì„ íŠ¸ìœ„í„° 친구들과 공유할 수 있고 반대로 í•  수" "ë„ ìžˆìŠµë‹ˆë‹¤." +#. TRANS: Fieldset legend. msgid "Twitter account" msgstr "트위터 계정" +#. TRANS: Form note when a Twitter account has been connected. msgid "Connected Twitter account" msgstr "ì—°ê²°í•œ 트위터 계정" +#. TRANS: Fieldset legend. msgid "Disconnect my account from Twitter" msgstr "ë‚´ 계정ì—ì„œ 트위터 ì—°ê²°ì„ í•´ì œí•©ë‹ˆë‹¤." -msgid "Disconnecting your Twitter could make it impossible to log in! Please " +#. TRANS: Form guide. %s is a URL to the password settings. +#. TRANS: This message contains a Markdown link in the form [description](link). +#, fuzzy, php-format +msgid "" +"Disconnecting your Twitter account could make it impossible to log in! " +"Please [set a password](%s) first." msgstr "트위터 ì—°ê²°ì„ í•´ì œí•˜ë©´ 로그ì¸ì´ 불가능해질 수 있습니다!" -msgid "set a password" -msgstr "비밀 번호를 설정하십시오" - -msgid " first." -msgstr "." - -#. TRANS: %1$s is the current website name. +#. TRANS: Form instructions. %1$s is the StatusNet sitename. #, php-format msgid "" "Keep your %1$s account but disconnect from Twitter. You can use your %1$s " @@ -58,81 +62,166 @@ msgstr "" "ë‚´ %1$s ê³„ì •ì„ ìœ ì§€í•˜ì§€ë§Œ 트위터ì—ì„œ ì—°ê²°ì„ í•´ì œí•©ë‹ˆë‹¤. 로그ì¸ì— %1$s 비밀 번" "호를 사용할 수 있습니다." +#. TRANS: Button text for disconnecting a Twitter account. +#, fuzzy +msgctxt "BUTTON" msgid "Disconnect" msgstr "ì—°ê²° ëŠê¸°" +#. TRANS: Fieldset legend. msgid "Preferences" msgstr "기본 설정" +#. TRANS: Checkbox label. msgid "Automatically send my notices to Twitter." msgstr "ë‚´ ê¸€ì„ ìžë™ìœ¼ë¡œ 트위터로 보내기" +#. TRANS: Checkbox label. msgid "Send local \"@\" replies to Twitter." msgstr "로컬 \"@\" ë‹µìž¥ì„ íŠ¸ìœ„í„°ë¡œ 보내기." +#. TRANS: Checkbox label. msgid "Subscribe to my Twitter friends here." msgstr "여기 있는 ë‚´ 트위터 ì¹œêµ¬ë“¤ì— êµ¬ë…." +#. TRANS: Checkbox label. msgid "Import my friends timeline." msgstr "ë‚´ 친구 타임ë¼ì¸ 가져오기." +#. TRANS: Button text for saving Twitter integration settings. +#. TRANS: Button text for saving the administrative Twitter bridge settings. +#, fuzzy +msgctxt "BUTTON" msgid "Save" msgstr "저장" +#. TRANS: Button text for adding Twitter integration. +#, fuzzy +msgctxt "BUTTON" msgid "Add" msgstr "추가" +#. TRANS: Client error displayed when the session token does not match or is not given. msgid "There was a problem with your session token. Try again, please." msgstr "세션 토í°ì— 문제가 있습니다. 다시 ì‹œë„í•´ 보십시오." +#. TRANS: Client error displayed when the submitted form contains unexpected data. msgid "Unexpected form submission." msgstr "예ìƒì¹˜ 못한 í¼ ì œì¶œ." +#. TRANS: Client error displayed when trying to remove a connected Twitter account when there isn't one connected. msgid "No Twitter connection to remove." msgstr "제거할 트위터 ì—°ê²°ì´ ì—†ìŠµë‹ˆë‹¤." -msgid "Couldn't remove Twitter user." +#. TRANS: Server error displayed when trying to remove a connected Twitter account fails. +#, fuzzy +msgid "Could not remove Twitter user." msgstr "트위터 사용ìžë¥¼ 제거할 수 없습니다." +#. TRANS: Success message displayed after disconnecting a Twitter account. msgid "Twitter account disconnected." msgstr "트위터 계정 ì—°ê²°ì„ ëŠì—ˆìŠµë‹ˆë‹¤." -msgid "Couldn't save Twitter preferences." +#. TRANS: Server error displayed when saving Twitter integration preferences fails. +#, fuzzy +msgid "Could not save Twitter preferences." msgstr "트위터 기본 ì„¤ì •ì„ ì €ìž¥í•  수 없습니다." +#. TRANS: Success message after saving Twitter integration preferences. msgid "Twitter preferences saved." msgstr "트위터 기본 ì„¤ì •ì„ ì €ìž¥í–ˆìŠµë‹ˆë‹¤." +#. TRANS: Form validation error displayed when the checkbox to agree to the license has not been checked. msgid "You cannot register if you do not agree to the license." msgstr "ë¼ì´ì„ ìŠ¤ì— ë™ì˜í•˜ì§€ 않으면 가입할 수 없습니다." +#. TRANS: Form validation error displayed when an unhandled error occurs. msgid "Something weird happened." msgstr "ì´ìƒí•œ ì¼ì´ ë°œìƒí–ˆìŠµë‹ˆë‹¤." +#. TRANS: Server error displayed when linking to a Twitter account fails. msgid "Could not link your Twitter account." msgstr "트위터 ê³„ì •ì„ ì—°ê²°í•  수 없습니다." -msgid "Couldn't link your Twitter account: oauth_token mismatch." +#. TRANS: Server error displayed when linking to a Twitter account fails because of an incorrect oauth_token. +#, fuzzy +msgid "Could not link your Twitter account: oauth_token mismatch." msgstr "트위터 ê³„ì •ì„ ì—°ê²°í•  수 없습니다: oauth_token ì¼ì¹˜í•˜ì§€ 않습니다." -msgid "Couldn't link your Twitter account." -msgstr "트위터 ê³„ì •ì„ ì—°ê²°í•  수 없습니다." - -#, php-format +#. TRANS: Page instruction. %s is the StatusNet sitename. +#, fuzzy, php-format msgid "" -"This is the first time you've logged into %s so we must connect your Twitter " -"account to a local account. You can either create a new account, or connect " -"with your existing account, if you have one." +"This is the first time you have logged into %s so we must connect your " +"Twitter account to a local account. You can either create a new account, or " +"connect with your existing account, if you have one." msgstr "" "처ìŒìœ¼ë¡œ %s 사ì´íŠ¸ì— 로그ì¸í–ˆìœ¼ë¯€ë¡œ 트위터를 로컬 ê³„ì •ì— ì—°ê²°í•´ì•¼ 합니다. 새 " "ê³„ì •ì„ ë§Œë“¤ê±°ë‚˜, ê³„ì •ì´ ìžˆìœ¼ë©´ 기존 ê³„ì •ì„ íŠ¸ìœ„í„°ì— ì—°ê²°í•  수 있습니다." +#. TRANS: Page title. msgid "Twitter Account Setup" msgstr "트위터 계정 준비" +#. TRANS: Fieldset legend. msgid "Connection options" msgstr "ì—°ê²° 옵션" +#. TRANS: Fieldset legend. +msgid "Create new account" +msgstr "새 계정 만들기" + +#. TRANS: Sub form introduction text. +msgid "Create a new user with this nickname." +msgstr "ì´ ì´ë¦„으로 새 ì‚¬ìš©ìž ë§Œë“¤ê¸°" + +#. TRANS: Field label. +msgid "New nickname" +msgstr "새 ì´ë¦„" + +#. TRANS: Field title for nickname field. +msgid "1-64 lowercase letters or numbers, no punctuation or spaces." +msgstr "" +"1-64ìž ì‚¬ì´ì— ì˜ë¬¸ 소문ìž, 숫ìžë¡œë§Œ ì”니다. 기호나 ê³µë°±ì„ ì“°ë©´ 안 ë©ë‹ˆë‹¤." + +#. TRANS: Field label. +msgctxt "LABEL" +msgid "Email" +msgstr "ë©”ì¼" + +#. TRANS: Field title for e-mail address field. +msgid "Used only for updates, announcements, and password recovery" +msgstr "ì—…ë°ì´íŠ¸, 공지 사항, 비밀번호 찾기ì—만 사용합니다." + +#. TRANS: Button text for creating a new StatusNet account in the Twitter connect page. +#, fuzzy +msgctxt "BUTTON" +msgid "Create" +msgstr "만들기" + +#. TRANS: Fieldset legend. +msgid "Connect existing account" +msgstr "기존 ê³„ì •ì— ì—°ê²°" + +#. TRANS: Sub form introduction text. +msgid "" +"If you already have an account, login with your username and password to " +"connect it to your Twitter account." +msgstr "ê³„ì •ì´ ìžˆìœ¼ë©´, ì•„ì´ë””와 비밀 번호로 로그ì¸í•´ì„œ íŠ¸ìœ„í„°ì— ì—°ê²°í•˜ì‹­ì‹œì˜¤." + +#. TRANS: Field label. +msgid "Existing nickname" +msgstr "기존 ì´ë¦„" + +#. TRANS: Field label. +msgid "Password" +msgstr "비밀 번호" + +#. TRANS: Fieldset legend. +msgid "License" +msgstr "" + +#. TRANS: Text for license agreement checkbox. +#. TRANS: %s is the license as configured for the StatusNet site. #, php-format msgid "" "My text and files are available under %s except this private data: password, " @@ -141,115 +230,116 @@ msgstr "" "ë‚´ 글과 파ì¼ì€ %s ì¡°ê±´ì— ë”°ë¦…ë‹ˆë‹¤. ë‹¤ìŒ ê°œì¸ ë°ì´í„°ëŠ” 제외합니다: 비밀 번호, " "ë©”ì¼ ì£¼ì†Œ, 메신저 주소, ì „í™” 번호." -msgid "Create new account" -msgstr "새 계정 만들기" - -msgid "Create a new user with this nickname." -msgstr "ì´ ì´ë¦„으로 새 ì‚¬ìš©ìž ë§Œë“¤ê¸°" - -msgid "New nickname" -msgstr "새 ì´ë¦„" - -msgid "1-64 lowercase letters or numbers, no punctuation or spaces." -msgstr "" -"1-64ìž ì‚¬ì´ì— ì˜ë¬¸ 소문ìž, 숫ìžë¡œë§Œ ì”니다. 기호나 ê³µë°±ì„ ì“°ë©´ 안 ë©ë‹ˆë‹¤." - -msgctxt "LABEL" -msgid "Email" -msgstr "ë©”ì¼" - -msgid "Used only for updates, announcements, and password recovery" -msgstr "ì—…ë°ì´íŠ¸, 공지 사항, 비밀번호 찾기ì—만 사용합니다." - -msgid "Create" -msgstr "만들기" - -msgid "Connect existing account" -msgstr "기존 ê³„ì •ì— ì—°ê²°" - -msgid "" -"If you already have an account, login with your username and password to " -"connect it to your Twitter account." -msgstr "ê³„ì •ì´ ìžˆìœ¼ë©´, ì•„ì´ë””와 비밀 번호로 로그ì¸í•´ì„œ íŠ¸ìœ„í„°ì— ì—°ê²°í•˜ì‹­ì‹œì˜¤." - -msgid "Existing nickname" -msgstr "기존 ì´ë¦„" - -msgid "Password" -msgstr "비밀 번호" - +#. TRANS: Button text for connecting an existing StatusNet account in the Twitter connect page.. +#, fuzzy +msgctxt "BUTTON" msgid "Connect" msgstr "ì—°ê²°" +#. TRANS: Client error displayed when trying to create a new user while creating new users is not allowed. msgid "Registration not allowed." msgstr "ê°€ìž…ì´ í—ˆìš©ë˜ì§€ 않습니다." +#. TRANS: Client error displayed when trying to create a new user with an invalid invitation code. msgid "Not a valid invitation code." msgstr "초대 코드가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤." +#. TRANS: Client error displayed when trying to create a new user with an invalid username. msgid "Nickname not allowed." msgstr "허용ë˜ì§€ 않는 ì´ë¦„입니다." +#. TRANS: Client error displayed when trying to create a new user with a username that is already in use. msgid "Nickname already in use. Try another one." msgstr "ì´ë¦„ì´ ì´ë¯¸ 사용 중입니다. 다른 ì´ë¦„ì„ ì‚¬ìš©í•´ 보십시오." +#. TRANS: Server error displayed when creating a new user has failed. msgid "Error registering user." msgstr "ì‚¬ìš©ìž ë“±ë¡ì— 오류." +#. TRANS: Server error displayed when connecting a user to a Twitter user has failed. +#. TRANS: Server error displayed connecting a user to a Twitter user has failed. msgid "Error connecting user to Twitter." msgstr "사용ìžë¥¼ íŠ¸ìœ„í„°ì— ì—°ê²°í•˜ëŠ”ë° ì˜¤ë¥˜." +#. TRANS: Form validation error displayed when connecting an existing user to a Twitter user fails because +#. TRANS: the provided username and/or password are incorrect. msgid "Invalid username or password." msgstr "ì‚¬ìš©ìž ì´ë¦„ì´ë‚˜ 비밀 번호가 틀렸습니다." +#. TRANS: Page title for Twitter administration panel. +#, fuzzy +msgctxt "TITLE" msgid "Twitter" msgstr "트위터" +#. TRANS: Instructions for Twitter bridge administration page. msgid "Twitter bridge settings" msgstr "트위터 브리지 설정" -msgid "Invalid consumer key. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer key is invalid because it is too long. +#, fuzzy +msgid "Invalid consumer key. Maximum length is 255 characters." msgstr "컨수머 키가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤. ìµœëŒ€ê°’ì€ 255ìžìž…니다." -msgid "Invalid consumer secret. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer secret is invalid because it is too long. +#, fuzzy +msgid "Invalid consumer secret. Maximum length is 255 characters." msgstr "컨수머 ë¹„ë°€ê°’ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤. ìµœëŒ€ê°’ì€ 255ìžìž…니다." +#. TRANS: Fieldset legend for Twitter application settings. msgid "Twitter application settings" msgstr "트위터 ì‘ìš© 프로그램 설정" +#. TRANS: Field label for Twitter assigned consumer key. msgid "Consumer key" msgstr "컨수머 키" -msgid "Consumer key assigned by Twitter" +#. TRANS: Field title for Twitter assigned consumer key. +#, fuzzy +msgid "The consumer key assigned by Twitter." msgstr "트위터가 할당한 컨수머 키" +#. TRANS: Field label for Twitter assigned consumer secret. msgid "Consumer secret" msgstr "컨수머 비밀 ê°’" -msgid "Consumer secret assigned by Twitter" +#. TRANS: Field title for Twitter assigned consumer secret. +#, fuzzy +msgid "The consumer secret assigned by Twitter." msgstr "트위터가 할당한 컨수머 비밀 ê°’" -msgid "Note: a global consumer key and secret are set." +#. TRANS: Form guide displayed when two required fields have already been provided. +#, fuzzy +msgid "Note: A global consumer key and secret are set." msgstr "참고: ì „ì²´ 컨수머 키와 ë¹„ë°€ê°’ì„ ì„¤ì •í–ˆìŠµë‹ˆë‹¤." +#. TRANS: Field label for Twitter application name. msgid "Integration source" msgstr "통합 소스" -msgid "Name of your Twitter application" +#. TRANS: Field title for Twitter application name. +#, fuzzy +msgid "The name of your Twitter application." msgstr "ë‚´ 트위터 ì‘ìš© í”„ë¡œê·¸ëž¨ì˜ ì´ë¦„" +#. TRANS: Fieldset legend for Twitter integration options. msgid "Options" msgstr "설정" +#. TRANS: Checkbox label for global setting. msgid "Enable \"Sign-in with Twitter\"" msgstr "\"트위터로 로그ì¸\" 사용" -msgid "Allow users to login with their Twitter credentials" +#. TRANS: Checkbox title. +#, fuzzy +msgid "This allow users to login with their Twitter credentials." msgstr "사용ìžê°€ 트위터 로그ì¸ì„ 통해 로그ì¸í•˜ë„ë¡ í—ˆìš©" +#. TRANS: Checkbox label for global setting. msgid "Enable Twitter import" msgstr "트위터 가져오기 사용" +#. TRANS: Checkbox title for global setting. msgid "" "Allow users to import their Twitter friends' timelines. Requires daemons to " "be manually configured." @@ -257,18 +347,69 @@ msgstr "" "사용ìžê°€ 트위터 ì¹œêµ¬ì˜ íƒ€ìž„ë¼ì¸ì„ 가져오ë„ë¡ í—ˆìš©í•©ë‹ˆë‹¤. ë°ëª¬ì„ 수ë™ìœ¼ë¡œ 설정" "해야 합니다." -msgid "Save Twitter settings" -msgstr "트위터 설정 저장" +#. TRANS: Button title for saving the administrative Twitter bridge settings. +#, fuzzy +msgid "Save the Twitter bridge settings." +msgstr "트위터 브리지 설정" -msgid "Login or register using Twitter" +#. TRANS: Server exception thrown when an invalid URL scheme is detected. +msgid "Invalid URL scheme for HTTP stream reader." +msgstr "" + +#. TRANS: Exception thrown when input from an inexpected socket is encountered. +msgid "Got input from unexpected socket!" +msgstr "" + +#. TRANS: Exception thrown when an invalid state is encountered in handleLine. +#. TRANS: %s is the invalid state. +#, php-format +msgid "Invalid state in handleLine: %s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response line is encountered. +#. TRANS: %s is the invalid line. +#, php-format +msgid "Invalid HTTP response line: %s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response line part is encountered. +#. TRANS: %1$s is the chunk, %2$s is the line. +#, php-format +msgid "Invalid HTTP response line chunk \"%1$s\": %2$s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response code is encountered. +#. TRANS: %1$s is the response code, %2$s is the line. +#, php-format +msgid "Bad HTTP response code %1$s: %2$s." +msgstr "" + +#. TRANS: Menu item in login navigation. +#. TRANS: Menu item in connection settings navigation. +#, fuzzy +msgctxt "MENU" +msgid "Twitter" +msgstr "트위터" + +#. TRANS: Title for menu item in login navigation. +#, fuzzy +msgid "Login or register using Twitter." msgstr "트위터를 사용해 ë¡œê·¸ì¸ ë˜ëŠ” 가입" +#. TRANS: Title for menu item in connection settings navigation. msgid "Twitter integration options" msgstr "트위터 통합 옵션" -msgid "Twitter bridge configuration" +#. TRANS: Menu item in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter" +msgstr "트위터" + +#. TRANS: Menu item title in administrative panel that leads to the Twitter bridge configuration. +#, fuzzy +msgid "Twitter bridge configuration page." msgstr "트위터 브릿지 설정" +#. TRANS: Plugin description. msgid "" "The Twitter \"bridge\" plugin allows integration of a StatusNet instance " "with Twitter." @@ -276,15 +417,21 @@ msgstr "" "트위터 \"브릿지\" 플러그ì¸ì„ 통해 StatusNet ì¸ìŠ¤í„´ìŠ¤ë¥¼ 트위터와 ì—°ê²°í•  수 있습니다." +#. TRANS: Client error displayed when trying to log in using Twitter while already logged in to StatusNet. msgid "Already logged in." msgstr "ì´ë¯¸ 로그ì¸í—€ìŠµë‹ˆë‹¤." +#. TRANS: Title for login using Twitter page. +#, fuzzy +msgctxt "TITLE" msgid "Twitter Login" msgstr "트위터 로그ì¸" +#. TRANS: Instructions for login using Twitter page. msgid "Login with your Twitter account" msgstr "트위터 계정으로 로그ì¸" +#. TRANS: Alternative text for "sign in with Twitter" image. msgid "Sign in with Twitter" msgstr "트위터로 로그ì¸" diff --git a/plugins/TwitterBridge/locale/mk/LC_MESSAGES/TwitterBridge.po b/plugins/TwitterBridge/locale/mk/LC_MESSAGES/TwitterBridge.po index 3ed5a0b8eb..87aa6ff6ed 100644 --- a/plugins/TwitterBridge/locale/mk/LC_MESSAGES/TwitterBridge.po +++ b/plugins/TwitterBridge/locale/mk/LC_MESSAGES/TwitterBridge.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TwitterBridge to Macedonian (МакедонÑки) +# Translation of StatusNet - TwitterBridge to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 @@ -9,21 +9,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TwitterBridge\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:45+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:22+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-twitterbridge\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" +#. TRANS: Title for page with Twitter integration settings. msgid "Twitter settings" msgstr "Ðагодувања за Twitter" +#. TRANS: Instructions for page with Twitter integration settings. msgid "" "Connect your Twitter account to share your updates with your Twitter friends " "and vice-versa." @@ -31,27 +33,29 @@ msgstr "" "Поврзете ја Вашата Ñметка на Twitter за да ги Ñподелувате подновувањата Ñо " "Вашите пријатели на Twitter и обратно." +#. TRANS: Fieldset legend. msgid "Twitter account" msgstr "Сметка на Twitter" +#. TRANS: Form note when a Twitter account has been connected. msgid "Connected Twitter account" msgstr "Поврзана Ñметка на Twitter" +#. TRANS: Fieldset legend. msgid "Disconnect my account from Twitter" msgstr "Прекини ја врÑката Ñо Ñметката на Twitter" -msgid "Disconnecting your Twitter could make it impossible to log in! Please " +#. TRANS: Form guide. %s is a URL to the password settings. +#. TRANS: This message contains a Markdown link in the form [description](link). +#, php-format +msgid "" +"Disconnecting your Twitter account could make it impossible to log in! " +"Please [set a password](%s) first." msgstr "" "Ðко ја прекинете врÑката Ñо Ñметката на Twitter, нема да можете да Ñе " -"најавите! Затоа " +"најавувате! Ðајпрвин [Ñтавете лозинка](%s)." -msgid "set a password" -msgstr "Ñтавете лозинка" - -msgid " first." -msgstr "пред да продолжите." - -#. TRANS: %1$s is the current website name. +#. TRANS: Form instructions. %1$s is the StatusNet sitename. #, php-format msgid "" "Keep your %1$s account but disconnect from Twitter. You can use your %1$s " @@ -60,84 +64,163 @@ msgstr "" "Задржете Ñи ја Ñметката на %1$s, но прекинете ја врÑката Ñо Twitter. За " "најава, кориÑтете ја Вашата лозинка на %1$s." +#. TRANS: Button text for disconnecting a Twitter account. +msgctxt "BUTTON" msgid "Disconnect" -msgstr "Прекини" +msgstr "Прекрати" +#. TRANS: Fieldset legend. msgid "Preferences" msgstr "Ðагодувања" +#. TRANS: Checkbox label. msgid "Automatically send my notices to Twitter." msgstr "ÐвтоматÑки иÑпраќај ми ги забелешките на Twitter." +#. TRANS: Checkbox label. msgid "Send local \"@\" replies to Twitter." msgstr "ИÑпраќај локални „@“ одговори на Twitter." +#. TRANS: Checkbox label. msgid "Subscribe to my Twitter friends here." msgstr "Претплатете Ñе на пријателите од Twitter тука." +#. TRANS: Checkbox label. msgid "Import my friends timeline." msgstr "Увези ја хронологијата на моите пријатели." +#. TRANS: Button text for saving Twitter integration settings. +#. TRANS: Button text for saving the administrative Twitter bridge settings. +msgctxt "BUTTON" msgid "Save" msgstr "Зачувај" +#. TRANS: Button text for adding Twitter integration. +msgctxt "BUTTON" msgid "Add" msgstr "Додај" +#. TRANS: Client error displayed when the session token does not match or is not given. msgid "There was a problem with your session token. Try again, please." msgstr "Се појави проблем Ñо жетонот на Вашата ÑеÑија. Обидете Ñе повторно." +#. TRANS: Client error displayed when the submitted form contains unexpected data. msgid "Unexpected form submission." msgstr "Ðеочекувано поднеÑување на образец." +#. TRANS: Client error displayed when trying to remove a connected Twitter account when there isn't one connected. msgid "No Twitter connection to remove." msgstr "Ðема врÑка Ñо Twitter за отÑтранување." -msgid "Couldn't remove Twitter user." -msgstr "Ðе можев да го отÑтранам кориÑникот на Twitter." +#. TRANS: Server error displayed when trying to remove a connected Twitter account fails. +msgid "Could not remove Twitter user." +msgstr "Ðе можев да го отÑтранам кориÑникот од Twitter." +#. TRANS: Success message displayed after disconnecting a Twitter account. msgid "Twitter account disconnected." msgstr "Ð’Ñ€Ñката Ñо Ñметката на Twitter е прекината." -msgid "Couldn't save Twitter preferences." +#. TRANS: Server error displayed when saving Twitter integration preferences fails. +msgid "Could not save Twitter preferences." msgstr "Ðе можев да ги зачувам нагодувањата за Twitter." +#. TRANS: Success message after saving Twitter integration preferences. msgid "Twitter preferences saved." msgstr "Ðагодувањата за Twitter Ñе зачувани." +#. TRANS: Form validation error displayed when the checkbox to agree to the license has not been checked. msgid "You cannot register if you do not agree to the license." msgstr "Ðе можете да Ñе региÑтрирате ако не Ñе ÑоглаÑувате Ñо лиценцата." +#. TRANS: Form validation error displayed when an unhandled error occurs. msgid "Something weird happened." msgstr "Се Ñлучи нешто чудно." +#. TRANS: Server error displayed when linking to a Twitter account fails. msgid "Could not link your Twitter account." msgstr "Ðе можам да ја поврзам Вашата Ñметка на Twitter." -msgid "Couldn't link your Twitter account: oauth_token mismatch." +#. TRANS: Server error displayed when linking to a Twitter account fails because of an incorrect oauth_token. +msgid "Could not link your Twitter account: oauth_token mismatch." msgstr "" "Ðе можев да ја поврзам Вашата Ñметка на Twitter: неÑоглаÑување Ñо " "oauth_token." -msgid "Couldn't link your Twitter account." -msgstr "Ðе можам да ја поврзам Вашата Ñметка на Twitter." - +#. TRANS: Page instruction. %s is the StatusNet sitename. #, php-format msgid "" -"This is the first time you've logged into %s so we must connect your Twitter " -"account to a local account. You can either create a new account, or connect " -"with your existing account, if you have one." +"This is the first time you have logged into %s so we must connect your " +"Twitter account to a local account. You can either create a new account, or " +"connect with your existing account, if you have one." msgstr "" "Ова е прв пат како Ñе најавувате на %s, па затоа мораме да ја поврземе " "Вашата Ñметка на Twitter Ñо локална Ñметка. Можете да Ñоздадете нова Ñметка, " -"или пак да Ñе поврзете Ñо Вашата поÑтоечка Ñметка (ако ја имате)." +"или пак да Ñе поврзете Ñо поÑтоечката (ако ја имате)." +#. TRANS: Page title. msgid "Twitter Account Setup" msgstr "ПоÑтавки за Ñметката на Twitter" +#. TRANS: Fieldset legend. msgid "Connection options" msgstr "Ðагодувања за врÑка" +#. TRANS: Fieldset legend. +msgid "Create new account" +msgstr "Создај нова Ñметка" + +#. TRANS: Sub form introduction text. +msgid "Create a new user with this nickname." +msgstr "Создај нов кориÑник Ñо овој прекар." + +#. TRANS: Field label. +msgid "New nickname" +msgstr "Ðов прекар" + +#. TRANS: Field title for nickname field. +msgid "1-64 lowercase letters or numbers, no punctuation or spaces." +msgstr "1-64 мали букви или бројки, без интерпункциÑки знаци и празни меÑта." + +#. TRANS: Field label. +msgctxt "LABEL" +msgid "Email" +msgstr "Е-пошта" + +#. TRANS: Field title for e-mail address field. +msgid "Used only for updates, announcements, and password recovery" +msgstr "Се кориÑти Ñамо за подновувања, објави и повраќање на лозинка." + +#. TRANS: Button text for creating a new StatusNet account in the Twitter connect page. +msgctxt "BUTTON" +msgid "Create" +msgstr "Создај" + +#. TRANS: Fieldset legend. +msgid "Connect existing account" +msgstr "Поврзи поÑтоечка Ñметка" + +#. TRANS: Sub form introduction text. +msgid "" +"If you already have an account, login with your username and password to " +"connect it to your Twitter account." +msgstr "" +"Ðко веќе имате Ñметка, најавете Ñе Ñо кориÑничкото име и лозинката за да ја " +"поврзете Ñо профилот на Twitter." + +#. TRANS: Field label. +msgid "Existing nickname" +msgstr "ПоÑтоечки прекар" + +#. TRANS: Field label. +msgid "Password" +msgstr "Лозинка" + +#. TRANS: Fieldset legend. +msgid "License" +msgstr "Лиценца" + +#. TRANS: Text for license agreement checkbox. +#. TRANS: %s is the license as configured for the StatusNet site. #, php-format msgid "" "My text and files are available under %s except this private data: password, " @@ -146,117 +229,110 @@ msgstr "" "Мојот текÑÑ‚ и податотеки Ñе доÑтапни под %s, оÑвен Ñледниве приватни " "податоци: лозинка, е-пошта, ÐП-адреÑа и телефонÑки број." -msgid "Create new account" -msgstr "Создај нова Ñметка" - -msgid "Create a new user with this nickname." -msgstr "Создај нов кориÑник Ñо овој прекар." - -msgid "New nickname" -msgstr "Ðов прекар" - -msgid "1-64 lowercase letters or numbers, no punctuation or spaces." -msgstr "1-64 мали букви или бројки, без интерпункциÑки знаци и празни меÑта." - -msgctxt "LABEL" -msgid "Email" -msgstr "Е-пошта" - -msgid "Used only for updates, announcements, and password recovery" -msgstr "Се кориÑти Ñамо за подновувања, објави и повраќање на лозинка." - -msgid "Create" -msgstr "Создај" - -msgid "Connect existing account" -msgstr "Поврзи поÑтоечка Ñметка" - -msgid "" -"If you already have an account, login with your username and password to " -"connect it to your Twitter account." -msgstr "" -"Ðко веќе имате Ñметка, најавете Ñе Ñо кориÑничкото име и лозинката за да ја " -"поврзете Ñо профилот на Twitter." - -msgid "Existing nickname" -msgstr "ПоÑтоечки прекар" - -msgid "Password" -msgstr "Лозинка" - +#. TRANS: Button text for connecting an existing StatusNet account in the Twitter connect page.. +msgctxt "BUTTON" msgid "Connect" msgstr "Поврзи Ñе" +#. TRANS: Client error displayed when trying to create a new user while creating new users is not allowed. msgid "Registration not allowed." msgstr "РегиÑтрацијата не е дозволена." +#. TRANS: Client error displayed when trying to create a new user with an invalid invitation code. msgid "Not a valid invitation code." msgstr "Ова не е важечки код за покана." +#. TRANS: Client error displayed when trying to create a new user with an invalid username. msgid "Nickname not allowed." msgstr "Прекарот не е дозволен." +#. TRANS: Client error displayed when trying to create a new user with a username that is already in use. msgid "Nickname already in use. Try another one." msgstr "Прекарот е зафатен. Одберете друг." +#. TRANS: Server error displayed when creating a new user has failed. msgid "Error registering user." msgstr "Грешка при региÑтрирање на кориÑникот." +#. TRANS: Server error displayed when connecting a user to a Twitter user has failed. +#. TRANS: Server error displayed connecting a user to a Twitter user has failed. msgid "Error connecting user to Twitter." msgstr "Грешка при поврзувањето на кориÑникот Ñо Twitter." +#. TRANS: Form validation error displayed when connecting an existing user to a Twitter user fails because +#. TRANS: the provided username and/or password are incorrect. msgid "Invalid username or password." msgstr "Ðеважечко кориÑничко име или лозинка." +#. TRANS: Page title for Twitter administration panel. +msgctxt "TITLE" msgid "Twitter" msgstr "Twitter" +#. TRANS: Instructions for Twitter bridge administration page. msgid "Twitter bridge settings" msgstr "ПоÑтавки за моÑтот до Twitter" -msgid "Invalid consumer key. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer key is invalid because it is too long. +msgid "Invalid consumer key. Maximum length is 255 characters." msgstr "Ðеважечки потрошувачки клуч. Дозволени Ñе највеќе 255 знаци." -msgid "Invalid consumer secret. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer secret is invalid because it is too long. +msgid "Invalid consumer secret. Maximum length is 255 characters." msgstr "Ðеважечка потрошувачка тајна. Дозволени Ñе највеќе 255 знаци." +#. TRANS: Fieldset legend for Twitter application settings. msgid "Twitter application settings" msgstr "Ðагодувања на програмчето за Twitter" +#. TRANS: Field label for Twitter assigned consumer key. msgid "Consumer key" msgstr "Потрошувачки клуч" -msgid "Consumer key assigned by Twitter" -msgstr "Потрошувачкиот клуч доделен од Twitter" +#. TRANS: Field title for Twitter assigned consumer key. +msgid "The consumer key assigned by Twitter." +msgstr "Потрошувачкиот клуч доделен од Twitter." +#. TRANS: Field label for Twitter assigned consumer secret. msgid "Consumer secret" msgstr "Потрошувачка тајна" -msgid "Consumer secret assigned by Twitter" -msgstr "Потрошувачката тајна доделена од Twitter" +#. TRANS: Field title for Twitter assigned consumer secret. +msgid "The consumer secret assigned by Twitter." +msgstr "Потрошувачката тајна доделена од Twitter." -msgid "Note: a global consumer key and secret are set." -msgstr "Ðапомена: поÑтавени Ñе глобални потрошувачки клуч и тајна." +#. TRANS: Form guide displayed when two required fields have already been provided. +msgid "Note: A global consumer key and secret are set." +msgstr "" +"Ðапомена: ПоÑтавени Ñе е глобален потрошувачки клуч и потрошувачка тајна." +#. TRANS: Field label for Twitter application name. msgid "Integration source" msgstr "Извор на Ñоединување" -msgid "Name of your Twitter application" -msgstr "Име на Вашето програмче за Twitter" +#. TRANS: Field title for Twitter application name. +msgid "The name of your Twitter application." +msgstr "Име на Вашето програмче за Twitter." +#. TRANS: Fieldset legend for Twitter integration options. msgid "Options" msgstr "ПоÑтавки" +#. TRANS: Checkbox label for global setting. msgid "Enable \"Sign-in with Twitter\"" msgstr "Овозможи „најава Ñо Twitter“" -msgid "Allow users to login with their Twitter credentials" +#. TRANS: Checkbox title. +msgid "This allow users to login with their Twitter credentials." msgstr "" -"Им овозможува на кориÑниците да Ñе најавуваат Ñо нивните податоци од Twitter" +"Ова им овозможува на кориÑниците да Ñе најавуваат Ñо нивните податоци од " +"Twitter." +#. TRANS: Checkbox label for global setting. msgid "Enable Twitter import" msgstr "Овозможу увоз од Twitter" +#. TRANS: Checkbox title for global setting. msgid "" "Allow users to import their Twitter friends' timelines. Requires daemons to " "be manually configured." @@ -264,18 +340,65 @@ msgstr "" "Им овозможува на кориÑниците да ги увезуваат хронологиите на нивните " "пријатели на Twitter. Бара рачно нагодување на демоните." -msgid "Save Twitter settings" -msgstr "Зачувај нагодувања на Twitter" +#. TRANS: Button title for saving the administrative Twitter bridge settings. +msgid "Save the Twitter bridge settings." +msgstr "Зачувај ги поÑтавките за моÑтот до Twitter." -msgid "Login or register using Twitter" -msgstr "Ðајава или региÑтрација Ñо Twitter" +#. TRANS: Server exception thrown when an invalid URL scheme is detected. +msgid "Invalid URL scheme for HTTP stream reader." +msgstr "Ðеважечка URL-шема за читачот на HTTP-каналот." +#. TRANS: Exception thrown when input from an inexpected socket is encountered. +msgid "Got input from unexpected socket!" +msgstr "Добив влезни податоци од неочекуван извор!" + +#. TRANS: Exception thrown when an invalid state is encountered in handleLine. +#. TRANS: %s is the invalid state. +#, php-format +msgid "Invalid state in handleLine: %s." +msgstr "Ðеважечка ÑоÑтојба во handleLine: %s." + +#. TRANS: Exception thrown when an invalid response line is encountered. +#. TRANS: %s is the invalid line. +#, php-format +msgid "Invalid HTTP response line: %s." +msgstr "Ðеважечки ред во одговорот Ñо HTTP: %s." + +#. TRANS: Exception thrown when an invalid response line part is encountered. +#. TRANS: %1$s is the chunk, %2$s is the line. +#, php-format +msgid "Invalid HTTP response line chunk \"%1$s\": %2$s." +msgstr "Ðеважечко парче „%1$s“ од редот во одговорот Ñо HTTP: %2$s." + +#. TRANS: Exception thrown when an invalid response code is encountered. +#. TRANS: %1$s is the response code, %2$s is the line. +#, php-format +msgid "Bad HTTP response code %1$s: %2$s." +msgstr "Ðеправилен код %1$s на одговорот Ñо HTTP: %2$s." + +#. TRANS: Menu item in login navigation. +#. TRANS: Menu item in connection settings navigation. +msgctxt "MENU" +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Title for menu item in login navigation. +msgid "Login or register using Twitter." +msgstr "Ðајава или региÑтрација Ñо Twitter." + +#. TRANS: Title for menu item in connection settings navigation. msgid "Twitter integration options" msgstr "Ðагодувања за обединување Ñо Twitter" -msgid "Twitter bridge configuration" -msgstr "Ðагодувања за моÑтот до Twitter" +#. TRANS: Menu item in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter" +msgstr "Twitter" +#. TRANS: Menu item title in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter bridge configuration page." +msgstr "Ðагодувања за моÑтот до Twitter." + +#. TRANS: Plugin description. msgid "" "The Twitter \"bridge\" plugin allows integration of a StatusNet instance " "with Twitter." @@ -283,15 +406,20 @@ msgstr "" "Приклучокот за „моÑт“ до Twitter овозможува Ñоединување на примерок на " "StatusNet Ñо Twitter." +#. TRANS: Client error displayed when trying to log in using Twitter while already logged in to StatusNet. msgid "Already logged in." msgstr "Веќе Ñте најавени." +#. TRANS: Title for login using Twitter page. +msgctxt "TITLE" msgid "Twitter Login" msgstr "Ðајава Ñо Twitter" +#. TRANS: Instructions for login using Twitter page. msgid "Login with your Twitter account" msgstr "Ðајава Ñо Вашата Ñметка од Twitter" +#. TRANS: Alternative text for "sign in with Twitter" image. msgid "Sign in with Twitter" msgstr "Ðајава Ñо Twitter" diff --git a/plugins/TwitterBridge/locale/ms/LC_MESSAGES/TwitterBridge.po b/plugins/TwitterBridge/locale/ms/LC_MESSAGES/TwitterBridge.po index 2d97251097..10066369d6 100644 --- a/plugins/TwitterBridge/locale/ms/LC_MESSAGES/TwitterBridge.po +++ b/plugins/TwitterBridge/locale/ms/LC_MESSAGES/TwitterBridge.po @@ -9,21 +9,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TwitterBridge\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:45+0000\n" -"Language-Team: Malay \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:22+0000\n" +"Language-Team: Malay \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ms\n" "X-Message-Group: #out-statusnet-plugin-twitterbridge\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Title for page with Twitter integration settings. msgid "Twitter settings" msgstr "Tetapan Twitter" +#. TRANS: Instructions for page with Twitter integration settings. msgid "" "Connect your Twitter account to share your updates with your Twitter friends " "and vice-versa." @@ -31,219 +33,307 @@ msgstr "" "Sambungkan akaun Twitter anda untuk berkongsi kemaskini dengan rakan-rakan " "Twitter anda." +#. TRANS: Fieldset legend. msgid "Twitter account" msgstr "Akaun Twitter" +#. TRANS: Form note when a Twitter account has been connected. msgid "Connected Twitter account" msgstr "Akaun Twitter disambungkan" +#. TRANS: Fieldset legend. msgid "Disconnect my account from Twitter" msgstr "Putuskan akaun saya dari Twitter" -msgid "Disconnecting your Twitter could make it impossible to log in! Please " +#. TRANS: Form guide. %s is a URL to the password settings. +#. TRANS: This message contains a Markdown link in the form [description](link). +#, fuzzy, php-format +msgid "" +"Disconnecting your Twitter account could make it impossible to log in! " +"Please [set a password](%s) first." msgstr "Jika Twitter anda diputuskan, mungkin tak boleh log masuk! Tolong " -msgid "set a password" -msgstr "tetapkan kata laluan" - -msgid " first." -msgstr " terlebih dahulu." - -#. TRANS: %1$s is the current website name. +#. TRANS: Form instructions. %1$s is the StatusNet sitename. #, php-format msgid "" "Keep your %1$s account but disconnect from Twitter. You can use your %1$s " "password to log in." msgstr "" +#. TRANS: Button text for disconnecting a Twitter account. +#, fuzzy +msgctxt "BUTTON" msgid "Disconnect" msgstr "Putuskan" +#. TRANS: Fieldset legend. msgid "Preferences" msgstr "Keutamaan" +#. TRANS: Checkbox label. msgid "Automatically send my notices to Twitter." msgstr "Hantarkan notis saya secara automatik ke Twitter." +#. TRANS: Checkbox label. msgid "Send local \"@\" replies to Twitter." msgstr "Hantarkan balasan \"@\" setempat ke Twitter." +#. TRANS: Checkbox label. msgid "Subscribe to my Twitter friends here." msgstr "Langgan kawan-kawan Twitter saya di sini." +#. TRANS: Checkbox label. msgid "Import my friends timeline." msgstr "Import garis masa kawan-kawan saya." +#. TRANS: Button text for saving Twitter integration settings. +#. TRANS: Button text for saving the administrative Twitter bridge settings. +#, fuzzy +msgctxt "BUTTON" msgid "Save" msgstr "Simpan" +#. TRANS: Button text for adding Twitter integration. +#, fuzzy +msgctxt "BUTTON" msgid "Add" msgstr "Tambahkan" +#. TRANS: Client error displayed when the session token does not match or is not given. msgid "There was a problem with your session token. Try again, please." msgstr "" +#. TRANS: Client error displayed when the submitted form contains unexpected data. msgid "Unexpected form submission." msgstr "" +#. TRANS: Client error displayed when trying to remove a connected Twitter account when there isn't one connected. msgid "No Twitter connection to remove." msgstr "Tiada sambungan Twitter untuk digugurkan." -msgid "Couldn't remove Twitter user." +#. TRANS: Server error displayed when trying to remove a connected Twitter account fails. +#, fuzzy +msgid "Could not remove Twitter user." msgstr "Pengguna Twitter tidak dapat digugurkan." +#. TRANS: Success message displayed after disconnecting a Twitter account. msgid "Twitter account disconnected." msgstr "" -msgid "Couldn't save Twitter preferences." -msgstr "" +#. TRANS: Server error displayed when saving Twitter integration preferences fails. +#, fuzzy +msgid "Could not save Twitter preferences." +msgstr "Pengguna Twitter tidak dapat digugurkan." +#. TRANS: Success message after saving Twitter integration preferences. msgid "Twitter preferences saved." msgstr "" +#. TRANS: Form validation error displayed when the checkbox to agree to the license has not been checked. msgid "You cannot register if you do not agree to the license." msgstr "" +#. TRANS: Form validation error displayed when an unhandled error occurs. msgid "Something weird happened." msgstr "" +#. TRANS: Server error displayed when linking to a Twitter account fails. #, fuzzy msgid "Could not link your Twitter account." msgstr "Log masuk dengan akaun Twitter anda" -msgid "Couldn't link your Twitter account: oauth_token mismatch." -msgstr "" - -msgid "Couldn't link your Twitter account." -msgstr "" +#. TRANS: Server error displayed when linking to a Twitter account fails because of an incorrect oauth_token. +#, fuzzy +msgid "Could not link your Twitter account: oauth_token mismatch." +msgstr "Log masuk dengan akaun Twitter anda" +#. TRANS: Page instruction. %s is the StatusNet sitename. #, php-format msgid "" -"This is the first time you've logged into %s so we must connect your Twitter " -"account to a local account. You can either create a new account, or connect " -"with your existing account, if you have one." +"This is the first time you have logged into %s so we must connect your " +"Twitter account to a local account. You can either create a new account, or " +"connect with your existing account, if you have one." msgstr "" +#. TRANS: Page title. msgid "Twitter Account Setup" msgstr "Persediaan Akaun Twitter" +#. TRANS: Fieldset legend. msgid "Connection options" msgstr "Opsyen sambungan" +#. TRANS: Fieldset legend. +msgid "Create new account" +msgstr "Buka akaun baru" + +#. TRANS: Sub form introduction text. +msgid "Create a new user with this nickname." +msgstr "" + +#. TRANS: Field label. +msgid "New nickname" +msgstr "" + +#. TRANS: Field title for nickname field. +msgid "1-64 lowercase letters or numbers, no punctuation or spaces." +msgstr "" + +#. TRANS: Field label. +msgctxt "LABEL" +msgid "Email" +msgstr "E-mel" + +#. TRANS: Field title for e-mail address field. +msgid "Used only for updates, announcements, and password recovery" +msgstr "" + +#. TRANS: Button text for creating a new StatusNet account in the Twitter connect page. +#, fuzzy +msgctxt "BUTTON" +msgid "Create" +msgstr "Cipta" + +#. TRANS: Fieldset legend. +msgid "Connect existing account" +msgstr "Sambungkan akaun yang sedia ada" + +#. TRANS: Sub form introduction text. +msgid "" +"If you already have an account, login with your username and password to " +"connect it to your Twitter account." +msgstr "" + +#. TRANS: Field label. +msgid "Existing nickname" +msgstr "" + +#. TRANS: Field label. +msgid "Password" +msgstr "" + +#. TRANS: Fieldset legend. +msgid "License" +msgstr "" + +#. TRANS: Text for license agreement checkbox. +#. TRANS: %s is the license as configured for the StatusNet site. #, php-format msgid "" "My text and files are available under %s except this private data: password, " "email address, IM address, and phone number." msgstr "" -msgid "Create new account" -msgstr "Buka akaun baru" - -msgid "Create a new user with this nickname." -msgstr "" - -msgid "New nickname" -msgstr "" - -msgid "1-64 lowercase letters or numbers, no punctuation or spaces." -msgstr "" - -msgctxt "LABEL" -msgid "Email" -msgstr "E-mel" - -msgid "Used only for updates, announcements, and password recovery" -msgstr "" - -msgid "Create" -msgstr "Cipta" - -msgid "Connect existing account" -msgstr "Sambungkan akaun yang sedia ada" - -msgid "" -"If you already have an account, login with your username and password to " -"connect it to your Twitter account." -msgstr "" - -msgid "Existing nickname" -msgstr "" - -msgid "Password" -msgstr "" - +#. TRANS: Button text for connecting an existing StatusNet account in the Twitter connect page.. +#, fuzzy +msgctxt "BUTTON" msgid "Connect" -msgstr "" +msgstr "Putuskan" +#. TRANS: Client error displayed when trying to create a new user while creating new users is not allowed. msgid "Registration not allowed." msgstr "" +#. TRANS: Client error displayed when trying to create a new user with an invalid invitation code. msgid "Not a valid invitation code." msgstr "" +#. TRANS: Client error displayed when trying to create a new user with an invalid username. msgid "Nickname not allowed." msgstr "" +#. TRANS: Client error displayed when trying to create a new user with a username that is already in use. msgid "Nickname already in use. Try another one." msgstr "" +#. TRANS: Server error displayed when creating a new user has failed. msgid "Error registering user." msgstr "" +#. TRANS: Server error displayed when connecting a user to a Twitter user has failed. +#. TRANS: Server error displayed connecting a user to a Twitter user has failed. msgid "Error connecting user to Twitter." msgstr "" +#. TRANS: Form validation error displayed when connecting an existing user to a Twitter user fails because +#. TRANS: the provided username and/or password are incorrect. msgid "Invalid username or password." msgstr "" +#. TRANS: Page title for Twitter administration panel. +#, fuzzy +msgctxt "TITLE" msgid "Twitter" msgstr "Twitter" +#. TRANS: Instructions for Twitter bridge administration page. msgid "Twitter bridge settings" msgstr "Tetapan pengantara Twitter" -msgid "Invalid consumer key. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer key is invalid because it is too long. +#, fuzzy +msgid "Invalid consumer key. Maximum length is 255 characters." msgstr "Kunci pengguna tidak sah. Panjang maksimum 255 aksara." -msgid "Invalid consumer secret. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer secret is invalid because it is too long. +#, fuzzy +msgid "Invalid consumer secret. Maximum length is 255 characters." msgstr "Rahsia pengguna tidak sah. Panjang maksimum 255 aksara." +#. TRANS: Fieldset legend for Twitter application settings. msgid "Twitter application settings" msgstr "" +#. TRANS: Field label for Twitter assigned consumer key. msgid "Consumer key" msgstr "Kunci pengguna" -msgid "Consumer key assigned by Twitter" +#. TRANS: Field title for Twitter assigned consumer key. +#, fuzzy +msgid "The consumer key assigned by Twitter." msgstr "Kunci pengguna yang diperuntukkan oleh Twitter" +#. TRANS: Field label for Twitter assigned consumer secret. msgid "Consumer secret" msgstr "Rahsia pengguna" -msgid "Consumer secret assigned by Twitter" +#. TRANS: Field title for Twitter assigned consumer secret. +#, fuzzy +msgid "The consumer secret assigned by Twitter." msgstr "Rahsia pengguna yang diperuntukkan oleh Twitter" -msgid "Note: a global consumer key and secret are set." +#. TRANS: Form guide displayed when two required fields have already been provided. +#, fuzzy +msgid "Note: A global consumer key and secret are set." msgstr "Perhatian: kunci dan rahsia pengguna global telah ditetapkan." +#. TRANS: Field label for Twitter application name. msgid "Integration source" msgstr "Sumber penyepaduan" -msgid "Name of your Twitter application" +#. TRANS: Field title for Twitter application name. +#, fuzzy +msgid "The name of your Twitter application." msgstr "Nama aplikasi Twitter anda" +#. TRANS: Fieldset legend for Twitter integration options. msgid "Options" msgstr "Opsyen" +#. TRANS: Checkbox label for global setting. msgid "Enable \"Sign-in with Twitter\"" msgstr "Hidupkan \"Daftar masuk dengan Twitter\"" -msgid "Allow users to login with their Twitter credentials" +#. TRANS: Checkbox title. +#, fuzzy +msgid "This allow users to login with their Twitter credentials." msgstr "Benarkan pengguna log masuk dengan watikah Twitter" +#. TRANS: Checkbox label for global setting. msgid "Enable Twitter import" msgstr "Bolehkan import dari Twitter" +#. TRANS: Checkbox title for global setting. msgid "" "Allow users to import their Twitter friends' timelines. Requires daemons to " "be manually configured." @@ -251,18 +341,69 @@ msgstr "" "Benarkan pengguna mengimport garis masa kawan-kawannya di Twitter. Untuk " "itu, daemon perlu ditataletak secara manual." -msgid "Save Twitter settings" -msgstr "Simpan tetapan Twitter" +#. TRANS: Button title for saving the administrative Twitter bridge settings. +#, fuzzy +msgid "Save the Twitter bridge settings." +msgstr "Tetapan pengantara Twitter" -msgid "Login or register using Twitter" +#. TRANS: Server exception thrown when an invalid URL scheme is detected. +msgid "Invalid URL scheme for HTTP stream reader." +msgstr "" + +#. TRANS: Exception thrown when input from an inexpected socket is encountered. +msgid "Got input from unexpected socket!" +msgstr "" + +#. TRANS: Exception thrown when an invalid state is encountered in handleLine. +#. TRANS: %s is the invalid state. +#, php-format +msgid "Invalid state in handleLine: %s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response line is encountered. +#. TRANS: %s is the invalid line. +#, php-format +msgid "Invalid HTTP response line: %s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response line part is encountered. +#. TRANS: %1$s is the chunk, %2$s is the line. +#, php-format +msgid "Invalid HTTP response line chunk \"%1$s\": %2$s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response code is encountered. +#. TRANS: %1$s is the response code, %2$s is the line. +#, php-format +msgid "Bad HTTP response code %1$s: %2$s." +msgstr "" + +#. TRANS: Menu item in login navigation. +#. TRANS: Menu item in connection settings navigation. +#, fuzzy +msgctxt "MENU" +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Title for menu item in login navigation. +#, fuzzy +msgid "Login or register using Twitter." msgstr "Log masuk atau berdaftar dengan menggunakan Twitter" +#. TRANS: Title for menu item in connection settings navigation. msgid "Twitter integration options" msgstr "Opsyen penyepaduan Twitter" -msgid "Twitter bridge configuration" +#. TRANS: Menu item in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Menu item title in administrative panel that leads to the Twitter bridge configuration. +#, fuzzy +msgid "Twitter bridge configuration page." msgstr "Tatarajah pengantara Twitter" +#. TRANS: Plugin description. msgid "" "The Twitter \"bridge\" plugin allows integration of a StatusNet instance " "with Twitter." @@ -270,15 +411,21 @@ msgstr "" "Pemalam \"penghubung\" Twitter membolehkan penyepaduan peristiwa StatusNet " "dengan Twitter." +#. TRANS: Client error displayed when trying to log in using Twitter while already logged in to StatusNet. msgid "Already logged in." msgstr "Sudah log masuk." +#. TRANS: Title for login using Twitter page. +#, fuzzy +msgctxt "TITLE" msgid "Twitter Login" msgstr "Log masuk Twitter" +#. TRANS: Instructions for login using Twitter page. msgid "Login with your Twitter account" msgstr "Log masuk dengan akaun Twitter anda" +#. TRANS: Alternative text for "sign in with Twitter" image. msgid "Sign in with Twitter" msgstr "Daftar masuk dengan Twitter" diff --git a/plugins/TwitterBridge/locale/nl/LC_MESSAGES/TwitterBridge.po b/plugins/TwitterBridge/locale/nl/LC_MESSAGES/TwitterBridge.po index 632384e3b7..3791d76da7 100644 --- a/plugins/TwitterBridge/locale/nl/LC_MESSAGES/TwitterBridge.po +++ b/plugins/TwitterBridge/locale/nl/LC_MESSAGES/TwitterBridge.po @@ -9,21 +9,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TwitterBridge\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:45+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:22+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-twitterbridge\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Title for page with Twitter integration settings. msgid "Twitter settings" msgstr "Twitterinstellingen" +#. TRANS: Instructions for page with Twitter integration settings. msgid "" "Connect your Twitter account to share your updates with your Twitter friends " "and vice-versa." @@ -31,27 +33,29 @@ msgstr "" "Koppel uw Twittergebruiker om uw berichten te delen met uw Twittervrienden " "en vice versa." +#. TRANS: Fieldset legend. msgid "Twitter account" msgstr "Twittergebruiker" +#. TRANS: Form note when a Twitter account has been connected. msgid "Connected Twitter account" msgstr "Gekoppelde Twittergebruiker" +#. TRANS: Fieldset legend. msgid "Disconnect my account from Twitter" msgstr "Mijn gebruiker loskoppelen van Twitter" -msgid "Disconnecting your Twitter could make it impossible to log in! Please " +#. TRANS: Form guide. %s is a URL to the password settings. +#. TRANS: This message contains a Markdown link in the form [description](link). +#, php-format +msgid "" +"Disconnecting your Twitter account could make it impossible to log in! " +"Please [set a password](%s) first." msgstr "" -"Loskoppelen van uw Twittergebruiker zou ervoor zorgen dat u niet langer kunt " -"aanmelden. U moet eerst " +"Door uw Twittergebruiker los te koppelen, kunt u mogelijk niet meer " +"aanmelden! [Stel eerst een wachtwoord in](%s)." -msgid "set a password" -msgstr "een wachtwoord instellen" - -msgid " first." -msgstr " voordat u verder kunt met deze handeling." - -#. TRANS: %1$s is the current website name. +#. TRANS: Form instructions. %1$s is the StatusNet sitename. #, php-format msgid "" "Keep your %1$s account but disconnect from Twitter. You can use your %1$s " @@ -60,86 +64,165 @@ msgstr "" "Uw gebruiker bij %1$s behouden maar deze loskoppelen van Twitter. U kunt uw " "wachtwoord van %1$s gebruiken om aan te melden." +#. TRANS: Button text for disconnecting a Twitter account. +msgctxt "BUTTON" msgid "Disconnect" msgstr "Loskoppelen" +#. TRANS: Fieldset legend. msgid "Preferences" msgstr "Voorkeuren" +#. TRANS: Checkbox label. msgid "Automatically send my notices to Twitter." msgstr "Mijn berichten automatisch naar Twitter verzenden" +#. TRANS: Checkbox label. msgid "Send local \"@\" replies to Twitter." msgstr "Lokale antwoorden met \"2\" naar Twitter verzenden." +#. TRANS: Checkbox label. msgid "Subscribe to my Twitter friends here." msgstr "Hier op mijn Twittervrienden abonneren." +#. TRANS: Checkbox label. msgid "Import my friends timeline." msgstr "Tijdlijn van mijn vrienden importeren." +#. TRANS: Button text for saving Twitter integration settings. +#. TRANS: Button text for saving the administrative Twitter bridge settings. +msgctxt "BUTTON" msgid "Save" msgstr "Opslaan" +#. TRANS: Button text for adding Twitter integration. +msgctxt "BUTTON" msgid "Add" msgstr "Toevoegen" +#. TRANS: Client error displayed when the session token does not match or is not given. msgid "There was a problem with your session token. Try again, please." msgstr "" "Er is een probleem ontstaan met uw sessie. Probeer het nog een keer, " "alstublieft." +#. TRANS: Client error displayed when the submitted form contains unexpected data. msgid "Unexpected form submission." msgstr "Het formulier is onverwacht ingezonden." +#. TRANS: Client error displayed when trying to remove a connected Twitter account when there isn't one connected. msgid "No Twitter connection to remove." msgstr "Er is geen Twitterkoppeling om te verwijderen." -msgid "Couldn't remove Twitter user." +#. TRANS: Server error displayed when trying to remove a connected Twitter account fails. +msgid "Could not remove Twitter user." msgstr "Het was niet mogelijk de Twittergebruiker te verwijderen." +#. TRANS: Success message displayed after disconnecting a Twitter account. msgid "Twitter account disconnected." msgstr "De Twittergebruiker is ontkoppeld." -msgid "Couldn't save Twitter preferences." +#. TRANS: Server error displayed when saving Twitter integration preferences fails. +msgid "Could not save Twitter preferences." msgstr "Het was niet mogelijk de Twittervoorkeuren op te slaan." +#. TRANS: Success message after saving Twitter integration preferences. msgid "Twitter preferences saved." msgstr "De Twitterinstellingen zijn opgeslagen." +#. TRANS: Form validation error displayed when the checkbox to agree to the license has not been checked. msgid "You cannot register if you do not agree to the license." msgstr "U kunt zich niet registreren als u niet met de licentie akkoord gaat." +#. TRANS: Form validation error displayed when an unhandled error occurs. msgid "Something weird happened." msgstr "Er is iets vreemds gebeurd." +#. TRANS: Server error displayed when linking to a Twitter account fails. msgid "Could not link your Twitter account." msgstr "Het was niet mogelijk uw Twittergebruiker te koppelen." -msgid "Couldn't link your Twitter account: oauth_token mismatch." +#. TRANS: Server error displayed when linking to a Twitter account fails because of an incorrect oauth_token. +msgid "Could not link your Twitter account: oauth_token mismatch." msgstr "" "Het was niet mogelijk uw Twittergebruiker te koppelen: het oauth_token kwam " "niet overeen." -msgid "Couldn't link your Twitter account." -msgstr "Het was niet mogelijk uw Twittergebruiker te koppelen." - +#. TRANS: Page instruction. %s is the StatusNet sitename. #, php-format msgid "" -"This is the first time you've logged into %s so we must connect your Twitter " -"account to a local account. You can either create a new account, or connect " -"with your existing account, if you have one." +"This is the first time you have logged into %s so we must connect your " +"Twitter account to a local account. You can either create a new account, or " +"connect with your existing account, if you have one." msgstr "" "Dit is de eerste keer dat u aanmeldt bij %s en dan moeten we uw " "Twittergebruiker koppelen met uw lokale gebruiker. U kunt een nieuwe " "gebruiker aanmaken of koppelen met een bestaande gebruiker als u die al hebt." +#. TRANS: Page title. msgid "Twitter Account Setup" msgstr "Instellingen Twittergebruiker" +#. TRANS: Fieldset legend. msgid "Connection options" msgstr "Koppelingsinstellingen" +#. TRANS: Fieldset legend. +msgid "Create new account" +msgstr "Nieuwe gebruiker aanmaken" + +#. TRANS: Sub form introduction text. +msgid "Create a new user with this nickname." +msgstr "Nieuwe gebruiker aanmaken met deze gebruikersnaam." + +#. TRANS: Field label. +msgid "New nickname" +msgstr "Nieuwe gebruikersnaam" + +#. TRANS: Field title for nickname field. +msgid "1-64 lowercase letters or numbers, no punctuation or spaces." +msgstr "1-64 kleine letters of cijfers, geen leestekens of spaties." + +#. TRANS: Field label. +msgctxt "LABEL" +msgid "Email" +msgstr "E-mail" + +#. TRANS: Field title for e-mail address field. +msgid "Used only for updates, announcements, and password recovery" +msgstr "Alleen gebruikt voor updates, aankondigingen en wachtwoordherstel." + +#. TRANS: Button text for creating a new StatusNet account in the Twitter connect page. +msgctxt "BUTTON" +msgid "Create" +msgstr "Aanmaken" + +#. TRANS: Fieldset legend. +msgid "Connect existing account" +msgstr "Verbinden met een bestaande gebruiker" + +#. TRANS: Sub form introduction text. +msgid "" +"If you already have an account, login with your username and password to " +"connect it to your Twitter account." +msgstr "" +"Als u al een gebruiker hebt, meld dan aan met uw gebruikersnaam en " +"wachtwoord om deze daarna te koppelen met uw Twittergebruiker." + +#. TRANS: Field label. +msgid "Existing nickname" +msgstr "Bestaande gebruikersnaam" + +#. TRANS: Field label. +msgid "Password" +msgstr "Wachtwoord" + +#. TRANS: Fieldset legend. +msgid "License" +msgstr "Licentie" + +#. TRANS: Text for license agreement checkbox. +#. TRANS: %s is the license as configured for the StatusNet site. #, php-format msgid "" "My text and files are available under %s except this private data: password, " @@ -148,119 +231,110 @@ msgstr "" "Mijn teksten en bestanden zijn beschikbaar onder %s, behalve de volgende " "privégegevens: wachtwoord, e-mailadres, IM-adres, telefoonnummer." -msgid "Create new account" -msgstr "Nieuwe gebruiker aanmaken" - -msgid "Create a new user with this nickname." -msgstr "Nieuwe gebruiker aanmaken met deze gebruikersnaam." - -msgid "New nickname" -msgstr "Nieuwe gebruikersnaam" - -msgid "1-64 lowercase letters or numbers, no punctuation or spaces." -msgstr "1-64 kleine letters of cijfers, geen leestekens of spaties." - -msgctxt "LABEL" -msgid "Email" -msgstr "E-mail" - -msgid "Used only for updates, announcements, and password recovery" -msgstr "Alleen gebruikt voor updates, aankondigingen en wachtwoordherstel." - -msgid "Create" -msgstr "Aanmaken" - -msgid "Connect existing account" -msgstr "Verbinden met een bestaande gebruiker" - -msgid "" -"If you already have an account, login with your username and password to " -"connect it to your Twitter account." -msgstr "" -"Als u al een gebruiker hebt, meld dan aan met uw gebruikersnaam en " -"wachtwoord om deze daarna te koppelen met uw Twittergebruiker." - -msgid "Existing nickname" -msgstr "Bestaande gebruikersnaam" - -msgid "Password" -msgstr "Wachtwoord" - +#. TRANS: Button text for connecting an existing StatusNet account in the Twitter connect page.. +msgctxt "BUTTON" msgid "Connect" msgstr "Koppelen" +#. TRANS: Client error displayed when trying to create a new user while creating new users is not allowed. msgid "Registration not allowed." msgstr "Registratie is niet toegestaan." +#. TRANS: Client error displayed when trying to create a new user with an invalid invitation code. msgid "Not a valid invitation code." msgstr "De uitnodigingscode is ongeldig." +#. TRANS: Client error displayed when trying to create a new user with an invalid username. msgid "Nickname not allowed." msgstr "Gebruikersnaam niet toegestaan." +#. TRANS: Client error displayed when trying to create a new user with a username that is already in use. msgid "Nickname already in use. Try another one." msgstr "" "De opgegeven gebruikersnaam is al in gebruik. Kies een andere gebruikersnaam." +#. TRANS: Server error displayed when creating a new user has failed. msgid "Error registering user." msgstr "Fout bij het registreren van de gebruiker." +#. TRANS: Server error displayed when connecting a user to a Twitter user has failed. +#. TRANS: Server error displayed connecting a user to a Twitter user has failed. msgid "Error connecting user to Twitter." msgstr "Fout bij het verbinden van de gebruiker met Twitter." +#. TRANS: Form validation error displayed when connecting an existing user to a Twitter user fails because +#. TRANS: the provided username and/or password are incorrect. msgid "Invalid username or password." msgstr "Ongeldige gebruikersnaam of wachtwoord." +#. TRANS: Page title for Twitter administration panel. +msgctxt "TITLE" msgid "Twitter" msgstr "Twitter" +#. TRANS: Instructions for Twitter bridge administration page. msgid "Twitter bridge settings" msgstr "Instellingen Twitterkoppeling" -msgid "Invalid consumer key. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer key is invalid because it is too long. +msgid "Invalid consumer key. Maximum length is 255 characters." msgstr "Ongeldige gebruikerssleutel. De maximale lengte is 255 tekens." -msgid "Invalid consumer secret. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer secret is invalid because it is too long. +msgid "Invalid consumer secret. Maximum length is 255 characters." msgstr "Ongeldig gebruikersgeheim. De maximale lengte is 255 tekens." +#. TRANS: Fieldset legend for Twitter application settings. msgid "Twitter application settings" msgstr "Instellingen Twitterapplicatie" +#. TRANS: Field label for Twitter assigned consumer key. msgid "Consumer key" msgstr "Gebruikerssleutel" -msgid "Consumer key assigned by Twitter" -msgstr "Gebruikerssleutel uitgegeven door Twitter" +#. TRANS: Field title for Twitter assigned consumer key. +msgid "The consumer key assigned by Twitter." +msgstr "De gebruikerssleutel als uitgegeven door Twitter." +#. TRANS: Field label for Twitter assigned consumer secret. msgid "Consumer secret" msgstr "Gebruikersgeheim" -msgid "Consumer secret assigned by Twitter" -msgstr "Gebruikersgeheim uitgegeven door Twitter" +#. TRANS: Field title for Twitter assigned consumer secret. +msgid "The consumer secret assigned by Twitter." +msgstr "Het gebruikersgeheim als uitgegeven door Twitter." -msgid "Note: a global consumer key and secret are set." +#. TRANS: Form guide displayed when two required fields have already been provided. +msgid "Note: A global consumer key and secret are set." msgstr "Let op: er zijn een gebruikerssleutel en gebruikersgeheim ingesteld." +#. TRANS: Field label for Twitter application name. msgid "Integration source" msgstr "Integratiebron" -msgid "Name of your Twitter application" -msgstr "Naam van uw Twitterapplicatie" +#. TRANS: Field title for Twitter application name. +msgid "The name of your Twitter application." +msgstr "De naam van uw Twitterapplicatie." +#. TRANS: Fieldset legend for Twitter integration options. msgid "Options" msgstr "Opties" +#. TRANS: Checkbox label for global setting. msgid "Enable \"Sign-in with Twitter\"" msgstr "\"Aanmelden via Twitter\" inschakelen" -msgid "Allow users to login with their Twitter credentials" +#. TRANS: Checkbox title. +msgid "This allow users to login with their Twitter credentials." msgstr "" "Gebruikers toestaan aan te melden met hun gebruikersnaam en wachtwoord van " "Twitter" +#. TRANS: Checkbox label for global setting. msgid "Enable Twitter import" msgstr "Twitterimport inschakelen" +#. TRANS: Checkbox title for global setting. msgid "" "Allow users to import their Twitter friends' timelines. Requires daemons to " "be manually configured." @@ -268,18 +342,65 @@ msgstr "" "Gebruikers toestaan de tijdlijnen van hun Twittervrienden te importeren. " "Vereist handmatig te configureren daemons." -msgid "Save Twitter settings" -msgstr "Twitterinstellingen opslaan" +#. TRANS: Button title for saving the administrative Twitter bridge settings. +msgid "Save the Twitter bridge settings." +msgstr "De instellingen voor de Twitterkoppeling opslaan." -msgid "Login or register using Twitter" -msgstr "Aanmelden of registreren via Twitter" +#. TRANS: Server exception thrown when an invalid URL scheme is detected. +msgid "Invalid URL scheme for HTTP stream reader." +msgstr "Ongeldig URL-schema voor de HTTP streamlezer." +#. TRANS: Exception thrown when input from an inexpected socket is encountered. +msgid "Got input from unexpected socket!" +msgstr "Er is uitvoer ontvangen van een onverwachte socket!" + +#. TRANS: Exception thrown when an invalid state is encountered in handleLine. +#. TRANS: %s is the invalid state. +#, php-format +msgid "Invalid state in handleLine: %s." +msgstr "Ongeldige status in handleLIne: %s." + +#. TRANS: Exception thrown when an invalid response line is encountered. +#. TRANS: %s is the invalid line. +#, php-format +msgid "Invalid HTTP response line: %s." +msgstr "Ongeldige HTTP-responsregel: %s." + +#. TRANS: Exception thrown when an invalid response line part is encountered. +#. TRANS: %1$s is the chunk, %2$s is the line. +#, php-format +msgid "Invalid HTTP response line chunk \"%1$s\": %2$s." +msgstr "Ongeldig HTTP-responsregeldeel \"%1$s\": %2$s." + +#. TRANS: Exception thrown when an invalid response code is encountered. +#. TRANS: %1$s is the response code, %2$s is the line. +#, php-format +msgid "Bad HTTP response code %1$s: %2$s." +msgstr "Ongeldige HTTP-responscode %1$s: %2$s." + +#. TRANS: Menu item in login navigation. +#. TRANS: Menu item in connection settings navigation. +msgctxt "MENU" +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Title for menu item in login navigation. +msgid "Login or register using Twitter." +msgstr "Aanmelden of registreren via Twitter." + +#. TRANS: Title for menu item in connection settings navigation. msgid "Twitter integration options" msgstr "Opties voor Twitterintegratie" -msgid "Twitter bridge configuration" -msgstr "Instellingen voor Twitterkoppeling" +#. TRANS: Menu item in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter" +msgstr "Twitter" +#. TRANS: Menu item title in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter bridge configuration page." +msgstr "Pagina voor instellingen van de Twitterkoppeling." + +#. TRANS: Plugin description. msgid "" "The Twitter \"bridge\" plugin allows integration of a StatusNet instance " "with Twitter." @@ -287,15 +408,20 @@ msgstr "" "De plugin Twitter Brigde maakt het mogelijk en StatusNetinstallatie te " "integreren met Twitter." +#. TRANS: Client error displayed when trying to log in using Twitter while already logged in to StatusNet. msgid "Already logged in." msgstr "U bent al aangemeld." +#. TRANS: Title for login using Twitter page. +msgctxt "TITLE" msgid "Twitter Login" msgstr "Aanmelden via Twitter" +#. TRANS: Instructions for login using Twitter page. msgid "Login with your Twitter account" msgstr "Aanmelden met uw Twittergebruiker" +#. TRANS: Alternative text for "sign in with Twitter" image. msgid "Sign in with Twitter" msgstr "Aanmelden met Twitter" diff --git a/plugins/TwitterBridge/locale/tl/LC_MESSAGES/TwitterBridge.po b/plugins/TwitterBridge/locale/tl/LC_MESSAGES/TwitterBridge.po index 46b2b6aa9e..2abee72dba 100644 --- a/plugins/TwitterBridge/locale/tl/LC_MESSAGES/TwitterBridge.po +++ b/plugins/TwitterBridge/locale/tl/LC_MESSAGES/TwitterBridge.po @@ -9,21 +9,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TwitterBridge\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:46+0000\n" -"Language-Team: Tagalog \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:22+0000\n" +"Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-twitterbridge\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Title for page with Twitter integration settings. msgid "Twitter settings" msgstr "Mga katakdaan ng Twitter" +#. TRANS: Instructions for page with Twitter integration settings. msgid "" "Connect your Twitter account to share your updates with your Twitter friends " "and vice-versa." @@ -31,27 +33,29 @@ msgstr "" "Iugnay ang akawnt mo ng Twitter upang maibagi ang mga pagsasapanahon mo sa " "iyong mga kaibigan sa Twitter at pabalik din." +#. TRANS: Fieldset legend. msgid "Twitter account" msgstr "Akawnt sa Twitter" +#. TRANS: Form note when a Twitter account has been connected. msgid "Connected Twitter account" msgstr "Nakaugnay na akawnt ng Twitter" +#. TRANS: Fieldset legend. msgid "Disconnect my account from Twitter" msgstr "Huwag iugnay ang akawnt ko na mula sa Twitter" -msgid "Disconnecting your Twitter could make it impossible to log in! Please " +#. TRANS: Form guide. %s is a URL to the password settings. +#. TRANS: This message contains a Markdown link in the form [description](link). +#, php-format +msgid "" +"Disconnecting your Twitter account could make it impossible to log in! " +"Please [set a password](%s) first." msgstr "" -"Ang pagkalas ng Twitter mo ay maaaring makapagdulot ng hindi makalagda! " -"Mangyaring " +"Ang pagkalas sa akawnt mo ng Twitter mo ay maaaring makapagdulot ng kawalan " +"ng kakayanang makalagda! Mangyaring [magtakda muna ng hudyat] (%s)." -msgid "set a password" -msgstr "magtakda ng isang hudyat" - -msgid " first." -msgstr "muna." - -#. TRANS: %1$s is the current website name. +#. TRANS: Form instructions. %1$s is the StatusNet sitename. #, php-format msgid "" "Keep your %1$s account but disconnect from Twitter. You can use your %1$s " @@ -60,86 +64,168 @@ msgstr "" "Panatilihin ang akawnt mong %1$s subalit kumalas mula sa Twitter. Maaari " "mong gamitin ang hudyat mo sa %1$s upang lumagdang papasok." +#. TRANS: Button text for disconnecting a Twitter account. +msgctxt "BUTTON" msgid "Disconnect" -msgstr "Huwag umugnay" +msgstr "Kumalas" +#. TRANS: Fieldset legend. msgid "Preferences" msgstr "Mga nais" +#. TRANS: Checkbox label. msgid "Automatically send my notices to Twitter." msgstr "Kusang ipadala ang mga pabatid ko sa Twitter." +#. TRANS: Checkbox label. msgid "Send local \"@\" replies to Twitter." msgstr "Ipadala ang katutubong mga tugon na \"@\" sa Twitter." +#. TRANS: Checkbox label. msgid "Subscribe to my Twitter friends here." msgstr "Tumanggap ng mga pagsipi sa aking mga kaibigan sa Twitter dito." +#. TRANS: Checkbox label. msgid "Import my friends timeline." msgstr "Angkatin ang guhit ng panahon ng mga kaibigan ko." +#. TRANS: Button text for saving Twitter integration settings. +#. TRANS: Button text for saving the administrative Twitter bridge settings. +msgctxt "BUTTON" msgid "Save" msgstr "Sagipin" +#. TRANS: Button text for adding Twitter integration. +msgctxt "BUTTON" msgid "Add" msgstr "Idagdag" +#. TRANS: Client error displayed when the session token does not match or is not given. msgid "There was a problem with your session token. Try again, please." msgstr "" "Nagkaroon ng isang suliranin sa kahalip ng sesyon mo. Pakisubukan uli." +#. TRANS: Client error displayed when the submitted form contains unexpected data. msgid "Unexpected form submission." msgstr "Hindi inaasahang pagpapasa ng pormularyo." +#. TRANS: Client error displayed when trying to remove a connected Twitter account when there isn't one connected. msgid "No Twitter connection to remove." msgstr "Walang matatanggal na ugnay sa Twitter." -msgid "Couldn't remove Twitter user." -msgstr "Hindi matanggal ang tagagamit ng Twitter." +#. TRANS: Server error displayed when trying to remove a connected Twitter account fails. +msgid "Could not remove Twitter user." +msgstr "Hindi maalis ang tagagamit ng Twitter." +#. TRANS: Success message displayed after disconnecting a Twitter account. msgid "Twitter account disconnected." msgstr "Nawala ang ugnay sa akawnt ng Twitter." -msgid "Couldn't save Twitter preferences." -msgstr "Hindi masagip ang mga nais na pang-Twitter." +#. TRANS: Server error displayed when saving Twitter integration preferences fails. +msgid "Could not save Twitter preferences." +msgstr "Hindi masagip ang mga kanaisan na nasa Twitter." +#. TRANS: Success message after saving Twitter integration preferences. msgid "Twitter preferences saved." msgstr "Nasagip ang mga nais na pang-Twitter." +#. TRANS: Form validation error displayed when the checkbox to agree to the license has not been checked. msgid "You cannot register if you do not agree to the license." msgstr "Hindi ka makakapagpatala kung hindi ka sasang-ayon sa lisensiya." +#. TRANS: Form validation error displayed when an unhandled error occurs. msgid "Something weird happened." msgstr "May nangyaring kakaiba." +#. TRANS: Server error displayed when linking to a Twitter account fails. msgid "Could not link your Twitter account." msgstr "Hindi maikawing ang iyong akawnt ng Twitter." -msgid "Couldn't link your Twitter account: oauth_token mismatch." +#. TRANS: Server error displayed when linking to a Twitter account fails because of an incorrect oauth_token. +msgid "Could not link your Twitter account: oauth_token mismatch." msgstr "" -"Hindi maikawing ang iyong akawnt ng Twitter: hindi magkatugma ang " -"oauth_token." - -msgid "Couldn't link your Twitter account." -msgstr "Hindi maikawing ang iyong akawnt ng Twitter." +"Hindi maikawing ang akawnt mong nasa Twitter: hindi katugma ang oauth_token." +#. TRANS: Page instruction. %s is the StatusNet sitename. #, php-format msgid "" -"This is the first time you've logged into %s so we must connect your Twitter " -"account to a local account. You can either create a new account, or connect " -"with your existing account, if you have one." +"This is the first time you have logged into %s so we must connect your " +"Twitter account to a local account. You can either create a new account, or " +"connect with your existing account, if you have one." msgstr "" -"Ito ang iyong unang pagkakataon ng paglagda sa %s kaya't kailangan naming " -"iugnay ang iyong akawnt ng Twitter papunta sa isang katutubong akawnt. " -"Maaari kang lumikha ng isang bagong akawnt, o umugnay sa pamamagitan ng " -"umiiral mong akawnt, kung mayroon ka." +"Ito ang una mong pagkakataon na lumagdang papasok sa %s kaya't kailangan " +"naming iugnay ang akawnt mong nasa Twitter sa isang katutubong akawnt. " +"Maaari kang lumikha ng isang bagong akawnt, o kumabit sa umiiral mong " +"akawnt, kung mayroon ka na." +#. TRANS: Page title. msgid "Twitter Account Setup" msgstr "Pagkakahanda ng Akawnt ng Twitter" +#. TRANS: Fieldset legend. msgid "Connection options" msgstr "Mga mapagpipilian ng ugnay" +#. TRANS: Fieldset legend. +msgid "Create new account" +msgstr "Lumikha ng bagong akawnt" + +#. TRANS: Sub form introduction text. +msgid "Create a new user with this nickname." +msgstr "Lumikha ng isang bagong tagagamit na may ganitong palayaw." + +#. TRANS: Field label. +msgid "New nickname" +msgstr "Bagong palayaw" + +#. TRANS: Field title for nickname field. +msgid "1-64 lowercase letters or numbers, no punctuation or spaces." +msgstr "" +"1 hanggang 64 maliliit na mga titik o mga bilang, walang bantas o mga " +"patlang." + +#. TRANS: Field label. +msgctxt "LABEL" +msgid "Email" +msgstr "E-liham" + +#. TRANS: Field title for e-mail address field. +msgid "Used only for updates, announcements, and password recovery" +msgstr "" +"Ginagamit lamang para sa mga pagsasapanahon, mga pagpapahayag, at pagbawi ng " +"hudyat" + +#. TRANS: Button text for creating a new StatusNet account in the Twitter connect page. +msgctxt "BUTTON" +msgid "Create" +msgstr "Likhain" + +#. TRANS: Fieldset legend. +msgid "Connect existing account" +msgstr "Iugnay ang umiiral na akawnt" + +#. TRANS: Sub form introduction text. +msgid "" +"If you already have an account, login with your username and password to " +"connect it to your Twitter account." +msgstr "" +"Kung mayroon ka nang akawnt, lumagda sa pamamagitan ng iyong pangalan ng " +"tagagamit at hudyat upang iugnay ito sa iyong akawnt ng Twitter." + +#. TRANS: Field label. +msgid "Existing nickname" +msgstr "Umiiral na palayaw" + +#. TRANS: Field label. +msgid "Password" +msgstr "Hudyat" + +#. TRANS: Fieldset legend. +msgid "License" +msgstr "Lisensiya" + +#. TRANS: Text for license agreement checkbox. +#. TRANS: %s is the license as configured for the StatusNet site. #, php-format msgid "" "My text and files are available under %s except this private data: password, " @@ -149,126 +235,113 @@ msgstr "" "pribadong datong ito: hudyat, tirahan ng e-liham, tirahan ng IM, at numero " "ng telepono." -msgid "Create new account" -msgstr "Lumikha ng bagong akawnt" - -msgid "Create a new user with this nickname." -msgstr "Lumikha ng isang bagong tagagamit na may ganitong palayaw." - -msgid "New nickname" -msgstr "Bagong palayaw" - -msgid "1-64 lowercase letters or numbers, no punctuation or spaces." -msgstr "" -"1 hanggang 64 maliliit na mga titik o mga bilang, walang bantas o mga " -"patlang." - -msgctxt "LABEL" -msgid "Email" -msgstr "E-liham" - -msgid "Used only for updates, announcements, and password recovery" -msgstr "" -"Ginagamit lamang para sa mga pagsasapanahon, mga pagpapahayag, at pagbawi ng " -"hudyat" - -msgid "Create" -msgstr "Likhain" - -msgid "Connect existing account" -msgstr "Iugnay ang umiiral na akawnt" - -msgid "" -"If you already have an account, login with your username and password to " -"connect it to your Twitter account." -msgstr "" -"Kung mayroon ka nang akawnt, lumagda sa pamamagitan ng iyong pangalan ng " -"tagagamit at hudyat upang iugnay ito sa iyong akawnt ng Twitter." - -msgid "Existing nickname" -msgstr "Umiiral na palayaw" - -msgid "Password" -msgstr "Hudyat" - +#. TRANS: Button text for connecting an existing StatusNet account in the Twitter connect page.. +msgctxt "BUTTON" msgid "Connect" -msgstr "Umugnay" +msgstr "Kumabit" +#. TRANS: Client error displayed when trying to create a new user while creating new users is not allowed. msgid "Registration not allowed." msgstr "Hindi pinayagan ang pagpapatala." +#. TRANS: Client error displayed when trying to create a new user with an invalid invitation code. msgid "Not a valid invitation code." msgstr "Hindi isang tanggap na kodigo ng paanyaya." +#. TRANS: Client error displayed when trying to create a new user with an invalid username. msgid "Nickname not allowed." msgstr "Hindi pinayagan ang palayaw." +#. TRANS: Client error displayed when trying to create a new user with a username that is already in use. msgid "Nickname already in use. Try another one." msgstr "Ginagamit na ang palayaw. Sumubok ng iba." +#. TRANS: Server error displayed when creating a new user has failed. msgid "Error registering user." msgstr "May kamalian sa pagpapatala ng tagagamit." +#. TRANS: Server error displayed when connecting a user to a Twitter user has failed. +#. TRANS: Server error displayed connecting a user to a Twitter user has failed. msgid "Error connecting user to Twitter." msgstr "May kamalian sa pag-ugnay ng tagagamit sa Twitter." +#. TRANS: Form validation error displayed when connecting an existing user to a Twitter user fails because +#. TRANS: the provided username and/or password are incorrect. msgid "Invalid username or password." msgstr "Hindi katanggap-tanggap na pangalan ng tagagamit o hudyat." +#. TRANS: Page title for Twitter administration panel. +msgctxt "TITLE" msgid "Twitter" msgstr "Twitter" +#. TRANS: Instructions for Twitter bridge administration page. msgid "Twitter bridge settings" msgstr "Mga katakdaan sa tulay ng Twitter" -msgid "Invalid consumer key. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer key is invalid because it is too long. +msgid "Invalid consumer key. Maximum length is 255 characters." msgstr "" -"Hindi katanggap-tanggap na susi ng tagaubos. Ang pinakamataas na haba ay " +"Hindi katanggap-tanggap na susi ng mang-uubos. Ang pinakamataas na haba ay " "255 mga panitik." -msgid "Invalid consumer secret. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer secret is invalid because it is too long. +msgid "Invalid consumer secret. Maximum length is 255 characters." msgstr "" "Hindi katanggap-tanggap na lihim ng tagaubos. Ang pinakamataas na haba ay " "255 mga panitik." +#. TRANS: Fieldset legend for Twitter application settings. msgid "Twitter application settings" msgstr "Mga katakdaan ng aplikasyong Twitter" +#. TRANS: Field label for Twitter assigned consumer key. msgid "Consumer key" msgstr "Susi ng tagaubos" -msgid "Consumer key assigned by Twitter" -msgstr "Susi ng tagaubos na itinalaga ng Twitter" +#. TRANS: Field title for Twitter assigned consumer key. +msgid "The consumer key assigned by Twitter." +msgstr "Ang susi ng tagaubos na itinalaga ng Twitter." +#. TRANS: Field label for Twitter assigned consumer secret. msgid "Consumer secret" msgstr "Lihim ng tagaubos" -msgid "Consumer secret assigned by Twitter" -msgstr "Lihim ng tagaubos na itinalaga ng Twitter" +#. TRANS: Field title for Twitter assigned consumer secret. +msgid "The consumer secret assigned by Twitter." +msgstr "Ang lihim ng tagaubos na itinalaga ng Twitter." -msgid "Note: a global consumer key and secret are set." -msgstr "Paunawa: nakatakda ang isang pandaigdigang susi at lihim ng tagaubos." +#. TRANS: Form guide displayed when two required fields have already been provided. +msgid "Note: A global consumer key and secret are set." +msgstr "Paunawa: Naitakda na ang isang pangglobong susi at lihim ng tagaubos." +#. TRANS: Field label for Twitter application name. msgid "Integration source" msgstr "Pinagmulan ng pagsasama" -msgid "Name of your Twitter application" -msgstr "Pangalan ng iyong aplikasyong Twitter" +#. TRANS: Field title for Twitter application name. +msgid "The name of your Twitter application." +msgstr "Ang pangalan ng aplikasyon mo ng Twitter." +#. TRANS: Fieldset legend for Twitter integration options. msgid "Options" msgstr "Mga mapagpipilian" +#. TRANS: Checkbox label for global setting. msgid "Enable \"Sign-in with Twitter\"" msgstr "Paganahin ang \"Lumagdang may Twitter\"" -msgid "Allow users to login with their Twitter credentials" +#. TRANS: Checkbox title. +msgid "This allow users to login with their Twitter credentials." msgstr "" -"Pahintulutan ang mga tagagamit na lumagdang papasok sa pamamagitan ng " -"kanilang mga katangian sa Twitter" +"Nagpapahintulot ito sa mga tagagamit na lumagdang papasok sa pamamagitan ng " +"kanilang mga kredensiyal na nasa Twitter." +#. TRANS: Checkbox label for global setting. msgid "Enable Twitter import" msgstr "Paganahin ang pang-angkat ng Twitter" +#. TRANS: Checkbox title for global setting. msgid "" "Allow users to import their Twitter friends' timelines. Requires daemons to " "be manually configured." @@ -277,18 +350,67 @@ msgstr "" "kanilang mga kaibigang nasa Twitter. Nangangailangan ng kinakamay na " "pagsasaayos ng mga daemon." -msgid "Save Twitter settings" -msgstr "Sagipin ang mga katakdaan ng Twitter" +#. TRANS: Button title for saving the administrative Twitter bridge settings. +msgid "Save the Twitter bridge settings." +msgstr "Sagipin ang mga katakdaan na nasa tulay ng Twitter." -msgid "Login or register using Twitter" -msgstr "Lumagda o magpatala na ginagamit ang Twitter" +#. TRANS: Server exception thrown when an invalid URL scheme is detected. +msgid "Invalid URL scheme for HTTP stream reader." +msgstr "" +"Hindi katanggap-tanggap na pakana ng URL para sa pambasa ng batis ng HTTP." +#. TRANS: Exception thrown when input from an inexpected socket is encountered. +msgid "Got input from unexpected socket!" +msgstr "Nakakuha ng pagpasok mula sa hindi inaasahang bokilya!" + +#. TRANS: Exception thrown when an invalid state is encountered in handleLine. +#. TRANS: %s is the invalid state. +#, php-format +msgid "Invalid state in handleLine: %s." +msgstr "Hindi katanggap-tanggap na katayuan sa loob ng linya ng hawakan: %s." + +#. TRANS: Exception thrown when an invalid response line is encountered. +#. TRANS: %s is the invalid line. +#, php-format +msgid "Invalid HTTP response line: %s." +msgstr "Hindi katanggap-tanggap na linya ng tugon ng HTTP: %s." + +#. TRANS: Exception thrown when an invalid response line part is encountered. +#. TRANS: %1$s is the chunk, %2$s is the line. +#, php-format +msgid "Invalid HTTP response line chunk \"%1$s\": %2$s." +msgstr "" +"Hindi katanggap-tanggap na tipak ng guhit ng tugon ng HTTP na \"%1$s\": %2$s." + +#. TRANS: Exception thrown when an invalid response code is encountered. +#. TRANS: %1$s is the response code, %2$s is the line. +#, php-format +msgid "Bad HTTP response code %1$s: %2$s." +msgstr "Masamang kodigo ng tugon ng HTTP na %1$s: %2$s." + +#. TRANS: Menu item in login navigation. +#. TRANS: Menu item in connection settings navigation. +msgctxt "MENU" +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Title for menu item in login navigation. +msgid "Login or register using Twitter." +msgstr "Lumagda o magpatala na ginagamit ang Twitter." + +#. TRANS: Title for menu item in connection settings navigation. msgid "Twitter integration options" msgstr "Mga pagpipilian ng pagsasama ng Twitter" -msgid "Twitter bridge configuration" -msgstr "Pagkakaayos ng tulay ng Twitter" +#. TRANS: Menu item in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter" +msgstr "Twitter" +#. TRANS: Menu item title in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter bridge configuration page." +msgstr "Pahina ng pagkakaayos ng tulay ng Twitter." + +#. TRANS: Plugin description. msgid "" "The Twitter \"bridge\" plugin allows integration of a StatusNet instance " "with Twitter." @@ -297,15 +419,20 @@ msgstr "" "isang pagkakataon ng StatusNet sa Twitter." +#. TRANS: Client error displayed when trying to log in using Twitter while already logged in to StatusNet. msgid "Already logged in." msgstr "Nakalagda na." +#. TRANS: Title for login using Twitter page. +msgctxt "TITLE" msgid "Twitter Login" -msgstr "Paglagda sa Twitter" +msgstr "Panglagdang Papasok sa Twitter" +#. TRANS: Instructions for login using Twitter page. msgid "Login with your Twitter account" msgstr "Lumagda sa pamamagitan ng akawnt mo sa Twitter" +#. TRANS: Alternative text for "sign in with Twitter" image. msgid "Sign in with Twitter" msgstr "Lumagda sa pamamagitan ng Twitter" diff --git a/plugins/TwitterBridge/locale/tr/LC_MESSAGES/TwitterBridge.po b/plugins/TwitterBridge/locale/tr/LC_MESSAGES/TwitterBridge.po index 7c0faa43d5..9dcc97753f 100644 --- a/plugins/TwitterBridge/locale/tr/LC_MESSAGES/TwitterBridge.po +++ b/plugins/TwitterBridge/locale/tr/LC_MESSAGES/TwitterBridge.po @@ -9,21 +9,23 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TwitterBridge\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:46+0000\n" -"Language-Team: Turkish \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:22+0000\n" +"Language-Team: Turkish \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tr\n" "X-Message-Group: #out-statusnet-plugin-twitterbridge\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Title for page with Twitter integration settings. msgid "Twitter settings" msgstr "Twitter ayarları" +#. TRANS: Instructions for page with Twitter integration settings. msgid "" "Connect your Twitter account to share your updates with your Twitter friends " "and vice-versa." @@ -31,109 +33,200 @@ msgstr "" "Güncellemelerinizi Twitter arkadaÅŸlarınızla paylaÅŸmak ve onların sizi takip " "edebilmesi için Twitter hesabınızla baÄŸlantı kurun." +#. TRANS: Fieldset legend. msgid "Twitter account" msgstr "Twitter hesabı" +#. TRANS: Form note when a Twitter account has been connected. msgid "Connected Twitter account" msgstr "BaÄŸlı Twitter hesabı" +#. TRANS: Fieldset legend. msgid "Disconnect my account from Twitter" msgstr "Hesabımın Twitter baÄŸlantısını kes." -msgid "Disconnecting your Twitter could make it impossible to log in! Please " +#. TRANS: Form guide. %s is a URL to the password settings. +#. TRANS: This message contains a Markdown link in the form [description](link). +#, php-format +msgid "" +"Disconnecting your Twitter account could make it impossible to log in! " +"Please [set a password](%s) first." msgstr "" -msgid "set a password" -msgstr "bir parola ayarla" - -msgid " first." -msgstr " ilk." - -#. TRANS: %1$s is the current website name. +#. TRANS: Form instructions. %1$s is the StatusNet sitename. #, php-format msgid "" "Keep your %1$s account but disconnect from Twitter. You can use your %1$s " "password to log in." msgstr "" +#. TRANS: Button text for disconnecting a Twitter account. +#, fuzzy +msgctxt "BUTTON" msgid "Disconnect" msgstr "BaÄŸlantıyı Kes" +#. TRANS: Fieldset legend. msgid "Preferences" msgstr "Tercihler" +#. TRANS: Checkbox label. msgid "Automatically send my notices to Twitter." msgstr "Durum mesajlarımı otomatik olarak Twitter'a gönder." +#. TRANS: Checkbox label. msgid "Send local \"@\" replies to Twitter." msgstr "" +#. TRANS: Checkbox label. msgid "Subscribe to my Twitter friends here." msgstr "" +#. TRANS: Checkbox label. msgid "Import my friends timeline." msgstr "ArkadaÅŸlarımın zaman çizelgesini içeri aktar." +#. TRANS: Button text for saving Twitter integration settings. +#. TRANS: Button text for saving the administrative Twitter bridge settings. +#, fuzzy +msgctxt "BUTTON" msgid "Save" msgstr "Kaydet" +#. TRANS: Button text for adding Twitter integration. +#, fuzzy +msgctxt "BUTTON" msgid "Add" msgstr "Ekle" +#. TRANS: Client error displayed when the session token does not match or is not given. msgid "There was a problem with your session token. Try again, please." msgstr "" +#. TRANS: Client error displayed when the submitted form contains unexpected data. msgid "Unexpected form submission." msgstr "Beklenmedik form gönderimi." +#. TRANS: Client error displayed when trying to remove a connected Twitter account when there isn't one connected. msgid "No Twitter connection to remove." msgstr "" -msgid "Couldn't remove Twitter user." +#. TRANS: Server error displayed when trying to remove a connected Twitter account fails. +#, fuzzy +msgid "Could not remove Twitter user." msgstr "Twitter kullanıcısı silinemedi." +#. TRANS: Success message displayed after disconnecting a Twitter account. msgid "Twitter account disconnected." msgstr "Twitter hesabı baÄŸlantısı kesildi." -msgid "Couldn't save Twitter preferences." +#. TRANS: Server error displayed when saving Twitter integration preferences fails. +#, fuzzy +msgid "Could not save Twitter preferences." msgstr "Twitter tercihleri kaydedilemedi." +#. TRANS: Success message after saving Twitter integration preferences. msgid "Twitter preferences saved." msgstr "Twitter tercihleriniz kaydedildi." +#. TRANS: Form validation error displayed when the checkbox to agree to the license has not been checked. #, fuzzy msgid "You cannot register if you do not agree to the license." msgstr "EÄŸer lisansı kabul etmezseniz kayıt olamazsınız." +#. TRANS: Form validation error displayed when an unhandled error occurs. msgid "Something weird happened." msgstr "Garip bir ÅŸeyler oldu." +#. TRANS: Server error displayed when linking to a Twitter account fails. #, fuzzy msgid "Could not link your Twitter account." msgstr "Twitter hesabınızla giriÅŸ yapın" -msgid "Couldn't link your Twitter account: oauth_token mismatch." -msgstr "" +#. TRANS: Server error displayed when linking to a Twitter account fails because of an incorrect oauth_token. +#, fuzzy +msgid "Could not link your Twitter account: oauth_token mismatch." +msgstr "Twitter hesabınızla giriÅŸ yapın" -msgid "Couldn't link your Twitter account." -msgstr "" - -#, php-format +#. TRANS: Page instruction. %s is the StatusNet sitename. +#, fuzzy, php-format msgid "" -"This is the first time you've logged into %s so we must connect your Twitter " -"account to a local account. You can either create a new account, or connect " -"with your existing account, if you have one." +"This is the first time you have logged into %s so we must connect your " +"Twitter account to a local account. You can either create a new account, or " +"connect with your existing account, if you have one." msgstr "" "Ä°lk defa %s'ye giriÅŸ yaptınız, Twitter hesabınızı yerel bir hesapla " "baÄŸlamamız gerekiyor. Yeni bir hesap oluÅŸturabilir ya da varolan bir " "hesabınızı kullanabilirsiniz." +#. TRANS: Page title. msgid "Twitter Account Setup" msgstr "Twitter Hesap Kurulumu" +#. TRANS: Fieldset legend. msgid "Connection options" msgstr "BaÄŸlantı seçenekleri" +#. TRANS: Fieldset legend. +msgid "Create new account" +msgstr "Yeni hesap oluÅŸtur" + +#. TRANS: Sub form introduction text. +msgid "Create a new user with this nickname." +msgstr "Bu kullanıcı adıyla yeni bir kullanıcı oluÅŸtur." + +#. TRANS: Field label. +msgid "New nickname" +msgstr "Yeni kullanıcı adı" + +#. TRANS: Field title for nickname field. +#, fuzzy +msgid "1-64 lowercase letters or numbers, no punctuation or spaces." +msgstr "" +"1-64 tane küçük harf veya rakam, noktalama iÅŸaretlerine ve boÅŸluklara izin " +"verilmez" + +#. TRANS: Field label. +msgctxt "LABEL" +msgid "Email" +msgstr "" + +#. TRANS: Field title for e-mail address field. +msgid "Used only for updates, announcements, and password recovery" +msgstr "" + +#. TRANS: Button text for creating a new StatusNet account in the Twitter connect page. +#, fuzzy +msgctxt "BUTTON" +msgid "Create" +msgstr "OluÅŸtur" + +#. TRANS: Fieldset legend. +msgid "Connect existing account" +msgstr "Varolan hesaba baÄŸlan" + +#. TRANS: Sub form introduction text. +msgid "" +"If you already have an account, login with your username and password to " +"connect it to your Twitter account." +msgstr "" +"Halihazırda bir hesabınız varsa, Twitter hesabınızla baÄŸlantı kurmak için " +"kullanıcı adı ve parolanızla giriÅŸ yapın." + +#. TRANS: Field label. +msgid "Existing nickname" +msgstr "Varolan kullanıcı adı" + +#. TRANS: Field label. +msgid "Password" +msgstr "Parola" + +#. TRANS: Fieldset legend. +msgid "License" +msgstr "" + +#. TRANS: Text for license agreement checkbox. +#. TRANS: %s is the license as configured for the StatusNet site. #, php-format msgid "" "My text and files are available under %s except this private data: password, " @@ -142,150 +235,200 @@ msgstr "" "Parola, e-posta adresi, anlık mesajlaÅŸma adresi ve telefon numarası gibi " "özel verilerim dışındaki tüm yazı ve dosyalarım %s dahilinde kullanılabilir." -msgid "Create new account" -msgstr "Yeni hesap oluÅŸtur" - -msgid "Create a new user with this nickname." -msgstr "Bu kullanıcı adıyla yeni bir kullanıcı oluÅŸtur." - -msgid "New nickname" -msgstr "Yeni kullanıcı adı" - +#. TRANS: Button text for connecting an existing StatusNet account in the Twitter connect page.. #, fuzzy -msgid "1-64 lowercase letters or numbers, no punctuation or spaces." -msgstr "" -"1-64 tane küçük harf veya rakam, noktalama iÅŸaretlerine ve boÅŸluklara izin " -"verilmez" - -msgctxt "LABEL" -msgid "Email" -msgstr "" - -msgid "Used only for updates, announcements, and password recovery" -msgstr "" - -msgid "Create" -msgstr "OluÅŸtur" - -msgid "Connect existing account" -msgstr "Varolan hesaba baÄŸlan" - -msgid "" -"If you already have an account, login with your username and password to " -"connect it to your Twitter account." -msgstr "" -"Halihazırda bir hesabınız varsa, Twitter hesabınızla baÄŸlantı kurmak için " -"kullanıcı adı ve parolanızla giriÅŸ yapın." - -msgid "Existing nickname" -msgstr "Varolan kullanıcı adı" - -msgid "Password" -msgstr "Parola" - +msgctxt "BUTTON" msgid "Connect" msgstr "BaÄŸlan" +#. TRANS: Client error displayed when trying to create a new user while creating new users is not allowed. msgid "Registration not allowed." msgstr "Kayıt yapılmasına izin verilmiyor." +#. TRANS: Client error displayed when trying to create a new user with an invalid invitation code. msgid "Not a valid invitation code." msgstr "Geçerli bir davet kodu deÄŸil." +#. TRANS: Client error displayed when trying to create a new user with an invalid username. msgid "Nickname not allowed." msgstr "Bu kullanıcı adına izin verilmiyor." +#. TRANS: Client error displayed when trying to create a new user with a username that is already in use. msgid "Nickname already in use. Try another one." msgstr "Kullanıcı adı halihazırda kullanılıyor. BaÅŸka bir tane deneyin." +#. TRANS: Server error displayed when creating a new user has failed. msgid "Error registering user." msgstr "Kullanıcı kayıt hatası." +#. TRANS: Server error displayed when connecting a user to a Twitter user has failed. +#. TRANS: Server error displayed connecting a user to a Twitter user has failed. msgid "Error connecting user to Twitter." msgstr "Twitter'a kullanıcı baÄŸlama hatası." +#. TRANS: Form validation error displayed when connecting an existing user to a Twitter user fails because +#. TRANS: the provided username and/or password are incorrect. msgid "Invalid username or password." msgstr "Geçersiz kullanıcı adı veya parola." +#. TRANS: Page title for Twitter administration panel. +#, fuzzy +msgctxt "TITLE" msgid "Twitter" msgstr "Twitter" +#. TRANS: Instructions for Twitter bridge administration page. msgid "Twitter bridge settings" msgstr "Twitter köprü ayarları" -msgid "Invalid consumer key. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer key is invalid because it is too long. +msgid "Invalid consumer key. Maximum length is 255 characters." msgstr "" -msgid "Invalid consumer secret. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer secret is invalid because it is too long. +msgid "Invalid consumer secret. Maximum length is 255 characters." msgstr "" +#. TRANS: Fieldset legend for Twitter application settings. msgid "Twitter application settings" msgstr "" +#. TRANS: Field label for Twitter assigned consumer key. msgid "Consumer key" msgstr "Kullanıcı anahtarı" -msgid "Consumer key assigned by Twitter" +#. TRANS: Field title for Twitter assigned consumer key. +#, fuzzy +msgid "The consumer key assigned by Twitter." msgstr "Twitter tarafından atanan kullanıcı anahtarı" +#. TRANS: Field label for Twitter assigned consumer secret. msgid "Consumer secret" msgstr "" -msgid "Consumer secret assigned by Twitter" -msgstr "" - -msgid "Note: a global consumer key and secret are set." +#. TRANS: Field title for Twitter assigned consumer secret. +#, fuzzy +msgid "The consumer secret assigned by Twitter." +msgstr "Twitter tarafından atanan kullanıcı anahtarı" + +#. TRANS: Form guide displayed when two required fields have already been provided. +msgid "Note: A global consumer key and secret are set." msgstr "" +#. TRANS: Field label for Twitter application name. msgid "Integration source" msgstr "Entegrasyon kaynağı" -msgid "Name of your Twitter application" +#. TRANS: Field title for Twitter application name. +#, fuzzy +msgid "The name of your Twitter application." msgstr "Twitter uygulamanızın ismi" +#. TRANS: Fieldset legend for Twitter integration options. msgid "Options" msgstr "Seçenekler" +#. TRANS: Checkbox label for global setting. msgid "Enable \"Sign-in with Twitter\"" msgstr "" -msgid "Allow users to login with their Twitter credentials" +#. TRANS: Checkbox title. +msgid "This allow users to login with their Twitter credentials." msgstr "" +#. TRANS: Checkbox label for global setting. msgid "Enable Twitter import" msgstr "" +#. TRANS: Checkbox title for global setting. msgid "" "Allow users to import their Twitter friends' timelines. Requires daemons to " "be manually configured." msgstr "" -msgid "Save Twitter settings" -msgstr "Twitter ayarlarını kaydet" +#. TRANS: Button title for saving the administrative Twitter bridge settings. +#, fuzzy +msgid "Save the Twitter bridge settings." +msgstr "Twitter köprü ayarları" -msgid "Login or register using Twitter" +#. TRANS: Server exception thrown when an invalid URL scheme is detected. +msgid "Invalid URL scheme for HTTP stream reader." msgstr "" +#. TRANS: Exception thrown when input from an inexpected socket is encountered. +msgid "Got input from unexpected socket!" +msgstr "" + +#. TRANS: Exception thrown when an invalid state is encountered in handleLine. +#. TRANS: %s is the invalid state. +#, php-format +msgid "Invalid state in handleLine: %s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response line is encountered. +#. TRANS: %s is the invalid line. +#, php-format +msgid "Invalid HTTP response line: %s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response line part is encountered. +#. TRANS: %1$s is the chunk, %2$s is the line. +#, php-format +msgid "Invalid HTTP response line chunk \"%1$s\": %2$s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response code is encountered. +#. TRANS: %1$s is the response code, %2$s is the line. +#, php-format +msgid "Bad HTTP response code %1$s: %2$s." +msgstr "" + +#. TRANS: Menu item in login navigation. +#. TRANS: Menu item in connection settings navigation. +#, fuzzy +msgctxt "MENU" +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Title for menu item in login navigation. +#, fuzzy +msgid "Login or register using Twitter." +msgstr "Kullanıcı kayıt hatası." + +#. TRANS: Title for menu item in connection settings navigation. msgid "Twitter integration options" msgstr "Twitter entegrasyon seçenekleri" -msgid "Twitter bridge configuration" +#. TRANS: Menu item in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Menu item title in administrative panel that leads to the Twitter bridge configuration. +#, fuzzy +msgid "Twitter bridge configuration page." msgstr "Twitter köprü yapılandırması" +#. TRANS: Plugin description. msgid "" "The Twitter \"bridge\" plugin allows integration of a StatusNet instance " "with Twitter." msgstr "" +#. TRANS: Client error displayed when trying to log in using Twitter while already logged in to StatusNet. msgid "Already logged in." msgstr "Zaten giriÅŸ yapılmış." +#. TRANS: Title for login using Twitter page. +#, fuzzy +msgctxt "TITLE" msgid "Twitter Login" msgstr "Twitter GiriÅŸ" +#. TRANS: Instructions for login using Twitter page. msgid "Login with your Twitter account" msgstr "Twitter hesabınızla giriÅŸ yapın" +#. TRANS: Alternative text for "sign in with Twitter" image. msgid "Sign in with Twitter" msgstr "" diff --git a/plugins/TwitterBridge/locale/uk/LC_MESSAGES/TwitterBridge.po b/plugins/TwitterBridge/locale/uk/LC_MESSAGES/TwitterBridge.po index 9c910eb822..aec93aa186 100644 --- a/plugins/TwitterBridge/locale/uk/LC_MESSAGES/TwitterBridge.po +++ b/plugins/TwitterBridge/locale/uk/LC_MESSAGES/TwitterBridge.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TwitterBridge to Ukrainian (УкраїнÑька) +# Translation of StatusNet - TwitterBridge to Ukrainian (українÑька) # Exported from translatewiki.net # # Author: Boogie @@ -9,22 +9,24 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TwitterBridge\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:46+0000\n" -"Language-Team: Ukrainian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:22+0000\n" +"Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-twitterbridge\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Title for page with Twitter integration settings. msgid "Twitter settings" msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Twitter" +#. TRANS: Instructions for page with Twitter integration settings. msgid "" "Connect your Twitter account to share your updates with your Twitter friends " "and vice-versa." @@ -32,27 +34,29 @@ msgstr "" "Підключіть ваш акаунт Twitter, щоб ділитиÑÑ Ð½Ð¾Ð²Ð¸Ð¼Ð¸ допиÑами з друзÑми в " "Twitter Ñ– навпаки." +#. TRANS: Fieldset legend. msgid "Twitter account" msgstr "Ðкаунт Twitter" +#. TRANS: Form note when a Twitter account has been connected. msgid "Connected Twitter account" msgstr "Під’єднаний акаунт Twitter" +#. TRANS: Fieldset legend. msgid "Disconnect my account from Twitter" msgstr "Від’єднати мій акаунт від Twitter" -msgid "Disconnecting your Twitter could make it impossible to log in! Please " +#. TRANS: Form guide. %s is a URL to the password settings. +#. TRANS: This message contains a Markdown link in the form [description](link). +#, fuzzy, php-format +msgid "" +"Disconnecting your Twitter account could make it impossible to log in! " +"Please [set a password](%s) first." msgstr "" "Якщо ви від’єднаєте Ñвій Twitter, то це унеможливить вхід до ÑиÑтеми у " "майбутньому! Будь лаÑка, " -msgid "set a password" -msgstr "вÑтановіть пароль" - -msgid " first." -msgstr " Ñпочатку." - -#. TRANS: %1$s is the current website name. +#. TRANS: Form instructions. %1$s is the StatusNet sitename. #, php-format msgid "" "Keep your %1$s account but disconnect from Twitter. You can use your %1$s " @@ -61,83 +65,171 @@ msgstr "" "Зберегти ваш акаунт %1$s, але від’єднати його від Twitter. Ви можете " "викориÑтовувати пароль від %1$s Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ на Ñайт." +#. TRANS: Button text for disconnecting a Twitter account. +#, fuzzy +msgctxt "BUTTON" msgid "Disconnect" msgstr "Від’єднати" +#. TRANS: Fieldset legend. msgid "Preferences" msgstr "ÐалаштуваннÑ" +#. TRANS: Checkbox label. msgid "Automatically send my notices to Twitter." msgstr "Ðвтоматично переÑилати мої допиÑи на Twitter." +#. TRANS: Checkbox label. msgid "Send local \"@\" replies to Twitter." msgstr "ÐадіÑлати локальні «@» відповіді на Twitter." +#. TRANS: Checkbox label. msgid "Subscribe to my Twitter friends here." msgstr "ПідпиÑатиÑÑŒ до моїх друзів з Twitter тут." +#. TRANS: Checkbox label. msgid "Import my friends timeline." msgstr "Імпортувати Ñтрічку допиÑів моїх друзів." +#. TRANS: Button text for saving Twitter integration settings. +#. TRANS: Button text for saving the administrative Twitter bridge settings. +#, fuzzy +msgctxt "BUTTON" msgid "Save" msgstr "Зберегти" +#. TRANS: Button text for adding Twitter integration. +#, fuzzy +msgctxt "BUTTON" msgid "Add" msgstr "Додати" +#. TRANS: Client error displayed when the session token does not match or is not given. msgid "There was a problem with your session token. Try again, please." msgstr "Виникли певні проблеми з токеном ÑеÑÑ–Ñ—. Спробуйте знов, будь лаÑка." +#. TRANS: Client error displayed when the submitted form contains unexpected data. msgid "Unexpected form submission." msgstr "ÐеÑподіване предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ñ„Ð¾Ñ€Ð¼Ð¸." +#. TRANS: Client error displayed when trying to remove a connected Twitter account when there isn't one connected. msgid "No Twitter connection to remove." msgstr "Ðе виÑвлено з’єднань з Twitter Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ." -msgid "Couldn't remove Twitter user." +#. TRANS: Server error displayed when trying to remove a connected Twitter account fails. +#, fuzzy +msgid "Could not remove Twitter user." msgstr "Ðе вдаєтьÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ кориÑтувача Twitter." +#. TRANS: Success message displayed after disconnecting a Twitter account. msgid "Twitter account disconnected." msgstr "Ðкаунт Twitter від’єднано." -msgid "Couldn't save Twitter preferences." +#. TRANS: Server error displayed when saving Twitter integration preferences fails. +#, fuzzy +msgid "Could not save Twitter preferences." msgstr "Ðе можу зберегти Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Twitter." +#. TRANS: Success message after saving Twitter integration preferences. msgid "Twitter preferences saved." msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Twitter збережено." +#. TRANS: Form validation error displayed when the checkbox to agree to the license has not been checked. msgid "You cannot register if you do not agree to the license." msgstr "Ви не зможете зареєÑтруватиÑÑŒ, Ñкщо не погодитеÑÑŒ з умовами ліцензії." +#. TRANS: Form validation error displayed when an unhandled error occurs. msgid "Something weird happened." msgstr "СталоÑÑ Ñ‰Ð¾ÑÑŒ незрозуміле." +#. TRANS: Server error displayed when linking to a Twitter account fails. msgid "Could not link your Twitter account." msgstr "Ðе вдаєтьÑÑ Ð¿Ñ€Ð¸Ð²â€™Ñзати ваш акаунт Twitter." -msgid "Couldn't link your Twitter account: oauth_token mismatch." +#. TRANS: Server error displayed when linking to a Twitter account fails because of an incorrect oauth_token. +#, fuzzy +msgid "Could not link your Twitter account: oauth_token mismatch." msgstr "" "Ðе вдаєтьÑÑ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚Ð¸ ваш акаунт Twitter: невідповідніÑÑ‚ÑŒ oauth_token." -msgid "Couldn't link your Twitter account." -msgstr "Ðе вдаєтьÑÑ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚Ð¸ ваш акаунт Twitter." - -#, php-format +#. TRANS: Page instruction. %s is the StatusNet sitename. +#, fuzzy, php-format msgid "" -"This is the first time you've logged into %s so we must connect your Twitter " -"account to a local account. You can either create a new account, or connect " -"with your existing account, if you have one." +"This is the first time you have logged into %s so we must connect your " +"Twitter account to a local account. You can either create a new account, or " +"connect with your existing account, if you have one." msgstr "" "Ви вперше увійшли до Ñайту %s, отже ми муÑимо приєднати ваш акаунт Twitter " "до акаунту на даному Ñайті. Ви маєте можливіÑÑ‚ÑŒ Ñтворити новий акаунт або " "викориÑтати такий, що вже Ñ–Ñнує, Ñкщо він у Ð²Ð°Ñ Ñ”." +#. TRANS: Page title. msgid "Twitter Account Setup" msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð°ÐºÐ°ÑƒÐ½Ñ‚Ñƒ за допомогою Twitter" +#. TRANS: Fieldset legend. msgid "Connection options" msgstr "Опції з’єднаннÑ" +#. TRANS: Fieldset legend. +msgid "Create new account" +msgstr "Створити новий акаунт" + +#. TRANS: Sub form introduction text. +msgid "Create a new user with this nickname." +msgstr "Створити нового кориÑтувача з цим нікнеймом." + +#. TRANS: Field label. +msgid "New nickname" +msgstr "Ðовий нікнейм" + +#. TRANS: Field title for nickname field. +msgid "1-64 lowercase letters or numbers, no punctuation or spaces." +msgstr "1-64 Ñ€Ñдкові літери Ñ– цифри, ніÑкої пунктуації або інтервалів." + +#. TRANS: Field label. +msgctxt "LABEL" +msgid "Email" +msgstr "Пошта" + +#. TRANS: Field title for e-mail address field. +msgid "Used only for updates, announcements, and password recovery" +msgstr "" +"ВикориÑтовуєтьÑÑ Ð»Ð¸ÑˆÐµ Ð´Ð»Ñ Ð½Ð°Ð´ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½ÑŒ, оголошень та Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ " +"паролÑ." + +#. TRANS: Button text for creating a new StatusNet account in the Twitter connect page. +#, fuzzy +msgctxt "BUTTON" +msgid "Create" +msgstr "Створити" + +#. TRANS: Fieldset legend. +msgid "Connect existing account" +msgstr "Приєднати акаунт, Ñкий вже Ñ–Ñнує" + +#. TRANS: Sub form introduction text. +msgid "" +"If you already have an account, login with your username and password to " +"connect it to your Twitter account." +msgstr "" +"Якщо ви вже маєте акаунт, увійдіть з вашим ім’Ñм кориÑтувача та паролем, аби " +"приєднати Ñ—Ñ… до Twitter." + +#. TRANS: Field label. +msgid "Existing nickname" +msgstr "Ðікнейм, Ñкий вже Ñ–Ñнує" + +#. TRANS: Field label. +msgid "Password" +msgstr "Пароль" + +#. TRANS: Fieldset legend. +msgid "License" +msgstr "" + +#. TRANS: Text for license agreement checkbox. +#. TRANS: %s is the license as configured for the StatusNet site. #, php-format msgid "" "My text and files are available under %s except this private data: password, " @@ -146,119 +238,117 @@ msgstr "" "Мої допиÑи Ñ– файли доÑтупні на умовах %s, окрім цих приватних даних: пароль, " "електронна адреÑа, адреÑа IM, телефонний номер." -msgid "Create new account" -msgstr "Створити новий акаунт" - -msgid "Create a new user with this nickname." -msgstr "Створити нового кориÑтувача з цим нікнеймом." - -msgid "New nickname" -msgstr "Ðовий нікнейм" - -msgid "1-64 lowercase letters or numbers, no punctuation or spaces." -msgstr "1-64 Ñ€Ñдкові літери Ñ– цифри, ніÑкої пунктуації або інтервалів." - -msgctxt "LABEL" -msgid "Email" -msgstr "Пошта" - -msgid "Used only for updates, announcements, and password recovery" -msgstr "" -"ВикориÑтовуєтьÑÑ Ð»Ð¸ÑˆÐµ Ð´Ð»Ñ Ð½Ð°Ð´ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½ÑŒ, оголошень та Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ " -"паролÑ." - -msgid "Create" -msgstr "Створити" - -msgid "Connect existing account" -msgstr "Приєднати акаунт, Ñкий вже Ñ–Ñнує" - -msgid "" -"If you already have an account, login with your username and password to " -"connect it to your Twitter account." -msgstr "" -"Якщо ви вже маєте акаунт, увійдіть з вашим ім’Ñм кориÑтувача та паролем, аби " -"приєднати Ñ—Ñ… до Twitter." - -msgid "Existing nickname" -msgstr "Ðікнейм, Ñкий вже Ñ–Ñнує" - -msgid "Password" -msgstr "Пароль" - +#. TRANS: Button text for connecting an existing StatusNet account in the Twitter connect page.. +#, fuzzy +msgctxt "BUTTON" msgid "Connect" msgstr "Під’єднати" +#. TRANS: Client error displayed when trying to create a new user while creating new users is not allowed. msgid "Registration not allowed." msgstr "РеєÑтрацію не дозволено." +#. TRANS: Client error displayed when trying to create a new user with an invalid invitation code. msgid "Not a valid invitation code." msgstr "Це не дійÑний код запрошеннÑ." +#. TRANS: Client error displayed when trying to create a new user with an invalid username. msgid "Nickname not allowed." msgstr "Ðікнейм не допуÑкаєтьÑÑ." +#. TRANS: Client error displayed when trying to create a new user with a username that is already in use. msgid "Nickname already in use. Try another one." msgstr "Цей нікнейм вже викориÑтовуєтьÑÑ. Спробуйте інший." +#. TRANS: Server error displayed when creating a new user has failed. msgid "Error registering user." msgstr "Помилка при реєÑтрації кориÑтувача." +#. TRANS: Server error displayed when connecting a user to a Twitter user has failed. +#. TRANS: Server error displayed connecting a user to a Twitter user has failed. msgid "Error connecting user to Twitter." msgstr "Помилка при підключенні кориÑтувача до Twitter." +#. TRANS: Form validation error displayed when connecting an existing user to a Twitter user fails because +#. TRANS: the provided username and/or password are incorrect. msgid "Invalid username or password." msgstr "ÐедійÑне Ñ–Ð¼â€™Ñ Ð°Ð±Ð¾ пароль." +#. TRANS: Page title for Twitter administration panel. +#, fuzzy +msgctxt "TITLE" msgid "Twitter" msgstr "Twitter" +#. TRANS: Instructions for Twitter bridge administration page. msgid "Twitter bridge settings" msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–Ñтка з Twitter" -msgid "Invalid consumer key. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer key is invalid because it is too long. +#, fuzzy +msgid "Invalid consumer key. Maximum length is 255 characters." msgstr "Ðевірний ключ Ñпоживача. МакÑимальна довжина — 255 Ñимволів." -msgid "Invalid consumer secret. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer secret is invalid because it is too long. +#, fuzzy +msgid "Invalid consumer secret. Maximum length is 255 characters." msgstr "Ðевірний Ñекретний код Ñпоживача. МакÑимальна довжина — 255 Ñимволів." +#. TRANS: Fieldset legend for Twitter application settings. msgid "Twitter application settings" msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÑƒ Ð´Ð»Ñ Twitter" +#. TRANS: Field label for Twitter assigned consumer key. msgid "Consumer key" msgstr "Ключ Ñпоживача" -msgid "Consumer key assigned by Twitter" +#. TRANS: Field title for Twitter assigned consumer key. +#, fuzzy +msgid "The consumer key assigned by Twitter." msgstr "Ключ Ñпоживача, що він був наданий ÑервіÑом Twitter" +#. TRANS: Field label for Twitter assigned consumer secret. msgid "Consumer secret" msgstr "Секретний код Ñпоживача" -msgid "Consumer secret assigned by Twitter" +#. TRANS: Field title for Twitter assigned consumer secret. +#, fuzzy +msgid "The consumer secret assigned by Twitter." msgstr "Секретний код Ñпоживача, що він був наданий ÑервіÑом Twitter" -msgid "Note: a global consumer key and secret are set." +#. TRANS: Form guide displayed when two required fields have already been provided. +#, fuzzy +msgid "Note: A global consumer key and secret are set." msgstr "Примітка: глобальний ключ Ñпоживача та Ñекретний код вÑтановлено." +#. TRANS: Field label for Twitter application name. msgid "Integration source" msgstr "Джерело об’єднаннÑ" -msgid "Name of your Twitter application" +#. TRANS: Field title for Twitter application name. +#, fuzzy +msgid "The name of your Twitter application." msgstr "Ðазва вашого додатку Ð´Ð»Ñ Twitter" +#. TRANS: Fieldset legend for Twitter integration options. msgid "Options" msgstr "Параметри" +#. TRANS: Checkbox label for global setting. msgid "Enable \"Sign-in with Twitter\"" msgstr "Увімкнути «Увійти з допомогою Twitter»" -msgid "Allow users to login with their Twitter credentials" +#. TRANS: Checkbox title. +#, fuzzy +msgid "This allow users to login with their Twitter credentials." msgstr "" "Дозволити кориÑтувачам входити на Ñайт, викориÑтовуючи Ð¿Ð¾Ð²Ð½Ð¾Ð²Ð°Ð¶ÐµÐ½Ð½Ñ Twitter" +#. TRANS: Checkbox label for global setting. msgid "Enable Twitter import" msgstr "Увімкнути імпорт з Twitter" +#. TRANS: Checkbox title for global setting. msgid "" "Allow users to import their Twitter friends' timelines. Requires daemons to " "be manually configured." @@ -266,18 +356,69 @@ msgstr "" "Дозволити кориÑтувачам імпортувати їхні Ñтрічки допиÑів з Twitter. Це " "вимагає ручної наÑтройки процеÑів типу «daemon»." -msgid "Save Twitter settings" -msgstr "Зберегти Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Twitter" +#. TRANS: Button title for saving the administrative Twitter bridge settings. +#, fuzzy +msgid "Save the Twitter bridge settings." +msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–Ñтка з Twitter" -msgid "Login or register using Twitter" +#. TRANS: Server exception thrown when an invalid URL scheme is detected. +msgid "Invalid URL scheme for HTTP stream reader." +msgstr "" + +#. TRANS: Exception thrown when input from an inexpected socket is encountered. +msgid "Got input from unexpected socket!" +msgstr "" + +#. TRANS: Exception thrown when an invalid state is encountered in handleLine. +#. TRANS: %s is the invalid state. +#, php-format +msgid "Invalid state in handleLine: %s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response line is encountered. +#. TRANS: %s is the invalid line. +#, php-format +msgid "Invalid HTTP response line: %s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response line part is encountered. +#. TRANS: %1$s is the chunk, %2$s is the line. +#, php-format +msgid "Invalid HTTP response line chunk \"%1$s\": %2$s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response code is encountered. +#. TRANS: %1$s is the response code, %2$s is the line. +#, php-format +msgid "Bad HTTP response code %1$s: %2$s." +msgstr "" + +#. TRANS: Menu item in login navigation. +#. TRANS: Menu item in connection settings navigation. +#, fuzzy +msgctxt "MENU" +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Title for menu item in login navigation. +#, fuzzy +msgid "Login or register using Twitter." msgstr "Увійти або зареєÑтруватиÑÑŒ з Twitter" +#. TRANS: Title for menu item in connection settings navigation. msgid "Twitter integration options" msgstr "Параметри інтеграції з Twitter" -msgid "Twitter bridge configuration" +#. TRANS: Menu item in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Menu item title in administrative panel that leads to the Twitter bridge configuration. +#, fuzzy +msgid "Twitter bridge configuration page." msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–Ñтка з Twitter" +#. TRANS: Plugin description. msgid "" "The Twitter \"bridge\" plugin allows integration of a StatusNet instance " "with Twitter." @@ -285,15 +426,21 @@ msgstr "" "Додаток TwitterBridge дозволÑÑ” інтегрувати StatusNet-ÑуміÑний Ñайт з Twitter, вÑтановлюючи так званий «міÑток»." +#. TRANS: Client error displayed when trying to log in using Twitter while already logged in to StatusNet. msgid "Already logged in." msgstr "Тепер ви увійшли." +#. TRANS: Title for login using Twitter page. +#, fuzzy +msgctxt "TITLE" msgid "Twitter Login" msgstr "Вхід Twitter" +#. TRANS: Instructions for login using Twitter page. msgid "Login with your Twitter account" msgstr "Увійти за допомогою акаунту Twitter" +#. TRANS: Alternative text for "sign in with Twitter" image. msgid "Sign in with Twitter" msgstr "Увійти з акаунтом Twitter" diff --git a/plugins/TwitterBridge/locale/zh_CN/LC_MESSAGES/TwitterBridge.po b/plugins/TwitterBridge/locale/zh_CN/LC_MESSAGES/TwitterBridge.po index ab0c705277..20abf21d80 100644 --- a/plugins/TwitterBridge/locale/zh_CN/LC_MESSAGES/TwitterBridge.po +++ b/plugins/TwitterBridge/locale/zh_CN/LC_MESSAGES/TwitterBridge.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - TwitterBridge to Simplified Chinese (‪中文(简体)‬) +# Translation of StatusNet - TwitterBridge to Simplified Chinese (‪中文(简体)‬) # Exported from translatewiki.net # # Author: Hydra @@ -11,130 +11,219 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TwitterBridge\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:46+0000\n" -"Language-Team: Simplified Chinese \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:38+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: zh-hans\n" "X-Message-Group: #out-statusnet-plugin-twitterbridge\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Title for page with Twitter integration settings. msgid "Twitter settings" msgstr "Twitter 设置" +#. TRANS: Instructions for page with Twitter integration settings. msgid "" "Connect your Twitter account to share your updates with your Twitter friends " "and vice-versa." msgstr "" "å…³è”ä½ çš„ Twitter å¸å·å¹¶ä¸Žä½ çš„ Twitter 好å‹åˆ†äº«ä½ çš„更新和查看好å‹çš„更新。" +#. TRANS: Fieldset legend. msgid "Twitter account" msgstr "Twitter å¸å·" +#. TRANS: Form note when a Twitter account has been connected. msgid "Connected Twitter account" msgstr "已关è”çš„ Twitter å¸å·" +#. TRANS: Fieldset legend. msgid "Disconnect my account from Twitter" msgstr "å–消我的å¸å·ä¸Ž Twitter çš„å…³è”" -msgid "Disconnecting your Twitter could make it impossible to log in! Please " +#. TRANS: Form guide. %s is a URL to the password settings. +#. TRANS: This message contains a Markdown link in the form [description](link). +#, fuzzy, php-format +msgid "" +"Disconnecting your Twitter account could make it impossible to log in! " +"Please [set a password](%s) first." msgstr "å–消关è”ä½ çš„ Twitter å¸å·å’Œèƒ½ä¼šå¯¼è‡´æ— æ³•ç™»å½•ï¼è¯·" -msgid "set a password" -msgstr "设置一个密ç " - -msgid " first." -msgstr "先。" - -#. TRANS: %1$s is the current website name. +#. TRANS: Form instructions. %1$s is the StatusNet sitename. #, php-format msgid "" "Keep your %1$s account but disconnect from Twitter. You can use your %1$s " "password to log in." msgstr "ä¿ç•™ä½ çš„ %1$s å¸å·å¹¶å–æ¶ˆå…³è” Twitter。你å¯ä»¥ä½¿ç”¨ä½ çš„ %1$s 密ç æ¥ç™»å½•ã€‚" +#. TRANS: Button text for disconnecting a Twitter account. +#, fuzzy +msgctxt "BUTTON" msgid "Disconnect" msgstr "å–消关è”" +#. TRANS: Fieldset legend. msgid "Preferences" msgstr "å‚数设置" +#. TRANS: Checkbox label. msgid "Automatically send my notices to Twitter." msgstr "自动将我的消æ¯å‘é€åˆ° Twitter。" +#. TRANS: Checkbox label. msgid "Send local \"@\" replies to Twitter." msgstr "将本地的“@â€å›žå¤å‘é€åˆ° Twitter。" +#. TRANS: Checkbox label. msgid "Subscribe to my Twitter friends here." msgstr "关注我在这里的 Twitter 好å‹ã€‚" +#. TRANS: Checkbox label. msgid "Import my friends timeline." msgstr "导入我好å‹çš„时间线。" +#. TRANS: Button text for saving Twitter integration settings. +#. TRANS: Button text for saving the administrative Twitter bridge settings. +#, fuzzy +msgctxt "BUTTON" msgid "Save" msgstr "ä¿å­˜" +#. TRANS: Button text for adding Twitter integration. +#, fuzzy +msgctxt "BUTTON" msgid "Add" msgstr "添加" +#. TRANS: Client error displayed when the session token does not match or is not given. msgid "There was a problem with your session token. Try again, please." msgstr "ä½ çš„ session token 出现了一个问题,请é‡è¯•ã€‚" +#. TRANS: Client error displayed when the submitted form contains unexpected data. msgid "Unexpected form submission." msgstr "未预料的表å•æ交。" +#. TRANS: Client error displayed when trying to remove a connected Twitter account when there isn't one connected. msgid "No Twitter connection to remove." msgstr "没有å¯ä»¥ç§»é™¤çš„Twitter连接。" -msgid "Couldn't remove Twitter user." +#. TRANS: Server error displayed when trying to remove a connected Twitter account fails. +#, fuzzy +msgid "Could not remove Twitter user." msgstr "无法删除 Twitter 用户。" +#. TRANS: Success message displayed after disconnecting a Twitter account. msgid "Twitter account disconnected." msgstr "å·²å–消 Twitter å¸å·å…³è”。" -msgid "Couldn't save Twitter preferences." +#. TRANS: Server error displayed when saving Twitter integration preferences fails. +#, fuzzy +msgid "Could not save Twitter preferences." msgstr "无法ä¿å­˜ Twitter å‚数设置。" +#. TRANS: Success message after saving Twitter integration preferences. msgid "Twitter preferences saved." msgstr "å·²ä¿å­˜ Twitter å‚数设置。" +#. TRANS: Form validation error displayed when the checkbox to agree to the license has not been checked. #, fuzzy msgid "You cannot register if you do not agree to the license." msgstr "ä½ å¿…é¡»åŒæ„许å¯åè®®æ‰èƒ½æ³¨å†Œã€‚" +#. TRANS: Form validation error displayed when an unhandled error occurs. msgid "Something weird happened." msgstr "å‘生了很诡异的事情。" +#. TRANS: Server error displayed when linking to a Twitter account fails. #, fuzzy msgid "Could not link your Twitter account." msgstr "无法连接你的 Twitter å¸å·ã€‚" -msgid "Couldn't link your Twitter account: oauth_token mismatch." +#. TRANS: Server error displayed when linking to a Twitter account fails because of an incorrect oauth_token. +#, fuzzy +msgid "Could not link your Twitter account: oauth_token mismatch." msgstr "无法连接你的 Twitter å¸å·ï¼šoauth_token ä¸ç¬¦ã€‚" -msgid "Couldn't link your Twitter account." -msgstr "无法连接你的 Twitter å¸å·ã€‚" - -#, php-format +#. TRANS: Page instruction. %s is the StatusNet sitename. +#, fuzzy, php-format msgid "" -"This is the first time you've logged into %s so we must connect your Twitter " -"account to a local account. You can either create a new account, or connect " -"with your existing account, if you have one." +"This is the first time you have logged into %s so we must connect your " +"Twitter account to a local account. You can either create a new account, or " +"connect with your existing account, if you have one." msgstr "" "这是你第一次登录到 %s,我们需è¦å°†ä½ çš„ Twitter å¸å·ä¸Žä¸€ä¸ªæœ¬åœ°çš„å¸å·å…³è”。你å¯" "以新建一个å¸å·ï¼Œæˆ–者使用你在本站已有的å¸å·ã€‚" +#. TRANS: Page title. msgid "Twitter Account Setup" msgstr "Twitter å¸å·è®¾ç½®" +#. TRANS: Fieldset legend. msgid "Connection options" msgstr "连接选项" +#. TRANS: Fieldset legend. +msgid "Create new account" +msgstr "创建新å¸æˆ·" + +#. TRANS: Sub form introduction text. +msgid "Create a new user with this nickname." +msgstr "以此昵称创建新å¸æˆ·" + +#. TRANS: Field label. +msgid "New nickname" +msgstr "新昵称" + +#. TRANS: Field title for nickname field. +#, fuzzy +msgid "1-64 lowercase letters or numbers, no punctuation or spaces." +msgstr "1 到 64 个å°å†™å­—æ¯æˆ–数字,ä¸åŒ…å«æ ‡ç‚¹æˆ–空格" + +#. TRANS: Field label. +msgctxt "LABEL" +msgid "Email" +msgstr "" + +#. TRANS: Field title for e-mail address field. +msgid "Used only for updates, announcements, and password recovery" +msgstr "" + +#. TRANS: Button text for creating a new StatusNet account in the Twitter connect page. +#, fuzzy +msgctxt "BUTTON" +msgid "Create" +msgstr "创建" + +#. TRANS: Fieldset legend. +msgid "Connect existing account" +msgstr "å…³è”现有账å·" + +#. TRANS: Sub form introduction text. +msgid "" +"If you already have an account, login with your username and password to " +"connect it to your Twitter account." +msgstr "如果你已有å¸å·ï¼Œè¯·è¾“入用户å和密ç ç™»å½•å¹¶å°†å…¶ä¸Žä½ çš„ Twitter è´¦å·å…³è”。" + +#. TRANS: Field label. +msgid "Existing nickname" +msgstr "已存在的昵称" + +#. TRANS: Field label. +msgid "Password" +msgstr "密ç " + +#. TRANS: Fieldset legend. +msgid "License" +msgstr "" + +#. TRANS: Text for license agreement checkbox. +#. TRANS: %s is the license as configured for the StatusNet site. #, php-format msgid "" "My text and files are available under %s except this private data: password, " @@ -143,132 +232,184 @@ msgstr "" "我的文字和文件在%s下æ供,除了如下éšç§å†…容:密ç ã€ç”µå­é‚®ä»¶åœ°å€ã€IM 地å€å’Œç”µè¯" "å·ç ã€‚" -msgid "Create new account" -msgstr "创建新å¸æˆ·" - -msgid "Create a new user with this nickname." -msgstr "以此昵称创建新å¸æˆ·" - -msgid "New nickname" -msgstr "新昵称" - +#. TRANS: Button text for connecting an existing StatusNet account in the Twitter connect page.. #, fuzzy -msgid "1-64 lowercase letters or numbers, no punctuation or spaces." -msgstr "1 到 64 个å°å†™å­—æ¯æˆ–数字,ä¸åŒ…å«æ ‡ç‚¹æˆ–空格" - -msgctxt "LABEL" -msgid "Email" -msgstr "" - -msgid "Used only for updates, announcements, and password recovery" -msgstr "" - -msgid "Create" -msgstr "创建" - -msgid "Connect existing account" -msgstr "å…³è”现有账å·" - -msgid "" -"If you already have an account, login with your username and password to " -"connect it to your Twitter account." -msgstr "如果你已有å¸å·ï¼Œè¯·è¾“入用户å和密ç ç™»å½•å¹¶å°†å…¶ä¸Žä½ çš„ Twitter è´¦å·å…³è”。" - -msgid "Existing nickname" -msgstr "已存在的昵称" - -msgid "Password" -msgstr "密ç " - +msgctxt "BUTTON" msgid "Connect" msgstr "å…³è”" +#. TRANS: Client error displayed when trying to create a new user while creating new users is not allowed. msgid "Registration not allowed." msgstr "ä¸å…许注册。" +#. TRANS: Client error displayed when trying to create a new user with an invalid invitation code. msgid "Not a valid invitation code." msgstr "无效的邀请ç ã€‚" +#. TRANS: Client error displayed when trying to create a new user with an invalid username. msgid "Nickname not allowed." msgstr "昵称ä¸è¢«å…许。" +#. TRANS: Client error displayed when trying to create a new user with a username that is already in use. msgid "Nickname already in use. Try another one." msgstr "昵称已被使用,æ¢ä¸€ä¸ªå§ã€‚" +#. TRANS: Server error displayed when creating a new user has failed. msgid "Error registering user." msgstr "注册用户出错。" +#. TRANS: Server error displayed when connecting a user to a Twitter user has failed. +#. TRANS: Server error displayed connecting a user to a Twitter user has failed. msgid "Error connecting user to Twitter." msgstr "å…³è”用户到 Twitter 出错。" +#. TRANS: Form validation error displayed when connecting an existing user to a Twitter user fails because +#. TRANS: the provided username and/or password are incorrect. msgid "Invalid username or password." msgstr "用户å或密ç ä¸æ­£ç¡®ã€‚" +#. TRANS: Page title for Twitter administration panel. +#, fuzzy +msgctxt "TITLE" msgid "Twitter" msgstr "Twitter" +#. TRANS: Instructions for Twitter bridge administration page. msgid "Twitter bridge settings" msgstr "Twitter bridge 设置" -msgid "Invalid consumer key. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer key is invalid because it is too long. +#, fuzzy +msgid "Invalid consumer key. Maximum length is 255 characters." msgstr "无效的 consumer key。最大长度为 255 字符。" -msgid "Invalid consumer secret. Max length is 255 characters." +#. TRANS: Client error displayed when a consumer secret is invalid because it is too long. +#, fuzzy +msgid "Invalid consumer secret. Maximum length is 255 characters." msgstr "无效的 consumer secret。最大长度为 255 字符。" +#. TRANS: Fieldset legend for Twitter application settings. msgid "Twitter application settings" msgstr "Twitter 应用设置" +#. TRANS: Field label for Twitter assigned consumer key. msgid "Consumer key" msgstr "Consumer key" -msgid "Consumer key assigned by Twitter" +#. TRANS: Field title for Twitter assigned consumer key. +#, fuzzy +msgid "The consumer key assigned by Twitter." msgstr "Twitter 分é…çš„ consumer key" +#. TRANS: Field label for Twitter assigned consumer secret. msgid "Consumer secret" msgstr "Consumer secret" -msgid "Consumer secret assigned by Twitter" +#. TRANS: Field title for Twitter assigned consumer secret. +#, fuzzy +msgid "The consumer secret assigned by Twitter." msgstr "Twitter 分é…çš„ consumer secret" -msgid "Note: a global consumer key and secret are set." +#. TRANS: Form guide displayed when two required fields have already been provided. +#, fuzzy +msgid "Note: A global consumer key and secret are set." msgstr "注æ„:已设置了一个全局的 consumer key å’Œ secret。" +#. TRANS: Field label for Twitter application name. msgid "Integration source" msgstr "æ•´åˆæ¥æº" -msgid "Name of your Twitter application" +#. TRANS: Field title for Twitter application name. +#, fuzzy +msgid "The name of your Twitter application." msgstr "ä½ çš„ Twitter 应用å称" +#. TRANS: Fieldset legend for Twitter integration options. msgid "Options" msgstr "选项" +#. TRANS: Checkbox label for global setting. msgid "Enable \"Sign-in with Twitter\"" msgstr "å¯ç”¨ “使用 Twitter 登录â€" -msgid "Allow users to login with their Twitter credentials" +#. TRANS: Checkbox title. +#, fuzzy +msgid "This allow users to login with their Twitter credentials." msgstr "å…许用户使用他们的 Twitter å¸å·ç™»å½•ã€‚" +#. TRANS: Checkbox label for global setting. msgid "Enable Twitter import" msgstr "å¯ç”¨ Twitter 导入" +#. TRANS: Checkbox title for global setting. msgid "" "Allow users to import their Twitter friends' timelines. Requires daemons to " "be manually configured." msgstr "å…许用户导入他们 Twitter 好å‹çš„时间线。需è¦æ‰‹åŠ¨è®¾ç½®åŽå°è¿›ç¨‹ã€‚" -msgid "Save Twitter settings" -msgstr "ä¿å­˜ Twitter 设置" +#. TRANS: Button title for saving the administrative Twitter bridge settings. +#, fuzzy +msgid "Save the Twitter bridge settings." +msgstr "Twitter bridge 设置" -msgid "Login or register using Twitter" +#. TRANS: Server exception thrown when an invalid URL scheme is detected. +msgid "Invalid URL scheme for HTTP stream reader." +msgstr "" + +#. TRANS: Exception thrown when input from an inexpected socket is encountered. +msgid "Got input from unexpected socket!" +msgstr "" + +#. TRANS: Exception thrown when an invalid state is encountered in handleLine. +#. TRANS: %s is the invalid state. +#, php-format +msgid "Invalid state in handleLine: %s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response line is encountered. +#. TRANS: %s is the invalid line. +#, php-format +msgid "Invalid HTTP response line: %s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response line part is encountered. +#. TRANS: %1$s is the chunk, %2$s is the line. +#, php-format +msgid "Invalid HTTP response line chunk \"%1$s\": %2$s." +msgstr "" + +#. TRANS: Exception thrown when an invalid response code is encountered. +#. TRANS: %1$s is the response code, %2$s is the line. +#, php-format +msgid "Bad HTTP response code %1$s: %2$s." +msgstr "" + +#. TRANS: Menu item in login navigation. +#. TRANS: Menu item in connection settings navigation. +#, fuzzy +msgctxt "MENU" +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Title for menu item in login navigation. +#, fuzzy +msgid "Login or register using Twitter." msgstr "使用 Twitter 登录或注册" +#. TRANS: Title for menu item in connection settings navigation. msgid "Twitter integration options" msgstr "Twitter æ•´åˆé€‰é¡¹" -msgid "Twitter bridge configuration" +#. TRANS: Menu item in administrative panel that leads to the Twitter bridge configuration. +msgid "Twitter" +msgstr "Twitter" + +#. TRANS: Menu item title in administrative panel that leads to the Twitter bridge configuration. +#, fuzzy +msgid "Twitter bridge configuration page." msgstr "Twitter bridge 设置" +#. TRANS: Plugin description. msgid "" "The Twitter \"bridge\" plugin allows integration of a StatusNet instance " "with Twitter." @@ -276,15 +417,21 @@ msgstr "" "Twitter \"bridge\" 是个å¯ä»¥è®© StatusNet 账户与 Twitter æ•´åˆçš„æ’件。" +#. TRANS: Client error displayed when trying to log in using Twitter while already logged in to StatusNet. msgid "Already logged in." msgstr "已登录。" +#. TRANS: Title for login using Twitter page. +#, fuzzy +msgctxt "TITLE" msgid "Twitter Login" msgstr "Twitter 登录" +#. TRANS: Instructions for login using Twitter page. msgid "Login with your Twitter account" msgstr "使用你的 Twitter å¸å·ç™»å½•" +#. TRANS: Alternative text for "sign in with Twitter" image. msgid "Sign in with Twitter" msgstr "使用 Twitter 登录" diff --git a/plugins/TwitterBridge/tweetinqueuehandler.php b/plugins/TwitterBridge/tweetinqueuehandler.php index ff6b2cc861..7f34ade23b 100644 --- a/plugins/TwitterBridge/tweetinqueuehandler.php +++ b/plugins/TwitterBridge/tweetinqueuehandler.php @@ -51,10 +51,14 @@ class TweetInQueueHandler extends QueueHandler $importer = new TwitterImport(); $notice = $importer->importStatus($status); if ($notice) { - $flink = Foreign_link::getByForeignID(TWITTER_SERVICE, $receiver); + $flink = Foreign_link::getByForeignID($receiver, TWITTER_SERVICE); if ($flink) { + common_log(LOG_DEBUG, "TweetInQueueHandler - Got flink so add notice ". + $notice->id." to inbox ".$flink->user_id); // @fixme this should go through more regular channels? Inbox::insertNotice($flink->user_id, $notice->id); + }else { + common_log(LOG_DEBUG, "TweetInQueueHandler - No flink found for foreign user ".$receiver); } } diff --git a/plugins/TwitterBridge/twitter.php b/plugins/TwitterBridge/twitter.php index 396de22b09..ac61cc6160 100644 --- a/plugins/TwitterBridge/twitter.php +++ b/plugins/TwitterBridge/twitter.php @@ -1,7 +1,7 @@ nickname != $screen_name) { @@ -105,14 +102,27 @@ function save_twitter_user($twitter_id, $screen_name) } function is_twitter_bound($notice, $flink) { + + // Don't send activity activities (at least for now) + if ($notice->object_type == ActivityObject::ACTIVITY) { + return false; + } + + $allowedVerbs = array(ActivityVerb::POST, ActivityVerb::SHARE); + + // Don't send things that aren't posts or repeats (at least for now) + if (!in_array($notice->verb, $allowedVerbs)) { + return false; + } + // Check to see if notice should go to Twitter - if (!empty($flink) && ($flink->noticesync & FOREIGN_NOTICE_SEND)) { + if (!empty($flink) && (($flink->noticesync & FOREIGN_NOTICE_SEND) == FOREIGN_NOTICE_SEND)) { // If it's not a Twitter-style reply, or if the user WANTS to send replies, // or if it's in reply to a twitter notice - if (!preg_match('/^@[a-zA-Z0-9_]{1,15}\b/u', $notice->content) || - ($flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) || - is_twitter_notice($notice->reply_to)) { + if ( (($flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) == FOREIGN_NOTICE_SEND_REPLY) || + (is_twitter_notice($notice->reply_to) || is_twitter_notice($notice->repeat_of)) || + (empty($notice->reply_to) && !preg_match('/^@[a-zA-Z0-9_]{1,15}\b/u', $notice->content)) ){ return true; } } diff --git a/plugins/TwitterBridge/twitteradminpanel.php b/plugins/TwitterBridge/twitteradminpanel.php index 1a83b47d56..9ace4e4a97 100644 --- a/plugins/TwitterBridge/twitteradminpanel.php +++ b/plugins/TwitterBridge/twitteradminpanel.php @@ -49,7 +49,8 @@ class TwitteradminpanelAction extends AdminPanelAction */ function title() { - return _m('Twitter'); + // TRANS: Page title for Twitter administration panel. + return _m('TITLE','Twitter'); } /** @@ -59,6 +60,7 @@ class TwitteradminpanelAction extends AdminPanelAction */ function getInstructions() { + // TRANS: Instructions for Twitter bridge administration page. return _m('Twitter bridge settings'); } @@ -147,13 +149,15 @@ class TwitteradminpanelAction extends AdminPanelAction if (mb_strlen($values['twitter']['consumer_key']) > 255) { $this->clientError( - _m("Invalid consumer key. Max length is 255 characters.") + // TRANS: Client error displayed when a consumer key is invalid because it is too long. + _m('Invalid consumer key. Maximum length is 255 characters.') ); } if (mb_strlen($values['twitter']['consumer_secret']) > 255) { $this->clientError( - _m("Invalid consumer secret. Max length is 255 characters.") + // TRANS: Client error displayed when a consumer secret is invalid because it is too long. + _m('Invalid consumer secret. Maximum length is 255 characters.') ); } } @@ -209,14 +213,17 @@ class TwitterAdminPanelForm extends AdminForm 'fieldset', array('id' => 'settings_twitter-application') ); + // TRANS: Fieldset legend for Twitter application settings. $this->out->element('legend', null, _m('Twitter application settings')); $this->out->elementStart('ul', 'form_data'); $this->li(); $this->input( 'consumer_key', + // TRANS: Field label for Twitter assigned consumer key. _m('Consumer key'), - _m('Consumer key assigned by Twitter'), + // TRANS: Field title for Twitter assigned consumer key. + _m('The consumer key assigned by Twitter.'), 'twitter' ); $this->unli(); @@ -224,8 +231,10 @@ class TwitterAdminPanelForm extends AdminForm $this->li(); $this->input( 'consumer_secret', - _m('Consumer secret'), - _m('Consumer secret assigned by Twitter'), + // TRANS: Field label for Twitter assigned consumer secret. + _m('Consumer secret'), + // TRANS: Field title for Twitter assigned consumer secret. + _m('The consumer secret assigned by Twitter.'), 'twitter' ); $this->unli(); @@ -235,15 +244,18 @@ class TwitterAdminPanelForm extends AdminForm if (!empty($globalConsumerKey) && !empty($globalConsumerSec)) { $this->li(); - $this->out->element('p', 'form_guide', _m('Note: a global consumer key and secret are set.')); + // TRANS: Form guide displayed when two required fields have already been provided. + $this->out->element('p', 'form_guide', _m('Note: A global consumer key and secret are set.')); $this->unli(); } $this->li(); $this->input( 'source', - _m('Integration source'), - _m('Name of your Twitter application'), + // TRANS: Field label for Twitter application name. + _m('Integration source'), + // TRANS: Field title for Twitter application name. + _m('The name of your Twitter application.'), 'integration' ); $this->unli(); @@ -255,6 +267,7 @@ class TwitterAdminPanelForm extends AdminForm 'fieldset', array('id' => 'settings_twitter-options') ); + // TRANS: Fieldset legend for Twitter integration options. $this->out->element('legend', null, _m('Options')); $this->out->elementStart('ul', 'form_data'); @@ -262,17 +275,21 @@ class TwitterAdminPanelForm extends AdminForm $this->li(); $this->out->checkbox( + // TRANS: Checkbox label for global setting. 'signin', _m('Enable "Sign-in with Twitter"'), (bool) $this->value('signin', 'twitter'), - _m('Allow users to login with their Twitter credentials') + // TRANS: Checkbox title. + _m('This allow users to login with their Twitter credentials.') ); $this->unli(); if (Event::handle('TwitterBridgeAdminImportControl')) { $this->li(); $this->out->checkbox( + // TRANS: Checkbox label for global setting. 'enabled', _m('Enable Twitter import'), (bool) $this->value('enabled', 'twitterimport'), + // TRANS: Checkbox title for global setting. _m('Allow users to import their Twitter friends\' timelines. Requires daemons to be manually configured.') ); $this->unli(); @@ -290,6 +307,9 @@ class TwitterAdminPanelForm extends AdminForm */ function formActions() { - $this->out->submit('submit', _m('Save'), 'submit', null, _m('Save Twitter settings')); + // TRANS: Button text for saving the administrative Twitter bridge settings. + $this->out->submit('submit', _m('BUTTON','Save'), 'submit', null, + // TRANS: Button title for saving the administrative Twitter bridge settings. + _m('Save the Twitter bridge settings.')); } } diff --git a/plugins/TwitterBridge/twitterauthorization.php b/plugins/TwitterBridge/twitterauthorization.php index e45b677e17..1a7234214e 100644 --- a/plugins/TwitterBridge/twitterauthorization.php +++ b/plugins/TwitterBridge/twitterauthorization.php @@ -117,12 +117,14 @@ class TwitterauthorizationAction extends Action $token = $this->trimmed('token'); if (!$token || $token != common_session_token()) { + // TRANS: Client error displayed when the session token does not match or is not given. $this->showForm(_m('There was a problem with your session token. Try again, please.')); return; } if ($this->arg('create')) { if (!$this->boolean('license')) { + // TRANS: Form validation error displayed when the checkbox to agree to the license has not been checked. $this->showForm(_m('You cannot register if you do not agree to the license.'), $this->trimmed('newname')); return; @@ -132,6 +134,7 @@ class TwitterauthorizationAction extends Action $this->connectNewUser(); } else { common_debug('Twitter bridge - ' . print_r($this->args, true)); + // TRANS: Form validation error displayed when an unhandled error occurs. $this->showForm(_m('Something weird happened.'), $this->trimmed('newname')); } @@ -157,7 +160,6 @@ class TwitterauthorizationAction extends Action function authorizeRequestToken() { try { - // Get a new request token and authorize it $client = new TwitterOAuthClient(); @@ -169,7 +171,6 @@ class TwitterauthorizationAction extends Action $_SESSION['twitter_request_token_secret'] = $req_tok->secret; $auth_link = $client->getAuthorizeLink($req_tok, $this->signin); - } catch (OAuthClientException $e) { $msg = sprintf( 'OAuth client error - code: %1s, msg: %2s', @@ -178,6 +179,7 @@ class TwitterauthorizationAction extends Action ); common_log(LOG_INFO, 'Twitter bridge - ' . $msg); $this->serverError( + // TRANS: Server error displayed when linking to a Twitter account fails. _m('Could not link your Twitter account.') ); } @@ -198,7 +200,8 @@ class TwitterauthorizationAction extends Action if ($_SESSION['twitter_request_token'] != $this->oauth_token) { $this->serverError( - _m('Couldn\'t link your Twitter account: oauth_token mismatch.') + // TRANS: Server error displayed when linking to a Twitter account fails because of an incorrect oauth_token. + _m('Could not link your Twitter account: oauth_token mismatch.') ); } @@ -226,7 +229,8 @@ class TwitterauthorizationAction extends Action ); common_log(LOG_INFO, 'Twitter bridge - ' . $msg); $this->serverError( - _m('Couldn\'t link your Twitter account.') + // TRANS: Server error displayed when linking to a Twitter account fails. + _m('Could not link your Twitter account.') ); } @@ -297,7 +301,8 @@ class TwitterauthorizationAction extends Action if (empty($flink_id)) { common_log_db_error($flink, 'INSERT', __FILE__); - $this->serverError(_m('Couldn\'t link your Twitter account.')); + // TRANS: Server error displayed when linking to a Twitter account fails. + $this->serverError(_m('Could not link your Twitter account.')); } return $flink_id; @@ -309,12 +314,14 @@ class TwitterauthorizationAction extends Action $this->element('div', array('class' => 'error'), $this->error); } else { $this->element('div', 'instructions', - sprintf(_m('This is the first time you\'ve logged into %s so we must connect your Twitter account to a local account. You can either create a new account, or connect with your existing account, if you have one.'), common_config('site', 'name'))); + // TRANS: Page instruction. %s is the StatusNet sitename. + sprintf(_m('This is the first time you have logged into %s so we must connect your Twitter account to a local account. You can either create a new account, or connect with your existing account, if you have one.'), common_config('site', 'name'))); } } function title() { + // TRANS: Page title. return _m('Twitter Account Setup'); } @@ -348,7 +355,77 @@ class TwitterauthorizationAction extends Action 'class' => 'form_settings', 'action' => common_local_url('twitterauthorization'))); $this->elementStart('fieldset', array('id' => 'settings_twitter_connect_options')); + // TRANS: Fieldset legend. $this->element('legend', null, _m('Connection options')); + + $this->hidden('access_token_key', $this->access_token->key); + $this->hidden('access_token_secret', $this->access_token->secret); + $this->hidden('twuid', $this->twuid); + $this->hidden('tw_fields_screen_name', $this->tw_fields['screen_name']); + $this->hidden('tw_fields_name', $this->tw_fields['fullname']); + $this->hidden('token', common_session_token()); + + // Don't allow new account creation if site is flagged as invite only + if (common_config('site', 'inviteonly') == false) { + $this->elementStart('fieldset'); + $this->element('legend', null, + // TRANS: Fieldset legend. + _m('Create new account')); + $this->element('p', null, + // TRANS: Sub form introduction text. + _m('Create a new user with this nickname.')); + $this->elementStart('ul', 'form_data'); + + // Hook point for captcha etc + Event::handle('StartRegistrationFormData', array($this)); + + $this->elementStart('li'); + // TRANS: Field label. + $this->input('newname', _m('New nickname'), + ($this->username) ? $this->username : '', + // TRANS: Field title for nickname field. + _m('1-64 lowercase letters or numbers, no punctuation or spaces.')); + $this->elementEnd('li'); + $this->elementStart('li'); + // TRANS: Field label. + $this->input('email', _m('LABEL','Email'), $this->getEmail(), + // TRANS: Field title for e-mail address field. + _m('Used only for updates, announcements, '. + 'and password recovery')); + $this->elementEnd('li'); + + // Hook point for captcha etc + Event::handle('EndRegistrationFormData', array($this)); + + $this->elementEnd('ul'); + // TRANS: Button text for creating a new StatusNet account in the Twitter connect page. + $this->submit('create', _m('BUTTON','Create')); + $this->elementEnd('fieldset'); + } + + $this->elementStart('fieldset'); + $this->element('legend', null, + // TRANS: Fieldset legend. + _m('Connect existing account')); + $this->element('p', null, + // TRANS: Sub form introduction text. + _m('If you already have an account, login with your username and password to connect it to your Twitter account.')); + $this->elementStart('ul', 'form_data'); + $this->elementStart('li'); + // TRANS: Field label. + $this->input('nickname', _m('Existing nickname')); + $this->elementEnd('li'); + $this->elementStart('li'); + // TRANS: Field label. + $this->password('password', _m('Password')); + $this->elementEnd('li'); + $this->elementEnd('ul'); + $this->elementEnd('fieldset'); + + $this->elementStart('fieldset'); + $this->element('legend', null, + // TRANS: Fieldset legend. + _m('License')); $this->elementStart('ul', 'form_data'); $this->elementStart('li'); $this->element('input', array('type' => 'checkbox', @@ -357,6 +434,8 @@ class TwitterauthorizationAction extends Action 'name' => 'license', 'value' => 'true')); $this->elementStart('label', array('class' => 'checkbox', 'for' => 'license')); + // TRANS: Text for license agreement checkbox. + // TRANS: %s is the license as configured for the StatusNet site. $message = _m('My text and files are available under %s ' . 'except this private data: password, ' . 'email address, IM address, and phone number.'); @@ -369,57 +448,9 @@ class TwitterauthorizationAction extends Action $this->elementEnd('label'); $this->elementEnd('li'); $this->elementEnd('ul'); - $this->hidden('access_token_key', $this->access_token->key); - $this->hidden('access_token_secret', $this->access_token->secret); - $this->hidden('twuid', $this->twuid); - $this->hidden('tw_fields_screen_name', $this->tw_fields['screen_name']); - $this->hidden('tw_fields_name', $this->tw_fields['fullname']); - - $this->elementStart('fieldset'); - $this->hidden('token', common_session_token()); - $this->element('legend', null, - _m('Create new account')); - $this->element('p', null, - _m('Create a new user with this nickname.')); - $this->elementStart('ul', 'form_data'); - - // Hook point for captcha etc - Event::handle('StartRegistrationFormData', array($this)); - - $this->elementStart('li'); - $this->input('newname', _m('New nickname'), - ($this->username) ? $this->username : '', - _m('1-64 lowercase letters or numbers, no punctuation or spaces.')); - $this->elementEnd('li'); - $this->elementStart('li'); - $this->input('email', _m('LABEL','Email'), $this->getEmail(), - _m('Used only for updates, announcements, '. - 'and password recovery')); - $this->elementEnd('li'); - - // Hook point for captcha etc - Event::handle('EndRegistrationFormData', array($this)); - - $this->elementEnd('ul'); - $this->submit('create', _m('Create')); $this->elementEnd('fieldset'); - - $this->elementStart('fieldset'); - $this->element('legend', null, - _m('Connect existing account')); - $this->element('p', null, - _m('If you already have an account, login with your username and password to connect it to your Twitter account.')); - $this->elementStart('ul', 'form_data'); - $this->elementStart('li'); - $this->input('nickname', _m('Existing nickname')); - $this->elementEnd('li'); - $this->elementStart('li'); - $this->password('password', _m('Password')); - $this->elementEnd('li'); - $this->elementEnd('ul'); - $this->submit('connect', _m('Connect')); - $this->elementEnd('fieldset'); - + // TRANS: Button text for connecting an existing StatusNet account in the Twitter connect page.. + $this->submit('connect', _m('BUTTON','Connect')); $this->elementEnd('fieldset'); $this->elementEnd('form'); } @@ -463,6 +494,7 @@ class TwitterauthorizationAction extends Action } if (common_config('site', 'closed')) { + // TRANS: Client error displayed when trying to create a new user while creating new users is not allowed. $this->clientError(_m('Registration not allowed.')); return; } @@ -472,6 +504,7 @@ class TwitterauthorizationAction extends Action if (common_config('site', 'inviteonly')) { $code = $_SESSION['invitecode']; if (empty($code)) { + // TRANS: Client error displayed when trying to create a new user while creating new users is not allowed. $this->clientError(_m('Registration not allowed.')); return; } @@ -479,6 +512,7 @@ class TwitterauthorizationAction extends Action $invite = Invitation::staticGet($code); if (empty($invite)) { + // TRANS: Client error displayed when trying to create a new user with an invalid invitation code. $this->clientError(_m('Not a valid invitation code.')); return; } @@ -492,11 +526,13 @@ class TwitterauthorizationAction extends Action } if (!User::allowed_nickname($nickname)) { + // TRANS: Client error displayed when trying to create a new user with an invalid username. $this->showForm(_m('Nickname not allowed.')); return; } if (User::staticGet('nickname', $nickname)) { + // TRANS: Client error displayed when trying to create a new user with a username that is already in use. $this->showForm(_m('Nickname already in use. Try another one.')); return; } @@ -517,6 +553,7 @@ class TwitterauthorizationAction extends Action $user = User::register($args); if (empty($user)) { + // TRANS: Server error displayed when creating a new user has failed. $this->serverError(_m('Error registering user.')); return; } @@ -528,6 +565,7 @@ class TwitterauthorizationAction extends Action save_twitter_user($this->twuid, $this->tw_fields['screen_name']); if (!$result) { + // TRANS: Server error displayed when connecting a user to a Twitter user has failed. $this->serverError(_m('Error connecting user to Twitter.')); return; } @@ -550,6 +588,8 @@ class TwitterauthorizationAction extends Action $password = $this->trimmed('password'); if (!common_check_user($nickname, $password)) { + // TRANS: Form validation error displayed when connecting an existing user to a Twitter user fails because + // TRANS: the provided username and/or password are incorrect. $this->showForm(_m('Invalid username or password.')); return; } @@ -568,6 +608,7 @@ class TwitterauthorizationAction extends Action save_twitter_user($this->twuid, $this->tw_fields['screen_name']); if (!$result) { + // TRANS: Server error displayed connecting a user to a Twitter user has failed. $this->serverError(_m('Error connecting user to Twitter.')); return; } @@ -588,6 +629,7 @@ class TwitterauthorizationAction extends Action $result = $this->flinkUser($user->id, $this->twuid); if (empty($result)) { + // TRANS: Server error displayed connecting a user to a Twitter user has failed. $this->serverError(_m('Error connecting user to Twitter.')); return; } diff --git a/plugins/TwitterBridge/twitterimport.php b/plugins/TwitterBridge/twitterimport.php index 0eacfcd62c..dc7277caf9 100644 --- a/plugins/TwitterBridge/twitterimport.php +++ b/plugins/TwitterBridge/twitterimport.php @@ -172,8 +172,8 @@ class TwitterImport $notice->is_local = Notice::GATEWAY; - $notice->content = html_entity_decode($status->text, ENT_QUOTES, 'UTF-8'); - $notice->rendered = $this->linkify($status); + $notice->content = html_entity_decode($this->linkify($status, FALSE), ENT_QUOTES, 'UTF-8'); + $notice->rendered = $this->linkify($status, TRUE); if (Event::handle('StartNoticeSave', array(&$notice))) { @@ -339,10 +339,7 @@ class TwitterImport { global $config; - $path_parts = pathinfo($twitter_user->profile_image_url); - - $newname = 'Twitter_' . $twitter_user->id . '_' . - $path_parts['basename']; + $newname = 'Twitter_' . $twitter_user->id . '_' . basename($twitter_user->profile_image_url); $oldname = $profile->getAvatar(48)->filename; @@ -370,15 +367,15 @@ class TwitterImport $path_parts = pathinfo($twitter_user->profile_image_url); - $img_root = substr($path_parts['basename'], 0, -11); - $ext = $path_parts['extension']; - $mediatype = $this->getMediatype($ext); + $ext = (isset($path_parts['extension']) ? '.'.$path_parts['extension'] : ''); // some lack extension + $img_root = basename($path_parts['basename'], '_normal'.$ext); // cut off extension + $mediatype = $this->getMediatype(substr($ext, 1)); foreach (array('mini', 'normal', 'bigger') as $size) { $url = $path_parts['dirname'] . '/' . - $img_root . '_' . $size . ".$ext"; + $img_root . '_' . $size . $ext; $filename = 'Twitter_' . $twitter_user->id . '_' . - $img_root . "_$size.$ext"; + $img_root . '_' . $size . $ext; $this->updateAvatar($profile->id, $size, $mediatype, $filename); $this->fetchAvatar($url, $filename); @@ -401,8 +398,9 @@ class TwitterImport $mediatype = null; switch (strtolower($ext)) { + case 'jpeg': case 'jpg': - $mediatype = 'image/jpg'; + $mediatype = 'image/jpeg'; break; case 'gif': $mediatype = 'image/gif'; @@ -419,16 +417,15 @@ class TwitterImport global $config; $path_parts = pathinfo($user->profile_image_url); - $ext = $path_parts['extension']; - $end = strlen('_normal' . $ext); - $img_root = substr($path_parts['basename'], 0, -($end+1)); - $mediatype = $this->getMediatype($ext); + $ext = (isset($path_parts['extension']) ? '.'.$path_parts['extension'] : ''); + $img_root = basename($path_parts['basename'], '_normal'.$ext); + $mediatype = $this->getMediatype(substr($ext, 1)); foreach (array('mini', 'normal', 'bigger') as $size) { $url = $path_parts['dirname'] . '/' . - $img_root . '_' . $size . ".$ext"; + $img_root . '_' . $size . $ext; $filename = 'Twitter_' . $user->id . '_' . - $img_root . "_$size.$ext"; + $img_root . '_' . $size . $ext; if ($this->fetchAvatar($url, $filename)) { $this->newAvatar($id, $size, $mediatype, $filename); @@ -540,7 +537,7 @@ class TwitterImport const HASHTAG = 2; const MENTION = 3; - function linkify($status) + function linkify($status, $html = FALSE) { $text = $status->text; @@ -596,13 +593,21 @@ class TwitterImport $orig = $this->twitEscape(mb_substr($text, $start, $end - $start)); switch($type) { case self::URL: - $linkText = $this->makeUrlLink($object, $orig); + $linkText = $this->makeUrlLink($object, $orig, $html); break; case self::HASHTAG: - $linkText = $this->makeHashtagLink($object, $orig); + if ($html) { + $linkText = $this->makeHashtagLink($object, $orig); + }else{ + $linkText = $orig; + } break; case self::MENTION: - $linkText = $this->makeMentionLink($object, $orig); + if ($html) { + $linkText = $this->makeMentionLink($object, $orig); + }else{ + $linkText = $orig; + } break; default: $linkText = $orig; @@ -630,9 +635,13 @@ class TwitterImport return htmlspecialchars(html_entity_decode($str, ENT_COMPAT, 'UTF-8')); } - function makeUrlLink($object, $orig) + function makeUrlLink($object, $orig, $html) { - return "{$orig}"; + if ($html) { + return ''.htmlspecialchars($object->display_url).''; + }else{ + return htmlspecialchars($object->expanded_url); + } } function makeHashtagLink($object, $orig) @@ -700,4 +709,4 @@ class TwitterImport } } } -} \ No newline at end of file +} diff --git a/plugins/TwitterBridge/twitterlogin.php b/plugins/TwitterBridge/twitterlogin.php index 062c781f77..379e136045 100644 --- a/plugins/TwitterBridge/twitterlogin.php +++ b/plugins/TwitterBridge/twitterlogin.php @@ -53,6 +53,7 @@ class TwitterloginAction extends Action parent::handle($args); if (common_is_real_login()) { + // TRANS: Client error displayed when trying to log in using Twitter while already logged in to StatusNet. $this->clientError(_m('Already logged in.')); } @@ -61,11 +62,13 @@ class TwitterloginAction extends Action function title() { - return _m('Twitter Login'); + // TRANS: Title for login using Twitter page. + return _m('TITLE','Twitter Login'); } function getInstructions() { + // TRANS: Instructions for login using Twitter page. return _m('Login with your Twitter account'); } @@ -84,6 +87,7 @@ class TwitterloginAction extends Action null, array('signin' => true)))); $this->element('img', array('src' => Plugin::staticPath('TwitterBridge', 'Sign-in-with-Twitter-lighter.png'), + // TRANS: Alternative text for "sign in with Twitter" image. 'alt' => _m('Sign in with Twitter'))); $this->elementEnd('a'); } diff --git a/plugins/TwitterBridge/twitteroauthclient.php b/plugins/TwitterBridge/twitteroauthclient.php index a17911b03e..720844211a 100644 --- a/plugins/TwitterBridge/twitteroauthclient.php +++ b/plugins/TwitterBridge/twitteroauthclient.php @@ -157,7 +157,7 @@ class TwitterOAuthClient extends OAuthClient */ function verifyCredentials() { - $url = 'https://api.twitter.com/1/account/verify_credentials.json'; + $url = 'https://api.twitter.com/1.1/account/verify_credentials.json'; $response = $this->oAuthGet($url); $twitter_user = json_decode($response); return $twitter_user; @@ -175,7 +175,7 @@ class TwitterOAuthClient extends OAuthClient */ function statusesUpdate($status, $params=array()) { - $url = 'https://api.twitter.com/1/statuses/update.json'; + $url = 'https://api.twitter.com/1.1/statuses/update.json'; if (is_numeric($params)) { $params = array('in_reply_to_status_id' => intval($params)); } @@ -190,19 +190,21 @@ class TwitterOAuthClient extends OAuthClient /** * Calls Twitter's /statuses/home_timeline API method * - * @param int $since_id show statuses after this id - * @param int $max_id show statuses before this id - * @param int $cnt number of statuses to show - * @param int $page page number + * @param int $since_id show statuses after this id + * @param string $timelineUri timeline to poll statuses from + * @param int $max_id show statuses before this id + * @param int $cnt number of statuses to show + * @param int $page page number * * @return mixed an array of statuses */ - function statusesHomeTimeline($since_id = null, $max_id = null, - $cnt = null, $page = null) + function statusesTimeline($since_id = null, $timelineUri = 'home_timeline', + $max_id = null, $cnt = 200, $page = null) { - $url = 'https://api.twitter.com/1/statuses/home_timeline.json'; + $url = 'https://api.twitter.com/1.1/statuses/'.$timelineUri.'.json'; - $params = array('include_entities' => 'true'); + $params = array('include_entities' => 'true', + 'include_rts' => 'true'); if (!empty($since_id)) { $params['since_id'] = $since_id; @@ -235,7 +237,7 @@ class TwitterOAuthClient extends OAuthClient function statusesFriends($id = null, $user_id = null, $screen_name = null, $page = null) { - $url = "https://api.twitter.com/1/statuses/friends.json"; + $url = "https://api.twitter.com/1.1/friends/list.json"; $params = array(); @@ -273,7 +275,7 @@ class TwitterOAuthClient extends OAuthClient function friendsIds($id = null, $user_id = null, $screen_name = null, $page = null) { - $url = "https://api.twitter.com/1/friends/ids.json"; + $url = "https://api.twitter.com/1.1/friends/ids.json"; $params = array(); @@ -308,7 +310,7 @@ class TwitterOAuthClient extends OAuthClient function statusesRetweet($id) { - $url = "http://api.twitter.com/1/statuses/retweet/$id.json"; + $url = "http://api.twitter.com/1.1/statuses/retweet/$id.json"; $response = $this->oAuthPost($url); $status = json_decode($response); return $status; @@ -324,8 +326,10 @@ class TwitterOAuthClient extends OAuthClient function favoritesCreate($id) { - $url = "http://api.twitter.com/1/favorites/create/$id.json"; - $response = $this->oAuthPost($url); + $url = "http://api.twitter.com/1.1/favorites/create.json"; + $params=array(); + $params['id'] = $id; + $response = $this->oAuthPost($url, $params); $status = json_decode($response); return $status; } @@ -340,8 +344,10 @@ class TwitterOAuthClient extends OAuthClient function favoritesDestroy($id) { - $url = "http://api.twitter.com/1/favorites/destroy/$id.json"; - $response = $this->oAuthPost($url); + $url = "http://api.twitter.com/1.1/favorites/destroy.json"; + $params=array(); + $params['id'] = $id; + $response = $this->oAuthPost($url,$params); $status = json_decode($response); return $status; } @@ -356,7 +362,7 @@ class TwitterOAuthClient extends OAuthClient function statusesDestroy($id) { - $url = "http://api.twitter.com/1/statuses/destroy/$id.json"; + $url = "http://api.twitter.com/1.1/statuses/destroy/$id.json"; $response = $this->oAuthPost($url); $status = json_decode($response); return $status; diff --git a/plugins/TwitterBridge/twittersettings.php b/plugins/TwitterBridge/twittersettings.php index 763a586079..88799e75a9 100644 --- a/plugins/TwitterBridge/twittersettings.php +++ b/plugins/TwitterBridge/twittersettings.php @@ -54,6 +54,7 @@ class TwittersettingsAction extends ProfileSettingsAction function title() { + // TRANS: Title for page with Twitter integration settings. return _m('Twitter settings'); } @@ -65,6 +66,7 @@ class TwittersettingsAction extends ProfileSettingsAction function getInstructions() { + // TRANS: Instructions for page with Twitter integration settings. return _m('Connect your Twitter account to share your updates ' . 'with your Twitter friends and vice-versa.'); } @@ -106,57 +108,62 @@ class TwittersettingsAction extends ProfileSettingsAction $this->elementStart('ul', 'form_data'); $this->elementStart('li', array('id' => 'settings_twitter_login_button')); $this->element('a', array('href' => common_local_url('twitterauthorization')), + // TRANS: Link description to connect to a Twitter account. 'Connect my Twitter account'); $this->elementEnd('li'); $this->elementEnd('ul'); $this->elementEnd('fieldset'); } else { + // TRANS: Fieldset legend. $this->element('legend', null, _m('Twitter account')); $this->elementStart('p', array('id' => 'form_confirmed')); $this->element('a', array('href' => $fuser->uri), $fuser->nickname); $this->elementEnd('p'); $this->element('p', 'form_note', + // TRANS: Form note when a Twitter account has been connected. _m('Connected Twitter account')); $this->elementEnd('fieldset'); $this->elementStart('fieldset'); + // TRANS: Fieldset legend. $this->element('legend', null, _m('Disconnect my account from Twitter')); if (!$user->password) { - $this->elementStart('p', array('class' => 'form_guide')); - // @todo FIXME: Bad i18n (patchwork in three parts). - $this->text(_m('Disconnecting your Twitter ' . - 'could make it impossible to log in! Please ')); - $this->element('a', - array('href' => common_local_url('passwordsettings')), - _m('set a password')); - - $this->text(_m(' first.')); + // TRANS: Form guide. %s is a URL to the password settings. + // TRANS: This message contains a Markdown link in the form [description](link). + $message = sprintf(_m('Disconnecting your Twitter account ' . + 'could make it impossible to log in! Please ' . + '[set a password](%s) first.'), + common_local_url('passwordsettings')); + $message = common_markup_to_html($message); + $this->text($message); $this->elementEnd('p'); } else { - // TRANS: %1$s is the current website name. + // TRANS: Form instructions. %1$s is the StatusNet sitename. $note = _m('Keep your %1$s account but disconnect from Twitter. ' . 'You can use your %1$s password to log in.'); - $site = common_config('site', 'name'); $this->element('p', 'instructions', sprintf($note, $site)); - $this->submit('disconnect', _m('Disconnect')); + // TRANS: Button text for disconnecting a Twitter account. + $this->submit('disconnect', _m('BUTTON','Disconnect')); } $this->elementEnd('fieldset'); $this->elementStart('fieldset', array('id' => 'settings_twitter_preferences')); + // TRANS: Fieldset legend. $this->element('legend', null, _m('Preferences')); $this->elementStart('ul', 'form_data'); $this->elementStart('li'); $this->checkbox('noticesend', + // TRANS: Checkbox label. _m('Automatically send my notices to Twitter.'), ($flink) ? ($flink->noticesync & FOREIGN_NOTICE_SEND) : @@ -164,6 +171,7 @@ class TwittersettingsAction extends ProfileSettingsAction $this->elementEnd('li'); $this->elementStart('li'); $this->checkbox('replysync', + // TRANS: Checkbox label. _m('Send local "@" replies to Twitter.'), ($flink) ? ($flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) : @@ -171,6 +179,7 @@ class TwittersettingsAction extends ProfileSettingsAction $this->elementEnd('li'); $this->elementStart('li'); $this->checkbox('friendsync', + // TRANS: Checkbox label. _m('Subscribe to my Twitter friends here.'), ($flink) ? ($flink->friendsync & FOREIGN_FRIEND_RECV) : @@ -180,6 +189,7 @@ class TwittersettingsAction extends ProfileSettingsAction if (common_config('twitterimport','enabled')) { $this->elementStart('li'); $this->checkbox('noticerecv', + // TRANS: Checkbox label. _m('Import my friends timeline.'), ($flink) ? ($flink->noticesync & FOREIGN_NOTICE_RECV) : @@ -196,9 +206,11 @@ class TwittersettingsAction extends ProfileSettingsAction $this->elementEnd('ul'); if ($flink) { - $this->submit('save', _m('Save')); + // TRANS: Button text for saving Twitter integration settings. + $this->submit('save', _m('BUTTON','Save')); } else { - $this->submit('add', _m('Add')); + // TRANS: Button text for adding Twitter integration. + $this->submit('add', _m('BUTTON','Add')); } $this->elementEnd('fieldset'); @@ -222,6 +234,7 @@ class TwittersettingsAction extends ProfileSettingsAction // CSRF protection $token = $this->trimmed('token'); if (!$token || $token != common_session_token()) { + // TRANS: Client error displayed when the session token does not match or is not given. $this->showForm(_m('There was a problem with your session token. '. 'Try again, please.')); return; @@ -232,6 +245,7 @@ class TwittersettingsAction extends ProfileSettingsAction } else if ($this->arg('disconnect')) { $this->removeTwitterAccount(); } else { + // TRANS: Client error displayed when the submitted form contains unexpected data. $this->showForm(_m('Unexpected form submission.')); } } @@ -247,6 +261,7 @@ class TwittersettingsAction extends ProfileSettingsAction $flink = Foreign_link::getByUserID($user->id, TWITTER_SERVICE); if (empty($flink)) { + // TRANS: Client error displayed when trying to remove a connected Twitter account when there isn't one connected. $this->clientError(_m('No Twitter connection to remove.')); return; } @@ -255,10 +270,12 @@ class TwittersettingsAction extends ProfileSettingsAction if (empty($result)) { common_log_db_error($flink, 'DELETE', __FILE__); - $this->serverError(_m('Couldn\'t remove Twitter user.')); + // TRANS: Server error displayed when trying to remove a connected Twitter account fails. + $this->serverError(_m('Could not remove Twitter user.')); return; } + // TRANS: Success message displayed after disconnecting a Twitter account. $this->showForm(_m('Twitter account disconnected.'), true); } @@ -279,7 +296,9 @@ class TwittersettingsAction extends ProfileSettingsAction if (empty($flink)) { common_log_db_error($flink, 'SELECT', __FILE__); - $this->showForm(_m('Couldn\'t save Twitter preferences.')); + // @todo FIXME: Shouldn't this be a serverError()? + // TRANS: Server error displayed when saving Twitter integration preferences fails. + $this->showForm(_m('Could not save Twitter preferences.')); return; } @@ -290,7 +309,9 @@ class TwittersettingsAction extends ProfileSettingsAction if ($result === false) { common_log_db_error($flink, 'UPDATE', __FILE__); - $this->showForm(_m('Couldn\'t save Twitter preferences.')); + // @todo FIXME: Shouldn't this be a serverError()? + // TRANS: Server error displayed when saving Twitter integration preferences fails. + $this->showForm(_m('Could not save Twitter preferences.')); return; } @@ -298,6 +319,7 @@ class TwittersettingsAction extends ProfileSettingsAction $this->notifyDaemon($flink->foreign_id, $noticerecv); } + // TRANS: Success message after saving Twitter integration preferences. $this->showForm(_m('Twitter preferences saved.'), true); } @@ -306,7 +328,6 @@ class TwittersettingsAction extends ProfileSettingsAction */ function notifyDaemon($twitterUserId, $receiving) { - // todo... should use control signals rather than queues + // @todo... should use control signals rather than queues } - } diff --git a/plugins/TwitterBridge/twitterstreamreader.php b/plugins/TwitterBridge/twitterstreamreader.php index 5b0613bc40..2441b13357 100644 --- a/plugins/TwitterBridge/twitterstreamreader.php +++ b/plugins/TwitterBridge/twitterstreamreader.php @@ -54,7 +54,7 @@ abstract class TwitterStreamReader extends JsonStreamReader * * @param string $url * @param array $params - * @return string + * @return string */ protected function oAuthUrl($url, $params=array()) { @@ -136,7 +136,7 @@ abstract class TwitterStreamReader extends JsonStreamReader /** * Call event handler callbacks for the given event. - * + * * @param string $event * @param mixed $arg1 ... one or more params to pass on */ @@ -208,7 +208,7 @@ class TwitterSiteStream extends TwitterStreamReader { protected $userIds; - public function __construct(TwitterOAuthClient $auth, $baseUrl='http://betastream.twitter.com') + public function __construct(TwitterOAuthClient $auth, $baseUrl='https://sitestream.twitter.com') { parent::__construct($auth, $baseUrl); } diff --git a/plugins/UserFlag/User_flag_profile.php b/plugins/UserFlag/User_flag_profile.php index f4e9844dfc..cdc67cf8e7 100644 --- a/plugins/UserFlag/User_flag_profile.php +++ b/plugins/UserFlag/User_flag_profile.php @@ -157,7 +157,8 @@ class User_flag_profile extends Memcached_DataObject if (!$ufp->insert()) { // TRANS: Server exception. - $msg = sprintf(_m('Couldn\'t flag profile "%d" for review.'), + // TRANS: %d is a profile ID (number). + $msg = sprintf(_m('Could not flag profile "%d" for review.'), $profile_id); throw new ServerException($msg); } diff --git a/plugins/UserFlag/adminprofileflag.php b/plugins/UserFlag/adminprofileflag.php index 1aafa3c1bf..d9e57cfc4b 100644 --- a/plugins/UserFlag/adminprofileflag.php +++ b/plugins/UserFlag/adminprofileflag.php @@ -86,6 +86,7 @@ class AdminprofileflagAction extends Action // User must have the right to review flags if (!$user->hasRight(UserFlagPlugin::REVIEWFLAGS)) { + // TRANS: Error message displayed when trying to review profile flags while not authorised. $this->clientError(_m('You cannot review profile flags.')); return false; } @@ -385,7 +386,7 @@ class FlaggedProfileListItem extends ProfileListItem $flagging_users = implode(', ', $lnks); // TRANS: Message displayed on a profile if it has been flagged. // TRANS: %1$s is a comma separated list of at most 5 user nicknames that flagged. - // TRANS: %2$d is a positive integer of additional flagging users. Also used for the plural. + // TRANS: %2$d is a positive integer of additional flagging users. Also used for plural. $text .= sprintf(_m('Flagged by %1$s and %2$d other', 'Flagged by %1$s and %2$d others', $others), $flagging_users, $others); } else { // TRANS: Message displayed on a profile if it has been flagged. diff --git a/plugins/UserFlag/clearflag.php b/plugins/UserFlag/clearflag.php index feda29f1b7..e5704d6af5 100644 --- a/plugins/UserFlag/clearflag.php +++ b/plugins/UserFlag/clearflag.php @@ -49,7 +49,6 @@ class ClearflagAction extends ProfileFormAction * * @return boolean success flag */ - function prepare($args) { if (!parent::prepare($args)) { @@ -102,7 +101,8 @@ class ClearflagAction extends ProfileFormAction if ($result == false) { // TRANS: Server exception given when flags could not be cleared. - $msg = sprintf(_m('Couldn\'t clear flags for profile "%s".'), + // TRANS: %s is a profile nickname. + $msg = sprintf(_m('Could not clear flags for profile "%s".'), $this->profile->nickname); throw new ServerException($msg); } diff --git a/plugins/UserFlag/clearflagform.php b/plugins/UserFlag/clearflagform.php index 26a8848758..47dd3924c3 100644 --- a/plugins/UserFlag/clearflagform.php +++ b/plugins/UserFlag/clearflagform.php @@ -84,7 +84,7 @@ class ClearFlagForm extends ProfileActionForm function description() { - // Form description for clearing flags from a profile. + // TRANS: Form description for clearing flags from a profile. return _m('Clear all flags'); } } diff --git a/plugins/UserFlag/locale/UserFlag.pot b/plugins/UserFlag/locale/UserFlag.pot index 638ab36e5c..70c8ba1191 100644 --- a/plugins/UserFlag/locale/UserFlag.pot +++ b/plugins/UserFlag/locale/UserFlag.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -50,6 +50,7 @@ msgstr "" msgid "Clear" msgstr "" +#. TRANS: Form description for clearing flags from a profile. #: clearflagform.php:88 msgid "Clear all flags" msgstr "" @@ -59,24 +60,25 @@ msgstr "" msgid "Not logged in." msgstr "" -#: adminprofileflag.php:89 +#. TRANS: Error message displayed when trying to review profile flags while not authorised. +#: adminprofileflag.php:90 msgid "You cannot review profile flags." msgstr "" #. TRANS: Title for page with a list of profiles that were flagged for review. -#: adminprofileflag.php:126 +#: adminprofileflag.php:127 msgid "Flagged profiles" msgstr "" #. TRANS: Header for moderation menu with action buttons for flagged profiles (like 'sandbox', 'silence', ...). -#: adminprofileflag.php:243 +#: adminprofileflag.php:244 msgid "Moderate" msgstr "" #. TRANS: Message displayed on a profile if it has been flagged. #. TRANS: %1$s is a comma separated list of at most 5 user nicknames that flagged. -#. TRANS: %2$d is a positive integer of additional flagging users. Also used for the plural. -#: adminprofileflag.php:389 +#. TRANS: %2$d is a positive integer of additional flagging users. Also used for plural. +#: adminprofileflag.php:390 #, php-format msgid "Flagged by %1$s and %2$d other" msgid_plural "Flagged by %1$s and %2$d others" @@ -85,15 +87,16 @@ msgstr[1] "" #. TRANS: Message displayed on a profile if it has been flagged. #. TRANS: %s is a comma separated list of at most 5 user nicknames that flagged. -#: adminprofileflag.php:393 +#: adminprofileflag.php:394 #, php-format msgid "Flagged by %s" msgstr "" #. TRANS: Server exception given when flags could not be cleared. +#. TRANS: %s is a profile nickname. #: clearflag.php:105 #, php-format -msgid "Couldn't clear flags for profile \"%s\"." +msgid "Could not clear flags for profile \"%s\"." msgstr "" #. TRANS: Title for AJAX form to indicated that flags were removed. @@ -107,7 +110,8 @@ msgid "Cleared" msgstr "" #. TRANS: Server exception. -#: User_flag_profile.php:160 +#. TRANS: %d is a profile ID (number). +#: User_flag_profile.php:161 #, php-format -msgid "Couldn't flag profile \"%d\" for review." +msgid "Could not flag profile \"%d\" for review." msgstr "" diff --git a/plugins/UserFlag/locale/ar/LC_MESSAGES/UserFlag.po b/plugins/UserFlag/locale/ar/LC_MESSAGES/UserFlag.po new file mode 100644 index 0000000000..3e43114ad0 --- /dev/null +++ b/plugins/UserFlag/locale/ar/LC_MESSAGES/UserFlag.po @@ -0,0 +1,110 @@ +# Translation of StatusNet - UserFlag to Arabic (العربية) +# Exported from translatewiki.net +# +# Author: OsamaK +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - UserFlag\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:23+0000\n" +"Language-Team: Arabic \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:51:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: ar\n" +"X-Message-Group: #out-statusnet-plugin-userflag\n" +"Plural-Forms: nplurals=6; plural=(n == 0) ? 0 : ( (n == 1) ? 1 : ( (n == " +"2) ? 2 : ( (n%100 >= 3 && n%100 <= 10) ? 3 : ( (n%100 >= 11 && n%100 <= " +"99) ? 4 : 5 ) ) ) );\n" + +#. TRANS: AJAX form title for a flagged profile. +msgid "Flagged for review" +msgstr "عÙلّم للمراجعة" + +#. TRANS: Body text for AJAX form when a profile has been flagged for review. +#. TRANS: Message added to a profile if it has been flagged for review. +msgid "Flagged" +msgstr "عÙلّم" + +#. TRANS: Plugin description. +msgid "" +"This plugin allows flagging of profiles for review and reviewing flagged " +"profiles." +msgstr "" + +#. TRANS: Form title for flagging a profile for review. +msgid "Flag" +msgstr "علّم" + +#. TRANS: Form description. +msgid "Flag profile for review." +msgstr "" + +#. TRANS: Form title for action on a profile. +msgid "Clear" +msgstr "امسح" + +#. TRANS: Form description for clearing flags from a profile. +msgid "Clear all flags" +msgstr "امسح كل الأعلام" + +#. TRANS: Error message displayed when trying to perform an action that requires a logged in user. +msgid "Not logged in." +msgstr "لست والجًا." + +#. TRANS: Error message displayed when trying to review profile flags while not authorised. +msgid "You cannot review profile flags." +msgstr "" + +#. TRANS: Title for page with a list of profiles that were flagged for review. +msgid "Flagged profiles" +msgstr "الملÙات الشخصية المعلمة" + +#. TRANS: Header for moderation menu with action buttons for flagged profiles (like 'sandbox', 'silence', ...). +msgid "Moderate" +msgstr "راقب" + +#. TRANS: Message displayed on a profile if it has been flagged. +#. TRANS: %1$s is a comma separated list of at most 5 user nicknames that flagged. +#. TRANS: %2$d is a positive integer of additional flagging users. Also used for plural. +#, php-format +msgid "Flagged by %1$s and %2$d other" +msgid_plural "Flagged by %1$s and %2$d others" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#. TRANS: Message displayed on a profile if it has been flagged. +#. TRANS: %s is a comma separated list of at most 5 user nicknames that flagged. +#, php-format +msgid "Flagged by %s" +msgstr "" + +#. TRANS: Server exception given when flags could not be cleared. +#. TRANS: %s is a profile nickname. +#, php-format +msgid "Could not clear flags for profile \"%s\"." +msgstr "" + +#. TRANS: Title for AJAX form to indicated that flags were removed. +msgid "Flags cleared" +msgstr "" + +#. TRANS: Body element for "flags cleared" form. +msgid "Cleared" +msgstr "" + +#. TRANS: Server exception. +#. TRANS: %d is a profile ID (number). +#, php-format +msgid "Could not flag profile \"%d\" for review." +msgstr "" diff --git a/plugins/UserFlag/locale/ca/LC_MESSAGES/UserFlag.po b/plugins/UserFlag/locale/ca/LC_MESSAGES/UserFlag.po index aed7fcb23e..52d02f74c9 100644 --- a/plugins/UserFlag/locale/ca/LC_MESSAGES/UserFlag.po +++ b/plugins/UserFlag/locale/ca/LC_MESSAGES/UserFlag.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - UserFlag to Catalan (Català) +# Translation of StatusNet - UserFlag to Catalan (català) # Exported from translatewiki.net # # Author: Toniher @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserFlag\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:48+0000\n" -"Language-Team: Catalan \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:23+0000\n" +"Language-Team: Catalan \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ca\n" "X-Message-Group: #out-statusnet-plugin-userflag\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -50,15 +50,17 @@ msgstr "Senyala el perfil per revisar." msgid "Clear" msgstr "Esborra" +#. TRANS: Form description for clearing flags from a profile. msgid "Clear all flags" msgstr "Esborra tots els senyals" #. TRANS: Error message displayed when trying to perform an action that requires a logged in user. msgid "Not logged in." -msgstr "" +msgstr "No s'ha iniciat una sessió." +#. TRANS: Error message displayed when trying to review profile flags while not authorised. msgid "You cannot review profile flags." -msgstr "" +msgstr "No podeu revisar els senyals del perfil." #. TRANS: Title for page with a list of profiles that were flagged for review. msgid "Flagged profiles" @@ -70,7 +72,7 @@ msgstr "Modera" #. TRANS: Message displayed on a profile if it has been flagged. #. TRANS: %1$s is a comma separated list of at most 5 user nicknames that flagged. -#. TRANS: %2$d is a positive integer of additional flagging users. Also used for the plural. +#. TRANS: %2$d is a positive integer of additional flagging users. Also used for plural. #, php-format msgid "Flagged by %1$s and %2$d other" msgid_plural "Flagged by %1$s and %2$d others" @@ -84,8 +86,9 @@ msgid "Flagged by %s" msgstr "Senyalat per %s" #. TRANS: Server exception given when flags could not be cleared. +#. TRANS: %s is a profile nickname. #, php-format -msgid "Couldn't clear flags for profile \"%s\"." +msgid "Could not clear flags for profile \"%s\"." msgstr "No s'han pogut esborrar els senyals del perfil «%s»." #. TRANS: Title for AJAX form to indicated that flags were removed. @@ -97,6 +100,7 @@ msgid "Cleared" msgstr "S'ha esborrat" #. TRANS: Server exception. +#. TRANS: %d is a profile ID (number). #, php-format -msgid "Couldn't flag profile \"%d\" for review." -msgstr "No s'ha pogut senyalar el perfil «%d» per revisar." +msgid "Could not flag profile \"%d\" for review." +msgstr "No s'ha pogut senyalar el perfil «%d» per a una revisió." diff --git a/plugins/UserFlag/locale/de/LC_MESSAGES/UserFlag.po b/plugins/UserFlag/locale/de/LC_MESSAGES/UserFlag.po index 3fd953bc4f..ad8905ebdd 100644 --- a/plugins/UserFlag/locale/de/LC_MESSAGES/UserFlag.po +++ b/plugins/UserFlag/locale/de/LC_MESSAGES/UserFlag.po @@ -1,6 +1,7 @@ # Translation of StatusNet - UserFlag to German (Deutsch) # Exported from translatewiki.net # +# Author: ChrisiPK # Author: Giftpflanze # Author: Habi # -- @@ -10,14 +11,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserFlag\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:48+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:23+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-userflag\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -51,6 +52,7 @@ msgstr "Profil zur Ãœberprüfung markieren." msgid "Clear" msgstr "Löschen" +#. TRANS: Form description for clearing flags from a profile. msgid "Clear all flags" msgstr "Alle Markierungen löschen" @@ -58,6 +60,7 @@ msgstr "Alle Markierungen löschen" msgid "Not logged in." msgstr "Nicht angemeldet." +#. TRANS: Error message displayed when trying to review profile flags while not authorised. msgid "You cannot review profile flags." msgstr "Du kannst die Profilflags nicht überprüfen." @@ -71,7 +74,7 @@ msgstr "Moderieren" #. TRANS: Message displayed on a profile if it has been flagged. #. TRANS: %1$s is a comma separated list of at most 5 user nicknames that flagged. -#. TRANS: %2$d is a positive integer of additional flagging users. Also used for the plural. +#. TRANS: %2$d is a positive integer of additional flagging users. Also used for plural. #, php-format msgid "Flagged by %1$s and %2$d other" msgid_plural "Flagged by %1$s and %2$d others" @@ -85,9 +88,10 @@ msgid "Flagged by %s" msgstr "Durch %s markiert" #. TRANS: Server exception given when flags could not be cleared. +#. TRANS: %s is a profile nickname. #, php-format -msgid "Couldn't clear flags for profile \"%s\"." -msgstr "Konnte Markierung für Profil \"%s\" nicht entfernen." +msgid "Could not clear flags for profile \"%s\"." +msgstr "Konnte Markierungen für Profil „%s“ nicht entfernen." #. TRANS: Title for AJAX form to indicated that flags were removed. msgid "Flags cleared" @@ -98,6 +102,7 @@ msgid "Cleared" msgstr "Gelöscht" #. TRANS: Server exception. +#. TRANS: %d is a profile ID (number). #, php-format -msgid "Couldn't flag profile \"%d\" for review." -msgstr "Konnte Profil „%d“ nicht zur Ãœberprüfung flaggen." +msgid "Could not flag profile \"%d\" for review." +msgstr "Konnte Profil „%d“ nicht zur Ãœberprüfung markieren." diff --git a/plugins/UserFlag/locale/diq/LC_MESSAGES/UserFlag.po b/plugins/UserFlag/locale/diq/LC_MESSAGES/UserFlag.po new file mode 100644 index 0000000000..8d433e5ee5 --- /dev/null +++ b/plugins/UserFlag/locale/diq/LC_MESSAGES/UserFlag.po @@ -0,0 +1,101 @@ +# Translation of StatusNet - UserFlag to Zazaki (Zazaki) +# Exported from translatewiki.net +# +# Author: Erdemaslancan +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - UserFlag\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:23+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:51:36+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: AJAX form title for a flagged profile. +msgid "Flagged for review" +msgstr "" + +#. TRANS: Body text for AJAX form when a profile has been flagged for review. +#. TRANS: Message added to a profile if it has been flagged for review. +msgid "Flagged" +msgstr "Desmale" + +#. TRANS: Plugin description. +msgid "" +"This plugin allows flagging of profiles for review and reviewing flagged " +"profiles." +msgstr "" + +#. TRANS: Form title for flagging a profile for review. +msgid "Flag" +msgstr "Desmal" + +#. TRANS: Form description. +msgid "Flag profile for review." +msgstr "" + +#. TRANS: Form title for action on a profile. +msgid "Clear" +msgstr "estern" + +#. TRANS: Form description for clearing flags from a profile. +msgid "Clear all flags" +msgstr "" + +#. TRANS: Error message displayed when trying to perform an action that requires a logged in user. +msgid "Not logged in." +msgstr "" + +#. TRANS: Error message displayed when trying to review profile flags while not authorised. +msgid "You cannot review profile flags." +msgstr "" + +#. TRANS: Title for page with a list of profiles that were flagged for review. +msgid "Flagged profiles" +msgstr "" + +#. TRANS: Header for moderation menu with action buttons for flagged profiles (like 'sandbox', 'silence', ...). +msgid "Moderate" +msgstr "Modere" + +#. TRANS: Message displayed on a profile if it has been flagged. +#. TRANS: %1$s is a comma separated list of at most 5 user nicknames that flagged. +#. TRANS: %2$d is a positive integer of additional flagging users. Also used for plural. +#, php-format +msgid "Flagged by %1$s and %2$d other" +msgid_plural "Flagged by %1$s and %2$d others" +msgstr[0] "" +msgstr[1] "" + +#. TRANS: Message displayed on a profile if it has been flagged. +#. TRANS: %s is a comma separated list of at most 5 user nicknames that flagged. +#, php-format +msgid "Flagged by %s" +msgstr "Desmala %s" + +#. TRANS: Server exception given when flags could not be cleared. +#. TRANS: %s is a profile nickname. +#, php-format +msgid "Could not clear flags for profile \"%s\"." +msgstr "" + +#. TRANS: Title for AJAX form to indicated that flags were removed. +msgid "Flags cleared" +msgstr "Desmala estere ke" + +#. TRANS: Body element for "flags cleared" form. +msgid "Cleared" +msgstr "" + +#. TRANS: Server exception. +#. TRANS: %d is a profile ID (number). +#, php-format +msgid "Could not flag profile \"%d\" for review." +msgstr "" diff --git a/plugins/UserFlag/locale/es/LC_MESSAGES/UserFlag.po b/plugins/UserFlag/locale/es/LC_MESSAGES/UserFlag.po new file mode 100644 index 0000000000..cc2575c0df --- /dev/null +++ b/plugins/UserFlag/locale/es/LC_MESSAGES/UserFlag.po @@ -0,0 +1,103 @@ +# Translation of StatusNet - UserFlag to Spanish (español) +# Exported from translatewiki.net +# +# Author: Armando-Martin +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - UserFlag\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:23+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:51:36+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: AJAX form title for a flagged profile. +msgid "Flagged for review" +msgstr "Marcado para revisión" + +#. TRANS: Body text for AJAX form when a profile has been flagged for review. +#. TRANS: Message added to a profile if it has been flagged for review. +msgid "Flagged" +msgstr "Marcado" + +#. TRANS: Plugin description. +msgid "" +"This plugin allows flagging of profiles for review and reviewing flagged " +"profiles." +msgstr "" +"Este complemento (plugin) permite marcar perfiles para revisión y revisar " +"los perfiles marcados." + +#. TRANS: Form title for flagging a profile for review. +msgid "Flag" +msgstr "Marcar" + +#. TRANS: Form description. +msgid "Flag profile for review." +msgstr "Marcar el perfil para revisión." + +#. TRANS: Form title for action on a profile. +msgid "Clear" +msgstr "Borrar" + +#. TRANS: Form description for clearing flags from a profile. +msgid "Clear all flags" +msgstr "Borrar todas las marcas" + +#. TRANS: Error message displayed when trying to perform an action that requires a logged in user. +msgid "Not logged in." +msgstr "No ha iniciado sesión" + +#. TRANS: Error message displayed when trying to review profile flags while not authorised. +msgid "You cannot review profile flags." +msgstr "No puede revisar las marcas de perfil." + +#. TRANS: Title for page with a list of profiles that were flagged for review. +msgid "Flagged profiles" +msgstr "Perfiles marcados" + +#. TRANS: Header for moderation menu with action buttons for flagged profiles (like 'sandbox', 'silence', ...). +msgid "Moderate" +msgstr "Moderado" + +#. TRANS: Message displayed on a profile if it has been flagged. +#. TRANS: %1$s is a comma separated list of at most 5 user nicknames that flagged. +#. TRANS: %2$d is a positive integer of additional flagging users. Also used for plural. +#, php-format +msgid "Flagged by %1$s and %2$d other" +msgid_plural "Flagged by %1$s and %2$d others" +msgstr[0] "Marcado por %1$s y otro" +msgstr[1] "Marcado por %1$s y otros %2$d más" + +#. TRANS: Message displayed on a profile if it has been flagged. +#. TRANS: %s is a comma separated list of at most 5 user nicknames that flagged. +#, php-format +msgid "Flagged by %s" +msgstr "Marcado por %s" + +#. TRANS: Server exception given when flags could not be cleared. +#. TRANS: %s is a profile nickname. +#, php-format +msgid "Could not clear flags for profile \"%s\"." +msgstr "No pueden borrar las marcas del perfil \"%s\"." + +#. TRANS: Title for AJAX form to indicated that flags were removed. +msgid "Flags cleared" +msgstr "Marcas borradas" + +#. TRANS: Body element for "flags cleared" form. +msgid "Cleared" +msgstr "Borrado" + +#. TRANS: Server exception. +#. TRANS: %d is a profile ID (number). +#, php-format +msgid "Could not flag profile \"%d\" for review." +msgstr "No pudo marcar el perfil \"%d\" para su revisión." diff --git a/plugins/UserFlag/locale/eu/LC_MESSAGES/UserFlag.po b/plugins/UserFlag/locale/eu/LC_MESSAGES/UserFlag.po new file mode 100644 index 0000000000..58f2ea84af --- /dev/null +++ b/plugins/UserFlag/locale/eu/LC_MESSAGES/UserFlag.po @@ -0,0 +1,101 @@ +# Translation of StatusNet - UserFlag to Basque (euskara) +# Exported from translatewiki.net +# +# Author: Artsuaga +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - UserFlag\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:23+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:51:36+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: AJAX form title for a flagged profile. +msgid "Flagged for review" +msgstr "Azterketarako markatua" + +#. TRANS: Body text for AJAX form when a profile has been flagged for review. +#. TRANS: Message added to a profile if it has been flagged for review. +msgid "Flagged" +msgstr "" + +#. TRANS: Plugin description. +msgid "" +"This plugin allows flagging of profiles for review and reviewing flagged " +"profiles." +msgstr "" + +#. TRANS: Form title for flagging a profile for review. +msgid "Flag" +msgstr "" + +#. TRANS: Form description. +msgid "Flag profile for review." +msgstr "Markatu profila aztertzeko." + +#. TRANS: Form title for action on a profile. +msgid "Clear" +msgstr "Garbitu" + +#. TRANS: Form description for clearing flags from a profile. +msgid "Clear all flags" +msgstr "Marka guztiak garbitu" + +#. TRANS: Error message displayed when trying to perform an action that requires a logged in user. +msgid "Not logged in." +msgstr "Saioa hasi gabe." + +#. TRANS: Error message displayed when trying to review profile flags while not authorised. +msgid "You cannot review profile flags." +msgstr "" + +#. TRANS: Title for page with a list of profiles that were flagged for review. +msgid "Flagged profiles" +msgstr "Markatutako profilak" + +#. TRANS: Header for moderation menu with action buttons for flagged profiles (like 'sandbox', 'silence', ...). +msgid "Moderate" +msgstr "Moderatu" + +#. TRANS: Message displayed on a profile if it has been flagged. +#. TRANS: %1$s is a comma separated list of at most 5 user nicknames that flagged. +#. TRANS: %2$d is a positive integer of additional flagging users. Also used for plural. +#, php-format +msgid "Flagged by %1$s and %2$d other" +msgid_plural "Flagged by %1$s and %2$d others" +msgstr[0] "%1$s and %2$dek markatua" +msgstr[1] "%1$s and %2$d(e)k markatua" + +#. TRANS: Message displayed on a profile if it has been flagged. +#. TRANS: %s is a comma separated list of at most 5 user nicknames that flagged. +#, php-format +msgid "Flagged by %s" +msgstr "%s(e)k markatua" + +#. TRANS: Server exception given when flags could not be cleared. +#. TRANS: %s is a profile nickname. +#, php-format +msgid "Could not clear flags for profile \"%s\"." +msgstr "\"%s\" profilarentzako ezin izan dira markak garbitu." + +#. TRANS: Title for AJAX form to indicated that flags were removed. +msgid "Flags cleared" +msgstr "" + +#. TRANS: Body element for "flags cleared" form. +msgid "Cleared" +msgstr "" + +#. TRANS: Server exception. +#. TRANS: %d is a profile ID (number). +#, fuzzy, php-format +msgid "Could not flag profile \"%d\" for review." +msgstr "\"%s\" profila ezin izan da azterketarako markatu." diff --git a/plugins/UserFlag/locale/fr/LC_MESSAGES/UserFlag.po b/plugins/UserFlag/locale/fr/LC_MESSAGES/UserFlag.po index 7080693d1b..010e189764 100644 --- a/plugins/UserFlag/locale/fr/LC_MESSAGES/UserFlag.po +++ b/plugins/UserFlag/locale/fr/LC_MESSAGES/UserFlag.po @@ -1,7 +1,8 @@ -# Translation of StatusNet - UserFlag to French (Français) +# Translation of StatusNet - UserFlag to French (français) # Exported from translatewiki.net # # Author: Peter17 +# Author: Tititou36 # -- # This file is distributed under the same license as the StatusNet package. # @@ -9,14 +10,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserFlag\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:48+0000\n" -"Language-Team: French \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:23+0000\n" +"Language-Team: French \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-userflag\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" @@ -50,6 +51,7 @@ msgstr "Marquer le profil pour vérification." msgid "Clear" msgstr "Effacer" +#. TRANS: Form description for clearing flags from a profile. msgid "Clear all flags" msgstr "Effacer tous les marquages" @@ -57,6 +59,7 @@ msgstr "Effacer tous les marquages" msgid "Not logged in." msgstr "Non connecté." +#. TRANS: Error message displayed when trying to review profile flags while not authorised. msgid "You cannot review profile flags." msgstr "Vous ne pouvez pas examiner les drapeaux de profil." @@ -70,7 +73,7 @@ msgstr "Modérer" #. TRANS: Message displayed on a profile if it has been flagged. #. TRANS: %1$s is a comma separated list of at most 5 user nicknames that flagged. -#. TRANS: %2$d is a positive integer of additional flagging users. Also used for the plural. +#. TRANS: %2$d is a positive integer of additional flagging users. Also used for plural. #, php-format msgid "Flagged by %1$s and %2$d other" msgid_plural "Flagged by %1$s and %2$d others" @@ -84,8 +87,9 @@ msgid "Flagged by %s" msgstr "Marqué par %s" #. TRANS: Server exception given when flags could not be cleared. +#. TRANS: %s is a profile nickname. #, php-format -msgid "Couldn't clear flags for profile \"%s\"." +msgid "Could not clear flags for profile \"%s\"." msgstr "Impossible de supprimer les marquages pour le profil « %s »." #. TRANS: Title for AJAX form to indicated that flags were removed. @@ -97,6 +101,7 @@ msgid "Cleared" msgstr "Effacé" #. TRANS: Server exception. +#. TRANS: %d is a profile ID (number). #, php-format -msgid "Couldn't flag profile \"%d\" for review." +msgid "Could not flag profile \"%d\" for review." msgstr "Impossible de marquer le profil « %d » pour vérification." diff --git a/plugins/UserFlag/locale/gl/LC_MESSAGES/UserFlag.po b/plugins/UserFlag/locale/gl/LC_MESSAGES/UserFlag.po new file mode 100644 index 0000000000..04d211a7e5 --- /dev/null +++ b/plugins/UserFlag/locale/gl/LC_MESSAGES/UserFlag.po @@ -0,0 +1,106 @@ +# Translation of StatusNet - UserFlag to Galician (galego) +# Exported from translatewiki.net +# +# Author: Toliño +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - UserFlag\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:24+0000\n" +"Language-Team: Galician \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:51:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: gl\n" +"X-Message-Group: #out-statusnet-plugin-userflag\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: AJAX form title for a flagged profile. +msgid "Flagged for review" +msgstr "Marcado para revisión" + +#. TRANS: Body text for AJAX form when a profile has been flagged for review. +#. TRANS: Message added to a profile if it has been flagged for review. +msgid "Flagged" +msgstr "Marcado" + +#. TRANS: Plugin description. +msgid "" +"This plugin allows flagging of profiles for review and reviewing flagged " +"profiles." +msgstr "" +"Este complemento permite marcar perfís para revisión e revisar perfís " +"marcados." + +#. TRANS: Form title for flagging a profile for review. +msgid "Flag" +msgstr "Marcar" + +#. TRANS: Form description. +msgid "Flag profile for review." +msgstr "Marcar o perfil para revisión." + +#. TRANS: Form title for action on a profile. +msgid "Clear" +msgstr "Limpar" + +#. TRANS: Form description for clearing flags from a profile. +msgid "Clear all flags" +msgstr "Limpar todas as marcas" + +#. TRANS: Error message displayed when trying to perform an action that requires a logged in user. +msgid "Not logged in." +msgstr "Non iniciou sesión." + +#. TRANS: Error message displayed when trying to review profile flags while not authorised. +msgid "You cannot review profile flags." +msgstr "Non pode revisar marcas de perfíl." + +#. TRANS: Title for page with a list of profiles that were flagged for review. +msgid "Flagged profiles" +msgstr "Perfís marcados" + +#. TRANS: Header for moderation menu with action buttons for flagged profiles (like 'sandbox', 'silence', ...). +msgid "Moderate" +msgstr "Moderar" + +#. TRANS: Message displayed on a profile if it has been flagged. +#. TRANS: %1$s is a comma separated list of at most 5 user nicknames that flagged. +#. TRANS: %2$d is a positive integer of additional flagging users. Also used for plural. +#, php-format +msgid "Flagged by %1$s and %2$d other" +msgid_plural "Flagged by %1$s and %2$d others" +msgstr[0] "Marcado por %1$s e outro" +msgstr[1] "Marado por %1$s e %2$d máis" + +#. TRANS: Message displayed on a profile if it has been flagged. +#. TRANS: %s is a comma separated list of at most 5 user nicknames that flagged. +#, php-format +msgid "Flagged by %s" +msgstr "Marcado por %s" + +#. TRANS: Server exception given when flags could not be cleared. +#. TRANS: %s is a profile nickname. +#, php-format +msgid "Could not clear flags for profile \"%s\"." +msgstr "Non se puideron limpar as marcas do perfil \"%s\"." + +#. TRANS: Title for AJAX form to indicated that flags were removed. +msgid "Flags cleared" +msgstr "Marcas limpadas" + +#. TRANS: Body element for "flags cleared" form. +msgid "Cleared" +msgstr "Limpado" + +#. TRANS: Server exception. +#. TRANS: %d is a profile ID (number). +#, php-format +msgid "Could not flag profile \"%d\" for review." +msgstr "Non se puido marcar o perfil \"%d\" para revisión." diff --git a/plugins/UserFlag/locale/ia/LC_MESSAGES/UserFlag.po b/plugins/UserFlag/locale/ia/LC_MESSAGES/UserFlag.po index 56b196e32f..e53199301f 100644 --- a/plugins/UserFlag/locale/ia/LC_MESSAGES/UserFlag.po +++ b/plugins/UserFlag/locale/ia/LC_MESSAGES/UserFlag.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - UserFlag to Interlingua (Interlingua) +# Translation of StatusNet - UserFlag to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,59 +9,62 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserFlag\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:48+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:24+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-userflag\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. TRANS: AJAX form title for a flagged profile. msgid "Flagged for review" -msgstr "Marcate pro revision" +msgstr "Signalate pro inspection" #. TRANS: Body text for AJAX form when a profile has been flagged for review. #. TRANS: Message added to a profile if it has been flagged for review. msgid "Flagged" -msgstr "Marcate" +msgstr "Signalate" #. TRANS: Plugin description. msgid "" "This plugin allows flagging of profiles for review and reviewing flagged " "profiles." msgstr "" -"Iste plugin permitte marcar profilos pro revision e revider profilos marcate." +"Iste plug-in permitte signalar profilos pro inspection e inspectar profilos " +"signalate." #. TRANS: Form title for flagging a profile for review. msgid "Flag" -msgstr "Rader tote le marcas" +msgstr "Signalar" #. TRANS: Form description. msgid "Flag profile for review." -msgstr "Marcar profilo pro revision." +msgstr "Signalar profilo pro inspection." #. TRANS: Form title for action on a profile. msgid "Clear" msgstr "Rader" +#. TRANS: Form description for clearing flags from a profile. msgid "Clear all flags" -msgstr "Rader tote le marcas" +msgstr "Rader tote le signalamentos" #. TRANS: Error message displayed when trying to perform an action that requires a logged in user. msgid "Not logged in." msgstr "Tu non ha aperite un session." +#. TRANS: Error message displayed when trying to review profile flags while not authorised. msgid "You cannot review profile flags." -msgstr "Tu non pote revider marcationes de profilo." +msgstr "Tu non pote inspectar profilos signalate." #. TRANS: Title for page with a list of profiles that were flagged for review. msgid "Flagged profiles" -msgstr "Profilos marcate" +msgstr "Profilos signalate" #. TRANS: Header for moderation menu with action buttons for flagged profiles (like 'sandbox', 'silence', ...). msgid "Moderate" @@ -69,33 +72,35 @@ msgstr "Moderar" #. TRANS: Message displayed on a profile if it has been flagged. #. TRANS: %1$s is a comma separated list of at most 5 user nicknames that flagged. -#. TRANS: %2$d is a positive integer of additional flagging users. Also used for the plural. +#. TRANS: %2$d is a positive integer of additional flagging users. Also used for plural. #, php-format msgid "Flagged by %1$s and %2$d other" msgid_plural "Flagged by %1$s and %2$d others" -msgstr[0] "Marcate per %1$s e %2$d altere" -msgstr[1] "Marcate per %1$s e %2$d alteres" +msgstr[0] "Signalate per %1$s e %2$d altere" +msgstr[1] "Signalate per %1$s e %2$d alteres" #. TRANS: Message displayed on a profile if it has been flagged. #. TRANS: %s is a comma separated list of at most 5 user nicknames that flagged. #, php-format msgid "Flagged by %s" -msgstr "Marcate per %s" +msgstr "Signalate per %s" #. TRANS: Server exception given when flags could not be cleared. +#. TRANS: %s is a profile nickname. #, php-format -msgid "Couldn't clear flags for profile \"%s\"." -msgstr "Non poteva rader marcas pro profilo \"%s\"." +msgid "Could not clear flags for profile \"%s\"." +msgstr "Non poteva rader signalamentos pro le profilo \"%s\"." #. TRANS: Title for AJAX form to indicated that flags were removed. msgid "Flags cleared" -msgstr "Marcas radite" +msgstr "Signalamentos radite" #. TRANS: Body element for "flags cleared" form. msgid "Cleared" msgstr "Radite" #. TRANS: Server exception. +#. TRANS: %d is a profile ID (number). #, php-format -msgid "Couldn't flag profile \"%d\" for review." -msgstr "Non poteva marcar profilo \"%d\" pro revision." +msgid "Could not flag profile \"%d\" for review." +msgstr "Non poteva signalar le profilo \"%d\" pro inspection." diff --git a/plugins/UserFlag/locale/mk/LC_MESSAGES/UserFlag.po b/plugins/UserFlag/locale/mk/LC_MESSAGES/UserFlag.po index 1811f2736c..18456fadc8 100644 --- a/plugins/UserFlag/locale/mk/LC_MESSAGES/UserFlag.po +++ b/plugins/UserFlag/locale/mk/LC_MESSAGES/UserFlag.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - UserFlag to Macedonian (МакедонÑки) +# Translation of StatusNet - UserFlag to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserFlag\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:48+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:24+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-userflag\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" @@ -48,8 +48,9 @@ msgstr "Означи профил за преглед." #. TRANS: Form title for action on a profile. msgid "Clear" -msgstr "ОтÑтрани" +msgstr "ИÑчиÑти" +#. TRANS: Form description for clearing flags from a profile. msgid "Clear all flags" msgstr "ОтÑтрани ги Ñите ознаки" @@ -57,6 +58,7 @@ msgstr "ОтÑтрани ги Ñите ознаки" msgid "Not logged in." msgstr "Ðе Ñте најавени." +#. TRANS: Error message displayed when trying to review profile flags while not authorised. msgid "You cannot review profile flags." msgstr "Ðе можете да прегледувате профилни знаменца." @@ -70,7 +72,7 @@ msgstr "Модерирај" #. TRANS: Message displayed on a profile if it has been flagged. #. TRANS: %1$s is a comma separated list of at most 5 user nicknames that flagged. -#. TRANS: %2$d is a positive integer of additional flagging users. Also used for the plural. +#. TRANS: %2$d is a positive integer of additional flagging users. Also used for plural. #, php-format msgid "Flagged by %1$s and %2$d other" msgid_plural "Flagged by %1$s and %2$d others" @@ -84,8 +86,9 @@ msgid "Flagged by %s" msgstr "Означено од %s" #. TRANS: Server exception given when flags could not be cleared. +#. TRANS: %s is a profile nickname. #, php-format -msgid "Couldn't clear flags for profile \"%s\"." +msgid "Could not clear flags for profile \"%s\"." msgstr "Ðе можев да ги отÑтранам ознаките за профилот „%s“." #. TRANS: Title for AJAX form to indicated that flags were removed. @@ -97,6 +100,7 @@ msgid "Cleared" msgstr "ОтÑтрането" #. TRANS: Server exception. +#. TRANS: %d is a profile ID (number). #, php-format -msgid "Couldn't flag profile \"%d\" for review." +msgid "Could not flag profile \"%d\" for review." msgstr "Ðе можев да го означам профилот „%d“ за преглед." diff --git a/plugins/UserFlag/locale/nl/LC_MESSAGES/UserFlag.po b/plugins/UserFlag/locale/nl/LC_MESSAGES/UserFlag.po index da15b71656..8329cdf4c8 100644 --- a/plugins/UserFlag/locale/nl/LC_MESSAGES/UserFlag.po +++ b/plugins/UserFlag/locale/nl/LC_MESSAGES/UserFlag.po @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserFlag\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:48+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:24+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-userflag\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -50,6 +50,7 @@ msgstr "Profiel voor controle markeren" msgid "Clear" msgstr "Wissen" +#. TRANS: Form description for clearing flags from a profile. msgid "Clear all flags" msgstr "Alle markeringen wissen" @@ -57,6 +58,7 @@ msgstr "Alle markeringen wissen" msgid "Not logged in." msgstr "Niet aangemeld." +#. TRANS: Error message displayed when trying to review profile flags while not authorised. msgid "You cannot review profile flags." msgstr "U kunt gemarkeerde profielen niet controleren." @@ -70,7 +72,7 @@ msgstr "Modereren" #. TRANS: Message displayed on a profile if it has been flagged. #. TRANS: %1$s is a comma separated list of at most 5 user nicknames that flagged. -#. TRANS: %2$d is a positive integer of additional flagging users. Also used for the plural. +#. TRANS: %2$d is a positive integer of additional flagging users. Also used for plural. #, php-format msgid "Flagged by %1$s and %2$d other" msgid_plural "Flagged by %1$s and %2$d others" @@ -84,8 +86,9 @@ msgid "Flagged by %s" msgstr "Gemarkeerd door %s" #. TRANS: Server exception given when flags could not be cleared. +#. TRANS: %s is a profile nickname. #, php-format -msgid "Couldn't clear flags for profile \"%s\"." +msgid "Could not clear flags for profile \"%s\"." msgstr "" "Het was niet mogelijk de markeringen van het profiel \"%s\" te verwijderen." @@ -98,6 +101,7 @@ msgid "Cleared" msgstr "Verwijderd" #. TRANS: Server exception. +#. TRANS: %d is a profile ID (number). #, php-format -msgid "Couldn't flag profile \"%d\" for review." +msgid "Could not flag profile \"%d\" for review." msgstr "Het was niet mogelijk het profiel \"%d\" voor controle te markeren." diff --git a/plugins/UserFlag/locale/pt/LC_MESSAGES/UserFlag.po b/plugins/UserFlag/locale/pt/LC_MESSAGES/UserFlag.po index 396126a836..525f03960c 100644 --- a/plugins/UserFlag/locale/pt/LC_MESSAGES/UserFlag.po +++ b/plugins/UserFlag/locale/pt/LC_MESSAGES/UserFlag.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - UserFlag to Portuguese (Português) +# Translation of StatusNet - UserFlag to Portuguese (português) # Exported from translatewiki.net # # Author: GTNS @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserFlag\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:48+0000\n" -"Language-Team: Portuguese \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:24+0000\n" +"Language-Team: Portuguese \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: pt\n" "X-Message-Group: #out-statusnet-plugin-userflag\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -50,6 +50,7 @@ msgstr "Sinalizar perfil para análise." msgid "Clear" msgstr "Limpar" +#. TRANS: Form description for clearing flags from a profile. msgid "Clear all flags" msgstr "Limpar todas as sinalizações" @@ -57,6 +58,7 @@ msgstr "Limpar todas as sinalizações" msgid "Not logged in." msgstr "" +#. TRANS: Error message displayed when trying to review profile flags while not authorised. msgid "You cannot review profile flags." msgstr "" @@ -70,7 +72,7 @@ msgstr "Moderar" #. TRANS: Message displayed on a profile if it has been flagged. #. TRANS: %1$s is a comma separated list of at most 5 user nicknames that flagged. -#. TRANS: %2$d is a positive integer of additional flagging users. Also used for the plural. +#. TRANS: %2$d is a positive integer of additional flagging users. Also used for plural. #, php-format msgid "Flagged by %1$s and %2$d other" msgid_plural "Flagged by %1$s and %2$d others" @@ -84,8 +86,9 @@ msgid "Flagged by %s" msgstr "Sinalizado por %s" #. TRANS: Server exception given when flags could not be cleared. -#, php-format -msgid "Couldn't clear flags for profile \"%s\"." +#. TRANS: %s is a profile nickname. +#, fuzzy, php-format +msgid "Could not clear flags for profile \"%s\"." msgstr "Não foi possível limpar as sinalizações do perfil \"%s\"." #. TRANS: Title for AJAX form to indicated that flags were removed. @@ -97,6 +100,7 @@ msgid "Cleared" msgstr "Limpas" #. TRANS: Server exception. -#, php-format -msgid "Couldn't flag profile \"%d\" for review." +#. TRANS: %d is a profile ID (number). +#, fuzzy, php-format +msgid "Could not flag profile \"%d\" for review." msgstr "Não foi possível sinalizar o perfil \"%d\" para análise." diff --git a/plugins/UserFlag/locale/ru/LC_MESSAGES/UserFlag.po b/plugins/UserFlag/locale/ru/LC_MESSAGES/UserFlag.po index 5380935836..e7ac5674b0 100644 --- a/plugins/UserFlag/locale/ru/LC_MESSAGES/UserFlag.po +++ b/plugins/UserFlag/locale/ru/LC_MESSAGES/UserFlag.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - UserFlag to Russian (РуÑÑкий) +# Translation of StatusNet - UserFlag to Russian (руÑÑкий) # Exported from translatewiki.net # # Author: Byulent @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserFlag\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:48+0000\n" -"Language-Team: Russian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:24+0000\n" +"Language-Team: Russian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ru\n" "X-Message-Group: #out-statusnet-plugin-userflag\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " @@ -51,6 +51,7 @@ msgstr "Профиль помечен Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра" msgid "Clear" msgstr "ОчиÑтить" +#. TRANS: Form description for clearing flags from a profile. msgid "Clear all flags" msgstr "ОчиÑтить вÑе флаги" @@ -58,6 +59,7 @@ msgstr "ОчиÑтить вÑе флаги" msgid "Not logged in." msgstr "" +#. TRANS: Error message displayed when trying to review profile flags while not authorised. msgid "You cannot review profile flags." msgstr "" @@ -71,7 +73,7 @@ msgstr "Модерировать" #. TRANS: Message displayed on a profile if it has been flagged. #. TRANS: %1$s is a comma separated list of at most 5 user nicknames that flagged. -#. TRANS: %2$d is a positive integer of additional flagging users. Also used for the plural. +#. TRANS: %2$d is a positive integer of additional flagging users. Also used for plural. #, php-format msgid "Flagged by %1$s and %2$d other" msgid_plural "Flagged by %1$s and %2$d others" @@ -86,8 +88,9 @@ msgid "Flagged by %s" msgstr "Отмечено %s" #. TRANS: Server exception given when flags could not be cleared. -#, php-format -msgid "Couldn't clear flags for profile \"%s\"." +#. TRANS: %s is a profile nickname. +#, fuzzy, php-format +msgid "Could not clear flags for profile \"%s\"." msgstr "Ðе Ñнимать отметки Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ %s" #. TRANS: Title for AJAX form to indicated that flags were removed. @@ -99,6 +102,7 @@ msgid "Cleared" msgstr "СнÑто" #. TRANS: Server exception. -#, php-format -msgid "Couldn't flag profile \"%d\" for review." +#. TRANS: %d is a profile ID (number). +#, fuzzy, php-format +msgid "Could not flag profile \"%d\" for review." msgstr "Ðевозможно отметить профиль %d Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра." diff --git a/plugins/UserFlag/locale/tl/LC_MESSAGES/UserFlag.po b/plugins/UserFlag/locale/tl/LC_MESSAGES/UserFlag.po index e9bab6428e..ca940979cd 100644 --- a/plugins/UserFlag/locale/tl/LC_MESSAGES/UserFlag.po +++ b/plugins/UserFlag/locale/tl/LC_MESSAGES/UserFlag.po @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserFlag\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:48+0000\n" -"Language-Team: Tagalog \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:24+0000\n" +"Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-userflag\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -50,6 +50,7 @@ msgstr "Balangkas ng watawat na susuriing muli." msgid "Clear" msgstr "Hawiin" +#. TRANS: Form description for clearing flags from a profile. msgid "Clear all flags" msgstr "Hawiin ang lahat ng mga watawat" @@ -57,6 +58,7 @@ msgstr "Hawiin ang lahat ng mga watawat" msgid "Not logged in." msgstr "Hindi nakalagda." +#. TRANS: Error message displayed when trying to review profile flags while not authorised. msgid "You cannot review profile flags." msgstr "Hindi ka maaaring magsuring muli ng mga watawat ng balangkas." @@ -70,7 +72,7 @@ msgstr "Katamtaman" #. TRANS: Message displayed on a profile if it has been flagged. #. TRANS: %1$s is a comma separated list of at most 5 user nicknames that flagged. -#. TRANS: %2$d is a positive integer of additional flagging users. Also used for the plural. +#. TRANS: %2$d is a positive integer of additional flagging users. Also used for plural. #, php-format msgid "Flagged by %1$s and %2$d other" msgid_plural "Flagged by %1$s and %2$d others" @@ -84,9 +86,10 @@ msgid "Flagged by %s" msgstr "Iwinatawat ni %s" #. TRANS: Server exception given when flags could not be cleared. +#. TRANS: %s is a profile nickname. #, php-format -msgid "Couldn't clear flags for profile \"%s\"." -msgstr "Hindi mahawi ang mga watawat para sa balangkas na \"%s\"." +msgid "Could not clear flags for profile \"%s\"." +msgstr "Hindi mahawi ang mga watawat para sa balangkas ng katangian na \"%s\"." #. TRANS: Title for AJAX form to indicated that flags were removed. msgid "Flags cleared" @@ -97,7 +100,8 @@ msgid "Cleared" msgstr "Nahawi na" #. TRANS: Server exception. +#. TRANS: %d is a profile ID (number). #, php-format -msgid "Couldn't flag profile \"%d\" for review." +msgid "Could not flag profile \"%d\" for review." msgstr "" -"Hindi maiwatawat ang watawat ng balangkas na \"%d\" para sa muling pagsusuri." +"Hindi maibandila ang balangkas ng katangian na \"%d\" na susuriing muli." diff --git a/plugins/UserFlag/locale/uk/LC_MESSAGES/UserFlag.po b/plugins/UserFlag/locale/uk/LC_MESSAGES/UserFlag.po index 6bc921fd6d..e4d8bee167 100644 --- a/plugins/UserFlag/locale/uk/LC_MESSAGES/UserFlag.po +++ b/plugins/UserFlag/locale/uk/LC_MESSAGES/UserFlag.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - UserFlag to Ukrainian (УкраїнÑька) +# Translation of StatusNet - UserFlag to Ukrainian (українÑька) # Exported from translatewiki.net # # Author: Boogie @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserFlag\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:48+0000\n" -"Language-Team: Ukrainian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:24+0000\n" +"Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:36+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-userflag\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " @@ -51,6 +51,7 @@ msgstr "Відмітити профіль Ð´Ð»Ñ Ñ€Ð¾Ð·Ð³Ð»Ñду." msgid "Clear" msgstr "ЗнÑти" +#. TRANS: Form description for clearing flags from a profile. msgid "Clear all flags" msgstr "ЗнÑти вÑÑ– позначки" @@ -58,6 +59,7 @@ msgstr "ЗнÑти вÑÑ– позначки" msgid "Not logged in." msgstr "Ðе увійшли." +#. TRANS: Error message displayed when trying to review profile flags while not authorised. msgid "You cannot review profile flags." msgstr "Ви не можете переглÑнути профілі позначених кориÑтувачів." @@ -71,7 +73,7 @@ msgstr "Модерувати" #. TRANS: Message displayed on a profile if it has been flagged. #. TRANS: %1$s is a comma separated list of at most 5 user nicknames that flagged. -#. TRANS: %2$d is a positive integer of additional flagging users. Also used for the plural. +#. TRANS: %2$d is a positive integer of additional flagging users. Also used for plural. #, php-format msgid "Flagged by %1$s and %2$d other" msgid_plural "Flagged by %1$s and %2$d others" @@ -86,8 +88,9 @@ msgid "Flagged by %s" msgstr "Відмічено %s" #. TRANS: Server exception given when flags could not be cleared. -#, php-format -msgid "Couldn't clear flags for profile \"%s\"." +#. TRANS: %s is a profile nickname. +#, fuzzy, php-format +msgid "Could not clear flags for profile \"%s\"." msgstr "Ðе можу знÑти позначки Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ„Ñ–Ð»ÑŽ «%s»." #. TRANS: Title for AJAX form to indicated that flags were removed. @@ -99,6 +102,7 @@ msgid "Cleared" msgstr "ЗнÑто" #. TRANS: Server exception. -#, php-format -msgid "Couldn't flag profile \"%d\" for review." +#. TRANS: %d is a profile ID (number). +#, fuzzy, php-format +msgid "Could not flag profile \"%d\" for review." msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´Ð¼Ñ–Ñ‚Ð¸Ñ‚Ð¸ профіль «%d» Ð´Ð»Ñ Ñ€Ð¾Ð·Ð³Ð»Ñду." diff --git a/plugins/UserLimit/UserLimitPlugin.php b/plugins/UserLimit/UserLimitPlugin.php index ad2c6e363e..412f8604a5 100644 --- a/plugins/UserLimit/UserLimitPlugin.php +++ b/plugins/UserLimit/UserLimitPlugin.php @@ -45,7 +45,6 @@ if (!defined('STATUSNET')) { * * @seeAlso Location */ - class UserLimitPlugin extends Plugin { public $maxUsers = null; @@ -65,14 +64,16 @@ class UserLimitPlugin extends Plugin function _checkMaxUsers() { if (!is_null($this->maxUsers)) { - $cls = new User(); $cnt = $cls->count(); if ($cnt >= $this->maxUsers) { - // @todo FIXME: i18n issue. Needs plural. - $msg = sprintf(_m('Cannot register; maximum number of users (%d) reached.'), + // TRANS: Error message given if creating a new user is not possible because a limit has been reached. + // TRANS: %d is the user limit (also available for plural). + $msg = sprintf(_m('Cannot register because the maximum number of users (%d) for this site was reached.', + 'Cannot register because the maximum number of users (%d) for this site was reached.', + $this->maxUsers), $this->maxUsers); throw new ClientException($msg); @@ -87,6 +88,7 @@ class UserLimitPlugin extends Plugin 'author' => 'Evan Prodromou', 'homepage' => 'http://status.net/wiki/Plugin:UserLimit', 'description' => + // TRANS: Plugin description. _m('Limit the number of users who can register.')); return true; } diff --git a/plugins/UserLimit/locale/UserLimit.pot b/plugins/UserLimit/locale/UserLimit.pot index 26b218d489..5e73559f22 100644 --- a/plugins/UserLimit/locale/UserLimit.pot +++ b/plugins/UserLimit/locale/UserLimit.pot @@ -8,19 +8,29 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: UserLimitPlugin.php:75 +#. TRANS: Error message given if creating a new user is not possible because a limit has been reached. +#. TRANS: %d is the user limit (also available for plural). +#: UserLimitPlugin.php:74 #, php-format -msgid "Cannot register; maximum number of users (%d) reached." -msgstr "" +msgid "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgid_plural "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgstr[0] "" +msgstr[1] "" -#: UserLimitPlugin.php:90 +#. TRANS: Plugin description. +#: UserLimitPlugin.php:92 msgid "Limit the number of users who can register." msgstr "" diff --git a/plugins/UserLimit/locale/br/LC_MESSAGES/UserLimit.po b/plugins/UserLimit/locale/br/LC_MESSAGES/UserLimit.po index da44081fdf..5a474486b5 100644 --- a/plugins/UserLimit/locale/br/LC_MESSAGES/UserLimit.po +++ b/plugins/UserLimit/locale/br/LC_MESSAGES/UserLimit.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - UserLimit to Breton (Brezhoneg) +# Translation of StatusNet - UserLimit to Breton (brezhoneg) # Exported from translatewiki.net # # Author: Fulup @@ -9,21 +9,30 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserLimit\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:49+0000\n" -"Language-Team: Breton \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:25+0000\n" +"Language-Team: Breton \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:51+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: br\n" "X-Message-Group: #out-statusnet-plugin-userlimit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Error message given if creating a new user is not possible because a limit has been reached. +#. TRANS: %d is the user limit (also available for plural). #, php-format -msgid "Cannot register; maximum number of users (%d) reached." -msgstr "" +msgid "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgid_plural "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgstr[0] "" +msgstr[1] "" +#. TRANS: Plugin description. msgid "Limit the number of users who can register." msgstr "Bevenniñ an niver a implijerien a c'hall en em enskrivañ" diff --git a/plugins/UserLimit/locale/de/LC_MESSAGES/UserLimit.po b/plugins/UserLimit/locale/de/LC_MESSAGES/UserLimit.po index 75801093b1..39237ab036 100644 --- a/plugins/UserLimit/locale/de/LC_MESSAGES/UserLimit.po +++ b/plugins/UserLimit/locale/de/LC_MESSAGES/UserLimit.po @@ -1,6 +1,7 @@ # Translation of StatusNet - UserLimit to German (Deutsch) # Exported from translatewiki.net # +# Author: ChrisiPK # Author: Giftpflanze # Author: The Evil IP address # -- @@ -10,22 +11,32 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserLimit\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:49+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:25+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:51+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-userlimit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Error message given if creating a new user is not possible because a limit has been reached. +#. TRANS: %d is the user limit (also available for plural). #, php-format -msgid "Cannot register; maximum number of users (%d) reached." -msgstr "" +msgid "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgid_plural "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgstr[0] "" +"Registrierung fehlgeschlagen; maximale Anzahl von Benutzern (%d) erreicht." +msgstr[1] "" "Registrierung fehlgeschlagen; maximale Anzahl von Benutzern (%d) erreicht." +#. TRANS: Plugin description. msgid "Limit the number of users who can register." msgstr "Beschränkung der Anzahl von Benutzern, die sich registrieren können." diff --git a/plugins/UserLimit/locale/es/LC_MESSAGES/UserLimit.po b/plugins/UserLimit/locale/es/LC_MESSAGES/UserLimit.po index 7a41bc2f64..847810f61d 100644 --- a/plugins/UserLimit/locale/es/LC_MESSAGES/UserLimit.po +++ b/plugins/UserLimit/locale/es/LC_MESSAGES/UserLimit.po @@ -1,6 +1,7 @@ -# Translation of StatusNet - UserLimit to Spanish (Español) +# Translation of StatusNet - UserLimit to Spanish (español) # Exported from translatewiki.net # +# Author: Armando-Martin # Author: Translationista # -- # This file is distributed under the same license as the StatusNet package. @@ -9,21 +10,34 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserLimit\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:49+0000\n" -"Language-Team: Spanish \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:25+0000\n" +"Language-Team: Spanish \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:51+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: es\n" "X-Message-Group: #out-statusnet-plugin-userlimit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Error message given if creating a new user is not possible because a limit has been reached. +#. TRANS: %d is the user limit (also available for plural). #, php-format -msgid "Cannot register; maximum number of users (%d) reached." -msgstr "" +msgid "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgid_plural "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgstr[0] "" +"No se puede registrar porque se alcanzó el número máximo de usuarios (%d) " +"para este sitio." +msgstr[1] "" +"No se puede registrar porque se alcanzó el número máximo de usuarios (%d) " +"para este sitio." +#. TRANS: Plugin description. msgid "Limit the number of users who can register." msgstr "Limitarla cantidad de usuarios que pueden registrarse." diff --git a/plugins/UserLimit/locale/fa/LC_MESSAGES/UserLimit.po b/plugins/UserLimit/locale/fa/LC_MESSAGES/UserLimit.po index 4077296351..94c36e7968 100644 --- a/plugins/UserLimit/locale/fa/LC_MESSAGES/UserLimit.po +++ b/plugins/UserLimit/locale/fa/LC_MESSAGES/UserLimit.po @@ -9,21 +9,29 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserLimit\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:49+0000\n" -"Language-Team: Persian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:25+0000\n" +"Language-Team: Persian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:51+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fa\n" "X-Message-Group: #out-statusnet-plugin-userlimit\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Error message given if creating a new user is not possible because a limit has been reached. +#. TRANS: %d is the user limit (also available for plural). #, php-format -msgid "Cannot register; maximum number of users (%d) reached." -msgstr "" +msgid "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgid_plural "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgstr[0] "" +#. TRANS: Plugin description. msgid "Limit the number of users who can register." msgstr "محدودکردن تعداد کاربرانی Ú©Ù‡ می‌توانید ثبت نام کنند." diff --git a/plugins/UserLimit/locale/fi/LC_MESSAGES/UserLimit.po b/plugins/UserLimit/locale/fi/LC_MESSAGES/UserLimit.po index 8e47ffb694..4c39405dcb 100644 --- a/plugins/UserLimit/locale/fi/LC_MESSAGES/UserLimit.po +++ b/plugins/UserLimit/locale/fi/LC_MESSAGES/UserLimit.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - UserLimit to Finnish (Suomi) +# Translation of StatusNet - UserLimit to Finnish (suomi) # Exported from translatewiki.net # # Author: Centerlink @@ -9,21 +9,30 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserLimit\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:49+0000\n" -"Language-Team: Finnish \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:25+0000\n" +"Language-Team: Finnish \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:51+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fi\n" "X-Message-Group: #out-statusnet-plugin-userlimit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Error message given if creating a new user is not possible because a limit has been reached. +#. TRANS: %d is the user limit (also available for plural). #, php-format -msgid "Cannot register; maximum number of users (%d) reached." -msgstr "" +msgid "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgid_plural "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgstr[0] "" +msgstr[1] "" +#. TRANS: Plugin description. msgid "Limit the number of users who can register." msgstr "Rajoita niiden käyttäjien lukumäärää, jotka voivat rekisteröityä." diff --git a/plugins/UserLimit/locale/fr/LC_MESSAGES/UserLimit.po b/plugins/UserLimit/locale/fr/LC_MESSAGES/UserLimit.po index d5e0f9b232..273b1c17ae 100644 --- a/plugins/UserLimit/locale/fr/LC_MESSAGES/UserLimit.po +++ b/plugins/UserLimit/locale/fr/LC_MESSAGES/UserLimit.po @@ -1,6 +1,7 @@ -# Translation of StatusNet - UserLimit to French (Français) +# Translation of StatusNet - UserLimit to French (français) # Exported from translatewiki.net # +# Author: Crochet.david # Author: Peter17 # Author: Verdy p # -- @@ -10,23 +11,34 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserLimit\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:49+0000\n" -"Language-Team: French \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:25+0000\n" +"Language-Team: French \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:51+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-userlimit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Error message given if creating a new user is not possible because a limit has been reached. +#. TRANS: %d is the user limit (also available for plural). #, php-format -msgid "Cannot register; maximum number of users (%d) reached." -msgstr "" -"Impossible de s’enregistrer ; le nombre maximum d’utilisateurs (%d) a été " -"atteint." +msgid "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgid_plural "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgstr[0] "" +"Impossible d’enregistrer car le nombre maximal d’utilisateurs (%d) pour ce " +"site a été atteint" +msgstr[1] "" +"Impossible d’enregistrer car le nombre maximal d’utilisateurs (%d) pour ce " +"site a été atteint" +#. TRANS: Plugin description. msgid "Limit the number of users who can register." msgstr "Limiter le nombre d’utilisateurs qui peuvent s’inscrire." diff --git a/plugins/UserLimit/locale/gl/LC_MESSAGES/UserLimit.po b/plugins/UserLimit/locale/gl/LC_MESSAGES/UserLimit.po index 836983c5ce..d1f4494979 100644 --- a/plugins/UserLimit/locale/gl/LC_MESSAGES/UserLimit.po +++ b/plugins/UserLimit/locale/gl/LC_MESSAGES/UserLimit.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - UserLimit to Galician (Galego) +# Translation of StatusNet - UserLimit to Galician (galego) # Exported from translatewiki.net # # Author: Toliño @@ -9,21 +9,34 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserLimit\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:49+0000\n" -"Language-Team: Galician \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:25+0000\n" +"Language-Team: Galician \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:51+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: gl\n" "X-Message-Group: #out-statusnet-plugin-userlimit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Error message given if creating a new user is not possible because a limit has been reached. +#. TRANS: %d is the user limit (also available for plural). #, php-format -msgid "Cannot register; maximum number of users (%d) reached." -msgstr "" +msgid "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgid_plural "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgstr[0] "" +"Non se pode rexistrar porque se acadou o número máximo de usuarios (%d) para " +"este sitio." +msgstr[1] "" +"Non se pode rexistrar porque se acadou o número máximo de usuarios (%d) para " +"este sitio." +#. TRANS: Plugin description. msgid "Limit the number of users who can register." msgstr "Limitar o número de usuarios que se poden rexistrar." diff --git a/plugins/UserLimit/locale/he/LC_MESSAGES/UserLimit.po b/plugins/UserLimit/locale/he/LC_MESSAGES/UserLimit.po index b5fcf11727..76520dd1e5 100644 --- a/plugins/UserLimit/locale/he/LC_MESSAGES/UserLimit.po +++ b/plugins/UserLimit/locale/he/LC_MESSAGES/UserLimit.po @@ -1,6 +1,7 @@ # Translation of StatusNet - UserLimit to Hebrew (עברית) # Exported from translatewiki.net # +# Author: Amire80 # Author: YaronSh # -- # This file is distributed under the same license as the StatusNet package. @@ -9,21 +10,30 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserLimit\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:49+0000\n" -"Language-Team: Hebrew \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:25+0000\n" +"Language-Team: Hebrew \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:51+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: he\n" "X-Message-Group: #out-statusnet-plugin-userlimit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Error message given if creating a new user is not possible because a limit has been reached. +#. TRANS: %d is the user limit (also available for plural). #, php-format -msgid "Cannot register; maximum number of users (%d) reached." -msgstr "" +msgid "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgid_plural "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgstr[0] "×œ× × ×™×ª×Ÿ ×œ×”×™×¨×©× ×ž×©×•× ×©×‘×תר כבר יש מספר מרבי של ×ž× ×•×™×™× (%d)." +msgstr[1] "×œ× × ×™×ª×Ÿ ×œ×”×™×¨×©× ×ž×©×•× ×©×‘×תר כבר יש מספר מרבי של ×ž× ×•×™×™× (%d)." +#. TRANS: Plugin description. msgid "Limit the number of users who can register." msgstr "הגבלת מספר ×”×ž×©×ª×ž×©×™× ×©×™×›×•×œ×™× ×œ×”×™×¨×©×." diff --git a/plugins/UserLimit/locale/ia/LC_MESSAGES/UserLimit.po b/plugins/UserLimit/locale/ia/LC_MESSAGES/UserLimit.po index 28274c5bc7..6814c29545 100644 --- a/plugins/UserLimit/locale/ia/LC_MESSAGES/UserLimit.po +++ b/plugins/UserLimit/locale/ia/LC_MESSAGES/UserLimit.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - UserLimit to Interlingua (Interlingua) +# Translation of StatusNet - UserLimit to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,23 +9,34 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserLimit\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:49+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:25+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:51+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-userlimit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Error message given if creating a new user is not possible because a limit has been reached. +#. TRANS: %d is the user limit (also available for plural). #, php-format -msgid "Cannot register; maximum number of users (%d) reached." -msgstr "" -"Impossibile crear conto; le numero maxime de usatores (%d) ha essite " -"attingite." +msgid "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgid_plural "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgstr[0] "" +"Impossibile crear conto; le numero maxime de usatores (%d) pro iste sito ha " +"essite attingite." +msgstr[1] "" +"Impossibile crear conto; le numero maxime de usatores (%d) pro iste sito ha " +"essite attingite." +#. TRANS: Plugin description. msgid "Limit the number of users who can register." msgstr "Limitar le numero de usatores que pote registrar se." diff --git a/plugins/UserLimit/locale/id/LC_MESSAGES/UserLimit.po b/plugins/UserLimit/locale/id/LC_MESSAGES/UserLimit.po index 8edc494f59..756e9f092d 100644 --- a/plugins/UserLimit/locale/id/LC_MESSAGES/UserLimit.po +++ b/plugins/UserLimit/locale/id/LC_MESSAGES/UserLimit.po @@ -9,21 +9,29 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserLimit\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:49+0000\n" -"Language-Team: Indonesian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:25+0000\n" +"Language-Team: Indonesian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:51+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: id\n" "X-Message-Group: #out-statusnet-plugin-userlimit\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Error message given if creating a new user is not possible because a limit has been reached. +#. TRANS: %d is the user limit (also available for plural). #, php-format -msgid "Cannot register; maximum number of users (%d) reached." -msgstr "" +msgid "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgid_plural "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgstr[0] "" +#. TRANS: Plugin description. msgid "Limit the number of users who can register." msgstr "Batasi jumlah pengguna yang boleh mendaftar." diff --git a/plugins/UserLimit/locale/lb/LC_MESSAGES/UserLimit.po b/plugins/UserLimit/locale/lb/LC_MESSAGES/UserLimit.po index 3685a65f41..2bb1adebd6 100644 --- a/plugins/UserLimit/locale/lb/LC_MESSAGES/UserLimit.po +++ b/plugins/UserLimit/locale/lb/LC_MESSAGES/UserLimit.po @@ -9,21 +9,30 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserLimit\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:50+0000\n" -"Language-Team: Luxembourgish \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:26+0000\n" +"Language-Team: Luxembourgish \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:51+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: lb\n" "X-Message-Group: #out-statusnet-plugin-userlimit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Error message given if creating a new user is not possible because a limit has been reached. +#. TRANS: %d is the user limit (also available for plural). #, php-format -msgid "Cannot register; maximum number of users (%d) reached." -msgstr "" +msgid "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgid_plural "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgstr[0] "" +msgstr[1] "" +#. TRANS: Plugin description. msgid "Limit the number of users who can register." msgstr "D'Zuel vun de Benotzer, déi sech registréiere kënnen, limitéieren." diff --git a/plugins/UserLimit/locale/lv/LC_MESSAGES/UserLimit.po b/plugins/UserLimit/locale/lv/LC_MESSAGES/UserLimit.po index be53761efc..1722a14e3e 100644 --- a/plugins/UserLimit/locale/lv/LC_MESSAGES/UserLimit.po +++ b/plugins/UserLimit/locale/lv/LC_MESSAGES/UserLimit.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - UserLimit to Latvian (LatvieÅ¡u) +# Translation of StatusNet - UserLimit to Latvian (latvieÅ¡u) # Exported from translatewiki.net # # Author: Geimeris @@ -9,22 +9,32 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserLimit\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:50+0000\n" -"Language-Team: Latvian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:26+0000\n" +"Language-Team: Latvian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:51+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: lv\n" "X-Message-Group: #out-statusnet-plugin-userlimit\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n != " "0) ? 1 : 2 );\n" +#. TRANS: Error message given if creating a new user is not possible because a limit has been reached. +#. TRANS: %d is the user limit (also available for plural). #, php-format -msgid "Cannot register; maximum number of users (%d) reached." -msgstr "" +msgid "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgid_plural "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +#. TRANS: Plugin description. msgid "Limit the number of users who can register." msgstr "Ierobežotais lietotÄju skaits, kuri var reÄ£istrÄ“ties." diff --git a/plugins/UserLimit/locale/mk/LC_MESSAGES/UserLimit.po b/plugins/UserLimit/locale/mk/LC_MESSAGES/UserLimit.po index e239105630..faabb00894 100644 --- a/plugins/UserLimit/locale/mk/LC_MESSAGES/UserLimit.po +++ b/plugins/UserLimit/locale/mk/LC_MESSAGES/UserLimit.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - UserLimit to Macedonian (МакедонÑки) +# Translation of StatusNet - UserLimit to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 @@ -9,23 +9,34 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserLimit\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:50+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:26+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:51+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-userlimit\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" +#. TRANS: Error message given if creating a new user is not possible because a limit has been reached. +#. TRANS: %d is the user limit (also available for plural). #, php-format -msgid "Cannot register; maximum number of users (%d) reached." -msgstr "" -"РегиÑтрацијата не може да Ñе изврши. ДоÑтигнат е макÑималниот број на " -"кориÑници (%d)." +msgid "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgid_plural "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgstr[0] "" +"Ðе можам да Ве региÑтрирам. ДоÑтигнат е макÑималниот број на кориÑници (%d) " +"за ова мрежно меÑто." +msgstr[1] "" +"Ðе можам да Ве региÑтрирам. ДоÑтигнат е макÑималниот број на кориÑници (%d) " +"за ова мрежно меÑто." +#. TRANS: Plugin description. msgid "Limit the number of users who can register." msgstr "Ограничување на бројот на кориÑници што можат да Ñе региÑтрираат." diff --git a/plugins/UserLimit/locale/ms/LC_MESSAGES/UserLimit.po b/plugins/UserLimit/locale/ms/LC_MESSAGES/UserLimit.po index 55dfe10493..c189d88ade 100644 --- a/plugins/UserLimit/locale/ms/LC_MESSAGES/UserLimit.po +++ b/plugins/UserLimit/locale/ms/LC_MESSAGES/UserLimit.po @@ -9,21 +9,29 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserLimit\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:50+0000\n" -"Language-Team: Malay \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:26+0000\n" +"Language-Team: Malay \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:51+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ms\n" "X-Message-Group: #out-statusnet-plugin-userlimit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#, php-format -msgid "Cannot register; maximum number of users (%d) reached." -msgstr "Tidak boleh berdaftar; bilangan pengguna maksimum (%d) dicapai." +#. TRANS: Error message given if creating a new user is not possible because a limit has been reached. +#. TRANS: %d is the user limit (also available for plural). +#, fuzzy, php-format +msgid "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgid_plural "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgstr[0] "Tidak boleh berdaftar; bilangan pengguna maksimum (%d) dicapai." +#. TRANS: Plugin description. msgid "Limit the number of users who can register." msgstr "Hadkan jumlah pengguna yang boleh berdaftar." diff --git a/plugins/UserLimit/locale/nb/LC_MESSAGES/UserLimit.po b/plugins/UserLimit/locale/nb/LC_MESSAGES/UserLimit.po index acfc6432d7..f1273c3319 100644 --- a/plugins/UserLimit/locale/nb/LC_MESSAGES/UserLimit.po +++ b/plugins/UserLimit/locale/nb/LC_MESSAGES/UserLimit.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - UserLimit to Norwegian (bokmÃ¥l)‬ (‪Norsk (bokmÃ¥l)‬) +# Translation of StatusNet - UserLimit to Norwegian BokmÃ¥l (‪norsk (bokmÃ¥l)‬) # Exported from translatewiki.net # # Author: Nghtwlkr @@ -9,21 +9,30 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserLimit\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:50+0000\n" -"Language-Team: Norwegian (bokmÃ¥l)‬ \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:26+0000\n" +"Language-Team: Norwegian BokmÃ¥l \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" -"X-Language-Code: no\n" +"X-POT-Import-Date: 2011-06-19 11:23:51+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: nb\n" "X-Message-Group: #out-statusnet-plugin-userlimit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Error message given if creating a new user is not possible because a limit has been reached. +#. TRANS: %d is the user limit (also available for plural). #, php-format -msgid "Cannot register; maximum number of users (%d) reached." -msgstr "" +msgid "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgid_plural "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgstr[0] "" +msgstr[1] "" +#. TRANS: Plugin description. msgid "Limit the number of users who can register." msgstr "Begrens antallet brukere som kan registrere seg." diff --git a/plugins/UserLimit/locale/nl/LC_MESSAGES/UserLimit.po b/plugins/UserLimit/locale/nl/LC_MESSAGES/UserLimit.po index 39c4b34a1a..4032ea4567 100644 --- a/plugins/UserLimit/locale/nl/LC_MESSAGES/UserLimit.po +++ b/plugins/UserLimit/locale/nl/LC_MESSAGES/UserLimit.po @@ -9,22 +9,32 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserLimit\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:50+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:26+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:51+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-userlimit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Error message given if creating a new user is not possible because a limit has been reached. +#. TRANS: %d is the user limit (also available for plural). #, php-format -msgid "Cannot register; maximum number of users (%d) reached." -msgstr "" +msgid "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgid_plural "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgstr[0] "" +"Registreren is niet mogelijk. Het maximale aantal gebruikers (%d) is bereikt." +msgstr[1] "" "Registreren is niet mogelijk. Het maximale aantal gebruikers (%d) is bereikt." +#. TRANS: Plugin description. msgid "Limit the number of users who can register." msgstr "Limiteert het aantal gebruikers dat kan registreren." diff --git a/plugins/UserLimit/locale/pt/LC_MESSAGES/UserLimit.po b/plugins/UserLimit/locale/pt/LC_MESSAGES/UserLimit.po index dba79a6e62..1ef9850b44 100644 --- a/plugins/UserLimit/locale/pt/LC_MESSAGES/UserLimit.po +++ b/plugins/UserLimit/locale/pt/LC_MESSAGES/UserLimit.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - UserLimit to Portuguese (Português) +# Translation of StatusNet - UserLimit to Portuguese (português) # Exported from translatewiki.net # # Author: Hamilton Abreu @@ -9,21 +9,30 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserLimit\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:50+0000\n" -"Language-Team: Portuguese \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:26+0000\n" +"Language-Team: Portuguese \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:51+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: pt\n" "X-Message-Group: #out-statusnet-plugin-userlimit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Error message given if creating a new user is not possible because a limit has been reached. +#. TRANS: %d is the user limit (also available for plural). #, php-format -msgid "Cannot register; maximum number of users (%d) reached." -msgstr "" +msgid "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgid_plural "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgstr[0] "" +msgstr[1] "" +#. TRANS: Plugin description. msgid "Limit the number of users who can register." msgstr "Limitar o número de utilizadores que se podem registar." diff --git a/plugins/UserLimit/locale/pt_BR/LC_MESSAGES/UserLimit.po b/plugins/UserLimit/locale/pt_BR/LC_MESSAGES/UserLimit.po index 7ac20d7acd..458eb3cea3 100644 --- a/plugins/UserLimit/locale/pt_BR/LC_MESSAGES/UserLimit.po +++ b/plugins/UserLimit/locale/pt_BR/LC_MESSAGES/UserLimit.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - UserLimit to Brazilian Portuguese (Português do Brasil) +# Translation of StatusNet - UserLimit to Brazilian Portuguese (português do Brasil) # Exported from translatewiki.net # # Author: Giro720 @@ -9,22 +9,31 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserLimit\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:50+0000\n" -"Language-Team: Brazilian Portuguese \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:26+0000\n" +"Language-Team: Brazilian Portuguese \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:51+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: pt-br\n" "X-Message-Group: #out-statusnet-plugin-userlimit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Error message given if creating a new user is not possible because a limit has been reached. +#. TRANS: %d is the user limit (also available for plural). #, php-format -msgid "Cannot register; maximum number of users (%d) reached." -msgstr "" +msgid "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgid_plural "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgstr[0] "" +msgstr[1] "" +#. TRANS: Plugin description. msgid "Limit the number of users who can register." msgstr "Limitar o número de usuários que podem se registrar." diff --git a/plugins/UserLimit/locale/ru/LC_MESSAGES/UserLimit.po b/plugins/UserLimit/locale/ru/LC_MESSAGES/UserLimit.po index bd888f4d34..71e4df1552 100644 --- a/plugins/UserLimit/locale/ru/LC_MESSAGES/UserLimit.po +++ b/plugins/UserLimit/locale/ru/LC_MESSAGES/UserLimit.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - UserLimit to Russian (РуÑÑкий) +# Translation of StatusNet - UserLimit to Russian (руÑÑкий) # Exported from translatewiki.net # # Author: ÐлекÑандр Сигачёв @@ -9,24 +9,36 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserLimit\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:50+0000\n" -"Language-Team: Russian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:26+0000\n" +"Language-Team: Russian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:51+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ru\n" "X-Message-Group: #out-statusnet-plugin-userlimit\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" -#, php-format -msgid "Cannot register; maximum number of users (%d) reached." -msgstr "" +#. TRANS: Error message given if creating a new user is not possible because a limit has been reached. +#. TRANS: %d is the user limit (also available for plural). +#, fuzzy, php-format +msgid "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgid_plural "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgstr[0] "" +"РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð½Ðµ удалаÑÑŒ. ДоÑтигнуто предельное чиÑло пользователей (%d)." +msgstr[1] "" +"РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð½Ðµ удалаÑÑŒ. ДоÑтигнуто предельное чиÑло пользователей (%d)." +msgstr[2] "" "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð½Ðµ удалаÑÑŒ. ДоÑтигнуто предельное чиÑло пользователей (%d)." +#. TRANS: Plugin description. msgid "Limit the number of users who can register." msgstr "" "Ограничение количеÑтва пользователей, которые могут зарегиÑтрироватьÑÑ." diff --git a/plugins/UserLimit/locale/tl/LC_MESSAGES/UserLimit.po b/plugins/UserLimit/locale/tl/LC_MESSAGES/UserLimit.po index c6b23b3598..2a5d3329ea 100644 --- a/plugins/UserLimit/locale/tl/LC_MESSAGES/UserLimit.po +++ b/plugins/UserLimit/locale/tl/LC_MESSAGES/UserLimit.po @@ -9,22 +9,34 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserLimit\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:50+0000\n" -"Language-Team: Tagalog \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:26+0000\n" +"Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:51+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-userlimit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Error message given if creating a new user is not possible because a limit has been reached. +#. TRANS: %d is the user limit (also available for plural). #, php-format -msgid "Cannot register; maximum number of users (%d) reached." -msgstr "" -"Hindi maipatala; naabot na ang pinakamataas na bilang ng mga tagagamit (%d)." +msgid "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgid_plural "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgstr[0] "" +"Hindi mairehistro dahil naabot na ang pinakamataas na bilang ng mga " +"tagagamit (%d) para sa pook na ito." +msgstr[1] "" +"Hindi maipatala dahil naabot na ang pinakamataas na bilang ng mga tagagamit " +"(%d) para sa pook na ito." +#. TRANS: Plugin description. msgid "Limit the number of users who can register." msgstr "Hangganan ng bilang ng mga tagagamit na makakapagpatala." diff --git a/plugins/UserLimit/locale/tr/LC_MESSAGES/UserLimit.po b/plugins/UserLimit/locale/tr/LC_MESSAGES/UserLimit.po index 6a1fd3b79c..cd08694a2e 100644 --- a/plugins/UserLimit/locale/tr/LC_MESSAGES/UserLimit.po +++ b/plugins/UserLimit/locale/tr/LC_MESSAGES/UserLimit.po @@ -9,21 +9,29 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserLimit\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:50+0000\n" -"Language-Team: Turkish \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:26+0000\n" +"Language-Team: Turkish \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:51+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tr\n" "X-Message-Group: #out-statusnet-plugin-userlimit\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Error message given if creating a new user is not possible because a limit has been reached. +#. TRANS: %d is the user limit (also available for plural). #, php-format -msgid "Cannot register; maximum number of users (%d) reached." -msgstr "" +msgid "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgid_plural "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgstr[0] "" +#. TRANS: Plugin description. msgid "Limit the number of users who can register." msgstr "Kayıt olabilecek kullanıcı sayısını sınırla." diff --git a/plugins/UserLimit/locale/uk/LC_MESSAGES/UserLimit.po b/plugins/UserLimit/locale/uk/LC_MESSAGES/UserLimit.po index fd7b7279d7..d6d7d770f4 100644 --- a/plugins/UserLimit/locale/uk/LC_MESSAGES/UserLimit.po +++ b/plugins/UserLimit/locale/uk/LC_MESSAGES/UserLimit.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - UserLimit to Ukrainian (УкраїнÑька) +# Translation of StatusNet - UserLimit to Ukrainian (українÑька) # Exported from translatewiki.net # # Author: Boogie @@ -9,24 +9,38 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserLimit\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:50+0000\n" -"Language-Team: Ukrainian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:26+0000\n" +"Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:29+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:51+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-userlimit\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" -#, php-format -msgid "Cannot register; maximum number of users (%d) reached." -msgstr "" +#. TRANS: Error message given if creating a new user is not possible because a limit has been reached. +#. TRANS: %d is the user limit (also available for plural). +#, fuzzy, php-format +msgid "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgid_plural "" +"Cannot register because the maximum number of users (%d) for this site was " +"reached." +msgstr[0] "" +"Ðе вдаєтьÑÑ Ð·Ð°Ñ€ÐµÑ”Ñтрувати; макÑимально можливу кількіÑÑ‚ÑŒ кориÑтувачів (%d) " +"вже зареєÑтровано." +msgstr[1] "" +"Ðе вдаєтьÑÑ Ð·Ð°Ñ€ÐµÑ”Ñтрувати; макÑимально можливу кількіÑÑ‚ÑŒ кориÑтувачів (%d) " +"вже зареєÑтровано." +msgstr[2] "" "Ðе вдаєтьÑÑ Ð·Ð°Ñ€ÐµÑ”Ñтрувати; макÑимально можливу кількіÑÑ‚ÑŒ кориÑтувачів (%d) " "вже зареєÑтровано." +#. TRANS: Plugin description. msgid "Limit the number of users who can register." msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÐºÑ–Ð»ÑŒÐºÐ¾ÑÑ‚Ñ– кориÑтувачів, котрі можуть зареєÑтруватиÑÑ." diff --git a/plugins/WikiHashtags/WikiHashtagsPlugin.php b/plugins/WikiHashtags/WikiHashtagsPlugin.php index 46ae4bc068..52925d113a 100644 --- a/plugins/WikiHashtags/WikiHashtagsPlugin.php +++ b/plugins/WikiHashtags/WikiHashtagsPlugin.php @@ -42,7 +42,6 @@ if (!defined('STATUSNET')) { * * @see Event */ - class WikiHashtagsPlugin extends Plugin { const VERSION = '0.1'; @@ -57,12 +56,10 @@ class WikiHashtagsPlugin extends Plugin $name = $action->trimmed('action'); if ($name == 'tag') { - $taginput = $action->trimmed('tag'); $tag = common_canonical_tag($taginput); if (!empty($tag)) { - $url = sprintf('http://hashtags.wikia.com/index.php?title=%s&action=render', urlencode($tag)); $editurl = sprintf('http://hashtags.wikia.com/index.php?title=%s&action=edit', @@ -81,15 +78,22 @@ class WikiHashtagsPlugin extends Plugin $action->raw($html); $action->elementStart('p'); $action->element('a', array('href' => $editurl, + // TRANS: Link title for editing an article on WikiHashTags. + // TRANS: %s is the hash tag page to be edited. 'title' => sprintf(_m('Edit the article for #%s on WikiHashtags'), $tag)), + // TRANS: Link description for editing an article on WikiHashTags. _m('Edit')); $action->element('a', array('href' => 'http://www.gnu.org/copyleft/fdl.html', + // TRANS: Link title for viewing the GFDL. 'title' => _m('Shared under the terms of the GNU Free Documentation License'), 'rel' => 'license'), - 'GNU FDL'); + // TRANS: Link description for viewing the GFDL. + _m('GNU FDL')); $action->elementEnd('p'); } else { $action->element('a', array('href' => $editurl), + // TRANS: Link description for editing an article on WikiHashTags. + // TRANS: %s is the hash tag page to be created. sprintf(_m('Start the article for #%s on WikiHashtags'), $tag)); } @@ -107,6 +111,7 @@ class WikiHashtagsPlugin extends Plugin 'author' => 'Evan Prodromou', 'homepage' => 'http://status.net/wiki/Plugin:WikiHashtags', 'rawdescription' => + // TRANS: Plugin description. _m('Gets hashtag descriptions from WikiHashtags.')); return true; } diff --git a/plugins/WikiHashtags/locale/WikiHashtags.pot b/plugins/WikiHashtags/locale/WikiHashtags.pot index 56d9723384..12d1038061 100644 --- a/plugins/WikiHashtags/locale/WikiHashtags.pot +++ b/plugins/WikiHashtags/locale/WikiHashtags.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,25 +16,37 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: WikiHashtagsPlugin.php:84 +#. TRANS: Link title for editing an article on WikiHashTags. +#. TRANS: %s is the hash tag page to be edited. +#: WikiHashtagsPlugin.php:83 #, php-format msgid "Edit the article for #%s on WikiHashtags" msgstr "" +#. TRANS: Link description for editing an article on WikiHashTags. #: WikiHashtagsPlugin.php:85 msgid "Edit" msgstr "" -#: WikiHashtagsPlugin.php:87 +#. TRANS: Link title for viewing the GFDL. +#: WikiHashtagsPlugin.php:88 msgid "Shared under the terms of the GNU Free Documentation License" msgstr "" -#: WikiHashtagsPlugin.php:93 +#. TRANS: Link description for viewing the GFDL. +#: WikiHashtagsPlugin.php:91 +msgid "GNU FDL" +msgstr "" + +#. TRANS: Link description for editing an article on WikiHashTags. +#. TRANS: %s is the hash tag page to be created. +#: WikiHashtagsPlugin.php:97 #, php-format msgid "Start the article for #%s on WikiHashtags" msgstr "" -#: WikiHashtagsPlugin.php:110 +#. TRANS: Plugin description. +#: WikiHashtagsPlugin.php:115 msgid "" "Gets hashtag descriptions from WikiHashtags." diff --git a/plugins/WikiHashtags/locale/de/LC_MESSAGES/WikiHashtags.po b/plugins/WikiHashtags/locale/de/LC_MESSAGES/WikiHashtags.po index 28c90f5753..2d1b3010d8 100644 --- a/plugins/WikiHashtags/locale/de/LC_MESSAGES/WikiHashtags.po +++ b/plugins/WikiHashtags/locale/de/LC_MESSAGES/WikiHashtags.po @@ -1,6 +1,7 @@ # Translation of StatusNet - WikiHashtags to German (Deutsch) # Exported from translatewiki.net # +# Author: ChrisiPK # Author: Giftpflanze # Author: The Evil IP address # -- @@ -10,33 +11,44 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - WikiHashtags\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:51+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:27+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:31+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:53+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-wikihashtags\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Link title for editing an article on WikiHashTags. +#. TRANS: %s is the hash tag page to be edited. #, php-format msgid "Edit the article for #%s on WikiHashtags" msgstr "Bearbeite den Artikel für #%s auf WikiHashtags" +#. TRANS: Link description for editing an article on WikiHashTags. msgid "Edit" msgstr "Bearbeiten" +#. TRANS: Link title for viewing the GFDL. msgid "Shared under the terms of the GNU Free Documentation License" msgstr "" "Veröffentlicht unter den Bedingungen der GNU Free Documentation License" +#. TRANS: Link description for viewing the GFDL. +msgid "GNU FDL" +msgstr "GNU FDL" + +#. TRANS: Link description for editing an article on WikiHashTags. +#. TRANS: %s is the hash tag page to be created. #, php-format msgid "Start the article for #%s on WikiHashtags" msgstr "Beginnne den Artikel über #%s auf WikiHashtags" +#. TRANS: Plugin description. msgid "" "Gets hashtag descriptions from WikiHashtags." diff --git a/plugins/WikiHashtags/locale/es/LC_MESSAGES/WikiHashtags.po b/plugins/WikiHashtags/locale/es/LC_MESSAGES/WikiHashtags.po new file mode 100644 index 0000000000..1ad41310af --- /dev/null +++ b/plugins/WikiHashtags/locale/es/LC_MESSAGES/WikiHashtags.po @@ -0,0 +1,52 @@ +# Translation of StatusNet - WikiHashtags to Spanish (español) +# Exported from translatewiki.net +# +# Author: Armando-Martin +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - WikiHashtags\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:27+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-19 11:23:53+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Link title for editing an article on WikiHashTags. +#. TRANS: %s is the hash tag page to be edited. +#, php-format +msgid "Edit the article for #%s on WikiHashtags" +msgstr "Editar el artículo \"#%s\" en WikiHashtags" + +#. TRANS: Link description for editing an article on WikiHashTags. +msgid "Edit" +msgstr "Editar" + +#. TRANS: Link title for viewing the GFDL. +msgid "Shared under the terms of the GNU Free Documentation License" +msgstr "" +"Difundido bajo los términos de la licencia de documentación libre de GNU" + +#. TRANS: Link description for viewing the GFDL. +msgid "GNU FDL" +msgstr "GNU FDL" + +#. TRANS: Link description for editing an article on WikiHashTags. +#. TRANS: %s is the hash tag page to be created. +#, php-format +msgid "Start the article for #%s on WikiHashtags" +msgstr "Crear el artículo \"#%s\" en WikiHashtags" + +#. TRANS: Plugin description. +msgid "" +"Gets hashtag descriptions from WikiHashtags." +msgstr "" +"Obtiene las descripciones de las etiquetas desde WikiHashtags." diff --git a/plugins/WikiHashtags/locale/fr/LC_MESSAGES/WikiHashtags.po b/plugins/WikiHashtags/locale/fr/LC_MESSAGES/WikiHashtags.po index e7ac374ee2..97811a2dee 100644 --- a/plugins/WikiHashtags/locale/fr/LC_MESSAGES/WikiHashtags.po +++ b/plugins/WikiHashtags/locale/fr/LC_MESSAGES/WikiHashtags.po @@ -1,7 +1,8 @@ -# Translation of StatusNet - WikiHashtags to French (Français) +# Translation of StatusNet - WikiHashtags to French (français) # Exported from translatewiki.net # # Author: Od1n +# Author: Tititou36 # Author: Verdy p # -- # This file is distributed under the same license as the StatusNet package. @@ -10,32 +11,43 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - WikiHashtags\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:51+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:27+0000\n" "Language-Team: French \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:31+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:53+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-wikihashtags\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Link title for editing an article on WikiHashTags. +#. TRANS: %s is the hash tag page to be edited. #, php-format msgid "Edit the article for #%s on WikiHashtags" -msgstr "" +msgstr "Modifier l'article pour #%s sur WikiHashtags" +#. TRANS: Link description for editing an article on WikiHashTags. msgid "Edit" msgstr "Modifier" +#. TRANS: Link title for viewing the GFDL. msgid "Shared under the terms of the GNU Free Documentation License" -msgstr "" +msgstr "Partagé selon les termes de la license GNU Free Documentation" +#. TRANS: Link description for viewing the GFDL. +msgid "GNU FDL" +msgstr "GNU FDL" + +#. TRANS: Link description for editing an article on WikiHashTags. +#. TRANS: %s is the hash tag page to be created. #, php-format msgid "Start the article for #%s on WikiHashtags" -msgstr "" +msgstr "Débuter l'article pour #%s sur WikiHashtags" +#. TRANS: Plugin description. msgid "" "Gets hashtag descriptions from WikiHashtags." diff --git a/plugins/WikiHashtags/locale/gl/LC_MESSAGES/WikiHashtags.po b/plugins/WikiHashtags/locale/gl/LC_MESSAGES/WikiHashtags.po new file mode 100644 index 0000000000..64e18185e4 --- /dev/null +++ b/plugins/WikiHashtags/locale/gl/LC_MESSAGES/WikiHashtags.po @@ -0,0 +1,54 @@ +# Translation of StatusNet - WikiHashtags to Galician (galego) +# Exported from translatewiki.net +# +# Author: Toliño +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - WikiHashtags\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:27+0000\n" +"Language-Team: Galician \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-19 11:23:53+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: gl\n" +"X-Message-Group: #out-statusnet-plugin-wikihashtags\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Link title for editing an article on WikiHashTags. +#. TRANS: %s is the hash tag page to be edited. +#, php-format +msgid "Edit the article for #%s on WikiHashtags" +msgstr "Editar o artigo \"#%s\" en WikiHashtags" + +#. TRANS: Link description for editing an article on WikiHashTags. +msgid "Edit" +msgstr "Editar" + +#. TRANS: Link title for viewing the GFDL. +msgid "Shared under the terms of the GNU Free Documentation License" +msgstr "Difundido baixo os termos da licenza de documentación libre de GNU" + +#. TRANS: Link description for viewing the GFDL. +msgid "GNU FDL" +msgstr "GNU FDL" + +#. TRANS: Link description for editing an article on WikiHashTags. +#. TRANS: %s is the hash tag page to be created. +#, php-format +msgid "Start the article for #%s on WikiHashtags" +msgstr "Crear o artigo \"#%s\" en WikiHashtags" + +#. TRANS: Plugin description. +msgid "" +"Gets hashtag descriptions from WikiHashtags." +msgstr "" +"Obtén as descricións das etiquetas desde WikiHashtags." diff --git a/plugins/WikiHashtags/locale/ia/LC_MESSAGES/WikiHashtags.po b/plugins/WikiHashtags/locale/ia/LC_MESSAGES/WikiHashtags.po index 34ef59378b..71c822fb0c 100644 --- a/plugins/WikiHashtags/locale/ia/LC_MESSAGES/WikiHashtags.po +++ b/plugins/WikiHashtags/locale/ia/LC_MESSAGES/WikiHashtags.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - WikiHashtags to Interlingua (Interlingua) +# Translation of StatusNet - WikiHashtags to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,33 +9,44 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - WikiHashtags\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:51+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:27+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:31+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:53+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-wikihashtags\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Link title for editing an article on WikiHashTags. +#. TRANS: %s is the hash tag page to be edited. #, php-format msgid "Edit the article for #%s on WikiHashtags" msgstr "Modificar le articulo pro #%s in WikiHashtags" +#. TRANS: Link description for editing an article on WikiHashTags. msgid "Edit" msgstr "Modificar" +#. TRANS: Link title for viewing the GFDL. msgid "Shared under the terms of the GNU Free Documentation License" msgstr "" "Diffundite sub le conditiones del Licentia GNU pro Documentation Libere" +#. TRANS: Link description for viewing the GFDL. +msgid "GNU FDL" +msgstr "GNU FDL" + +#. TRANS: Link description for editing an article on WikiHashTags. +#. TRANS: %s is the hash tag page to be created. #, php-format msgid "Start the article for #%s on WikiHashtags" msgstr "Crear le articulo pro #%s in WikiHashtags" +#. TRANS: Plugin description. msgid "" "Gets hashtag descriptions from WikiHashtags." diff --git a/plugins/WikiHashtags/locale/mk/LC_MESSAGES/WikiHashtags.po b/plugins/WikiHashtags/locale/mk/LC_MESSAGES/WikiHashtags.po index abacfb00ee..447a91c1f6 100644 --- a/plugins/WikiHashtags/locale/mk/LC_MESSAGES/WikiHashtags.po +++ b/plugins/WikiHashtags/locale/mk/LC_MESSAGES/WikiHashtags.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - WikiHashtags to Macedonian (МакедонÑки) +# Translation of StatusNet - WikiHashtags to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 @@ -9,34 +9,45 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - WikiHashtags\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:51+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:27+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:31+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:53+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-wikihashtags\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" +#. TRANS: Link title for editing an article on WikiHashTags. +#. TRANS: %s is the hash tag page to be edited. #, php-format msgid "Edit the article for #%s on WikiHashtags" msgstr "Уредете ја Ñтатијата за #%s на WikiHashtags" +#. TRANS: Link description for editing an article on WikiHashTags. msgid "Edit" msgstr "Уреди" +#. TRANS: Link title for viewing the GFDL. msgid "Shared under the terms of the GNU Free Documentation License" msgstr "" "Споделувањето подлежи на уÑловите на ГÐУ-овата лиценца за Ñлободна " "документација" +#. TRANS: Link description for viewing the GFDL. +msgid "GNU FDL" +msgstr "GNU FDL" + +#. TRANS: Link description for editing an article on WikiHashTags. +#. TRANS: %s is the hash tag page to be created. #, php-format msgid "Start the article for #%s on WikiHashtags" msgstr "Започнете ја Ñтатијата за #%s на WikiHashtags" +#. TRANS: Plugin description. msgid "" "Gets hashtag descriptions from WikiHashtags." diff --git a/plugins/WikiHashtags/locale/ms/LC_MESSAGES/WikiHashtags.po b/plugins/WikiHashtags/locale/ms/LC_MESSAGES/WikiHashtags.po index 41ae3f613d..33d9ec6621 100644 --- a/plugins/WikiHashtags/locale/ms/LC_MESSAGES/WikiHashtags.po +++ b/plugins/WikiHashtags/locale/ms/LC_MESSAGES/WikiHashtags.po @@ -9,32 +9,43 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - WikiHashtags\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:51+0000\n" -"Language-Team: Malay \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:27+0000\n" +"Language-Team: Malay \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:31+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:53+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ms\n" "X-Message-Group: #out-statusnet-plugin-wikihashtags\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Link title for editing an article on WikiHashTags. +#. TRANS: %s is the hash tag page to be edited. #, php-format msgid "Edit the article for #%s on WikiHashtags" msgstr "Sunting rencana untuk #%s di WikiHashtags" +#. TRANS: Link description for editing an article on WikiHashTags. msgid "Edit" msgstr "Sunting" +#. TRANS: Link title for viewing the GFDL. msgid "Shared under the terms of the GNU Free Documentation License" msgstr "Dikongsikan di bawah terma-terma Lesen Dokumentasi Bebas GNU" +#. TRANS: Link description for viewing the GFDL. +msgid "GNU FDL" +msgstr "" + +#. TRANS: Link description for editing an article on WikiHashTags. +#. TRANS: %s is the hash tag page to be created. #, php-format msgid "Start the article for #%s on WikiHashtags" msgstr "Cipta rencana untuk #%s di WikiHashtags" +#. TRANS: Plugin description. msgid "" "Gets hashtag descriptions from WikiHashtags." diff --git a/plugins/WikiHashtags/locale/nl/LC_MESSAGES/WikiHashtags.po b/plugins/WikiHashtags/locale/nl/LC_MESSAGES/WikiHashtags.po index 063e24ace7..251bf48a26 100644 --- a/plugins/WikiHashtags/locale/nl/LC_MESSAGES/WikiHashtags.po +++ b/plugins/WikiHashtags/locale/nl/LC_MESSAGES/WikiHashtags.po @@ -9,32 +9,43 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - WikiHashtags\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:51+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:27+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:31+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:53+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-wikihashtags\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Link title for editing an article on WikiHashTags. +#. TRANS: %s is the hash tag page to be edited. #, php-format msgid "Edit the article for #%s on WikiHashtags" msgstr "Het artikel voor #%s op WikiHashtags bewerken" +#. TRANS: Link description for editing an article on WikiHashTags. msgid "Edit" msgstr "Bewerken" +#. TRANS: Link title for viewing the GFDL. msgid "Shared under the terms of the GNU Free Documentation License" msgstr "Gedeeld onder de voorwaarden van de GNU Free Documentation License" +#. TRANS: Link description for viewing the GFDL. +msgid "GNU FDL" +msgstr "GNU FDL" + +#. TRANS: Link description for editing an article on WikiHashTags. +#. TRANS: %s is the hash tag page to be created. #, php-format msgid "Start the article for #%s on WikiHashtags" msgstr "Het artikel voor #%s op WikiHashtags aanmaken" +#. TRANS: Plugin description. msgid "" "Gets hashtag descriptions from WikiHashtags." diff --git a/plugins/WikiHashtags/locale/tl/LC_MESSAGES/WikiHashtags.po b/plugins/WikiHashtags/locale/tl/LC_MESSAGES/WikiHashtags.po index 9a0e37e92a..8783fc22ed 100644 --- a/plugins/WikiHashtags/locale/tl/LC_MESSAGES/WikiHashtags.po +++ b/plugins/WikiHashtags/locale/tl/LC_MESSAGES/WikiHashtags.po @@ -9,34 +9,45 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - WikiHashtags\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:52+0000\n" -"Language-Team: Tagalog \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:27+0000\n" +"Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:31+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:53+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-wikihashtags\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Link title for editing an article on WikiHashTags. +#. TRANS: %s is the hash tag page to be edited. #, php-format msgid "Edit the article for #%s on WikiHashtags" msgstr "Baguhin ang artikulo para sa #%s na nasa WikiHashtags" +#. TRANS: Link description for editing an article on WikiHashTags. msgid "Edit" msgstr "Baguhin" +#. TRANS: Link title for viewing the GFDL. msgid "Shared under the terms of the GNU Free Documentation License" msgstr "" "Ibinabahagi sa ilalim ng mga pagsasaad ng Lisensiya ng Malayang " "Dokumentasyon ng GNU" +#. TRANS: Link description for viewing the GFDL. +msgid "GNU FDL" +msgstr "GNU FDL" + +#. TRANS: Link description for editing an article on WikiHashTags. +#. TRANS: %s is the hash tag page to be created. #, php-format msgid "Start the article for #%s on WikiHashtags" msgstr "Simulan ang artikulo para sa #%s na nasa WikiHashtags" +#. TRANS: Plugin description. msgid "" "Gets hashtag descriptions from WikiHashtags." diff --git a/plugins/WikiHashtags/locale/uk/LC_MESSAGES/WikiHashtags.po b/plugins/WikiHashtags/locale/uk/LC_MESSAGES/WikiHashtags.po index 48d0c29027..a7b823d897 100644 --- a/plugins/WikiHashtags/locale/uk/LC_MESSAGES/WikiHashtags.po +++ b/plugins/WikiHashtags/locale/uk/LC_MESSAGES/WikiHashtags.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - WikiHashtags to Ukrainian (УкраїнÑька) +# Translation of StatusNet - WikiHashtags to Ukrainian (українÑька) # Exported from translatewiki.net # # Author: Boogie @@ -9,33 +9,44 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - WikiHashtags\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:52+0000\n" -"Language-Team: Ukrainian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:28+0000\n" +"Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:31+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:53+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-wikihashtags\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Link title for editing an article on WikiHashTags. +#. TRANS: %s is the hash tag page to be edited. #, php-format msgid "Edit the article for #%s on WikiHashtags" msgstr "Редагувати Ñтаттю про #%s на WikiHashtags" +#. TRANS: Link description for editing an article on WikiHashTags. msgid "Edit" msgstr "Змінити" +#. TRANS: Link title for viewing the GFDL. msgid "Shared under the terms of the GNU Free Documentation License" msgstr "РозміщуєтьÑÑ Ð½Ð° умовах GNU Free Documentation License" +#. TRANS: Link description for viewing the GFDL. +msgid "GNU FDL" +msgstr "" + +#. TRANS: Link description for editing an article on WikiHashTags. +#. TRANS: %s is the hash tag page to be created. #, php-format msgid "Start the article for #%s on WikiHashtags" msgstr "Почати нову Ñтаттю про #%s на WikiHashtags" +#. TRANS: Plugin description. msgid "" "Gets hashtag descriptions from WikiHashtags." diff --git a/plugins/WikiHowProfile/WikiHowProfilePlugin.php b/plugins/WikiHowProfile/WikiHowProfilePlugin.php index 753dff5a37..3532ca5987 100644 --- a/plugins/WikiHowProfile/WikiHowProfilePlugin.php +++ b/plugins/WikiHowProfile/WikiHowProfilePlugin.php @@ -56,6 +56,7 @@ class WikiHowProfilePlugin extends Plugin 'author' => 'Brion Vibber', 'homepage' => 'http://status.net/wiki/Plugin:Sample', 'rawdescription' => + // TRANS: Plugin description. _m('Fetches avatar and other profile information for WikiHow users when setting up an account via OpenID.')); return true; } @@ -121,7 +122,8 @@ class WikiHowProfilePlugin extends Plugin $client = HTTPClient::start(); $response = $client->get($profileUrl); if (!$response->isOk()) { - throw new Exception("WikiHow profile page fetch failed."); + // TRANS: Exception thrown when fetching a WikiHow profile page fails. + throw new Exception(_m('WikiHow profile page fetch failed.')); // HTTP error response already logged. return false; } @@ -137,7 +139,8 @@ class WikiHowProfilePlugin extends Plugin error_reporting($old); if (!$ok) { - throw new Exception("HTML parse failure during check for WikiHow avatar."); + // TRANS: Exception thrown when parsing a WikiHow profile page fails. + throw new Exception(_m('HTML parse failure during check for WikiHow avatar.')); return false; } @@ -168,15 +171,19 @@ class WikiHowProfilePlugin extends Plugin private function saveAvatar($user, $url) { if (!common_valid_http_url($url)) { - throw new ServerException(sprintf(_m("Invalid avatar URL %s."), $url)); + // TRANS: Server exception thrown when an avatar URL is invalid. + // TRANS: %s is the invalid avatar URL. + throw new ServerException(sprintf(_m('Invalid avatar URL %s.'), $url)); } - // @fixme this should be better encapsulated + // @todo FIXME: This should be better encapsulated // ripped from OStatus via oauthstore.php (for old OMB client) $temp_filename = tempnam(sys_get_temp_dir(), 'listener_avatar'); try { if (!copy($url, $temp_filename)) { - throw new ServerException(sprintf(_m("Unable to fetch avatar from %s."), $url)); + // TRANS: Exception thrown when fetching an avatar from a URL fails. + // TRANS: %s is a URL. + throw new ServerException(sprintf(_m('Unable to fetch avatar from %s.'), $url)); } $profile = $user->getProfile(); diff --git a/plugins/WikiHowProfile/locale/WikiHowProfile.pot b/plugins/WikiHowProfile/locale/WikiHowProfile.pot index e19d05aacb..dde5c971a1 100644 --- a/plugins/WikiHowProfile/locale/WikiHowProfile.pot +++ b/plugins/WikiHowProfile/locale/WikiHowProfile.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,18 +16,33 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: WikiHowProfilePlugin.php:59 +#. TRANS: Plugin description. +#: WikiHowProfilePlugin.php:60 msgid "" "Fetches avatar and other profile information for WikiHow users when setting " "up an account via OpenID." msgstr "" -#: WikiHowProfilePlugin.php:171 +#. TRANS: Exception thrown when fetching a WikiHow profile page fails. +#: WikiHowProfilePlugin.php:126 +msgid "WikiHow profile page fetch failed." +msgstr "" + +#. TRANS: Exception thrown when parsing a WikiHow profile page fails. +#: WikiHowProfilePlugin.php:143 +msgid "HTML parse failure during check for WikiHow avatar." +msgstr "" + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. +#: WikiHowProfilePlugin.php:176 #, php-format msgid "Invalid avatar URL %s." msgstr "" -#: WikiHowProfilePlugin.php:179 +#. TRANS: Exception thrown when fetching an avatar from a URL fails. +#. TRANS: %s is a URL. +#: WikiHowProfilePlugin.php:186 #, php-format msgid "Unable to fetch avatar from %s." msgstr "" diff --git a/plugins/WikiHowProfile/locale/de/LC_MESSAGES/WikiHowProfile.po b/plugins/WikiHowProfile/locale/de/LC_MESSAGES/WikiHowProfile.po index de4c8ea6cf..ed9ee97e65 100644 --- a/plugins/WikiHowProfile/locale/de/LC_MESSAGES/WikiHowProfile.po +++ b/plugins/WikiHowProfile/locale/de/LC_MESSAGES/WikiHowProfile.po @@ -1,6 +1,7 @@ # Translation of StatusNet - WikiHowProfile to German (Deutsch) # Exported from translatewiki.net # +# Author: ChrisiPK # Author: Giftpflanze # -- # This file is distributed under the same license as the StatusNet package. @@ -9,18 +10,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - WikiHowProfile\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:52+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:28+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:54+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:54+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-wikihowprofile\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "Fetches avatar and other profile information for WikiHow users when setting " "up an account via OpenID." @@ -28,10 +30,22 @@ msgstr "" "Holt Avatar- und andere Profilinformationen für WikiHow-Benutzer beim " "Aufsetzen eines Kontos über OpenID." +#. TRANS: Exception thrown when fetching a WikiHow profile page fails. +msgid "WikiHow profile page fetch failed." +msgstr "Laden des WikiHow-Profils fehlgeschlagen." + +#. TRANS: Exception thrown when parsing a WikiHow profile page fails. +msgid "HTML parse failure during check for WikiHow avatar." +msgstr "HTML-Parsingfehler bei der Suche des WikiHow-Avatars." + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. #, php-format msgid "Invalid avatar URL %s." msgstr "Ungültige Avatar-URL %s." +#. TRANS: Exception thrown when fetching an avatar from a URL fails. +#. TRANS: %s is a URL. #, php-format msgid "Unable to fetch avatar from %s." msgstr "Kann Avatar nicht von %s holen." diff --git a/plugins/WikiHowProfile/locale/es/LC_MESSAGES/WikiHowProfile.po b/plugins/WikiHowProfile/locale/es/LC_MESSAGES/WikiHowProfile.po new file mode 100644 index 0000000000..53b28d7b83 --- /dev/null +++ b/plugins/WikiHowProfile/locale/es/LC_MESSAGES/WikiHowProfile.po @@ -0,0 +1,49 @@ +# Translation of StatusNet - WikiHowProfile to Spanish (español) +# Exported from translatewiki.net +# +# Author: Armando-Martin +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - WikiHowProfile\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:28+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-19 11:23:54+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin description. +msgid "" +"Fetches avatar and other profile information for WikiHow users when setting " +"up an account via OpenID." +msgstr "" +"Recupera el avatar y otra información de perfil para los usuarios de WikiHow " +"al crear una cuenta mediante OpenID." + +#. TRANS: Exception thrown when fetching a WikiHow profile page fails. +msgid "WikiHow profile page fetch failed." +msgstr "Error al recuperar la página de perfil de WikiHow." + +#. TRANS: Exception thrown when parsing a WikiHow profile page fails. +msgid "HTML parse failure during check for WikiHow avatar." +msgstr "" +"Error de interpretación de HTML durante la comprobación del avatar de " +"WikiHow." + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. +#, php-format +msgid "Invalid avatar URL %s." +msgstr "La dirección URL del avatar, %s, es incorrecta." + +#. TRANS: Exception thrown when fetching an avatar from a URL fails. +#. TRANS: %s is a URL. +#, php-format +msgid "Unable to fetch avatar from %s." +msgstr "No se pudo recuperar el avatar desde %s." diff --git a/plugins/WikiHowProfile/locale/eu/LC_MESSAGES/WikiHowProfile.po b/plugins/WikiHowProfile/locale/eu/LC_MESSAGES/WikiHowProfile.po new file mode 100644 index 0000000000..de9e733cfd --- /dev/null +++ b/plugins/WikiHowProfile/locale/eu/LC_MESSAGES/WikiHowProfile.po @@ -0,0 +1,45 @@ +# Translation of StatusNet - WikiHowProfile to Basque (euskara) +# Exported from translatewiki.net +# +# Author: Artsuaga +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - WikiHowProfile\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:28+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-19 11:23:54+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin description. +msgid "" +"Fetches avatar and other profile information for WikiHow users when setting " +"up an account via OpenID." +msgstr "" + +#. TRANS: Exception thrown when fetching a WikiHow profile page fails. +msgid "WikiHow profile page fetch failed." +msgstr "" + +#. TRANS: Exception thrown when parsing a WikiHow profile page fails. +msgid "HTML parse failure during check for WikiHow avatar." +msgstr "" + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. +#, php-format +msgid "Invalid avatar URL %s." +msgstr "Abatarraren %s URL helbidea okerra da." + +#. TRANS: Exception thrown when fetching an avatar from a URL fails. +#. TRANS: %s is a URL. +#, php-format +msgid "Unable to fetch avatar from %s." +msgstr "Ezin izan da abatarra lortu %s helbidetik." diff --git a/plugins/WikiHowProfile/locale/fr/LC_MESSAGES/WikiHowProfile.po b/plugins/WikiHowProfile/locale/fr/LC_MESSAGES/WikiHowProfile.po index dc6ec4d175..68da2c97b6 100644 --- a/plugins/WikiHowProfile/locale/fr/LC_MESSAGES/WikiHowProfile.po +++ b/plugins/WikiHowProfile/locale/fr/LC_MESSAGES/WikiHowProfile.po @@ -1,6 +1,7 @@ -# Translation of StatusNet - WikiHowProfile to French (Français) +# Translation of StatusNet - WikiHowProfile to French (français) # Exported from translatewiki.net # +# Author: DavidL # Author: Verdy p # -- # This file is distributed under the same license as the StatusNet package. @@ -9,18 +10,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - WikiHowProfile\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:52+0000\n" -"Language-Team: French \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:28+0000\n" +"Language-Team: French \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:54+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:54+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-wikihowprofile\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Plugin description. msgid "" "Fetches avatar and other profile information for WikiHow users when setting " "up an account via OpenID." @@ -28,10 +30,23 @@ msgstr "" "Récupère l’avatar et les autres informations de profil des utilisateurs " "WikiHow lorsqu’ils créent un compte via OpenID." +#. TRANS: Exception thrown when fetching a WikiHow profile page fails. +msgid "WikiHow profile page fetch failed." +msgstr "La recherche de la page de profile WikiHow a échoué." + +#. TRANS: Exception thrown when parsing a WikiHow profile page fails. +msgid "HTML parse failure during check for WikiHow avatar." +msgstr "" +"Échec de l'interprétation HTML durant la vérification de l'avatar WikiHow." + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. #, php-format msgid "Invalid avatar URL %s." msgstr "Adresse URL d’avatar « %s » invalide." +#. TRANS: Exception thrown when fetching an avatar from a URL fails. +#. TRANS: %s is a URL. #, php-format msgid "Unable to fetch avatar from %s." msgstr "Impossible de récupérer l’avatar depuis « %s »." diff --git a/plugins/WikiHowProfile/locale/gl/LC_MESSAGES/WikiHowProfile.po b/plugins/WikiHowProfile/locale/gl/LC_MESSAGES/WikiHowProfile.po new file mode 100644 index 0000000000..e82481d403 --- /dev/null +++ b/plugins/WikiHowProfile/locale/gl/LC_MESSAGES/WikiHowProfile.po @@ -0,0 +1,50 @@ +# Translation of StatusNet - WikiHowProfile to Galician (galego) +# Exported from translatewiki.net +# +# Author: Toliño +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - WikiHowProfile\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:28+0000\n" +"Language-Team: Galician \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-19 11:23:54+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: gl\n" +"X-Message-Group: #out-statusnet-plugin-wikihowprofile\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin description. +msgid "" +"Fetches avatar and other profile information for WikiHow users when setting " +"up an account via OpenID." +msgstr "" +"Recupera o avatar e outra información de perfil para os usuarios de WikiHow " +"ao crear unha conta mediante o OpenID." + +#. TRANS: Exception thrown when fetching a WikiHow profile page fails. +msgid "WikiHow profile page fetch failed." +msgstr "Erro ao recuperar a páxina de perfil WikiHow." + +#. TRANS: Exception thrown when parsing a WikiHow profile page fails. +msgid "HTML parse failure during check for WikiHow avatar." +msgstr "Erro de interpretación HTML durante a comprobación do avatar WikiHow." + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. +#, php-format +msgid "Invalid avatar URL %s." +msgstr "O enderezo URL do avatar, %s, é incorrecto." + +#. TRANS: Exception thrown when fetching an avatar from a URL fails. +#. TRANS: %s is a URL. +#, php-format +msgid "Unable to fetch avatar from %s." +msgstr "Non se puido recuperar o avatar desde %s." diff --git a/plugins/WikiHowProfile/locale/ia/LC_MESSAGES/WikiHowProfile.po b/plugins/WikiHowProfile/locale/ia/LC_MESSAGES/WikiHowProfile.po index c7ac0bca31..02aaf92a4f 100644 --- a/plugins/WikiHowProfile/locale/ia/LC_MESSAGES/WikiHowProfile.po +++ b/plugins/WikiHowProfile/locale/ia/LC_MESSAGES/WikiHowProfile.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - WikiHowProfile to Interlingua (Interlingua) +# Translation of StatusNet - WikiHowProfile to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - WikiHowProfile\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:52+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:28+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:54+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:54+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-wikihowprofile\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "Fetches avatar and other profile information for WikiHow users when setting " "up an account via OpenID." @@ -28,10 +29,24 @@ msgstr "" "Obtene le avatar e altere informationes de profilo pro usatores de WikiHow " "durante le creation de un conto via OpenID." +#. TRANS: Exception thrown when fetching a WikiHow profile page fails. +msgid "WikiHow profile page fetch failed." +msgstr "Le obtention del pagina de profilo de WikiHow ha fallite." + +#. TRANS: Exception thrown when parsing a WikiHow profile page fails. +msgid "HTML parse failure during check for WikiHow avatar." +msgstr "" +"Problema de interpretar le HTML durante le verification del presentia de un " +"avatar de WikiHow." + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. #, php-format msgid "Invalid avatar URL %s." msgstr "URL de avatar %s invalide." +#. TRANS: Exception thrown when fetching an avatar from a URL fails. +#. TRANS: %s is a URL. #, php-format msgid "Unable to fetch avatar from %s." msgstr "Incapace de obtener avatar ab %s." diff --git a/plugins/WikiHowProfile/locale/mk/LC_MESSAGES/WikiHowProfile.po b/plugins/WikiHowProfile/locale/mk/LC_MESSAGES/WikiHowProfile.po index f39518e88b..bd70918deb 100644 --- a/plugins/WikiHowProfile/locale/mk/LC_MESSAGES/WikiHowProfile.po +++ b/plugins/WikiHowProfile/locale/mk/LC_MESSAGES/WikiHowProfile.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - WikiHowProfile to Macedonian (МакедонÑки) +# Translation of StatusNet - WikiHowProfile to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - WikiHowProfile\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:52+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:28+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:54+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:54+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-wikihowprofile\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" +#. TRANS: Plugin description. msgid "" "Fetches avatar and other profile information for WikiHow users when setting " "up an account via OpenID." @@ -28,10 +29,22 @@ msgstr "" "Презема аватар и други профилни податоци за кориÑници на WikiHow при " "Ñоздавање на Ñметка преку OpenID." +#. TRANS: Exception thrown when fetching a WikiHow profile page fails. +msgid "WikiHow profile page fetch failed." +msgstr "Ðе уÑпеав да ја добијам профилната Ñтраница од WikiHow." + +#. TRANS: Exception thrown when parsing a WikiHow profile page fails. +msgid "HTML parse failure during check for WikiHow avatar." +msgstr "Ðе уÑпеа парÑирањето на HTML при проверката на аватар од WikiHow." + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. #, php-format msgid "Invalid avatar URL %s." msgstr "Ðеважечка URL-адреÑа на аватарот: %s." +#. TRANS: Exception thrown when fetching an avatar from a URL fails. +#. TRANS: %s is a URL. #, php-format msgid "Unable to fetch avatar from %s." msgstr "Ðе можев да го преземам аватарот од %s." diff --git a/plugins/WikiHowProfile/locale/ms/LC_MESSAGES/WikiHowProfile.po b/plugins/WikiHowProfile/locale/ms/LC_MESSAGES/WikiHowProfile.po index 6ff9373944..717ca0a841 100644 --- a/plugins/WikiHowProfile/locale/ms/LC_MESSAGES/WikiHowProfile.po +++ b/plugins/WikiHowProfile/locale/ms/LC_MESSAGES/WikiHowProfile.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - WikiHowProfile\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:52+0000\n" -"Language-Team: Malay \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:28+0000\n" +"Language-Team: Malay \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:54+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:54+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ms\n" "X-Message-Group: #out-statusnet-plugin-wikihowprofile\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Plugin description. msgid "" "Fetches avatar and other profile information for WikiHow users when setting " "up an account via OpenID." @@ -28,10 +29,22 @@ msgstr "" "Mengambil avatar dan maklumat profil yang lain untuk pengguna WikiHow " "apabila membuka akaun melalui OpenID." +#. TRANS: Exception thrown when fetching a WikiHow profile page fails. +msgid "WikiHow profile page fetch failed." +msgstr "" + +#. TRANS: Exception thrown when parsing a WikiHow profile page fails. +msgid "HTML parse failure during check for WikiHow avatar." +msgstr "" + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. #, php-format msgid "Invalid avatar URL %s." msgstr "URL avatar %s tidak sah." +#. TRANS: Exception thrown when fetching an avatar from a URL fails. +#. TRANS: %s is a URL. #, php-format msgid "Unable to fetch avatar from %s." msgstr "Avatar tidak dapat diambil dari %s." diff --git a/plugins/WikiHowProfile/locale/nl/LC_MESSAGES/WikiHowProfile.po b/plugins/WikiHowProfile/locale/nl/LC_MESSAGES/WikiHowProfile.po index 76f1f89048..34ded405c9 100644 --- a/plugins/WikiHowProfile/locale/nl/LC_MESSAGES/WikiHowProfile.po +++ b/plugins/WikiHowProfile/locale/nl/LC_MESSAGES/WikiHowProfile.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - WikiHowProfile\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:53+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:29+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:54+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:54+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-wikihowprofile\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "Fetches avatar and other profile information for WikiHow users when setting " "up an account via OpenID." @@ -28,10 +29,24 @@ msgstr "" "Haalt avatar- en andere gegevens op voor WikiHow-gebruikers die een " "gebruiker aanmaken via OpenID." +#. TRANS: Exception thrown when fetching a WikiHow profile page fails. +msgid "WikiHow profile page fetch failed." +msgstr "Het ophalen van de profielpagina van WikiHow is mislukt." + +#. TRANS: Exception thrown when parsing a WikiHow profile page fails. +msgid "HTML parse failure during check for WikiHow avatar." +msgstr "" +"Het verwerken van de HTML is mislukt tijdens het controleren op de WikiHow-" +"avatar." + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. #, php-format msgid "Invalid avatar URL %s." msgstr "Ongeldige avatar-URL %s." +#. TRANS: Exception thrown when fetching an avatar from a URL fails. +#. TRANS: %s is a URL. #, php-format msgid "Unable to fetch avatar from %s." msgstr "Het was niet mogelijk om de avatar op te halen van %s." diff --git a/plugins/WikiHowProfile/locale/ru/LC_MESSAGES/WikiHowProfile.po b/plugins/WikiHowProfile/locale/ru/LC_MESSAGES/WikiHowProfile.po index ffbc7f2cfb..d6dd07e9d7 100644 --- a/plugins/WikiHowProfile/locale/ru/LC_MESSAGES/WikiHowProfile.po +++ b/plugins/WikiHowProfile/locale/ru/LC_MESSAGES/WikiHowProfile.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - WikiHowProfile to Russian (РуÑÑкий) +# Translation of StatusNet - WikiHowProfile to Russian (руÑÑкий) # Exported from translatewiki.net # # Author: Lockal @@ -9,19 +9,20 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - WikiHowProfile\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:53+0000\n" -"Language-Team: Russian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:29+0000\n" +"Language-Team: Russian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:54+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:54+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ru\n" "X-Message-Group: #out-statusnet-plugin-wikihowprofile\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Plugin description. msgid "" "Fetches avatar and other profile information for WikiHow users when setting " "up an account via OpenID." @@ -29,10 +30,22 @@ msgstr "" "Запрашивает аватару и прочую информацию из Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ WikiHow при " "Ñоздании учётной запиÑи Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ OpenID." +#. TRANS: Exception thrown when fetching a WikiHow profile page fails. +msgid "WikiHow profile page fetch failed." +msgstr "" + +#. TRANS: Exception thrown when parsing a WikiHow profile page fails. +msgid "HTML parse failure during check for WikiHow avatar." +msgstr "" + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. #, php-format msgid "Invalid avatar URL %s." msgstr "Ðеверный URL-Ð°Ð´Ñ€ÐµÑ Ð°Ð²Ð°Ñ‚Ð°Ñ€Ñ‹ %s" +#. TRANS: Exception thrown when fetching an avatar from a URL fails. +#. TRANS: %s is a URL. #, php-format msgid "Unable to fetch avatar from %s." msgstr "Ðе удаётÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ аватару из %s." diff --git a/plugins/WikiHowProfile/locale/tl/LC_MESSAGES/WikiHowProfile.po b/plugins/WikiHowProfile/locale/tl/LC_MESSAGES/WikiHowProfile.po index 0f79d00bd9..6b74926cfc 100644 --- a/plugins/WikiHowProfile/locale/tl/LC_MESSAGES/WikiHowProfile.po +++ b/plugins/WikiHowProfile/locale/tl/LC_MESSAGES/WikiHowProfile.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - WikiHowProfile\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:53+0000\n" -"Language-Team: Tagalog \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:29+0000\n" +"Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:54+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:54+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-wikihowprofile\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "Fetches avatar and other profile information for WikiHow users when setting " "up an account via OpenID." @@ -28,10 +29,22 @@ msgstr "" "Dumarampot ng abatar at ibang kabatiran ng balangkas para sa mga tagagamit " "ng WikiHow kapag nagtatalaga ng isang akawnt sa pamamagitan ng OpenID." +#. TRANS: Exception thrown when fetching a WikiHow profile page fails. +msgid "WikiHow profile page fetch failed." +msgstr "Nabigo ang pagsalok sa pahina ng balangkas ng WikiHow." + +#. TRANS: Exception thrown when parsing a WikiHow profile page fails. +msgid "HTML parse failure during check for WikiHow avatar." +msgstr "Kabiguan ng parse ng HTML habang sinusuri para sa abatar ng WikiHow." + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. #, php-format msgid "Invalid avatar URL %s." msgstr "Hindi tanggap na URL ng abatar ang %s." +#. TRANS: Exception thrown when fetching an avatar from a URL fails. +#. TRANS: %s is a URL. #, php-format msgid "Unable to fetch avatar from %s." msgstr "Hindi nagawang damputin ang huwaran mula sa %s." diff --git a/plugins/WikiHowProfile/locale/tr/LC_MESSAGES/WikiHowProfile.po b/plugins/WikiHowProfile/locale/tr/LC_MESSAGES/WikiHowProfile.po index 96617aeae9..99fd3f9a92 100644 --- a/plugins/WikiHowProfile/locale/tr/LC_MESSAGES/WikiHowProfile.po +++ b/plugins/WikiHowProfile/locale/tr/LC_MESSAGES/WikiHowProfile.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - WikiHowProfile\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:53+0000\n" -"Language-Team: Turkish \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:29+0000\n" +"Language-Team: Turkish \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:54+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:54+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tr\n" "X-Message-Group: #out-statusnet-plugin-wikihowprofile\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Plugin description. msgid "" "Fetches avatar and other profile information for WikiHow users when setting " "up an account via OpenID." @@ -28,10 +29,22 @@ msgstr "" "OpenID aracılığıyla hesap oluÅŸturan WikiHow kullanıcıları için kullanıcı " "resimlerini ve diÄŸer profil bilgilerini alır." +#. TRANS: Exception thrown when fetching a WikiHow profile page fails. +msgid "WikiHow profile page fetch failed." +msgstr "" + +#. TRANS: Exception thrown when parsing a WikiHow profile page fails. +msgid "HTML parse failure during check for WikiHow avatar." +msgstr "" + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. #, php-format msgid "Invalid avatar URL %s." msgstr "Geçersiz kullanıcı resmi baÄŸlantısı %s." +#. TRANS: Exception thrown when fetching an avatar from a URL fails. +#. TRANS: %s is a URL. #, php-format msgid "Unable to fetch avatar from %s." msgstr "%s'ten kullanıcı resmi alınamıyor." diff --git a/plugins/WikiHowProfile/locale/uk/LC_MESSAGES/WikiHowProfile.po b/plugins/WikiHowProfile/locale/uk/LC_MESSAGES/WikiHowProfile.po index 9db7d32301..d63f01d958 100644 --- a/plugins/WikiHowProfile/locale/uk/LC_MESSAGES/WikiHowProfile.po +++ b/plugins/WikiHowProfile/locale/uk/LC_MESSAGES/WikiHowProfile.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - WikiHowProfile to Ukrainian (УкраїнÑька) +# Translation of StatusNet - WikiHowProfile to Ukrainian (українÑька) # Exported from translatewiki.net # # Author: Boogie @@ -9,19 +9,20 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - WikiHowProfile\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:53+0000\n" -"Language-Team: Ukrainian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:29+0000\n" +"Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:54+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:54+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-wikihowprofile\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Plugin description. msgid "" "Fetches avatar and other profile information for WikiHow users when setting " "up an account via OpenID." @@ -29,10 +30,22 @@ msgstr "" "Запитує аватар та іншу Ñупутню інформацію з WikiHow Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувачів, котрі " "Ñтворюють акаунти через OpenID." +#. TRANS: Exception thrown when fetching a WikiHow profile page fails. +msgid "WikiHow profile page fetch failed." +msgstr "" + +#. TRANS: Exception thrown when parsing a WikiHow profile page fails. +msgid "HTML parse failure during check for WikiHow avatar." +msgstr "" + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. #, php-format msgid "Invalid avatar URL %s." msgstr "Ðевірна URL-адреÑа аватари %s." +#. TRANS: Exception thrown when fetching an avatar from a URL fails. +#. TRANS: %s is a URL. #, php-format msgid "Unable to fetch avatar from %s." msgstr "Ðеможливо завантажити аватару з %s." diff --git a/plugins/XCache/XCachePlugin.php b/plugins/XCache/XCachePlugin.php index 2baa290ed2..5b10718eaf 100644 --- a/plugins/XCache/XCachePlugin.php +++ b/plugins/XCache/XCachePlugin.php @@ -47,7 +47,6 @@ if (!defined('STATUSNET')) { * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ - class XCachePlugin extends Plugin { /** @@ -60,7 +59,6 @@ class XCachePlugin extends Plugin * * @return boolean hook success */ - function onStartCacheGet(&$key, &$value) { if (!xcache_isset($key)) { @@ -84,7 +82,6 @@ class XCachePlugin extends Plugin * * @return boolean hook success */ - function onStartCacheSet(&$key, &$value, &$flag, &$expiry, &$success) { $success = xcache_set($key, serialize($value)); @@ -102,7 +99,6 @@ class XCachePlugin extends Plugin * * @return boolean hook success */ - function onStartCacheDelete(&$key, &$success) { $success = xcache_unset($key); @@ -117,8 +113,8 @@ class XCachePlugin extends Plugin 'author' => 'Craig Andrews', 'homepage' => 'http://status.net/wiki/Plugin:XCache', 'rawdescription' => + // TRANS: Plugin description. _m('Use the XCache variable cache to cache query results.')); return true; } } - diff --git a/plugins/XCache/locale/XCache.pot b/plugins/XCache/locale/XCache.pot index c5cb57ad80..8840592faf 100644 --- a/plugins/XCache/locale/XCache.pot +++ b/plugins/XCache/locale/XCache.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,7 +16,8 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: XCachePlugin.php:120 +#. TRANS: Plugin description. +#: XCachePlugin.php:117 msgid "" "Use the XCache variable cache to " "cache query results." diff --git a/plugins/XCache/locale/ast/LC_MESSAGES/XCache.po b/plugins/XCache/locale/ast/LC_MESSAGES/XCache.po index 52a0bd195c..6253db6caf 100644 --- a/plugins/XCache/locale/ast/LC_MESSAGES/XCache.po +++ b/plugins/XCache/locale/ast/LC_MESSAGES/XCache.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - XCache to Asturian (Asturianu) +# Translation of StatusNet - XCache to Asturian (asturianu) # Exported from translatewiki.net # # Author: Xuacu @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - XCache\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:53+0000\n" -"Language-Team: Asturian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:29+0000\n" +"Language-Team: Asturian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:14+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ast\n" "X-Message-Group: #out-statusnet-plugin-xcache\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "Use the XCache variable cache to " "cache query results." diff --git a/plugins/XCache/locale/br/LC_MESSAGES/XCache.po b/plugins/XCache/locale/br/LC_MESSAGES/XCache.po index 712e46e153..50a3993391 100644 --- a/plugins/XCache/locale/br/LC_MESSAGES/XCache.po +++ b/plugins/XCache/locale/br/LC_MESSAGES/XCache.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - XCache to Breton (Brezhoneg) +# Translation of StatusNet - XCache to Breton (brezhoneg) # Exported from translatewiki.net # # Author: Fulup @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - XCache\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:53+0000\n" -"Language-Team: Breton \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:29+0000\n" +"Language-Team: Breton \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:14+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: br\n" "X-Message-Group: #out-statusnet-plugin-xcache\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Plugin description. msgid "" "Use the XCache variable cache to " "cache query results." diff --git a/plugins/XCache/locale/de/LC_MESSAGES/XCache.po b/plugins/XCache/locale/de/LC_MESSAGES/XCache.po index 0045526b14..4ba1878c38 100644 --- a/plugins/XCache/locale/de/LC_MESSAGES/XCache.po +++ b/plugins/XCache/locale/de/LC_MESSAGES/XCache.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - XCache\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:53+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:29+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:14+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-xcache\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "Use the XCache variable cache to " "cache query results." diff --git a/plugins/XCache/locale/es/LC_MESSAGES/XCache.po b/plugins/XCache/locale/es/LC_MESSAGES/XCache.po index 6f6377e368..7ed35e5c55 100644 --- a/plugins/XCache/locale/es/LC_MESSAGES/XCache.po +++ b/plugins/XCache/locale/es/LC_MESSAGES/XCache.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - XCache to Spanish (Español) +# Translation of StatusNet - XCache to Spanish (español) # Exported from translatewiki.net # # Author: Locos epraix @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - XCache\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:54+0000\n" -"Language-Team: Spanish \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:29+0000\n" +"Language-Team: Spanish \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:14+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: es\n" "X-Message-Group: #out-statusnet-plugin-xcache\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "Use the XCache variable cache to " "cache query results." diff --git a/plugins/XCache/locale/eu/LC_MESSAGES/XCache.po b/plugins/XCache/locale/eu/LC_MESSAGES/XCache.po new file mode 100644 index 0000000000..7e449b1fba --- /dev/null +++ b/plugins/XCache/locale/eu/LC_MESSAGES/XCache.po @@ -0,0 +1,27 @@ +# Translation of StatusNet - XCache to Basque (euskara) +# Exported from translatewiki.net +# +# Author: Artsuaga +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - XCache\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:29+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:52:14+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Plugin description. +msgid "" +"Use the XCache variable cache to " +"cache query results." +msgstr "" +"Erabili XCache aldagairen katxea " +"kontsultako emaitzak katxeatzeko." diff --git a/plugins/XCache/locale/fi/LC_MESSAGES/XCache.po b/plugins/XCache/locale/fi/LC_MESSAGES/XCache.po index 0b3b725c99..005b21611c 100644 --- a/plugins/XCache/locale/fi/LC_MESSAGES/XCache.po +++ b/plugins/XCache/locale/fi/LC_MESSAGES/XCache.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - XCache to Finnish (Suomi) +# Translation of StatusNet - XCache to Finnish (suomi) # Exported from translatewiki.net # # Author: Centerlink @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - XCache\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:54+0000\n" -"Language-Team: Finnish \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:30+0000\n" +"Language-Team: Finnish \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:14+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fi\n" "X-Message-Group: #out-statusnet-plugin-xcache\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "Use the XCache variable cache to " "cache query results." diff --git a/plugins/XCache/locale/fr/LC_MESSAGES/XCache.po b/plugins/XCache/locale/fr/LC_MESSAGES/XCache.po index 068bc7f445..f55f398ae4 100644 --- a/plugins/XCache/locale/fr/LC_MESSAGES/XCache.po +++ b/plugins/XCache/locale/fr/LC_MESSAGES/XCache.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - XCache to French (Français) +# Translation of StatusNet - XCache to French (français) # Exported from translatewiki.net # # Author: Verdy p @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - XCache\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:54+0000\n" -"Language-Team: French \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:30+0000\n" +"Language-Team: French \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:14+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-xcache\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Plugin description. msgid "" "Use the XCache variable cache to " "cache query results." diff --git a/plugins/XCache/locale/gl/LC_MESSAGES/XCache.po b/plugins/XCache/locale/gl/LC_MESSAGES/XCache.po index 7802dd9b15..6fc7b009c9 100644 --- a/plugins/XCache/locale/gl/LC_MESSAGES/XCache.po +++ b/plugins/XCache/locale/gl/LC_MESSAGES/XCache.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - XCache to Galician (Galego) +# Translation of StatusNet - XCache to Galician (galego) # Exported from translatewiki.net # # Author: Toliño @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - XCache\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:54+0000\n" -"Language-Team: Galician \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:30+0000\n" +"Language-Team: Galician \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:14+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: gl\n" "X-Message-Group: #out-statusnet-plugin-xcache\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "Use the XCache variable cache to " "cache query results." diff --git a/plugins/XCache/locale/he/LC_MESSAGES/XCache.po b/plugins/XCache/locale/he/LC_MESSAGES/XCache.po index 8c34b446ae..23deac8a23 100644 --- a/plugins/XCache/locale/he/LC_MESSAGES/XCache.po +++ b/plugins/XCache/locale/he/LC_MESSAGES/XCache.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - XCache\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:54+0000\n" -"Language-Team: Hebrew \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:30+0000\n" +"Language-Team: Hebrew \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:14+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: he\n" "X-Message-Group: #out-statusnet-plugin-xcache\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "Use the XCache variable cache to " "cache query results." diff --git a/plugins/XCache/locale/ia/LC_MESSAGES/XCache.po b/plugins/XCache/locale/ia/LC_MESSAGES/XCache.po index 2242887cfd..d72209d273 100644 --- a/plugins/XCache/locale/ia/LC_MESSAGES/XCache.po +++ b/plugins/XCache/locale/ia/LC_MESSAGES/XCache.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - XCache to Interlingua (Interlingua) +# Translation of StatusNet - XCache to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - XCache\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:54+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:30+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:14+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-xcache\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "Use the XCache variable cache to " "cache query results." diff --git a/plugins/XCache/locale/id/LC_MESSAGES/XCache.po b/plugins/XCache/locale/id/LC_MESSAGES/XCache.po index 112a3ee2f8..16e0073797 100644 --- a/plugins/XCache/locale/id/LC_MESSAGES/XCache.po +++ b/plugins/XCache/locale/id/LC_MESSAGES/XCache.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - XCache\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:54+0000\n" -"Language-Team: Indonesian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:30+0000\n" +"Language-Team: Indonesian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:14+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: id\n" "X-Message-Group: #out-statusnet-plugin-xcache\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Plugin description. msgid "" "Use the XCache variable cache to " "cache query results." diff --git a/plugins/XCache/locale/mk/LC_MESSAGES/XCache.po b/plugins/XCache/locale/mk/LC_MESSAGES/XCache.po index 07f70c610c..83bc937e04 100644 --- a/plugins/XCache/locale/mk/LC_MESSAGES/XCache.po +++ b/plugins/XCache/locale/mk/LC_MESSAGES/XCache.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - XCache to Macedonian (МакедонÑки) +# Translation of StatusNet - XCache to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - XCache\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:54+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:30+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:14+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-xcache\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" +#. TRANS: Plugin description. msgid "" "Use the XCache variable cache to " "cache query results." diff --git a/plugins/XCache/locale/ms/LC_MESSAGES/XCache.po b/plugins/XCache/locale/ms/LC_MESSAGES/XCache.po index 08c7baf941..ac9b5244ae 100644 --- a/plugins/XCache/locale/ms/LC_MESSAGES/XCache.po +++ b/plugins/XCache/locale/ms/LC_MESSAGES/XCache.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - XCache\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:54+0000\n" -"Language-Team: Malay \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:30+0000\n" +"Language-Team: Malay \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:14+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ms\n" "X-Message-Group: #out-statusnet-plugin-xcache\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Plugin description. msgid "" "Use the XCache variable cache to " "cache query results." diff --git a/plugins/XCache/locale/nb/LC_MESSAGES/XCache.po b/plugins/XCache/locale/nb/LC_MESSAGES/XCache.po index 42596b8672..232638b857 100644 --- a/plugins/XCache/locale/nb/LC_MESSAGES/XCache.po +++ b/plugins/XCache/locale/nb/LC_MESSAGES/XCache.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - XCache to Norwegian (bokmÃ¥l)‬ (‪Norsk (bokmÃ¥l)‬) +# Translation of StatusNet - XCache to Norwegian BokmÃ¥l (‪norsk (bokmÃ¥l)‬) # Exported from translatewiki.net # # Author: Nghtwlkr @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - XCache\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:54+0000\n" -"Language-Team: Norwegian (bokmÃ¥l)‬ \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:30+0000\n" +"Language-Team: Norwegian BokmÃ¥l \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" -"X-Language-Code: no\n" +"X-POT-Import-Date: 2011-06-05 21:52:14+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: nb\n" "X-Message-Group: #out-statusnet-plugin-xcache\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "Use the XCache variable cache to " "cache query results." diff --git a/plugins/XCache/locale/nl/LC_MESSAGES/XCache.po b/plugins/XCache/locale/nl/LC_MESSAGES/XCache.po index 81513445f9..eab2395002 100644 --- a/plugins/XCache/locale/nl/LC_MESSAGES/XCache.po +++ b/plugins/XCache/locale/nl/LC_MESSAGES/XCache.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - XCache\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:54+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:31+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:14+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-xcache\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "Use the XCache variable cache to " "cache query results." diff --git a/plugins/XCache/locale/pl/LC_MESSAGES/XCache.po b/plugins/XCache/locale/pl/LC_MESSAGES/XCache.po new file mode 100644 index 0000000000..8098b3a0e3 --- /dev/null +++ b/plugins/XCache/locale/pl/LC_MESSAGES/XCache.po @@ -0,0 +1,28 @@ +# Translation of StatusNet - XCache to Polish (polski) +# Exported from translatewiki.net +# +# Author: BeginaFelicysym +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - XCache\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:31+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-05 21:52:14+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=3; plural=(n == 1) ? 0 : ( (n%10 >= 2 && n%10 <= 4 && " +"(n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" + +#. TRANS: Plugin description. +msgid "" +"Use the XCache variable cache to " +"cache query results." +msgstr "" +"Używa zmiennej pamiÄ™ci podrÄ™cznej XCache do buforowania wyników kwerendy." diff --git a/plugins/XCache/locale/pt/LC_MESSAGES/XCache.po b/plugins/XCache/locale/pt/LC_MESSAGES/XCache.po index 2a166cee09..7f60405087 100644 --- a/plugins/XCache/locale/pt/LC_MESSAGES/XCache.po +++ b/plugins/XCache/locale/pt/LC_MESSAGES/XCache.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - XCache to Portuguese (Português) +# Translation of StatusNet - XCache to Portuguese (português) # Exported from translatewiki.net # # Author: Waldir @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - XCache\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:54+0000\n" -"Language-Team: Portuguese \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:31+0000\n" +"Language-Team: Portuguese \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:14+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: pt\n" "X-Message-Group: #out-statusnet-plugin-xcache\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "Use the XCache variable cache to " "cache query results." diff --git a/plugins/XCache/locale/pt_BR/LC_MESSAGES/XCache.po b/plugins/XCache/locale/pt_BR/LC_MESSAGES/XCache.po index 10898cefd2..9a679b0289 100644 --- a/plugins/XCache/locale/pt_BR/LC_MESSAGES/XCache.po +++ b/plugins/XCache/locale/pt_BR/LC_MESSAGES/XCache.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - XCache to Brazilian Portuguese (Português do Brasil) +# Translation of StatusNet - XCache to Brazilian Portuguese (português do Brasil) # Exported from translatewiki.net # # Author: Giro720 @@ -9,19 +9,20 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - XCache\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:54+0000\n" -"Language-Team: Brazilian Portuguese \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:31+0000\n" +"Language-Team: Brazilian Portuguese \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:14+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: pt-br\n" "X-Message-Group: #out-statusnet-plugin-xcache\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Plugin description. msgid "" "Use the XCache variable cache to " "cache query results." diff --git a/plugins/XCache/locale/ru/LC_MESSAGES/XCache.po b/plugins/XCache/locale/ru/LC_MESSAGES/XCache.po index 1087e57191..76d5c05346 100644 --- a/plugins/XCache/locale/ru/LC_MESSAGES/XCache.po +++ b/plugins/XCache/locale/ru/LC_MESSAGES/XCache.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - XCache to Russian (РуÑÑкий) +# Translation of StatusNet - XCache to Russian (руÑÑкий) # Exported from translatewiki.net # # Author: ÐлекÑандр Сигачёв @@ -9,19 +9,20 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - XCache\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:55+0000\n" -"Language-Team: Russian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:31+0000\n" +"Language-Team: Russian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:14+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ru\n" "X-Message-Group: #out-statusnet-plugin-xcache\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Plugin description. msgid "" "Use the XCache variable cache to " "cache query results." diff --git a/plugins/XCache/locale/tl/LC_MESSAGES/XCache.po b/plugins/XCache/locale/tl/LC_MESSAGES/XCache.po index e248e8ff10..62a5ae66c5 100644 --- a/plugins/XCache/locale/tl/LC_MESSAGES/XCache.po +++ b/plugins/XCache/locale/tl/LC_MESSAGES/XCache.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - XCache\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:55+0000\n" -"Language-Team: Tagalog \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:31+0000\n" +"Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:14+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-xcache\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Plugin description. msgid "" "Use the XCache variable cache to " "cache query results." diff --git a/plugins/XCache/locale/tr/LC_MESSAGES/XCache.po b/plugins/XCache/locale/tr/LC_MESSAGES/XCache.po index 63ee2a45a4..453cdacfec 100644 --- a/plugins/XCache/locale/tr/LC_MESSAGES/XCache.po +++ b/plugins/XCache/locale/tr/LC_MESSAGES/XCache.po @@ -9,18 +9,19 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - XCache\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:55+0000\n" -"Language-Team: Turkish \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:31+0000\n" +"Language-Team: Turkish \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:14+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tr\n" "X-Message-Group: #out-statusnet-plugin-xcache\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Plugin description. msgid "" "Use the XCache variable cache to " "cache query results." diff --git a/plugins/XCache/locale/uk/LC_MESSAGES/XCache.po b/plugins/XCache/locale/uk/LC_MESSAGES/XCache.po index a39213c6c9..b607bd1def 100644 --- a/plugins/XCache/locale/uk/LC_MESSAGES/XCache.po +++ b/plugins/XCache/locale/uk/LC_MESSAGES/XCache.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - XCache to Ukrainian (УкраїнÑька) +# Translation of StatusNet - XCache to Ukrainian (українÑька) # Exported from translatewiki.net # # Author: Boogie @@ -9,19 +9,20 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - XCache\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:55+0000\n" -"Language-Team: Ukrainian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:31+0000\n" +"Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-05 21:52:14+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-xcache\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Plugin description. msgid "" "Use the XCache variable cache to " "cache query results." diff --git a/plugins/Xmpp/Queued_XMPP.php b/plugins/Xmpp/Queued_XMPP.php index 24f542805b..aeb758421f 100644 --- a/plugins/Xmpp/Queued_XMPP.php +++ b/plugins/Xmpp/Queued_XMPP.php @@ -88,34 +88,38 @@ class Queued_XMPP extends XMPPHP_XMPP */ public function connect($timeout = 30, $persistent = false, $sendinit = true) { - throw new Exception("Can't connect to server from fake XMPP."); + // No i18n needed. Test message. + throw new Exception('Cannot connect to server from fake XMPP.'); } public function disconnect() { - throw new Exception("Can't connect to server from fake XMPP."); + // No i18n needed. Test message. + throw new Exception('Cannot connect to server from fake XMPP.'); } public function process() { - throw new Exception("Can't read stream from fake XMPP."); + // No i18n needed. Test message. + throw new Exception('Cannot read stream from fake XMPP.'); } public function processUntil($event, $timeout=-1) { - throw new Exception("Can't read stream from fake XMPP."); + // No i18n needed. Test message. + throw new Exception('Cannot read stream from fake XMPP.'); } public function read() { - throw new Exception("Can't read stream from fake XMPP."); + // No i18n needed. Test message. + throw new Exception('Cannot read stream from fake XMPP.'); } public function readyToProcess() { - throw new Exception("Can't read stream from fake XMPP."); + // No i18n needed. Test message. + throw new Exception('Cannot read stream from fake XMPP.'); } //@} - } - diff --git a/plugins/Xmpp/README b/plugins/Xmpp/README index 9bd71e9807..96b0f3291a 100644 --- a/plugins/Xmpp/README +++ b/plugins/Xmpp/README @@ -1,4 +1,5 @@ -The XMPP plugin allows users to send and receive notices over the XMPP/Jabber/GTalk network. +The XMPP plugin allows users to send and receive notices over the +XMPP/Jabber/GTalk network. Installation ============ @@ -6,9 +7,10 @@ add "addPlugin('xmpp', array('setting'=>'value', 'setting2'=>'value2', ...);" to the bottom of your config.php -The daemon included with this plugin must be running. It will be started by -the plugin along with their other daemons when you run scripts/startdaemons.sh. -See the StatusNet README for more about queuing and daemons. +The daemon included with this plugin must be running. It will be +started by the plugin along with their other daemons when you run +scripts/startdaemons.sh. See the StatusNet README for more about queuing and +daemons. Settings ======== @@ -32,4 +34,3 @@ addPlugin('xmpp', array( 'password'=>'...', 'public'=>array('bob@aol.com', 'sue@google.com') )); - diff --git a/plugins/Xmpp/XmppPlugin.php b/plugins/Xmpp/XmppPlugin.php index f7df6812cf..74e104d974 100644 --- a/plugins/Xmpp/XmppPlugin.php +++ b/plugins/Xmpp/XmppPlugin.php @@ -44,7 +44,6 @@ if (!defined('STATUSNET')) { * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @link http://status.net/ */ - class XmppPlugin extends ImPlugin { public $server = null; @@ -59,22 +58,22 @@ class XmppPlugin extends ImPlugin public $transport = 'xmpp'; function getDisplayName(){ + // TRANS: Plugin display name. return _m('XMPP/Jabber/GTalk'); } /** * Splits a Jabber ID (JID) into node, domain, and resource portions. - * + * * Based on validation routine submitted by: * @copyright 2009 Patrick Georgi - * @license Licensed under ISC-L, which is compatible with everything else that keeps the copyright notice intact. + * @license Licensed under ISC-L, which is compatible with everything else that keeps the copyright notice intact. * * @param string $jid string to check * * @return array with "node", "domain", and "resource" indices * @throws Exception if input is not valid */ - protected function splitJid($jid) { $chars = ''; @@ -102,11 +101,11 @@ class XmppPlugin extends ImPlugin $chars .= "\x{340}\x{341}\x{200e}\x{200f}\x{202a}-\x{202e}\x{206a}-\x{206f}"; /* C9 - Tagging characters */ $chars .= "\x{e0001}\x{e0020}-\x{e007f}"; - + /* Nodeprep forbids some more characters */ $nodeprepchars = $chars; $nodeprepchars .= "\x{22}\x{26}\x{27}\x{2f}\x{3a}\x{3c}\x{3e}\x{40}"; - + $parts = explode("/", $jid, 2); if (count($parts) > 1) { $resource = $parts[1]; @@ -117,10 +116,11 @@ class XmppPlugin extends ImPlugin } else { $resource = null; } - + $node = explode("@", $parts[0]); if ((count($node) > 2) || (count($node) == 0)) { - throw new Exception("Invalid JID: too many @s"); + // TRANS: Exception thrown when using too many @ signs in a Jabber ID. + throw new Exception(_m('Invalid JID: too many @s.')); } else if (count($node) == 1) { $domain = $node[0]; $node = null; @@ -128,47 +128,57 @@ class XmppPlugin extends ImPlugin $domain = $node[1]; $node = $node[0]; if ($node == '') { - throw new Exception("Invalid JID: @ but no node"); + // TRANS: Exception thrown when using @ sign not followed by a Jabber ID. + throw new Exception(_m('Invalid JID: @ but no node')); } } - + // Length limits per http://xmpp.org/rfcs/rfc3920.html#addressing if ($node !== null) { if (strlen($node) > 1023) { - throw new Exception("Invalid JID: node too long."); + // TRANS: Exception thrown when using too long a Jabber ID (>1023). + throw new Exception(_m('Invalid JID: node too long.')); } if (preg_match("/[".$nodeprepchars."]/u", $node)) { - throw new Exception("Invalid JID node '$node'"); + // TRANS: Exception thrown when using an invalid Jabber ID. + // TRANS: %s is the invalid Jabber ID. + throw new Exception(sprintf(_m('Invalid JID node "%s".'),$node)); } } - + if (strlen($domain) > 1023) { - throw new Exception("Invalid JID: domain too long."); + // TRANS: Exception thrown when using too long a Jabber domain (>1023). + throw new Exception(_m('Invalid JID: domain too long.')); } if (!common_valid_domain($domain)) { - throw new Exception("Invalid JID domain name '$domain'"); + // TRANS: Exception thrown when using an invalid Jabber domain name. + // TRANS: %s is the invalid domain name. + throw new Exception(sprintf(_m('Invalid JID domain name "%s".'),$domain)); } - + if ($resource !== null) { if (strlen($resource) > 1023) { + // TRANS: Exception thrown when using too long a resource (>1023). throw new Exception("Invalid JID: resource too long."); } if (preg_match("/[".$chars."]/u", $resource)) { - throw new Exception("Invalid JID resource '$resource'"); + // TRANS: Exception thrown when using an invalid Jabber resource. + // TRANS: %s is the invalid resource. + throw new Exception(sprintf(_m('Invalid JID resource "%s".'),$resource)); } } - + return array('node' => is_null($node) ? null : mb_strtolower($node), 'domain' => is_null($domain) ? null : mb_strtolower($domain), 'resource' => $resource); } - + /** * Checks whether a string is a syntactically valid Jabber ID (JID), * either with or without a resource. - * + * * Note that a bare domain can be a valid JID. - * + * * @param string $jid string to check * @param bool $check_domain whether we should validate that domain... * @@ -188,15 +198,15 @@ class XmppPlugin extends ImPlugin return false; } } - + /** * Checks whether a string is a syntactically valid base Jabber ID (JID). * A base JID won't include a resource specifier on the end; since we * take it off when reading input we can't really use them reliably * to direct outgoing messages yet (sorry guys!) - * + * * Note that a bare domain can be a valid JID. - * + * * @param string $jid string to check * @param bool $check_domain whether we should validate that domain... * @@ -225,7 +235,6 @@ class XmppPlugin extends ImPlugin * * @return string an equivalent JID in normalized (lowercase) form */ - function normalize($jid) { try { @@ -308,7 +317,7 @@ class XmppPlugin extends ImPlugin function microiduri($screenname) { - return 'xmpp:' . $screenname; + return 'xmpp:' . $screenname; } function sendMessage($screenname, $body) @@ -320,7 +329,7 @@ class XmppPlugin extends ImPlugin { $msg = $this->formatNotice($notice); $entry = $this->format_entry($notice); - + $this->queuedConnection()->message($screenname, $msg, 'chat', null, $entry); return true; } @@ -333,7 +342,6 @@ class XmppPlugin extends ImPlugin * * @return string Extra information (Atom, HTML, addresses) in string format */ - function format_entry($notice) { $profile = $notice->getProfile(); @@ -355,6 +363,7 @@ class XmppPlugin extends ImPlugin $xs->element('a', array( 'href'=>common_local_url('conversation', array('id' => $notice->conversation)).'#notice-'.$notice->id), + // TRANS: Link description to notice in conversation. // TRANS: %s is a notice ID. sprintf(_m('[%s]'),$notice->id)); $xs->elementEnd('body'); @@ -371,38 +380,42 @@ class XmppPlugin extends ImPlugin if ($pl['type'] != 'chat') { $this->log(LOG_WARNING, "Ignoring message of type ".$pl['type']." from $from: " . $pl['xml']->toString()); - return; + return true; } if (mb_strlen($pl['body']) == 0) { $this->log(LOG_WARNING, "Ignoring message with empty body from $from: " . $pl['xml']->toString()); - return; + return true; } $this->handleIncoming($from, $pl['body']); - + return true; } /** * Build a queue-proxied XMPP interface object. Any outgoing messages * will be run back through us for enqueing rather than sent directly. - * + * * @return Queued_XMPP * @throws Exception if server settings are invalid. */ function queuedConnection(){ if(!isset($this->server)){ - throw new Exception("must specify a server"); + // TRANS: Exception thrown when the plugin configuration is incorrect. + throw new Exception(_m('You must specify a server in the configuration.')); } if(!isset($this->port)){ - throw new Exception("must specify a port"); + // TRANS: Exception thrown when the plugin configuration is incorrect. + throw new Exception(_m('You must specify a port in the configuration.')); } if(!isset($this->user)){ - throw new Exception("must specify a user"); + // TRANS: Exception thrown when the plugin configuration is incorrect. + throw new Exception(_m('You must specify a user in the configuration.')); } if(!isset($this->password)){ - throw new Exception("must specify a password"); + // TRANS: Exception thrown when the plugin configuration is incorrect. + throw new Exception(_m('You must specify a password in the configuration.')); } return new Queued_XMPP($this, $this->host ? @@ -420,6 +433,31 @@ class XmppPlugin extends ImPlugin ); } + /** + * Add XMPP plugin daemon to the list of daemon to start + * + * @param array $daemons the list of daemons to run + * + * @return boolean hook return + */ + function onGetValidDaemons($daemons) + { + if( isset($this->server) && + isset($this->port) && + isset($this->user) && + isset($this->password) ){ + + array_push( + $daemons, + INSTALLDIR + . '/scripts/imdaemon.php' + ); + } + + return true; + } + + function onPluginVersion(&$versions) { $versions[] = array('name' => 'XMPP', @@ -427,6 +465,7 @@ class XmppPlugin extends ImPlugin 'author' => 'Craig Andrews, Evan Prodromou', 'homepage' => 'http://status.net/wiki/Plugin:XMPP', 'rawdescription' => + // TRANS: Plugin description. _m('The XMPP plugin allows users to send and receive notices over the XMPP/Jabber network.')); return true; } diff --git a/plugins/Xmpp/locale/Xmpp.pot b/plugins/Xmpp/locale/Xmpp.pot index 1ad42f56fc..dd693b68c8 100644 --- a/plugins/Xmpp/locale/Xmpp.pot +++ b/plugins/Xmpp/locale/Xmpp.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,21 +16,87 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: xmppmanager.php:168 xmppmanager.php:207 +#. TRANS: Presence announcement for XMPP. +#. TRANS: Message for XMPP reconnect. +#: xmppmanager.php:167 xmppmanager.php:207 msgid "Send me a message to post a notice" msgstr "" +#. TRANS: Plugin display name. #: XmppPlugin.php:62 msgid "XMPP/Jabber/GTalk" msgstr "" +#. TRANS: Exception thrown when using too many @ signs in a Jabber ID. +#: XmppPlugin.php:123 +msgid "Invalid JID: too many @s." +msgstr "" + +#. TRANS: Exception thrown when using @ sign not followed by a Jabber ID. +#: XmppPlugin.php:132 +msgid "Invalid JID: @ but no node" +msgstr "" + +#. TRANS: Exception thrown when using too long a Jabber ID (>1023). +#: XmppPlugin.php:140 +msgid "Invalid JID: node too long." +msgstr "" + +#. TRANS: Exception thrown when using an invalid Jabber ID. +#. TRANS: %s is the invalid Jabber ID. +#: XmppPlugin.php:145 +#, php-format +msgid "Invalid JID node \"%s\"." +msgstr "" + +#. TRANS: Exception thrown when using too long a Jabber domain (>1023). +#: XmppPlugin.php:151 +msgid "Invalid JID: domain too long." +msgstr "" + +#. TRANS: Exception thrown when using an invalid Jabber domain name. +#. TRANS: %s is the invalid domain name. +#: XmppPlugin.php:156 +#, php-format +msgid "Invalid JID domain name \"%s\"." +msgstr "" + +#. TRANS: Exception thrown when using an invalid Jabber resource. +#. TRANS: %s is the invalid resource. +#: XmppPlugin.php:167 +#, php-format +msgid "Invalid JID resource \"%s\"." +msgstr "" + +#. TRANS: Link description to notice in conversation. #. TRANS: %s is a notice ID. -#: XmppPlugin.php:359 +#: XmppPlugin.php:368 #, php-format msgid "[%s]" msgstr "" -#: XmppPlugin.php:430 +#. TRANS: Exception thrown when the plugin configuration is incorrect. +#: XmppPlugin.php:406 +msgid "You must specify a server in the configuration." +msgstr "" + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +#: XmppPlugin.php:410 +msgid "You must specify a port in the configuration." +msgstr "" + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +#: XmppPlugin.php:414 +msgid "You must specify a user in the configuration." +msgstr "" + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +#: XmppPlugin.php:418 +msgid "You must specify a password in the configuration." +msgstr "" + +#. TRANS: Plugin description. +#: XmppPlugin.php:444 msgid "" "The XMPP plugin allows users to send and receive notices over the XMPP/" "Jabber network." diff --git a/plugins/Xmpp/locale/ca/LC_MESSAGES/Xmpp.po b/plugins/Xmpp/locale/ca/LC_MESSAGES/Xmpp.po index 00bafb9d28..91b05993d4 100644 --- a/plugins/Xmpp/locale/ca/LC_MESSAGES/Xmpp.po +++ b/plugins/Xmpp/locale/ca/LC_MESSAGES/Xmpp.po @@ -9,29 +9,84 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Xmpp\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:55+0000\n" +"POT-Creation-Date: 2011-06-18 15:54+0000\n" +"PO-Revision-Date: 2011-06-18 15:58:03+0000\n" "Language-Team: Catalan \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" +"X-POT-Import-Date: 2011-06-05 21:52:15+0000\n" +"X-Generator: MediaWiki 1.19alpha (r90318); Translate extension (2011-06-02)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ca\n" "X-Message-Group: #out-statusnet-plugin-xmpp\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Presence announcement for XMPP. +#. TRANS: Message for XMPP reconnect. msgid "Send me a message to post a notice" msgstr "Envia'm un missatge per a publicar un avís" +#. TRANS: Plugin display name. msgid "XMPP/Jabber/GTalk" msgstr "XMPP/Jabber/GTalk" +#. TRANS: Exception thrown when using too many @ signs in a Jabber ID. +msgid "Invalid JID: too many @s." +msgstr "" + +#. TRANS: Exception thrown when using @ sign not followed by a Jabber ID. +msgid "Invalid JID: @ but no node" +msgstr "" + +#. TRANS: Exception thrown when using too long a Jabber ID (>1023). +msgid "Invalid JID: node too long." +msgstr "" + +#. TRANS: Exception thrown when using an invalid Jabber ID. +#. TRANS: %s is the invalid Jabber ID. +#, php-format +msgid "Invalid JID node \"%s\"." +msgstr "" + +#. TRANS: Exception thrown when using too long a Jabber domain (>1023). +msgid "Invalid JID: domain too long." +msgstr "" + +#. TRANS: Exception thrown when using an invalid Jabber domain name. +#. TRANS: %s is the invalid domain name. +#, php-format +msgid "Invalid JID domain name \"%s\"." +msgstr "" + +#. TRANS: Exception thrown when using an invalid Jabber resource. +#. TRANS: %s is the invalid resource. +#, php-format +msgid "Invalid JID resource \"%s\"." +msgstr "" + +#. TRANS: Link description to notice in conversation. #. TRANS: %s is a notice ID. #, php-format msgid "[%s]" msgstr "[%s]" +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a server in the configuration." +msgstr "" + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a port in the configuration." +msgstr "" + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a user in the configuration." +msgstr "" + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a password in the configuration." +msgstr "" + +#. TRANS: Plugin description. msgid "" "The XMPP plugin allows users to send and receive notices over the XMPP/" "Jabber network." diff --git a/plugins/Xmpp/locale/de/LC_MESSAGES/Xmpp.po b/plugins/Xmpp/locale/de/LC_MESSAGES/Xmpp.po index ba9d25ac0b..9187415f12 100644 --- a/plugins/Xmpp/locale/de/LC_MESSAGES/Xmpp.po +++ b/plugins/Xmpp/locale/de/LC_MESSAGES/Xmpp.po @@ -3,6 +3,9 @@ # # Author: Giftpflanze # Author: Habi +# Author: Inkowik +# Author: PtM +# Author: Tiin # -- # This file is distributed under the same license as the StatusNet package. # @@ -10,29 +13,84 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Xmpp\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:55+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:31+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:56+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-xmpp\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Presence announcement for XMPP. +#. TRANS: Message for XMPP reconnect. msgid "Send me a message to post a notice" msgstr "Sende mir eine Nachricht, um eine Nachricht zu erstellen" +#. TRANS: Plugin display name. msgid "XMPP/Jabber/GTalk" msgstr "XMPP/Jabber/GTalk" +#. TRANS: Exception thrown when using too many @ signs in a Jabber ID. +msgid "Invalid JID: too many @s." +msgstr "Ungültige JID: zu viele @s." + +#. TRANS: Exception thrown when using @ sign not followed by a Jabber ID. +msgid "Invalid JID: @ but no node" +msgstr "Ungültige JID: @ aber kein Knoten" + +#. TRANS: Exception thrown when using too long a Jabber ID (>1023). +msgid "Invalid JID: node too long." +msgstr "Ungültige JID: Knoten zu lang." + +#. TRANS: Exception thrown when using an invalid Jabber ID. +#. TRANS: %s is the invalid Jabber ID. +#, php-format +msgid "Invalid JID node \"%s\"." +msgstr "Ungültiger JID-Knoten \"%s\"." + +#. TRANS: Exception thrown when using too long a Jabber domain (>1023). +msgid "Invalid JID: domain too long." +msgstr "Ungültige JID: Domain zu lang." + +#. TRANS: Exception thrown when using an invalid Jabber domain name. +#. TRANS: %s is the invalid domain name. +#, php-format +msgid "Invalid JID domain name \"%s\"." +msgstr "Ungültiger JID-Domainname „%s“." + +#. TRANS: Exception thrown when using an invalid Jabber resource. +#. TRANS: %s is the invalid resource. +#, php-format +msgid "Invalid JID resource \"%s\"." +msgstr "Ungültige JID-Quelle „%s“." + +#. TRANS: Link description to notice in conversation. #. TRANS: %s is a notice ID. #, php-format msgid "[%s]" msgstr "[%s]" +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a server in the configuration." +msgstr "Du musst einen Server in der Konfiguration angeben." + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a port in the configuration." +msgstr "Du musst einen Port in der Konfiguration angeben." + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a user in the configuration." +msgstr "Du musst einen Benutzernamen in der Konfiguration angeben." + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a password in the configuration." +msgstr "Du musst ein Passwort in der Konfiguration angeben." + +#. TRANS: Plugin description. msgid "" "The XMPP plugin allows users to send and receive notices over the XMPP/" "Jabber network." diff --git a/plugins/Xmpp/locale/es/LC_MESSAGES/Xmpp.po b/plugins/Xmpp/locale/es/LC_MESSAGES/Xmpp.po new file mode 100644 index 0000000000..3ae2511a10 --- /dev/null +++ b/plugins/Xmpp/locale/es/LC_MESSAGES/Xmpp.po @@ -0,0 +1,92 @@ +# Translation of StatusNet - Xmpp to Spanish (español) +# Exported from translatewiki.net +# +# Author: Armando-Martin +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Xmpp\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:32+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-19 11:23:56+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Presence announcement for XMPP. +#. TRANS: Message for XMPP reconnect. +msgid "Send me a message to post a notice" +msgstr "Envíeme un mensaje para publicar una nota" + +#. TRANS: Plugin display name. +msgid "XMPP/Jabber/GTalk" +msgstr "XMPP/Jabber/GTalk" + +#. TRANS: Exception thrown when using too many @ signs in a Jabber ID. +msgid "Invalid JID: too many @s." +msgstr "JID no válido: demasiados signos @s." + +#. TRANS: Exception thrown when using @ sign not followed by a Jabber ID. +msgid "Invalid JID: @ but no node" +msgstr "JID no válido: Signo @ sin nodo" + +#. TRANS: Exception thrown when using too long a Jabber ID (>1023). +msgid "Invalid JID: node too long." +msgstr "JID no válido: nodo demasiado largo." + +#. TRANS: Exception thrown when using an invalid Jabber ID. +#. TRANS: %s is the invalid Jabber ID. +#, php-format +msgid "Invalid JID node \"%s\"." +msgstr "Nodo JID \"%s\" no válido." + +#. TRANS: Exception thrown when using too long a Jabber domain (>1023). +msgid "Invalid JID: domain too long." +msgstr "JID no válido: dominio demasiado largo." + +#. TRANS: Exception thrown when using an invalid Jabber domain name. +#. TRANS: %s is the invalid domain name. +#, php-format +msgid "Invalid JID domain name \"%s\"." +msgstr "Nombre de dominio JID \"%s\" no válido." + +#. TRANS: Exception thrown when using an invalid Jabber resource. +#. TRANS: %s is the invalid resource. +#, php-format +msgid "Invalid JID resource \"%s\"." +msgstr "Recurso JID \"%s\" no válido." + +#. TRANS: Link description to notice in conversation. +#. TRANS: %s is a notice ID. +#, php-format +msgid "[%s]" +msgstr "[%s]" + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a server in the configuration." +msgstr "Debe especificar un servidor en la configuración." + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a port in the configuration." +msgstr "Debe especificar un puerto en la configuración." + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a user in the configuration." +msgstr "Debe especificar un usuario en la configuración." + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a password in the configuration." +msgstr "Debe especificar una contraseña en la configuración." + +#. TRANS: Plugin description. +msgid "" +"The XMPP plugin allows users to send and receive notices over the XMPP/" +"Jabber network." +msgstr "" +"El complemento (plugin) XMPP permite a los usuarios enviar y recibir " +"mensajes mediante la red XMPP/Jabber." diff --git a/plugins/Xmpp/locale/fr/LC_MESSAGES/Xmpp.po b/plugins/Xmpp/locale/fr/LC_MESSAGES/Xmpp.po index 5e43f2a0c0..f721d1277f 100644 --- a/plugins/Xmpp/locale/fr/LC_MESSAGES/Xmpp.po +++ b/plugins/Xmpp/locale/fr/LC_MESSAGES/Xmpp.po @@ -1,8 +1,10 @@ -# Translation of StatusNet - Xmpp to French (Français) +# Translation of StatusNet - Xmpp to French (français) # Exported from translatewiki.net # +# Author: Gomoko # Author: Od1n # Author: Peter17 +# Author: Tititou36 # -- # This file is distributed under the same license as the StatusNet package. # @@ -10,29 +12,84 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Xmpp\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:55+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:32+0000\n" "Language-Team: French \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:56+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-xmpp\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Presence announcement for XMPP. +#. TRANS: Message for XMPP reconnect. msgid "Send me a message to post a notice" msgstr "M’envoyer un message pour afficher un avis." +#. TRANS: Plugin display name. msgid "XMPP/Jabber/GTalk" msgstr "XMPP/Jabber/GTalk" +#. TRANS: Exception thrown when using too many @ signs in a Jabber ID. +msgid "Invalid JID: too many @s." +msgstr "JID non valide: trop de @s." + +#. TRANS: Exception thrown when using @ sign not followed by a Jabber ID. +msgid "Invalid JID: @ but no node" +msgstr "JID non valide: @ mais sans nÅ“ud." + +#. TRANS: Exception thrown when using too long a Jabber ID (>1023). +msgid "Invalid JID: node too long." +msgstr "JID non valide: nÅ“ud trop long." + +#. TRANS: Exception thrown when using an invalid Jabber ID. +#. TRANS: %s is the invalid Jabber ID. +#, php-format +msgid "Invalid JID node \"%s\"." +msgstr "NÅ“ud JID \"%s\" non valide." + +#. TRANS: Exception thrown when using too long a Jabber domain (>1023). +msgid "Invalid JID: domain too long." +msgstr "JID non valide: domaine trop long." + +#. TRANS: Exception thrown when using an invalid Jabber domain name. +#. TRANS: %s is the invalid domain name. +#, php-format +msgid "Invalid JID domain name \"%s\"." +msgstr "Nom de domaine JID \"%s\" non valide." + +#. TRANS: Exception thrown when using an invalid Jabber resource. +#. TRANS: %s is the invalid resource. +#, php-format +msgid "Invalid JID resource \"%s\"." +msgstr "Ressource JID \"%s\" non valide." + +#. TRANS: Link description to notice in conversation. #. TRANS: %s is a notice ID. #, php-format msgid "[%s]" msgstr "[%s]" +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a server in the configuration." +msgstr "Vous devez spécifier un serveur dans la configuration." + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a port in the configuration." +msgstr "Vous devez spécifier un port dans la configuration." + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a user in the configuration." +msgstr "Vous devez spécifier un utilisateur dans la configuration." + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a password in the configuration." +msgstr "Vous devez spécifier un mot de passe dans la configuration." + +#. TRANS: Plugin description. msgid "" "The XMPP plugin allows users to send and receive notices over the XMPP/" "Jabber network." diff --git a/plugins/Xmpp/locale/gl/LC_MESSAGES/Xmpp.po b/plugins/Xmpp/locale/gl/LC_MESSAGES/Xmpp.po new file mode 100644 index 0000000000..7bf9ce1000 --- /dev/null +++ b/plugins/Xmpp/locale/gl/LC_MESSAGES/Xmpp.po @@ -0,0 +1,95 @@ +# Translation of StatusNet - Xmpp to Galician (galego) +# Exported from translatewiki.net +# +# Author: Toliño +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Xmpp\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:32+0000\n" +"Language-Team: Galician \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-19 11:23:56+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" +"X-Language-Code: gl\n" +"X-Message-Group: #out-statusnet-plugin-xmpp\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Presence announcement for XMPP. +#. TRANS: Message for XMPP reconnect. +msgid "Send me a message to post a notice" +msgstr "Envíame unha mensaxe para publicar unha nota" + +#. TRANS: Plugin display name. +msgid "XMPP/Jabber/GTalk" +msgstr "XMPP/Jabber/GTalk" + +#. TRANS: Exception thrown when using too many @ signs in a Jabber ID. +msgid "Invalid JID: too many @s." +msgstr "JID inválido: Demasiados signos @." + +#. TRANS: Exception thrown when using @ sign not followed by a Jabber ID. +msgid "Invalid JID: @ but no node" +msgstr "JID inválido: Signo @ sen nodo" + +#. TRANS: Exception thrown when using too long a Jabber ID (>1023). +msgid "Invalid JID: node too long." +msgstr "JID inválido: O nodo é longo de máis." + +#. TRANS: Exception thrown when using an invalid Jabber ID. +#. TRANS: %s is the invalid Jabber ID. +#, php-format +msgid "Invalid JID node \"%s\"." +msgstr "Nodo JID, \"%s\", inválido." + +#. TRANS: Exception thrown when using too long a Jabber domain (>1023). +msgid "Invalid JID: domain too long." +msgstr "JID inválido: O dominio é longo de máis." + +#. TRANS: Exception thrown when using an invalid Jabber domain name. +#. TRANS: %s is the invalid domain name. +#, php-format +msgid "Invalid JID domain name \"%s\"." +msgstr "Nome de dominio JID, \"%s\", inválido." + +#. TRANS: Exception thrown when using an invalid Jabber resource. +#. TRANS: %s is the invalid resource. +#, php-format +msgid "Invalid JID resource \"%s\"." +msgstr "Recurso JID, \"%s\", inválido." + +#. TRANS: Link description to notice in conversation. +#. TRANS: %s is a notice ID. +#, php-format +msgid "[%s]" +msgstr "[%s]" + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a server in the configuration." +msgstr "Cómpre especificar un servidor na configuración." + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a port in the configuration." +msgstr "Cómpre especificar un porto na configuración." + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a user in the configuration." +msgstr "Cómpre especificar un usuario na configuración." + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a password in the configuration." +msgstr "Cómpre especificar un contrasinal na configuración." + +#. TRANS: Plugin description. +msgid "" +"The XMPP plugin allows users to send and receive notices over the XMPP/" +"Jabber network." +msgstr "" +"O complemento XMPP permite aos usuarios enviar e recibir mensaxes desde a " +"rede de XMPP/Jabber." diff --git a/plugins/Xmpp/locale/ia/LC_MESSAGES/Xmpp.po b/plugins/Xmpp/locale/ia/LC_MESSAGES/Xmpp.po index 1988f3cb52..d13e713b7d 100644 --- a/plugins/Xmpp/locale/ia/LC_MESSAGES/Xmpp.po +++ b/plugins/Xmpp/locale/ia/LC_MESSAGES/Xmpp.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - Xmpp to Interlingua (Interlingua) +# Translation of StatusNet - Xmpp to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,29 +9,84 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Xmpp\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:56+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:32+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:56+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-xmpp\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Presence announcement for XMPP. +#. TRANS: Message for XMPP reconnect. msgid "Send me a message to post a notice" msgstr "Inviar me un message pro publicar un nota" +#. TRANS: Plugin display name. msgid "XMPP/Jabber/GTalk" msgstr "XMPP/Jabber/GTalk" +#. TRANS: Exception thrown when using too many @ signs in a Jabber ID. +msgid "Invalid JID: too many @s." +msgstr "JID invalide: troppo de signos @." + +#. TRANS: Exception thrown when using @ sign not followed by a Jabber ID. +msgid "Invalid JID: @ but no node" +msgstr "JID invalide: signo @ sin nodo" + +#. TRANS: Exception thrown when using too long a Jabber ID (>1023). +msgid "Invalid JID: node too long." +msgstr "JID invalide: nodo troppo longe." + +#. TRANS: Exception thrown when using an invalid Jabber ID. +#. TRANS: %s is the invalid Jabber ID. +#, php-format +msgid "Invalid JID node \"%s\"." +msgstr "Nodo JID \"%s\" invalide." + +#. TRANS: Exception thrown when using too long a Jabber domain (>1023). +msgid "Invalid JID: domain too long." +msgstr "JID invalide: dominio troppo longe." + +#. TRANS: Exception thrown when using an invalid Jabber domain name. +#. TRANS: %s is the invalid domain name. +#, php-format +msgid "Invalid JID domain name \"%s\"." +msgstr "Nomine de dominio JID \"%s\" invalide." + +#. TRANS: Exception thrown when using an invalid Jabber resource. +#. TRANS: %s is the invalid resource. +#, php-format +msgid "Invalid JID resource \"%s\"." +msgstr "Ressource JID \"%s\" invalide." + +#. TRANS: Link description to notice in conversation. #. TRANS: %s is a notice ID. #, php-format msgid "[%s]" msgstr "[%s]" +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a server in the configuration." +msgstr "Es necessari specificar un servitor in le configuration." + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a port in the configuration." +msgstr "Es necessari specificar un porto in le configuration." + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a user in the configuration." +msgstr "Es necessari specificar un usator in le configuration." + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a password in the configuration." +msgstr "Es necessari specificar un contrasigno in le configuration." + +#. TRANS: Plugin description. msgid "" "The XMPP plugin allows users to send and receive notices over the XMPP/" "Jabber network." diff --git a/plugins/Xmpp/locale/mk/LC_MESSAGES/Xmpp.po b/plugins/Xmpp/locale/mk/LC_MESSAGES/Xmpp.po index 1be3577b2f..341b1d060a 100644 --- a/plugins/Xmpp/locale/mk/LC_MESSAGES/Xmpp.po +++ b/plugins/Xmpp/locale/mk/LC_MESSAGES/Xmpp.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - Xmpp to Macedonian (МакедонÑки) +# Translation of StatusNet - Xmpp to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 @@ -9,29 +9,84 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Xmpp\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:56+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:32+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:56+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-xmpp\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" +#. TRANS: Presence announcement for XMPP. +#. TRANS: Message for XMPP reconnect. msgid "Send me a message to post a notice" msgstr "ИÑпрати ми порака за да објавам забелешка" +#. TRANS: Plugin display name. msgid "XMPP/Jabber/GTalk" msgstr "XMPP/Jabber/GTalk" +#. TRANS: Exception thrown when using too many @ signs in a Jabber ID. +msgid "Invalid JID: too many @s." +msgstr "Ðеважечки JID: премногу мајмунчиња (@)." + +#. TRANS: Exception thrown when using @ sign not followed by a Jabber ID. +msgid "Invalid JID: @ but no node" +msgstr "Ðеважежки JID: @, но нема јазол" + +#. TRANS: Exception thrown when using too long a Jabber ID (>1023). +msgid "Invalid JID: node too long." +msgstr "Ðеважечки JID: јазолот е предолг." + +#. TRANS: Exception thrown when using an invalid Jabber ID. +#. TRANS: %s is the invalid Jabber ID. +#, php-format +msgid "Invalid JID node \"%s\"." +msgstr "Ðеважечки јазол од JID „%s“." + +#. TRANS: Exception thrown when using too long a Jabber domain (>1023). +msgid "Invalid JID: domain too long." +msgstr "Ðеважечки JID: доменот е предолг." + +#. TRANS: Exception thrown when using an invalid Jabber domain name. +#. TRANS: %s is the invalid domain name. +#, php-format +msgid "Invalid JID domain name \"%s\"." +msgstr "Ðеважечко доменÑко име од JID „%s“." + +#. TRANS: Exception thrown when using an invalid Jabber resource. +#. TRANS: %s is the invalid resource. +#, php-format +msgid "Invalid JID resource \"%s\"." +msgstr "Ðеважечки реÑÑƒÑ€Ñ Ð¾Ð´ JID „%s“." + +#. TRANS: Link description to notice in conversation. #. TRANS: %s is a notice ID. #, php-format msgid "[%s]" msgstr "[%s]" +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a server in the configuration." +msgstr "Мора да наведете опÑлужувач во поÑтавувањето." + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a port in the configuration." +msgstr "Мора да наведете порта во поÑтавувањето." + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a user in the configuration." +msgstr "Мора да назначите кориÑник во поÑтавувањето." + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a password in the configuration." +msgstr "Мора да назначите лозинка во поÑтавувањето." + +#. TRANS: Plugin description. msgid "" "The XMPP plugin allows users to send and receive notices over the XMPP/" "Jabber network." diff --git a/plugins/Xmpp/locale/ms/LC_MESSAGES/Xmpp.po b/plugins/Xmpp/locale/ms/LC_MESSAGES/Xmpp.po index a279d0aafe..5c2a1d04b6 100644 --- a/plugins/Xmpp/locale/ms/LC_MESSAGES/Xmpp.po +++ b/plugins/Xmpp/locale/ms/LC_MESSAGES/Xmpp.po @@ -9,29 +9,84 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Xmpp\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:56+0000\n" +"POT-Creation-Date: 2011-06-18 15:54+0000\n" +"PO-Revision-Date: 2011-06-18 15:58:03+0000\n" "Language-Team: Malay \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" +"X-POT-Import-Date: 2011-06-05 21:52:15+0000\n" +"X-Generator: MediaWiki 1.19alpha (r90318); Translate extension (2011-06-02)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ms\n" "X-Message-Group: #out-statusnet-plugin-xmpp\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Presence announcement for XMPP. +#. TRANS: Message for XMPP reconnect. msgid "Send me a message to post a notice" msgstr "Hantarkan pesanan kepada saya untuk mengirim notis" +#. TRANS: Plugin display name. msgid "XMPP/Jabber/GTalk" msgstr "XMPP/Jabber/GTalk" +#. TRANS: Exception thrown when using too many @ signs in a Jabber ID. +msgid "Invalid JID: too many @s." +msgstr "" + +#. TRANS: Exception thrown when using @ sign not followed by a Jabber ID. +msgid "Invalid JID: @ but no node" +msgstr "" + +#. TRANS: Exception thrown when using too long a Jabber ID (>1023). +msgid "Invalid JID: node too long." +msgstr "" + +#. TRANS: Exception thrown when using an invalid Jabber ID. +#. TRANS: %s is the invalid Jabber ID. +#, php-format +msgid "Invalid JID node \"%s\"." +msgstr "" + +#. TRANS: Exception thrown when using too long a Jabber domain (>1023). +msgid "Invalid JID: domain too long." +msgstr "" + +#. TRANS: Exception thrown when using an invalid Jabber domain name. +#. TRANS: %s is the invalid domain name. +#, php-format +msgid "Invalid JID domain name \"%s\"." +msgstr "" + +#. TRANS: Exception thrown when using an invalid Jabber resource. +#. TRANS: %s is the invalid resource. +#, php-format +msgid "Invalid JID resource \"%s\"." +msgstr "" + +#. TRANS: Link description to notice in conversation. #. TRANS: %s is a notice ID. #, php-format msgid "[%s]" msgstr "[%s]" +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a server in the configuration." +msgstr "" + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a port in the configuration." +msgstr "" + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a user in the configuration." +msgstr "" + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a password in the configuration." +msgstr "" + +#. TRANS: Plugin description. msgid "" "The XMPP plugin allows users to send and receive notices over the XMPP/" "Jabber network." diff --git a/plugins/Xmpp/locale/nl/LC_MESSAGES/Xmpp.po b/plugins/Xmpp/locale/nl/LC_MESSAGES/Xmpp.po index fb50a4994c..af31d7b1f5 100644 --- a/plugins/Xmpp/locale/nl/LC_MESSAGES/Xmpp.po +++ b/plugins/Xmpp/locale/nl/LC_MESSAGES/Xmpp.po @@ -9,29 +9,84 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Xmpp\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:56+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:32+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:56+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-xmpp\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Presence announcement for XMPP. +#. TRANS: Message for XMPP reconnect. msgid "Send me a message to post a notice" msgstr "Mij een bericht sturen om een mededeling te verzenden" +#. TRANS: Plugin display name. msgid "XMPP/Jabber/GTalk" msgstr "XMPP/Jabber/Google Talk" +#. TRANS: Exception thrown when using too many @ signs in a Jabber ID. +msgid "Invalid JID: too many @s." +msgstr "Ongeldige JID: te veel @'s." + +#. TRANS: Exception thrown when using @ sign not followed by a Jabber ID. +msgid "Invalid JID: @ but no node" +msgstr "Ongeldige JID: @ maar geen node" + +#. TRANS: Exception thrown when using too long a Jabber ID (>1023). +msgid "Invalid JID: node too long." +msgstr "Ongeldige JID: de node is te lang." + +#. TRANS: Exception thrown when using an invalid Jabber ID. +#. TRANS: %s is the invalid Jabber ID. +#, php-format +msgid "Invalid JID node \"%s\"." +msgstr "Ongeldige JID node \"%s\"." + +#. TRANS: Exception thrown when using too long a Jabber domain (>1023). +msgid "Invalid JID: domain too long." +msgstr "Ongeldige JID: het domein is te lang." + +#. TRANS: Exception thrown when using an invalid Jabber domain name. +#. TRANS: %s is the invalid domain name. +#, php-format +msgid "Invalid JID domain name \"%s\"." +msgstr "Ongeldige JID-domeinnaam \"%s\"." + +#. TRANS: Exception thrown when using an invalid Jabber resource. +#. TRANS: %s is the invalid resource. +#, php-format +msgid "Invalid JID resource \"%s\"." +msgstr "Ongeldige JID-bron \"%s\"." + +#. TRANS: Link description to notice in conversation. #. TRANS: %s is a notice ID. #, php-format msgid "[%s]" msgstr "[%s]" +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a server in the configuration." +msgstr "U moet in de instellingen een server opgeven." + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a port in the configuration." +msgstr "U moet in de instellingen een poort opgeven." + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a user in the configuration." +msgstr "U moet in de instellingen een gebruiker opgeven." + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a password in the configuration." +msgstr "U moet in de instellingen een wachtwoord opgeven." + +#. TRANS: Plugin description. msgid "" "The XMPP plugin allows users to send and receive notices over the XMPP/" "Jabber network." diff --git a/plugins/Xmpp/locale/pl/LC_MESSAGES/Xmpp.po b/plugins/Xmpp/locale/pl/LC_MESSAGES/Xmpp.po new file mode 100644 index 0000000000..417603fad2 --- /dev/null +++ b/plugins/Xmpp/locale/pl/LC_MESSAGES/Xmpp.po @@ -0,0 +1,94 @@ +# Translation of StatusNet - Xmpp to Polish (polski) +# Exported from translatewiki.net +# +# Author: BeginaFelicysym +# Author: Woytecr +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Xmpp\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:32+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-06-19 11:23:56+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=3; plural=(n == 1) ? 0 : ( (n%10 >= 2 && n%10 <= 4 && " +"(n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" + +#. TRANS: Presence announcement for XMPP. +#. TRANS: Message for XMPP reconnect. +msgid "Send me a message to post a notice" +msgstr "WyÅ›lij do mnie wiadomość dodania ogÅ‚oszenia" + +#. TRANS: Plugin display name. +msgid "XMPP/Jabber/GTalk" +msgstr "XMPP/Jabber/GTalk" + +#. TRANS: Exception thrown when using too many @ signs in a Jabber ID. +msgid "Invalid JID: too many @s." +msgstr "NieprawidÅ‚owy JID: zbyt wiele znaków @." + +#. TRANS: Exception thrown when using @ sign not followed by a Jabber ID. +msgid "Invalid JID: @ but no node" +msgstr "NieprawidÅ‚owy JID: jest @ ale brak wÄ™zÅ‚a" + +#. TRANS: Exception thrown when using too long a Jabber ID (>1023). +msgid "Invalid JID: node too long." +msgstr "NieprawidÅ‚owy JID: za dÅ‚ugi wÄ™zeÅ‚." + +#. TRANS: Exception thrown when using an invalid Jabber ID. +#. TRANS: %s is the invalid Jabber ID. +#, php-format +msgid "Invalid JID node \"%s\"." +msgstr "NieprawidÅ‚owy wÄ™zeÅ‚ \"%s\" w JID." + +#. TRANS: Exception thrown when using too long a Jabber domain (>1023). +msgid "Invalid JID: domain too long." +msgstr "NieprawidÅ‚owy JID: za dÅ‚uga domena." + +#. TRANS: Exception thrown when using an invalid Jabber domain name. +#. TRANS: %s is the invalid domain name. +#, php-format +msgid "Invalid JID domain name \"%s\"." +msgstr "NieprawidÅ‚owa nazwa domeny \"%s\" w JID." + +#. TRANS: Exception thrown when using an invalid Jabber resource. +#. TRANS: %s is the invalid resource. +#, php-format +msgid "Invalid JID resource \"%s\"." +msgstr "NieprawidÅ‚owy zasób \"%s\" w JID." + +#. TRANS: Link description to notice in conversation. +#. TRANS: %s is a notice ID. +#, php-format +msgid "[%s]" +msgstr "[%s]" + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a server in the configuration." +msgstr "Musisz okreÅ›lić serwer w konfiguracji." + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a port in the configuration." +msgstr "Należy okreÅ›lić port w konfiguracji." + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a user in the configuration." +msgstr "Należy okreÅ›lić użytkownika w konfiguracji." + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a password in the configuration." +msgstr "Musisz okreÅ›lić hasÅ‚o w konfiguracji." + +#. TRANS: Plugin description. +msgid "" +"The XMPP plugin allows users to send and receive notices over the XMPP/" +"Jabber network." +msgstr "" +"Wtyczka XMPP umożliwia użytkownikom wysyÅ‚anie i otrzymywanie powiadomieÅ„ w " +"sieci XMPP/Jabber." diff --git a/plugins/Xmpp/locale/pt/LC_MESSAGES/Xmpp.po b/plugins/Xmpp/locale/pt/LC_MESSAGES/Xmpp.po index 9c3a2f298c..69568f4e29 100644 --- a/plugins/Xmpp/locale/pt/LC_MESSAGES/Xmpp.po +++ b/plugins/Xmpp/locale/pt/LC_MESSAGES/Xmpp.po @@ -9,29 +9,84 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Xmpp\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:56+0000\n" +"POT-Creation-Date: 2011-06-18 15:54+0000\n" +"PO-Revision-Date: 2011-06-18 15:58:03+0000\n" "Language-Team: Portuguese \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" +"X-POT-Import-Date: 2011-06-05 21:52:15+0000\n" +"X-Generator: MediaWiki 1.19alpha (r90318); Translate extension (2011-06-02)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: pt\n" "X-Message-Group: #out-statusnet-plugin-xmpp\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Presence announcement for XMPP. +#. TRANS: Message for XMPP reconnect. msgid "Send me a message to post a notice" msgstr "Envia-me uma mensagem para postar uma notícia" +#. TRANS: Plugin display name. msgid "XMPP/Jabber/GTalk" msgstr "XMPP/Jabber/GTalk" +#. TRANS: Exception thrown when using too many @ signs in a Jabber ID. +msgid "Invalid JID: too many @s." +msgstr "" + +#. TRANS: Exception thrown when using @ sign not followed by a Jabber ID. +msgid "Invalid JID: @ but no node" +msgstr "" + +#. TRANS: Exception thrown when using too long a Jabber ID (>1023). +msgid "Invalid JID: node too long." +msgstr "" + +#. TRANS: Exception thrown when using an invalid Jabber ID. +#. TRANS: %s is the invalid Jabber ID. +#, php-format +msgid "Invalid JID node \"%s\"." +msgstr "" + +#. TRANS: Exception thrown when using too long a Jabber domain (>1023). +msgid "Invalid JID: domain too long." +msgstr "" + +#. TRANS: Exception thrown when using an invalid Jabber domain name. +#. TRANS: %s is the invalid domain name. +#, php-format +msgid "Invalid JID domain name \"%s\"." +msgstr "" + +#. TRANS: Exception thrown when using an invalid Jabber resource. +#. TRANS: %s is the invalid resource. +#, php-format +msgid "Invalid JID resource \"%s\"." +msgstr "" + +#. TRANS: Link description to notice in conversation. #. TRANS: %s is a notice ID. #, php-format msgid "[%s]" msgstr "" +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a server in the configuration." +msgstr "" + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a port in the configuration." +msgstr "" + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a user in the configuration." +msgstr "" + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a password in the configuration." +msgstr "" + +#. TRANS: Plugin description. msgid "" "The XMPP plugin allows users to send and receive notices over the XMPP/" "Jabber network." diff --git a/plugins/Xmpp/locale/sv/LC_MESSAGES/Xmpp.po b/plugins/Xmpp/locale/sv/LC_MESSAGES/Xmpp.po index 08bdf588f7..f1006df471 100644 --- a/plugins/Xmpp/locale/sv/LC_MESSAGES/Xmpp.po +++ b/plugins/Xmpp/locale/sv/LC_MESSAGES/Xmpp.po @@ -9,29 +9,84 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Xmpp\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:56+0000\n" +"POT-Creation-Date: 2011-06-18 15:54+0000\n" +"PO-Revision-Date: 2011-06-18 15:58:03+0000\n" "Language-Team: Swedish \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" +"X-POT-Import-Date: 2011-06-05 21:52:15+0000\n" +"X-Generator: MediaWiki 1.19alpha (r90318); Translate extension (2011-06-02)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: sv\n" "X-Message-Group: #out-statusnet-plugin-xmpp\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Presence announcement for XMPP. +#. TRANS: Message for XMPP reconnect. msgid "Send me a message to post a notice" msgstr "" +#. TRANS: Plugin display name. msgid "XMPP/Jabber/GTalk" msgstr "XMPP/Jabber/GTalk" +#. TRANS: Exception thrown when using too many @ signs in a Jabber ID. +msgid "Invalid JID: too many @s." +msgstr "" + +#. TRANS: Exception thrown when using @ sign not followed by a Jabber ID. +msgid "Invalid JID: @ but no node" +msgstr "" + +#. TRANS: Exception thrown when using too long a Jabber ID (>1023). +msgid "Invalid JID: node too long." +msgstr "" + +#. TRANS: Exception thrown when using an invalid Jabber ID. +#. TRANS: %s is the invalid Jabber ID. +#, php-format +msgid "Invalid JID node \"%s\"." +msgstr "" + +#. TRANS: Exception thrown when using too long a Jabber domain (>1023). +msgid "Invalid JID: domain too long." +msgstr "" + +#. TRANS: Exception thrown when using an invalid Jabber domain name. +#. TRANS: %s is the invalid domain name. +#, php-format +msgid "Invalid JID domain name \"%s\"." +msgstr "" + +#. TRANS: Exception thrown when using an invalid Jabber resource. +#. TRANS: %s is the invalid resource. +#, php-format +msgid "Invalid JID resource \"%s\"." +msgstr "" + +#. TRANS: Link description to notice in conversation. #. TRANS: %s is a notice ID. #, php-format msgid "[%s]" msgstr "" +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a server in the configuration." +msgstr "" + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a port in the configuration." +msgstr "" + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a user in the configuration." +msgstr "" + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a password in the configuration." +msgstr "" + +#. TRANS: Plugin description. msgid "" "The XMPP plugin allows users to send and receive notices over the XMPP/" "Jabber network." diff --git a/plugins/Xmpp/locale/tl/LC_MESSAGES/Xmpp.po b/plugins/Xmpp/locale/tl/LC_MESSAGES/Xmpp.po index b618e0508f..eddef4a2dc 100644 --- a/plugins/Xmpp/locale/tl/LC_MESSAGES/Xmpp.po +++ b/plugins/Xmpp/locale/tl/LC_MESSAGES/Xmpp.po @@ -9,29 +9,84 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Xmpp\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:56+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:32+0000\n" "Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-06-19 11:23:56+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-xmpp\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Presence announcement for XMPP. +#. TRANS: Message for XMPP reconnect. msgid "Send me a message to post a notice" msgstr "Padalhan ako ng isang mensahe upang makapagpaskil ng isang pabatid" +#. TRANS: Plugin display name. msgid "XMPP/Jabber/GTalk" msgstr "XMPP/Jabber/GTalk" +#. TRANS: Exception thrown when using too many @ signs in a Jabber ID. +msgid "Invalid JID: too many @s." +msgstr "Hindi katanggap-tanggap na JID: napakaraming mga @s." + +#. TRANS: Exception thrown when using @ sign not followed by a Jabber ID. +msgid "Invalid JID: @ but no node" +msgstr "Hindi katanggap-tanggap na JID: @ ngunit walang buko" + +#. TRANS: Exception thrown when using too long a Jabber ID (>1023). +msgid "Invalid JID: node too long." +msgstr "Hindi katanggap-tanggap na JID: napakahaba ng buko." + +#. TRANS: Exception thrown when using an invalid Jabber ID. +#. TRANS: %s is the invalid Jabber ID. +#, php-format +msgid "Invalid JID node \"%s\"." +msgstr "Hindi katanggap-tanggap na buko ng JID na \"%s\"." + +#. TRANS: Exception thrown when using too long a Jabber domain (>1023). +msgid "Invalid JID: domain too long." +msgstr "Hindi katanggap-tanggap na JID: napakahaba ng sakop." + +#. TRANS: Exception thrown when using an invalid Jabber domain name. +#. TRANS: %s is the invalid domain name. +#, php-format +msgid "Invalid JID domain name \"%s\"." +msgstr "Hindi katanggap-tanggap na pangalan ng saklaw na \"%s\"." + +#. TRANS: Exception thrown when using an invalid Jabber resource. +#. TRANS: %s is the invalid resource. +#, php-format +msgid "Invalid JID resource \"%s\"." +msgstr "Hindi katanggap-tanggap na pinagkunan ng JID na \"%s\"." + +#. TRANS: Link description to notice in conversation. #. TRANS: %s is a notice ID. #, php-format msgid "[%s]" msgstr "[%s]" +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a server in the configuration." +msgstr "Dapat kang tumukoy ng isang tagapaghain sa loob ng pagkakaayos." + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a port in the configuration." +msgstr "Dapat kang tumukoy ng isang daungan sa loob ng kaayusan." + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a user in the configuration." +msgstr "Dapat kang tumukoy ng isang tagagamit sa loob ng pagkakaayos." + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a password in the configuration." +msgstr "Dapat kang tumukoy ng isang hudyat sa loob ng kaayusan." + +#. TRANS: Plugin description. msgid "" "The XMPP plugin allows users to send and receive notices over the XMPP/" "Jabber network." diff --git a/plugins/Xmpp/locale/uk/LC_MESSAGES/Xmpp.po b/plugins/Xmpp/locale/uk/LC_MESSAGES/Xmpp.po index 6aa5e1bed9..2bbf330f68 100644 --- a/plugins/Xmpp/locale/uk/LC_MESSAGES/Xmpp.po +++ b/plugins/Xmpp/locale/uk/LC_MESSAGES/Xmpp.po @@ -9,30 +9,85 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Xmpp\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:51:56+0000\n" +"POT-Creation-Date: 2011-06-18 15:54+0000\n" +"PO-Revision-Date: 2011-06-18 15:58:04+0000\n" "Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:55+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" +"X-POT-Import-Date: 2011-06-05 21:52:15+0000\n" +"X-Generator: MediaWiki 1.19alpha (r90318); Translate extension (2011-06-02)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-xmpp\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Presence announcement for XMPP. +#. TRANS: Message for XMPP reconnect. msgid "Send me a message to post a notice" msgstr "Ðадішліть мені повідомленнÑ, щоб опублікувати допиÑ" +#. TRANS: Plugin display name. msgid "XMPP/Jabber/GTalk" msgstr "XMPP/Jabber/GTalk" +#. TRANS: Exception thrown when using too many @ signs in a Jabber ID. +msgid "Invalid JID: too many @s." +msgstr "" + +#. TRANS: Exception thrown when using @ sign not followed by a Jabber ID. +msgid "Invalid JID: @ but no node" +msgstr "" + +#. TRANS: Exception thrown when using too long a Jabber ID (>1023). +msgid "Invalid JID: node too long." +msgstr "" + +#. TRANS: Exception thrown when using an invalid Jabber ID. +#. TRANS: %s is the invalid Jabber ID. +#, php-format +msgid "Invalid JID node \"%s\"." +msgstr "" + +#. TRANS: Exception thrown when using too long a Jabber domain (>1023). +msgid "Invalid JID: domain too long." +msgstr "" + +#. TRANS: Exception thrown when using an invalid Jabber domain name. +#. TRANS: %s is the invalid domain name. +#, php-format +msgid "Invalid JID domain name \"%s\"." +msgstr "" + +#. TRANS: Exception thrown when using an invalid Jabber resource. +#. TRANS: %s is the invalid resource. +#, php-format +msgid "Invalid JID resource \"%s\"." +msgstr "" + +#. TRANS: Link description to notice in conversation. #. TRANS: %s is a notice ID. #, php-format msgid "[%s]" msgstr "[%s]" +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a server in the configuration." +msgstr "" + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a port in the configuration." +msgstr "" + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a user in the configuration." +msgstr "" + +#. TRANS: Exception thrown when the plugin configuration is incorrect. +msgid "You must specify a password in the configuration." +msgstr "" + +#. TRANS: Plugin description. msgid "" "The XMPP plugin allows users to send and receive notices over the XMPP/" "Jabber network." diff --git a/plugins/Xmpp/xmppmanager.php b/plugins/Xmpp/xmppmanager.php index 4aaed677b5..c7d4c15dd6 100644 --- a/plugins/Xmpp/xmppmanager.php +++ b/plugins/Xmpp/xmppmanager.php @@ -29,16 +29,14 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } * In a multi-site queuedaemon.php run, one connection will be instantiated * for each site being handled by the current process that has XMPP enabled. */ - class XmppManager extends ImManager { protected $lastping = null; protected $pingid = null; public $conn = null; - + const PING_INTERVAL = 120; - /** * Initialize connection to server. @@ -114,7 +112,7 @@ class XmppManager extends ImManager * * Side effect: kills process on exception from XMPP library. * - * @fixme non-dying error handling + * @todo FIXME: non-dying error handling */ public function idle($timeout=0) { @@ -165,6 +163,7 @@ class XmppManager extends ImManager } $this->conn->processUntil('session_start'); + // TRANS: Presence announcement for XMPP. $this->send_presence(_m('Send me a message to post a notice'), 'available', null, 'available', 100); } return $this->conn; @@ -204,6 +203,7 @@ class XmppManager extends ImManager common_log(LOG_NOTICE, 'XMPP reconnected'); $this->conn->processUntil('session_start'); + // TRANS: Message for XMPP reconnect. $this->send_presence(_m('Send me a message to post a notice'), 'available', null, 'available', 100); } @@ -245,7 +245,7 @@ class XmppManager extends ImManager function special_presence($type, $to=null, $show=null, $status=null) { - // FIXME: why use this instead of send_presence()? + // @todo FIXME: why use this instead of send_presence()? $this->connect(); if (!$this->conn || $this->conn->isDisconnected()) { return false; diff --git a/plugins/YammerImport/README b/plugins/YammerImport/README index 975faa2132..db16744dce 100644 --- a/plugins/YammerImport/README +++ b/plugins/YammerImport/README @@ -139,8 +139,6 @@ File type and size limitations on attachments will be applied, so beware some attachments may not make it through. - - Code structure ============== @@ -179,4 +177,3 @@ Yammer_notice_stub: data object for temporary storage of fetched Yammer messages Yammer_user, Yammer_group, Yammer_notice: data objects mapping original Yammer item IDs to their local copies. - diff --git a/plugins/YammerImport/YammerImportPlugin.php b/plugins/YammerImport/YammerImportPlugin.php index 41d8d08a66..b93eb3ba4a 100644 --- a/plugins/YammerImport/YammerImportPlugin.php +++ b/plugins/YammerImport/YammerImportPlugin.php @@ -95,8 +95,10 @@ class YammerImportPlugin extends Plugin $action_name = $nav->action->trimmed('action'); $nav->out->menuItem(common_local_url('yammeradminpanel'), - _m('Yammer'), - _m('Yammer import'), + // TRANS: Menu item for Yammer import. + _m('MENU','Yammer'), + // TRANS: Menu item title for Yammer import. + _m('Yammer import module.'), $action_name == 'yammeradminpanel', 'nav_yammer_admin_panel'); } diff --git a/plugins/YammerImport/actions/yammeradminpanel.php b/plugins/YammerImport/actions/yammeradminpanel.php index 4714154290..f8e099109e 100644 --- a/plugins/YammerImport/actions/yammeradminpanel.php +++ b/plugins/YammerImport/actions/yammeradminpanel.php @@ -42,6 +42,7 @@ class YammeradminpanelAction extends AdminPanelAction */ function title() { + // TRANS: Page title for Yammer import administration panel. return _m('Yammer Import'); } @@ -52,6 +53,7 @@ class YammeradminpanelAction extends AdminPanelAction */ function getInstructions() { + // TRANS: Instructions for Yammer import administration panel. return _m('This Yammer import tool is still undergoing testing, ' . 'and is incomplete in some areas. ' . 'Currently user subscriptions and group memberships are not ' . @@ -99,6 +101,7 @@ class YammeradminpanelAction extends AdminPanelAction $form = new YammerProgressForm($this, $this->runner); } else if ($this->subaction == 'pause-import') { + // TRANS: Error message about an import job being paused from the admin panel. $this->runner->recordError(_m('Paused from admin panel.')); $form = $this->statusForm(); } else if ($this->subaction == 'continue-import') { @@ -111,7 +114,8 @@ class YammeradminpanelAction extends AdminPanelAction } else if ($this->subaction == 'progress') { $form = $this->statusForm(); } else { - throw new ClientException('Invalid POST'); + // TRANS: Client exception thrown when encountering an unhandled sub action. + throw new ClientException(_m('Invalid POST')); } return $this->showAjaxForm($form); } @@ -132,6 +136,7 @@ class YammeradminpanelAction extends AdminPanelAction { $this->startHTML('text/xml;charset=utf-8'); $this->elementStart('head'); + // TRANS: Page title for Yammer import administration panel. $this->element('title', null, _m('Yammer import')); $this->elementEnd('head'); $this->elementStart('body'); diff --git a/plugins/YammerImport/actions/yammerauth.php b/plugins/YammerImport/actions/yammerauth.php index d0d4b40c71..d25be91440 100644 --- a/plugins/YammerImport/actions/yammerauth.php +++ b/plugins/YammerImport/actions/yammerauth.php @@ -33,7 +33,6 @@ if (!defined('STATUSNET')) { class YammerauthAction extends AdminPanelAction { - /** * Show the Yammer admin panel form * @@ -42,7 +41,7 @@ class YammerauthAction extends AdminPanelAction function prepare($args) { parent::prepare($args); - + $this->verify_token = $this->trim('verify_token'); } @@ -55,7 +54,6 @@ class YammerauthAction extends AdminPanelAction * * @return void */ - function handle($args) { if ($this->verify_token) { @@ -68,6 +66,7 @@ class YammerauthAction extends AdminPanelAction $this->startHTML('text/xml;charset=utf-8'); $this->elementStart('head'); + // TRANS: Page title for Yammer administration panel. $this->element('title', null, _m('Connect to Yammer')); $this->elementEnd('head'); $this->elementStart('body'); @@ -76,4 +75,3 @@ class YammerauthAction extends AdminPanelAction $this->elementEnd('html'); } } - diff --git a/plugins/YammerImport/classes/Yammer_common.php b/plugins/YammerImport/classes/Yammer_common.php index 6ec6fc9041..e262623263 100644 --- a/plugins/YammerImport/classes/Yammer_common.php +++ b/plugins/YammerImport/classes/Yammer_common.php @@ -40,7 +40,6 @@ if (!defined('STATUSNET')) { * - schemaDef (call self::doSchemaDef) * - record (call self::doRecord) */ - class Yammer_common extends Memcached_DataObject { public $__table = 'yammer_XXXX'; // table name @@ -50,7 +49,7 @@ class Yammer_common extends Memcached_DataObject public $created; // datetime /** - * @fixme add a 'references' thing for the foreign key when we support that + * @todo FIXME: Add a 'references' thing for the foreign key when we support that */ protected static function doSchemaDef($field) { @@ -87,7 +86,6 @@ class Yammer_common extends Memcached_DataObject * * @return array list of key field names */ - function keys() { return array_keys($this->keyTypes()); @@ -105,7 +103,6 @@ class Yammer_common extends Memcached_DataObject * 'K' for primary key: for compound keys, add an entry for each component; * 'U' for unique keys: compound keys are not well supported here. */ - function keyTypes() { return array('id' => 'K', $this->__field => 'U'); @@ -121,7 +118,6 @@ class Yammer_common extends Memcached_DataObject * * @return array magic three-false array that stops auto-incrementing. */ - function sequenceKey() { return array(false, false, false); @@ -135,7 +131,6 @@ class Yammer_common extends Memcached_DataObject * * @return Yammer_common new object for this value */ - protected static function doRecord($class, $field, $orig_id, $local_id) { $map = parent::staticGet($class, 'id', $orig_id); diff --git a/plugins/YammerImport/classes/Yammer_group.php b/plugins/YammerImport/classes/Yammer_group.php index 4e7a6ebd03..a52b5119d4 100644 --- a/plugins/YammerImport/classes/Yammer_group.php +++ b/plugins/YammerImport/classes/Yammer_group.php @@ -48,7 +48,6 @@ class Yammer_group extends Yammer_common * @return Yammer_group object found, or null for no hits * */ - function staticGet($k, $v=null) { return Memcached_DataObject::staticGet('Yammer_group', $k, $v); @@ -57,7 +56,6 @@ class Yammer_group extends Yammer_common /** * Return schema definition to set this table up in onCheckSchema */ - static function schemaDef() { return self::doSchemaDef('group_id'); @@ -71,7 +69,6 @@ class Yammer_group extends Yammer_common * * @return Yammer_group new object for this value */ - static function record($orig_id, $group_id) { return self::doRecord('Yammer_group', 'group_id', $orig_id, $group_id); diff --git a/plugins/YammerImport/classes/Yammer_notice.php b/plugins/YammerImport/classes/Yammer_notice.php index 0f63db6303..118266aed0 100644 --- a/plugins/YammerImport/classes/Yammer_notice.php +++ b/plugins/YammerImport/classes/Yammer_notice.php @@ -48,7 +48,6 @@ class Yammer_notice extends Yammer_common * @return Yammer_notice object found, or null for no hits * */ - function staticGet($k, $v=null) { return Memcached_DataObject::staticGet('Yammer_notice', $k, $v); @@ -57,7 +56,6 @@ class Yammer_notice extends Yammer_common /** * Return schema definition to set this table up in onCheckSchema */ - static function schemaDef() { return self::doSchemaDef('notice_id'); @@ -71,7 +69,6 @@ class Yammer_notice extends Yammer_common * * @return Yammer_notice new object for this value */ - static function record($orig_id, $notice_id) { return self::doRecord('Yammer_notice', 'notice_id', $orig_id, $notice_id); diff --git a/plugins/YammerImport/classes/Yammer_notice_stub.php b/plugins/YammerImport/classes/Yammer_notice_stub.php index e10300c4c7..6dd78206d2 100644 --- a/plugins/YammerImport/classes/Yammer_notice_stub.php +++ b/plugins/YammerImport/classes/Yammer_notice_stub.php @@ -40,7 +40,6 @@ if (!defined('STATUSNET')) { * down in reverse chronological order, then go back over them from oldest to * newest and actually save them into our notice table. */ - class Yammer_notice_stub extends Memcached_DataObject { public $__table = 'yammer_notice_stub'; // table name @@ -57,9 +56,7 @@ class Yammer_notice_stub extends Memcached_DataObject * @param mixed $v Value to lookup * * @return Yammer_notice_stub object found, or null for no hits - * */ - function staticGet($k, $v=null) { return Memcached_DataObject::staticGet('Yammer_notice_stub', $k, $v); @@ -86,7 +83,6 @@ class Yammer_notice_stub extends Memcached_DataObject * * @return array array of column definitions */ - function table() { return array('id' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL, @@ -121,7 +117,6 @@ class Yammer_notice_stub extends Memcached_DataObject * 'K' for primary key: for compound keys, add an entry for each component; * 'U' for unique keys: compound keys are not well supported here. */ - function keyTypes() { return array('id' => 'K'); @@ -137,7 +132,6 @@ class Yammer_notice_stub extends Memcached_DataObject * * @return array magic three-false array that stops auto-incrementing. */ - function sequenceKey() { return array(false, false, false); diff --git a/plugins/YammerImport/classes/Yammer_state.php b/plugins/YammerImport/classes/Yammer_state.php index 88bd693bfd..548fbbf024 100644 --- a/plugins/YammerImport/classes/Yammer_state.php +++ b/plugins/YammerImport/classes/Yammer_state.php @@ -55,9 +55,7 @@ class Yammer_state extends Memcached_DataObject * @param mixed $v Value to lookup * * @return Yammer_state object found, or null for no hits - * */ - function staticGet($k, $v=null) { return Memcached_DataObject::staticGet('Yammer_state', $k, $v); @@ -90,7 +88,6 @@ class Yammer_state extends Memcached_DataObject * * @return array array of column definitions */ - function table() { return array('id' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL, @@ -114,7 +111,6 @@ class Yammer_state extends Memcached_DataObject * * @return array list of key field names */ - function keys() { return array_keys($this->keyTypes()); @@ -132,7 +128,6 @@ class Yammer_state extends Memcached_DataObject * 'K' for primary key: for compound keys, add an entry for each component; * 'U' for unique keys: compound keys are not well supported here. */ - function keyTypes() { return array('id' => 'K'); @@ -148,7 +143,6 @@ class Yammer_state extends Memcached_DataObject * * @return array magic three-false array that stops auto-incrementing. */ - function sequenceKey() { return array(false, false, false); diff --git a/plugins/YammerImport/classes/Yammer_user.php b/plugins/YammerImport/classes/Yammer_user.php index f6fcd6c3cb..8139613347 100644 --- a/plugins/YammerImport/classes/Yammer_user.php +++ b/plugins/YammerImport/classes/Yammer_user.php @@ -48,7 +48,6 @@ class Yammer_user extends Yammer_common * @return Yammer_user object found, or null for no hits * */ - function staticGet($k, $v=null) { return Memcached_DataObject::staticGet('Yammer_user', $k, $v); @@ -57,7 +56,6 @@ class Yammer_user extends Yammer_common /** * Return schema definition to set this table up in onCheckSchema */ - static function schemaDef() { return self::doSchemaDef('user_id'); @@ -71,7 +69,6 @@ class Yammer_user extends Yammer_common * * @return Yammer_user new object for this value */ - static function record($orig_id, $user_id) { return self::doRecord('Yammer_user', 'user_id', $orig_id, $user_id); diff --git a/plugins/YammerImport/lib/sn_yammerclient.php b/plugins/YammerImport/lib/sn_yammerclient.php index 5da1cc5e7e..2827bdc53a 100644 --- a/plugins/YammerImport/lib/sn_yammerclient.php +++ b/plugins/YammerImport/lib/sn_yammerclient.php @@ -19,7 +19,7 @@ /** * Basic client class for Yammer's OAuth/JSON API. - * + * * @package YammerImportPlugin * @author Brion Vibber */ @@ -69,7 +69,11 @@ class SN_YammerClient if ($response->isOk()) { return $response->getBody(); } else { - throw new Exception("Yammer API returned HTTP code " . $response->getStatus() . ': ' . $response->getBody()); + // TRANS: Exeption thrown when an external Yammer system gives an error. + // TRANS: %1$s is an HTTP error code, %2$s is the error message body. + throw new Exception(sprintf(_m('Yammer API returned HTTP code %1$s: %2$s'), + $response->getStatus(), + $response->getBody())); } } @@ -106,7 +110,8 @@ class SN_YammerClient $data = json_decode($body, true); if ($data === null) { common_log(LOG_ERR, "Invalid JSON response from Yammer API: " . $body); - throw new Exception("Invalid JSON response from Yammer API"); + // TRANS: Exeption thrown when an external Yammer system an invalid JSON response. + throw new Exception(_m('Invalid JSON response from Yammer API.')); } return $data; } @@ -160,7 +165,8 @@ class SN_YammerClient public function requestToken() { if ($this->token || $this->tokenSecret) { - throw new Exception("Requesting a token, but already set up with a token"); + // TRANS: Exeption thrown when a trust relationship has already been established. + throw new Exception(_m('Requesting a token, but already set up with a token.')); } $data = $this->fetchApi('oauth/request_token'); $arr = array(); diff --git a/plugins/YammerImport/lib/yammerapikeyform.php b/plugins/YammerImport/lib/yammerapikeyform.php index b2acec4ede..72c14c30ce 100644 --- a/plugins/YammerImport/lib/yammerapikeyform.php +++ b/plugins/YammerImport/lib/yammerapikeyform.php @@ -53,6 +53,7 @@ class YammerApikeyForm extends Form */ function formLegend() { + // TRANS: Form legend for adding details to connect to a remote Yammer API. $this->out->element('legend', null, _m('Yammer API registration')); } @@ -69,6 +70,7 @@ class YammerApikeyForm extends Form $this->out->elementStart('fieldset'); $this->out->elementStart('p'); + // TRANS: Explanation of what needs to be done to connect to a Yammer network. $this->out->text(_m('Before we can connect to your Yammer network, ' . 'you will need to register the importer as an ' . 'application authorized to pull data on your behalf. ' . @@ -81,21 +83,28 @@ class YammerApikeyForm extends Form $this->out->element('a', array('href' => 'https://www.yammer.com/client_applications/new', 'target' => '_blank'), + // TRANS: Link description to a Yammer application registration form. _m('Open Yammer application registration form')); $this->out->elementEnd('p'); + // TRANS: Instructions. $this->out->element('p', array(), _m('Copy the consumer key and secret you are given into the form below:')); $this->out->elementStart('ul', array('class' => 'form_data')); $this->out->elementStart('li'); + // TRANS: Field label for a Yammer consumer key. $this->out->input('consumer_key', _m('Consumer key:'), common_config('yammer', 'consumer_key')); $this->out->elementEnd('li'); $this->out->elementStart('li'); + // TRANS: Field label for a Yammer consumer secret. $this->out->input('consumer_secret', _m('Consumer secret:'), common_config('yammer', 'consumer_secret')); $this->out->elementEnd('li'); $this->out->elementEnd('ul'); - $this->out->submit('submit', _m('Save'), 'submit', null, _m('Save these consumer keys')); + // TRANS: Button text for saving a Yammer API registration. + $this->out->submit('submit', _m('BUTTON','Save'), + // TRANS: Button title for saving a Yammer API registration. + 'submit', null, _m('Save the entered consumer key and consumer secret.')); $this->out->elementEnd('fieldset'); } diff --git a/plugins/YammerImport/lib/yammerauthinitform.php b/plugins/YammerImport/lib/yammerauthinitform.php index 9f48fd82a5..c123bbbb9d 100644 --- a/plugins/YammerImport/lib/yammerauthinitform.php +++ b/plugins/YammerImport/lib/yammerauthinitform.php @@ -45,6 +45,7 @@ class YammerAuthInitForm extends Form */ function formLegend() { + // TRANS: Form legend. $this->out->element('legend', null, _m('Connect to Yammer')); } @@ -59,8 +60,12 @@ class YammerAuthInitForm extends Form $this->out->hidden('subaction', 'authinit'); $this->out->elementStart('fieldset'); - $this->out->submit('submit', _m('Start authentication'), 'submit', null, _m('Request authorization to connect to Yammer account')); - $this->out->submit('change-apikey', _m('Change API key')); + // TRANS: Button text for starting Yammer authentication. + $this->out->submit('submit', _m('BUTTON','Start authentication'), + // TRANS: Button title for starting Yammer authentication. + 'submit', null, _m('Request authorization to connect to a Yammer account.')); + // TRANS: Button text for starting changing a Yammer API key. + $this->out->submit('change-apikey', _m('BUTTON','Change API key')); $this->out->elementEnd('fieldset'); } diff --git a/plugins/YammerImport/lib/yammerauthverifyform.php b/plugins/YammerImport/lib/yammerauthverifyform.php index e119be96f7..bb82eba6ae 100644 --- a/plugins/YammerImport/lib/yammerauthverifyform.php +++ b/plugins/YammerImport/lib/yammerauthverifyform.php @@ -53,6 +53,7 @@ class YammerAuthVerifyForm extends Form */ function formLegend() { + // TRANS: Form legend. $this->out->element('legend', null, _m('Connect to Yammer')); } @@ -69,6 +70,7 @@ class YammerAuthVerifyForm extends Form $this->out->elementStart('fieldset'); $this->out->elementStart('p'); + // TRANS: Form instructions. $this->out->text(_m('Follow this link to confirm authorization at Yammer; you will be prompted to log in if necessary:')); $this->out->elementEnd('p'); @@ -84,18 +86,24 @@ class YammerAuthVerifyForm extends Form $this->out->element('a', array('href' => $this->runner->getAuthUrl(), 'target' => '_blank'), + // TRANS: Link description for a link in an external Yammer system. _m('Open Yammer authentication window')); $this->out->elementEnd('p'); - + + // TRANS: Form instructions. $this->out->element('p', array(), _m('Copy the verification code you are given below:')); $this->out->elementStart('ul', array('class' => 'form_data')); $this->out->elementStart('li'); + // TRANS: Field label. $this->out->input('verify_token', _m('Verification code:')); $this->out->elementEnd('li'); $this->out->elementEnd('ul'); - - $this->out->submit('submit', _m('Continue'), 'submit', null, _m('Save code and begin import')); + + // TRANS: Button text for saving Yammer authorisation data and starting Yammer import. + $this->out->submit('submit', _m('BUTTON','Continue'), + // TRANS: Button title for saving Yammer authorisation data and starting Yammer import. + 'submit', null, _m('Save the verification code and begin import.')); $this->out->elementEnd('fieldset'); } diff --git a/plugins/YammerImport/lib/yammerimporter.php b/plugins/YammerImport/lib/yammerimporter.php index 93bc96d529..ffc88ab473 100644 --- a/plugins/YammerImport/lib/yammerimporter.php +++ b/plugins/YammerImport/lib/yammerimporter.php @@ -34,7 +34,7 @@ class YammerImporter /** * Load or create an imported profile from Yammer data. - * + * * @param object $item loaded JSON data for Yammer importer * @return Profile */ @@ -180,7 +180,8 @@ class YammerImporter function prepUser($item) { if ($item['type'] != 'user') { - throw new Exception('Wrong item type sent to Yammer user import processing.'); + // TRANS: Exception thrown when a non-user item type is used, but expected. + throw new Exception(_m('Wrong item type sent to Yammer user import processing.')); } $origId = $item['id']; @@ -227,6 +228,7 @@ class YammerImporter $bio[] = $item['summary']; } if (!empty($item['expertise'])) { + // TRANS: Used as a prefix for the Yammer expertise field contents. $bio[] = _m('Expertise:') . ' ' . $item['expertise']; } $options['bio'] = implode("\n\n", $bio); @@ -262,7 +264,8 @@ class YammerImporter function prepGroup($item) { if ($item['type'] != 'group') { - throw new Exception('Wrong item type sent to Yammer group import processing.'); + // TRANS: Exception thrown when a non-group item type is used, but expected. + throw new Exception(_m('Wrong item type sent to Yammer group import processing.')); } $origId = $item['id']; @@ -277,7 +280,6 @@ class YammerImporter $avatar = $item['mugshot_url']; // as with user profiles... - $options['mainpage'] = common_local_url('showgroup', array('nickname' => $options['nickname'])); @@ -285,7 +287,7 @@ class YammerImporter $options['homepage'] = ''; $options['location'] = ''; $options['aliases'] = array(); - // @fixme what about admin user for the group? + // @todo FIXME: What about admin user for the group? $options['local'] = true; return array('orig_id' => $origId, @@ -303,7 +305,8 @@ class YammerImporter function prepNotice($item) { if (isset($item['type']) && $item['type'] != 'message') { - throw new Exception('Wrong item type sent to Yammer message import processing.'); + // TRANS: Exception thrown when a non-message item type is used, but expected. + throw new Exception(_m('Wrong item type sent to Yammer message import processing.')); } $origId = $item['id']; @@ -430,7 +433,9 @@ class YammerImporter $url = preg_replace('/_small(\..*?)$/', '$1', $url); if (!common_valid_http_url($url)) { - throw new ServerException(sprintf(_m("Invalid avatar URL %s."), $url)); + // TRANS: Server exception thrown when an avatar URL is invalid. + // TRANS: %s is the invalid avatar URL. + throw new ServerException(sprintf(_m('Invalid avatar URL %s.'), $url)); } // @fixme this should be better encapsulated @@ -438,7 +443,9 @@ class YammerImporter $temp_filename = tempnam(sys_get_temp_dir(), 'listener_avatar'); try { if (!copy($url, $temp_filename)) { - throw new ServerException(sprintf(_m("Unable to fetch avatar from %s."), $url)); + // TRANS: Server exception thrown when an avatar could not be fetched. + // TRANS: %s is the failed avatar URL. + throw new ServerException(sprintf(_m('Unable to fetch avatar from %s.'), $url)); } $id = $dest->id; diff --git a/plugins/YammerImport/lib/yammerprogressform.php b/plugins/YammerImport/lib/yammerprogressform.php index 9bf8332261..0b73472a4d 100644 --- a/plugins/YammerImport/lib/yammerprogressform.php +++ b/plugins/YammerImport/lib/yammerprogressform.php @@ -60,39 +60,92 @@ class YammerProgressForm extends Form $labels = array( 'init' => array( - 'label' => _m("Initialize"), + // TRANS: Field label for a Yammer import initialise step. + 'label' => _m('Initialize'), + // TRANS: "In progress" description. 'progress' => _m('No import running'), + // TRANS: "Complete" description for initialize state. 'complete' => _m('Initiated Yammer server connection...'), ), 'requesting-auth' => array( + // TRANS: Field label for a Yammer import connect step. 'label' => _m('Connect to Yammer'), + // TRANS: "In progress" description. 'progress' => _m('Awaiting authorization...'), + // TRANS: "Complete" description for connect state. 'complete' => _m('Connected.'), ), 'import-users' => array( + // TRANS: Field label for a Yammer user import users step. 'label' => _m('Import user accounts'), - 'progress' => sprintf(_m("Importing %d user...", "Importing %d users...", $userCount), $userCount), - 'complete' => sprintf(_m("Imported %d user.", "Imported %d users.", $userCount), $userCount), + // TRANS: "In progress" description. + // TRANS: %d is the number of users to be imported. + 'progress' => sprintf(_m('Importing %d user...', + 'Importing %d users...', + $userCount), + $userCount), + // TRANS: "Complete" description for step. + // TRANS: %d is the number of users imported. + 'complete' => sprintf(_m('Imported %d user.', + 'Imported %d users.', + $userCount), + $userCount), ), 'import-groups' => array( + // TRANS: Field label for a Yammer group import step. 'label' => _m('Import user groups'), - 'progress' => sprintf(_m("Importing %d group...", "Importing %d groups...", $groupCount), $groupCount), - 'complete' => sprintf(_m("Imported %d group.", "Imported %d groups.", $groupCount), $groupCount), + // TRANS: "In progress" description. + // TRANS: %d is the number of groups to be imported. + 'progress' => sprintf(_m('Importing %d group...', + 'Importing %d groups...', + $groupCount), + $groupCount), + // TRANS: "Complete" description for step. + // TRANS: %d is the number of groups imported. + 'complete' => sprintf(_m('Imported %d group.', + 'Imported %d groups.', + $groupCount), + $groupCount), ), 'fetch-messages' => array( + // TRANS: Field label for a Yammer import prepare notices step. 'label' => _m('Prepare public notices for import'), - 'progress' => sprintf(_m("Preparing %d notice...", "Preparing %d notices...", $fetchedCount), $fetchedCount), - 'complete' => sprintf(_m("Prepared %d notice.", "Prepared %d notices.", $fetchedCount), $fetchedCount), + // TRANS: "In progress" description. + // TRANS: %d is the number of notices to be prepared for import. + 'progress' => sprintf(_m('Preparing %d notice...', + 'Preparing %d notices...', + $fetchedCount), + $fetchedCount), + // TRANS: "Complete" description for step. + // TRANS: %d is the number of notices prepared for import. + 'complete' => sprintf(_m('Prepared %d notice.', + 'Prepared %d notices.', + $fetchedCount), + $fetchedCount), ), 'save-messages' => array( + // TRANS: Field label for a Yammer import notices step. 'label' => _m('Import public notices'), - 'progress' => sprintf(_m("Importing %d notice...", "Importing %d notices...", $savedCount), $savedCount), - 'complete' => sprintf(_m("Imported %d notice.", "Imported %d notices.", $savedCount), $savedCount), + // TRANS: "In progress" description. + // TRANS: %d is the number of notices to be imported. + 'progress' => sprintf(_m('Importing %d notice...', + 'Importing %d notices...', + $savedCount), + $savedCount), + // TRANS: "Complete" description for step. + // TRANS: %d is the number of notices imported. + 'complete' => sprintf(_m('Imported %d notice.', + 'Imported %d notices.', + $savedCount), + $savedCount), ), 'done' => array( + // TRANS: Field label for a Yammer import done step. 'label' => _m('Done'), - 'progress' => sprintf(_m("Import is complete!")), - 'complete' => sprintf(_m("Import is complete!")), + // TRANS: "In progress" description for done step. + 'progress' => sprintf(_m('Import is complete!')), + // TRANS: "Complete" description for done step. + 'complete' => sprintf(_m('Import is complete!')), ) ); $steps = array_keys($labels); @@ -105,6 +158,7 @@ class YammerProgressForm extends Form $classes[] = 'yammer-running'; } $this->out->elementStart('fieldset', array('class' => implode(' ', $classes))); + // TRANS: Fieldset legend. $this->out->element('legend', array(), _m('Import status')); foreach ($steps as $step => $state) { if ($state == 'init') { @@ -129,7 +183,8 @@ class YammerProgressForm extends Form $this->progressBar($state, 'waiting', $labels[$state]['label'], - _m("Waiting...")); + // TRANS: Progress bar status. + _m('Waiting...')); } } $this->out->elementEnd('fieldset'); @@ -143,11 +198,13 @@ class YammerProgressForm extends Form $this->out->element('div', array('class' => 'import-status'), $status); if ($class == 'progress') { if ($state == 'done') { + // TRANS: Button text for resetting the import state. $this->out->submit('abort-import', _m('Reset import state')); } else { if ($error) { $this->errorBox($error); } else { + // TRANS: Button text for pausing an import. $this->out->submit('pause-import', _m('Pause import')); } } @@ -157,11 +214,15 @@ class YammerProgressForm extends Form private function errorBox($msg) { - $errline = sprintf(_m('Encountered error "%s"'), $msg); + // TRANS: Error message. %s are the error details. + $errline = sprintf(_m('Encountered error "%s".'), $msg); $this->out->elementStart('fieldset', array('class' => 'import-error')); + // TRANS: Fieldset legend for a paused import. $this->out->element('legend', array(), _m('Paused')); $this->out->element('p', array(), $errline); + // TRANS: Button text for continuing a paused import. $this->out->submit('continue-import', _m('Continue')); + // TRANS: Button text for aborting a paused import. $this->out->submit('abort-import', _m('Abort import')); $this->out->elementEnd('fieldset'); } diff --git a/plugins/YammerImport/lib/yammerrunner.php b/plugins/YammerImport/lib/yammerrunner.php index 3e53f3361b..04cc9c0283 100644 --- a/plugins/YammerImport/lib/yammerrunner.php +++ b/plugins/YammerImport/lib/yammerrunner.php @@ -123,7 +123,8 @@ class YammerRunner public function requestAuth() { if ($this->state->state != 'init') { - throw new ServerException("Cannot request Yammer auth; already there!"); + // TRANS: Server exception thrown if a Yammer authentication request is already present. + throw new ServerException(_m('Cannot request Yammer auth; already there!')); } $data = $this->client->requestToken(); @@ -149,7 +150,8 @@ class YammerRunner if ($this->state() == 'requesting-auth') { return $this->client->authorizeUrl($this->state->oauth_token); } else { - throw new ServerException('Cannot get Yammer auth URL when not in requesting-auth state!'); + // TRANS: Server exception thrown when requesting a Yammer authentication URL while in an incorrect state. + throw new ServerException(_m('Cannot get Yammer auth URL when not in requesting-auth state!')); } } @@ -167,7 +169,9 @@ class YammerRunner public function saveAuthToken($verifier) { if ($this->state->state != 'requesting-auth') { - throw new ServerException("Cannot save auth token in Yammer import state {$this->state->state}"); + // TRANS: Server exception thrown if a Yammer authentication token could not be saved in a certain import state. + // TRANS: %s is the import state in the which the error occurred. + throw new ServerException(_m('Cannot save auth token in Yammer import state %s.',$this->state->state)); } $data = $this->client->accessToken($verifier); @@ -324,7 +328,7 @@ class YammerRunner $stub->limit(20); $stub->orderBy('id'); $stub->find(); - + if ($stub->N == 0) { common_log(LOG_INFO, "Finished saving Yammer messages; import complete!"); $this->state->state = 'done'; @@ -353,7 +357,6 @@ class YammerRunner return $map->count(); } - /** * Count the number of Yammer groups we've mapped into our system! * @@ -365,7 +368,6 @@ class YammerRunner return $map->count(); } - /** * Count the number of Yammer notices we've pulled down for pending import... * @@ -377,7 +379,6 @@ class YammerRunner return $map->count(); } - /** * Count the number of Yammer notices we've mapped into our system! * @@ -401,8 +402,8 @@ class YammerRunner /** * Record an error condition from a background run, which we should * display in progress state for the admin. - * - * @param string $msg + * + * @param string $msg */ public function recordError($msg) { @@ -428,7 +429,7 @@ class YammerRunner /** * Get the last recorded background error message, if any. - * + * * @return string */ public function lastError() diff --git a/plugins/YammerImport/locale/YammerImport.pot b/plugins/YammerImport/locale/YammerImport.pot index f8dc717420..1263ae14fd 100644 --- a/plugins/YammerImport/locale/YammerImport.pot +++ b/plugins/YammerImport/locale/YammerImport.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,16 +17,22 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: actions/yammerauth.php:71 lib/yammerauthinitform.php:48 -#: lib/yammerprogressform.php:68 lib/yammerauthverifyform.php:56 +#. TRANS: Page title for Yammer administration panel. +#. TRANS: Form legend. +#. TRANS: Field label for a Yammer import connect step. +#. TRANS: Form legend. +#: actions/yammerauth.php:70 lib/yammerauthinitform.php:49 +#: lib/yammerprogressform.php:72 lib/yammerauthverifyform.php:57 msgid "Connect to Yammer" msgstr "" -#: actions/yammeradminpanel.php:45 +#. TRANS: Page title for Yammer import administration panel. +#: actions/yammeradminpanel.php:46 msgid "Yammer Import" msgstr "" -#: actions/yammeradminpanel.php:55 +#. TRANS: Instructions for Yammer import administration panel. +#: actions/yammeradminpanel.php:57 msgid "" "This Yammer import tool is still undergoing testing, and is incomplete in " "some areas. Currently user subscriptions and group memberships are not " @@ -34,204 +40,319 @@ msgid "" "verified administrators on the Yammer side." msgstr "" -#: actions/yammeradminpanel.php:102 +#. TRANS: Error message about an import job being paused from the admin panel. +#: actions/yammeradminpanel.php:105 msgid "Paused from admin panel." msgstr "" -#: actions/yammeradminpanel.php:135 YammerImportPlugin.php:99 +#. TRANS: Client exception thrown when encountering an unhandled sub action. +#: actions/yammeradminpanel.php:118 +msgid "Invalid POST" +msgstr "" + +#. TRANS: Page title for Yammer import administration panel. +#: actions/yammeradminpanel.php:140 msgid "Yammer import" msgstr "" -#: YammerImportPlugin.php:98 +#. TRANS: Menu item for Yammer import. +#: YammerImportPlugin.php:99 +msgctxt "MENU" msgid "Yammer" msgstr "" -#: lib/yammerimporter.php:230 +#. TRANS: Menu item title for Yammer import. +#: YammerImportPlugin.php:101 +msgid "Yammer import module." +msgstr "" + +#. TRANS: Exception thrown when a non-user item type is used, but expected. +#: lib/yammerimporter.php:184 +msgid "Wrong item type sent to Yammer user import processing." +msgstr "" + +#. TRANS: Used as a prefix for the Yammer expertise field contents. +#: lib/yammerimporter.php:232 msgid "Expertise:" msgstr "" -#: lib/yammerimporter.php:433 +#. TRANS: Exception thrown when a non-group item type is used, but expected. +#: lib/yammerimporter.php:268 +msgid "Wrong item type sent to Yammer group import processing." +msgstr "" + +#. TRANS: Exception thrown when a non-message item type is used, but expected. +#: lib/yammerimporter.php:309 +msgid "Wrong item type sent to Yammer message import processing." +msgstr "" + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. +#: lib/yammerimporter.php:438 #, php-format msgid "Invalid avatar URL %s." msgstr "" -#: lib/yammerimporter.php:441 +#. TRANS: Server exception thrown when an avatar could not be fetched. +#. TRANS: %s is the failed avatar URL. +#: lib/yammerimporter.php:448 #, php-format msgid "Unable to fetch avatar from %s." msgstr "" -#: lib/yammerauthinitform.php:62 +#. TRANS: Button text for starting Yammer authentication. +#: lib/yammerauthinitform.php:64 +msgctxt "BUTTON" msgid "Start authentication" msgstr "" -#: lib/yammerauthinitform.php:62 -msgid "Request authorization to connect to Yammer account" +#. TRANS: Button title for starting Yammer authentication. +#: lib/yammerauthinitform.php:66 +msgid "Request authorization to connect to a Yammer account." msgstr "" -#: lib/yammerauthinitform.php:63 +#. TRANS: Button text for starting changing a Yammer API key. +#: lib/yammerauthinitform.php:68 +msgctxt "BUTTON" msgid "Change API key" msgstr "" -#: lib/yammerprogressform.php:63 +#. TRANS: Server exception thrown if a Yammer authentication request is already present. +#: lib/yammerrunner.php:127 +msgid "Cannot request Yammer auth; already there!" +msgstr "" + +#. TRANS: Server exception thrown when requesting a Yammer authentication URL while in an incorrect state. +#: lib/yammerrunner.php:154 +msgid "Cannot get Yammer auth URL when not in requesting-auth state!" +msgstr "" + +#. TRANS: Exeption thrown when an external Yammer system gives an error. +#. TRANS: %1$s is an HTTP error code, %2$s is the error message body. +#: lib/sn_yammerclient.php:74 +#, php-format +msgid "Yammer API returned HTTP code %1$s: %2$s" +msgstr "" + +#. TRANS: Exeption thrown when an external Yammer system an invalid JSON response. +#: lib/sn_yammerclient.php:114 +msgid "Invalid JSON response from Yammer API." +msgstr "" + +#. TRANS: Exeption thrown when a trust relationship has already been established. +#: lib/sn_yammerclient.php:169 +msgid "Requesting a token, but already set up with a token." +msgstr "" + +#. TRANS: Field label for a Yammer import initialise step. +#: lib/yammerprogressform.php:64 msgid "Initialize" msgstr "" -#: lib/yammerprogressform.php:64 +#. TRANS: "In progress" description. +#: lib/yammerprogressform.php:66 msgid "No import running" msgstr "" -#: lib/yammerprogressform.php:65 +#. TRANS: "Complete" description for initialize state. +#: lib/yammerprogressform.php:68 msgid "Initiated Yammer server connection..." msgstr "" -#: lib/yammerprogressform.php:69 +#. TRANS: "In progress" description. +#: lib/yammerprogressform.php:74 msgid "Awaiting authorization..." msgstr "" -#: lib/yammerprogressform.php:70 +#. TRANS: "Complete" description for connect state. +#: lib/yammerprogressform.php:76 msgid "Connected." msgstr "" -#: lib/yammerprogressform.php:73 +#. TRANS: Field label for a Yammer user import users step. +#: lib/yammerprogressform.php:80 msgid "Import user accounts" msgstr "" -#: lib/yammerprogressform.php:74 +#. TRANS: "In progress" description. +#. TRANS: %d is the number of users to be imported. +#: lib/yammerprogressform.php:83 #, php-format msgid "Importing %d user..." msgid_plural "Importing %d users..." msgstr[0] "" msgstr[1] "" -#: lib/yammerprogressform.php:75 +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of users imported. +#: lib/yammerprogressform.php:89 #, php-format msgid "Imported %d user." msgid_plural "Imported %d users." msgstr[0] "" msgstr[1] "" -#: lib/yammerprogressform.php:78 +#. TRANS: Field label for a Yammer group import step. +#: lib/yammerprogressform.php:96 msgid "Import user groups" msgstr "" -#: lib/yammerprogressform.php:79 +#. TRANS: "In progress" description. +#. TRANS: %d is the number of groups to be imported. +#: lib/yammerprogressform.php:99 #, php-format msgid "Importing %d group..." msgid_plural "Importing %d groups..." msgstr[0] "" msgstr[1] "" -#: lib/yammerprogressform.php:80 +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of groups imported. +#: lib/yammerprogressform.php:105 #, php-format msgid "Imported %d group." msgid_plural "Imported %d groups." msgstr[0] "" msgstr[1] "" -#: lib/yammerprogressform.php:83 +#. TRANS: Field label for a Yammer import prepare notices step. +#: lib/yammerprogressform.php:112 msgid "Prepare public notices for import" msgstr "" -#: lib/yammerprogressform.php:84 +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be prepared for import. +#: lib/yammerprogressform.php:115 #, php-format msgid "Preparing %d notice..." msgid_plural "Preparing %d notices..." msgstr[0] "" msgstr[1] "" -#: lib/yammerprogressform.php:85 +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices prepared for import. +#: lib/yammerprogressform.php:121 #, php-format msgid "Prepared %d notice." msgid_plural "Prepared %d notices." msgstr[0] "" msgstr[1] "" -#: lib/yammerprogressform.php:88 +#. TRANS: Field label for a Yammer import notices step. +#: lib/yammerprogressform.php:128 msgid "Import public notices" msgstr "" -#: lib/yammerprogressform.php:89 +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be imported. +#: lib/yammerprogressform.php:131 #, php-format msgid "Importing %d notice..." msgid_plural "Importing %d notices..." msgstr[0] "" msgstr[1] "" -#: lib/yammerprogressform.php:90 +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices imported. +#: lib/yammerprogressform.php:137 #, php-format msgid "Imported %d notice." msgid_plural "Imported %d notices." msgstr[0] "" msgstr[1] "" -#: lib/yammerprogressform.php:93 +#. TRANS: Field label for a Yammer import done step. +#: lib/yammerprogressform.php:144 msgid "Done" msgstr "" -#: lib/yammerprogressform.php:94 lib/yammerprogressform.php:95 +#. TRANS: "In progress" description for done step. +#. TRANS: "Complete" description for done step. +#: lib/yammerprogressform.php:146 lib/yammerprogressform.php:148 msgid "Import is complete!" msgstr "" -#: lib/yammerprogressform.php:108 +#. TRANS: Fieldset legend. +#: lib/yammerprogressform.php:162 msgid "Import status" msgstr "" -#: lib/yammerprogressform.php:132 +#. TRANS: Progress bar status. +#: lib/yammerprogressform.php:187 msgid "Waiting..." msgstr "" -#: lib/yammerprogressform.php:146 +#. TRANS: Button text for resetting the import state. +#: lib/yammerprogressform.php:202 msgid "Reset import state" msgstr "" -#: lib/yammerprogressform.php:151 +#. TRANS: Button text for pausing an import. +#: lib/yammerprogressform.php:208 msgid "Pause import" msgstr "" -#: lib/yammerprogressform.php:160 +#. TRANS: Error message. %s are the error details. +#: lib/yammerprogressform.php:218 #, php-format -msgid "Encountered error \"%s\"" +msgid "Encountered error \"%s\"." msgstr "" -#: lib/yammerprogressform.php:162 +#. TRANS: Fieldset legend for a paused import. +#: lib/yammerprogressform.php:221 msgid "Paused" msgstr "" -#: lib/yammerprogressform.php:164 lib/yammerauthverifyform.php:98 +#. TRANS: Button text for continuing a paused import. +#: lib/yammerprogressform.php:224 msgid "Continue" msgstr "" -#: lib/yammerprogressform.php:165 +#. TRANS: Button text for aborting a paused import. +#: lib/yammerprogressform.php:226 msgid "Abort import" msgstr "" -#: lib/yammerauthverifyform.php:72 +#. TRANS: Form instructions. +#: lib/yammerauthverifyform.php:74 msgid "" "Follow this link to confirm authorization at Yammer; you will be prompted to " "log in if necessary:" msgstr "" -#: lib/yammerauthverifyform.php:87 +#. TRANS: Link description for a link in an external Yammer system. +#: lib/yammerauthverifyform.php:90 msgid "Open Yammer authentication window" msgstr "" -#: lib/yammerauthverifyform.php:90 +#. TRANS: Form instructions. +#: lib/yammerauthverifyform.php:94 msgid "Copy the verification code you are given below:" msgstr "" -#: lib/yammerauthverifyform.php:94 +#. TRANS: Field label. +#: lib/yammerauthverifyform.php:99 msgid "Verification code:" msgstr "" -#: lib/yammerauthverifyform.php:98 -msgid "Save code and begin import" +#. TRANS: Button text for saving Yammer authorisation data and starting Yammer import. +#: lib/yammerauthverifyform.php:104 +msgctxt "BUTTON" +msgid "Continue" msgstr "" -#: lib/yammerapikeyform.php:56 +#. TRANS: Button title for saving Yammer authorisation data and starting Yammer import. +#: lib/yammerauthverifyform.php:106 +msgid "Save the verification code and begin import." +msgstr "" + +#. TRANS: Form legend for adding details to connect to a remote Yammer API. +#: lib/yammerapikeyform.php:57 msgid "Yammer API registration" msgstr "" -#: lib/yammerapikeyform.php:72 +#. TRANS: Explanation of what needs to be done to connect to a Yammer network. +#: lib/yammerapikeyform.php:74 msgid "" "Before we can connect to your Yammer network, you will need to register the " "importer as an application authorized to pull data on your behalf. This " @@ -239,26 +360,33 @@ msgid "" "register the app at Yammer; you will be prompted to log in if necessary:" msgstr "" -#: lib/yammerapikeyform.php:84 +#. TRANS: Link description to a Yammer application registration form. +#: lib/yammerapikeyform.php:87 msgid "Open Yammer application registration form" msgstr "" -#: lib/yammerapikeyform.php:87 +#. TRANS: Instructions. +#: lib/yammerapikeyform.php:91 msgid "Copy the consumer key and secret you are given into the form below:" msgstr "" -#: lib/yammerapikeyform.php:91 +#. TRANS: Field label for a Yammer consumer key. +#: lib/yammerapikeyform.php:96 msgid "Consumer key:" msgstr "" -#: lib/yammerapikeyform.php:94 +#. TRANS: Field label for a Yammer consumer secret. +#: lib/yammerapikeyform.php:100 msgid "Consumer secret:" msgstr "" -#: lib/yammerapikeyform.php:98 +#. TRANS: Button text for saving a Yammer API registration. +#: lib/yammerapikeyform.php:105 +msgctxt "BUTTON" msgid "Save" msgstr "" -#: lib/yammerapikeyform.php:98 -msgid "Save these consumer keys" +#. TRANS: Button title for saving a Yammer API registration. +#: lib/yammerapikeyform.php:107 +msgid "Save the entered consumer key and consumer secret." msgstr "" diff --git a/plugins/YammerImport/locale/br/LC_MESSAGES/YammerImport.po b/plugins/YammerImport/locale/br/LC_MESSAGES/YammerImport.po index 31595d7b79..84863158dd 100644 --- a/plugins/YammerImport/locale/br/LC_MESSAGES/YammerImport.po +++ b/plugins/YammerImport/locale/br/LC_MESSAGES/YammerImport.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - YammerImport to Breton (Brezhoneg) +# Translation of StatusNet - YammerImport to Breton (brezhoneg) # Exported from translatewiki.net # # Author: Fulup @@ -10,24 +10,30 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - YammerImport\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:52:00+0000\n" -"Language-Team: Breton \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:33+0000\n" +"Language-Team: Breton \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:41+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: br\n" "X-Message-Group: #out-statusnet-plugin-yammerimport\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Page title for Yammer administration panel. +#. TRANS: Form legend. +#. TRANS: Field label for a Yammer import connect step. +#. TRANS: Form legend. msgid "Connect to Yammer" msgstr "Kevreañ da Yammer" +#. TRANS: Page title for Yammer import administration panel. msgid "Yammer Import" msgstr "Enporzh Yammer" +#. TRANS: Instructions for Yammer import administration panel. msgid "" "This Yammer import tool is still undergoing testing, and is incomplete in " "some areas. Currently user subscriptions and group memberships are not " @@ -40,141 +46,237 @@ msgstr "" "bezañ en amzer da zont evit an enporzhiadennoù sevenet gant ar verourien " "aotreet eus tu YAMMER." +#. TRANS: Error message about an import job being paused from the admin panel. msgid "Paused from admin panel." msgstr "Ehanet adalek ar banell verañ." +#. TRANS: Client exception thrown when encountering an unhandled sub action. +msgid "Invalid POST" +msgstr "" + +#. TRANS: Page title for Yammer import administration panel. msgid "Yammer import" msgstr "Enporzh Yammer" +#. TRANS: Menu item for Yammer import. +#, fuzzy +msgctxt "MENU" msgid "Yammer" msgstr "Yammer" +#. TRANS: Menu item title for Yammer import. +#, fuzzy +msgid "Yammer import module." +msgstr "Enporzh Yammer" + +#. TRANS: Exception thrown when a non-user item type is used, but expected. +msgid "Wrong item type sent to Yammer user import processing." +msgstr "" + +#. TRANS: Used as a prefix for the Yammer expertise field contents. msgid "Expertise:" msgstr "Prizacha :" +#. TRANS: Exception thrown when a non-group item type is used, but expected. +msgid "Wrong item type sent to Yammer group import processing." +msgstr "" + +#. TRANS: Exception thrown when a non-message item type is used, but expected. +msgid "Wrong item type sent to Yammer message import processing." +msgstr "" + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. #, php-format msgid "Invalid avatar URL %s." msgstr "Direizh eo URL an avatar %s." +#. TRANS: Server exception thrown when an avatar could not be fetched. +#. TRANS: %s is the failed avatar URL. #, php-format msgid "Unable to fetch avatar from %s." msgstr "Dibosupl eo adtapout an avatar adalek %s." +#. TRANS: Button text for starting Yammer authentication. +#, fuzzy +msgctxt "BUTTON" msgid "Start authentication" +msgstr "Digeriñ prenestr emzisklêriañ Yammer" + +#. TRANS: Button title for starting Yammer authentication. +msgid "Request authorization to connect to a Yammer account." msgstr "" -msgid "Request authorization to connect to Yammer account" -msgstr "" - +#. TRANS: Button text for starting changing a Yammer API key. +msgctxt "BUTTON" msgid "Change API key" msgstr "" +#. TRANS: Server exception thrown if a Yammer authentication request is already present. +msgid "Cannot request Yammer auth; already there!" +msgstr "" + +#. TRANS: Server exception thrown when requesting a Yammer authentication URL while in an incorrect state. +msgid "Cannot get Yammer auth URL when not in requesting-auth state!" +msgstr "" + +#. TRANS: Exeption thrown when an external Yammer system gives an error. +#. TRANS: %1$s is an HTTP error code, %2$s is the error message body. +#, php-format +msgid "Yammer API returned HTTP code %1$s: %2$s" +msgstr "" + +#. TRANS: Exeption thrown when an external Yammer system an invalid JSON response. +msgid "Invalid JSON response from Yammer API." +msgstr "" + +#. TRANS: Exeption thrown when a trust relationship has already been established. +msgid "Requesting a token, but already set up with a token." +msgstr "" + +#. TRANS: Field label for a Yammer import initialise step. msgid "Initialize" msgstr "Deraouekaat" +#. TRANS: "In progress" description. msgid "No import running" msgstr "Enporzhiadenn ebet o treiñ" +#. TRANS: "Complete" description for initialize state. msgid "Initiated Yammer server connection..." msgstr "Loc'het ar gevreadenn d'ar servijer Yammer" +#. TRANS: "In progress" description. msgid "Awaiting authorization..." msgstr "O c'hortoz an aotre..." +#. TRANS: "Complete" description for connect state. msgid "Connected." msgstr "Kevreet." +#. TRANS: Field label for a Yammer user import users step. msgid "Import user accounts" msgstr "Enporzhiañ ar c'hontoù implijer" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of users to be imported. #, php-format msgid "Importing %d user..." msgid_plural "Importing %d users..." msgstr[0] "Oc'h enporzhiañ %d implijer..." msgstr[1] "Oc'h enporzhiañ %d implijer..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of users imported. #, php-format msgid "Imported %d user." msgid_plural "Imported %d users." msgstr[0] "Enporzhiet %d implijer." msgstr[1] "Enporzhiet %d implijer." +#. TRANS: Field label for a Yammer group import step. msgid "Import user groups" msgstr "Enporzhiañ strolladoù implijer" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of groups to be imported. #, php-format msgid "Importing %d group..." msgid_plural "Importing %d groups..." msgstr[0] "Oc'h enporzhiañ %d strollad..." msgstr[1] "Oc'h enporzhiañ %d strollad..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of groups imported. #, php-format msgid "Imported %d group." msgid_plural "Imported %d groups." msgstr[0] "Enporzhiet %d strollad..." msgstr[1] "Enporzhiet %d strollad..." +#. TRANS: Field label for a Yammer import prepare notices step. msgid "Prepare public notices for import" msgstr "O prientiñ enporzh ar c'hemennoù foran" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be prepared for import. #, php-format msgid "Preparing %d notice..." msgid_plural "Preparing %d notices..." msgstr[0] "O prientiñ %d kemenn..." msgstr[1] "O prientiñ %d kemenn..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices prepared for import. #, php-format msgid "Prepared %d notice." msgid_plural "Prepared %d notices." msgstr[0] "Prientet %d kemenn." msgstr[1] "Prientet %d kemenn." +#. TRANS: Field label for a Yammer import notices step. msgid "Import public notices" msgstr "Enporzh kemennoù foran" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be imported. #, php-format msgid "Importing %d notice..." msgid_plural "Importing %d notices..." msgstr[0] "Oc'h enporzhiañ %d kemenn..." msgstr[1] "Oc'h enporzhiañ %d kemenn..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices imported. #, php-format msgid "Imported %d notice." msgid_plural "Imported %d notices." msgstr[0] "Enporzhiet %d kemenn." msgstr[1] "Enporzhiet %d kemenn." +#. TRANS: Field label for a Yammer import done step. msgid "Done" msgstr "Graet" +#. TRANS: "In progress" description for done step. +#. TRANS: "Complete" description for done step. msgid "Import is complete!" msgstr "Enporzh kaset da benn vat !" +#. TRANS: Fieldset legend. msgid "Import status" msgstr "Stad an enporzh" +#. TRANS: Progress bar status. msgid "Waiting..." msgstr "O c'hortoz..." +#. TRANS: Button text for resetting the import state. msgid "Reset import state" msgstr "Adderaouekaat stad an enporzh" +#. TRANS: Button text for pausing an import. msgid "Pause import" msgstr "Ober un tamm ehan gant an enporzh" +#. TRANS: Error message. %s are the error details. #, php-format -msgid "Encountered error \"%s\"" -msgstr "C'hoarvezet eo ar fazi \"%s\"" +msgid "Encountered error \"%s\"." +msgstr "C'hoarvezet eo ar fazi \"%s\"." +#. TRANS: Fieldset legend for a paused import. msgid "Paused" msgstr "Ehanet" +#. TRANS: Button text for continuing a paused import. msgid "Continue" msgstr "Kenderc'hel" +#. TRANS: Button text for aborting a paused import. msgid "Abort import" msgstr "Nullañ an enporzh" +#. TRANS: Form instructions. msgid "" "Follow this link to confirm authorization at Yammer; you will be prompted to " "log in if necessary:" @@ -182,21 +284,33 @@ msgstr "" "Heuliañ al liamm-mañ da gadarnaat an aotre war Yammer ; mar bez ret e vo " "goulennet ouzhoc'h kevreañ :" +#. TRANS: Link description for a link in an external Yammer system. msgid "Open Yammer authentication window" msgstr "Digeriñ prenestr emzisklêriañ Yammer" +#. TRANS: Form instructions. msgid "Copy the verification code you are given below:" msgstr "Eilit a-is ar c'hod gwiriañ bet roet deoc'h :" +#. TRANS: Field label. msgid "Verification code:" msgstr "Kod gwiriekaat :" -msgid "Save code and begin import" +#. TRANS: Button text for saving Yammer authorisation data and starting Yammer import. +msgctxt "BUTTON" +msgid "Continue" +msgstr "Kenderc'hel" + +#. TRANS: Button title for saving Yammer authorisation data and starting Yammer import. +#, fuzzy +msgid "Save the verification code and begin import." msgstr "Enrollañ ar c'hod ha kregiñ da enporzhiañ" +#. TRANS: Form legend for adding details to connect to a remote Yammer API. msgid "Yammer API registration" msgstr "Enrolladenn an API Yammer" +#. TRANS: Explanation of what needs to be done to connect to a Yammer network. msgid "" "Before we can connect to your Yammer network, you will need to register the " "importer as an application authorized to pull data on your behalf. This " @@ -209,21 +323,29 @@ msgstr "" "mañ evit enrollañ an arload war Yammer ; mar bez ret e vo goulennet ouzhoc'h " "kevreañ." +#. TRANS: Link description to a Yammer application registration form. msgid "Open Yammer application registration form" msgstr "Digeriñ furmskrid enrollañ Yammer" +#. TRANS: Instructions. msgid "Copy the consumer key and secret you are given into the form below:" msgstr "" "Eilit er furmskrid a-is an alc'hwez hag ar sekred implijer bet roet deoc'h :" +#. TRANS: Field label for a Yammer consumer key. msgid "Consumer key:" msgstr "Alc'hwez implijer :" +#. TRANS: Field label for a Yammer consumer secret. msgid "Consumer secret:" msgstr "Sekred an implijer :" +#. TRANS: Button text for saving a Yammer API registration. +msgctxt "BUTTON" msgid "Save" msgstr "Enrollañ" -msgid "Save these consumer keys" +#. TRANS: Button title for saving a Yammer API registration. +#, fuzzy +msgid "Save the entered consumer key and consumer secret." msgstr "Enrollañ an alc'hwezioù implijer-mañ" diff --git a/plugins/YammerImport/locale/de/LC_MESSAGES/YammerImport.po b/plugins/YammerImport/locale/de/LC_MESSAGES/YammerImport.po index f50cf7b773..de0e123cf6 100644 --- a/plugins/YammerImport/locale/de/LC_MESSAGES/YammerImport.po +++ b/plugins/YammerImport/locale/de/LC_MESSAGES/YammerImport.po @@ -4,6 +4,9 @@ # Author: George Animal # Author: Giftpflanze # Author: Habi +# Author: PtM +# Author: Tiin +# Author: Welathêja # -- # This file is distributed under the same license as the StatusNet package. # @@ -11,24 +14,30 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - YammerImport\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:52:00+0000\n" -"Language-Team: German \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:33+0000\n" +"Language-Team: German \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:41+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-yammerimport\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Page title for Yammer administration panel. +#. TRANS: Form legend. +#. TRANS: Field label for a Yammer import connect step. +#. TRANS: Form legend. msgid "Connect to Yammer" msgstr "Verbinden mit Yammer" +#. TRANS: Page title for Yammer import administration panel. msgid "Yammer Import" msgstr "Yammer-Import" +#. TRANS: Instructions for Yammer import administration panel. msgid "" "This Yammer import tool is still undergoing testing, and is incomplete in " "some areas. Currently user subscriptions and group memberships are not " @@ -41,141 +50,236 @@ msgstr "" "Importe unterstützt werden, die von beglaubigten Administratoren auf Seiten " "von Yammer getätigt werden." +#. TRANS: Error message about an import job being paused from the admin panel. msgid "Paused from admin panel." msgstr "Angehalten über das Admin-Panel." +#. TRANS: Client exception thrown when encountering an unhandled sub action. +msgid "Invalid POST" +msgstr "Ungültiger POST" + +#. TRANS: Page title for Yammer import administration panel. msgid "Yammer import" msgstr "Yammer-Import" +#. TRANS: Menu item for Yammer import. +msgctxt "MENU" msgid "Yammer" msgstr "Yammer" +#. TRANS: Menu item title for Yammer import. +msgid "Yammer import module." +msgstr "Yammer-Import-Modul" + +#. TRANS: Exception thrown when a non-user item type is used, but expected. +msgid "Wrong item type sent to Yammer user import processing." +msgstr "Falscher Itemtyp zu Yammers Benutzerimport-Verarbeitung gesendet." + +#. TRANS: Used as a prefix for the Yammer expertise field contents. msgid "Expertise:" msgstr "Expertise:" +#. TRANS: Exception thrown when a non-group item type is used, but expected. +msgid "Wrong item type sent to Yammer group import processing." +msgstr "Falscher Itemtyp zu Yammers Gruppenimport-Verarbeitung gesendet." + +#. TRANS: Exception thrown when a non-message item type is used, but expected. +msgid "Wrong item type sent to Yammer message import processing." +msgstr "Falscher Itemtyp zu Yammers Nachrichtenimport-Verarbeitung gesendet." + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. #, php-format msgid "Invalid avatar URL %s." msgstr "Ungültige Avatar-URL %s." +#. TRANS: Server exception thrown when an avatar could not be fetched. +#. TRANS: %s is the failed avatar URL. #, php-format msgid "Unable to fetch avatar from %s." msgstr "Kann Avatar nicht von %s holen." +#. TRANS: Button text for starting Yammer authentication. +msgctxt "BUTTON" msgid "Start authentication" -msgstr "Starte Authentifikation" +msgstr "Starte Authentifizierung" -msgid "Request authorization to connect to Yammer account" -msgstr "Beantrage Authentifizierung, um mit Yammerkonto zu verbinden" +#. TRANS: Button title for starting Yammer authentication. +msgid "Request authorization to connect to a Yammer account." +msgstr "Beantrage Authentifizierung zur Verbindung mit einem Yammer-Account." +#. TRANS: Button text for starting changing a Yammer API key. +msgctxt "BUTTON" msgid "Change API key" msgstr "Ändere API-Schlüssel" +#. TRANS: Server exception thrown if a Yammer authentication request is already present. +msgid "Cannot request Yammer auth; already there!" +msgstr "Kann Yammer-Auth. nicht beantragen; bereits vorhanden!" + +#. TRANS: Server exception thrown when requesting a Yammer authentication URL while in an incorrect state. +msgid "Cannot get Yammer auth URL when not in requesting-auth state!" +msgstr "" +"Kann Yammers Auth.-URL nicht erhalten, wenn nicht im Auth.-Anforderungs-" +"Modus!" + +#. TRANS: Exeption thrown when an external Yammer system gives an error. +#. TRANS: %1$s is an HTTP error code, %2$s is the error message body. +#, php-format +msgid "Yammer API returned HTTP code %1$s: %2$s" +msgstr "Yammer-API gab HTTP-Code %1$s: %2$s" + +#. TRANS: Exeption thrown when an external Yammer system an invalid JSON response. +msgid "Invalid JSON response from Yammer API." +msgstr "Ungültige JSON-Antwort vom Yammer-API." + +#. TRANS: Exeption thrown when a trust relationship has already been established. +msgid "Requesting a token, but already set up with a token." +msgstr "Ein Token anfordert, aber bereits mit einem Token ausgestattet." + +#. TRANS: Field label for a Yammer import initialise step. msgid "Initialize" msgstr "Initialisieren" +#. TRANS: "In progress" description. msgid "No import running" msgstr "Zur Zeit kein Import" +#. TRANS: "Complete" description for initialize state. msgid "Initiated Yammer server connection..." msgstr "Yammer-Server-Verbindung initiiert …" +#. TRANS: "In progress" description. msgid "Awaiting authorization..." msgstr "Authentifizierung wird abgewartet …" +#. TRANS: "Complete" description for connect state. msgid "Connected." msgstr "Verbunden." +#. TRANS: Field label for a Yammer user import users step. msgid "Import user accounts" msgstr "Benutzerkonten importieren" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of users to be imported. #, php-format msgid "Importing %d user..." msgid_plural "Importing %d users..." msgstr[0] "Importiere %d Benutzer …" msgstr[1] "Importiere %d Benutzer …" +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of users imported. #, php-format msgid "Imported %d user." msgid_plural "Imported %d users." msgstr[0] "Importierte %d Benutzer." msgstr[1] "Importierte %d Benutzer." +#. TRANS: Field label for a Yammer group import step. msgid "Import user groups" msgstr "Importiere Benutzergruppen" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of groups to be imported. #, php-format msgid "Importing %d group..." msgid_plural "Importing %d groups..." msgstr[0] "Importiere %d Gruppe …" msgstr[1] "Importiere %d Gruppen …" +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of groups imported. #, php-format msgid "Imported %d group." msgid_plural "Imported %d groups." msgstr[0] "Importierte %d Gruppe." msgstr[1] "Importierte %d Gruppen." +#. TRANS: Field label for a Yammer import prepare notices step. msgid "Prepare public notices for import" msgstr "Bereite öffentliche Nachrichten für Import vor" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be prepared for import. #, php-format msgid "Preparing %d notice..." msgid_plural "Preparing %d notices..." msgstr[0] "Bereite %d Nachricht vor …" msgstr[1] "Bereite %d Nachrichten vor …" +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices prepared for import. #, php-format msgid "Prepared %d notice." msgid_plural "Prepared %d notices." msgstr[0] "%d Nachricht vorbereitet." msgstr[1] "%d Nachrichten vorbereitet." +#. TRANS: Field label for a Yammer import notices step. msgid "Import public notices" msgstr "Importiere öffentliche Nachrichten" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be imported. #, php-format msgid "Importing %d notice..." msgid_plural "Importing %d notices..." msgstr[0] "Importiere %d Nachricht …" msgstr[1] "Importiere %d Nachrichten …" +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices imported. #, php-format msgid "Imported %d notice." msgid_plural "Imported %d notices." msgstr[0] "Importierte %d Nachricht." msgstr[1] "Importierte %d Nachrichten." +#. TRANS: Field label for a Yammer import done step. msgid "Done" msgstr "Erledigt" +#. TRANS: "In progress" description for done step. +#. TRANS: "Complete" description for done step. msgid "Import is complete!" msgstr "Import abgeschlossen!" +#. TRANS: Fieldset legend. msgid "Import status" msgstr "Import-Status" +#. TRANS: Progress bar status. msgid "Waiting..." msgstr "Warten..." +#. TRANS: Button text for resetting the import state. msgid "Reset import state" msgstr "Import-Status zurücksetzen" +#. TRANS: Button text for pausing an import. msgid "Pause import" msgstr "Import pausieren" +#. TRANS: Error message. %s are the error details. #, php-format -msgid "Encountered error \"%s\"" -msgstr "Fehler \"%s\" ist aufgetreten" +msgid "Encountered error \"%s\"." +msgstr "Fehler aufgetreten: \"%s\"." +#. TRANS: Fieldset legend for a paused import. msgid "Paused" msgstr "Angehalten" +#. TRANS: Button text for continuing a paused import. msgid "Continue" msgstr "Fortfahren" +#. TRANS: Button text for aborting a paused import. msgid "Abort import" msgstr "Import abbrechen" +#. TRANS: Form instructions. msgid "" "Follow this link to confirm authorization at Yammer; you will be prompted to " "log in if necessary:" @@ -183,21 +287,32 @@ msgstr "" "Folge diesem Link, um die Authentifikation bei Yammer zu bestätigen; " "nötigenfalls wirst du aufgefordert, dich anzumelden:" +#. TRANS: Link description for a link in an external Yammer system. msgid "Open Yammer authentication window" msgstr "Öffne Yammer-Authentifizierungsfenster" +#. TRANS: Form instructions. msgid "Copy the verification code you are given below:" msgstr "Kopiere den untenstehenden Bestätigungscode" +#. TRANS: Field label. msgid "Verification code:" msgstr "Bestätigunts-Code:" -msgid "Save code and begin import" -msgstr "Speichere Code und starte Import" +#. TRANS: Button text for saving Yammer authorisation data and starting Yammer import. +msgctxt "BUTTON" +msgid "Continue" +msgstr "Fortfahren" +#. TRANS: Button title for saving Yammer authorisation data and starting Yammer import. +msgid "Save the verification code and begin import." +msgstr "Speichere Bestätigungs-Code und starte Import." + +#. TRANS: Form legend for adding details to connect to a remote Yammer API. msgid "Yammer API registration" msgstr "Yammer-API-Registrierung" +#. TRANS: Explanation of what needs to be done to connect to a Yammer network. msgid "" "Before we can connect to your Yammer network, you will need to register the " "importer as an application authorized to pull data on your behalf. This " @@ -210,21 +325,28 @@ msgstr "" "Sie diesem Link, um diese Applikation bei Yammer zu registrieren; Sie werden " "gegebenenfalls aufgefordert, sich anzumelden:" +#. TRANS: Link description to a Yammer application registration form. msgid "Open Yammer application registration form" msgstr "Öffne Yammer-Anwendungsregistrierungsformular" +#. TRANS: Instructions. msgid "Copy the consumer key and secret you are given into the form below:" msgstr "" "Kopiere den Verbraucherschlüssel und das Geheimnis, beide untenstehend:" +#. TRANS: Field label for a Yammer consumer key. msgid "Consumer key:" msgstr "Verbraucherschlüssel:" +#. TRANS: Field label for a Yammer consumer secret. msgid "Consumer secret:" msgstr "Verbrauchergeheimnis:" +#. TRANS: Button text for saving a Yammer API registration. +msgctxt "BUTTON" msgid "Save" msgstr "Speichern" -msgid "Save these consumer keys" -msgstr "Speichere diese Verbraucherschlüssel" +#. TRANS: Button title for saving a Yammer API registration. +msgid "Save the entered consumer key and consumer secret." +msgstr "Speichere eingegebenen Verbraucherschlüssel und Verbrauchergeheimnis." diff --git a/plugins/YammerImport/locale/es/LC_MESSAGES/YammerImport.po b/plugins/YammerImport/locale/es/LC_MESSAGES/YammerImport.po new file mode 100644 index 0000000000..50b21a461a --- /dev/null +++ b/plugins/YammerImport/locale/es/LC_MESSAGES/YammerImport.po @@ -0,0 +1,352 @@ +# Translation of StatusNet - YammerImport to Spanish (español) +# Exported from translatewiki.net +# +# Author: Armando-Martin +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - YammerImport\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:33+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:51:41+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Page title for Yammer administration panel. +#. TRANS: Form legend. +#. TRANS: Field label for a Yammer import connect step. +#. TRANS: Form legend. +msgid "Connect to Yammer" +msgstr "Conectarse a Yammer" + +#. TRANS: Page title for Yammer import administration panel. +msgid "Yammer Import" +msgstr "Importación Yammer" + +#. TRANS: Instructions for Yammer import administration panel. +msgid "" +"This Yammer import tool is still undergoing testing, and is incomplete in " +"some areas. Currently user subscriptions and group memberships are not " +"transferred; in the future this may be supported for imports done by " +"verified administrators on the Yammer side." +msgstr "" +"Esta herramienta de importación de Yammer aún está sometida a pruebas y está " +"incompleta en algunas áreas. Actualmente no se transfieren las suscripciones " +"de usuario y la pertenencia a grupos; en el futuro esto puede estar " +"soportado para las importaciones realizadas por los administradores " +"verificados del lado de Yammer." + +#. TRANS: Error message about an import job being paused from the admin panel. +msgid "Paused from admin panel." +msgstr "En pausa desde el panel de administración." + +#. TRANS: Client exception thrown when encountering an unhandled sub action. +msgid "Invalid POST" +msgstr "POST no válido" + +#. TRANS: Page title for Yammer import administration panel. +msgid "Yammer import" +msgstr "Importación Yammer" + +#. TRANS: Menu item for Yammer import. +msgctxt "MENU" +msgid "Yammer" +msgstr "Yammer" + +#. TRANS: Menu item title for Yammer import. +msgid "Yammer import module." +msgstr "Módulo de importación Yammer." + +#. TRANS: Exception thrown when a non-user item type is used, but expected. +msgid "Wrong item type sent to Yammer user import processing." +msgstr "" +"Tipo de elemento incorrecto enviado para el proceso de importación de " +"usuarios de Yammer." + +#. TRANS: Used as a prefix for the Yammer expertise field contents. +msgid "Expertise:" +msgstr "Experiencia:" + +#. TRANS: Exception thrown when a non-group item type is used, but expected. +msgid "Wrong item type sent to Yammer group import processing." +msgstr "" +"Tipo de elemento incorrecto enviado para el proceso de importación de grupos " +"de Yammer." + +#. TRANS: Exception thrown when a non-message item type is used, but expected. +msgid "Wrong item type sent to Yammer message import processing." +msgstr "" +"Tipo de elemento incorrecto enviado para el proceso de importación de " +"mensajes de Yammer." + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. +#, php-format +msgid "Invalid avatar URL %s." +msgstr "La dirección URL del avatar, %s, es incorrecta." + +#. TRANS: Server exception thrown when an avatar could not be fetched. +#. TRANS: %s is the failed avatar URL. +#, php-format +msgid "Unable to fetch avatar from %s." +msgstr "No se pudo recuperar el avatar desde %s." + +#. TRANS: Button text for starting Yammer authentication. +msgctxt "BUTTON" +msgid "Start authentication" +msgstr "Iniciar la autenticación" + +#. TRANS: Button title for starting Yammer authentication. +msgid "Request authorization to connect to a Yammer account." +msgstr "Solicitar autorización para conectarse a una cuenta de Yammer." + +#. TRANS: Button text for starting changing a Yammer API key. +msgctxt "BUTTON" +msgid "Change API key" +msgstr "Cambiar la clave de la API" + +#. TRANS: Server exception thrown if a Yammer authentication request is already present. +msgid "Cannot request Yammer auth; already there!" +msgstr "No puede solicitar la autenticación Yammer; ¡ya lo hizo!" + +#. TRANS: Server exception thrown when requesting a Yammer authentication URL while in an incorrect state. +msgid "Cannot get Yammer auth URL when not in requesting-auth state!" +msgstr "" +"¡No puede obtener la dirección URL de autenticación Yammer cuando no está en " +"modo de solicitud de autenticación!" + +#. TRANS: Exeption thrown when an external Yammer system gives an error. +#. TRANS: %1$s is an HTTP error code, %2$s is the error message body. +#, php-format +msgid "Yammer API returned HTTP code %1$s: %2$s" +msgstr "La API de Yammer ha devuelto el código HTTP %1$s: %2$s" + +#. TRANS: Exeption thrown when an external Yammer system an invalid JSON response. +msgid "Invalid JSON response from Yammer API." +msgstr "Respuesta JSON inválida desde la API de Yammer." + +#. TRANS: Exeption thrown when a trust relationship has already been established. +msgid "Requesting a token, but already set up with a token." +msgstr "Solicitando una clave (token), pero ya está configurado con una clave." + +#. TRANS: Field label for a Yammer import initialise step. +msgid "Initialize" +msgstr "Inicializar" + +#. TRANS: "In progress" description. +msgid "No import running" +msgstr "No hay ninguna importación en curso" + +#. TRANS: "Complete" description for initialize state. +msgid "Initiated Yammer server connection..." +msgstr "Conexión al servidor de Yammer iniciada..." + +#. TRANS: "In progress" description. +msgid "Awaiting authorization..." +msgstr "A la espera de autorización..." + +#. TRANS: "Complete" description for connect state. +msgid "Connected." +msgstr "Conectado." + +#. TRANS: Field label for a Yammer user import users step. +msgid "Import user accounts" +msgstr "Importar cuentas de usuario" + +#. TRANS: "In progress" description. +#. TRANS: %d is the number of users to be imported. +#, php-format +msgid "Importing %d user..." +msgid_plural "Importing %d users..." +msgstr[0] "Importando %d usuario..." +msgstr[1] "Importando %d usuarios..." + +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of users imported. +#, php-format +msgid "Imported %d user." +msgid_plural "Imported %d users." +msgstr[0] "%d usuario importado." +msgstr[1] "%d usuarios importados." + +#. TRANS: Field label for a Yammer group import step. +msgid "Import user groups" +msgstr "Importar grupos de usuario" + +#. TRANS: "In progress" description. +#. TRANS: %d is the number of groups to be imported. +#, php-format +msgid "Importing %d group..." +msgid_plural "Importing %d groups..." +msgstr[0] "Importando %d grupo..." +msgstr[1] "Importando %d grupos..." + +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of groups imported. +#, php-format +msgid "Imported %d group." +msgid_plural "Imported %d groups." +msgstr[0] "%d grupo importado." +msgstr[1] "%d grupos importados." + +#. TRANS: Field label for a Yammer import prepare notices step. +msgid "Prepare public notices for import" +msgstr "Preparar notas públicas para importación" + +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be prepared for import. +#, php-format +msgid "Preparing %d notice..." +msgid_plural "Preparing %d notices..." +msgstr[0] "Preparando %d nota..." +msgstr[1] "Preparando %d notas..." + +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices prepared for import. +#, php-format +msgid "Prepared %d notice." +msgid_plural "Prepared %d notices." +msgstr[0] "%d nota preparada." +msgstr[1] "%d notas preparadas." + +#. TRANS: Field label for a Yammer import notices step. +msgid "Import public notices" +msgstr "Importar notas públicas" + +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be imported. +#, php-format +msgid "Importing %d notice..." +msgid_plural "Importing %d notices..." +msgstr[0] "Importando %d nota..." +msgstr[1] "Importando %d notas..." + +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices imported. +#, php-format +msgid "Imported %d notice." +msgid_plural "Imported %d notices." +msgstr[0] "%d nota importada." +msgstr[1] "%d notas importadas." + +#. TRANS: Field label for a Yammer import done step. +msgid "Done" +msgstr "Hecho" + +#. TRANS: "In progress" description for done step. +#. TRANS: "Complete" description for done step. +msgid "Import is complete!" +msgstr "¡La importación se ha completado!" + +#. TRANS: Fieldset legend. +msgid "Import status" +msgstr "Estado de importación" + +#. TRANS: Progress bar status. +msgid "Waiting..." +msgstr "Esperando..." + +#. TRANS: Button text for resetting the import state. +msgid "Reset import state" +msgstr "Reiniciar el estado de la importación" + +#. TRANS: Button text for pausing an import. +msgid "Pause import" +msgstr "Pausar la importación" + +#. TRANS: Error message. %s are the error details. +#, php-format +msgid "Encountered error \"%s\"." +msgstr "Se ha encontrado el error \"%s\"." + +#. TRANS: Fieldset legend for a paused import. +msgid "Paused" +msgstr "En pausa" + +#. TRANS: Button text for continuing a paused import. +msgid "Continue" +msgstr "Continuar" + +#. TRANS: Button text for aborting a paused import. +msgid "Abort import" +msgstr "Anular la importación" + +#. TRANS: Form instructions. +msgid "" +"Follow this link to confirm authorization at Yammer; you will be prompted to " +"log in if necessary:" +msgstr "" +"Siga este enlace para confirmar la autorización en Yammer; se le pedirá que " +"inicie sesión si es necesario:" + +#. TRANS: Link description for a link in an external Yammer system. +msgid "Open Yammer authentication window" +msgstr "Abrir la ventana de autenticación Yammer" + +#. TRANS: Form instructions. +msgid "Copy the verification code you are given below:" +msgstr "Copie a continuación el código de verificación que ha obtenido:" + +#. TRANS: Field label. +msgid "Verification code:" +msgstr "Código de verificación:" + +#. TRANS: Button text for saving Yammer authorisation data and starting Yammer import. +msgctxt "BUTTON" +msgid "Continue" +msgstr "Continuar" + +#. TRANS: Button title for saving Yammer authorisation data and starting Yammer import. +msgid "Save the verification code and begin import." +msgstr "Guardar el código de verificación y empezar a importar." + +#. TRANS: Form legend for adding details to connect to a remote Yammer API. +msgid "Yammer API registration" +msgstr "Registro de la API de Yammer" + +#. TRANS: Explanation of what needs to be done to connect to a Yammer network. +msgid "" +"Before we can connect to your Yammer network, you will need to register the " +"importer as an application authorized to pull data on your behalf. This " +"registration will work only for your own network. Follow this link to " +"register the app at Yammer; you will be prompted to log in if necessary:" +msgstr "" +"Antes de que nos podemos conectar a su red de Yammer, necesita registrar el " +"importador con una solicitud de autorización para que podamos extraer datos " +"en su nombre. Este registro funcionará sólo en su propia red. Siga este " +"enlace para registrar la aplicación en Yammer; se le pedirá que inicie " +"sesión si es necesario:" + +#. TRANS: Link description to a Yammer application registration form. +msgid "Open Yammer application registration form" +msgstr "Abrir el formulario de registro de la aplicación de Yammer" + +#. TRANS: Instructions. +msgid "Copy the consumer key and secret you are given into the form below:" +msgstr "" +"Copie en el siguiente formulario la clave de consumidor y la frase secreta " +"que recibió:" + +#. TRANS: Field label for a Yammer consumer key. +msgid "Consumer key:" +msgstr "Clave de consumidor:" + +#. TRANS: Field label for a Yammer consumer secret. +msgid "Consumer secret:" +msgstr "Frase secreta del consumidor:" + +#. TRANS: Button text for saving a Yammer API registration. +msgctxt "BUTTON" +msgid "Save" +msgstr "Guardar" + +#. TRANS: Button title for saving a Yammer API registration. +msgid "Save the entered consumer key and consumer secret." +msgstr "" +"Guarde la clave de consumidor introducida y la frase secreta del consumidor." diff --git a/plugins/YammerImport/locale/eu/LC_MESSAGES/YammerImport.po b/plugins/YammerImport/locale/eu/LC_MESSAGES/YammerImport.po new file mode 100644 index 0000000000..8955645ba5 --- /dev/null +++ b/plugins/YammerImport/locale/eu/LC_MESSAGES/YammerImport.po @@ -0,0 +1,329 @@ +# Translation of StatusNet - YammerImport to Basque (euskara) +# Exported from translatewiki.net +# +# Author: Artsuaga +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - YammerImport\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:33+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:51:41+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Page title for Yammer administration panel. +#. TRANS: Form legend. +#. TRANS: Field label for a Yammer import connect step. +#. TRANS: Form legend. +msgid "Connect to Yammer" +msgstr "Yammerrera konektatu" + +#. TRANS: Page title for Yammer import administration panel. +msgid "Yammer Import" +msgstr "Yammer Inportazioa" + +#. TRANS: Instructions for Yammer import administration panel. +msgid "" +"This Yammer import tool is still undergoing testing, and is incomplete in " +"some areas. Currently user subscriptions and group memberships are not " +"transferred; in the future this may be supported for imports done by " +"verified administrators on the Yammer side." +msgstr "" + +#. TRANS: Error message about an import job being paused from the admin panel. +msgid "Paused from admin panel." +msgstr "" + +#. TRANS: Client exception thrown when encountering an unhandled sub action. +msgid "Invalid POST" +msgstr "POST baliogabea" + +#. TRANS: Page title for Yammer import administration panel. +msgid "Yammer import" +msgstr "Yammer inportazioa" + +#. TRANS: Menu item for Yammer import. +msgctxt "MENU" +msgid "Yammer" +msgstr "" + +#. TRANS: Menu item title for Yammer import. +msgid "Yammer import module." +msgstr "Yammer inportazio modulua." + +#. TRANS: Exception thrown when a non-user item type is used, but expected. +msgid "Wrong item type sent to Yammer user import processing." +msgstr "" + +#. TRANS: Used as a prefix for the Yammer expertise field contents. +msgid "Expertise:" +msgstr "" + +#. TRANS: Exception thrown when a non-group item type is used, but expected. +msgid "Wrong item type sent to Yammer group import processing." +msgstr "" + +#. TRANS: Exception thrown when a non-message item type is used, but expected. +msgid "Wrong item type sent to Yammer message import processing." +msgstr "" + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. +#, php-format +msgid "Invalid avatar URL %s." +msgstr "%s abatar URL okerra." + +#. TRANS: Server exception thrown when an avatar could not be fetched. +#. TRANS: %s is the failed avatar URL. +#, php-format +msgid "Unable to fetch avatar from %s." +msgstr "Ezin izan da abatarra lortu %s helbidetik." + +#. TRANS: Button text for starting Yammer authentication. +msgctxt "BUTTON" +msgid "Start authentication" +msgstr "Hasi egiaztatzea" + +#. TRANS: Button title for starting Yammer authentication. +msgid "Request authorization to connect to a Yammer account." +msgstr "" + +#. TRANS: Button text for starting changing a Yammer API key. +msgctxt "BUTTON" +msgid "Change API key" +msgstr "Aldatu API gakoa" + +#. TRANS: Server exception thrown if a Yammer authentication request is already present. +msgid "Cannot request Yammer auth; already there!" +msgstr "" + +#. TRANS: Server exception thrown when requesting a Yammer authentication URL while in an incorrect state. +msgid "Cannot get Yammer auth URL when not in requesting-auth state!" +msgstr "" + +#. TRANS: Exeption thrown when an external Yammer system gives an error. +#. TRANS: %1$s is an HTTP error code, %2$s is the error message body. +#, php-format +msgid "Yammer API returned HTTP code %1$s: %2$s" +msgstr "" + +#. TRANS: Exeption thrown when an external Yammer system an invalid JSON response. +msgid "Invalid JSON response from Yammer API." +msgstr "" + +#. TRANS: Exeption thrown when a trust relationship has already been established. +msgid "Requesting a token, but already set up with a token." +msgstr "" + +#. TRANS: Field label for a Yammer import initialise step. +msgid "Initialize" +msgstr "" + +#. TRANS: "In progress" description. +msgid "No import running" +msgstr "Inportazioa abiatu gabe" + +#. TRANS: "Complete" description for initialize state. +msgid "Initiated Yammer server connection..." +msgstr "" + +#. TRANS: "In progress" description. +msgid "Awaiting authorization..." +msgstr "Baimenaren zai..." + +#. TRANS: "Complete" description for connect state. +msgid "Connected." +msgstr "Konektaturik." + +#. TRANS: Field label for a Yammer user import users step. +msgid "Import user accounts" +msgstr "Inportatu erabiltzaileen kontuak" + +#. TRANS: "In progress" description. +#. TRANS: %d is the number of users to be imported. +#, php-format +msgid "Importing %d user..." +msgid_plural "Importing %d users..." +msgstr[0] "Erabiltzaile %d inportatzen..." +msgstr[1] "%d erabiltzaile inportatzen..." + +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of users imported. +#, php-format +msgid "Imported %d user." +msgid_plural "Imported %d users." +msgstr[0] "Erabiltzaile %d inportatu da." +msgstr[1] "%d erabiltzaile inportatu dira." + +#. TRANS: Field label for a Yammer group import step. +msgid "Import user groups" +msgstr "Inportatu erabiltzaileen taldeak" + +#. TRANS: "In progress" description. +#. TRANS: %d is the number of groups to be imported. +#, php-format +msgid "Importing %d group..." +msgid_plural "Importing %d groups..." +msgstr[0] "Talde %d inportatzen..." +msgstr[1] "%d talde inportatzen..." + +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of groups imported. +#, php-format +msgid "Imported %d group." +msgid_plural "Imported %d groups." +msgstr[0] "Talde %d inportatu da." +msgstr[1] "%d talde inportatu dira." + +#. TRANS: Field label for a Yammer import prepare notices step. +msgid "Prepare public notices for import" +msgstr "" + +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be prepared for import. +#, php-format +msgid "Preparing %d notice..." +msgid_plural "Preparing %d notices..." +msgstr[0] "Ohar %d prestatzen..." +msgstr[1] "%d ohar prestatzen..." + +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices prepared for import. +#, php-format +msgid "Prepared %d notice." +msgid_plural "Prepared %d notices." +msgstr[0] "Ohar %d prestatua." +msgstr[1] "%d ohar prestatuak." + +#. TRANS: Field label for a Yammer import notices step. +msgid "Import public notices" +msgstr "Inportatu ohar publikoak" + +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be imported. +#, php-format +msgid "Importing %d notice..." +msgid_plural "Importing %d notices..." +msgstr[0] "Ohar %d inportatzen..." +msgstr[1] "%d ohar inportatzen..." + +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices imported. +#, php-format +msgid "Imported %d notice." +msgid_plural "Imported %d notices." +msgstr[0] "Ohar %d inportatua." +msgstr[1] "%d ohar inportatuak." + +#. TRANS: Field label for a Yammer import done step. +msgid "Done" +msgstr "" + +#. TRANS: "In progress" description for done step. +#. TRANS: "Complete" description for done step. +msgid "Import is complete!" +msgstr "Inportazioa bete da!" + +#. TRANS: Fieldset legend. +msgid "Import status" +msgstr "Inportazio egoera" + +#. TRANS: Progress bar status. +msgid "Waiting..." +msgstr "" + +#. TRANS: Button text for resetting the import state. +msgid "Reset import state" +msgstr "Reseteatu inportazio egoera" + +#. TRANS: Button text for pausing an import. +msgid "Pause import" +msgstr "Pausatu inportazioa" + +#. TRANS: Error message. %s are the error details. +#, php-format +msgid "Encountered error \"%s\"." +msgstr "\"%s\" akatsa aurkitu da." + +#. TRANS: Fieldset legend for a paused import. +msgid "Paused" +msgstr "" + +#. TRANS: Button text for continuing a paused import. +msgid "Continue" +msgstr "Jarraitu" + +#. TRANS: Button text for aborting a paused import. +msgid "Abort import" +msgstr "Utzi inportazioa" + +#. TRANS: Form instructions. +msgid "" +"Follow this link to confirm authorization at Yammer; you will be prompted to " +"log in if necessary:" +msgstr "" + +#. TRANS: Link description for a link in an external Yammer system. +msgid "Open Yammer authentication window" +msgstr "" + +#. TRANS: Form instructions. +msgid "Copy the verification code you are given below:" +msgstr "" + +#. TRANS: Field label. +msgid "Verification code:" +msgstr "Baieztapen-kodea:" + +#. TRANS: Button text for saving Yammer authorisation data and starting Yammer import. +msgctxt "BUTTON" +msgid "Continue" +msgstr "Jarraitu" + +#. TRANS: Button title for saving Yammer authorisation data and starting Yammer import. +msgid "Save the verification code and begin import." +msgstr "" + +#. TRANS: Form legend for adding details to connect to a remote Yammer API. +msgid "Yammer API registration" +msgstr "Yammer API erregistroa" + +#. TRANS: Explanation of what needs to be done to connect to a Yammer network. +msgid "" +"Before we can connect to your Yammer network, you will need to register the " +"importer as an application authorized to pull data on your behalf. This " +"registration will work only for your own network. Follow this link to " +"register the app at Yammer; you will be prompted to log in if necessary:" +msgstr "" + +#. TRANS: Link description to a Yammer application registration form. +msgid "Open Yammer application registration form" +msgstr "" + +#. TRANS: Instructions. +msgid "Copy the consumer key and secret you are given into the form below:" +msgstr "" + +#. TRANS: Field label for a Yammer consumer key. +msgid "Consumer key:" +msgstr "Kontsumitzaile gakoa:" + +#. TRANS: Field label for a Yammer consumer secret. +msgid "Consumer secret:" +msgstr "Kontsumitzaile sekretua:" + +#. TRANS: Button text for saving a Yammer API registration. +msgctxt "BUTTON" +msgid "Save" +msgstr "Gorde" + +#. TRANS: Button title for saving a Yammer API registration. +msgid "Save the entered consumer key and consumer secret." +msgstr "Gorde kontsumitzaile gako eta sekretua." diff --git a/plugins/YammerImport/locale/fr/LC_MESSAGES/YammerImport.po b/plugins/YammerImport/locale/fr/LC_MESSAGES/YammerImport.po index ecf89a39b4..01304fc5b2 100644 --- a/plugins/YammerImport/locale/fr/LC_MESSAGES/YammerImport.po +++ b/plugins/YammerImport/locale/fr/LC_MESSAGES/YammerImport.po @@ -1,7 +1,11 @@ -# Translation of StatusNet - YammerImport to French (Français) +# Translation of StatusNet - YammerImport to French (français) # Exported from translatewiki.net # +# Author: Gomoko +# Author: Hashar +# Author: Od1n # Author: Peter17 +# Author: Tititou36 # -- # This file is distributed under the same license as the StatusNet package. # @@ -9,24 +13,30 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - YammerImport\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:52:00+0000\n" -"Language-Team: French \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:33+0000\n" +"Language-Team: French \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:41+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-yammerimport\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Page title for Yammer administration panel. +#. TRANS: Form legend. +#. TRANS: Field label for a Yammer import connect step. +#. TRANS: Form legend. msgid "Connect to Yammer" msgstr "Connexion à Yammer" +#. TRANS: Page title for Yammer import administration panel. msgid "Yammer Import" msgstr "Import Yammer" +#. TRANS: Instructions for Yammer import administration panel. msgid "" "This Yammer import tool is still undergoing testing, and is incomplete in " "some areas. Currently user subscriptions and group memberships are not " @@ -39,141 +49,239 @@ msgstr "" "le futur pour les imports réalisés par les administrateurs autorisés du côté " "de Yammer." +#. TRANS: Error message about an import job being paused from the admin panel. msgid "Paused from admin panel." msgstr "Mis en pause depuis le panneau d’administration" +#. TRANS: Client exception thrown when encountering an unhandled sub action. +msgid "Invalid POST" +msgstr "POST invalide." + +#. TRANS: Page title for Yammer import administration panel. msgid "Yammer import" msgstr "Import Yammer" +#. TRANS: Menu item for Yammer import. +msgctxt "MENU" msgid "Yammer" msgstr "Yammer" +#. TRANS: Menu item title for Yammer import. +msgid "Yammer import module." +msgstr "Module d'import Yammer." + +#. TRANS: Exception thrown when a non-user item type is used, but expected. +msgid "Wrong item type sent to Yammer user import processing." +msgstr "" +"Mauvais type d'élément envoyé au processus d'import d'utilisateur de Yammer." + +#. TRANS: Used as a prefix for the Yammer expertise field contents. msgid "Expertise:" msgstr "Expertise :" +#. TRANS: Exception thrown when a non-group item type is used, but expected. +msgid "Wrong item type sent to Yammer group import processing." +msgstr "" +"Mauvais type d'élément envoyé au processus d'import de groupe de Yammer." + +#. TRANS: Exception thrown when a non-message item type is used, but expected. +msgid "Wrong item type sent to Yammer message import processing." +msgstr "" +"Mauvais type d'élément envoyé au processus d'import de message de Yammer." + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. #, php-format msgid "Invalid avatar URL %s." msgstr "URL d’avatar invalide : %s." +#. TRANS: Server exception thrown when an avatar could not be fetched. +#. TRANS: %s is the failed avatar URL. #, php-format msgid "Unable to fetch avatar from %s." msgstr "Impossible de récupérer l’avatar depuis « %s »." +#. TRANS: Button text for starting Yammer authentication. +msgctxt "BUTTON" msgid "Start authentication" msgstr "Démarrer l’identification" -msgid "Request authorization to connect to Yammer account" +#. TRANS: Button title for starting Yammer authentication. +msgid "Request authorization to connect to a Yammer account." msgstr "Demander l’autorisation de se connecter à un compte Yammer" +#. TRANS: Button text for starting changing a Yammer API key. +msgctxt "BUTTON" msgid "Change API key" msgstr "Changer la clé de l’API" +#. TRANS: Server exception thrown if a Yammer authentication request is already present. +msgid "Cannot request Yammer auth; already there!" +msgstr "Impossible de demander une authentification Yammer; déjà présent!" + +#. TRANS: Server exception thrown when requesting a Yammer authentication URL while in an incorrect state. +msgid "Cannot get Yammer auth URL when not in requesting-auth state!" +msgstr "" +"Impossible d'obtenir une URL d'authentification Yammer en n'étant pas dans " +"un état demandant une authentification!" + +#. TRANS: Exeption thrown when an external Yammer system gives an error. +#. TRANS: %1$s is an HTTP error code, %2$s is the error message body. +#, php-format +msgid "Yammer API returned HTTP code %1$s: %2$s" +msgstr "L'API Yammer a renvoyé le code HTTP %1$s : %2$s" + +#. TRANS: Exeption thrown when an external Yammer system an invalid JSON response. +msgid "Invalid JSON response from Yammer API." +msgstr "Réponse JSON non valide en provenance de l'API Yammer." + +#. TRANS: Exeption thrown when a trust relationship has already been established. +msgid "Requesting a token, but already set up with a token." +msgstr "Jeton demandé, mais un jeton a déjà été accordé." + +#. TRANS: Field label for a Yammer import initialise step. msgid "Initialize" msgstr "Initialiser" +#. TRANS: "In progress" description. msgid "No import running" msgstr "Aucun import en cours d’exécution" +#. TRANS: "Complete" description for initialize state. msgid "Initiated Yammer server connection..." msgstr "Connexion au serveur Yammer initiée..." +#. TRANS: "In progress" description. msgid "Awaiting authorization..." msgstr "En attente d’autorisation..." +#. TRANS: "Complete" description for connect state. msgid "Connected." msgstr "Connecté." +#. TRANS: Field label for a Yammer user import users step. msgid "Import user accounts" msgstr "Importer des comptes utilisateur" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of users to be imported. #, php-format msgid "Importing %d user..." msgid_plural "Importing %d users..." msgstr[0] "Import de %d utilisateur..." msgstr[1] "Import de %d utilisateurs..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of users imported. #, php-format msgid "Imported %d user." msgid_plural "Imported %d users." msgstr[0] "%d utilisateur importé." msgstr[1] "%d utilisateurs importés." +#. TRANS: Field label for a Yammer group import step. msgid "Import user groups" msgstr "Importer des groupes utilisateur" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of groups to be imported. #, php-format msgid "Importing %d group..." msgid_plural "Importing %d groups..." msgstr[0] "Import de %d groupe..." msgstr[1] "Import de %d groupes..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of groups imported. #, php-format msgid "Imported %d group." msgid_plural "Imported %d groups." msgstr[0] "%d groupe importé." msgstr[1] "%d groupes importés." +#. TRANS: Field label for a Yammer import prepare notices step. msgid "Prepare public notices for import" msgstr "Préparation de l’import d’avis publiques" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be prepared for import. #, php-format msgid "Preparing %d notice..." msgid_plural "Preparing %d notices..." msgstr[0] "Préparation de %d avis..." msgstr[1] "Préparation de %d avis..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices prepared for import. #, php-format msgid "Prepared %d notice." msgid_plural "Prepared %d notices." msgstr[0] "%d avis prépara." msgstr[1] "%d avis préparés." +#. TRANS: Field label for a Yammer import notices step. msgid "Import public notices" msgstr "Import d’avis publiques" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be imported. #, php-format msgid "Importing %d notice..." msgid_plural "Importing %d notices..." msgstr[0] "Import de %d avis..." msgstr[1] "Import de %d avis..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices imported. #, php-format msgid "Imported %d notice." msgid_plural "Imported %d notices." msgstr[0] "%d avis importé." msgstr[1] "%d avis importés." +#. TRANS: Field label for a Yammer import done step. msgid "Done" msgstr "Fait" +#. TRANS: "In progress" description for done step. +#. TRANS: "Complete" description for done step. msgid "Import is complete!" msgstr "L’import est terminé !" +#. TRANS: Fieldset legend. msgid "Import status" msgstr "État de l’import" +#. TRANS: Progress bar status. msgid "Waiting..." msgstr "Attente..." +#. TRANS: Button text for resetting the import state. msgid "Reset import state" msgstr "Réinitialiser l’état de l’import" +#. TRANS: Button text for pausing an import. msgid "Pause import" msgstr "Mettre l’import en pause" +#. TRANS: Error message. %s are the error details. #, php-format -msgid "Encountered error \"%s\"" +msgid "Encountered error \"%s\"." msgstr "L’erreur « %s » est survenue" +#. TRANS: Fieldset legend for a paused import. msgid "Paused" msgstr "En pause" +#. TRANS: Button text for continuing a paused import. msgid "Continue" msgstr "Continuer" +#. TRANS: Button text for aborting a paused import. msgid "Abort import" msgstr "Abandonner l’import" +#. TRANS: Form instructions. msgid "" "Follow this link to confirm authorization at Yammer; you will be prompted to " "log in if necessary:" @@ -181,21 +289,32 @@ msgstr "" "Suivez ce lien pour confirmer l’autorisation sur Yammer ; il vous sera " "demandé de vous identifier si nécessaire :" +#. TRANS: Link description for a link in an external Yammer system. msgid "Open Yammer authentication window" msgstr "Ouvrir la fenêtre d’identification Yammer" +#. TRANS: Form instructions. msgid "Copy the verification code you are given below:" msgstr "Copiez ci-dessous le code de vérification qui vous est donné :" +#. TRANS: Field label. msgid "Verification code:" msgstr "Code de vérification :" -msgid "Save code and begin import" -msgstr "Enregistrer le code et commencer l’import" +#. TRANS: Button text for saving Yammer authorisation data and starting Yammer import. +msgctxt "BUTTON" +msgid "Continue" +msgstr "Continuer" +#. TRANS: Button title for saving Yammer authorisation data and starting Yammer import. +msgid "Save the verification code and begin import." +msgstr "Enregistrer le code de vérification et commencer l’import" + +#. TRANS: Form legend for adding details to connect to a remote Yammer API. msgid "Yammer API registration" msgstr "Enregistrement de l’API Yammer" +#. TRANS: Explanation of what needs to be done to connect to a Yammer network. msgid "" "Before we can connect to your Yammer network, you will need to register the " "importer as an application authorized to pull data on your behalf. This " @@ -208,22 +327,31 @@ msgstr "" "propre réseau. Suivez ce lien pour enregistrer l’application sur Yammer ; si " "cela est nécessaire, il vous sera demandé de vous identifier :" +#. TRANS: Link description to a Yammer application registration form. msgid "Open Yammer application registration form" msgstr "Ouvrir le formulaire d’enregistrement de l’application Yammer" +#. TRANS: Instructions. msgid "Copy the consumer key and secret you are given into the form below:" msgstr "" "Copiez dans le formulaire ci-dessous la clé et le secret utilisateur qui " "vous sont donnés :" +#. TRANS: Field label for a Yammer consumer key. msgid "Consumer key:" msgstr "Clé de l'utilisateur :" +#. TRANS: Field label for a Yammer consumer secret. msgid "Consumer secret:" msgstr "Secret de l'utilisateur :" +#. TRANS: Button text for saving a Yammer API registration. +msgctxt "BUTTON" msgid "Save" -msgstr "Sauvegarder" +msgstr "Enregistrer" -msgid "Save these consumer keys" -msgstr "Enregistrer ces clés utilisateur" +#. TRANS: Button title for saving a Yammer API registration. +msgid "Save the entered consumer key and consumer secret." +msgstr "" +"Enregistrer les clés d'utilisateur entrées et le mot de passe de " +"l'utilisateur." diff --git a/plugins/YammerImport/locale/gl/LC_MESSAGES/YammerImport.po b/plugins/YammerImport/locale/gl/LC_MESSAGES/YammerImport.po index de7690aa8d..8557abaca4 100644 --- a/plugins/YammerImport/locale/gl/LC_MESSAGES/YammerImport.po +++ b/plugins/YammerImport/locale/gl/LC_MESSAGES/YammerImport.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - YammerImport to Galician (Galego) +# Translation of StatusNet - YammerImport to Galician (galego) # Exported from translatewiki.net # # Author: Toliño @@ -9,207 +9,346 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - YammerImport\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:52:00+0000\n" -"Language-Team: Galician \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:33+0000\n" +"Language-Team: Galician \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:41+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: gl\n" "X-Message-Group: #out-statusnet-plugin-yammerimport\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Page title for Yammer administration panel. +#. TRANS: Form legend. +#. TRANS: Field label for a Yammer import connect step. +#. TRANS: Form legend. msgid "Connect to Yammer" -msgstr "" +msgstr "Conectar ao Yammer" +#. TRANS: Page title for Yammer import administration panel. msgid "Yammer Import" msgstr "Importación Yammer" +#. TRANS: Instructions for Yammer import administration panel. msgid "" "This Yammer import tool is still undergoing testing, and is incomplete in " "some areas. Currently user subscriptions and group memberships are not " "transferred; in the future this may be supported for imports done by " "verified administrators on the Yammer side." msgstr "" +"Esta ferramenta de importación do Yammer está aínda baixo probas e está " +"incompleta nalgúns aspectos. Arestora, non se transfiren as subscricións de " +"usuarios e as pertenzas aos grupos; no futuro, isto pode estar soportado " +"para as importacións feitas por administradores verificados no Yammer." +#. TRANS: Error message about an import job being paused from the admin panel. msgid "Paused from admin panel." msgstr "En pausa desde o panel de administración." +#. TRANS: Client exception thrown when encountering an unhandled sub action. +msgid "Invalid POST" +msgstr "POST inválido." + +#. TRANS: Page title for Yammer import administration panel. msgid "Yammer import" -msgstr "" +msgstr "Importación Yammer" +#. TRANS: Menu item for Yammer import. +msgctxt "MENU" msgid "Yammer" -msgstr "" +msgstr "Yammer" +#. TRANS: Menu item title for Yammer import. +msgid "Yammer import module." +msgstr "Módulo de importación Yammer." + +#. TRANS: Exception thrown when a non-user item type is used, but expected. +msgid "Wrong item type sent to Yammer user import processing." +msgstr "" +"Tipo de elemento incorrecto enviado para o proceso de importación de " +"usuarios do Yammer." + +#. TRANS: Used as a prefix for the Yammer expertise field contents. msgid "Expertise:" -msgstr "" +msgstr "Experiencia:" +#. TRANS: Exception thrown when a non-group item type is used, but expected. +msgid "Wrong item type sent to Yammer group import processing." +msgstr "" +"Tipo de elemento incorrecto enviado para o proceso de importación de grupos " +"do Yammer." + +#. TRANS: Exception thrown when a non-message item type is used, but expected. +msgid "Wrong item type sent to Yammer message import processing." +msgstr "" +"Tipo de elemento incorrecto enviado para o proceso de importación de " +"mensaxes do Yammer." + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. #, php-format msgid "Invalid avatar URL %s." -msgstr "" +msgstr "O enderezo URL do avatar, %s, é incorrecto." +#. TRANS: Server exception thrown when an avatar could not be fetched. +#. TRANS: %s is the failed avatar URL. #, php-format msgid "Unable to fetch avatar from %s." -msgstr "" +msgstr "Non se puido recuperar o avatar desde %s." +#. TRANS: Button text for starting Yammer authentication. +msgctxt "BUTTON" msgid "Start authentication" -msgstr "" +msgstr "Comezar a autenticación" -msgid "Request authorization to connect to Yammer account" -msgstr "" +#. TRANS: Button title for starting Yammer authentication. +msgid "Request authorization to connect to a Yammer account." +msgstr "Solicitar autorización para conectarse a unha conta do Yammer." +#. TRANS: Button text for starting changing a Yammer API key. +msgctxt "BUTTON" msgid "Change API key" -msgstr "" +msgstr "Cambiar a clave da API" +#. TRANS: Server exception thrown if a Yammer authentication request is already present. +msgid "Cannot request Yammer auth; already there!" +msgstr "" +"Non se pode solicitar a autenticación do Yammer; a solicitude xa está " +"presente!" + +#. TRANS: Server exception thrown when requesting a Yammer authentication URL while in an incorrect state. +msgid "Cannot get Yammer auth URL when not in requesting-auth state!" +msgstr "" +"Non se pode obter a autenticación do Yammer sen estar no modo de solicitude " +"de autenticación!" + +#. TRANS: Exeption thrown when an external Yammer system gives an error. +#. TRANS: %1$s is an HTTP error code, %2$s is the error message body. +#, php-format +msgid "Yammer API returned HTTP code %1$s: %2$s" +msgstr "A API do Yammer devolveu o código HTTP %1$s: %2$s" + +#. TRANS: Exeption thrown when an external Yammer system an invalid JSON response. +msgid "Invalid JSON response from Yammer API." +msgstr "Resposta JSON inválida desde a API do Yammer." + +#. TRANS: Exeption thrown when a trust relationship has already been established. +msgid "Requesting a token, but already set up with a token." +msgstr "Solicitando un pase, pero o pase xa está configurado." + +#. TRANS: Field label for a Yammer import initialise step. msgid "Initialize" msgstr "Iniciar" +#. TRANS: "In progress" description. msgid "No import running" -msgstr "" +msgstr "Non hai ningunha importación en curso" +#. TRANS: "Complete" description for initialize state. msgid "Initiated Yammer server connection..." -msgstr "" +msgstr "Conexión ao servidor do Yammer iniciada..." +#. TRANS: "In progress" description. msgid "Awaiting authorization..." msgstr "Agardando a autorización..." +#. TRANS: "Complete" description for connect state. msgid "Connected." msgstr "Conectado." +#. TRANS: Field label for a Yammer user import users step. msgid "Import user accounts" -msgstr "" +msgstr "Importar contas de usuario" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of users to be imported. #, php-format msgid "Importing %d user..." msgid_plural "Importing %d users..." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Importando %d usuario..." +msgstr[1] "Importando %d usuarios..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of users imported. #, php-format msgid "Imported %d user." msgid_plural "Imported %d users." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%d usuario importado." +msgstr[1] "%d usuarios importados." +#. TRANS: Field label for a Yammer group import step. msgid "Import user groups" -msgstr "" +msgstr "Importar grupos de usuario" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of groups to be imported. #, php-format msgid "Importing %d group..." msgid_plural "Importing %d groups..." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Importando %d grupo..." +msgstr[1] "Importando %d grupos..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of groups imported. #, php-format msgid "Imported %d group." msgid_plural "Imported %d groups." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%d grupo importado." +msgstr[1] "%d grupos importados." +#. TRANS: Field label for a Yammer import prepare notices step. msgid "Prepare public notices for import" -msgstr "" +msgstr "Preparar a importación de notas públicas" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be prepared for import. #, php-format msgid "Preparing %d notice..." msgid_plural "Preparing %d notices..." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Preparando %d nota..." +msgstr[1] "Preparando %d notas..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices prepared for import. #, php-format msgid "Prepared %d notice." msgid_plural "Prepared %d notices." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%d nota preparada." +msgstr[1] "%d notas preparadas." +#. TRANS: Field label for a Yammer import notices step. msgid "Import public notices" -msgstr "" +msgstr "Importar notas públicas" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be imported. #, php-format msgid "Importing %d notice..." msgid_plural "Importing %d notices..." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Importando %d nota..." +msgstr[1] "Importando %d notas..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices imported. #, php-format msgid "Imported %d notice." msgid_plural "Imported %d notices." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%d nota importada." +msgstr[1] "%d notas importadas." +#. TRANS: Field label for a Yammer import done step. msgid "Done" msgstr "Feito" +#. TRANS: "In progress" description for done step. +#. TRANS: "Complete" description for done step. msgid "Import is complete!" msgstr "Completouse a importación!" +#. TRANS: Fieldset legend. msgid "Import status" msgstr "Estado da importación" +#. TRANS: Progress bar status. msgid "Waiting..." msgstr "Agarde..." +#. TRANS: Button text for resetting the import state. msgid "Reset import state" msgstr "Reiniciar o estado da importación" +#. TRANS: Button text for pausing an import. msgid "Pause import" msgstr "Pausar a importación" +#. TRANS: Error message. %s are the error details. #, php-format -msgid "Encountered error \"%s\"" -msgstr "Atopouse o erro \"%s\"" +msgid "Encountered error \"%s\"." +msgstr "Atopouse o erro \"%s\"." +#. TRANS: Fieldset legend for a paused import. msgid "Paused" msgstr "En pausa" +#. TRANS: Button text for continuing a paused import. msgid "Continue" msgstr "Continuar" +#. TRANS: Button text for aborting a paused import. msgid "Abort import" msgstr "Abortar a importación" +#. TRANS: Form instructions. msgid "" "Follow this link to confirm authorization at Yammer; you will be prompted to " "log in if necessary:" msgstr "" +"Siga esta ligazón para confirmar a autorización no Yammer; pedirémoslle que " +"inicie sesión se fose necesario:" +#. TRANS: Link description for a link in an external Yammer system. msgid "Open Yammer authentication window" -msgstr "" +msgstr "Abrir a ventá de importación do Yammer" +#. TRANS: Form instructions. msgid "Copy the verification code you are given below:" -msgstr "" +msgstr "Copie o código de verificación que recibiu a continuación:" +#. TRANS: Field label. msgid "Verification code:" msgstr "Código de verificación:" -msgid "Save code and begin import" -msgstr "" +#. TRANS: Button text for saving Yammer authorisation data and starting Yammer import. +msgctxt "BUTTON" +msgid "Continue" +msgstr "Continuar" +#. TRANS: Button title for saving Yammer authorisation data and starting Yammer import. +msgid "Save the verification code and begin import." +msgstr "Gardar o código de verificación e comezar a importación." + +#. TRANS: Form legend for adding details to connect to a remote Yammer API. msgid "Yammer API registration" -msgstr "" +msgstr "Rexistro da API do Yammer" +#. TRANS: Explanation of what needs to be done to connect to a Yammer network. msgid "" "Before we can connect to your Yammer network, you will need to register the " "importer as an application authorized to pull data on your behalf. This " "registration will work only for your own network. Follow this link to " "register the app at Yammer; you will be prompted to log in if necessary:" msgstr "" +"Antes de que poidamos conectar coa rede do Yammer, terá que rexistrar a " +"aplicación de importación co fin de autorizala para que recolla datos no seu " +"nome. Este rexistro funcionará unicamente na súa propia rede. Siga esta " +"ligazón para rexistrar a aplicación no Yammer; pedirémoslle que inicie " +"sesión se fose necesario:" +#. TRANS: Link description to a Yammer application registration form. msgid "Open Yammer application registration form" -msgstr "" +msgstr "Abrir o formulario de rexistro da aplicación do Yammer" +#. TRANS: Instructions. msgid "Copy the consumer key and secret you are given into the form below:" msgstr "" +"Copie a clave e a frase de consumidor secreta que recibiu a continuación:" +#. TRANS: Field label for a Yammer consumer key. msgid "Consumer key:" msgstr "Clave do consumidor:" +#. TRANS: Field label for a Yammer consumer secret. msgid "Consumer secret:" msgstr "Pregunta secreta do consumidor:" +#. TRANS: Button text for saving a Yammer API registration. +msgctxt "BUTTON" msgid "Save" msgstr "Gardar" -msgid "Save these consumer keys" -msgstr "" +#. TRANS: Button title for saving a Yammer API registration. +msgid "Save the entered consumer key and consumer secret." +msgstr "Gardar a clave e a frase de consumidor secreta inseridas." diff --git a/plugins/YammerImport/locale/ia/LC_MESSAGES/YammerImport.po b/plugins/YammerImport/locale/ia/LC_MESSAGES/YammerImport.po index a76ea5ffc8..8873358582 100644 --- a/plugins/YammerImport/locale/ia/LC_MESSAGES/YammerImport.po +++ b/plugins/YammerImport/locale/ia/LC_MESSAGES/YammerImport.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - YammerImport to Interlingua (Interlingua) +# Translation of StatusNet - YammerImport to Interlingua (interlingua) # Exported from translatewiki.net # # Author: McDutchie @@ -9,24 +9,30 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - YammerImport\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:52:00+0000\n" -"Language-Team: Interlingua \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:33+0000\n" +"Language-Team: Interlingua \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:41+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-yammerimport\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Page title for Yammer administration panel. +#. TRANS: Form legend. +#. TRANS: Field label for a Yammer import connect step. +#. TRANS: Form legend. msgid "Connect to Yammer" msgstr "Connecter a Yammer" +#. TRANS: Page title for Yammer import administration panel. msgid "Yammer Import" msgstr "Importation de Yammer" +#. TRANS: Instructions for Yammer import administration panel. msgid "" "This Yammer import tool is still undergoing testing, and is incomplete in " "some areas. Currently user subscriptions and group memberships are not " @@ -39,141 +45,238 @@ msgstr "" "supportate pro importationes facite per administratores verificate al latere " "de Yammer." +#. TRANS: Error message about an import job being paused from the admin panel. msgid "Paused from admin panel." msgstr "Pausate ab le pannello admin." +#. TRANS: Client exception thrown when encountering an unhandled sub action. +msgid "Invalid POST" +msgstr "POST invalide" + +#. TRANS: Page title for Yammer import administration panel. msgid "Yammer import" msgstr "Importation de Yammer" +#. TRANS: Menu item for Yammer import. +msgctxt "MENU" msgid "Yammer" msgstr "Yammer" +#. TRANS: Menu item title for Yammer import. +msgid "Yammer import module." +msgstr "Modulo de importation de Yammer." + +#. TRANS: Exception thrown when a non-user item type is used, but expected. +msgid "Wrong item type sent to Yammer user import processing." +msgstr "Mal typo de elemento inviate pro le importation de usatores de Yammer." + +#. TRANS: Used as a prefix for the Yammer expertise field contents. msgid "Expertise:" msgstr "Expertise:" +#. TRANS: Exception thrown when a non-group item type is used, but expected. +msgid "Wrong item type sent to Yammer group import processing." +msgstr "Mal typo de elemento inviate pro le importation de gruppos de Yammer." + +#. TRANS: Exception thrown when a non-message item type is used, but expected. +msgid "Wrong item type sent to Yammer message import processing." +msgstr "Mal typo de elemento inviate pro le importation de messages de Yammer." + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. #, php-format msgid "Invalid avatar URL %s." msgstr "URL de avatar %s invalide." +#. TRANS: Server exception thrown when an avatar could not be fetched. +#. TRANS: %s is the failed avatar URL. #, php-format msgid "Unable to fetch avatar from %s." msgstr "Incapace de obtener avatar ab %s." +#. TRANS: Button text for starting Yammer authentication. +msgctxt "BUTTON" msgid "Start authentication" msgstr "Comenciar authentication" -msgid "Request authorization to connect to Yammer account" -msgstr "Requestar autorisation de connecter al conto Yammer" +#. TRANS: Button title for starting Yammer authentication. +msgid "Request authorization to connect to a Yammer account." +msgstr "Requestar autorisation pro connecter a un conto Yammer." +#. TRANS: Button text for starting changing a Yammer API key. +msgctxt "BUTTON" msgid "Change API key" msgstr "Cambiar clave API" +#. TRANS: Server exception thrown if a Yammer authentication request is already present. +msgid "Cannot request Yammer auth; already there!" +msgstr "" +"Impossibile requestar un authentication de Yammer; le requesta es jam " +"presente!" + +#. TRANS: Server exception thrown when requesting a Yammer authentication URL while in an incorrect state. +msgid "Cannot get Yammer auth URL when not in requesting-auth state!" +msgstr "" +"Impossibile obtener un URL de authentication Yammer si non in modo de " +"requestar authentication!" + +#. TRANS: Exeption thrown when an external Yammer system gives an error. +#. TRANS: %1$s is an HTTP error code, %2$s is the error message body. +#, php-format +msgid "Yammer API returned HTTP code %1$s: %2$s" +msgstr "Le API de Yammer retornava le codice HTTP %1$s: %2$s" + +#. TRANS: Exeption thrown when an external Yammer system an invalid JSON response. +msgid "Invalid JSON response from Yammer API." +msgstr "Responsa JSON invalide ab le API de Yammer." + +#. TRANS: Exeption thrown when a trust relationship has already been established. +msgid "Requesting a token, but already set up with a token." +msgstr "Un indicio es requestate, ma un indicio ha jam essite installate." + +#. TRANS: Field label for a Yammer import initialise step. msgid "Initialize" msgstr "Initialisar" +#. TRANS: "In progress" description. msgid "No import running" msgstr "Nulle importation in curso" +#. TRANS: "Complete" description for initialize state. msgid "Initiated Yammer server connection..." msgstr "Connexion al servitor Yammer initiate..." +#. TRANS: "In progress" description. msgid "Awaiting authorization..." msgstr "Attende autorisation..." +#. TRANS: "Complete" description for connect state. msgid "Connected." msgstr "Connectite." +#. TRANS: Field label for a Yammer user import users step. msgid "Import user accounts" msgstr "Importar contos de usator" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of users to be imported. #, php-format msgid "Importing %d user..." msgid_plural "Importing %d users..." msgstr[0] "Importa %d usator..." msgstr[1] "Importa %d usatores..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of users imported. #, php-format msgid "Imported %d user." msgid_plural "Imported %d users." msgstr[0] "%d usator importate." msgstr[1] "%d usatores importate." +#. TRANS: Field label for a Yammer group import step. msgid "Import user groups" msgstr "Importar gruppos de usatores" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of groups to be imported. #, php-format msgid "Importing %d group..." msgid_plural "Importing %d groups..." msgstr[0] "Importa %d gruppo..." msgstr[1] "Importa %d gruppos..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of groups imported. #, php-format msgid "Imported %d group." msgid_plural "Imported %d groups." msgstr[0] "%d gruppo importate." msgstr[1] "%d gruppos importate." +#. TRANS: Field label for a Yammer import prepare notices step. msgid "Prepare public notices for import" msgstr "Preparar notas public pro importation" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be prepared for import. #, php-format msgid "Preparing %d notice..." msgid_plural "Preparing %d notices..." msgstr[0] "Prepara %d nota..." msgstr[1] "Prepara %d notas..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices prepared for import. #, php-format msgid "Prepared %d notice." msgid_plural "Prepared %d notices." msgstr[0] "%d nota preparate." msgstr[1] "%d notas preparate." +#. TRANS: Field label for a Yammer import notices step. msgid "Import public notices" msgstr "Importar notas public" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be imported. #, php-format msgid "Importing %d notice..." msgid_plural "Importing %d notices..." msgstr[0] "Importa %d nota..." msgstr[1] "Importa %d notas..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices imported. #, php-format msgid "Imported %d notice." msgid_plural "Imported %d notices." msgstr[0] "%d nota importate." msgstr[1] "%d notas importate." +#. TRANS: Field label for a Yammer import done step. msgid "Done" msgstr "Finite" +#. TRANS: "In progress" description for done step. +#. TRANS: "Complete" description for done step. msgid "Import is complete!" msgstr "Le importation es complete!" +#. TRANS: Fieldset legend. msgid "Import status" msgstr "Stato de importation" +#. TRANS: Progress bar status. msgid "Waiting..." msgstr "Attende..." +#. TRANS: Button text for resetting the import state. msgid "Reset import state" msgstr "Reinitialisar stato de importation" +#. TRANS: Button text for pausing an import. msgid "Pause import" msgstr "Pausar importation" +#. TRANS: Error message. %s are the error details. #, php-format -msgid "Encountered error \"%s\"" -msgstr "Incontrava error \"%s\"" +msgid "Encountered error \"%s\"." +msgstr "Incontrava error \"%s\"." +#. TRANS: Fieldset legend for a paused import. msgid "Paused" msgstr "Pausate" +#. TRANS: Button text for continuing a paused import. msgid "Continue" msgstr "Continuar" +#. TRANS: Button text for aborting a paused import. msgid "Abort import" msgstr "Abortar importation" +#. TRANS: Form instructions. msgid "" "Follow this link to confirm authorization at Yammer; you will be prompted to " "log in if necessary:" @@ -181,21 +284,32 @@ msgstr "" "Seque iste ligamine pro confirmar autorisation a Yammer; tu essera demandate " "de aperir session si necessari:" +#. TRANS: Link description for a link in an external Yammer system. msgid "Open Yammer authentication window" msgstr "Aperir fenestra de authentication a Yammer" +#. TRANS: Form instructions. msgid "Copy the verification code you are given below:" msgstr "Copia hic infra le codice de verification que tu recipe:" +#. TRANS: Field label. msgid "Verification code:" msgstr "Codice de verification:" -msgid "Save code and begin import" -msgstr "Salveguardar codice e comenciar importation" +#. TRANS: Button text for saving Yammer authorisation data and starting Yammer import. +msgctxt "BUTTON" +msgid "Continue" +msgstr "Continuar" +#. TRANS: Button title for saving Yammer authorisation data and starting Yammer import. +msgid "Save the verification code and begin import." +msgstr "Salveguardar le codice de verification e comenciar le importation." + +#. TRANS: Form legend for adding details to connect to a remote Yammer API. msgid "Yammer API registration" msgstr "Registration in API de Yammer" +#. TRANS: Explanation of what needs to be done to connect to a Yammer network. msgid "" "Before we can connect to your Yammer network, you will need to register the " "importer as an application authorized to pull data on your behalf. This " @@ -208,22 +322,29 @@ msgstr "" "pro registrar le application a Yammer; tu essera demandate de aperir session " "si necessari:" +#. TRANS: Link description to a Yammer application registration form. msgid "Open Yammer application registration form" msgstr "Aperir formulario de registration del application Yammer" +#. TRANS: Instructions. msgid "Copy the consumer key and secret you are given into the form below:" msgstr "" "Copia le clave e secreto de consumitor que tu recipe in le formulario hic " "infra:" +#. TRANS: Field label for a Yammer consumer key. msgid "Consumer key:" msgstr "Clave de consumitor:" +#. TRANS: Field label for a Yammer consumer secret. msgid "Consumer secret:" msgstr "Secreto de consumitor:" +#. TRANS: Button text for saving a Yammer API registration. +msgctxt "BUTTON" msgid "Save" msgstr "Salveguardar" -msgid "Save these consumer keys" -msgstr "Salveguardar iste claves de consumitor" +#. TRANS: Button title for saving a Yammer API registration. +msgid "Save the entered consumer key and consumer secret." +msgstr "Salveguardar le clave de consumitor e secreto de consumitor entrate." diff --git a/plugins/YammerImport/locale/mk/LC_MESSAGES/YammerImport.po b/plugins/YammerImport/locale/mk/LC_MESSAGES/YammerImport.po index 35bb3787b6..6235fcd4a2 100644 --- a/plugins/YammerImport/locale/mk/LC_MESSAGES/YammerImport.po +++ b/plugins/YammerImport/locale/mk/LC_MESSAGES/YammerImport.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - YammerImport to Macedonian (МакедонÑки) +# Translation of StatusNet - YammerImport to Macedonian (македонÑки) # Exported from translatewiki.net # # Author: Bjankuloski06 @@ -9,24 +9,30 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - YammerImport\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:52:00+0000\n" -"Language-Team: Macedonian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:34+0000\n" +"Language-Team: Macedonian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:41+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-yammerimport\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" +#. TRANS: Page title for Yammer administration panel. +#. TRANS: Form legend. +#. TRANS: Field label for a Yammer import connect step. +#. TRANS: Form legend. msgid "Connect to Yammer" msgstr "Поврзување Ñо Yammer" +#. TRANS: Page title for Yammer import administration panel. msgid "Yammer Import" msgstr "Увоз од Yammer" +#. TRANS: Instructions for Yammer import administration panel. msgid "" "This Yammer import tool is still undergoing testing, and is incomplete in " "some areas. Currently user subscriptions and group memberships are not " @@ -38,141 +44,237 @@ msgstr "" "членÑтва во групи. Ваквите префрлања може да Ñе поддржани во иднина, и тие " "би ги вршеле овлаÑтени админиÑтратори на Yammer." +#. TRANS: Error message about an import job being paused from the admin panel. msgid "Paused from admin panel." msgstr "Паузирано од админиÑтраторÑката табла." +#. TRANS: Client exception thrown when encountering an unhandled sub action. +msgid "Invalid POST" +msgstr "Ðеважечки POST" + +#. TRANS: Page title for Yammer import administration panel. msgid "Yammer import" msgstr "Увоз од Yammer" +#. TRANS: Menu item for Yammer import. +msgctxt "MENU" msgid "Yammer" msgstr "Yammer" +#. TRANS: Menu item title for Yammer import. +msgid "Yammer import module." +msgstr "Модул за увоз од Yammer." + +#. TRANS: Exception thrown when a non-user item type is used, but expected. +msgid "Wrong item type sent to Yammer user import processing." +msgstr "Ðа увозот на кориÑник од Yammer му е иÑпратен погрешен тип на Ñтавка." + +#. TRANS: Used as a prefix for the Yammer expertise field contents. msgid "Expertise:" msgstr "СтручноÑÑ‚:" +#. TRANS: Exception thrown when a non-group item type is used, but expected. +msgid "Wrong item type sent to Yammer group import processing." +msgstr "" +"Ðа групниот увоз на кориÑници од Yammer му е иÑпратен погрешен тип на Ñтавка." + +#. TRANS: Exception thrown when a non-message item type is used, but expected. +msgid "Wrong item type sent to Yammer message import processing." +msgstr "Ðа увозот на пораки од Yammer му е иÑпратен погрешен тип на Ñтавка." + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. #, php-format msgid "Invalid avatar URL %s." msgstr "Ðеважечка URL-адреÑа на аватарот: %s." +#. TRANS: Server exception thrown when an avatar could not be fetched. +#. TRANS: %s is the failed avatar URL. #, php-format msgid "Unable to fetch avatar from %s." msgstr "Ðе можев да го преземам аватарот од %s." +#. TRANS: Button text for starting Yammer authentication. +msgctxt "BUTTON" msgid "Start authentication" -msgstr "Започни проверка" +msgstr "Започни заверка" -msgid "Request authorization to connect to Yammer account" -msgstr "Барај овлаÑтување за поврзување Ñо Ñметката на Yammer" +#. TRANS: Button title for starting Yammer authentication. +msgid "Request authorization to connect to a Yammer account." +msgstr "Побарај овлаÑтување за поврзување Ñо Ñметката на Yammer." +#. TRANS: Button text for starting changing a Yammer API key. +msgctxt "BUTTON" msgid "Change API key" -msgstr "Промени API-клуч" +msgstr "Смени API-клуч" +#. TRANS: Server exception thrown if a Yammer authentication request is already present. +msgid "Cannot request Yammer auth; already there!" +msgstr "Ðе можам да побарам заверка од Yammer. Веќе Ñте таму!" + +#. TRANS: Server exception thrown when requesting a Yammer authentication URL while in an incorrect state. +msgid "Cannot get Yammer auth URL when not in requesting-auth state!" +msgstr "" +"Ðе можам да ја добијам URL-адрÑата за заверка на Yammer кога не Ñте во таков " +"режим!" + +#. TRANS: Exeption thrown when an external Yammer system gives an error. +#. TRANS: %1$s is an HTTP error code, %2$s is the error message body. +#, php-format +msgid "Yammer API returned HTTP code %1$s: %2$s" +msgstr "API на Yammer го даде HTTP-кодот %1$s: %2$s" + +#. TRANS: Exeption thrown when an external Yammer system an invalid JSON response. +msgid "Invalid JSON response from Yammer API." +msgstr "Ðеважечки JSON-одговор од API на Yammer." + +#. TRANS: Exeption thrown when a trust relationship has already been established. +msgid "Requesting a token, but already set up with a token." +msgstr "Жетонот е веќе поÑтавен." + +#. TRANS: Field label for a Yammer import initialise step. msgid "Initialize" msgstr "Започни" +#. TRANS: "In progress" description. msgid "No import running" msgstr "Увозот не е во тек" +#. TRANS: "Complete" description for initialize state. msgid "Initiated Yammer server connection..." msgstr "Започнав Ñо поврзувањето Ñо опÑлужувачот на Yammer..." +#. TRANS: "In progress" description. msgid "Awaiting authorization..." msgstr "Чекам на овлаÑтување..." +#. TRANS: "Complete" description for connect state. msgid "Connected." msgstr "Поврзано." +#. TRANS: Field label for a Yammer user import users step. msgid "Import user accounts" msgstr "Увези кориÑнички Ñметки" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of users to be imported. #, php-format msgid "Importing %d user..." msgid_plural "Importing %d users..." msgstr[0] "Увезувам %d кориÑник..." msgstr[1] "Увезувам %d кориÑници..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of users imported. #, php-format msgid "Imported %d user." msgid_plural "Imported %d users." msgstr[0] "Увезов %d кориÑник." msgstr[1] "Увезов %d кориÑници." +#. TRANS: Field label for a Yammer group import step. msgid "Import user groups" msgstr "Увези кориÑнички групи" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of groups to be imported. #, php-format msgid "Importing %d group..." msgid_plural "Importing %d groups..." msgstr[0] "Увезувам %d група..." msgstr[1] "Увезувам %d групи..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of groups imported. #, php-format msgid "Imported %d group." msgid_plural "Imported %d groups." msgstr[0] "Увезов %d група." msgstr[1] "Увезов %d групи." +#. TRANS: Field label for a Yammer import prepare notices step. msgid "Prepare public notices for import" msgstr "Подготви јавни извеÑтувања за увоз" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be prepared for import. #, php-format msgid "Preparing %d notice..." msgid_plural "Preparing %d notices..." msgstr[0] "Подготвувам %d извеÑтување..." msgstr[1] "Подготвувам %d извеÑтувања..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices prepared for import. #, php-format msgid "Prepared %d notice." msgid_plural "Prepared %d notices." msgstr[0] "Подготвив %d извеÑтување." msgstr[1] "Подготвив %d извеÑтувања." +#. TRANS: Field label for a Yammer import notices step. msgid "Import public notices" msgstr "Увези јавни извеÑтувања" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be imported. #, php-format msgid "Importing %d notice..." msgid_plural "Importing %d notices..." msgstr[0] "Увезувам %d извеÑтување..." msgstr[1] "Увезувам %d извеÑтувања..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices imported. #, php-format msgid "Imported %d notice." msgid_plural "Imported %d notices." msgstr[0] "Увезов %d извеÑтување..." msgstr[1] "Увезов %d извеÑтувања..." +#. TRANS: Field label for a Yammer import done step. msgid "Done" msgstr "Готово" +#. TRANS: "In progress" description for done step. +#. TRANS: "Complete" description for done step. msgid "Import is complete!" msgstr "Увозот заврши!" +#. TRANS: Fieldset legend. msgid "Import status" msgstr "Увези ÑтатуÑ" +#. TRANS: Progress bar status. msgid "Waiting..." msgstr "Чекам..." +#. TRANS: Button text for resetting the import state. msgid "Reset import state" msgstr "Врати оÑновна ÑоÑтојба на увозот" +#. TRANS: Button text for pausing an import. msgid "Pause import" msgstr "Паузирај увоз" +#. TRANS: Error message. %s are the error details. #, php-format -msgid "Encountered error \"%s\"" -msgstr "Ðаидов на грешка „%s“" +msgid "Encountered error \"%s\"." +msgstr "Ðаидов на грешка „%s“." +#. TRANS: Fieldset legend for a paused import. msgid "Paused" msgstr "Паузирано" +#. TRANS: Button text for continuing a paused import. msgid "Continue" msgstr "Продолжи" +#. TRANS: Button text for aborting a paused import. msgid "Abort import" msgstr "Прекини увоз" +#. TRANS: Form instructions. msgid "" "Follow this link to confirm authorization at Yammer; you will be prompted to " "log in if necessary:" @@ -180,21 +282,32 @@ msgstr "" "ПроÑледете ја врÑкава за да го потврдите овлаÑтувањето на Ñтраницата на " "Yammer. Ðко е потребно, ќе Ви биде побарано да Ñе најавите:" +#. TRANS: Link description for a link in an external Yammer system. msgid "Open Yammer authentication window" msgstr "Отвори прозорец за потврда на Yammer" +#. TRANS: Form instructions. msgid "Copy the verification code you are given below:" msgstr "ИÑкопирајте го долунаведениот потврден код:" +#. TRANS: Field label. msgid "Verification code:" msgstr "Потврден код:" -msgid "Save code and begin import" -msgstr "Зачувај код и почни Ñо увоз" +#. TRANS: Button text for saving Yammer authorisation data and starting Yammer import. +msgctxt "BUTTON" +msgid "Continue" +msgstr "Продолжи" +#. TRANS: Button title for saving Yammer authorisation data and starting Yammer import. +msgid "Save the verification code and begin import." +msgstr "Зачувај го потврдниот код и почни Ñо увоз." + +#. TRANS: Form legend for adding details to connect to a remote Yammer API. msgid "Yammer API registration" msgstr "РегиÑтрација на API за Yammer" +#. TRANS: Explanation of what needs to be done to connect to a Yammer network. msgid "" "Before we can connect to your Yammer network, you will need to register the " "importer as an application authorized to pull data on your behalf. This " @@ -207,22 +320,29 @@ msgstr "" "врÑката за да го региÑтрирате програмот на Yammer. Ðко е потребно, ќе Ви " "биде побарано да Ñе најавите:" +#. TRANS: Link description to a Yammer application registration form. msgid "Open Yammer application registration form" msgstr "Отвори образец за региÑтрација на програм на Yammer" +#. TRANS: Instructions. msgid "Copy the consumer key and secret you are given into the form below:" msgstr "" "ИÑкопирајте ги потрошувачкиот клуч и тајната што Ñе наведени во образецот " "подолу:" +#. TRANS: Field label for a Yammer consumer key. msgid "Consumer key:" msgstr "Потрошувачки клуч:" +#. TRANS: Field label for a Yammer consumer secret. msgid "Consumer secret:" msgstr "Потрошувачка тајна:" +#. TRANS: Button text for saving a Yammer API registration. +msgctxt "BUTTON" msgid "Save" msgstr "Зачувај" -msgid "Save these consumer keys" -msgstr "Зачувај ги овие потрошувачки клучеви" +#. TRANS: Button title for saving a Yammer API registration. +msgid "Save the entered consumer key and consumer secret." +msgstr "Зачувај го внеÑениот потрошувачки клуч и потрошувачка тајна." diff --git a/plugins/YammerImport/locale/ms/LC_MESSAGES/YammerImport.po b/plugins/YammerImport/locale/ms/LC_MESSAGES/YammerImport.po index decf939064..675d700957 100644 --- a/plugins/YammerImport/locale/ms/LC_MESSAGES/YammerImport.po +++ b/plugins/YammerImport/locale/ms/LC_MESSAGES/YammerImport.po @@ -9,24 +9,30 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - YammerImport\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:52:00+0000\n" +"POT-Creation-Date: 2011-06-19 13:18+0000\n" +"PO-Revision-Date: 2011-06-19 13:18:15+0000\n" "Language-Team: Malay \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" +"X-POT-Import-Date: 2011-06-05 21:52:16+0000\n" +"X-Generator: MediaWiki 1.19alpha (r90375); Translate extension (2011-06-02)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ms\n" "X-Message-Group: #out-statusnet-plugin-yammerimport\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Page title for Yammer administration panel. +#. TRANS: Form legend. +#. TRANS: Field label for a Yammer import connect step. +#. TRANS: Form legend. msgid "Connect to Yammer" msgstr "" +#. TRANS: Page title for Yammer import administration panel. msgid "Yammer Import" msgstr "Import dari Yammer" +#. TRANS: Instructions for Yammer import administration panel. msgid "" "This Yammer import tool is still undergoing testing, and is incomplete in " "some areas. Currently user subscriptions and group memberships are not " @@ -34,153 +40,263 @@ msgid "" "verified administrators on the Yammer side." msgstr "" +#. TRANS: Error message about an import job being paused from the admin panel. msgid "Paused from admin panel." msgstr "Berhenti dari panel pentadbir." +#. TRANS: Client exception thrown when encountering an unhandled sub action. +msgid "Invalid POST" +msgstr "" + +#. TRANS: Page title for Yammer import administration panel. msgid "Yammer import" msgstr "Import dari Yammer" +#. TRANS: Menu item for Yammer import. +#, fuzzy +msgctxt "MENU" msgid "Yammer" msgstr "Yammer" +#. TRANS: Menu item title for Yammer import. +#, fuzzy +msgid "Yammer import module." +msgstr "Import dari Yammer" + +#. TRANS: Exception thrown when a non-user item type is used, but expected. +msgid "Wrong item type sent to Yammer user import processing." +msgstr "" + +#. TRANS: Used as a prefix for the Yammer expertise field contents. msgid "Expertise:" msgstr "Kepakaran:" +#. TRANS: Exception thrown when a non-group item type is used, but expected. +msgid "Wrong item type sent to Yammer group import processing." +msgstr "" + +#. TRANS: Exception thrown when a non-message item type is used, but expected. +msgid "Wrong item type sent to Yammer message import processing." +msgstr "" + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. #, php-format msgid "Invalid avatar URL %s." msgstr "URL avatar %s tidak sah." +#. TRANS: Server exception thrown when an avatar could not be fetched. +#. TRANS: %s is the failed avatar URL. #, php-format msgid "Unable to fetch avatar from %s." msgstr "Avatar tidak dapat diambil dari %s." +#. TRANS: Button text for starting Yammer authentication. +#, fuzzy +msgctxt "BUTTON" msgid "Start authentication" msgstr "Mulakan pengesahan" -msgid "Request authorization to connect to Yammer account" +#. TRANS: Button title for starting Yammer authentication. +#, fuzzy +msgid "Request authorization to connect to a Yammer account." msgstr "Minta kebenaran untuk bersambung dengan akaun Yammer" +#. TRANS: Button text for starting changing a Yammer API key. +#, fuzzy +msgctxt "BUTTON" msgid "Change API key" msgstr "Tukar kunci API" +#. TRANS: Server exception thrown if a Yammer authentication request is already present. +msgid "Cannot request Yammer auth; already there!" +msgstr "" + +#. TRANS: Server exception thrown when requesting a Yammer authentication URL while in an incorrect state. +msgid "Cannot get Yammer auth URL when not in requesting-auth state!" +msgstr "" + +#. TRANS: Exeption thrown when an external Yammer system gives an error. +#. TRANS: %1$s is an HTTP error code, %2$s is the error message body. +#, php-format +msgid "Yammer API returned HTTP code %1$s: %2$s" +msgstr "" + +#. TRANS: Exeption thrown when an external Yammer system an invalid JSON response. +msgid "Invalid JSON response from Yammer API." +msgstr "" + +#. TRANS: Exeption thrown when a trust relationship has already been established. +msgid "Requesting a token, but already set up with a token." +msgstr "" + +#. TRANS: Field label for a Yammer import initialise step. msgid "Initialize" msgstr "Mulakan" +#. TRANS: "In progress" description. msgid "No import running" msgstr "Proses import tidak berjalan" +#. TRANS: "Complete" description for initialize state. msgid "Initiated Yammer server connection..." msgstr "Sambungan pelayan Yammer dimulakan..." +#. TRANS: "In progress" description. msgid "Awaiting authorization..." msgstr "Menunggu kebenaran..." +#. TRANS: "Complete" description for connect state. msgid "Connected." msgstr "Bersambung." +#. TRANS: Field label for a Yammer user import users step. msgid "Import user accounts" msgstr "Import akaun pengguna" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of users to be imported. #, php-format msgid "Importing %d user..." msgid_plural "Importing %d users..." msgstr[0] "" +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of users imported. #, php-format msgid "Imported %d user." msgid_plural "Imported %d users." msgstr[0] "" +#. TRANS: Field label for a Yammer group import step. msgid "Import user groups" msgstr "" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of groups to be imported. #, php-format msgid "Importing %d group..." msgid_plural "Importing %d groups..." msgstr[0] "" +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of groups imported. #, php-format msgid "Imported %d group." msgid_plural "Imported %d groups." msgstr[0] "" +#. TRANS: Field label for a Yammer import prepare notices step. msgid "Prepare public notices for import" msgstr "" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be prepared for import. #, php-format msgid "Preparing %d notice..." msgid_plural "Preparing %d notices..." msgstr[0] "" +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices prepared for import. #, php-format msgid "Prepared %d notice." msgid_plural "Prepared %d notices." msgstr[0] "" +#. TRANS: Field label for a Yammer import notices step. msgid "Import public notices" msgstr "" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be imported. #, php-format msgid "Importing %d notice..." msgid_plural "Importing %d notices..." msgstr[0] "" +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices imported. #, php-format msgid "Imported %d notice." msgid_plural "Imported %d notices." msgstr[0] "" +#. TRANS: Field label for a Yammer import done step. msgid "Done" msgstr "Siap" +#. TRANS: "In progress" description for done step. +#. TRANS: "Complete" description for done step. msgid "Import is complete!" msgstr "Proses import selesai!" +#. TRANS: Fieldset legend. msgid "Import status" msgstr "" +#. TRANS: Progress bar status. msgid "Waiting..." msgstr "Menunggu..." +#. TRANS: Button text for resetting the import state. msgid "Reset import state" msgstr "" +#. TRANS: Button text for pausing an import. msgid "Pause import" msgstr "Hentikan import" +#. TRANS: Error message. %s are the error details. #, php-format -msgid "Encountered error \"%s\"" +msgid "Encountered error \"%s\"." msgstr "" +#. TRANS: Fieldset legend for a paused import. msgid "Paused" msgstr "Terhenti" +#. TRANS: Button text for continuing a paused import. msgid "Continue" msgstr "Sambung" +#. TRANS: Button text for aborting a paused import. msgid "Abort import" msgstr "" +#. TRANS: Form instructions. msgid "" "Follow this link to confirm authorization at Yammer; you will be prompted to " "log in if necessary:" msgstr "" +#. TRANS: Link description for a link in an external Yammer system. msgid "Open Yammer authentication window" msgstr "" +#. TRANS: Form instructions. msgid "Copy the verification code you are given below:" msgstr "" +#. TRANS: Field label. msgid "Verification code:" msgstr "" -msgid "Save code and begin import" +#. TRANS: Button text for saving Yammer authorisation data and starting Yammer import. +#, fuzzy +msgctxt "BUTTON" +msgid "Continue" +msgstr "Sambung" + +#. TRANS: Button title for saving Yammer authorisation data and starting Yammer import. +msgid "Save the verification code and begin import." msgstr "" +#. TRANS: Form legend for adding details to connect to a remote Yammer API. msgid "Yammer API registration" msgstr "" +#. TRANS: Explanation of what needs to be done to connect to a Yammer network. msgid "" "Before we can connect to your Yammer network, you will need to register the " "importer as an application authorized to pull data on your behalf. This " @@ -188,20 +304,29 @@ msgid "" "register the app at Yammer; you will be prompted to log in if necessary:" msgstr "" +#. TRANS: Link description to a Yammer application registration form. msgid "Open Yammer application registration form" msgstr "" +#. TRANS: Instructions. msgid "Copy the consumer key and secret you are given into the form below:" msgstr "" +#. TRANS: Field label for a Yammer consumer key. msgid "Consumer key:" msgstr "Kunci pengguna:" +#. TRANS: Field label for a Yammer consumer secret. msgid "Consumer secret:" msgstr "Rahsia pengguna:" +#. TRANS: Button text for saving a Yammer API registration. +#, fuzzy +msgctxt "BUTTON" msgid "Save" msgstr "Simpan" -msgid "Save these consumer keys" +#. TRANS: Button title for saving a Yammer API registration. +#, fuzzy +msgid "Save the entered consumer key and consumer secret." msgstr "Simpan kunci pengguna ini" diff --git a/plugins/YammerImport/locale/nl/LC_MESSAGES/YammerImport.po b/plugins/YammerImport/locale/nl/LC_MESSAGES/YammerImport.po index 8955f88b69..d6c0401a37 100644 --- a/plugins/YammerImport/locale/nl/LC_MESSAGES/YammerImport.po +++ b/plugins/YammerImport/locale/nl/LC_MESSAGES/YammerImport.po @@ -10,24 +10,30 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - YammerImport\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:52:00+0000\n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:34+0000\n" +"Language-Team: Dutch \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:41+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-yammerimport\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Page title for Yammer administration panel. +#. TRANS: Form legend. +#. TRANS: Field label for a Yammer import connect step. +#. TRANS: Form legend. msgid "Connect to Yammer" msgstr "Verbinden met Yammer" +#. TRANS: Page title for Yammer import administration panel. msgid "Yammer Import" msgstr "Yammerimport" +#. TRANS: Instructions for Yammer import administration panel. msgid "" "This Yammer import tool is still undergoing testing, and is incomplete in " "some areas. Currently user subscriptions and group memberships are not " @@ -40,141 +46,244 @@ msgstr "" "mogelijk voor imports die door bevestigde beheerders in Yammer worden " "uitgevoerd." +#. TRANS: Error message about an import job being paused from the admin panel. msgid "Paused from admin panel." msgstr "Gepauzeerd vanuit het beheerpaneel." +#. TRANS: Client exception thrown when encountering an unhandled sub action. +msgid "Invalid POST" +msgstr "Ongeldige POST." + +#. TRANS: Page title for Yammer import administration panel. msgid "Yammer import" msgstr "Yammerimport" +#. TRANS: Menu item for Yammer import. +msgctxt "MENU" msgid "Yammer" msgstr "Yammer" +#. TRANS: Menu item title for Yammer import. +msgid "Yammer import module." +msgstr "De importmodule voor Yammer." + +#. TRANS: Exception thrown when a non-user item type is used, but expected. +msgid "Wrong item type sent to Yammer user import processing." +msgstr "" +"Er is een incorrect type verzonden naar de verwerking van de " +"gebruikersimport van Yammer." + +#. TRANS: Used as a prefix for the Yammer expertise field contents. msgid "Expertise:" msgstr "Expertise:" +#. TRANS: Exception thrown when a non-group item type is used, but expected. +msgid "Wrong item type sent to Yammer group import processing." +msgstr "" +"Er is een incorrect type verzonden naar de verwerking van de groepenimport " +"van Yammer." + +#. TRANS: Exception thrown when a non-message item type is used, but expected. +msgid "Wrong item type sent to Yammer message import processing." +msgstr "" +"Er is een incorrect type verzonden naar de verwerking van de berichtenimport " +"van Yammer." + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. #, php-format msgid "Invalid avatar URL %s." -msgstr "%s is een ongeldige URL voor avatar." +msgstr "Ongeldige avatar-URL %s." +#. TRANS: Server exception thrown when an avatar could not be fetched. +#. TRANS: %s is the failed avatar URL. #, php-format msgid "Unable to fetch avatar from %s." -msgstr "Het was niet mogelijk de avatar op te halen van %s." +msgstr "Het was niet mogelijk om de avatar op te halen van %s." +#. TRANS: Button text for starting Yammer authentication. +msgctxt "BUTTON" msgid "Start authentication" msgstr "Authenticatie starten" -msgid "Request authorization to connect to Yammer account" -msgstr "Autorisatie verzoeken om te verbinden met Yammergebruiker" +#. TRANS: Button title for starting Yammer authentication. +msgid "Request authorization to connect to a Yammer account." +msgstr "Autorisatie verzoeken om te verbinden met een Yammergebruiker." +#. TRANS: Button text for starting changing a Yammer API key. +msgctxt "BUTTON" msgid "Change API key" msgstr "API-sleutel wijzigen" +#. TRANS: Server exception thrown if a Yammer authentication request is already present. +msgid "Cannot request Yammer auth; already there!" +msgstr "" +"Het authenticatieverzoek voor Yammer kan niet uitgevoerd worden. Het bestaat " +"al!" + +#. TRANS: Server exception thrown when requesting a Yammer authentication URL while in an incorrect state. +msgid "Cannot get Yammer auth URL when not in requesting-auth state!" +msgstr "" +"Het is niet mogelijk een authenticatie-URL voor Yammer te verkrijgen als de " +"workflowstatus niet \"requesting-auth\" is!" + +#. TRANS: Exeption thrown when an external Yammer system gives an error. +#. TRANS: %1$s is an HTTP error code, %2$s is the error message body. +#, php-format +msgid "Yammer API returned HTTP code %1$s: %2$s" +msgstr "De Yammer-API heeft de HTTP-code %1$s teruggegeven: %2$s" + +#. TRANS: Exeption thrown when an external Yammer system an invalid JSON response. +msgid "Invalid JSON response from Yammer API." +msgstr "Er is een ongeldig JSON-antwoord van de Yammer-API ontvangen." + +#. TRANS: Exeption thrown when a trust relationship has already been established. +msgid "Requesting a token, but already set up with a token." +msgstr "Er is om een token gevraagd, maar er is al een token beschikbaar." + +#. TRANS: Field label for a Yammer import initialise step. msgid "Initialize" msgstr "Initialiseren" +#. TRANS: "In progress" description. msgid "No import running" msgstr "Er loopt geen import" +#. TRANS: "Complete" description for initialize state. msgid "Initiated Yammer server connection..." msgstr "Er is verbinding gemaakt met de Yammerserver..." +#. TRANS: "In progress" description. msgid "Awaiting authorization..." msgstr "Wachten op autorisatie..." +#. TRANS: "Complete" description for connect state. msgid "Connected." msgstr "Verbonden." +#. TRANS: Field label for a Yammer user import users step. msgid "Import user accounts" msgstr "Gebruikers importeren" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of users to be imported. #, php-format msgid "Importing %d user..." msgid_plural "Importing %d users..." msgstr[0] "Bezig met het importeren van %d gebruiker..." msgstr[1] "Bezig met het importeren van %d gebruikers..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of users imported. #, php-format msgid "Imported %d user." msgid_plural "Imported %d users." msgstr[0] "%d gebruiker geïmporteerd." msgstr[1] "%d gebruikers geïmporteerd." +#. TRANS: Field label for a Yammer group import step. msgid "Import user groups" msgstr "Gebruikersgroepen importeren" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of groups to be imported. #, php-format msgid "Importing %d group..." msgid_plural "Importing %d groups..." msgstr[0] "Bezig met het importeren van %d gebruikersgroep..." msgstr[1] "Bezig met het importeren van %d gebruikersgroepen..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of groups imported. #, php-format msgid "Imported %d group." msgid_plural "Imported %d groups." msgstr[0] "%d gebruikersgroep geïmporteerd." msgstr[1] "%d gebruikersgroepen geïmporteerd." +#. TRANS: Field label for a Yammer import prepare notices step. msgid "Prepare public notices for import" msgstr "Publieke mededelingen voorbereiden op import" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be prepared for import. #, php-format msgid "Preparing %d notice..." msgid_plural "Preparing %d notices..." msgstr[0] "Bezig met het voorbereiden van %d mededeling..." msgstr[1] "Bezig met het voorbereiden van %d mededelingen..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices prepared for import. #, php-format msgid "Prepared %d notice." msgid_plural "Prepared %d notices." msgstr[0] "%d mededeling voorbereid." msgstr[1] "%d mededelingen voorbereid." +#. TRANS: Field label for a Yammer import notices step. msgid "Import public notices" msgstr "Publieke mededelingen importeren" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be imported. #, php-format msgid "Importing %d notice..." msgid_plural "Importing %d notices..." msgstr[0] "Bezig met het importeren van %d mededeling..." msgstr[1] "Bezig met het importeren van %d mededelingen..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices imported. #, php-format msgid "Imported %d notice." msgid_plural "Imported %d notices." msgstr[0] "%d mededeling geïmporteerd." msgstr[1] "%d mededelingen geïmporteerd." +#. TRANS: Field label for a Yammer import done step. msgid "Done" msgstr "Afgerond" +#. TRANS: "In progress" description for done step. +#. TRANS: "Complete" description for done step. msgid "Import is complete!" msgstr "Het importeren is voltooid!" +#. TRANS: Fieldset legend. msgid "Import status" msgstr "Importstatus" +#. TRANS: Progress bar status. msgid "Waiting..." msgstr "Even geduld alstublieft..." +#. TRANS: Button text for resetting the import state. msgid "Reset import state" msgstr "Importstatus herstellen" +#. TRANS: Button text for pausing an import. msgid "Pause import" msgstr "Import pauzeren" +#. TRANS: Error message. %s are the error details. #, php-format -msgid "Encountered error \"%s\"" -msgstr "Er is een fout opgetreden: \"%s\"" +msgid "Encountered error \"%s\"." +msgstr "Er is een fout opgetreden: \"%s\"." +#. TRANS: Fieldset legend for a paused import. msgid "Paused" msgstr "Gepauzeerd" +#. TRANS: Button text for continuing a paused import. msgid "Continue" msgstr "Doorgaan" +#. TRANS: Button text for aborting a paused import. msgid "Abort import" msgstr "Import afbreken" +#. TRANS: Form instructions. msgid "" "Follow this link to confirm authorization at Yammer; you will be prompted to " "log in if necessary:" @@ -182,21 +291,32 @@ msgstr "" "Volg deze verwijzing om de autorisatie bij Yammer te bevestigen. Als u moet " "aanmelden wordt daarom gevraagd:" +#. TRANS: Link description for a link in an external Yammer system. msgid "Open Yammer authentication window" msgstr "Authenticatievenster voor Yammer openen" +#. TRANS: Form instructions. msgid "Copy the verification code you are given below:" msgstr "Kopieer de verificatiecode die u hebt gekregen hieronder:" +#. TRANS: Field label. msgid "Verification code:" msgstr "Verificatiecode:" -msgid "Save code and begin import" -msgstr "Code opslaan en importeren" +#. TRANS: Button text for saving Yammer authorisation data and starting Yammer import. +msgctxt "BUTTON" +msgid "Continue" +msgstr "Doorgaan" +#. TRANS: Button title for saving Yammer authorisation data and starting Yammer import. +msgid "Save the verification code and begin import." +msgstr "De verificatiecode opslaan en beginnen met importeren." + +#. TRANS: Form legend for adding details to connect to a remote Yammer API. msgid "Yammer API registration" msgstr "API-registratie voor Yammer" +#. TRANS: Explanation of what needs to be done to connect to a Yammer network. msgid "" "Before we can connect to your Yammer network, you will need to register the " "importer as an application authorized to pull data on your behalf. This " @@ -209,22 +329,29 @@ msgstr "" "onderstaande verwijzing om de applicatie bij Yammer te registreren. Als het " "nodig is om aan te melden, wordt u dat gevraagd:" +#. TRANS: Link description to a Yammer application registration form. msgid "Open Yammer application registration form" msgstr "Applicatieregistratieformulier voor Yammer openen" +#. TRANS: Instructions. msgid "Copy the consumer key and secret you are given into the form below:" msgstr "" "Kopieer de gebruikerssleutel en het gebruikersgeheim dat u hebt gekregen in " "het formulier hieronder:" +#. TRANS: Field label for a Yammer consumer key. msgid "Consumer key:" msgstr "Gebruikerssleutel:" +#. TRANS: Field label for a Yammer consumer secret. msgid "Consumer secret:" msgstr "Gebruikersgeheim:" +#. TRANS: Button text for saving a Yammer API registration. +msgctxt "BUTTON" msgid "Save" msgstr "Opslaan" -msgid "Save these consumer keys" -msgstr "Deze gebruikerssleutels opslaan" +#. TRANS: Button title for saving a Yammer API registration. +msgid "Save the entered consumer key and consumer secret." +msgstr "De ingevoerde gebruikerssleutel en het gebruikersgeheim opslaan." diff --git a/plugins/YammerImport/locale/pl/LC_MESSAGES/YammerImport.po b/plugins/YammerImport/locale/pl/LC_MESSAGES/YammerImport.po new file mode 100644 index 0000000000..0f39c47d07 --- /dev/null +++ b/plugins/YammerImport/locale/pl/LC_MESSAGES/YammerImport.po @@ -0,0 +1,348 @@ +# Translation of StatusNet - YammerImport to Polish (polski) +# Exported from translatewiki.net +# +# Author: BeginaFelicysym +# Author: Woytecr +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - YammerImport\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:34+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2011-12-03 13:51:41+0000\n" +"X-Translation-Project: translatewiki.net \n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"Plural-Forms: nplurals=3; plural=(n == 1) ? 0 : ( (n%10 >= 2 && n%10 <= 4 && " +"(n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" + +#. TRANS: Page title for Yammer administration panel. +#. TRANS: Form legend. +#. TRANS: Field label for a Yammer import connect step. +#. TRANS: Form legend. +msgid "Connect to Yammer" +msgstr "PoÅ‚Ä…czenie z Yammer" + +#. TRANS: Page title for Yammer import administration panel. +msgid "Yammer Import" +msgstr "Import Yammer" + +#. TRANS: Instructions for Yammer import administration panel. +msgid "" +"This Yammer import tool is still undergoing testing, and is incomplete in " +"some areas. Currently user subscriptions and group memberships are not " +"transferred; in the future this may be supported for imports done by " +"verified administrators on the Yammer side." +msgstr "" +"To narzÄ™dzie importu Yammer nadal przechodzi badania i w niektórych " +"dziedzinach jest niekompletne. Obecnie sÄ… nie przenoszone subskrypcje " +"użytkownika i czÅ‚onkostwa w grupach; w przyszÅ‚oÅ›ci może to być obsÅ‚ugiwane w " +"importach wykonywanych przez administratorów zweryfikowanych po stronie " +"Yammer." + +#. TRANS: Error message about an import job being paused from the admin panel. +msgid "Paused from admin panel." +msgstr "Wstrzymane z panelu administratora." + +#. TRANS: Client exception thrown when encountering an unhandled sub action. +msgid "Invalid POST" +msgstr "NieprawidÅ‚owy POST" + +#. TRANS: Page title for Yammer import administration panel. +msgid "Yammer import" +msgstr "Import Yammer" + +#. TRANS: Menu item for Yammer import. +msgctxt "MENU" +msgid "Yammer" +msgstr "Yammer" + +#. TRANS: Menu item title for Yammer import. +msgid "Yammer import module." +msgstr "ModuÅ‚ importu Yammer." + +#. TRANS: Exception thrown when a non-user item type is used, but expected. +msgid "Wrong item type sent to Yammer user import processing." +msgstr "" +"NiewÅ‚aÅ›ciwy typ elementu wysÅ‚any do importu przetwarzanego użytkownika " +"Yammer." + +#. TRANS: Used as a prefix for the Yammer expertise field contents. +msgid "Expertise:" +msgstr "Ekspertyza:" + +#. TRANS: Exception thrown when a non-group item type is used, but expected. +msgid "Wrong item type sent to Yammer group import processing." +msgstr "" +"NiewÅ‚aÅ›ciwy typ elementu wysÅ‚any do importu przetwarzanej grupy Yammer." + +#. TRANS: Exception thrown when a non-message item type is used, but expected. +msgid "Wrong item type sent to Yammer message import processing." +msgstr "" +"NiewÅ‚aÅ›ciwy typ elementu wysÅ‚any do importu przetwarzanej wiadomoÅ›ci Yammer." + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. +#, php-format +msgid "Invalid avatar URL %s." +msgstr "NieprawidÅ‚owy adres URL awataru %s ." + +#. TRANS: Server exception thrown when an avatar could not be fetched. +#. TRANS: %s is the failed avatar URL. +#, php-format +msgid "Unable to fetch avatar from %s." +msgstr "Nie udaÅ‚o siÄ™ pobrać awatara z %s ." + +#. TRANS: Button text for starting Yammer authentication. +msgctxt "BUTTON" +msgid "Start authentication" +msgstr "PoczÄ…tek uwierzytelnienia" + +#. TRANS: Button title for starting Yammer authentication. +msgid "Request authorization to connect to a Yammer account." +msgstr "Żądanie autoryzacji wejÅ›cia na konto Yammer." + +#. TRANS: Button text for starting changing a Yammer API key. +msgctxt "BUTTON" +msgid "Change API key" +msgstr "Zmiana klucza API" + +#. TRANS: Server exception thrown if a Yammer authentication request is already present. +msgid "Cannot request Yammer auth; already there!" +msgstr "" + +#. TRANS: Server exception thrown when requesting a Yammer authentication URL while in an incorrect state. +msgid "Cannot get Yammer auth URL when not in requesting-auth state!" +msgstr "" + +#. TRANS: Exeption thrown when an external Yammer system gives an error. +#. TRANS: %1$s is an HTTP error code, %2$s is the error message body. +#, php-format +msgid "Yammer API returned HTTP code %1$s: %2$s" +msgstr "" + +#. TRANS: Exeption thrown when an external Yammer system an invalid JSON response. +msgid "Invalid JSON response from Yammer API." +msgstr "" + +#. TRANS: Exeption thrown when a trust relationship has already been established. +msgid "Requesting a token, but already set up with a token." +msgstr "" + +#. TRANS: Field label for a Yammer import initialise step. +msgid "Initialize" +msgstr "Inicjowanie" + +#. TRANS: "In progress" description. +msgid "No import running" +msgstr "" + +#. TRANS: "Complete" description for initialize state. +msgid "Initiated Yammer server connection..." +msgstr "Zanicjowano poÅ‚Ä…czenie z serwerem Yammer..." + +#. TRANS: "In progress" description. +msgid "Awaiting authorization..." +msgstr "Oczekiwanie na autoryzacjiÄ™..." + +#. TRANS: "Complete" description for connect state. +msgid "Connected." +msgstr "PoÅ‚Ä…czono." + +#. TRANS: Field label for a Yammer user import users step. +msgid "Import user accounts" +msgstr "Importuj konta użytkowników" + +#. TRANS: "In progress" description. +#. TRANS: %d is the number of users to be imported. +#, php-format +msgid "Importing %d user..." +msgid_plural "Importing %d users..." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of users imported. +#, php-format +msgid "Imported %d user." +msgid_plural "Imported %d users." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#. TRANS: Field label for a Yammer group import step. +msgid "Import user groups" +msgstr "Importuj grupy użytkowników" + +#. TRANS: "In progress" description. +#. TRANS: %d is the number of groups to be imported. +#, php-format +msgid "Importing %d group..." +msgid_plural "Importing %d groups..." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of groups imported. +#, php-format +msgid "Imported %d group." +msgid_plural "Imported %d groups." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#. TRANS: Field label for a Yammer import prepare notices step. +msgid "Prepare public notices for import" +msgstr "" + +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be prepared for import. +#, php-format +msgid "Preparing %d notice..." +msgid_plural "Preparing %d notices..." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices prepared for import. +#, php-format +msgid "Prepared %d notice." +msgid_plural "Prepared %d notices." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#. TRANS: Field label for a Yammer import notices step. +msgid "Import public notices" +msgstr "" + +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be imported. +#, php-format +msgid "Importing %d notice..." +msgid_plural "Importing %d notices..." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices imported. +#, php-format +msgid "Imported %d notice." +msgid_plural "Imported %d notices." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#. TRANS: Field label for a Yammer import done step. +msgid "Done" +msgstr "Gotowe" + +#. TRANS: "In progress" description for done step. +#. TRANS: "Complete" description for done step. +msgid "Import is complete!" +msgstr "Import zakoÅ„czony!" + +#. TRANS: Fieldset legend. +msgid "Import status" +msgstr "Stan importu" + +#. TRANS: Progress bar status. +msgid "Waiting..." +msgstr "Oczekiwanie..." + +#. TRANS: Button text for resetting the import state. +msgid "Reset import state" +msgstr "Zresetuj stan importu" + +#. TRANS: Button text for pausing an import. +msgid "Pause import" +msgstr "Wstrzymaj import" + +#. TRANS: Error message. %s are the error details. +#, php-format +msgid "Encountered error \"%s\"." +msgstr "WystÄ…piÅ‚ bÅ‚Ä…d \"%s\"." + +#. TRANS: Fieldset legend for a paused import. +msgid "Paused" +msgstr "Wstrzymano" + +#. TRANS: Button text for continuing a paused import. +msgid "Continue" +msgstr "Kontynuuj" + +#. TRANS: Button text for aborting a paused import. +msgid "Abort import" +msgstr "Przerwij import" + +#. TRANS: Form instructions. +msgid "" +"Follow this link to confirm authorization at Yammer; you will be prompted to " +"log in if necessary:" +msgstr "" + +#. TRANS: Link description for a link in an external Yammer system. +msgid "Open Yammer authentication window" +msgstr "" + +#. TRANS: Form instructions. +msgid "Copy the verification code you are given below:" +msgstr "" + +#. TRANS: Field label. +msgid "Verification code:" +msgstr "Kod weryfikacyjny:" + +#. TRANS: Button text for saving Yammer authorisation data and starting Yammer import. +msgctxt "BUTTON" +msgid "Continue" +msgstr "Kontynuuj" + +#. TRANS: Button title for saving Yammer authorisation data and starting Yammer import. +msgid "Save the verification code and begin import." +msgstr "Zapisz kod weryfikacji i rozpocznij import." + +#. TRANS: Form legend for adding details to connect to a remote Yammer API. +msgid "Yammer API registration" +msgstr "API rejestracji Yammer" + +#. TRANS: Explanation of what needs to be done to connect to a Yammer network. +msgid "" +"Before we can connect to your Yammer network, you will need to register the " +"importer as an application authorized to pull data on your behalf. This " +"registration will work only for your own network. Follow this link to " +"register the app at Yammer; you will be prompted to log in if necessary:" +msgstr "" + +#. TRANS: Link description to a Yammer application registration form. +msgid "Open Yammer application registration form" +msgstr "Otwórz formularz rejestracji aplikacji Yammer" + +#. TRANS: Instructions. +msgid "Copy the consumer key and secret you are given into the form below:" +msgstr "" + +#. TRANS: Field label for a Yammer consumer key. +msgid "Consumer key:" +msgstr "" + +#. TRANS: Field label for a Yammer consumer secret. +msgid "Consumer secret:" +msgstr "" + +#. TRANS: Button text for saving a Yammer API registration. +msgctxt "BUTTON" +msgid "Save" +msgstr "Zapisz" + +#. TRANS: Button title for saving a Yammer API registration. +msgid "Save the entered consumer key and consumer secret." +msgstr "" diff --git a/plugins/YammerImport/locale/ru/LC_MESSAGES/YammerImport.po b/plugins/YammerImport/locale/ru/LC_MESSAGES/YammerImport.po index 4ccc1ef1ff..6dba55160d 100644 --- a/plugins/YammerImport/locale/ru/LC_MESSAGES/YammerImport.po +++ b/plugins/YammerImport/locale/ru/LC_MESSAGES/YammerImport.po @@ -10,25 +10,31 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - YammerImport\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:52:01+0000\n" +"POT-Creation-Date: 2011-06-19 13:18+0000\n" +"PO-Revision-Date: 2011-06-19 13:18:15+0000\n" "Language-Team: Russian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" +"X-POT-Import-Date: 2011-06-05 21:52:16+0000\n" +"X-Generator: MediaWiki 1.19alpha (r90375); Translate extension (2011-06-02)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ru\n" "X-Message-Group: #out-statusnet-plugin-yammerimport\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Page title for Yammer administration panel. +#. TRANS: Form legend. +#. TRANS: Field label for a Yammer import connect step. +#. TRANS: Form legend. msgid "Connect to Yammer" msgstr "" +#. TRANS: Page title for Yammer import administration panel. msgid "Yammer Import" msgstr "" +#. TRANS: Instructions for Yammer import administration panel. msgid "" "This Yammer import tool is still undergoing testing, and is incomplete in " "some areas. Currently user subscriptions and group memberships are not " @@ -36,53 +42,118 @@ msgid "" "verified administrators on the Yammer side." msgstr "" +#. TRANS: Error message about an import job being paused from the admin panel. msgid "Paused from admin panel." msgstr "" +#. TRANS: Client exception thrown when encountering an unhandled sub action. +msgid "Invalid POST" +msgstr "" + +#. TRANS: Page title for Yammer import administration panel. msgid "Yammer import" msgstr "" +#. TRANS: Menu item for Yammer import. +msgctxt "MENU" msgid "Yammer" msgstr "" +#. TRANS: Menu item title for Yammer import. +msgid "Yammer import module." +msgstr "" + +#. TRANS: Exception thrown when a non-user item type is used, but expected. +msgid "Wrong item type sent to Yammer user import processing." +msgstr "" + +#. TRANS: Used as a prefix for the Yammer expertise field contents. msgid "Expertise:" msgstr "" +#. TRANS: Exception thrown when a non-group item type is used, but expected. +msgid "Wrong item type sent to Yammer group import processing." +msgstr "" + +#. TRANS: Exception thrown when a non-message item type is used, but expected. +msgid "Wrong item type sent to Yammer message import processing." +msgstr "" + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. #, php-format msgid "Invalid avatar URL %s." msgstr "" +#. TRANS: Server exception thrown when an avatar could not be fetched. +#. TRANS: %s is the failed avatar URL. #, php-format msgid "Unable to fetch avatar from %s." msgstr "" +#. TRANS: Button text for starting Yammer authentication. +#, fuzzy +msgctxt "BUTTON" msgid "Start authentication" msgstr "Ðачало проверки подлинноÑти" -msgid "Request authorization to connect to Yammer account" +#. TRANS: Button title for starting Yammer authentication. +msgid "Request authorization to connect to a Yammer account." msgstr "" +#. TRANS: Button text for starting changing a Yammer API key. +msgctxt "BUTTON" msgid "Change API key" msgstr "" +#. TRANS: Server exception thrown if a Yammer authentication request is already present. +msgid "Cannot request Yammer auth; already there!" +msgstr "" + +#. TRANS: Server exception thrown when requesting a Yammer authentication URL while in an incorrect state. +msgid "Cannot get Yammer auth URL when not in requesting-auth state!" +msgstr "" + +#. TRANS: Exeption thrown when an external Yammer system gives an error. +#. TRANS: %1$s is an HTTP error code, %2$s is the error message body. +#, php-format +msgid "Yammer API returned HTTP code %1$s: %2$s" +msgstr "" + +#. TRANS: Exeption thrown when an external Yammer system an invalid JSON response. +msgid "Invalid JSON response from Yammer API." +msgstr "" + +#. TRANS: Exeption thrown when a trust relationship has already been established. +msgid "Requesting a token, but already set up with a token." +msgstr "" + +#. TRANS: Field label for a Yammer import initialise step. msgid "Initialize" msgstr "ИнициализациÑ" +#. TRANS: "In progress" description. msgid "No import running" msgstr "Импорт не запущен" +#. TRANS: "Complete" description for initialize state. msgid "Initiated Yammer server connection..." msgstr "" +#. TRANS: "In progress" description. msgid "Awaiting authorization..." msgstr "Ожидание авторизации…" +#. TRANS: "Complete" description for connect state. msgid "Connected." msgstr "ПодÑоединено." +#. TRANS: Field label for a Yammer user import users step. msgid "Import user accounts" msgstr "Импорт учётных запиÑей пользователей" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of users to be imported. #, php-format msgid "Importing %d user..." msgid_plural "Importing %d users..." @@ -90,6 +161,8 @@ msgstr[0] "Импорт %d пользователÑ…" msgstr[1] "Импорт %d пользователей…" msgstr[2] "Импорт %d пользователей…" +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of users imported. #, php-format msgid "Imported %d user." msgid_plural "Imported %d users." @@ -97,9 +170,12 @@ msgstr[0] "Импортирован %d пользователь." msgstr[1] "Импортировано %d пользователÑ." msgstr[2] "Импортировано %d пользователей." +#. TRANS: Field label for a Yammer group import step. msgid "Import user groups" msgstr "Импорт групп пользователей" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of groups to be imported. #, fuzzy, php-format msgid "Importing %d group..." msgid_plural "Importing %d groups..." @@ -107,6 +183,8 @@ msgstr[0] "Импорт %d группы…" msgstr[1] "Импорт %d группы…" msgstr[2] "Импорт %d группы…" +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of groups imported. #, php-format msgid "Imported %d group." msgid_plural "Imported %d groups." @@ -114,9 +192,12 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" +#. TRANS: Field label for a Yammer import prepare notices step. msgid "Prepare public notices for import" msgstr "" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be prepared for import. #, php-format msgid "Preparing %d notice..." msgid_plural "Preparing %d notices..." @@ -124,6 +205,8 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices prepared for import. #, php-format msgid "Prepared %d notice." msgid_plural "Prepared %d notices." @@ -131,9 +214,12 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" +#. TRANS: Field label for a Yammer import notices step. msgid "Import public notices" msgstr "" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be imported. #, php-format msgid "Importing %d notice..." msgid_plural "Importing %d notices..." @@ -141,6 +227,8 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices imported. #, php-format msgid "Imported %d notice." msgid_plural "Imported %d notices." @@ -148,57 +236,82 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" +#. TRANS: Field label for a Yammer import done step. msgid "Done" msgstr "Готово" +#. TRANS: "In progress" description for done step. +#. TRANS: "Complete" description for done step. msgid "Import is complete!" msgstr "Импорт завершён!" +#. TRANS: Fieldset legend. msgid "Import status" msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿Ñ€Ð¾Ñ†ÐµÑÑа импорта" +#. TRANS: Progress bar status. msgid "Waiting..." msgstr "Ожидание…" +#. TRANS: Button text for resetting the import state. msgid "Reset import state" msgstr "" +#. TRANS: Button text for pausing an import. msgid "Pause import" msgstr "ПриоÑтановить импорт" -#, php-format -msgid "Encountered error \"%s\"" +#. TRANS: Error message. %s are the error details. +#, fuzzy, php-format +msgid "Encountered error \"%s\"." msgstr "Обнаружена ошибка «%s»" +#. TRANS: Fieldset legend for a paused import. msgid "Paused" msgstr "ПриоÑтановлено" +#. TRANS: Button text for continuing a paused import. msgid "Continue" msgstr "Продолжить" +#. TRANS: Button text for aborting a paused import. msgid "Abort import" msgstr "Прервать импорт" +#. TRANS: Form instructions. msgid "" "Follow this link to confirm authorization at Yammer; you will be prompted to " "log in if necessary:" msgstr "" +#. TRANS: Link description for a link in an external Yammer system. msgid "Open Yammer authentication window" msgstr "" +#. TRANS: Form instructions. msgid "Copy the verification code you are given below:" msgstr "" +#. TRANS: Field label. msgid "Verification code:" msgstr "Код подтверждениÑ:" -msgid "Save code and begin import" +#. TRANS: Button text for saving Yammer authorisation data and starting Yammer import. +#, fuzzy +msgctxt "BUTTON" +msgid "Continue" +msgstr "Продолжить" + +#. TRANS: Button title for saving Yammer authorisation data and starting Yammer import. +#, fuzzy +msgid "Save the verification code and begin import." msgstr "Сохранить код и начать импорт" +#. TRANS: Form legend for adding details to connect to a remote Yammer API. msgid "Yammer API registration" msgstr "" +#. TRANS: Explanation of what needs to be done to connect to a Yammer network. msgid "" "Before we can connect to your Yammer network, you will need to register the " "importer as an application authorized to pull data on your behalf. This " @@ -206,20 +319,28 @@ msgid "" "register the app at Yammer; you will be prompted to log in if necessary:" msgstr "" +#. TRANS: Link description to a Yammer application registration form. msgid "Open Yammer application registration form" msgstr "" +#. TRANS: Instructions. msgid "Copy the consumer key and secret you are given into the form below:" msgstr "" +#. TRANS: Field label for a Yammer consumer key. msgid "Consumer key:" msgstr "" +#. TRANS: Field label for a Yammer consumer secret. msgid "Consumer secret:" msgstr "" +#. TRANS: Button text for saving a Yammer API registration. +#, fuzzy +msgctxt "BUTTON" msgid "Save" msgstr "Сохранить" -msgid "Save these consumer keys" +#. TRANS: Button title for saving a Yammer API registration. +msgid "Save the entered consumer key and consumer secret." msgstr "" diff --git a/plugins/YammerImport/locale/tl/LC_MESSAGES/YammerImport.po b/plugins/YammerImport/locale/tl/LC_MESSAGES/YammerImport.po index 661e0ecb71..d2fd4990b5 100644 --- a/plugins/YammerImport/locale/tl/LC_MESSAGES/YammerImport.po +++ b/plugins/YammerImport/locale/tl/LC_MESSAGES/YammerImport.po @@ -9,24 +9,30 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - YammerImport\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:52:01+0000\n" -"Language-Team: Tagalog \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:34+0000\n" +"Language-Team: Tagalog \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:41+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-yammerimport\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Page title for Yammer administration panel. +#. TRANS: Form legend. +#. TRANS: Field label for a Yammer import connect step. +#. TRANS: Form legend. msgid "Connect to Yammer" msgstr "Umugnay sa Yammer" +#. TRANS: Page title for Yammer import administration panel. msgid "Yammer Import" msgstr "Pang-angkat ng Yammer" +#. TRANS: Instructions for Yammer import administration panel. msgid "" "This Yammer import tool is still undergoing testing, and is incomplete in " "some areas. Currently user subscriptions and group memberships are not " @@ -39,141 +45,242 @@ msgstr "" "maaaring tangkilikin ito sa hinaharap para sa mga pag-aangkat na ginagawa ng " "napatunayang mga tagapangasiwa na nasa gawi ng Yammer." +#. TRANS: Error message about an import job being paused from the admin panel. msgid "Paused from admin panel." msgstr "Pansamantalang itinigil mula sa inampalan ng tagapangasiwa." +#. TRANS: Client exception thrown when encountering an unhandled sub action. +msgid "Invalid POST" +msgstr "Hindi katanggap-tanggap na PASKIL" + +#. TRANS: Page title for Yammer import administration panel. msgid "Yammer import" msgstr "Pang-angkat ng Yammer" +#. TRANS: Menu item for Yammer import. +msgctxt "MENU" msgid "Yammer" msgstr "Yammer" +#. TRANS: Menu item title for Yammer import. +msgid "Yammer import module." +msgstr "Modulo na pang-angkat ng Yammer." + +#. TRANS: Exception thrown when a non-user item type is used, but expected. +msgid "Wrong item type sent to Yammer user import processing." +msgstr "" +"Maling uri ng bagay ang naipadala sa pagpuproseso ng pag-angkat ng tagagamit " +"ng Yammer." + +#. TRANS: Used as a prefix for the Yammer expertise field contents. msgid "Expertise:" msgstr "Kadalubhasaan:" +#. TRANS: Exception thrown when a non-group item type is used, but expected. +msgid "Wrong item type sent to Yammer group import processing." +msgstr "" +"aling uri ng bagay ang naipadala sa pagpuproseso ng pag-angkat ng pangkat ng " +"Yammer." + +#. TRANS: Exception thrown when a non-message item type is used, but expected. +msgid "Wrong item type sent to Yammer message import processing." +msgstr "" +"aling uri ng bagay ang naipadala sa pagpuproseso ng pag-angkat ng mensahe ng " +"Yammer." + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. #, php-format msgid "Invalid avatar URL %s." msgstr "Hindi katanggap-tanggap na URL ng abatar ang %s." +#. TRANS: Server exception thrown when an avatar could not be fetched. +#. TRANS: %s is the failed avatar URL. #, php-format msgid "Unable to fetch avatar from %s." msgstr "Hindi nagawang damputin ang huwaran mula sa %s." +#. TRANS: Button text for starting Yammer authentication. +msgctxt "BUTTON" msgid "Start authentication" -msgstr "Simulan ang pagpapatotoo" +msgstr "Simulan ang pagpapatunay" -msgid "Request authorization to connect to Yammer account" -msgstr "Humiling ng pahintulot upang makaugnay sa akawnt ng Yammer" +#. TRANS: Button title for starting Yammer authentication. +msgid "Request authorization to connect to a Yammer account." +msgstr "Humiling ng pahintulot upang makakabit sa isang akawnt ng Yammer." +#. TRANS: Button text for starting changing a Yammer API key. +msgctxt "BUTTON" msgid "Change API key" msgstr "Baguhin ang susi ng API" +#. TRANS: Server exception thrown if a Yammer authentication request is already present. +msgid "Cannot request Yammer auth; already there!" +msgstr "Hindi mahihiling ang awtorisasyon ng Yammer; naroon na!" + +#. TRANS: Server exception thrown when requesting a Yammer authentication URL while in an incorrect state. +msgid "Cannot get Yammer auth URL when not in requesting-auth state!" +msgstr "" +"Hindi makukuha ang URL ng awtorisasyon ng Yammer kapag hindi nasa katayuan " +"ng paghiling ng awtorisasyon!" + +#. TRANS: Exeption thrown when an external Yammer system gives an error. +#. TRANS: %1$s is an HTTP error code, %2$s is the error message body. +#, php-format +msgid "Yammer API returned HTTP code %1$s: %2$s" +msgstr "Ibinalik ng API ng Yammer ang kodigo ng HTTP na %1$s: %2$s" + +#. TRANS: Exeption thrown when an external Yammer system an invalid JSON response. +msgid "Invalid JSON response from Yammer API." +msgstr "Hindi katanggap-tanggap na tugong JSON mula sa API ng Yammer." + +#. TRANS: Exeption thrown when a trust relationship has already been established. +msgid "Requesting a token, but already set up with a token." +msgstr "Humihiling ng isang panghalip, ngunit nakatakda na sa isang panghalip." + +#. TRANS: Field label for a Yammer import initialise step. msgid "Initialize" msgstr "Magpasimula" +#. TRANS: "In progress" description. msgid "No import running" msgstr "Walang tumatakbong pag-aangkat" +#. TRANS: "Complete" description for initialize state. msgid "Initiated Yammer server connection..." msgstr "Pinasimulan ang pag-ugnay sa tagapaghain ng Yammer..." +#. TRANS: "In progress" description. msgid "Awaiting authorization..." msgstr "Naghihintay ng kapahintulutan..." +#. TRANS: "Complete" description for connect state. msgid "Connected." msgstr "Naiugnay na." +#. TRANS: Field label for a Yammer user import users step. msgid "Import user accounts" msgstr "Angkatin ang mga akawnt ng tagagamit" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of users to be imported. #, php-format msgid "Importing %d user..." msgid_plural "Importing %d users..." msgstr[0] "Inaangkat ang tagagamit ng %d... " msgstr[1] "Inaangkat ang mga tagagamit ng %d..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of users imported. #, php-format msgid "Imported %d user." msgid_plural "Imported %d users." msgstr[0] "Naangkat na tagagamit ng %d." msgstr[1] "Naangkat na mga tagagamit ng %d." +#. TRANS: Field label for a Yammer group import step. msgid "Import user groups" msgstr "Angkatin ang mga pangkat ng tagagamit" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of groups to be imported. #, php-format msgid "Importing %d group..." msgid_plural "Importing %d groups..." msgstr[0] "Inaangkat ang pangkat ng %d... " msgstr[1] "Inaangkat ang mga pangkat ng %d..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of groups imported. #, php-format msgid "Imported %d group." msgid_plural "Imported %d groups." msgstr[0] "Naangkat na pangkat ng %d." msgstr[1] "Naangkat na mga pangkat ng %d." +#. TRANS: Field label for a Yammer import prepare notices step. msgid "Prepare public notices for import" msgstr "Ihanda ang aangkating mga pabatid na pangmadla" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be prepared for import. #, php-format msgid "Preparing %d notice..." msgid_plural "Preparing %d notices..." msgstr[0] "Inihahanda ang pabatid na %d..." msgstr[1] "Inihahanda ang mga pabatid na %d..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices prepared for import. #, php-format msgid "Prepared %d notice." msgid_plural "Prepared %d notices." msgstr[0] "Naihanda na ang pabatid na %d..." msgstr[1] "Naihanda na ang mga pabatid na %d..." +#. TRANS: Field label for a Yammer import notices step. msgid "Import public notices" msgstr "Angkatin ang mga pabatid na pangmadla" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be imported. #, php-format msgid "Importing %d notice..." msgid_plural "Importing %d notices..." msgstr[0] "Inaangkat ang pabatid na %d... " msgstr[1] "Inaangkat ang mga pabatid na %d..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices imported. #, php-format msgid "Imported %d notice." msgid_plural "Imported %d notices." msgstr[0] "Naangkat na ang pabatid na %d" msgstr[1] "Naangkat na ang mga pabatid na %d." +#. TRANS: Field label for a Yammer import done step. msgid "Done" msgstr "Nagawa na" +#. TRANS: "In progress" description for done step. +#. TRANS: "Complete" description for done step. msgid "Import is complete!" msgstr "Buo na ang pag-aangkat!" +#. TRANS: Fieldset legend. msgid "Import status" msgstr "Katayuan ng pag-aangkat" +#. TRANS: Progress bar status. msgid "Waiting..." msgstr "Naghihintay..." +#. TRANS: Button text for resetting the import state. msgid "Reset import state" msgstr "Muling itakda ang katayuan ng pag-aangkat" +#. TRANS: Button text for pausing an import. msgid "Pause import" msgstr "Pansamantalang itigil ang pag-aangkat" +#. TRANS: Error message. %s are the error details. #, php-format -msgid "Encountered error \"%s\"" -msgstr "Nakatagpo ng kamaliang \"%s\"" +msgid "Encountered error \"%s\"." +msgstr "Nakatagpo ng kamaliang \"%s\"." +#. TRANS: Fieldset legend for a paused import. msgid "Paused" msgstr "Pansamantalang inihinto" +#. TRANS: Button text for continuing a paused import. msgid "Continue" msgstr "Magpatuloy" +#. TRANS: Button text for aborting a paused import. msgid "Abort import" msgstr "Pigilin ang pag-angkat" +#. TRANS: Form instructions. msgid "" "Follow this link to confirm authorization at Yammer; you will be prompted to " "log in if necessary:" @@ -181,21 +288,32 @@ msgstr "" "Sundan ang kawing na ito upang tiyakin ang pahintulot sa Yammer; ikay ay " "uudyuking lumagdang papasok kung kailangan:" +#. TRANS: Link description for a link in an external Yammer system. msgid "Open Yammer authentication window" msgstr "Buksan ang bintana ng pagpapatotoo ng Yammer" +#. TRANS: Form instructions. msgid "Copy the verification code you are given below:" msgstr "Kopyahin ang kodigo ng pagpapatotoo na ibinigay sa iyo sa ibaba:" +#. TRANS: Field label. msgid "Verification code:" msgstr "Kodigo ng pagpapatotoo:" -msgid "Save code and begin import" -msgstr "Sagipin ang kodigo at simulan ang pag-aangkat" +#. TRANS: Button text for saving Yammer authorisation data and starting Yammer import. +msgctxt "BUTTON" +msgid "Continue" +msgstr "Magpatuloy" +#. TRANS: Button title for saving Yammer authorisation data and starting Yammer import. +msgid "Save the verification code and begin import." +msgstr "Sagipin ang kodigo ng pagpapatunay at simulan ang pag-aangkat" + +#. TRANS: Form legend for adding details to connect to a remote Yammer API. msgid "Yammer API registration" msgstr "Pagpapatala sa API ng Yammer" +#. TRANS: Explanation of what needs to be done to connect to a Yammer network. msgid "" "Before we can connect to your Yammer network, you will need to register the " "importer as an application authorized to pull data on your behalf. This " @@ -208,22 +326,29 @@ msgstr "" "iyong lambatan. Sundan ang kawing na ito upang ipatala ang aplikasyon sa " "Yammer; uudyukin kang lumagdang papasok kung kinakailangan:" +#. TRANS: Link description to a Yammer application registration form. msgid "Open Yammer application registration form" msgstr "Buksan ang pormularyo ng pagpapatala ng aplikasyon ng Yammer" +#. TRANS: Instructions. msgid "Copy the consumer key and secret you are given into the form below:" msgstr "" "Kopyahin ang susi at lihim ng tagaubos na ibinigay sa iyo papasok sa " "pormularyong nasa ibaba:" +#. TRANS: Field label for a Yammer consumer key. msgid "Consumer key:" msgstr "Susi ng tagaubos:" +#. TRANS: Field label for a Yammer consumer secret. msgid "Consumer secret:" msgstr "Lihim ng tagaubos:" +#. TRANS: Button text for saving a Yammer API registration. +msgctxt "BUTTON" msgid "Save" msgstr "Sagipin" -msgid "Save these consumer keys" -msgstr "Sagipin ang mga susing ito ng tagaubos" +#. TRANS: Button title for saving a Yammer API registration. +msgid "Save the entered consumer key and consumer secret." +msgstr "Sagipin ang ipinasok na susi ng tagaubos at lihim ng mang-uubos." diff --git a/plugins/YammerImport/locale/tr/LC_MESSAGES/YammerImport.po b/plugins/YammerImport/locale/tr/LC_MESSAGES/YammerImport.po index 9e08d3a6f3..dabe979414 100644 --- a/plugins/YammerImport/locale/tr/LC_MESSAGES/YammerImport.po +++ b/plugins/YammerImport/locale/tr/LC_MESSAGES/YammerImport.po @@ -9,24 +9,30 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - YammerImport\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:52:01+0000\n" -"Language-Team: Turkish \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:34+0000\n" +"Language-Team: Turkish \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:41+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: tr\n" "X-Message-Group: #out-statusnet-plugin-yammerimport\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Page title for Yammer administration panel. +#. TRANS: Form legend. +#. TRANS: Field label for a Yammer import connect step. +#. TRANS: Form legend. msgid "Connect to Yammer" msgstr "Yammer'a BaÄŸlan" +#. TRANS: Page title for Yammer import administration panel. msgid "Yammer Import" msgstr "Yammer İçeri Aktar" +#. TRANS: Instructions for Yammer import administration panel. msgid "" "This Yammer import tool is still undergoing testing, and is incomplete in " "some areas. Currently user subscriptions and group memberships are not " @@ -34,153 +40,262 @@ msgid "" "verified administrators on the Yammer side." msgstr "" +#. TRANS: Error message about an import job being paused from the admin panel. msgid "Paused from admin panel." msgstr "Yönetim panelinden durduruldu." +#. TRANS: Client exception thrown when encountering an unhandled sub action. +msgid "Invalid POST" +msgstr "" + +#. TRANS: Page title for Yammer import administration panel. msgid "Yammer import" msgstr "Yammer içeri aktarma" +#. TRANS: Menu item for Yammer import. +#, fuzzy +msgctxt "MENU" msgid "Yammer" msgstr "Yammer" +#. TRANS: Menu item title for Yammer import. +#, fuzzy +msgid "Yammer import module." +msgstr "Yammer içeri aktarma" + +#. TRANS: Exception thrown when a non-user item type is used, but expected. +msgid "Wrong item type sent to Yammer user import processing." +msgstr "" + +#. TRANS: Used as a prefix for the Yammer expertise field contents. msgid "Expertise:" msgstr "" +#. TRANS: Exception thrown when a non-group item type is used, but expected. +msgid "Wrong item type sent to Yammer group import processing." +msgstr "" + +#. TRANS: Exception thrown when a non-message item type is used, but expected. +msgid "Wrong item type sent to Yammer message import processing." +msgstr "" + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. #, php-format msgid "Invalid avatar URL %s." msgstr "Geçersiz kullanıcı resmi baÄŸlantısı %s." +#. TRANS: Server exception thrown when an avatar could not be fetched. +#. TRANS: %s is the failed avatar URL. #, php-format msgid "Unable to fetch avatar from %s." msgstr "" +#. TRANS: Button text for starting Yammer authentication. +#, fuzzy +msgctxt "BUTTON" msgid "Start authentication" msgstr "Kimlik doÄŸrulamaya baÅŸla" -msgid "Request authorization to connect to Yammer account" +#. TRANS: Button title for starting Yammer authentication. +msgid "Request authorization to connect to a Yammer account." msgstr "" +#. TRANS: Button text for starting changing a Yammer API key. +msgctxt "BUTTON" msgid "Change API key" msgstr "" +#. TRANS: Server exception thrown if a Yammer authentication request is already present. +msgid "Cannot request Yammer auth; already there!" +msgstr "" + +#. TRANS: Server exception thrown when requesting a Yammer authentication URL while in an incorrect state. +msgid "Cannot get Yammer auth URL when not in requesting-auth state!" +msgstr "" + +#. TRANS: Exeption thrown when an external Yammer system gives an error. +#. TRANS: %1$s is an HTTP error code, %2$s is the error message body. +#, php-format +msgid "Yammer API returned HTTP code %1$s: %2$s" +msgstr "" + +#. TRANS: Exeption thrown when an external Yammer system an invalid JSON response. +msgid "Invalid JSON response from Yammer API." +msgstr "" + +#. TRANS: Exeption thrown when a trust relationship has already been established. +msgid "Requesting a token, but already set up with a token." +msgstr "" + +#. TRANS: Field label for a Yammer import initialise step. msgid "Initialize" msgstr "Ä°lk kullanıma hazırla" +#. TRANS: "In progress" description. msgid "No import running" msgstr "Çalışan içeri aktarma yok" +#. TRANS: "Complete" description for initialize state. msgid "Initiated Yammer server connection..." msgstr "BaÅŸlatılan Yammer sunucu baÄŸlantısı..." +#. TRANS: "In progress" description. msgid "Awaiting authorization..." msgstr "Yetkilendirme bekleniyor..." +#. TRANS: "Complete" description for connect state. msgid "Connected." msgstr "BaÄŸlandı." +#. TRANS: Field label for a Yammer user import users step. msgid "Import user accounts" msgstr "Kullanıcı hesaplarını içeri aktar" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of users to be imported. #, php-format msgid "Importing %d user..." msgid_plural "Importing %d users..." msgstr[0] "" +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of users imported. #, php-format msgid "Imported %d user." msgid_plural "Imported %d users." msgstr[0] "" +#. TRANS: Field label for a Yammer group import step. msgid "Import user groups" msgstr "Kullanıcı gruplarını içeri aktar" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of groups to be imported. #, php-format msgid "Importing %d group..." msgid_plural "Importing %d groups..." msgstr[0] "" +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of groups imported. #, php-format msgid "Imported %d group." msgid_plural "Imported %d groups." msgstr[0] "" +#. TRANS: Field label for a Yammer import prepare notices step. msgid "Prepare public notices for import" msgstr "Genel durum mesajlarını içeri aktarmak için hazırla" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be prepared for import. #, php-format msgid "Preparing %d notice..." msgid_plural "Preparing %d notices..." msgstr[0] "" +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices prepared for import. #, php-format msgid "Prepared %d notice." msgid_plural "Prepared %d notices." msgstr[0] "" +#. TRANS: Field label for a Yammer import notices step. msgid "Import public notices" msgstr "Genel durum mesajlarını içeri aktar" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be imported. #, php-format msgid "Importing %d notice..." msgid_plural "Importing %d notices..." msgstr[0] "" +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices imported. #, php-format msgid "Imported %d notice." msgid_plural "Imported %d notices." msgstr[0] "" +#. TRANS: Field label for a Yammer import done step. msgid "Done" msgstr "Tamamlandı" +#. TRANS: "In progress" description for done step. +#. TRANS: "Complete" description for done step. msgid "Import is complete!" msgstr "İçeri aktarma tamamlandı!" +#. TRANS: Fieldset legend. msgid "Import status" msgstr "İçeri aktarma durumu" +#. TRANS: Progress bar status. msgid "Waiting..." msgstr "Bekleniyor..." +#. TRANS: Button text for resetting the import state. msgid "Reset import state" msgstr "İçeri aktarma durumunu sıfırla" +#. TRANS: Button text for pausing an import. msgid "Pause import" msgstr "İçeri aktarmayı duraklat" -#, php-format -msgid "Encountered error \"%s\"" +#. TRANS: Error message. %s are the error details. +#, fuzzy, php-format +msgid "Encountered error \"%s\"." msgstr "Karşılaşılan hata \"%s\"" +#. TRANS: Fieldset legend for a paused import. msgid "Paused" msgstr "Duraklatıldı" +#. TRANS: Button text for continuing a paused import. msgid "Continue" msgstr "Devam et" +#. TRANS: Button text for aborting a paused import. msgid "Abort import" msgstr "İçeri aktarmayı iptal et" +#. TRANS: Form instructions. msgid "" "Follow this link to confirm authorization at Yammer; you will be prompted to " "log in if necessary:" msgstr "" +#. TRANS: Link description for a link in an external Yammer system. msgid "Open Yammer authentication window" msgstr "Open Yammer kimlik doÄŸrulama penceresi" +#. TRANS: Form instructions. msgid "Copy the verification code you are given below:" msgstr "AÅŸağıda verilen doÄŸrulama kodunu kopyalayın:" +#. TRANS: Field label. msgid "Verification code:" msgstr "DoÄŸrulama kodu:" -msgid "Save code and begin import" +#. TRANS: Button text for saving Yammer authorisation data and starting Yammer import. +#, fuzzy +msgctxt "BUTTON" +msgid "Continue" +msgstr "Devam et" + +#. TRANS: Button title for saving Yammer authorisation data and starting Yammer import. +#, fuzzy +msgid "Save the verification code and begin import." msgstr "Kodu kaydet ve içeri aktarmaya baÅŸla" +#. TRANS: Form legend for adding details to connect to a remote Yammer API. msgid "Yammer API registration" msgstr "" +#. TRANS: Explanation of what needs to be done to connect to a Yammer network. msgid "" "Before we can connect to your Yammer network, you will need to register the " "importer as an application authorized to pull data on your behalf. This " @@ -188,20 +303,28 @@ msgid "" "register the app at Yammer; you will be prompted to log in if necessary:" msgstr "" +#. TRANS: Link description to a Yammer application registration form. msgid "Open Yammer application registration form" msgstr "" +#. TRANS: Instructions. msgid "Copy the consumer key and secret you are given into the form below:" msgstr "" +#. TRANS: Field label for a Yammer consumer key. msgid "Consumer key:" msgstr "" +#. TRANS: Field label for a Yammer consumer secret. msgid "Consumer secret:" msgstr "" +#. TRANS: Button text for saving a Yammer API registration. +#, fuzzy +msgctxt "BUTTON" msgid "Save" msgstr "Kaydet" -msgid "Save these consumer keys" +#. TRANS: Button title for saving a Yammer API registration. +msgid "Save the entered consumer key and consumer secret." msgstr "" diff --git a/plugins/YammerImport/locale/uk/LC_MESSAGES/YammerImport.po b/plugins/YammerImport/locale/uk/LC_MESSAGES/YammerImport.po index ed71d7a0f5..e90407e8a0 100644 --- a/plugins/YammerImport/locale/uk/LC_MESSAGES/YammerImport.po +++ b/plugins/YammerImport/locale/uk/LC_MESSAGES/YammerImport.po @@ -1,4 +1,4 @@ -# Translation of StatusNet - YammerImport to Ukrainian (УкраїнÑька) +# Translation of StatusNet - YammerImport to Ukrainian (українÑька) # Exported from translatewiki.net # # Author: Boogie @@ -9,25 +9,31 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - YammerImport\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-05 20:48+0000\n" -"PO-Revision-Date: 2011-05-05 20:52:01+0000\n" -"Language-Team: Ukrainian \n" +"POT-Creation-Date: 2012-06-30 11:07+0000\n" +"PO-Revision-Date: 2012-06-30 11:10:35+0000\n" +"Language-Team: Ukrainian \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-27 13:31:56+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87509); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-POT-Import-Date: 2011-12-03 13:51:41+0000\n" +"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" +"X-Translation-Project: translatewiki.net \n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-yammerimport\n" "Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" +#. TRANS: Page title for Yammer administration panel. +#. TRANS: Form legend. +#. TRANS: Field label for a Yammer import connect step. +#. TRANS: Form legend. msgid "Connect to Yammer" msgstr "Ð—â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· Yammer" +#. TRANS: Page title for Yammer import administration panel. msgid "Yammer Import" msgstr "Імпорт з Yammer" +#. TRANS: Instructions for Yammer import administration panel. msgid "" "This Yammer import tool is still undergoing testing, and is incomplete in " "some areas. Currently user subscriptions and group memberships are not " @@ -40,53 +46,122 @@ msgstr "" "Ñайту Yammer піде нам на зуÑтріч Ñ– тоді роботу над цим додатком буде " "завершено." +#. TRANS: Error message about an import job being paused from the admin panel. msgid "Paused from admin panel." msgstr "Призупинено з адмініÑтраторÑької панелі." +#. TRANS: Client exception thrown when encountering an unhandled sub action. +msgid "Invalid POST" +msgstr "" + +#. TRANS: Page title for Yammer import administration panel. msgid "Yammer import" msgstr "Імпорт з Yammer" +#. TRANS: Menu item for Yammer import. +#, fuzzy +msgctxt "MENU" msgid "Yammer" msgstr "Yammer" +#. TRANS: Menu item title for Yammer import. +#, fuzzy +msgid "Yammer import module." +msgstr "Імпорт з Yammer" + +#. TRANS: Exception thrown when a non-user item type is used, but expected. +msgid "Wrong item type sent to Yammer user import processing." +msgstr "" + +#. TRANS: Used as a prefix for the Yammer expertise field contents. msgid "Expertise:" msgstr "ЕкÑпертиза:" +#. TRANS: Exception thrown when a non-group item type is used, but expected. +msgid "Wrong item type sent to Yammer group import processing." +msgstr "" + +#. TRANS: Exception thrown when a non-message item type is used, but expected. +msgid "Wrong item type sent to Yammer message import processing." +msgstr "" + +#. TRANS: Server exception thrown when an avatar URL is invalid. +#. TRANS: %s is the invalid avatar URL. #, php-format msgid "Invalid avatar URL %s." msgstr "Ðевірна URL-адреÑа аватари %s." +#. TRANS: Server exception thrown when an avatar could not be fetched. +#. TRANS: %s is the failed avatar URL. #, php-format msgid "Unable to fetch avatar from %s." msgstr "Ðеможливо завантажити аватару з %s." +#. TRANS: Button text for starting Yammer authentication. +#, fuzzy +msgctxt "BUTTON" msgid "Start authentication" msgstr "Початок автентифікації" -msgid "Request authorization to connect to Yammer account" +#. TRANS: Button title for starting Yammer authentication. +#, fuzzy +msgid "Request authorization to connect to a Yammer account." msgstr "Запит дозволу на Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ Yammer" +#. TRANS: Button text for starting changing a Yammer API key. +#, fuzzy +msgctxt "BUTTON" msgid "Change API key" msgstr "Змінити API-ключ" +#. TRANS: Server exception thrown if a Yammer authentication request is already present. +msgid "Cannot request Yammer auth; already there!" +msgstr "" + +#. TRANS: Server exception thrown when requesting a Yammer authentication URL while in an incorrect state. +msgid "Cannot get Yammer auth URL when not in requesting-auth state!" +msgstr "" + +#. TRANS: Exeption thrown when an external Yammer system gives an error. +#. TRANS: %1$s is an HTTP error code, %2$s is the error message body. +#, php-format +msgid "Yammer API returned HTTP code %1$s: %2$s" +msgstr "" + +#. TRANS: Exeption thrown when an external Yammer system an invalid JSON response. +msgid "Invalid JSON response from Yammer API." +msgstr "" + +#. TRANS: Exeption thrown when a trust relationship has already been established. +msgid "Requesting a token, but already set up with a token." +msgstr "" + +#. TRANS: Field label for a Yammer import initialise step. msgid "Initialize" msgstr "ІніціалізаціÑ" +#. TRANS: "In progress" description. msgid "No import running" msgstr "Імпорт не працює" +#. TRANS: "Complete" description for initialize state. msgid "Initiated Yammer server connection..." msgstr "Розпочато Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· Ñервером Yammer..." +#. TRANS: "In progress" description. msgid "Awaiting authorization..." msgstr "Чекаємо дозволу..." +#. TRANS: "Complete" description for connect state. msgid "Connected." msgstr "Під’єднано." +#. TRANS: Field label for a Yammer user import users step. msgid "Import user accounts" msgstr "Імпорт облікових запиÑів кориÑтувачів" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of users to be imported. #, php-format msgid "Importing %d user..." msgid_plural "Importing %d users..." @@ -94,6 +169,8 @@ msgstr[0] "Імпорт %d кориÑтувача..." msgstr[1] "Імпорт %d кориÑтувачів..." msgstr[2] "Імпорт %d кориÑтувачів..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of users imported. #, php-format msgid "Imported %d user." msgid_plural "Imported %d users." @@ -101,9 +178,12 @@ msgstr[0] "Імпортовано %d кориÑтувача." msgstr[1] "Імпортовано %d кориÑтувачів." msgstr[2] "Імпортовано %d кориÑтувачів." +#. TRANS: Field label for a Yammer group import step. msgid "Import user groups" msgstr "Імпорт Ñпільнот" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of groups to be imported. #, php-format msgid "Importing %d group..." msgid_plural "Importing %d groups..." @@ -111,6 +191,8 @@ msgstr[0] "Імпорт %d Ñпільноти..." msgstr[1] "Імпорт %d Ñпільнот..." msgstr[2] "Імпорт %d Ñпільнот..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of groups imported. #, php-format msgid "Imported %d group." msgid_plural "Imported %d groups." @@ -118,9 +200,12 @@ msgstr[0] "Імпортовано %d Ñпільноту." msgstr[1] "Імпортовано %d Ñпільнот." msgstr[2] "Імпортовано %d Ñпільнот." +#. TRANS: Field label for a Yammer import prepare notices step. msgid "Prepare public notices for import" msgstr "Підготовка до імпорту Ñтрічки допиÑів" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be prepared for import. #, php-format msgid "Preparing %d notice..." msgid_plural "Preparing %d notices..." @@ -128,6 +213,8 @@ msgstr[0] "Підготовка %d допиÑу..." msgstr[1] "Підготовка %d допиÑів..." msgstr[2] "Підготовка %d допиÑів..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices prepared for import. #, php-format msgid "Prepared %d notice." msgid_plural "Prepared %d notices." @@ -135,9 +222,12 @@ msgstr[0] "Готовий %d допиÑ." msgstr[1] "Готово %d допиÑів." msgstr[2] "Готово %d допиÑів." +#. TRANS: Field label for a Yammer import notices step. msgid "Import public notices" msgstr "Імпорт Ñтрічки допиÑів" +#. TRANS: "In progress" description. +#. TRANS: %d is the number of notices to be imported. #, php-format msgid "Importing %d notice..." msgid_plural "Importing %d notices..." @@ -145,6 +235,8 @@ msgstr[0] "Імпорт %d допиÑу..." msgstr[1] "Імпорт %d допиÑів..." msgstr[2] "Імпорт %d допиÑів..." +#. TRANS: "Complete" description for step. +#. TRANS: %d is the number of notices imported. #, php-format msgid "Imported %d notice." msgid_plural "Imported %d notices." @@ -152,37 +244,49 @@ msgstr[0] "Імпортовано %d допиÑ." msgstr[1] "Імпортовано %d допиÑів." msgstr[2] "Імпортовано %d допиÑів." +#. TRANS: Field label for a Yammer import done step. msgid "Done" msgstr "Виконано" +#. TRANS: "In progress" description for done step. +#. TRANS: "Complete" description for done step. msgid "Import is complete!" msgstr "Імпорт завершено!" +#. TRANS: Fieldset legend. msgid "Import status" msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿Ñ€Ð¾Ñ†ÐµÑу імпорту" +#. TRANS: Progress bar status. msgid "Waiting..." msgstr "ОчікуваннÑ..." +#. TRANS: Button text for resetting the import state. msgid "Reset import state" msgstr "ПерезапуÑтити імпорт" +#. TRANS: Button text for pausing an import. msgid "Pause import" msgstr "Призупинити імпорт" -#, php-format -msgid "Encountered error \"%s\"" +#. TRANS: Error message. %s are the error details. +#, fuzzy, php-format +msgid "Encountered error \"%s\"." msgstr "ВиÑвлено помилку «%s»" +#. TRANS: Fieldset legend for a paused import. msgid "Paused" msgstr "Призупинено" +#. TRANS: Button text for continuing a paused import. msgid "Continue" msgstr "Продовжити" +#. TRANS: Button text for aborting a paused import. msgid "Abort import" msgstr "Перервати імпорт" +#. TRANS: Form instructions. msgid "" "Follow this link to confirm authorization at Yammer; you will be prompted to " "log in if necessary:" @@ -190,21 +294,34 @@ msgstr "" "Перейдіть за цим поÑиланнÑм Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð´Ð¾Ð·Ð²Ð¾Ð»Ñƒ від Yammer; вам буде " "запропоновано увійти до ÑиÑтеми, Ñкщо це необхідно:" +#. TRANS: Link description for a link in an external Yammer system. msgid "Open Yammer authentication window" msgstr "Відкрити вікно автентифікації Yammer" +#. TRANS: Form instructions. msgid "Copy the verification code you are given below:" msgstr "Скопіюйте наданий вам код Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð´Ð¾ Ð²Ñ–ÐºÐ¾Ð½Ñ†Ñ Ð½Ð¸Ð¶Ñ‡Ðµ:" +#. TRANS: Field label. msgid "Verification code:" msgstr "Код підтвердженнÑ:" -msgid "Save code and begin import" +#. TRANS: Button text for saving Yammer authorisation data and starting Yammer import. +#, fuzzy +msgctxt "BUTTON" +msgid "Continue" +msgstr "Продовжити" + +#. TRANS: Button title for saving Yammer authorisation data and starting Yammer import. +#, fuzzy +msgid "Save the verification code and begin import." msgstr "Зберегти код Ñ– почати імпорт" +#. TRANS: Form legend for adding details to connect to a remote Yammer API. msgid "Yammer API registration" msgstr "РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ API Yammer" +#. TRANS: Explanation of what needs to be done to connect to a Yammer network. msgid "" "Before we can connect to your Yammer network, you will need to register the " "importer as an application authorized to pull data on your behalf. This " @@ -217,22 +334,31 @@ msgstr "" "мережі. Перейдіть за цим поÑиланнÑм, щоб зареєÑтрувати додаток на Yammer; " "вам буде запропоновано увійти до ÑиÑтеми, Ñкщо це необхідно:" +#. TRANS: Link description to a Yammer application registration form. msgid "Open Yammer application registration form" msgstr "Відкрити реєÑтраційну форму додатку Ð´Ð»Ñ Yammer" +#. TRANS: Instructions. msgid "Copy the consumer key and secret you are given into the form below:" msgstr "" "Скопіюйте ключ Ñпоживача та Ñекретний код, котрі вам було надано, до Ð²Ñ–ÐºÐ¾Ð½Ñ†Ñ " "нижче:" +#. TRANS: Field label for a Yammer consumer key. msgid "Consumer key:" msgstr "Ключ Ñпоживача:" +#. TRANS: Field label for a Yammer consumer secret. msgid "Consumer secret:" msgstr "Секретний код:" +#. TRANS: Button text for saving a Yammer API registration. +#, fuzzy +msgctxt "BUTTON" msgid "Save" msgstr "Зберегти" -msgid "Save these consumer keys" +#. TRANS: Button title for saving a Yammer API registration. +#, fuzzy +msgid "Save the entered consumer key and consumer secret." msgstr "Зберегти ключі Ñпоживача" diff --git a/plugins/YammerImport/scripts/yammer-import.php b/plugins/YammerImport/scripts/yammer-import.php index b4aa921e50..22b6422195 100644 --- a/plugins/YammerImport/scripts/yammer-import.php +++ b/plugins/YammerImport/scripts/yammer-import.php @@ -4,7 +4,6 @@ if (php_sapi_name() != 'cli') { die('no'); } - define('INSTALLDIR', dirname(dirname(dirname(dirname(__FILE__))))); $longoptions = array('verify=', 'reset'); diff --git a/scripts/SearchMonkey-MrH.0.txt b/scripts/SearchMonkey-MrH.0.txt deleted file mode 100644 index 34191d90a8..0000000000 --- a/scripts/SearchMonkey-MrH.0.txt +++ /dev/null @@ -1 +0,0 @@ -b2.PXYLSJBuLkZnUQ7H.2gOSSTbVllQM_XyN0ya4sO9CNt5uBUATEGyKd3LkkR0QXTSduKb7xj7Bp1TX6.8XdIDsOVVuXe.3HPnPLtSacZm66.NLY3JGhJv1MfGvcJU42YEQiUvpAhZRe46E.lv38ZPzxvhjjAmGFyFv8UNuhdw6sNIlTwBdct3k1GKA1YSEeVJ_xLiAVa8IaU_XG8PlxMovsBPePOry8__.aAp5loHtmqX6vEVu3lcHEn5NvSZ502QoWkK_20Y.6oja.Fqqxtr6eli_AQXaVzWWDEu_D4_rDV9Mz_.EC8KzXKo.YdUaWQfS9akqNm1v54wTNM4ZDegsbKnaNUR7J0OYgzpzcPj4L57yWKFm7k2af.v2loGrUOKJGO3rBcOQSfUz5jyCKDdd29cdd2L96XA0Uy31RjvdWSsprigS94HjoE9e5TUMHHZt47Wi50DsMq5R87uznHTouuHOKyxT3c_wCejxb_A0lVM5JL4VnrjVEo0CkY5ju1fDXfXG.Q8T4WYbnW_4i4W.DAuaFiRxIsLtrSG5bpMvJWQ8MTfc39gaLkNtGACL_O8IxX7iyFjARapuIXPhu3v3ndEt6qlgcUsEBl6zhxe6WcTQssBTUSDSPQWMmbA8TCYe1xwHd3ukSdqkhkALdIri2oeLLhkbNQRKxouIWHqL5aH0r7CCKM.P87rJE1meb28ux00FrBg4Fa62RM5S5Wn24u0odvPGK9JGmzisi.zM2cULr8C03gwBEeGDXzLIPevVnoqcYvtUfs8_B9xtaFzsKEM.04JX94e5Y_qWqfJs2.vWdY02BwWNsM1ONUzsS5qBzFhNpVnvZYHkNuOGXLb7cg7sL0Zm9pGMQPJsffThK2KY5EGSxbCB_JMqZmu9UtmcFyrsny7Yo1z6uCgu7GzN9_6Tc_DGW4OyuOm6XaLZSbGApmGosEKRKIODNAUGyT6QChSEwnPxhgYVpIn1TYualgrBtwvON5d84Up5.mxTH5ZHDjQcW04oE1dp2mBQhlUHvTF.PbEuUztvA8mMuLZgERcE01oOKkDlh9gvjZNiMs6f8SPmulKmtvheecitvB4Urgkae_PiXbcD4aOL4PyjwByX4zpCw9NG8Ga.6JLv1nH.vEE5XBCzh0_rnEmv0XzNBjiE8nj_p2pntfxmdpEeSGrA8WzigZTHrjawltlC_sMGLqR0EfRqoVrs3NtH8jafQ8DoqKUnR1wiG1BFC9PiQzPbPunYvVT_vMILkfwHDS7gY4bfZAlLrfbC0n8EKumGJc1o1ag_VsfnO2O8vE9667oVTaAGMmxXA_g1qpPVJTDWHRm4kwA6SWTZ6RCSb0Scd_DTXN4cevjn3sSGOCKE5Tocd1s4JRCuDPGQ9XI1OXGSKZrUuuM8mUlZqj6A.FWgdv2c5qXoRla.Qlb6encfFh8gnBNNoIR5X4F9PFl7.Yq38Vi0BJ7zIJVYAU8UXqJqPKKN.qH4A941m8jG7trm9NBrsRIkyCJBE5W1UVZ4x4sBDSuJMT_UCYCyn_qsjHkYpJOaYt44c7PT5U_S8oVUUe0qtuvmQ5DK.cZAU1hdw9fINikie3yGxO66lWRPtmM1rqTHwEHqaJXkn4mnRhQmHE.pqB.N_Byir3AiezaA2EGi6Z7.G99XrOjxJ0tIyim39AkoPZbeWqVlLDL.4AGCzPLQyndMClwWJdjcHBaSrxGGL1OpZ9cGA6w1zLD_6uyP4gK2pGTGxvOk4TFqrpc07eX7j6agiBfkUzYykXSm_JYDVZqiivMwKVEynFsX24erN0kd379wr_QI8Ov2nfXudbZn9EY1bhmupuAtMqpW.dNGk7YJ3AD31zrfz2KcZjdQuLkTYwqW4zI3YEI0jFqk0WYXSUmCNRzbdvmoZI1kAWRw2COuUnYeMfoTiMeJGgUd.g-- \ No newline at end of file diff --git a/scripts/SearchMonkey-Om3.0.txt b/scripts/SearchMonkey-Om3.0.txt deleted file mode 100644 index 6f8840962e..0000000000 --- a/scripts/SearchMonkey-Om3.0.txt +++ /dev/null @@ -1 +0,0 @@ -WJofugbSJAtzh.lFcHxO_WHM64iJd7qHJFbsqC9VLnpiqoBxdbE0iwoKozxZC331Svk6O9Un9jonWUrQeTndGO8hldPlxqGdFdbl6OjoucDGG_h6qBw3Ugnbethbyuew1qOaUr6ItfU4Pe9O2GtUj2KbqxZpUAvMeiS20hykHbIZ8n_1.fl.fTToLiJn58zcLc1_ryM0f5jbkIGwmGX_SG6isGJRzC4.BiNmntpJ5ZCKa80e7oUH9S6NlM5SEmXoA3zhuzkbBxF_fKLendcC7EafnTT34MbgD5s4uwTyubSBJvdmBu.mWSO9xrnojM903Vo8h3.UdG.id1LmFrj4xxd24IQqZM2v4zOfl8ugF8ChHaIzp82A1AOuk0ulkqKgiALia6bsZMbKdPZtlu_HGrF06tCt5VGvu5f0ZgjRk_kOlP_f_oppyVKRWzZpSH9GryOpoqJA2vlxgEH2BvZqaaUYEmaYJjIh7eNkLRLVorbK7rGhPf_L5qfHir.31Ar1zZxWgvhjSW7ipkvsNr_3j7oOh1LSTVWNHo.dpLT0_dib6syFopav2FqStJG0RTsWNXkQ_6h.jf439DjwuZmCLMcbUrMAMrRVcsUyR5nfqP5cP0igSx8m.oONA7O.txOXSzc3HjqvIVSTRO8BIHx.vTMJ6mq4NUmZ6_pHWapHbO9esUlIyXf5CF2qhtlM9aulr2fwCf8BqtjQctAtvYLrI_qKP95wNaB_qhcuFsZN1aiql.FtigHe2YYTix4SWg9.67VSBAyOqjWcA5jbyoomf8Gxzks9PZQfSuKbkbw_x3XOshGl4QMo6CEypV0qIYVVW77bOJc7I0WgwgxuAKg6lROlmsIdN0.SeTV4sY1ZcoLEgdNCNb81SVstXdE0iPXPZZsEStez.qluWnQoVkkWfOaBe78PxPZUvQS02RaR0FCH4bksqGWXLA8chAHIe4vPNerCLJwskKG3rA43xRDEZY7sgdEfA93iTztmIRq8dkYA6dJOxOMtvpSdh9jds04xpdmfhb23bVYp1XCp3qWka6JoKlzvQU2THqFr7gNU3KMCbr2ngHHkDTZGNO__MLa3SKlp2Vg3qHXxkivFUmWTNUz5vuW7v.FhsKOVFIFfSrTl3pjJMD3hyIlxzf_HJ60q1LRBkwqxrA9e8Fr5tqWQj.evL5kqz_r26MdHFeMTx9VwfDnHLaVx3eu5Wy2NJmLVPRLNn4t1VhexsEdLquy0ynBVBOBBRa2HbYgv0lXOP.QRl5twTKwJO6fx6J4_L_HhPv6jhcQej1LtUyGyKwLuXrHxnHCOqD.e9ZL_xnqSRthM6NvBsvbnZOPr7falUuQWPzbikXMFUvSlckeetPi2Z11l9pH.cxZDj19B38v7jwT5zZMQN9FzQvTCvzrQCpHxfIxwh3a2cx18BEMKHL7MJWDsoYVURtI3iIdR84WzXcr3kkCz.LM8tqTKVkzHLk8Grx8KT3dF5ZIVhWK5yyb05RFOZdoZQ4cWXmvsaQhDUd6Dm2KRJiypSFntLLSp34URsLaqzxaakMnywHvfmsINah4oKBBy8.NFBRULU9SqTyIOwf6_ggWG06J1WJxWV94RRCD1rMNNM9ISMOo4yB_dmfLHnXKOZm1lOnisEN36gsxniy_psLN3Ed1ozRtbbD.wALfE.92DrDA9ASPOdu08P7xer76iXVbdt_4cg5whY59Hq2N.A1mrSbetDbSu7NeziZ.nBvSUg_YpVvMo2H3elySL.1UsLPFznStGuYfbISN79MZecU.ScSCtaeZQ2cBFekXMNT77HWZmv6YLsz84ceQwL_MidvAYqPh6PUNiBl8iwFR5PCpTB54.g0m3zuALOqF9hJ598v9rh9Zlu1SfE.UfmGpUICMSuXH7C8zHMq4TFZGzCuBY9EOuBc.JQaCfBr8N3jnDq2bwlQjDmgbVW2xm2WpPMCB0OxkqoggA0i4ZZA3gSfqhlZ9mdmr_l9mUe0dOd_EkyWyu0l.Z1.VQLY2KJHl.8pZWyP6S_RAFmABOlEGP3m1E8NxaMP87o9ot_BNg21DeHbwADKbv16deRlDrKmntHoPwfsaTPNo5KembI_4nHxQ3y2B2OjsUPcLYFZZtsP4ukLBhYusR8SdtsEC._plxsMQzS9nH.zRP8nbluMlUjCKgfepGN_rCq.NeGON.L_.FowXEOcX7M1SD.IfihdAHqk0zUpuyTfe.9E77aEu26iIZOGmyOwSqRvN9HksJx.iMk5xL.xah7hl.NByMBbmkRDS52wDMxygNpPXsIHdvu8OyLxq.ZsNBGF.IHs0qiquX4.RZ2TBqTQ6O4AhzOTpFeZlG3UzdmxsEtDI2a7tY_27Gg39apf_83ijjiLaJE2RG5Mb9krZ2RCIAXaFez74o_oqli5dy6WyT4lEIKtw38T7m1bJ_xpLju5FBQUE54RpsK.ZWSAoyh3c05b2mBeN2id_NV7sM4MinY7rEsOgNVevUNrWebNrrdunUF8gsa59cXdGSKvmUw9kEKW_Z6Y14AICD43zlmVGYDYlSLqpHsu32m9aGuQFlqzBlHCKPg9uD9dyFKsZJI8l2yq91sEj9snlYhApmHLVQzGWLiOJCJUclByiPmVD_.OnHE84lBcv0bkXKFYXvUhFs2Xu1VrN1mGXz50KkG4Xovzkw0ueuWlJ2vozPUf9CkJ1mlOA4jwuFLMrQZmN04aXyR3ZWFN8pdSVITI0ADqNr9OGacCra.emTRIWdBLEj18kp39vhlR6BpxI2V0FQjC_27n2hkDUNAUNFaJ1Q84OO2mgzZnPXcN7NYz57W3lB_mMVUtKngnRlTNWn1sFdN6.WFQ1szScjtpFa68NBv5pLUOvKy49VWjn14uS4aUoDL_fbMi9tGw0tlrMEr74fm5hJNwPX1QKd3cy0jqDHLIpZTb1aNxIz_KU4XIJ2wx0gZZQH2zV7eTxsrozzo3J0TtiQC6pPOqbnsRF1TuX1..DV5LzUdKX0TUXyO8x0710.EF4z6pim0HuVKzV2VBKmG6qtzpIRCKzVk14lx2E9YkJTQusU9qZnw9Ixu_YL0Ue_4LachvurMZDYTIRcSyd4St3TmtZswmeLPS6Md6NtHwxQEy.RVLhuCmliiZcw9hB.CH6v0UX1i9E6r_FZyboWtnzX42mZDrJR4n1u2nGFzYwJrDN_kJ3uHKs4EoV9ESEd5AojHDWSkOs4lKbyRlYwhGrHgB25mZ2xRdBtkHMDupYisNjOJ.QEIXzpK291wKHWTL.VdeTOLqGxsthxoR7AOdnzalMIuUItxagzB14Gw2eZ5PcIZvcgO9C4BouZW4SAg0D0Xhmd4A0MW0an7NqzXM4VDVg6WMgeBHqL54yfHjK4oMkwDUQTvqNH13AKINKbtr5t5JJzfpSN0fmfysA1Z1PdkJROhFkyH1_ZXcoMJp2XbYSk6ZXm69U4j4QCYe_vmkp3NM802bMpohywJRxYstmfIxinJukmZOEiSClAk1MhRGVlj60w8ggV29QYa_pdqUjTm0DwYZQF1Z_NVkhVXVv7bQMpRQJPIMwf3TggPPHVAMA1tk0OdPFOCx1207E- \ No newline at end of file diff --git a/scripts/SearchMonkey-yQP.0.txt b/scripts/SearchMonkey-yQP.0.txt deleted file mode 100644 index dcfc31ad19..0000000000 --- a/scripts/SearchMonkey-yQP.0.txt +++ /dev/null @@ -1 +0,0 @@ -8Yd1y.bSJBPj3Ul5NjhQHFX0dN0NuJAfBObEdgIY2QDh0bVXkzcJbNlBamPSFBZqHojxbPzIj5GlY3XdxGMY6ttYzBHvc_FK5krngYtlLSmBtjRArxI_bBfngIxeI2kFC3wPvHIdzp8gygRp2.IlDahWHABFhAPrPrxAkAOqv6O3tKUTTzcnZX22eOdoXVXQSMiphlDQIxpfbdpLnduBvMxvI.hwrfAW4iIVY7iBjkdnrtdAVj4N2.u65khGuAwaX9i6Buca3XQJm601Atf6fjM57yOFA0.laixrOss1_F36iqrc4mOeWnYI_UDw8SgIrXroswrJ.KwXlqCdICxel3Ui0hfrOoGnCt4HHT9tiObu9VG.GxM2KQ_tjb1LwFFX0WEisFKXfQwpR_2NU..0j1icWhnmPHFJGsImvX1dFgeTqcNvoAcfZ0y9c8KQKzV5CbQeg9_oPC7uviIdxQK2lJ7SzgRfZAw4FDeDXKDxuVZRE7jZYQEWtkmp9dFlFLM_L0dPk4kiJuRrRPJ8DAyWSiex_ib1mJ3bHAxbsEcWoUunIOivWVdZDudCBath8AdoAQ0P8_f.fl8jYgbZil49Qhg.WmFD_H0w7ikdEi1iHsWnjSrDORtAjENGvoEje0h.gMBf38FbQ6vW2BbKC.RBKp.cQhVPvDHel1UFtqZ8IJm7mTP0BDSDG2iFJp1_N7L5MUoUxEwgskMxeQf99vE1UybdR4q0kbx6i_RR3_6.AQ5QKk1EBeKAfnVYDdwcLGVgWd9JxxvekkL7Scl1ncZ9ViLvlC3Hfrbtrm2Q5rr17pIG6L.a6gDKKH1NGgapyLUCVtKZ27Ysd9ExMF1yHfMAyOKL5I7KaJmZTZnxWQ9ex.hHS6tZ9WjPFhjvpve7H_mB8ZXNBdEc4bL.iRdknHNe3WSSgCLWf2RVFZ4wmVMYW4KwGpIp7iGbaUDBYdBFkcCmv6zeneEsLGJHUYipsay5unopuFyBe611pwFRNHZ3XznmqaK8TXl18k_PCmQ6g93.fXFeWKmszw_FArltYuXHNIm3zwRobvDo7Rp0znnt76Q0ha3q5WHggFd6.QmC6jywGLpki_09v0Pc6qGh4gpGt1vZeZrA1OGQ7VSB7Muo4Mr4TbQU_6342nXeG0tBImIanPZsQrew1.tOmAfn16UpzcCuEC3NWw99yipIaEZirdr4teITB7xX3x6UGRcjtoAlz8oo6VEYaFX7ybG6Bo.K4hspnJLWH6jKK4hcpYedE2qSB0W4z_ieFy6Y.2qrx8_3CL1_8h5w6PjXOFTmsyk0v0DXQVuGh8QxPgPVyrWyDzlXJZ.5_mHTohGRGCI41I6jGJcCOh3qEQZKF2VYb.3o00Le9YlXxpBIBh7rBw5vNypp9jSd.W6VPnQ53xM6QzVbYW4OV3gkVE__AgvKNUzfRHiK9dN7evwvKX66W4tUPGQapjGbRWnFc3Q_0__oMYTtSR3EMxs0Lvkjh87s0SMxy0gzvVCfNt4VrdZCzdBd8N8Tcj5Pc4KJ09ikPtNB3V8i6jtcVUuKzs32B37O6AA2iOydQdsPDEhfkDA0S_ocu3DqqBsJOYmzjRq39e1WFhlRijNftxHF6DRvzpSIIm5VzcwIg8LLl4zbHyeRXEmBDp.KvlfP_.z2IUqilhGeccCmV2XFD_VFidZclzscmceMmuBOXYmaplSW3sX94eM7mp2dyDjVXtR4igukNU8Fabaqilu98OKIv9mLdTlE9u7t25KNqMHQQOsYNM4BUocalSN1K3JOot544vz9VbWJfIljF2L6DCduJd6h9aDH5wLMjljRqrteltA3yz86ensnOZ5wmU8X3NMpPN.OCXM8zxqdhEGxE_jeXkpf4AKIFWYrn8zH84sFU60gpy3xMOleKK6NfrFDRdzxkBIJGV7yhBaDi1_0iZuwm8hVLFe2odNyEKbllCeXYpeMJwe3w_e7XQD1T2Zv4bvK69qYPhmkngPs7_nCYYUFWKlvkg0njZyxn3kNSTONHjzrLSlTWMvGobei1GV74wJzWmmZpC1yQNOe_8Stjbj5Lg47iELys5kCMWU1NyIQf16AT35xTlPCYJ_RNVy3yDNeh5kqy9AMX_HIJOHw8xwJEUoiqKzWzLV.BWmpzcny9_7P2naXBrzRlOYmYyWUtp.P0gGNxLZXtEaKKGgdQB.fYXUyuKH0ptXqj1YCl1g1KWo3.AwndjDy0PE8ZYCaCjz.EyXqx.8bvfJycccGRw5RVU74aydE0DRCC3vF6VI9qbPWK89HNTMWxPSSTHdChY6yAhNsc5UhDwsAmhZ_UIYynZ8AM_oCS232.einbw9fYI4X6yZm_fD60DJ1FsBweU9ivf3Y4X2ucLFY8xPp_8SxZ5UtaP67TKflzMYjuvhGXAUF9.1u8ZKJGOliFmMxIwJ7lPJs93HfZgLN2eyH6F.rZjREeyd0fbsRzZ_vMEs4fx6sX4eIGVoyVFpO5b11kxnBqlKnATI_nw1.exkl5sQj00clwphsecXiVLaDFCEjG94ve_1cw2foqQUoX6pUfqr_hSSpnacdacPclbxWPehuN5LpjMso_5b4v.rj4s9VtzRqxovBinIgBdTFAH560aN5f7wuN5ZZT_BT5aCFNwQBYoDfCTaU9jw3aaXU29vEJmYZcvC9WCpU0RTntciGlx8rIbagu7cUGrYFvLbU2ZekazCMklPO5Sno_z5zzxLnTpFxesNoreOj7M3Cp1RHKUmqAog04bYC9kPFvH_q.jF2g507LEN3nPL9EJUx460UG_o4HRQOhDi2YrmrHk.gLZECgnMwCN770fhL \ No newline at end of file diff --git a/scripts/allsites.php b/scripts/allsites.php index a67db12337..211728c497 100755 --- a/scripts/allsites.php +++ b/scripts/allsites.php @@ -22,19 +22,72 @@ define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); +$shortoptions = 't:w:'; +$longoptions = array('tagged=', 'not-tagged='); + $helptext = <<find()) { + while ($sn->fetch()) { + print "$sn->nickname\n"; + } + } + return; +} + +function print_tagged_sites($tag) { + + $sn = new Status_network(); + + $sn->query('select status_network.nickname '. + 'from status_network join status_network_tag '. + 'on status_network.site_id = status_network_tag.site_id '. + 'where status_network_tag.tag = "' . $tag . '"'); -if ($sn->find()) { while ($sn->fetch()) { print "$sn->nickname\n"; } -} \ No newline at end of file + + return; +} + +function print_untagged_sites($tag) { + + $sn = new Status_network(); + + $sn->query('select status_network.nickname '. + 'from status_network '. + 'where not exists '. + '(select tag from status_network_tag '. + 'where site_id = status_network.site_id '. + 'and tag = "'.$tag.'")'); + + while ($sn->fetch()) { + print "$sn->nickname\n"; + } + + return; +} + +if (have_option('t', 'tagged')) { + $tag = get_option_value('t', 'tagged'); + print_tagged_sites($tag); +} else if (have_option('w', 'not-tagged')) { + $tag = get_option_value('w', 'not-tagged'); + print_untagged_sites($tag); +} else { + print_all_sites(); +} diff --git a/scripts/backupuser.php b/scripts/backupuser.php index ee2951fc8f..740ae25d44 100644 --- a/scripts/backupuser.php +++ b/scripts/backupuser.php @@ -19,8 +19,8 @@ define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); -$shortoptions = 'i:n:f:'; -$longoptions = array('id=', 'nickname=', 'file='); +$shortoptions = 'i:n:f:a:j'; +$longoptions = array('id=', 'nickname=', 'file=', 'after=', 'json'); $helptext = <<getString(); + if (have_option('a', 'after')) { + $afterStr = get_option_value('a', 'after'); + $after = strtotime($afterStr); + $actstr = new UserActivityStream($user, true, UserActivityStream::OUTPUT_RAW, $after); + } else { + $actstr = new UserActivityStream($user, true, UserActivityStream::OUTPUT_RAW); + } + if (have_option('j', 'json')) { + $actstr->writeJSON(STDOUT); + } else { + print $actstr->getString(); + } } catch (Exception $e) { print $e->getMessage()."\n"; exit(1); diff --git a/scripts/cleardb.sh b/scripts/cleardb.sh deleted file mode 100755 index 06690ed70a..0000000000 --- a/scripts/cleardb.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -export user=$1 -export password=$2 -export DB=$3 -export SCR=$4 - -mysqladmin -u $user --password=$password -f drop $DB -mysqladmin -u $user --password=$password create $DB -mysql -u $user --password=$password $DB < $SCR - diff --git a/scripts/createsim.php b/scripts/createsim.php index 7435dcfeb2..d5ed227581 100644 --- a/scripts/createsim.php +++ b/scripts/createsim.php @@ -20,20 +20,33 @@ define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); -$shortoptions = 'u:n:b:g:j:t:x:z:'; -$longoptions = array('users=', 'notices=', 'subscriptions=', 'groups=', 'joins=', 'tags=', 'prefix='); +$shortoptions = 'b:g:j:n:t:u:w:x:z:'; +$longoptions = array( + 'subscriptions=', + 'groups=', + 'joins=', + 'notices=', + 'tags=', + 'users=', + 'words=', + 'prefix=', + 'groupprefix=', + 'faves=' +); $helptext = << common_config('notice', 'defaultscope')); + $options = array('scope' => Notice::defaultScope()); $n = rand(0, $i - 1); $user = User::staticGet('nickname', sprintf('%s%d', $userprefix, $n)); @@ -101,6 +114,39 @@ function newNotice($i, $tagmax) $options['scope'] |= Notice::ADDRESSEE_SCOPE; } } + } else { + $is_directed = rand(0, 4); + + if ($is_directed == 0) { + $subs = $user->getSubscriptions(0, 100)->fetchAll(); + if (count($subs) > 0) { + $seen = array(); + $f = rand(0, 9); + if ($f <= 6) { + $addrs = 1; + } else if ($f <= 8) { + $addrs = 2; + } else { + $addrs = 3; + } + for ($m = 0; $m < $addrs; $m++) { + $x = rand(0, count($subs) - 1); + if ($seen[$x]) { + continue; + } + if ($subs[$x]->id == $user->id) { + continue; + } + $seen[$x] = true; + $rprofile = $subs[$x]; + $content = "@".$rprofile->nickname." ".$content; + } + $private_to_addressees = rand(0, 4); + if ($private_to_addressees == 0) { + $options['scope'] |= Notice::ADDRESSEE_SCOPE; + } + } + } } $has_hash = rand(0, 2); @@ -118,7 +164,7 @@ function newNotice($i, $tagmax) if ($in_group == 0) { $groups = $user->getGroups(); if ($groups->N > 0) { - $gval = rand(0, $group->N - 1); + $gval = rand(0, $groups->N - 1); $groups->fetch(); // go to 0th for ($i = 0; $i < $gval; $i++) { $groups->fetch(); @@ -138,7 +184,29 @@ function newNotice($i, $tagmax) $options['scope'] |= Notice::SITE_SCOPE; } - $notice = Notice::saveNew($user->id, $content, 'system', $options); + $notice = Notice::saveNew($user->id, $content, 'createsim', $options); +} + +function newMessage($i) +{ + global $userprefix; + + $n = rand(0, $i - 1); + $user = User::staticGet('nickname', sprintf('%s%d', $userprefix, $n)); + + $content = testNoticeContent(); + + $friends = $user->mutuallySubscribedUsers()->fetchAll(); + + if (count($friends) == 0) { + return; + } + + $j = rand(0, count($friends) - 1); + + $other = $friends[$j]; + + $message = Message::saveNew($user->id, $other->id, $content, 'createsim'); } function newSub($i) @@ -207,10 +275,54 @@ function newJoin($u, $g) } } +function newFave($u) +{ + global $userprefix; + global $groupprefix; + + $userNumber = rand(0, $u - 1); + + $userNick = sprintf('%s%d', $userprefix, $userNumber); + + $user = User::staticGet('nickname', $userNick); + + if (empty($user)) { + throw new Exception("Can't find user '$userNick'."); + } + + // NB: it's OK to like your own stuff! + + $otherNumber = rand(0, $u - 1); + + $otherNick = sprintf('%s%d', $userprefix, $otherNumber); + + $other = User::staticGet('nickname', $otherNick); + + if (empty($other)) { + throw new Exception("Can't find user '$otherNick'."); + } + + $notices = $other->getNotices()->fetchAll(); + + if (count($notices) == 0) { + return; + } + + $idx = rand(0, count($notices) - 1); + + $notice = $notices[$idx]; + + if ($user->hasFave($notice)) { + return; + } + + Fave::addNew($user->getProfile(), $notice); +} + function testNoticeContent() { global $words; - + if (is_null($words)) { return "test notice content"; } @@ -224,15 +336,15 @@ function testNoticeContent() } $text = implode(' ', $parts); - + if (mb_strlen($text) > 80) { $text = substr($text, 0, 77) . "..."; } - + return $text; } -function main($usercount, $groupcount, $noticeavg, $subsavg, $joinsavg, $tagmax) +function main($usercount, $groupcount, $noticeavg, $subsavg, $joinsavg, $favesavg, $messageavg, $tagmax) { global $config; $config['site']['dupelimit'] = -1; @@ -260,7 +372,7 @@ function main($usercount, $groupcount, $noticeavg, $subsavg, $joinsavg, $tagmax) // # registrations + # notices + # subs - $events = $usercount + $groupcount + ($usercount * ($noticeavg + $subsavg + $joinsavg)); + $events = $usercount + $groupcount + ($usercount * ($noticeavg + $subsavg + $joinsavg + $favesavg + $messageavg)); $events -= $preuser; $events -= $pregroup; @@ -270,8 +382,10 @@ function main($usercount, $groupcount, $noticeavg, $subsavg, $joinsavg, $tagmax) $nt = $gt + ($usercount * $noticeavg); $st = $nt + ($usercount * $subsavg); $jt = $st + ($usercount * $joinsavg); + $ft = $jt + ($usercount * $favesavg); + $mt = $ft + ($usercount * $messageavg); - printfv("$events events ($ut, $gt, $nt, $st, $jt)\n"); + printfv("$events events ($ut, $gt, $nt, $st, $jt, $ft, $mt)\n"); for ($i = 0; $i < $events; $i++) { @@ -294,30 +408,44 @@ function main($usercount, $groupcount, $noticeavg, $subsavg, $joinsavg, $tagmax) } else if ($e > $st && $e <= $jt) { printfv("$i Making a new group join\n"); newJoin($n, $g); + } else if ($e > $jt && $e <= $ft) { + printfv("$i Making a new fave\n"); + newFave($n); + } else if ($e > $ft && $e <= $mt) { + printfv("$i Making a new message\n"); + newMessage($n); } else { printfv("No event for $i!"); } } } +$defaultWordsfile = '/usr/share/dict/words'; + $usercount = (have_option('u', 'users')) ? get_option_value('u', 'users') : 100; $groupcount = (have_option('g', 'groups')) ? get_option_value('g', 'groups') : 20; $noticeavg = (have_option('n', 'notices')) ? get_option_value('n', 'notices') : 100; $subsavg = (have_option('b', 'subscriptions')) ? get_option_value('b', 'subscriptions') : max($usercount/20, 10); $joinsavg = (have_option('j', 'joins')) ? get_option_value('j', 'joins') : 5; +$favesavg = (have_option('f', 'faves')) ? get_option_value('f', 'faves') : max($noticeavg/10, 5); +$messageavg = (have_option('m', 'messages')) ? get_option_value('m', 'messages') : max($noticeavg/10, 5); $tagmax = (have_option('t', 'tags')) ? get_option_value('t', 'tags') : 10000; $userprefix = (have_option('x', 'prefix')) ? get_option_value('x', 'prefix') : 'testuser'; $groupprefix = (have_option('z', 'groupprefix')) ? get_option_value('z', 'groupprefix') : 'testgroup'; -$wordsfile = (have_option('w', 'words')) ? get_option_value('w', 'words') : '/usr/share/dict/words'; +$wordsfile = (have_option('w', 'words')) ? get_option_value('w', 'words') : $defaultWordsfile; if (is_readable($wordsfile)) { $words = file($wordsfile); } else { + if ($wordsfile != $defaultWordsfile) { + // user specified words file couldn't be read + throw new Exception("Couldn't read words file: {$wordsfile}."); + } $words = null; } try { - main($usercount, $groupcount, $noticeavg, $subsavg, $joinsavg, $tagmax); + main($usercount, $groupcount, $noticeavg, $subsavg, $joinsavg, $favesavg, $messageavg, $tagmax); } catch (Exception $e) { printfv("Got an exception: ".$e->getMessage()); } diff --git a/scripts/decache.php b/scripts/decache.php deleted file mode 100644 index 094bdb5aa0..0000000000 --- a/scripts/decache.php +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env php -. - */ - -define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); - -$helptext = << [] -Clears the cache for the object in table
        - +
        @@ -150,10 +151,10 @@ - - + +
         
        - +
        @@ -162,10 +163,10 @@ - - + + <\/tr>/g, ''); return html; } diff --git a/plugins/TinyMCE/js/themes/advanced/js/color_picker.js b/plugins/TinyMCE/js/themes/advanced/js/color_picker.js index fd9700f222..7decac5b43 100644 --- a/plugins/TinyMCE/js/themes/advanced/js/color_picker.js +++ b/plugins/TinyMCE/js/themes/advanced/js/color_picker.js @@ -1,6 +1,6 @@ tinyMCEPopup.requireLangPack(); -var detail = 50, strhex = "0123456789abcdef", i, isMouseDown = false, isMouseOver = false; +var detail = 50, strhex = "0123456789ABCDEF", i, isMouseDown = false, isMouseOver = false; var colors = [ "#000000","#000033","#000066","#000099","#0000cc","#0000ff","#330000","#330033", @@ -33,37 +33,41 @@ var colors = [ ]; var named = { - '#F0F8FF':'AliceBlue','#FAEBD7':'AntiqueWhite','#00FFFF':'Aqua','#7FFFD4':'Aquamarine','#F0FFFF':'Azure','#F5F5DC':'Beige', - '#FFE4C4':'Bisque','#000000':'Black','#FFEBCD':'BlanchedAlmond','#0000FF':'Blue','#8A2BE2':'BlueViolet','#A52A2A':'Brown', - '#DEB887':'BurlyWood','#5F9EA0':'CadetBlue','#7FFF00':'Chartreuse','#D2691E':'Chocolate','#FF7F50':'Coral','#6495ED':'CornflowerBlue', - '#FFF8DC':'Cornsilk','#DC143C':'Crimson','#00FFFF':'Cyan','#00008B':'DarkBlue','#008B8B':'DarkCyan','#B8860B':'DarkGoldenRod', - '#A9A9A9':'DarkGray','#A9A9A9':'DarkGrey','#006400':'DarkGreen','#BDB76B':'DarkKhaki','#8B008B':'DarkMagenta','#556B2F':'DarkOliveGreen', - '#FF8C00':'Darkorange','#9932CC':'DarkOrchid','#8B0000':'DarkRed','#E9967A':'DarkSalmon','#8FBC8F':'DarkSeaGreen','#483D8B':'DarkSlateBlue', - '#2F4F4F':'DarkSlateGray','#2F4F4F':'DarkSlateGrey','#00CED1':'DarkTurquoise','#9400D3':'DarkViolet','#FF1493':'DeepPink','#00BFFF':'DeepSkyBlue', - '#696969':'DimGray','#696969':'DimGrey','#1E90FF':'DodgerBlue','#B22222':'FireBrick','#FFFAF0':'FloralWhite','#228B22':'ForestGreen', - '#FF00FF':'Fuchsia','#DCDCDC':'Gainsboro','#F8F8FF':'GhostWhite','#FFD700':'Gold','#DAA520':'GoldenRod','#808080':'Gray','#808080':'Grey', - '#008000':'Green','#ADFF2F':'GreenYellow','#F0FFF0':'HoneyDew','#FF69B4':'HotPink','#CD5C5C':'IndianRed','#4B0082':'Indigo','#FFFFF0':'Ivory', - '#F0E68C':'Khaki','#E6E6FA':'Lavender','#FFF0F5':'LavenderBlush','#7CFC00':'LawnGreen','#FFFACD':'LemonChiffon','#ADD8E6':'LightBlue', - '#F08080':'LightCoral','#E0FFFF':'LightCyan','#FAFAD2':'LightGoldenRodYellow','#D3D3D3':'LightGray','#D3D3D3':'LightGrey','#90EE90':'LightGreen', - '#FFB6C1':'LightPink','#FFA07A':'LightSalmon','#20B2AA':'LightSeaGreen','#87CEFA':'LightSkyBlue','#778899':'LightSlateGray','#778899':'LightSlateGrey', - '#B0C4DE':'LightSteelBlue','#FFFFE0':'LightYellow','#00FF00':'Lime','#32CD32':'LimeGreen','#FAF0E6':'Linen','#FF00FF':'Magenta','#800000':'Maroon', - '#66CDAA':'MediumAquaMarine','#0000CD':'MediumBlue','#BA55D3':'MediumOrchid','#9370D8':'MediumPurple','#3CB371':'MediumSeaGreen','#7B68EE':'MediumSlateBlue', - '#00FA9A':'MediumSpringGreen','#48D1CC':'MediumTurquoise','#C71585':'MediumVioletRed','#191970':'MidnightBlue','#F5FFFA':'MintCream','#FFE4E1':'MistyRose','#FFE4B5':'Moccasin', - '#FFDEAD':'NavajoWhite','#000080':'Navy','#FDF5E6':'OldLace','#808000':'Olive','#6B8E23':'OliveDrab','#FFA500':'Orange','#FF4500':'OrangeRed','#DA70D6':'Orchid', - '#EEE8AA':'PaleGoldenRod','#98FB98':'PaleGreen','#AFEEEE':'PaleTurquoise','#D87093':'PaleVioletRed','#FFEFD5':'PapayaWhip','#FFDAB9':'PeachPuff', - '#CD853F':'Peru','#FFC0CB':'Pink','#DDA0DD':'Plum','#B0E0E6':'PowderBlue','#800080':'Purple','#FF0000':'Red','#BC8F8F':'RosyBrown','#4169E1':'RoyalBlue', - '#8B4513':'SaddleBrown','#FA8072':'Salmon','#F4A460':'SandyBrown','#2E8B57':'SeaGreen','#FFF5EE':'SeaShell','#A0522D':'Sienna','#C0C0C0':'Silver', - '#87CEEB':'SkyBlue','#6A5ACD':'SlateBlue','#708090':'SlateGray','#708090':'SlateGrey','#FFFAFA':'Snow','#00FF7F':'SpringGreen', - '#4682B4':'SteelBlue','#D2B48C':'Tan','#008080':'Teal','#D8BFD8':'Thistle','#FF6347':'Tomato','#40E0D0':'Turquoise','#EE82EE':'Violet', - '#F5DEB3':'Wheat','#FFFFFF':'White','#F5F5F5':'WhiteSmoke','#FFFF00':'Yellow','#9ACD32':'YellowGreen' + '#F0F8FF':'Alice Blue','#FAEBD7':'Antique White','#00FFFF':'Aqua','#7FFFD4':'Aquamarine','#F0FFFF':'Azure','#F5F5DC':'Beige', + '#FFE4C4':'Bisque','#000000':'Black','#FFEBCD':'Blanched Almond','#0000FF':'Blue','#8A2BE2':'Blue Violet','#A52A2A':'Brown', + '#DEB887':'Burly Wood','#5F9EA0':'Cadet Blue','#7FFF00':'Chartreuse','#D2691E':'Chocolate','#FF7F50':'Coral','#6495ED':'Cornflower Blue', + '#FFF8DC':'Cornsilk','#DC143C':'Crimson','#00FFFF':'Cyan','#00008B':'Dark Blue','#008B8B':'Dark Cyan','#B8860B':'Dark Golden Rod', + '#A9A9A9':'Dark Gray','#A9A9A9':'Dark Grey','#006400':'Dark Green','#BDB76B':'Dark Khaki','#8B008B':'Dark Magenta','#556B2F':'Dark Olive Green', + '#FF8C00':'Darkorange','#9932CC':'Dark Orchid','#8B0000':'Dark Red','#E9967A':'Dark Salmon','#8FBC8F':'Dark Sea Green','#483D8B':'Dark Slate Blue', + '#2F4F4F':'Dark Slate Gray','#2F4F4F':'Dark Slate Grey','#00CED1':'Dark Turquoise','#9400D3':'Dark Violet','#FF1493':'Deep Pink','#00BFFF':'Deep Sky Blue', + '#696969':'Dim Gray','#696969':'Dim Grey','#1E90FF':'Dodger Blue','#B22222':'Fire Brick','#FFFAF0':'Floral White','#228B22':'Forest Green', + '#FF00FF':'Fuchsia','#DCDCDC':'Gainsboro','#F8F8FF':'Ghost White','#FFD700':'Gold','#DAA520':'Golden Rod','#808080':'Gray','#808080':'Grey', + '#008000':'Green','#ADFF2F':'Green Yellow','#F0FFF0':'Honey Dew','#FF69B4':'Hot Pink','#CD5C5C':'Indian Red','#4B0082':'Indigo','#FFFFF0':'Ivory', + '#F0E68C':'Khaki','#E6E6FA':'Lavender','#FFF0F5':'Lavender Blush','#7CFC00':'Lawn Green','#FFFACD':'Lemon Chiffon','#ADD8E6':'Light Blue', + '#F08080':'Light Coral','#E0FFFF':'Light Cyan','#FAFAD2':'Light Golden Rod Yellow','#D3D3D3':'Light Gray','#D3D3D3':'Light Grey','#90EE90':'Light Green', + '#FFB6C1':'Light Pink','#FFA07A':'Light Salmon','#20B2AA':'Light Sea Green','#87CEFA':'Light Sky Blue','#778899':'Light Slate Gray','#778899':'Light Slate Grey', + '#B0C4DE':'Light Steel Blue','#FFFFE0':'Light Yellow','#00FF00':'Lime','#32CD32':'Lime Green','#FAF0E6':'Linen','#FF00FF':'Magenta','#800000':'Maroon', + '#66CDAA':'Medium Aqua Marine','#0000CD':'Medium Blue','#BA55D3':'Medium Orchid','#9370D8':'Medium Purple','#3CB371':'Medium Sea Green','#7B68EE':'Medium Slate Blue', + '#00FA9A':'Medium Spring Green','#48D1CC':'Medium Turquoise','#C71585':'Medium Violet Red','#191970':'Midnight Blue','#F5FFFA':'Mint Cream','#FFE4E1':'Misty Rose','#FFE4B5':'Moccasin', + '#FFDEAD':'Navajo White','#000080':'Navy','#FDF5E6':'Old Lace','#808000':'Olive','#6B8E23':'Olive Drab','#FFA500':'Orange','#FF4500':'Orange Red','#DA70D6':'Orchid', + '#EEE8AA':'Pale Golden Rod','#98FB98':'Pale Green','#AFEEEE':'Pale Turquoise','#D87093':'Pale Violet Red','#FFEFD5':'Papaya Whip','#FFDAB9':'Peach Puff', + '#CD853F':'Peru','#FFC0CB':'Pink','#DDA0DD':'Plum','#B0E0E6':'Powder Blue','#800080':'Purple','#FF0000':'Red','#BC8F8F':'Rosy Brown','#4169E1':'Royal Blue', + '#8B4513':'Saddle Brown','#FA8072':'Salmon','#F4A460':'Sandy Brown','#2E8B57':'Sea Green','#FFF5EE':'Sea Shell','#A0522D':'Sienna','#C0C0C0':'Silver', + '#87CEEB':'Sky Blue','#6A5ACD':'Slate Blue','#708090':'Slate Gray','#708090':'Slate Grey','#FFFAFA':'Snow','#00FF7F':'Spring Green', + '#4682B4':'Steel Blue','#D2B48C':'Tan','#008080':'Teal','#D8BFD8':'Thistle','#FF6347':'Tomato','#40E0D0':'Turquoise','#EE82EE':'Violet', + '#F5DEB3':'Wheat','#FFFFFF':'White','#F5F5F5':'White Smoke','#FFFF00':'Yellow','#9ACD32':'Yellow Green' }; +var namedLookup = {}; + function init() { - var inputColor = convertRGBToHex(tinyMCEPopup.getWindowArg('input_color')); + var inputColor = convertRGBToHex(tinyMCEPopup.getWindowArg('input_color')), key, value; tinyMCEPopup.resizeToInnerSize(); generatePicker(); + generateWebColors(); + generateNamedColors(); if (inputColor) { changeFinalColor(inputColor); @@ -73,6 +77,45 @@ function init() { if (col) updateLight(col.r, col.g, col.b); } + + for (key in named) { + value = named[key]; + namedLookup[value.replace(/\s+/, '').toLowerCase()] = key.replace(/#/, '').toLowerCase(); + } +} + +function toHexColor(color) { + var matches, red, green, blue, toInt = parseInt; + + function hex(value) { + value = parseInt(value).toString(16); + + return value.length > 1 ? value : '0' + value; // Padd with leading zero + }; + + color = color.replace(/[\s#]+/g, '').toLowerCase(); + color = namedLookup[color] || color; + matches = /^rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)|([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})|([a-f0-9])([a-f0-9])([a-f0-9])$/.exec(color); + + if (matches) { + if (matches[1]) { + red = toInt(matches[1]); + green = toInt(matches[2]); + blue = toInt(matches[3]); + } else if (matches[4]) { + red = toInt(matches[4], 16); + green = toInt(matches[5], 16); + blue = toInt(matches[6], 16); + } else if (matches[7]) { + red = toInt(matches[7] + matches[7], 16); + green = toInt(matches[8] + matches[8], 16); + blue = toInt(matches[9] + matches[9], 16); + } + + return '#' + hex(red) + hex(green) + hex(blue); + } + + return ''; } function insertAction() { @@ -81,7 +124,7 @@ function insertAction() { tinyMCEPopup.restoreSelection(); if (f) - f(color); + f(toHexColor(color)); tinyMCEPopup.close(); } @@ -91,7 +134,7 @@ function showColor(color, name) { document.getElementById("colorname").innerHTML = name; document.getElementById("preview").style.backgroundColor = color; - document.getElementById("color").value = color.toLowerCase(); + document.getElementById("color").value = color.toUpperCase(); } function convertRGBToHex(col) { @@ -153,23 +196,40 @@ function generateWebColors() { if (el.className == 'generated') return; - h += '
         
        - +
        diff --git a/plugins/TinyMCE/js/plugins/template/js/template.js b/plugins/TinyMCE/js/plugins/template/js/template.js index 24045d7311..bc3045d244 100644 --- a/plugins/TinyMCE/js/plugins/template/js/template.js +++ b/plugins/TinyMCE/js/plugins/template/js/template.js @@ -42,7 +42,7 @@ var TemplateDialog = { if (e) { e.style.height = Math.abs(h) + 'px'; - e.style.width = Math.abs(w - 5) + 'px'; + e.style.width = Math.abs(w - 5) + 'px'; } }, diff --git a/plugins/TinyMCE/js/plugins/visualchars/editor_plugin.js b/plugins/TinyMCE/js/plugins/visualchars/editor_plugin.js index 94719f93a1..1a148e8b4f 100644 --- a/plugins/TinyMCE/js/plugins/visualchars/editor_plugin.js +++ b/plugins/TinyMCE/js/plugins/visualchars/editor_plugin.js @@ -1 +1 @@ -(function(){tinymce.create("tinymce.plugins.VisualChars",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceVisualChars",c._toggleVisualChars,c);a.addButton("visualchars",{title:"visualchars.desc",cmd:"mceVisualChars"});a.onBeforeGetContent.add(function(d,e){if(c.state&&e.format!="raw"&&!e.draft){c.state=true;c._toggleVisualChars(false)}})},getInfo:function(){return{longname:"Visual characters",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/visualchars",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_toggleVisualChars:function(m){var p=this,k=p.editor,a,g,j,n=k.getDoc(),o=k.getBody(),l,q=k.selection,e,c,f;p.state=!p.state;k.controlManager.setActive("visualchars",p.state);if(m){f=q.getBookmark()}if(p.state){a=[];tinymce.walk(o,function(b){if(b.nodeType==3&&b.nodeValue&&b.nodeValue.indexOf("\u00a0")!=-1){a.push(b)}},"childNodes");for(g=0;g$1');c=k.dom.create("div",null,l);while(node=c.lastChild){k.dom.insertAfter(node,a[g])}k.dom.remove(a[g])}}else{a=k.dom.select("span.mceItemNbsp",o);for(g=a.length-1;g>=0;g--){k.dom.remove(a[g],1)}}q.moveToBookmark(f)}});tinymce.PluginManager.add("visualchars",tinymce.plugins.VisualChars)})(); \ No newline at end of file +(function(){tinymce.create("tinymce.plugins.VisualChars",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceVisualChars",c._toggleVisualChars,c);a.addButton("visualchars",{title:"visualchars.desc",cmd:"mceVisualChars"});a.onBeforeGetContent.add(function(d,e){if(c.state&&e.format!="raw"&&!e.draft){c.state=true;c._toggleVisualChars(false)}})},getInfo:function(){return{longname:"Visual characters",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/visualchars",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_toggleVisualChars:function(m){var p=this,k=p.editor,a,g,j,n=k.getDoc(),o=k.getBody(),l,q=k.selection,e,c,f;p.state=!p.state;k.controlManager.setActive("visualchars",p.state);if(m){f=q.getBookmark()}if(p.state){a=[];tinymce.walk(o,function(b){if(b.nodeType==3&&b.nodeValue&&b.nodeValue.indexOf("\u00a0")!=-1){a.push(b)}},"childNodes");for(g=0;g$1');c=k.dom.create("div",null,l);while(node=c.lastChild){k.dom.insertAfter(node,a[g])}k.dom.remove(a[g])}}else{a=k.dom.select("span.mceItemNbsp",o);for(g=a.length-1;g>=0;g--){k.dom.remove(a[g],1)}}q.moveToBookmark(f)}});tinymce.PluginManager.add("visualchars",tinymce.plugins.VisualChars)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/visualchars/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/visualchars/editor_plugin_src.js index 35856e26a0..df985905b6 100644 --- a/plugins/TinyMCE/js/plugins/visualchars/editor_plugin_src.js +++ b/plugins/TinyMCE/js/plugins/visualchars/editor_plugin_src.js @@ -59,7 +59,7 @@ for (i = 0; i < nl.length; i++) { nv = nl[i].nodeValue; - nv = nv.replace(/(\u00a0)/g, '$1'); + nv = nv.replace(/(\u00a0)/g, '$1'); div = ed.dom.create('div', null, nv); while (node = div.lastChild) diff --git a/plugins/TinyMCE/js/plugins/wordcount/editor_plugin.js b/plugins/TinyMCE/js/plugins/wordcount/editor_plugin.js index a099e6a8c5..e769d09f6d 100644 --- a/plugins/TinyMCE/js/plugins/wordcount/editor_plugin.js +++ b/plugins/TinyMCE/js/plugins/wordcount/editor_plugin.js @@ -1 +1 @@ -(function(){tinymce.create("tinymce.plugins.WordCount",{block:0,id:null,countre:null,cleanre:null,init:function(a,b){var c=this,d=0;c.countre=a.getParam("wordcount_countregex",/\S\s+/g);c.cleanre=a.getParam("wordcount_cleanregex",/[0-9.(),;:!?%#$¿'"_+=\\\/-]*/g);c.id=a.id+"-word-count";a.onPostRender.add(function(f,e){var g,h;h=f.getParam("wordcount_target_id");if(!h){g=tinymce.DOM.get(f.id+"_path_row");if(g){tinymce.DOM.add(g.parentNode,"div",{style:"float: right"},f.getLang("wordcount.words","Words: ")+'0')}}else{tinymce.DOM.add(h,"span",{},'0')}});a.onInit.add(function(e){e.selection.onSetContent.add(function(){c._count(e)});c._count(e)});a.onSetContent.add(function(e){c._count(e)});a.onKeyUp.add(function(f,g){if(g.keyCode==d){return}if(13==g.keyCode||8==d||46==d){c._count(f)}d=g.keyCode})},_count:function(b){var c=this,a=0;if(c.block){return}c.block=1;setTimeout(function(){var d=b.getContent({format:"raw"});if(d){d=d.replace(/<.[^<>]*?>/g," ").replace(/ | /gi," ");d=d.replace(c.cleanre,"");d.replace(c.countre,function(){a++})}tinymce.DOM.setHTML(c.id,a.toString());setTimeout(function(){c.block=0},2000)},1)},getInfo:function(){return{longname:"Word Count plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/wordcount",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("wordcount",tinymce.plugins.WordCount)})(); \ No newline at end of file +(function(){tinymce.create("tinymce.plugins.WordCount",{block:0,id:null,countre:null,cleanre:null,init:function(a,b){var c=this,d=0;c.countre=a.getParam("wordcount_countregex",/[\w\u2019\'-]+/g);c.cleanre=a.getParam("wordcount_cleanregex",/[0-9.(),;:!?%#$?\'\"_+=\\\/-]*/g);c.id=a.id+"-word-count";a.onPostRender.add(function(f,e){var g,h;h=f.getParam("wordcount_target_id");if(!h){g=tinymce.DOM.get(f.id+"_path_row");if(g){tinymce.DOM.add(g.parentNode,"div",{style:"float: right"},f.getLang("wordcount.words","Words: ")+'0')}}else{tinymce.DOM.add(h,"span",{},'0')}});a.onInit.add(function(e){e.selection.onSetContent.add(function(){c._count(e)});c._count(e)});a.onSetContent.add(function(e){c._count(e)});a.onKeyUp.add(function(f,g){if(g.keyCode==d){return}if(13==g.keyCode||8==d||46==d){c._count(f)}d=g.keyCode})},_getCount:function(c){var a=0;var b=c.getContent({format:"raw"});if(b){b=b.replace(/\.\.\./g," ");b=b.replace(/<.[^<>]*?>/g," ").replace(/ | /gi," ");b=b.replace(/(\w+)(&.+?;)+(\w+)/,"$1$3").replace(/&.+?;/g," ");b=b.replace(this.cleanre,"");var d=b.match(this.countre);if(d){a=d.length}}return a},_count:function(a){var b=this;if(b.block){return}b.block=1;setTimeout(function(){var c=b._getCount(a);tinymce.DOM.setHTML(b.id,c.toString());setTimeout(function(){b.block=0},2000)},1)},getInfo:function(){return{longname:"Word Count plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/wordcount",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("wordcount",tinymce.plugins.WordCount)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/wordcount/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/wordcount/editor_plugin_src.js index 5cb92fa0f0..6c9a3ead27 100644 --- a/plugins/TinyMCE/js/plugins/wordcount/editor_plugin_src.js +++ b/plugins/TinyMCE/js/plugins/wordcount/editor_plugin_src.js @@ -9,7 +9,7 @@ */ (function() { - tinymce.create('tinymce.plugins.WordCount', { + tinymce.create('tinymce.plugins.WordCount', { block : 0, id : null, countre : null, @@ -18,8 +18,8 @@ init : function(ed, url) { var t = this, last = 0; - t.countre = ed.getParam('wordcount_countregex', /\S\s+/g); - t.cleanre = ed.getParam('wordcount_cleanregex', /[0-9.(),;:!?%#$¿'"_+=\\\/-]*/g); + t.countre = ed.getParam('wordcount_countregex', /[\w\u2019\'-]+/g); // u2019 == ’ + t.cleanre = ed.getParam('wordcount_cleanregex', /[0-9.(),;:!?%#$?\'\"_+=\\\/-]*/g); t.id = ed.id + '-word-count'; ed.onPostRender.add(function(ed, cm) { @@ -32,11 +32,12 @@ if (row) tinymce.DOM.add(row.parentNode, 'div', {'style': 'float: right'}, ed.getLang('wordcount.words', 'Words: ') + '0'); - } else + } else { tinymce.DOM.add(id, 'span', {}, '0'); + } }); - ed.onInit.add(function(ed) { + ed.onInit.add(function(ed) { ed.selection.onSetContent.add(function() { t._count(ed); }); @@ -59,8 +60,29 @@ }); }, + _getCount : function(ed) { + var tc = 0; + var tx = ed.getContent({ format: 'raw' }); + + if (tx) { + tx = tx.replace(/\.\.\./g, ' '); // convert ellipses to spaces + tx = tx.replace(/<.[^<>]*?>/g, ' ').replace(/ | /gi, ' '); // remove html tags and space chars + + // deal with html entities + tx = tx.replace(/(\w+)(&.+?;)+(\w+)/, "$1$3").replace(/&.+?;/g, ' '); + tx = tx.replace(this.cleanre, ''); // remove numbers and punctuation + + var wordArray = tx.match(this.countre); + if (wordArray) { + tc = wordArray.length; + } + } + + return tc; + }, + _count : function(ed) { - var t = this, tc = 0; + var t = this; // Keep multiple calls from happening at the same time if (t.block) @@ -69,21 +91,15 @@ t.block = 1; setTimeout(function() { - var tx = ed.getContent({format : 'raw'}); + var tc = t._getCount(ed); - if (tx) { - tx = tx.replace(/<.[^<>]*?>/g, ' ').replace(/ | /gi, ' '); // remove html tags and space chars - tx = tx.replace(t.cleanre, ''); // remove numbers and punctuation - tx.replace(t.countre, function() {tc++;}); // count the words - } + tinymce.DOM.setHTML(t.id, tc.toString()); - tinymce.DOM.setHTML(t.id, tc.toString()); - - setTimeout(function() {t.block = 0;}, 2000); + setTimeout(function() {t.block = 0;}, 2000); }, 1); }, - getInfo: function() { + getInfo: function() { return { longname : 'Word Count plugin', author : 'Moxiecode Systems AB', @@ -91,8 +107,8 @@ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/wordcount', version : tinymce.majorVersion + "." + tinymce.minorVersion }; - } - }); + } + }); - tinymce.PluginManager.add('wordcount', tinymce.plugins.WordCount); + tinymce.PluginManager.add('wordcount', tinymce.plugins.WordCount); })(); diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/abbr.htm b/plugins/TinyMCE/js/plugins/xhtmlxtras/abbr.htm index 3aeac0deba..30a894f7c3 100644 --- a/plugins/TinyMCE/js/plugins/xhtmlxtras/abbr.htm +++ b/plugins/TinyMCE/js/plugins/xhtmlxtras/abbr.htm @@ -10,11 +10,12 @@ - + + @@ -23,7 +24,7 @@
        {#xhtmlxtras_dlg.fieldset_attrib_tab} -
         
        +
        @@ -41,7 +42,7 @@ - + @@ -67,7 +68,7 @@
        {#xhtmlxtras_dlg.fieldset_events_tab} -
        :
        ::
        +
        diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/acronym.htm b/plugins/TinyMCE/js/plugins/xhtmlxtras/acronym.htm index 31ee7b70f3..c109345928 100644 --- a/plugins/TinyMCE/js/plugins/xhtmlxtras/acronym.htm +++ b/plugins/TinyMCE/js/plugins/xhtmlxtras/acronym.htm @@ -10,11 +10,12 @@ - + + @@ -23,7 +24,7 @@
        {#xhtmlxtras_dlg.fieldset_attrib_tab} -
        :
        +
        @@ -41,7 +42,7 @@ - + @@ -67,7 +68,7 @@
        {#xhtmlxtras_dlg.fieldset_events_tab} -
        :
        ::
        +
        diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/attributes.htm b/plugins/TinyMCE/js/plugins/xhtmlxtras/attributes.htm index 17054da3ed..e8d606a340 100644 --- a/plugins/TinyMCE/js/plugins/xhtmlxtras/attributes.htm +++ b/plugins/TinyMCE/js/plugins/xhtmlxtras/attributes.htm @@ -9,12 +9,13 @@ - + + @@ -22,7 +23,7 @@
        {#xhtmlxtras_dlg.attribute_attrib_tab} -
        :
        +
        @@ -75,7 +76,7 @@
        {#xhtmlxtras_dlg.attribute_events_tab} -
        :
        +
        diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/cite.htm b/plugins/TinyMCE/js/plugins/xhtmlxtras/cite.htm index d0a3e3a8e5..0ac6bdb667 100644 --- a/plugins/TinyMCE/js/plugins/xhtmlxtras/cite.htm +++ b/plugins/TinyMCE/js/plugins/xhtmlxtras/cite.htm @@ -10,11 +10,12 @@ - + + @@ -23,7 +24,7 @@
        {#xhtmlxtras_dlg.fieldset_attrib_tab} -
        :
        +
        @@ -67,7 +68,7 @@
        {#xhtmlxtras_dlg.fieldset_events_tab} -
        :
        +
        diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/del.htm b/plugins/TinyMCE/js/plugins/xhtmlxtras/del.htm index 8b07fa8429..5f667510f5 100644 --- a/plugins/TinyMCE/js/plugins/xhtmlxtras/del.htm +++ b/plugins/TinyMCE/js/plugins/xhtmlxtras/del.htm @@ -10,11 +10,12 @@ - + + @@ -23,14 +24,14 @@
        {#xhtmlxtras_dlg.fieldset_general_tab} -
        :
        +
        @@ -43,7 +44,7 @@
        {#xhtmlxtras_dlg.fieldset_attrib_tab} -
        : - +
        - +
        +
        @@ -61,7 +62,7 @@ - + @@ -87,7 +88,7 @@
        {#xhtmlxtras_dlg.fieldset_events_tab} -
        :
        ::
        +
        diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/editor_plugin.js b/plugins/TinyMCE/js/plugins/xhtmlxtras/editor_plugin.js index a9393ad6db..9b98a5154b 100644 --- a/plugins/TinyMCE/js/plugins/xhtmlxtras/editor_plugin.js +++ b/plugins/TinyMCE/js/plugins/xhtmlxtras/editor_plugin.js @@ -1 +1 @@ -(function(){tinymce.create("tinymce.plugins.XHTMLXtrasPlugin",{init:function(a,b){a.addCommand("mceCite",function(){a.windowManager.open({file:b+"/cite.htm",width:350+parseInt(a.getLang("xhtmlxtras.cite_delta_width",0)),height:250+parseInt(a.getLang("xhtmlxtras.cite_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceAcronym",function(){a.windowManager.open({file:b+"/acronym.htm",width:350+parseInt(a.getLang("xhtmlxtras.acronym_delta_width",0)),height:250+parseInt(a.getLang("xhtmlxtras.acronym_delta_width",0)),inline:1},{plugin_url:b})});a.addCommand("mceAbbr",function(){a.windowManager.open({file:b+"/abbr.htm",width:350+parseInt(a.getLang("xhtmlxtras.abbr_delta_width",0)),height:250+parseInt(a.getLang("xhtmlxtras.abbr_delta_width",0)),inline:1},{plugin_url:b})});a.addCommand("mceDel",function(){a.windowManager.open({file:b+"/del.htm",width:340+parseInt(a.getLang("xhtmlxtras.del_delta_width",0)),height:310+parseInt(a.getLang("xhtmlxtras.del_delta_width",0)),inline:1},{plugin_url:b})});a.addCommand("mceIns",function(){a.windowManager.open({file:b+"/ins.htm",width:340+parseInt(a.getLang("xhtmlxtras.ins_delta_width",0)),height:310+parseInt(a.getLang("xhtmlxtras.ins_delta_width",0)),inline:1},{plugin_url:b})});a.addCommand("mceAttributes",function(){a.windowManager.open({file:b+"/attributes.htm",width:380,height:370,inline:1},{plugin_url:b})});a.addButton("cite",{title:"xhtmlxtras.cite_desc",cmd:"mceCite"});a.addButton("acronym",{title:"xhtmlxtras.acronym_desc",cmd:"mceAcronym"});a.addButton("abbr",{title:"xhtmlxtras.abbr_desc",cmd:"mceAbbr"});a.addButton("del",{title:"xhtmlxtras.del_desc",cmd:"mceDel"});a.addButton("ins",{title:"xhtmlxtras.ins_desc",cmd:"mceIns"});a.addButton("attribs",{title:"xhtmlxtras.attribs_desc",cmd:"mceAttributes"});a.onNodeChange.add(function(d,c,f,e){f=d.dom.getParent(f,"CITE,ACRONYM,ABBR,DEL,INS");c.setDisabled("cite",e);c.setDisabled("acronym",e);c.setDisabled("abbr",e);c.setDisabled("del",e);c.setDisabled("ins",e);c.setDisabled("attribs",f&&f.nodeName=="BODY");c.setActive("cite",0);c.setActive("acronym",0);c.setActive("abbr",0);c.setActive("del",0);c.setActive("ins",0);if(f){do{c.setDisabled(f.nodeName.toLowerCase(),0);c.setActive(f.nodeName.toLowerCase(),1)}while(f=f.parentNode)}});a.onPreInit.add(function(){a.dom.create("abbr")})},getInfo:function(){return{longname:"XHTML Xtras Plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/xhtmlxtras",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("xhtmlxtras",tinymce.plugins.XHTMLXtrasPlugin)})(); \ No newline at end of file +(function(){tinymce.create("tinymce.plugins.XHTMLXtrasPlugin",{init:function(a,b){a.addCommand("mceCite",function(){a.windowManager.open({file:b+"/cite.htm",width:350+parseInt(a.getLang("xhtmlxtras.cite_delta_width",0)),height:250+parseInt(a.getLang("xhtmlxtras.cite_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceAcronym",function(){a.windowManager.open({file:b+"/acronym.htm",width:350+parseInt(a.getLang("xhtmlxtras.acronym_delta_width",0)),height:250+parseInt(a.getLang("xhtmlxtras.acronym_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceAbbr",function(){a.windowManager.open({file:b+"/abbr.htm",width:350+parseInt(a.getLang("xhtmlxtras.abbr_delta_width",0)),height:250+parseInt(a.getLang("xhtmlxtras.abbr_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceDel",function(){a.windowManager.open({file:b+"/del.htm",width:340+parseInt(a.getLang("xhtmlxtras.del_delta_width",0)),height:310+parseInt(a.getLang("xhtmlxtras.del_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceIns",function(){a.windowManager.open({file:b+"/ins.htm",width:340+parseInt(a.getLang("xhtmlxtras.ins_delta_width",0)),height:310+parseInt(a.getLang("xhtmlxtras.ins_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceAttributes",function(){a.windowManager.open({file:b+"/attributes.htm",width:380+parseInt(a.getLang("xhtmlxtras.attr_delta_width",0)),height:370+parseInt(a.getLang("xhtmlxtras.attr_delta_height",0)),inline:1},{plugin_url:b})});a.addButton("cite",{title:"xhtmlxtras.cite_desc",cmd:"mceCite"});a.addButton("acronym",{title:"xhtmlxtras.acronym_desc",cmd:"mceAcronym"});a.addButton("abbr",{title:"xhtmlxtras.abbr_desc",cmd:"mceAbbr"});a.addButton("del",{title:"xhtmlxtras.del_desc",cmd:"mceDel"});a.addButton("ins",{title:"xhtmlxtras.ins_desc",cmd:"mceIns"});a.addButton("attribs",{title:"xhtmlxtras.attribs_desc",cmd:"mceAttributes"});a.onNodeChange.add(function(d,c,f,e){f=d.dom.getParent(f,"CITE,ACRONYM,ABBR,DEL,INS");c.setDisabled("cite",e);c.setDisabled("acronym",e);c.setDisabled("abbr",e);c.setDisabled("del",e);c.setDisabled("ins",e);c.setDisabled("attribs",f&&f.nodeName=="BODY");c.setActive("cite",0);c.setActive("acronym",0);c.setActive("abbr",0);c.setActive("del",0);c.setActive("ins",0);if(f){do{c.setDisabled(f.nodeName.toLowerCase(),0);c.setActive(f.nodeName.toLowerCase(),1)}while(f=f.parentNode)}});a.onPreInit.add(function(){a.dom.create("abbr")})},getInfo:function(){return{longname:"XHTML Xtras Plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/xhtmlxtras",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("xhtmlxtras",tinymce.plugins.XHTMLXtrasPlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/xhtmlxtras/editor_plugin_src.js index 5f9d9bd50b..f24057211c 100644 --- a/plugins/TinyMCE/js/plugins/xhtmlxtras/editor_plugin_src.js +++ b/plugins/TinyMCE/js/plugins/xhtmlxtras/editor_plugin_src.js @@ -27,7 +27,7 @@ ed.windowManager.open({ file : url + '/acronym.htm', width : 350 + parseInt(ed.getLang('xhtmlxtras.acronym_delta_width', 0)), - height : 250 + parseInt(ed.getLang('xhtmlxtras.acronym_delta_width', 0)), + height : 250 + parseInt(ed.getLang('xhtmlxtras.acronym_delta_height', 0)), inline : 1 }, { plugin_url : url @@ -38,7 +38,7 @@ ed.windowManager.open({ file : url + '/abbr.htm', width : 350 + parseInt(ed.getLang('xhtmlxtras.abbr_delta_width', 0)), - height : 250 + parseInt(ed.getLang('xhtmlxtras.abbr_delta_width', 0)), + height : 250 + parseInt(ed.getLang('xhtmlxtras.abbr_delta_height', 0)), inline : 1 }, { plugin_url : url @@ -49,7 +49,7 @@ ed.windowManager.open({ file : url + '/del.htm', width : 340 + parseInt(ed.getLang('xhtmlxtras.del_delta_width', 0)), - height : 310 + parseInt(ed.getLang('xhtmlxtras.del_delta_width', 0)), + height : 310 + parseInt(ed.getLang('xhtmlxtras.del_delta_height', 0)), inline : 1 }, { plugin_url : url @@ -60,7 +60,7 @@ ed.windowManager.open({ file : url + '/ins.htm', width : 340 + parseInt(ed.getLang('xhtmlxtras.ins_delta_width', 0)), - height : 310 + parseInt(ed.getLang('xhtmlxtras.ins_delta_width', 0)), + height : 310 + parseInt(ed.getLang('xhtmlxtras.ins_delta_height', 0)), inline : 1 }, { plugin_url : url @@ -70,8 +70,8 @@ ed.addCommand('mceAttributes', function() { ed.windowManager.open({ file : url + '/attributes.htm', - width : 380, - height : 370, + width : 380 + parseInt(ed.getLang('xhtmlxtras.attr_delta_width', 0)), + height : 370 + parseInt(ed.getLang('xhtmlxtras.attr_delta_height', 0)), inline : 1 }, { plugin_url : url diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/ins.htm b/plugins/TinyMCE/js/plugins/xhtmlxtras/ins.htm index 6c5470cfcc..d001ac7c4d 100644 --- a/plugins/TinyMCE/js/plugins/xhtmlxtras/ins.htm +++ b/plugins/TinyMCE/js/plugins/xhtmlxtras/ins.htm @@ -10,11 +10,12 @@ - + + @@ -23,19 +24,19 @@
        {#xhtmlxtras_dlg.fieldset_general_tab} -
        :
        +
        - + @@ -43,9 +44,9 @@
        {#xhtmlxtras_dlg.fieldset_attrib_tab} -
        : - +
        - +
        :
        +
        - + @@ -61,7 +62,7 @@ - + @@ -87,7 +88,7 @@
        {#xhtmlxtras_dlg.fieldset_events_tab} -
        ::
        ::
        +
        diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/js/attributes.js b/plugins/TinyMCE/js/plugins/xhtmlxtras/js/attributes.js index d62a219e6b..9c99995adb 100644 --- a/plugins/TinyMCE/js/plugins/xhtmlxtras/js/attributes.js +++ b/plugins/TinyMCE/js/plugins/xhtmlxtras/js/attributes.js @@ -53,7 +53,6 @@ function insertAction() { var inst = tinyMCEPopup.editor; var elm = inst.selection.getNode(); - tinyMCEPopup.execCommand("mceBeginUndoLevel"); setAllAttribs(elm); tinyMCEPopup.execCommand("mceEndUndoLevel"); tinyMCEPopup.close(); @@ -72,21 +71,7 @@ function setAttrib(elm, attrib, value) { value = valueElm.value; } - if (value != "") { - dom.setAttrib(elm, attrib.toLowerCase(), value); - - if (attrib == "style") - attrib = "style.cssText"; - - if (attrib.substring(0, 2) == 'on') - value = 'return true;' + value; - - if (attrib == "class") - attrib = "className"; - - elm[attrib]=value; - } else - elm.removeAttribute(attrib); + dom.setAttrib(elm, attrib.toLowerCase(), value); } function setAllAttribs(elm) { diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/js/del.js b/plugins/TinyMCE/js/plugins/xhtmlxtras/js/del.js index 9e5d8c5717..1f957dc786 100644 --- a/plugins/TinyMCE/js/plugins/xhtmlxtras/js/del.js +++ b/plugins/TinyMCE/js/plugins/xhtmlxtras/js/del.js @@ -21,17 +21,17 @@ function setElementAttribs(elm) { setAllCommonAttribs(elm); setAttrib(elm, 'datetime'); setAttrib(elm, 'cite'); + elm.removeAttribute('data-mce-new'); } function insertDel() { var elm = tinyMCEPopup.editor.dom.getParent(SXE.focusElement, 'DEL'); - tinyMCEPopup.execCommand('mceBeginUndoLevel'); if (elm == null) { var s = SXE.inst.selection.getContent(); if(s.length > 0) { insertInlineElement('del'); - var elementArray = tinymce.grep(SXE.inst.dom.select('del'), function(n) {return n.id == '#sxe_temp_del#';}); + var elementArray = SXE.inst.dom.select('del[data-mce-new]'); for (var i=0; i 0) { @@ -165,11 +164,11 @@ SXE.insertElement = function(element_name) { for (var i=0; i 0) { - insertInlineElement('INS'); - var elementArray = tinymce.grep(SXE.inst.dom.select('ins'), function(n) {return n.id == '#sxe_temp_ins#';}); + insertInlineElement('ins'); + var elementArray = SXE.inst.dom.select('ins[data-mce-new]'); for (var i=0; i
        :
        +
        - + - - + +
        {#advanced_dlg.anchor_title}{#advanced_dlg.anchor_title}
        {#advanced_dlg.anchor_name}:
        diff --git a/plugins/TinyMCE/js/themes/advanced/charmap.htm b/plugins/TinyMCE/js/themes/advanced/charmap.htm index 3991b8141b..2c3b3f27bd 100644 --- a/plugins/TinyMCE/js/themes/advanced/charmap.htm +++ b/plugins/TinyMCE/js/themes/advanced/charmap.htm @@ -6,47 +6,46 @@ - - - - - -
        {#advanced_dlg.charmap_title}
        + + + + + + - - - - - + + + + + +
        - - - - - - - - -
         
         
        -
        - - - - - - - - - - - - - - - - -
        HTML-Code
         
         
        NUM-Code
         
        -
        + + + + + + + +
         
         
        +
        + + + + + + + + + + + + + + + + +
         
         
         
        +
        - diff --git a/plugins/TinyMCE/js/themes/advanced/color_picker.htm b/plugins/TinyMCE/js/themes/advanced/color_picker.htm index 096e7550c3..ad1bb0f6cc 100644 --- a/plugins/TinyMCE/js/themes/advanced/color_picker.htm +++ b/plugins/TinyMCE/js/themes/advanced/color_picker.htm @@ -6,13 +6,14 @@ - + + @@ -34,7 +35,7 @@
        - {#advanced_dlg.colorpicker_palette_title} + {#advanced_dlg.colorpicker_palette_title}
        @@ -44,9 +45,9 @@
        -
        - {#advanced_dlg.colorpicker_named_title} -
        +
        + {#advanced_dlg.colorpicker_named_title} +
        @@ -65,7 +66,7 @@
        - +
        diff --git a/plugins/TinyMCE/js/themes/advanced/editor_template.js b/plugins/TinyMCE/js/themes/advanced/editor_template.js index 4c433127f9..57e7184a83 100644 --- a/plugins/TinyMCE/js/themes/advanced/editor_template.js +++ b/plugins/TinyMCE/js/themes/advanced/editor_template.js @@ -1 +1 @@ -(function(e){var d=e.DOM,b=e.dom.Event,h=e.extend,f=e.each,a=e.util.Cookie,g,c=e.explode;e.ThemeManager.requireLangPack("advanced");e.create("tinymce.themes.AdvancedTheme",{sizes:[8,10,12,14,18,24,36],controls:{bold:["bold_desc","Bold"],italic:["italic_desc","Italic"],underline:["underline_desc","Underline"],strikethrough:["striketrough_desc","Strikethrough"],justifyleft:["justifyleft_desc","JustifyLeft"],justifycenter:["justifycenter_desc","JustifyCenter"],justifyright:["justifyright_desc","JustifyRight"],justifyfull:["justifyfull_desc","JustifyFull"],bullist:["bullist_desc","InsertUnorderedList"],numlist:["numlist_desc","InsertOrderedList"],outdent:["outdent_desc","Outdent"],indent:["indent_desc","Indent"],cut:["cut_desc","Cut"],copy:["copy_desc","Copy"],paste:["paste_desc","Paste"],undo:["undo_desc","Undo"],redo:["redo_desc","Redo"],link:["link_desc","mceLink"],unlink:["unlink_desc","unlink"],image:["image_desc","mceImage"],cleanup:["cleanup_desc","mceCleanup"],help:["help_desc","mceHelp"],code:["code_desc","mceCodeEditor"],hr:["hr_desc","InsertHorizontalRule"],removeformat:["removeformat_desc","RemoveFormat"],sub:["sub_desc","subscript"],sup:["sup_desc","superscript"],forecolor:["forecolor_desc","ForeColor"],forecolorpicker:["forecolor_desc","mceForeColor"],backcolor:["backcolor_desc","HiliteColor"],backcolorpicker:["backcolor_desc","mceBackColor"],charmap:["charmap_desc","mceCharMap"],visualaid:["visualaid_desc","mceToggleVisualAid"],anchor:["anchor_desc","mceInsertAnchor"],newdocument:["newdocument_desc","mceNewDocument"],blockquote:["blockquote_desc","mceBlockQuote"]},stateControls:["bold","italic","underline","strikethrough","bullist","numlist","justifyleft","justifycenter","justifyright","justifyfull","sub","sup","blockquote"],init:function(j,k){var l=this,m,i,n;l.editor=j;l.url=k;l.onResolveName=new e.util.Dispatcher(this);l.settings=m=h({theme_advanced_path:true,theme_advanced_toolbar_location:"bottom",theme_advanced_buttons1:"bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect",theme_advanced_buttons2:"bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code",theme_advanced_buttons3:"hr,removeformat,visualaid,|,sub,sup,|,charmap",theme_advanced_blockformats:"p,address,pre,h1,h2,h3,h4,h5,h6",theme_advanced_toolbar_align:"center",theme_advanced_fonts:"Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats",theme_advanced_more_colors:1,theme_advanced_row_height:23,theme_advanced_resize_horizontal:1,theme_advanced_resizing_use_cookie:1,theme_advanced_font_sizes:"1,2,3,4,5,6,7",readonly:j.settings.readonly},j.settings);if(!m.font_size_style_values){m.font_size_style_values="8pt,10pt,12pt,14pt,18pt,24pt,36pt"}if(e.is(m.theme_advanced_font_sizes,"string")){m.font_size_style_values=e.explode(m.font_size_style_values);m.font_size_classes=e.explode(m.font_size_classes||"");n={};j.settings.theme_advanced_font_sizes=m.theme_advanced_font_sizes;f(j.getParam("theme_advanced_font_sizes","","hash"),function(q,p){var o;if(p==q&&q>=1&&q<=7){p=q+" ("+l.sizes[q-1]+"pt)";o=m.font_size_classes[q-1];q=m.font_size_style_values[q-1]||(l.sizes[q-1]+"pt")}if(/^\s*\./.test(q)){o=q.replace(/\./g,"")}n[p]=o?{"class":o}:{fontSize:q}});m.theme_advanced_font_sizes=n}if((i=m.theme_advanced_path_location)&&i!="none"){m.theme_advanced_statusbar_location=m.theme_advanced_path_location}if(m.theme_advanced_statusbar_location=="none"){m.theme_advanced_statusbar_location=0}j.onInit.add(function(){if(!j.settings.readonly){j.onNodeChange.add(l._nodeChanged,l)}if(j.settings.content_css!==false){j.dom.loadCSS(j.baseURI.toAbsolute("themes/advanced/skins/"+j.settings.skin+"/content.css"))}});j.onSetProgressState.add(function(q,o,r){var s,t=q.id,p;if(o){l.progressTimer=setTimeout(function(){s=q.getContainer();s=s.insertBefore(d.create("DIV",{style:"position:relative"}),s.firstChild);p=d.get(q.id+"_tbl");d.add(s,"div",{id:t+"_blocker","class":"mceBlocker",style:{width:p.clientWidth+2,height:p.clientHeight+2}});d.add(s,"div",{id:t+"_progress","class":"mceProgress",style:{left:p.clientWidth/2,top:p.clientHeight/2}})},r||0)}else{d.remove(t+"_blocker");d.remove(t+"_progress");clearTimeout(l.progressTimer)}});d.loadCSS(m.editor_css?j.documentBaseURI.toAbsolute(m.editor_css):k+"/skins/"+j.settings.skin+"/ui.css");if(m.skin_variant){d.loadCSS(k+"/skins/"+j.settings.skin+"/ui_"+m.skin_variant+".css")}},createControl:function(l,i){var j,k;if(k=i.createControl(l)){return k}switch(l){case"styleselect":return this._createStyleSelect();case"formatselect":return this._createBlockFormats();case"fontselect":return this._createFontSelect();case"fontsizeselect":return this._createFontSizeSelect();case"forecolor":return this._createForeColorMenu();case"backcolor":return this._createBackColorMenu()}if((j=this.controls[l])){return i.createButton(l,{title:"advanced."+j[0],cmd:j[1],ui:j[2],value:j[3]})}},execCommand:function(k,j,l){var i=this["_"+k];if(i){i.call(this,j,l);return true}return false},_importClasses:function(k){var i=this.editor,j=i.controlManager.get("styleselect");if(j.getLength()==0){f(i.dom.getClasses(),function(n,l){var m="style_"+l;i.formatter.register(m,{inline:"span",attributes:{"class":n["class"]},selector:"*"});j.add(n["class"],m)})}},_createStyleSelect:function(m){var k=this,i=k.editor,j=i.controlManager,l;l=j.createListBox("styleselect",{title:"advanced.style_select",onselect:function(o){var p,n=[];f(l.items,function(q){n.push(q.value)});i.focus();i.undoManager.add();p=i.formatter.matchAll(n);if(!o||p[0]==o){i.formatter.remove(p[0])}else{i.formatter.apply(o)}i.undoManager.add();i.nodeChanged();return false}});i.onInit.add(function(){var o=0,n=i.getParam("style_formats");if(n){f(n,function(p){var q,r=0;f(p,function(){r++});if(r>1){q=p.name=p.name||"style_"+(o++);i.formatter.register(q,p);l.add(p.title,q)}else{l.add(p.title)}})}else{f(i.getParam("theme_advanced_styles","","hash"),function(r,q){var p;if(r){p="style_"+(o++);i.formatter.register(p,{inline:"span",classes:r,selector:"*"});l.add(k.editor.translate(q),p)}})}});if(l.getLength()==0){l.onPostRender.add(function(o,p){if(!l.NativeListBox){b.add(p.id+"_text","focus",k._importClasses,k);b.add(p.id+"_text","mousedown",k._importClasses,k);b.add(p.id+"_open","focus",k._importClasses,k);b.add(p.id+"_open","mousedown",k._importClasses,k)}else{b.add(p.id,"focus",k._importClasses,k)}})}return l},_createFontSelect:function(){var k,j=this,i=j.editor;k=i.controlManager.createListBox("fontselect",{title:"advanced.fontdefault",onselect:function(l){var m=k.items[k.selectedIndex];if(!l&&m){i.execCommand("FontName",false,m.value);return}i.execCommand("FontName",false,l);k.select(function(n){return l==n});return false}});if(k){f(i.getParam("theme_advanced_fonts",j.settings.theme_advanced_fonts,"hash"),function(m,l){k.add(i.translate(l),m,{style:m.indexOf("dings")==-1?"font-family:"+m:""})})}return k},_createFontSizeSelect:function(){var m=this,k=m.editor,n,l=0,j=[];n=k.controlManager.createListBox("fontsizeselect",{title:"advanced.font_size",onselect:function(i){var o=n.items[n.selectedIndex];if(!i&&o){o=o.value;if(o["class"]){k.formatter.toggle("fontsize_class",{value:o["class"]});k.undoManager.add();k.nodeChanged()}else{k.execCommand("FontSize",false,o.fontSize)}return}if(i["class"]){k.focus();k.undoManager.add();k.formatter.toggle("fontsize_class",{value:i["class"]});k.undoManager.add();k.nodeChanged()}else{k.execCommand("FontSize",false,i.fontSize)}n.select(function(p){return i==p});return false}});if(n){f(m.settings.theme_advanced_font_sizes,function(o,i){var p=o.fontSize;if(p>=1&&p<=7){p=m.sizes[parseInt(p)-1]+"pt"}n.add(i,o,{style:"font-size:"+p,"class":"mceFontSize"+(l++)+(" "+(o["class"]||""))})})}return n},_createBlockFormats:function(){var k,i={p:"advanced.paragraph",address:"advanced.address",pre:"advanced.pre",h1:"advanced.h1",h2:"advanced.h2",h3:"advanced.h3",h4:"advanced.h4",h5:"advanced.h5",h6:"advanced.h6",div:"advanced.div",blockquote:"advanced.blockquote",code:"advanced.code",dt:"advanced.dt",dd:"advanced.dd",samp:"advanced.samp"},j=this;k=j.editor.controlManager.createListBox("formatselect",{title:"advanced.block",cmd:"FormatBlock"});if(k){f(j.editor.getParam("theme_advanced_blockformats",j.settings.theme_advanced_blockformats,"hash"),function(m,l){k.add(j.editor.translate(l!=m?l:i[m]),m,{"class":"mce_formatPreview mce_"+m})})}return k},_createForeColorMenu:function(){var m,j=this,k=j.settings,l={},i;if(k.theme_advanced_more_colors){l.more_colors_func=function(){j._mceColorPicker(0,{color:m.value,func:function(n){m.setColor(n)}})}}if(i=k.theme_advanced_text_colors){l.colors=i}if(k.theme_advanced_default_foreground_color){l.default_color=k.theme_advanced_default_foreground_color}l.title="advanced.forecolor_desc";l.cmd="ForeColor";l.scope=this;m=j.editor.controlManager.createColorSplitButton("forecolor",l);return m},_createBackColorMenu:function(){var m,j=this,k=j.settings,l={},i;if(k.theme_advanced_more_colors){l.more_colors_func=function(){j._mceColorPicker(0,{color:m.value,func:function(n){m.setColor(n)}})}}if(i=k.theme_advanced_background_colors){l.colors=i}if(k.theme_advanced_default_background_color){l.default_color=k.theme_advanced_default_background_color}l.title="advanced.backcolor_desc";l.cmd="HiliteColor";l.scope=this;m=j.editor.controlManager.createColorSplitButton("backcolor",l);return m},renderUI:function(k){var m,l,q,v=this,r=v.editor,w=v.settings,u,j,i;m=j=d.create("span",{id:r.id+"_parent","class":"mceEditor "+r.settings.skin+"Skin"+(w.skin_variant?" "+r.settings.skin+"Skin"+v._ufirst(w.skin_variant):"")});if(!d.boxModel){m=d.add(m,"div",{"class":"mceOldBoxModel"})}m=u=d.add(m,"table",{id:r.id+"_tbl","class":"mceLayout",cellSpacing:0,cellPadding:0});m=q=d.add(m,"tbody");switch((w.theme_advanced_layout_manager||"").toLowerCase()){case"rowlayout":l=v._rowLayout(w,q,k);break;case"customlayout":l=r.execCallback("theme_advanced_custom_layout",w,q,k,j);break;default:l=v._simpleLayout(w,q,k,j)}m=k.targetNode;i=d.stdMode?u.getElementsByTagName("tr"):u.rows;d.addClass(i[0],"mceFirst");d.addClass(i[i.length-1],"mceLast");f(d.select("tr",q),function(o){d.addClass(o.firstChild,"mceFirst");d.addClass(o.childNodes[o.childNodes.length-1],"mceLast")});if(d.get(w.theme_advanced_toolbar_container)){d.get(w.theme_advanced_toolbar_container).appendChild(j)}else{d.insertAfter(j,m)}b.add(r.id+"_path_row","click",function(n){n=n.target;if(n.nodeName=="A"){v._sel(n.className.replace(/^.*mcePath_([0-9]+).*$/,"$1"));return b.cancel(n)}});if(!r.getParam("accessibility_focus")){b.add(d.add(j,"a",{href:"#"},""),"focus",function(){tinyMCE.get(r.id).focus()})}if(w.theme_advanced_toolbar_location=="external"){k.deltaHeight=0}v.deltaHeight=k.deltaHeight;k.targetNode=null;return{iframeContainer:l,editorContainer:r.id+"_parent",sizeContainer:u,deltaHeight:k.deltaHeight}},getInfo:function(){return{longname:"Advanced theme",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",version:e.majorVersion+"."+e.minorVersion}},resizeBy:function(i,j){var k=d.get(this.editor.id+"_tbl");this.resizeTo(k.clientWidth+i,k.clientHeight+j)},resizeTo:function(i,l){var j=this.editor,k=this.settings,m=d.get(j.id+"_tbl"),n=d.get(j.id+"_ifr");i=Math.max(k.theme_advanced_resizing_min_width||100,i);l=Math.max(k.theme_advanced_resizing_min_height||100,l);i=Math.min(k.theme_advanced_resizing_max_width||65535,i);l=Math.min(k.theme_advanced_resizing_max_height||65535,l);d.setStyle(m,"height","");d.setStyle(n,"height",l);if(k.theme_advanced_resize_horizontal){d.setStyle(m,"width","");d.setStyle(n,"width",i);if(i"))}q.push(d.createHTML("a",{href:"#",accesskey:"q",title:r.getLang("advanced.toolbar_focus")},""));for(p=1;(y=A["theme_advanced_buttons"+p]);p++){m=j.createToolbar("toolbar"+p,{"class":"mceToolbarRow"+p});if(A["theme_advanced_buttons"+p+"_add"]){y+=","+A["theme_advanced_buttons"+p+"_add"]}if(A["theme_advanced_buttons"+p+"_add_before"]){y=A["theme_advanced_buttons"+p+"_add_before"]+","+y}z._addControls(y,m);q.push(m.renderHTML());k.deltaHeight-=A.theme_advanced_row_height}q.push(d.createHTML("a",{href:"#",accesskey:"z",title:r.getLang("advanced.toolbar_focus"),onfocus:"tinyMCE.getInstanceById('"+r.id+"').focus();"},""));d.setHTML(l,q.join(""))},_addStatusBar:function(m,j){var k,v=this,p=v.editor,w=v.settings,i,q,u,l;k=d.add(m,"tr");k=l=d.add(k,"td",{"class":"mceStatusbar"});k=d.add(k,"div",{id:p.id+"_path_row"},w.theme_advanced_path?p.translate("advanced.path")+": ":" ");d.add(k,"a",{href:"#",accesskey:"x"});if(w.theme_advanced_resizing){d.add(l,"a",{id:p.id+"_resize",href:"javascript:;",onclick:"return false;","class":"mceResize"});if(w.theme_advanced_resizing_use_cookie){p.onPostRender.add(function(){var n=a.getHash("TinyMCE_"+p.id+"_size"),r=d.get(p.id+"_tbl");if(!n){return}v.resizeTo(n.cw,n.ch)})}p.onPostRender.add(function(){b.add(p.id+"_resize","mousedown",function(D){var t,r,s,o,C,z,A,F,n,E,x;function y(G){n=A+(G.screenX-C);E=F+(G.screenY-z);v.resizeTo(n,E)}function B(G){b.remove(d.doc,"mousemove",t);b.remove(p.getDoc(),"mousemove",r);b.remove(d.doc,"mouseup",s);b.remove(p.getDoc(),"mouseup",o);if(w.theme_advanced_resizing_use_cookie){a.setHash("TinyMCE_"+p.id+"_size",{cw:n,ch:E})}}D.preventDefault();C=D.screenX;z=D.screenY;x=d.get(v.editor.id+"_ifr");A=n=x.clientWidth;F=E=x.clientHeight;t=b.add(d.doc,"mousemove",y);r=b.add(p.getDoc(),"mousemove",y);s=b.add(d.doc,"mouseup",B);o=b.add(p.getDoc(),"mouseup",B)})})}j.deltaHeight-=21;k=m=null},_nodeChanged:function(r,z,l,x,j){var C=this,i,y=0,B,u,D=C.settings,A,k,w,m,q;e.each(C.stateControls,function(n){z.setActive(n,r.queryCommandState(C.controls[n][1]))});function o(p){var s,n=j.parents,t=p;if(typeof(p)=="string"){t=function(v){return v.nodeName==p}}for(s=0;s=1&&q<=7){p=q+" ("+l.sizes[q-1]+"pt)";o=m.font_size_classes[q-1];q=m.font_size_style_values[q-1]||(l.sizes[q-1]+"pt")}if(/^\s*\./.test(q)){o=q.replace(/\./g,"")}n[p]=o?{"class":o}:{fontSize:q}});m.theme_advanced_font_sizes=n}if((i=m.theme_advanced_path_location)&&i!="none"){m.theme_advanced_statusbar_location=m.theme_advanced_path_location}if(m.theme_advanced_statusbar_location=="none"){m.theme_advanced_statusbar_location=0}if(j.settings.content_css!==false){j.contentCSS.push(j.baseURI.toAbsolute(k+"/skins/"+j.settings.skin+"/content.css"))}j.onInit.add(function(){if(!j.settings.readonly){j.onNodeChange.add(l._nodeChanged,l);j.onKeyUp.add(l._updateUndoStatus,l);j.onMouseUp.add(l._updateUndoStatus,l);j.dom.bind(j.dom.getRoot(),"dragend",function(){l._updateUndoStatus(j)})}});j.onSetProgressState.add(function(q,o,r){var s,t=q.id,p;if(o){l.progressTimer=setTimeout(function(){s=q.getContainer();s=s.insertBefore(d.create("DIV",{style:"position:relative"}),s.firstChild);p=d.get(q.id+"_tbl");d.add(s,"div",{id:t+"_blocker","class":"mceBlocker",style:{width:p.clientWidth+2,height:p.clientHeight+2}});d.add(s,"div",{id:t+"_progress","class":"mceProgress",style:{left:p.clientWidth/2,top:p.clientHeight/2}})},r||0)}else{d.remove(t+"_blocker");d.remove(t+"_progress");clearTimeout(l.progressTimer)}});d.loadCSS(m.editor_css?j.documentBaseURI.toAbsolute(m.editor_css):k+"/skins/"+j.settings.skin+"/ui.css");if(m.skin_variant){d.loadCSS(k+"/skins/"+j.settings.skin+"/ui_"+m.skin_variant+".css")}},_isHighContrast:function(){var i,j=d.add(d.getRoot(),"div",{style:"background-color: rgb(171,239,86);"});i=(d.getStyle(j,"background-color",true)+"").toLowerCase().replace(/ /g,"");d.remove(j);return i!="rgb(171,239,86)"&&i!="#abef56"},createControl:function(l,i){var j,k;if(k=i.createControl(l)){return k}switch(l){case"styleselect":return this._createStyleSelect();case"formatselect":return this._createBlockFormats();case"fontselect":return this._createFontSelect();case"fontsizeselect":return this._createFontSizeSelect();case"forecolor":return this._createForeColorMenu();case"backcolor":return this._createBackColorMenu()}if((j=this.controls[l])){return i.createButton(l,{title:"advanced."+j[0],cmd:j[1],ui:j[2],value:j[3]})}},execCommand:function(k,j,l){var i=this["_"+k];if(i){i.call(this,j,l);return true}return false},_importClasses:function(k){var i=this.editor,j=i.controlManager.get("styleselect");if(j.getLength()==0){f(i.dom.getClasses(),function(n,l){var m="style_"+l;i.formatter.register(m,{inline:"span",attributes:{"class":n["class"]},selector:"*"});j.add(n["class"],m)})}},_createStyleSelect:function(m){var k=this,i=k.editor,j=i.controlManager,l;l=j.createListBox("styleselect",{title:"advanced.style_select",onselect:function(o){var p,n=[];f(l.items,function(q){n.push(q.value)});i.focus();i.undoManager.add();p=i.formatter.matchAll(n);if(!o||p[0]==o){if(p[0]){i.formatter.remove(p[0])}}else{i.formatter.apply(o)}i.undoManager.add();i.nodeChanged();return false}});i.onInit.add(function(){var o=0,n=i.getParam("style_formats");if(n){f(n,function(p){var q,r=0;f(p,function(){r++});if(r>1){q=p.name=p.name||"style_"+(o++);i.formatter.register(q,p);l.add(p.title,q)}else{l.add(p.title)}})}else{f(i.getParam("theme_advanced_styles","","hash"),function(r,q){var p;if(r){p="style_"+(o++);i.formatter.register(p,{inline:"span",classes:r,selector:"*"});l.add(k.editor.translate(q),p)}})}});if(l.getLength()==0){l.onPostRender.add(function(o,p){if(!l.NativeListBox){b.add(p.id+"_text","focus",k._importClasses,k);b.add(p.id+"_text","mousedown",k._importClasses,k);b.add(p.id+"_open","focus",k._importClasses,k);b.add(p.id+"_open","mousedown",k._importClasses,k)}else{b.add(p.id,"focus",k._importClasses,k)}})}return l},_createFontSelect:function(){var k,j=this,i=j.editor;k=i.controlManager.createListBox("fontselect",{title:"advanced.fontdefault",onselect:function(l){var m=k.items[k.selectedIndex];if(!l&&m){i.execCommand("FontName",false,m.value);return}i.execCommand("FontName",false,l);k.select(function(n){return l==n});if(m&&m.value==l){k.select(null)}return false}});if(k){f(i.getParam("theme_advanced_fonts",j.settings.theme_advanced_fonts,"hash"),function(m,l){k.add(i.translate(l),m,{style:m.indexOf("dings")==-1?"font-family:"+m:""})})}return k},_createFontSizeSelect:function(){var m=this,k=m.editor,n,l=0,j=[];n=k.controlManager.createListBox("fontsizeselect",{title:"advanced.font_size",onselect:function(i){var o=n.items[n.selectedIndex];if(!i&&o){o=o.value;if(o["class"]){k.formatter.toggle("fontsize_class",{value:o["class"]});k.undoManager.add();k.nodeChanged()}else{k.execCommand("FontSize",false,o.fontSize)}return}if(i["class"]){k.focus();k.undoManager.add();k.formatter.toggle("fontsize_class",{value:i["class"]});k.undoManager.add();k.nodeChanged()}else{k.execCommand("FontSize",false,i.fontSize)}n.select(function(p){return i==p});if(o&&(o.value.fontSize==i.fontSize||o.value["class"]==i["class"])){n.select(null)}return false}});if(n){f(m.settings.theme_advanced_font_sizes,function(o,i){var p=o.fontSize;if(p>=1&&p<=7){p=m.sizes[parseInt(p)-1]+"pt"}n.add(i,o,{style:"font-size:"+p,"class":"mceFontSize"+(l++)+(" "+(o["class"]||""))})})}return n},_createBlockFormats:function(){var k,i={p:"advanced.paragraph",address:"advanced.address",pre:"advanced.pre",h1:"advanced.h1",h2:"advanced.h2",h3:"advanced.h3",h4:"advanced.h4",h5:"advanced.h5",h6:"advanced.h6",div:"advanced.div",blockquote:"advanced.blockquote",code:"advanced.code",dt:"advanced.dt",dd:"advanced.dd",samp:"advanced.samp"},j=this;k=j.editor.controlManager.createListBox("formatselect",{title:"advanced.block",onselect:function(l){j.editor.execCommand("FormatBlock",false,l);return false}});if(k){f(j.editor.getParam("theme_advanced_blockformats",j.settings.theme_advanced_blockformats,"hash"),function(m,l){k.add(j.editor.translate(l!=m?l:i[m]),m,{"class":"mce_formatPreview mce_"+m})})}return k},_createForeColorMenu:function(){var m,j=this,k=j.settings,l={},i;if(k.theme_advanced_more_colors){l.more_colors_func=function(){j._mceColorPicker(0,{color:m.value,func:function(n){m.setColor(n)}})}}if(i=k.theme_advanced_text_colors){l.colors=i}if(k.theme_advanced_default_foreground_color){l.default_color=k.theme_advanced_default_foreground_color}l.title="advanced.forecolor_desc";l.cmd="ForeColor";l.scope=this;m=j.editor.controlManager.createColorSplitButton("forecolor",l);return m},_createBackColorMenu:function(){var m,j=this,k=j.settings,l={},i;if(k.theme_advanced_more_colors){l.more_colors_func=function(){j._mceColorPicker(0,{color:m.value,func:function(n){m.setColor(n)}})}}if(i=k.theme_advanced_background_colors){l.colors=i}if(k.theme_advanced_default_background_color){l.default_color=k.theme_advanced_default_background_color}l.title="advanced.backcolor_desc";l.cmd="HiliteColor";l.scope=this;m=j.editor.controlManager.createColorSplitButton("backcolor",l);return m},renderUI:function(k){var m,l,q,v=this,r=v.editor,w=v.settings,u,j,i;if(r.settings){r.settings.aria_label=w.aria_label+r.getLang("advanced.help_shortcut")}m=j=d.create("span",{role:"application","aria-labelledby":r.id+"_voice",id:r.id+"_parent","class":"mceEditor "+r.settings.skin+"Skin"+(w.skin_variant?" "+r.settings.skin+"Skin"+v._ufirst(w.skin_variant):"")});d.add(m,"span",{"class":"mceVoiceLabel",style:"display:none;",id:r.id+"_voice"},w.aria_label);if(!d.boxModel){m=d.add(m,"div",{"class":"mceOldBoxModel"})}m=u=d.add(m,"table",{role:"presentation",id:r.id+"_tbl","class":"mceLayout",cellSpacing:0,cellPadding:0});m=q=d.add(m,"tbody");switch((w.theme_advanced_layout_manager||"").toLowerCase()){case"rowlayout":l=v._rowLayout(w,q,k);break;case"customlayout":l=r.execCallback("theme_advanced_custom_layout",w,q,k,j);break;default:l=v._simpleLayout(w,q,k,j)}m=k.targetNode;i=u.rows;d.addClass(i[0],"mceFirst");d.addClass(i[i.length-1],"mceLast");f(d.select("tr",q),function(o){d.addClass(o.firstChild,"mceFirst");d.addClass(o.childNodes[o.childNodes.length-1],"mceLast")});if(d.get(w.theme_advanced_toolbar_container)){d.get(w.theme_advanced_toolbar_container).appendChild(j)}else{d.insertAfter(j,m)}b.add(r.id+"_path_row","click",function(n){n=n.target;if(n.nodeName=="A"){v._sel(n.className.replace(/^.*mcePath_([0-9]+).*$/,"$1"));return b.cancel(n)}});if(!r.getParam("accessibility_focus")){b.add(d.add(j,"a",{href:"#"},""),"focus",function(){tinyMCE.get(r.id).focus()})}if(w.theme_advanced_toolbar_location=="external"){k.deltaHeight=0}v.deltaHeight=k.deltaHeight;k.targetNode=null;r.onKeyDown.add(function(p,n){var s=121,o=122;if(n.altKey){if(n.keyCode===s){window.focus();v.toolbarGroup.focus();return b.cancel(n)}else{if(n.keyCode===o){d.get(p.id+"_path_row").focus();return b.cancel(n)}}}});r.addShortcut("alt+0","","mceShortcuts",v);return{iframeContainer:l,editorContainer:r.id+"_parent",sizeContainer:u,deltaHeight:k.deltaHeight}},getInfo:function(){return{longname:"Advanced theme",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",version:e.majorVersion+"."+e.minorVersion}},resizeBy:function(i,j){var k=d.get(this.editor.id+"_ifr");this.resizeTo(k.clientWidth+i,k.clientHeight+j)},resizeTo:function(i,m,k){var j=this.editor,l=this.settings,n=d.get(j.id+"_tbl"),o=d.get(j.id+"_ifr");i=Math.max(l.theme_advanced_resizing_min_width||100,i);m=Math.max(l.theme_advanced_resizing_min_height||100,m);i=Math.min(l.theme_advanced_resizing_max_width||65535,i);m=Math.min(l.theme_advanced_resizing_max_height||65535,m);d.setStyle(n,"height","");d.setStyle(o,"height",m);if(l.theme_advanced_resize_horizontal){d.setStyle(n,"width","");d.setStyle(o,"width",i);if(i"));d.setHTML(l,q.join(""))},_addStatusBar:function(m,j){var k,v=this,p=v.editor,w=v.settings,i,q,u,l;k=d.add(m,"tr");k=l=d.add(k,"td",{"class":"mceStatusbar"});k=d.add(k,"div",{id:p.id+"_path_row",role:"group","aria-labelledby":p.id+"_path_voice"});if(w.theme_advanced_path){d.add(k,"span",{id:p.id+"_path_voice"},p.translate("advanced.path"));d.add(k,"span",{},": ")}else{d.add(k,"span",{}," ")}if(w.theme_advanced_resizing){d.add(l,"a",{id:p.id+"_resize",href:"javascript:;",onclick:"return false;","class":"mceResize"});if(w.theme_advanced_resizing_use_cookie){p.onPostRender.add(function(){var n=a.getHash("TinyMCE_"+p.id+"_size"),r=d.get(p.id+"_tbl");if(!n){return}v.resizeTo(n.cw,n.ch)})}p.onPostRender.add(function(){b.add(p.id+"_resize","click",function(n){n.preventDefault()});b.add(p.id+"_resize","mousedown",function(D){var t,r,s,o,C,z,A,F,n,E,x;function y(G){G.preventDefault();n=A+(G.screenX-C);E=F+(G.screenY-z);v.resizeTo(n,E)}function B(G){b.remove(d.doc,"mousemove",t);b.remove(p.getDoc(),"mousemove",r);b.remove(d.doc,"mouseup",s);b.remove(p.getDoc(),"mouseup",o);n=A+(G.screenX-C);E=F+(G.screenY-z);v.resizeTo(n,E,true)}D.preventDefault();C=D.screenX;z=D.screenY;x=d.get(v.editor.id+"_ifr");A=n=x.clientWidth;F=E=x.clientHeight;t=b.add(d.doc,"mousemove",y);r=b.add(p.getDoc(),"mousemove",y);s=b.add(d.doc,"mouseup",B);o=b.add(p.getDoc(),"mouseup",B)})})}j.deltaHeight-=21;k=m=null},_updateUndoStatus:function(j){var i=j.controlManager,k=j.undoManager;i.setDisabled("undo",!k.hasUndo()&&!k.typing);i.setDisabled("redo",!k.hasRedo())},_nodeChanged:function(m,r,D,q,E){var y=this,C,F=0,x,G,z=y.settings,w,k,u,B,l,j,i;e.each(y.stateControls,function(n){r.setActive(n,m.queryCommandState(y.controls[n][1]))});function o(p){var s,n=E.parents,t=p;if(typeof(p)=="string"){t=function(v){return v.nodeName==p}}for(s=0;s0){y.statusKeyboardNavigation=new e.ui.KeyboardNavigation({root:m.id+"_path_row",items:d.select("a",C),excludeFromTabOrder:true,onCancel:function(){m.focus()}},d)}}},_sel:function(i){this.editor.execCommand("mceSelectNodeDepth",false,i)},_mceInsertAnchor:function(k,j){var i=this.editor;i.windowManager.open({url:this.url+"/anchor.htm",width:320+parseInt(i.getLang("advanced.anchor_delta_width",0)),height:90+parseInt(i.getLang("advanced.anchor_delta_height",0)),inline:true},{theme_url:this.url})},_mceCharMap:function(){var i=this.editor;i.windowManager.open({url:this.url+"/charmap.htm",width:550+parseInt(i.getLang("advanced.charmap_delta_width",0)),height:250+parseInt(i.getLang("advanced.charmap_delta_height",0)),inline:true},{theme_url:this.url})},_mceHelp:function(){var i=this.editor;i.windowManager.open({url:this.url+"/about.htm",width:480,height:380,inline:true},{theme_url:this.url})},_mceShortcuts:function(){var i=this.editor;i.windowManager.open({url:this.url+"/shortcuts.htm",width:480,height:380,inline:true},{theme_url:this.url})},_mceColorPicker:function(k,j){var i=this.editor;j=j||{};i.windowManager.open({url:this.url+"/color_picker.htm",width:375+parseInt(i.getLang("advanced.colorpicker_delta_width",0)),height:250+parseInt(i.getLang("advanced.colorpicker_delta_height",0)),close_previous:false,inline:true},{input_color:j.color,func:j.func,theme_url:this.url})},_mceCodeEditor:function(j,k){var i=this.editor;i.windowManager.open({url:this.url+"/source_editor.htm",width:parseInt(i.getParam("theme_advanced_source_editor_width",720)),height:parseInt(i.getParam("theme_advanced_source_editor_height",580)),inline:true,resizable:true,maximizable:true},{theme_url:this.url})},_mceImage:function(j,k){var i=this.editor;if(i.dom.getAttrib(i.selection.getNode(),"class").indexOf("mceItem")!=-1){return}i.windowManager.open({url:this.url+"/image.htm",width:355+parseInt(i.getLang("advanced.image_delta_width",0)),height:275+parseInt(i.getLang("advanced.image_delta_height",0)),inline:true},{theme_url:this.url})},_mceLink:function(j,k){var i=this.editor;i.windowManager.open({url:this.url+"/link.htm",width:310+parseInt(i.getLang("advanced.link_delta_width",0)),height:200+parseInt(i.getLang("advanced.link_delta_height",0)),inline:true},{theme_url:this.url})},_mceNewDocument:function(){var i=this.editor;i.windowManager.confirm("advanced.newdocument",function(j){if(j){i.execCommand("mceSetContent",false,"")}})},_mceForeColor:function(){var i=this;this._mceColorPicker(0,{color:i.fgColor,func:function(j){i.fgColor=j;i.editor.execCommand("ForeColor",false,j)}})},_mceBackColor:function(){var i=this;this._mceColorPicker(0,{color:i.bgColor,func:function(j){i.bgColor=j;i.editor.execCommand("HiliteColor",false,j)}})},_ufirst:function(i){return i.substring(0,1).toUpperCase()+i.substring(1)}});e.ThemeManager.add("advanced",e.themes.AdvancedTheme)}(tinymce)); \ No newline at end of file diff --git a/plugins/TinyMCE/js/themes/advanced/editor_template_src.js b/plugins/TinyMCE/js/themes/advanced/editor_template_src.js index e0d4dacc0c..d62f497e61 100644 --- a/plugins/TinyMCE/js/themes/advanced/editor_template_src.js +++ b/plugins/TinyMCE/js/themes/advanced/editor_template_src.js @@ -66,6 +66,9 @@ t.url = url; t.onResolveName = new tinymce.util.Dispatcher(this); + ed.forcedHighContrastMode = ed.settings.detect_highcontrast && t._isHighContrast(); + ed.settings.skin = ed.forcedHighContrastMode ? 'highcontrast' : ed.settings.skin; + // Default settings t.settings = s = extend({ theme_advanced_path : true, @@ -81,6 +84,8 @@ theme_advanced_resize_horizontal : 1, theme_advanced_resizing_use_cookie : 1, theme_advanced_font_sizes : "1,2,3,4,5,6,7", + theme_advanced_font_selector : "span", + theme_advanced_show_current_color: 0, readonly : ed.settings.readonly }, ed.settings); @@ -119,13 +124,19 @@ if (s.theme_advanced_statusbar_location == 'none') s.theme_advanced_statusbar_location = 0; + if (ed.settings.content_css !== false) + ed.contentCSS.push(ed.baseURI.toAbsolute(url + "/skins/" + ed.settings.skin + "/content.css")); + // Init editor ed.onInit.add(function() { - if (!ed.settings.readonly) + if (!ed.settings.readonly) { ed.onNodeChange.add(t._nodeChanged, t); - - if (ed.settings.content_css !== false) - ed.dom.loadCSS(ed.baseURI.toAbsolute("themes/advanced/skins/" + ed.settings.skin + "/content.css")); + ed.onKeyUp.add(t._updateUndoStatus, t); + ed.onMouseUp.add(t._updateUndoStatus, t); + ed.dom.bind(ed.dom.getRoot(), 'dragend', function() { + t._updateUndoStatus(ed); + }); + } }); ed.onSetProgressState.add(function(ed, b, ti) { @@ -153,6 +164,15 @@ DOM.loadCSS(url + "/skins/" + ed.settings.skin + "/ui_" + s.skin_variant + ".css"); }, + _isHighContrast : function() { + var actualColor, div = DOM.add(DOM.getRoot(), 'div', {'style': 'background-color: rgb(171,239,86);'}); + + actualColor = (DOM.getStyle(div, 'background-color', true) + '').toLowerCase().replace(/ /g, ''); + DOM.remove(div); + + return actualColor != 'rgb(171,239,86)' && actualColor != '#abef56'; + }, + createControl : function(n, cf) { var cd, c; @@ -230,9 +250,10 @@ // Toggle off the current format matches = ed.formatter.matchAll(formatNames); - if (!name || matches[0] == name) - ed.formatter.remove(matches[0]); - else + if (!name || matches[0] == name) { + if (matches[0]) + ed.formatter.remove(matches[0]); + } else ed.formatter.apply(name); ed.undoManager.add(); @@ -314,6 +335,10 @@ return v == sv; }); + if (cur && cur.value == v) { + c.select(null); + } + return false; // No auto select } }); @@ -361,6 +386,10 @@ return v == sv; }); + if (cur && (cur.value.fontSize == v.fontSize || cur.value['class'] == v['class'])) { + c.select(null); + } + return false; // No auto select }}); @@ -397,7 +426,11 @@ samp : 'advanced.samp' }, t = this; - c = t.editor.controlManager.createListBox('formatselect', {title : 'advanced.block', cmd : 'FormatBlock'}); + c = t.editor.controlManager.createListBox('formatselect', {title : 'advanced.block', onselect : function(v) { + t.editor.execCommand('FormatBlock', false, v); + return false; + }}); + if (c) { each(t.editor.getParam('theme_advanced_blockformats', t.settings.theme_advanced_blockformats, 'hash'), function(v, k) { c.add(t.editor.translate(k != v ? k : fmts[v]), v, {'class' : 'mce_formatPreview mce_' + v}); @@ -468,12 +501,19 @@ renderUI : function(o) { var n, ic, tb, t = this, ed = t.editor, s = t.settings, sc, p, nl; - n = p = DOM.create('span', {id : ed.id + '_parent', 'class' : 'mceEditor ' + ed.settings.skin + 'Skin' + (s.skin_variant ? ' ' + ed.settings.skin + 'Skin' + t._ufirst(s.skin_variant) : '')}); + if (ed.settings) { + ed.settings.aria_label = s.aria_label + ed.getLang('advanced.help_shortcut'); + } + + // TODO: ACC Should have an aria-describedby attribute which is user-configurable to describe what this field is actually for. + // Maybe actually inherit it from the original textara? + n = p = DOM.create('span', {role : 'application', 'aria-labelledby' : ed.id + '_voice', id : ed.id + '_parent', 'class' : 'mceEditor ' + ed.settings.skin + 'Skin' + (s.skin_variant ? ' ' + ed.settings.skin + 'Skin' + t._ufirst(s.skin_variant) : '')}); + DOM.add(n, 'span', {'class': 'mceVoiceLabel', 'style': 'display:none;', id: ed.id + '_voice'}, s.aria_label); if (!DOM.boxModel) n = DOM.add(n, 'div', {'class' : 'mceOldBoxModel'}); - n = sc = DOM.add(n, 'table', {id : ed.id + '_tbl', 'class' : 'mceLayout', cellSpacing : 0, cellPadding : 0}); + n = sc = DOM.add(n, 'table', {role : "presentation", id : ed.id + '_tbl', 'class' : 'mceLayout', cellSpacing : 0, cellPadding : 0}); n = tb = DOM.add(n, 'tbody'); switch ((s.theme_advanced_layout_manager || '').toLowerCase()) { @@ -492,7 +532,7 @@ n = o.targetNode; // Add classes to first and last TRs - nl = DOM.stdMode ? sc.getElementsByTagName('tr') : sc.rows; // Quick fix for IE 8 + nl = sc.rows; DOM.addClass(nl[0], 'mceFirst'); DOM.addClass(nl[nl.length - 1], 'mceLast'); @@ -548,6 +588,24 @@ t.deltaHeight = o.deltaHeight; o.targetNode = null; + ed.onKeyDown.add(function(ed, evt) { + var DOM_VK_F10 = 121, DOM_VK_F11 = 122; + + if (evt.altKey) { + if (evt.keyCode === DOM_VK_F10) { + window.focus(); + t.toolbarGroup.focus(); + return Event.cancel(evt); + } else if (evt.keyCode === DOM_VK_F11) { + DOM.get(ed.id + '_path_row').focus(); + return Event.cancel(evt); + } + } + }); + + // alt+0 is the UK recommended shortcut for accessing the list of access controls. + ed.addShortcut('alt+0', '', 'mceShortcuts', t); + return { iframeContainer : ic, editorContainer : ed.id + '_parent', @@ -566,12 +624,12 @@ }, resizeBy : function(dw, dh) { - var e = DOM.get(this.editor.id + '_tbl'); + var e = DOM.get(this.editor.id + '_ifr'); this.resizeTo(e.clientWidth + dw, e.clientHeight + dh); }, - resizeTo : function(w, h) { + resizeTo : function(w, h, store) { var ed = this.editor, s = this.settings, e = DOM.get(ed.id + '_tbl'), ifr = DOM.get(ed.id + '_ifr'); // Boundery fix box @@ -589,8 +647,18 @@ DOM.setStyle(ifr, 'width', w); // Make sure that the size is never smaller than the over all ui - if (w < e.clientWidth) + if (w < e.clientWidth) { + w = e.clientWidth; DOM.setStyle(ifr, 'width', e.clientWidth); + } + } + + // Store away the size + if (store && s.theme_advanced_resizing_use_cookie) { + Cookie.setHash("TinyMCE_" + ed.id + "_size", { + cw : w, + ch : h + }); } }, @@ -685,7 +753,7 @@ each(explode(s.theme_advanced_containers || ''), function(c, i) { var v = s['theme_advanced_container_' + c] || ''; - switch (v.toLowerCase()) { + switch (c.toLowerCase()) { case 'mceeditor': n = DOM.add(tb, 'tr'); n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'}); @@ -753,17 +821,19 @@ }, _addToolbars : function(c, o) { - var t = this, i, tb, ed = t.editor, s = t.settings, v, cf = ed.controlManager, di, n, h = [], a; + var t = this, i, tb, ed = t.editor, s = t.settings, v, cf = ed.controlManager, di, n, h = [], a, toolbarGroup; + + toolbarGroup = cf.createToolbarGroup('toolbargroup', { + 'name': ed.getLang('advanced.toolbar'), + 'tab_focus_toolbar':ed.getParam('theme_advanced_tab_focus_toolbar') + }); + + t.toolbarGroup = toolbarGroup; a = s.theme_advanced_toolbar_align.toLowerCase(); a = 'mce' + t._ufirst(a); - n = DOM.add(DOM.add(c, 'tr'), 'td', {'class' : 'mceToolbar ' + a}); - - if (!ed.getParam('accessibility_focus')) - h.push(DOM.createHTML('a', {href : '#', onfocus : 'tinyMCE.get(\'' + ed.id + '\').focus();'}, '')); - - h.push(DOM.createHTML('a', {href : '#', accesskey : 'q', title : ed.getLang("advanced.toolbar_focus")}, '')); + n = DOM.add(DOM.add(c, 'tr', {role: 'presentation'}), 'td', {'class' : 'mceToolbar ' + a, "role":"presentation"}); // Create toolbar and add the controls for (i=1; (v = s['theme_advanced_buttons' + i]); i++) { @@ -776,13 +846,11 @@ v = s['theme_advanced_buttons' + i + '_add_before'] + ',' + v; t._addControls(v, tb); - - //n.appendChild(n = tb.render()); - h.push(tb.renderHTML()); + toolbarGroup.add(tb); o.deltaHeight -= s.theme_advanced_row_height; } - + h.push(toolbarGroup.renderHTML()); h.push(DOM.createHTML('a', {href : '#', accesskey : 'z', title : ed.getLang("advanced.toolbar_focus"), onfocus : 'tinyMCE.getInstanceById(\'' + ed.id + '\').focus();'}, '')); DOM.setHTML(n, h.join('')); }, @@ -791,9 +859,15 @@ var n, t = this, ed = t.editor, s = t.settings, r, mf, me, td; n = DOM.add(tb, 'tr'); - n = td = DOM.add(n, 'td', {'class' : 'mceStatusbar'}); - n = DOM.add(n, 'div', {id : ed.id + '_path_row'}, s.theme_advanced_path ? ed.translate('advanced.path') + ': ' : ' '); - DOM.add(n, 'a', {href : '#', accesskey : 'x'}); + n = td = DOM.add(n, 'td', {'class' : 'mceStatusbar'}); + n = DOM.add(n, 'div', {id : ed.id + '_path_row', 'role': 'group', 'aria-labelledby': ed.id + '_path_voice'}); + if (s.theme_advanced_path) { + DOM.add(n, 'span', {id: ed.id + '_path_voice'}, ed.translate('advanced.path')); + DOM.add(n, 'span', {}, ': '); + } else { + DOM.add(n, 'span', {}, ' '); + } + if (s.theme_advanced_resizing) { DOM.add(td, 'a', {id : ed.id + '_resize', href : 'javascript:;', onclick : "return false;", 'class' : 'mceResize'}); @@ -810,12 +884,18 @@ } ed.onPostRender.add(function() { + Event.add(ed.id + '_resize', 'click', function(e) { + e.preventDefault(); + }); + Event.add(ed.id + '_resize', 'mousedown', function(e) { var mouseMoveHandler1, mouseMoveHandler2, mouseUpHandler1, mouseUpHandler2, startX, startY, startWidth, startHeight, width, height, ifrElm; function resizeOnMove(e) { + e.preventDefault(); + width = startWidth + (e.screenX - startX); height = startHeight + (e.screenY - startY); @@ -829,13 +909,9 @@ Event.remove(DOM.doc, 'mouseup', mouseUpHandler1); Event.remove(ed.getDoc(), 'mouseup', mouseUpHandler2); - // Store away the size - if (s.theme_advanced_resizing_use_cookie) { - Cookie.setHash("TinyMCE_" + ed.id + "_size", { - cw : width, - ch : height - }); - } + width = startWidth + (e.screenX - startX); + height = startHeight + (e.screenY - startY); + t.resizeTo(width, height, true); }; e.preventDefault(); @@ -860,8 +936,15 @@ n = tb = null; }, + _updateUndoStatus : function(ed) { + var cm = ed.controlManager, um = ed.undoManager; + + cm.setDisabled('undo', !um.hasUndo() && !um.typing); + cm.setDisabled('redo', !um.hasRedo()); + }, + _nodeChanged : function(ed, cm, n, co, ob) { - var t = this, p, de = 0, v, c, s = t.settings, cl, fz, fn, formatNames, matches; + var t = this, p, de = 0, v, c, s = t.settings, cl, fz, fn, fc, bc, formatNames, matches; tinymce.each(t.stateControls, function(c) { cm.setActive(c, ed.queryCommandState(t.controls[c][1])); @@ -883,8 +966,7 @@ }; cm.setActive('visualaid', ed.hasVisual); - cm.setDisabled('undo', !ed.undoManager.hasUndo() && !ed.typing); - cm.setDisabled('redo', !ed.undoManager.hasRedo()); + t._updateUndoStatus(ed); cm.setDisabled('outdent', !ed.queryCommandState('Outdent')); p = getParent('A'); @@ -901,12 +983,12 @@ } if (c = cm.get('anchor')) { - c.setActive(!!p && p.name); + c.setActive(!co && !!p && p.name); } p = getParent('IMG'); if (c = cm.get('image')) - c.setActive(!!p && n.className.indexOf('mceItem') == -1); + c.setActive(!co && !!p && n.className.indexOf('mceItem') == -1); if (c = cm.get('styleselect')) { t._importClasses(); @@ -932,12 +1014,20 @@ if (n.nodeName === 'SPAN') { if (!cl && n.className) cl = n.className; + } + if (ed.dom.is(n, s.theme_advanced_font_selector)) { if (!fz && n.style.fontSize) fz = n.style.fontSize; if (!fn && n.style.fontFamily) fn = n.style.fontFamily.replace(/[\"\']+/g, '').replace(/^([^,]+).*/, '$1').toLowerCase(); + + if (!fc && n.style.color) + fc = n.style.color; + + if (!bc && n.style.backgroundColor) + bc = n.style.backgroundColor; } return false; @@ -963,24 +1053,52 @@ return true; }); } + + if (s.theme_advanced_show_current_color) { + function updateColor(controlId, color) { + if (c = cm.get(controlId)) { + if (!color) + color = c.settings.default_color; + if (color !== c.value) { + c.displayColor(color); + } + } + } + updateColor('forecolor', fc); + updateColor('backcolor', bc); + } + + if (s.theme_advanced_show_current_color) { + function updateColor(controlId, color) { + if (c = cm.get(controlId)) { + if (!color) + color = c.settings.default_color; + if (color !== c.value) { + c.displayColor(color); + } + } + }; + + updateColor('forecolor', fc); + updateColor('backcolor', bc); + } if (s.theme_advanced_path && s.theme_advanced_statusbar_location) { p = DOM.get(ed.id + '_path') || DOM.add(ed.id + '_path_row', 'span', {id : ed.id + '_path'}); + + if (t.statusKeyboardNavigation) { + t.statusKeyboardNavigation.destroy(); + t.statusKeyboardNavigation = null; + } + DOM.setHTML(p, ''); getParent(function(n) { var na = n.nodeName.toLowerCase(), u, pi, ti = ''; - /*if (n.getAttribute('_mce_bogus')) + // Ignore non element and bogus/hidden elements + if (n.nodeType != 1 || na === 'br' || n.getAttribute('data-mce-bogus') || DOM.hasClass(n, 'mceItemHidden') || DOM.hasClass(n, 'mceItemRemoved')) return; -*/ - // Ignore non element and hidden elements - if (n.nodeType != 1 || n.nodeName === 'BR' || (DOM.hasClass(n, 'mceItemHidden') || DOM.hasClass(n, 'mceItemRemoved'))) - return; - - // Fake name - if (v = DOM.getAttrib(n, 'mce_name')) - na = v; // Handle prefix if (tinymce.isIE && n.scopeName !== 'HTML') @@ -1056,14 +1174,25 @@ na = na.name; //u = "javascript:tinymce.EditorManager.get('" + ed.id + "').theme._sel('" + (de++) + "');"; - pi = DOM.create('a', {'href' : "javascript:;", onmousedown : "return false;", title : ti, 'class' : 'mcePath_' + (de++)}, na); + pi = DOM.create('a', {'href' : "javascript:;", role: 'button', onmousedown : "return false;", title : ti, 'class' : 'mcePath_' + (de++)}, na); if (p.hasChildNodes()) { - p.insertBefore(DOM.doc.createTextNode(' \u00bb '), p.firstChild); + p.insertBefore(DOM.create('span', {'aria-hidden': 'true'}, '\u00a0\u00bb '), p.firstChild); p.insertBefore(pi, p.firstChild); } else p.appendChild(pi); }, ed.getBody()); + + if (DOM.select('a', p).length > 0) { + t.statusKeyboardNavigation = new tinymce.ui.KeyboardNavigation({ + root: ed.id + "_path_row", + items: DOM.select('a', p), + excludeFromTabOrder: true, + onCancel: function() { + ed.focus(); + } + }, DOM); + } } }, @@ -1077,7 +1206,7 @@ var ed = this.editor; ed.windowManager.open({ - url : tinymce.baseURL + '/themes/advanced/anchor.htm', + url : this.url + '/anchor.htm', width : 320 + parseInt(ed.getLang('advanced.anchor_delta_width', 0)), height : 90 + parseInt(ed.getLang('advanced.anchor_delta_height', 0)), inline : true @@ -1090,7 +1219,7 @@ var ed = this.editor; ed.windowManager.open({ - url : tinymce.baseURL + '/themes/advanced/charmap.htm', + url : this.url + '/charmap.htm', width : 550 + parseInt(ed.getLang('advanced.charmap_delta_width', 0)), height : 250 + parseInt(ed.getLang('advanced.charmap_delta_height', 0)), inline : true @@ -1103,7 +1232,7 @@ var ed = this.editor; ed.windowManager.open({ - url : tinymce.baseURL + '/themes/advanced/about.htm', + url : this.url + '/about.htm', width : 480, height : 380, inline : true @@ -1112,13 +1241,25 @@ }); }, + _mceShortcuts : function() { + var ed = this.editor; + ed.windowManager.open({ + url: this.url + '/shortcuts.htm', + width: 480, + height: 380, + inline: true + }, { + theme_url: this.url + }); + }, + _mceColorPicker : function(u, v) { var ed = this.editor; v = v || {}; ed.windowManager.open({ - url : tinymce.baseURL + '/themes/advanced/color_picker.htm', + url : this.url + '/color_picker.htm', width : 375 + parseInt(ed.getLang('advanced.colorpicker_delta_width', 0)), height : 250 + parseInt(ed.getLang('advanced.colorpicker_delta_height', 0)), close_previous : false, @@ -1134,7 +1275,7 @@ var ed = this.editor; ed.windowManager.open({ - url : tinymce.baseURL + '/themes/advanced/source_editor.htm', + url : this.url + '/source_editor.htm', width : parseInt(ed.getParam("theme_advanced_source_editor_width", 720)), height : parseInt(ed.getParam("theme_advanced_source_editor_height", 580)), inline : true, @@ -1153,7 +1294,7 @@ return; ed.windowManager.open({ - url : tinymce.baseURL + '/themes/advanced/image.htm', + url : this.url + '/image.htm', width : 355 + parseInt(ed.getLang('advanced.image_delta_width', 0)), height : 275 + parseInt(ed.getLang('advanced.image_delta_height', 0)), inline : true @@ -1166,7 +1307,7 @@ var ed = this.editor; ed.windowManager.open({ - url : tinymce.baseURL + '/themes/advanced/link.htm', + url : this.url + '/link.htm', width : 310 + parseInt(ed.getLang('advanced.link_delta_width', 0)), height : 200 + parseInt(ed.getLang('advanced.link_delta_height', 0)), inline : true @@ -1214,4 +1355,4 @@ }); tinymce.ThemeManager.add('advanced', tinymce.themes.AdvancedTheme); -}(tinymce)); \ No newline at end of file +}(tinymce)); diff --git a/plugins/TinyMCE/js/themes/advanced/image.htm b/plugins/TinyMCE/js/themes/advanced/image.htm index f30d670641..b8ba729f6f 100644 --- a/plugins/TinyMCE/js/themes/advanced/image.htm +++ b/plugins/TinyMCE/js/themes/advanced/image.htm @@ -17,57 +17,57 @@
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        - - - - -
         
        - x -
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + + +
         
        + x +
        diff --git a/plugins/TinyMCE/js/themes/advanced/img/colorpicker.jpg b/plugins/TinyMCE/js/themes/advanced/img/colorpicker.jpg index b4c542d107..b1a377aba7 100644 Binary files a/plugins/TinyMCE/js/themes/advanced/img/colorpicker.jpg and b/plugins/TinyMCE/js/themes/advanced/img/colorpicker.jpg differ diff --git a/plugins/TinyMCE/js/themes/advanced/img/flash.gif b/plugins/TinyMCE/js/themes/advanced/img/flash.gif new file mode 100644 index 0000000000..dec3f7c702 Binary files /dev/null and b/plugins/TinyMCE/js/themes/advanced/img/flash.gif differ diff --git a/plugins/TinyMCE/js/themes/advanced/img/icons.gif b/plugins/TinyMCE/js/themes/advanced/img/icons.gif index e46de53330..641a9e3d31 100644 Binary files a/plugins/TinyMCE/js/themes/advanced/img/icons.gif and b/plugins/TinyMCE/js/themes/advanced/img/icons.gif differ diff --git a/plugins/TinyMCE/js/themes/advanced/img/iframe.gif b/plugins/TinyMCE/js/themes/advanced/img/iframe.gif new file mode 100644 index 0000000000..410c7ad084 Binary files /dev/null and b/plugins/TinyMCE/js/themes/advanced/img/iframe.gif differ diff --git a/plugins/TinyMCE/js/plugins/pagebreak/img/pagebreak.gif b/plugins/TinyMCE/js/themes/advanced/img/pagebreak.gif similarity index 100% rename from plugins/TinyMCE/js/plugins/pagebreak/img/pagebreak.gif rename to plugins/TinyMCE/js/themes/advanced/img/pagebreak.gif diff --git a/plugins/TinyMCE/js/themes/advanced/img/quicktime.gif b/plugins/TinyMCE/js/themes/advanced/img/quicktime.gif new file mode 100644 index 0000000000..8f10e7aa6b Binary files /dev/null and b/plugins/TinyMCE/js/themes/advanced/img/quicktime.gif differ diff --git a/plugins/TinyMCE/js/plugins/media/img/realmedia.gif b/plugins/TinyMCE/js/themes/advanced/img/realmedia.gif similarity index 100% rename from plugins/TinyMCE/js/plugins/media/img/realmedia.gif rename to plugins/TinyMCE/js/themes/advanced/img/realmedia.gif diff --git a/plugins/TinyMCE/js/themes/advanced/img/shockwave.gif b/plugins/TinyMCE/js/themes/advanced/img/shockwave.gif new file mode 100644 index 0000000000..9314d04470 Binary files /dev/null and b/plugins/TinyMCE/js/themes/advanced/img/shockwave.gif differ diff --git a/plugins/TinyMCE/js/plugins/media/img/trans.gif b/plugins/TinyMCE/js/themes/advanced/img/trans.gif similarity index 100% rename from plugins/TinyMCE/js/plugins/media/img/trans.gif rename to plugins/TinyMCE/js/themes/advanced/img/trans.gif diff --git a/plugins/TinyMCE/js/themes/advanced/img/video.gif b/plugins/TinyMCE/js/themes/advanced/img/video.gif new file mode 100644 index 0000000000..3570104077 Binary files /dev/null and b/plugins/TinyMCE/js/themes/advanced/img/video.gif differ diff --git a/plugins/TinyMCE/js/plugins/media/img/windowsmedia.gif b/plugins/TinyMCE/js/themes/advanced/img/windowsmedia.gif similarity index 100% rename from plugins/TinyMCE/js/plugins/media/img/windowsmedia.gif rename to plugins/TinyMCE/js/themes/advanced/img/windowsmedia.gif diff --git a/plugins/TinyMCE/js/themes/advanced/js/about.js b/plugins/TinyMCE/js/themes/advanced/js/about.js index 5cee9ed863..5b35845761 100644 --- a/plugins/TinyMCE/js/themes/advanced/js/about.js +++ b/plugins/TinyMCE/js/themes/advanced/js/about.js @@ -66,6 +66,7 @@ function insertHelpIFrame() { html = ''; document.getElementById('iframecontainer').innerHTML = html; document.getElementById('help_tab').style.display = 'block'; + document.getElementById('help_tab').setAttribute("aria-hidden", "false"); } } diff --git a/plugins/TinyMCE/js/themes/advanced/js/anchor.js b/plugins/TinyMCE/js/themes/advanced/js/anchor.js index 7fe7810558..e528e4f42f 100644 --- a/plugins/TinyMCE/js/themes/advanced/js/anchor.js +++ b/plugins/TinyMCE/js/themes/advanced/js/anchor.js @@ -19,6 +19,11 @@ var AnchorDialog = { update : function() { var ed = this.editor, elm, name = document.forms[0].anchorName.value; + if (!name || !/^[a-z][a-z0-9\-\_:\.]*$/i.test(name)) { + tinyMCEPopup.alert('advanced_dlg.anchor_invalid'); + return; + } + tinyMCEPopup.restoreSelection(); if (this.action != 'update') diff --git a/plugins/TinyMCE/js/themes/advanced/js/charmap.js b/plugins/TinyMCE/js/themes/advanced/js/charmap.js index 8c5aea1721..1cead6dfe8 100644 --- a/plugins/TinyMCE/js/themes/advanced/js/charmap.js +++ b/plugins/TinyMCE/js/themes/advanced/js/charmap.js @@ -173,7 +173,7 @@ var charmap = [ ['ý', 'ý', true, 'y - acute'], ['þ', 'þ', true, 'thorn'], ['ÿ', 'ÿ', true, 'y - diaeresis'], - ['Α', 'Α', true, 'Alpha'], + ['Α', 'Α', true, 'Alpha'], ['Β', 'Β', true, 'Beta'], ['Γ', 'Γ', true, 'Gamma'], ['Δ', 'Δ', true, 'Delta'], @@ -258,8 +258,8 @@ var charmap = [ ['⌋', '⌋', false,'right floor'], ['⟨', '〈', false,'left-pointing angle bracket'], ['⟩', '〉', false,'right-pointing angle bracket'], - ['◊', '◊', true,'lozenge'], - ['♠', '♠', false,'black spade suit'], + ['◊', '◊', true, 'lozenge'], + ['♠', '♠', true, 'black spade suit'], ['♣', '♣', true, 'black club suit'], ['♥', '♥', true, 'black heart suit'], ['♦', '♦', true, 'black diamond suit'], @@ -275,19 +275,38 @@ var charmap = [ tinyMCEPopup.onInit.add(function() { tinyMCEPopup.dom.setHTML('charmapView', renderCharMapHTML()); + addKeyboardNavigation(); }); +function addKeyboardNavigation(){ + var tableElm, cells, settings; + + cells = tinyMCEPopup.dom.select(".charmaplink", "charmapgroup"); + + settings ={ + root: "charmapgroup", + items: cells + }; + + tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', settings, tinyMCEPopup.dom); +} + function renderCharMapHTML() { var charsPerRow = 20, tdWidth=20, tdHeight=20, i; - var html = ''; + var html = '
        '+ + '
        '; var cols=-1; for (i=0; i' - + '' + + '' + charmap[i][1] + ''; if ((cols+1) % charsPerRow == 0) @@ -301,7 +320,8 @@ function renderCharMapHTML() { html += ''; } - html += '
         
        '; + html += '
        '; + html = html.replace(/
        ' + // TODO: VoiceOver doesn't seem to support legend as a label referenced by labelledby. + h += '
        ' + ''; for (i=0; i' - + '' - + ''; + + ''; + if (tinyMCEPopup.editor.forcedHighContrastMode) { + h += ''; + } + h += ''; + h += ''; if ((i+1) % 18 == 0) h += ''; } - h += '
        '; + h += '
        '; el.innerHTML = h; el.className = 'generated'; + + paintCanvas(el); + enableKeyboardNavigation(el.firstChild); } +function paintCanvas(el) { + tinyMCEPopup.getWin().tinymce.each(tinyMCEPopup.dom.select('canvas.mceColorSwatch', el), function(canvas) { + var context; + if (canvas.getContext && (context = canvas.getContext("2d"))) { + context.fillStyle = canvas.getAttribute('data-color'); + context.fillRect(0, 0, 10, 10); + } + }); +} function generateNamedColors() { var el = document.getElementById('namedcolors'), h = '', n, v, i = 0; @@ -178,11 +238,27 @@ function generateNamedColors() { for (n in named) { v = named[n]; - h += '' + h += ''; + if (tinyMCEPopup.editor.forcedHighContrastMode) { + h += ''; + } + h += ''; + h += ''; + i++; } el.innerHTML = h; el.className = 'generated'; + + paintCanvas(el); + enableKeyboardNavigation(el); +} + +function enableKeyboardNavigation(el) { + tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', { + root: el, + items: tinyMCEPopup.dom.select('a', el) + }, tinyMCEPopup.dom); } function dechex(n) { diff --git a/plugins/TinyMCE/js/themes/advanced/js/image.js b/plugins/TinyMCE/js/themes/advanced/js/image.js index 6423d90809..2bccc97b92 100644 --- a/plugins/TinyMCE/js/themes/advanced/js/image.js +++ b/plugins/TinyMCE/js/themes/advanced/js/image.js @@ -18,7 +18,7 @@ var ImageDialog = { e = ed.selection.getNode(); - this.fillFileList('image_list', 'tinyMCEImageList'); + this.fillFileList('image_list', tinyMCEPopup.getParam('external_image_list', 'tinyMCEImageList')); if (e.nodeName == 'IMG') { f.src.value = ed.dom.getAttrib(e, 'src'); @@ -39,7 +39,7 @@ var ImageDialog = { fillFileList : function(id, l) { var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; - l = window[l]; + l = typeof(l) === 'function' ? l() : window[l]; if (l && l.length > 0) { lst.options[lst.options.length] = new Option('', ''); @@ -77,7 +77,7 @@ var ImageDialog = { args.style = this.styleVal; tinymce.extend(args, { - src : f.src.value, + src : f.src.value.replace(/ /g, '%20'), alt : f.alt.value, width : f.width.value, height : f.height.value @@ -87,6 +87,8 @@ var ImageDialog = { if (el && el.nodeName == 'IMG') { ed.dom.setAttribs(el, args); + tinyMCEPopup.editor.execCommand('mceRepaint'); + tinyMCEPopup.editor.focus(); } else { ed.execCommand('mceInsertContent', false, '', {skip_undo : 1}); ed.dom.setAttribs('__mce_tmp', args); diff --git a/plugins/TinyMCE/js/themes/advanced/js/link.js b/plugins/TinyMCE/js/themes/advanced/js/link.js index f67a5bc828..53ff409e79 100644 --- a/plugins/TinyMCE/js/themes/advanced/js/link.js +++ b/plugins/TinyMCE/js/themes/advanced/js/link.js @@ -31,7 +31,7 @@ var LinkDialog = { }, update : function() { - var f = document.forms[0], ed = tinyMCEPopup.editor, e, b; + var f = document.forms[0], ed = tinyMCEPopup.editor, e, b, href = f.href.value.replace(/ /g, '%20'); tinyMCEPopup.restoreSelection(); e = ed.dom.getParent(ed.selection.getNode(), 'A'); @@ -39,7 +39,6 @@ var LinkDialog = { // Remove element if there is no href if (!f.href.value) { if (e) { - tinyMCEPopup.execCommand("mceBeginUndoLevel"); b = ed.selection.getBookmark(); ed.dom.remove(e, 1); ed.selection.moveToBookmark(b); @@ -49,19 +48,17 @@ var LinkDialog = { } } - tinyMCEPopup.execCommand("mceBeginUndoLevel"); - // Create new anchor elements if (e == null) { ed.getDoc().execCommand("unlink", false, null); - tinyMCEPopup.execCommand("CreateLink", false, "#mce_temp_url#", {skip_undo : 1}); + tinyMCEPopup.execCommand("mceInsertLink", false, "#mce_temp_url#", {skip_undo : 1}); tinymce.each(ed.dom.select("a"), function(n) { if (ed.dom.getAttrib(n, 'href') == '#mce_temp_url#') { e = n; ed.dom.setAttribs(e, { - href : f.href.value, + href : href, title : f.linktitle.value, target : f.target_list ? getSelectValue(f, "target_list") : null, 'class' : f.class_list ? getSelectValue(f, "class_list") : null @@ -70,7 +67,7 @@ var LinkDialog = { }); } else { ed.dom.setAttribs(e, { - href : f.href.value, + href : href, title : f.linktitle.value, target : f.target_list ? getSelectValue(f, "target_list") : null, 'class' : f.class_list ? getSelectValue(f, "class_list") : null diff --git a/plugins/TinyMCE/js/themes/advanced/js/source_editor.js b/plugins/TinyMCE/js/themes/advanced/js/source_editor.js index 279328614c..84546ad52e 100644 --- a/plugins/TinyMCE/js/themes/advanced/js/source_editor.js +++ b/plugins/TinyMCE/js/themes/advanced/js/source_editor.js @@ -44,19 +44,13 @@ function toggleWordWrap(elm) { setWrap('off'); } -var wHeight=0, wWidth=0, owHeight=0, owWidth=0; - function resizeInputs() { - var el = document.getElementById('htmlSource'); + var vp = tinyMCEPopup.dom.getViewPort(window), el; - if (!tinymce.isIE) { - wHeight = self.innerHeight - 65; - wWidth = self.innerWidth - 16; - } else { - wHeight = document.body.clientHeight - 70; - wWidth = document.body.clientWidth - 16; + el = document.getElementById('htmlSource'); + + if (el) { + el.style.width = (vp.w - 20) + 'px'; + el.style.height = (vp.h - 65) + 'px'; } - - el.style.height = Math.abs(wHeight) + 'px'; - el.style.width = Math.abs(wWidth) + 'px'; } diff --git a/plugins/TinyMCE/js/themes/advanced/langs/en.js b/plugins/TinyMCE/js/themes/advanced/langs/en.js index 69694b1f9f..fbf29893fe 100644 --- a/plugins/TinyMCE/js/themes/advanced/langs/en.js +++ b/plugins/TinyMCE/js/themes/advanced/langs/en.js @@ -58,5 +58,11 @@ clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\r\nDo you path:"Path", newdocument:"Are you sure you want clear all contents?", toolbar_focus:"Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X", -more_colors:"More colors" -}); \ No newline at end of file +more_colors:"More colors", + +// Accessibility Strings +shortcuts_desc:'Accessibility Help', +help_shortcut:'. Press ALT F10 for toolbar. Press ALT 0 for help.', +rich_text_area:"Rich Text Area", +toolbar:"Toolbar" +}); diff --git a/plugins/TinyMCE/js/themes/advanced/langs/en_dlg.js b/plugins/TinyMCE/js/themes/advanced/langs/en_dlg.js index 9d124d7db6..0a459beb5c 100644 --- a/plugins/TinyMCE/js/themes/advanced/langs/en_dlg.js +++ b/plugins/TinyMCE/js/themes/advanced/langs/en_dlg.js @@ -10,6 +10,7 @@ about_version:"Version", about_loaded:"Loaded plugins", anchor_title:"Insert/edit anchor", anchor_name:"Anchor name", +anchor_invalid:"Please specify a valid anchor name.", code_title:"HTML Source Editor", code_wordwrap:"Word wrap", colorpicker_title:"Select a color", @@ -45,7 +46,9 @@ link_target:"Target", link_target_same:"Open link in the same window", link_target_blank:"Open link in a new window", link_titlefield:"Title", -link_is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?", -link_is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?", -link_list:"Link list" +link_is_email:"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?", +link_is_external:"The URL you entered seems to be an external link. Do you want to add the required http:// prefix?", +link_list:"Link list", +accessibility_help:"Accessibility Help", +accessibility_usage_title:"General Usage" }); \ No newline at end of file diff --git a/plugins/TinyMCE/js/themes/advanced/link.htm b/plugins/TinyMCE/js/themes/advanced/link.htm index 7565b9ae8b..5d9dea9b8c 100644 --- a/plugins/TinyMCE/js/themes/advanced/link.htm +++ b/plugins/TinyMCE/js/themes/advanced/link.htm @@ -18,34 +18,33 @@
        - - - - - - - - - - - - - - - - - - - - - - -
        - - - - -
         
        + + + + + + + + + + + + + + + + + + + + + +
        + + + + +
         
        diff --git a/plugins/TinyMCE/js/themes/advanced/shortcuts.htm b/plugins/TinyMCE/js/themes/advanced/shortcuts.htm new file mode 100644 index 0000000000..20ec2f5a34 --- /dev/null +++ b/plugins/TinyMCE/js/themes/advanced/shortcuts.htm @@ -0,0 +1,47 @@ + + + + {#advanced_dlg.accessibility_help} + + + + +

        {#advanced_dlg.accessibility_usage_title}

        +

        Toolbars

        +

        Press ALT-F10 to move focus to the toolbars. Navigate through the buttons using the arrow keys. + Press enter to activate a button and return focus to the editor. + Press escape to return focus to the editor without performing any actions.

        + +

        Status Bar

        +

        To access the editor status bar, press ALT-F11. Use the left and right arrow keys to navigate between elements in the path. + Press enter or space to select an element. Press escape to return focus to the editor without changing the selection.

        + +

        Context Menu

        +

        Press shift-F10 to activate the context menu. Use the up and down arrow keys to move between menu items. To open sub-menus press the right arrow key. + To close submenus press the left arrow key. Press escape to close the context menu.

        + +

        Keyboard Shortcuts

        + + + + + + + + + + + + + + + + + + + + + +
        KeystrokeFunction
        Control-BBold
        Control-IItalic
        Control-ZUndo
        Control-YRedo
        + + diff --git a/plugins/TinyMCE/js/themes/advanced/skins/default/content.css b/plugins/TinyMCE/js/themes/advanced/skins/default/content.css index 9fba0431da..569a3ae8c7 100644 --- a/plugins/TinyMCE/js/themes/advanced/skins/default/content.css +++ b/plugins/TinyMCE/js/themes/advanced/skins/default/content.css @@ -1,6 +1,7 @@ body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;} body {background:#FFF;} body.mceForceColors {background:#FFF; color:#000;} +body.mceBrowserDefaults {background:transparent; color:inherit; font-size:inherit; font-family:inherit;} h1 {font-size: 2em} h2 {font-size: 1.5em} h3 {font-size: 1.17em} @@ -8,7 +9,7 @@ h4 {font-size: 1em} h5 {font-size: .83em} h6 {font-size: .75em} .mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;} -a.mceItemAnchor {display:inline-block; width:11px !important; height:11px !important; background:url(img/items.gif) no-repeat 0 0;} +a.mceItemAnchor {display:inline-block; -webkit-user-select:all; -webkit-user-modify:read-only; -moz-user-select:all; -moz-user-modify:read-only; width:11px !important; height:11px !important; background:url(img/items.gif) no-repeat center center} span.mceItemNbsp {background: #DDD} td.mceSelected, th.mceSelected {background-color:#3399ff !important} img {border:0;} @@ -34,3 +35,13 @@ scrollbar-track-color:#F5F5F5; img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px} font[face=mceinline] {font-family:inherit !important} + +.mceItemMedia {border:1px dotted #cc0000; background-position:center; background-repeat:no-repeat; background-color:#ffffcc} +.mceItemShockWave {background-image:url(../../img/shockwave.gif)} +.mceItemFlash {background-image:url(../../img/flash.gif)} +.mceItemQuickTime {background-image:url(../../img/quicktime.gif)} +.mceItemWindowsMedia {background-image:url(../../img/windowsmedia.gif)} +.mceItemRealMedia {background-image:url(../../img/realmedia.gif)} +.mceItemVideo {background-image:url(../../img/video.gif)} +.mceItemIframe {background-image:url(../../img/iframe.gif)} +.mcePageBreak {display:block;border:0;width:100%;height:12px;border-top:1px dotted #ccc;margin-top:15px;background:#fff url(../../img/pagebreak.gif) no-repeat center top;} diff --git a/plugins/TinyMCE/js/themes/advanced/skins/default/img/buttons.png b/plugins/TinyMCE/js/themes/advanced/skins/default/img/buttons.png index 7dd58418ba..1e53560e0a 100644 Binary files a/plugins/TinyMCE/js/themes/advanced/skins/default/img/buttons.png and b/plugins/TinyMCE/js/themes/advanced/skins/default/img/buttons.png differ diff --git a/plugins/TinyMCE/js/themes/advanced/skins/default/img/items.gif b/plugins/TinyMCE/js/themes/advanced/skins/default/img/items.gif index 2eafd7954e..d2f93671ca 100644 Binary files a/plugins/TinyMCE/js/themes/advanced/skins/default/img/items.gif and b/plugins/TinyMCE/js/themes/advanced/skins/default/img/items.gif differ diff --git a/plugins/TinyMCE/js/themes/advanced/skins/default/img/tabs.gif b/plugins/TinyMCE/js/themes/advanced/skins/default/img/tabs.gif index ce4be63558..06812cb410 100644 Binary files a/plugins/TinyMCE/js/themes/advanced/skins/default/img/tabs.gif and b/plugins/TinyMCE/js/themes/advanced/skins/default/img/tabs.gif differ diff --git a/plugins/TinyMCE/js/themes/advanced/skins/default/ui.css b/plugins/TinyMCE/js/themes/advanced/skins/default/ui.css index 0049c7b3d0..2b7c2a59a9 100644 --- a/plugins/TinyMCE/js/themes/advanced/skins/default/ui.css +++ b/plugins/TinyMCE/js/themes/advanced/skins/default/ui.css @@ -4,8 +4,8 @@ .defaultSkin table td {vertical-align:middle} /* Containers */ -.defaultSkin table {direction:ltr; background:#F0F0EE} -.defaultSkin iframe {display:block; background:#FFF} +.defaultSkin table {direction:ltr;background:transparent} +.defaultSkin iframe {display:block;} .defaultSkin .mceToolbar {height:26px} .defaultSkin .mceLeft {text-align:left} .defaultSkin .mceRight {text-align:right} @@ -20,9 +20,9 @@ .defaultSkin table.mceLayout tr.mceFirst td {border-top:1px solid #CCC} .defaultSkin table.mceLayout tr.mceLast td {border-bottom:1px solid #CCC} .defaultSkin table.mceToolbar, .defaultSkin tr.mceFirst .mceToolbar tr td, .defaultSkin tr.mceLast .mceToolbar tr td {border:0; margin:0; padding:0;} -.defaultSkin td.mceToolbar {padding-top:1px; vertical-align:top} +.defaultSkin td.mceToolbar {background:#F0F0EE; padding-top:1px; vertical-align:top} .defaultSkin .mceIframeContainer {border-top:1px solid #CCC; border-bottom:1px solid #CCC} -.defaultSkin .mceStatusbar {font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; display:block; height:20px} +.defaultSkin .mceStatusbar {background:#F0F0EE; font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; display:block; height:20px} .defaultSkin .mceStatusbar div {float:left; margin:2px} .defaultSkin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize; outline:0} .defaultSkin .mceStatusbar a:hover {text-decoration:underline} @@ -103,6 +103,7 @@ .defaultSkin .mceNoIcons .mceMenuItemSelected a {background:url(img/menu_arrow.gif) no-repeat -6px center} .defaultSkin .mceMenu span.mceMenuLine {display:none} .defaultSkin .mceMenuItemSub a {background:url(img/menu_arrow.gif) no-repeat top right;} +.defaultSkin .mceMenuItem td, .defaultSkin .mceMenuItem th {line-height: normal} /* Progress,Resize */ .defaultSkin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=50)'; filter:alpha(opacity=50); background:#FFF} diff --git a/plugins/TinyMCE/js/themes/advanced/skins/highcontrast/content.css b/plugins/TinyMCE/js/themes/advanced/skins/highcontrast/content.css new file mode 100644 index 0000000000..c2e30c7a2b --- /dev/null +++ b/plugins/TinyMCE/js/themes/advanced/skins/highcontrast/content.css @@ -0,0 +1,23 @@ +body, td, pre { margin:8px;} +body.mceForceColors {background:#FFF; color:#000;} +h1 {font-size: 2em} +h2 {font-size: 1.5em} +h3 {font-size: 1.17em} +h4 {font-size: 1em} +h5 {font-size: .83em} +h6 {font-size: .75em} +.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;} +a.mceItemAnchor {display:inline-block; width:11px !important; height:11px !important; background:url(../default/img/items.gif) no-repeat 0 0;} +span.mceItemNbsp {background: #DDD} +td.mceSelected, th.mceSelected {background-color:#3399ff !important} +img {border:0;} +table {cursor:default} +table td, table th {cursor:text} +ins {border-bottom:1px solid green; text-decoration: none; color:green} +del {color:red; text-decoration:line-through} +cite {border-bottom:1px dashed blue} +acronym {border-bottom:1px dotted #CCC; cursor:help} +abbr {border-bottom:1px dashed #CCC; cursor:help} + +img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px} +font[face=mceinline] {font-family:inherit !important} diff --git a/plugins/TinyMCE/js/themes/advanced/skins/highcontrast/dialog.css b/plugins/TinyMCE/js/themes/advanced/skins/highcontrast/dialog.css new file mode 100644 index 0000000000..b2ed097cd0 --- /dev/null +++ b/plugins/TinyMCE/js/themes/advanced/skins/highcontrast/dialog.css @@ -0,0 +1,105 @@ +/* Generic */ +body { +font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px; +background:#F0F0EE; +color: black; +padding:0; +margin:8px 8px 0 8px; +} + +html {background:#F0F0EE; color:#000;} +td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} +textarea {resize:none;outline:none;} +a:link, a:visited {color:black;background-color:transparent;} +a:hover {color:#2B6FB6;background-color:transparent;} +.nowrap {white-space: nowrap} + +/* Forms */ +fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;} +legend {color:#2B6FB6; font-weight:bold;} +label.msg {display:none;} +label.invalid {color:#EE0000; display:inline;background-color:transparent;} +input.invalid {border:1px solid #EE0000;background-color:transparent;} +input {background:#FFF; border:1px solid #CCC;color:black;} +input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} +input, select, textarea {border:1px solid #808080;} +input.radio {border:1px none #000000; background:transparent; vertical-align:middle;} +input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;} +.input_noborder {border:0;} + +/* Buttons */ +#insert, #cancel, input.button, .updateButton { +font-weight:bold; +width:94px; height:23px; +cursor:pointer; +padding-bottom:2px; +float:left; +} + +#cancel {float:right} + +/* Browse */ +a.pickcolor, a.browse {text-decoration:none} +a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;} +.mceOldBoxModel a.browse span {width:22px; height:20px;} +a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;} +a.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} +a.browse:hover span.disabled {border:1px solid white; background-color:transparent;} +a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;} +.mceOldBoxModel a.pickcolor span {width:21px; height:17px;} +a.pickcolor:hover span {background-color:#B2BBD0;} +a.pickcolor:hover span.disabled {} + +/* Charmap */ +table.charmap {border:1px solid #AAA; text-align:center} +td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;} +#charmap a {display:block; color:#000; text-decoration:none; border:0} +#charmap a:hover {background:#CCC;color:#2B6FB6} +#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center} +#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center} + +/* Source */ +.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;} +.mceActionPanel {margin-top:5px;} + +/* Tabs classes */ +.tabs {width:100%; height:18px; line-height:normal;} +.tabs ul {margin:0; padding:0; list-style:none;} +.tabs li {float:left; border: 1px solid black; border-bottom:0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block; cursor:pointer;} +.tabs li.current {font-weight: bold; margin-right:2px;} +.tabs span {float:left; display:block; padding:0px 10px 0 0;} +.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;} +.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;} + +/* Panels */ +.panel_wrapper div.panel {display:none;} +.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;} +.panel_wrapper {border:1px solid #919B9C; padding:10px; padding-top:5px; clear:both; background:white;} + +/* Columns */ +.column {float:left;} +.properties {width:100%;} +.properties .column1 {} +.properties .column2 {text-align:left;} + +/* Titles */ +h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;} +h3 {font-size:14px;} +.title {font-size:12px; font-weight:bold; color:#2B6FB6;} + +/* Dialog specific */ +#link .panel_wrapper, #link div.current {height:125px;} +#image .panel_wrapper, #image div.current {height:200px;} +#plugintable thead {font-weight:bold; background:#DDD;} +#plugintable, #about #plugintable td {border:1px solid #919B9C;} +#plugintable {width:96%; margin-top:10px;} +#pluginscontainer {height:290px; overflow:auto;} +#colorpicker #preview {float:right; width:50px; height:14px;line-height:1px; border:1px solid black; margin-left:5px;} +#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;} +#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;} +#colorpicker #light div {overflow:hidden;} +#colorpicker #previewblock {float:right; padding-left:10px; height:20px;} +#colorpicker .panel_wrapper div.current {height:175px;} +#colorpicker #namedcolors {width:150px;} +#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;} +#colorpicker #colornamecontainer {margin-top:5px;} diff --git a/plugins/TinyMCE/js/themes/advanced/skins/highcontrast/ui.css b/plugins/TinyMCE/js/themes/advanced/skins/highcontrast/ui.css new file mode 100644 index 0000000000..a2cfcc393c --- /dev/null +++ b/plugins/TinyMCE/js/themes/advanced/skins/highcontrast/ui.css @@ -0,0 +1,102 @@ +/* Reset */ +.highcontrastSkin table, .highcontrastSkin tbody, .highcontrastSkin a, .highcontrastSkin img, .highcontrastSkin tr, .highcontrastSkin div, .highcontrastSkin td, .highcontrastSkin iframe, .highcontrastSkin span, .highcontrastSkin *, .highcontrastSkin .mceText {border:0; margin:0; padding:0; vertical-align:baseline; border-collapse:separate;} +.highcontrastSkin a:hover, .highcontrastSkin a:link, .highcontrastSkin a:visited, .highcontrastSkin a:active {text-decoration:none; font-weight:normal; cursor:default;} +.highcontrastSkin table td {vertical-align:middle} + +.highcontrastSkin .mceIconOnly {display: block !important;} + +/* External */ +.highcontrastSkin .mceExternalToolbar {position:absolute; border:1px solid; border-bottom:0; display:none; background-color: white;} +.highcontrastSkin .mceExternalToolbar td.mceToolbar {padding-right:13px;} +.highcontrastSkin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px;} + +/* Layout */ +.highcontrastSkin table.mceLayout {border: 1px solid;} +.highcontrastSkin .mceIframeContainer {border-top:1px solid; border-bottom:1px solid} +.highcontrastSkin .mceStatusbar a:hover {text-decoration:underline} +.highcontrastSkin .mceStatusbar {display:block; line-height:1.5em; overflow:visible;} +.highcontrastSkin .mceStatusbar div {float:left} +.highcontrastSkin .mceStatusbar a.mceResize {display:block; float:right; width:20px; height:20px; cursor:se-resize; outline:0} + +.highcontrastSkin .mceToolbar td { display: inline-block; float: left;} +.highcontrastSkin .mceToolbar tr { display: block;} +.highcontrastSkin .mceToolbar table { display: block; } + +/* Button */ + +.highcontrastSkin .mceButton { display:block; margin: 2px; padding: 5px 10px;border: 1px solid; border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px; -ms-border-radius: 3px; height: 2em;} +.highcontrastSkin .mceButton .mceVoiceLabel { height: 100%; vertical-align: center; line-height: 2em} +.highcontrastSkin .mceButtonDisabled .mceVoiceLabel { opacity:0.6; -ms-filter:'alpha(opacity=60)'; filter:alpha(opacity=60);} +.highcontrastSkin .mceButtonActive, .highcontrastSkin .mceButton:focus, .highcontrastSkin .mceButton:active { border: 5px solid; padding: 1px 6px;-webkit-focus-ring-color:none;outline:none;} + +/* Separator */ +.highcontrastSkin .mceSeparator {display:block; width:16px; height:26px;} + +/* ListBox */ +.highcontrastSkin .mceListBox { display: block; margin:2px;-webkit-focus-ring-color:none;outline:none;} +.highcontrastSkin .mceListBox .mceText {padding: 5px 6px; line-height: 2em; width: 15ex; overflow: hidden;} +.highcontrastSkin .mceListBoxDisabled .mceText { opacity:0.6; -ms-filter:'alpha(opacity=60)'; filter:alpha(opacity=60);} +.highcontrastSkin .mceListBox a.mceText { padding: 5px 10px; display: block; height: 2em; line-height: 2em; border: 1px solid; border-right: 0; border-radius: 3px 0px 0px 3px; -moz-border-radius: 3px 0px 0px 3px; -webkit-border-radius: 3px 0px 0px 3px; -ms-border-radius: 3px 0px 0px 3px;} +.highcontrastSkin .mceListBox a.mceOpen { padding: 5px 4px; display: block; height: 2em; line-height: 2em; border: 1px solid; border-left: 0; border-radius: 0px 3px 3px 0px; -moz-border-radius: 0px 3px 3px 0px; -webkit-border-radius: 0px 3px 3px 0px; -ms-border-radius: 0px 3px 3px 0px;} +.highcontrastSkin .mceListBox:focus a.mceText, .highcontrastSkin .mceListBox:active a.mceText { border-width: 5px; padding: 1px 10px 1px 6px;} +.highcontrastSkin .mceListBox:focus a.mceOpen, .highcontrastSkin .mceListBox:active a.mceOpen { border-width: 5px; padding: 1px 0px 1px 4px;} + +.highcontrastSkin .mceListBoxMenu {overflow-y:auto} + +/* SplitButton */ +.highcontrastSkin .mceSplitButtonDisabled .mceAction {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} + +.highcontrastSkin .mceSplitButton { border-collapse: collapse; margin: 2px; height: 2em; line-height: 2em;-webkit-focus-ring-color:none;outline:none;} +.highcontrastSkin .mceSplitButton td { display: table-cell; float: none; margin: 0; padding: 0; height: 2em;} +.highcontrastSkin .mceSplitButton tr { display: table-row; } +.highcontrastSkin table.mceSplitButton { display: table; } +.highcontrastSkin .mceSplitButton a.mceAction { padding: 5px 10px; display: block; height: 2em; line-height: 2em; overflow: hidden; border: 1px solid; border-right: 0; border-radius: 3px 0px 0px 3px; -moz-border-radius: 3px 0px 0px 3px; -webkit-border-radius: 3px 0px 0px 3px; -ms-border-radius: 3px 0px 0px 3px;} +.highcontrastSkin .mceSplitButton a.mceOpen { padding: 5px 4px; display: block; height: 2em; line-height: 2em; border: 1px solid; border-radius: 0px 3px 3px 0px; -moz-border-radius: 0px 3px 3px 0px; -webkit-border-radius: 0px 3px 3px 0px; -ms-border-radius: 0px 3px 3px 0px;} +.highcontrastSkin .mceSplitButton .mceVoiceLabel { height: 2em; vertical-align: center; line-height: 2em; } +.highcontrastSkin .mceSplitButton:focus a.mceAction, .highcontrastSkin .mceSplitButton:active a.mceAction { border-width: 5px; border-right-width: 1px; padding: 1px 10px 1px 6px;-webkit-focus-ring-color:none;outline:none;} +.highcontrastSkin .mceSplitButton:focus a.mceOpen, .highcontrastSkin .mceSplitButton:active a.mceOpen { border-width: 5px; border-left-width: 1px; padding: 1px 0px 1px 4px;-webkit-focus-ring-color:none;outline:none;} + +/* Menu */ +.highcontrastSkin .mceNoIcons span.mceIcon {width:0;} +.highcontrastSkin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid; } +.highcontrastSkin .mceMenu table {background:white; color: black} +.highcontrastSkin .mceNoIcons a .mceText {padding-left:10px} +.highcontrastSkin .mceMenu a, .highcontrastSkin .mceMenu span, .highcontrastSkin .mceMenu {display:block;background:white; color: black} +.highcontrastSkin .mceMenu td {height:2em} +.highcontrastSkin .mceMenu a {position:relative;padding:3px 0 4px 0; display: block;} +.highcontrastSkin .mceMenu .mceText {position:relative; display:block; cursor:default; margin:0; padding:0 25px 0 25px;} +.highcontrastSkin .mceMenu pre.mceText {font-family:Monospace} +.highcontrastSkin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:26px;} +.highcontrastSkin td.mceMenuItemSeparator {border-top:1px solid; height:1px} +.highcontrastSkin .mceMenuItemTitle a {border:0; border-bottom:1px solid} +.highcontrastSkin .mceMenuItemTitle span.mceText {font-weight:bold; padding-left:4px} +.highcontrastSkin .mceNoIcons .mceMenuItemSelected span.mceText:before {content: "\2713\A0";} +.highcontrastSkin .mceMenu span.mceMenuLine {display:none} +.highcontrastSkin .mceMenuItemSub a .mceText:after {content: "\A0\25B8"} +.highcontrastSkin .mceMenuItem td, .highcontrastSkin .mceMenuItem th {line-height: normal} + +/* ColorSplitButton */ +.highcontrastSkin div.mceColorSplitMenu table {background:#FFF; border:1px solid; color: #000} +.highcontrastSkin .mceColorSplitMenu td {padding:2px} +.highcontrastSkin .mceColorSplitMenu a {display:block; width:16px; height:16px; overflow:hidden; color:#000; margin: 0; padding: 0;} +.highcontrastSkin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px} +.highcontrastSkin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px; border:1px solid #FFF} +.highcontrastSkin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid; background-color:#B6BDD2} +.highcontrastSkin a.mceMoreColors:hover {border:1px solid #0A246A; color: #000;} +.highcontrastSkin .mceColorPreview {display:none;} +.highcontrastSkin .mce_forecolor span.mceAction, .highcontrastSkin .mce_backcolor span.mceAction {height:17px;overflow:hidden} + +/* Progress,Resize */ +.highcontrastSkin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=50); background:#FFF} +.highcontrastSkin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(../default/img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px} + +/* Formats */ +.highcontrastSkin .mce_p span.mceText {} +.highcontrastSkin .mce_address span.mceText {font-style:italic} +.highcontrastSkin .mce_pre span.mceText {font-family:monospace} +.highcontrastSkin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em} +.highcontrastSkin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em} +.highcontrastSkin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em} +.highcontrastSkin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em} +.highcontrastSkin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em} +.highcontrastSkin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em} diff --git a/plugins/TinyMCE/js/themes/advanced/skins/o2k7/content.css b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/content.css index 3b833d9451..4ac4e4dfb3 100644 --- a/plugins/TinyMCE/js/themes/advanced/skins/o2k7/content.css +++ b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/content.css @@ -34,3 +34,13 @@ scrollbar-track-color:#F5F5F5; img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px} font[face=mceinline] {font-family:inherit !important} + +.mceItemMedia {border:1px dotted #cc0000; background-position:center; background-repeat:no-repeat; background-color:#ffffcc} +.mceItemShockWave {background-image:url(../../img/shockwave.gif)} +.mceItemFlash {background-image:url(../../img/flash.gif)} +.mceItemQuickTime {background-image:url(../../img/quicktime.gif)} +.mceItemWindowsMedia {background-image:url(../../img/windowsmedia.gif)} +.mceItemRealMedia {background-image:url(../../img/realmedia.gif)} +.mceItemVideo {background-image:url(../../img/video.gif)} +.mceItemIframe {background-image:url(../../img/iframe.gif)} +.mcePageBreak {display:block;border:0;width:100%;height:12px;border-top:1px dotted #ccc;margin-top:15px;background:#fff url(../../img/pagebreak.gif) no-repeat center top;} diff --git a/plugins/TinyMCE/js/themes/advanced/skins/o2k7/dialog.css b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/dialog.css index e3af1396e4..ec08772248 100644 --- a/plugins/TinyMCE/js/themes/advanced/skins/o2k7/dialog.css +++ b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/dialog.css @@ -114,3 +114,4 @@ h3 {font-size:14px;} #colorpicker #namedcolors {width:150px;} #colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;} #colorpicker #colornamecontainer {margin-top:5px;} +#colorpicker #picker_panel fieldset {margin:auto;width:325px;} diff --git a/plugins/TinyMCE/js/themes/advanced/skins/o2k7/img/button_bg.png b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/img/button_bg.png index 12cfb419bb..13a5cb0309 100644 Binary files a/plugins/TinyMCE/js/themes/advanced/skins/o2k7/img/button_bg.png and b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/img/button_bg.png differ diff --git a/plugins/TinyMCE/js/themes/advanced/skins/o2k7/img/button_bg_black.png b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/img/button_bg_black.png index 8996c7493e..7fc57f2bc2 100644 Binary files a/plugins/TinyMCE/js/themes/advanced/skins/o2k7/img/button_bg_black.png and b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/img/button_bg_black.png differ diff --git a/plugins/TinyMCE/js/themes/advanced/skins/o2k7/img/button_bg_silver.png b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/img/button_bg_silver.png index bd5d2550c0..c0dcc6cac2 100644 Binary files a/plugins/TinyMCE/js/themes/advanced/skins/o2k7/img/button_bg_silver.png and b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/img/button_bg_silver.png differ diff --git a/plugins/TinyMCE/js/themes/advanced/skins/o2k7/ui.css b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/ui.css index a6253976af..29e35e5ef2 100644 --- a/plugins/TinyMCE/js/themes/advanced/skins/o2k7/ui.css +++ b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/ui.css @@ -4,8 +4,8 @@ .o2k7Skin table td {vertical-align:middle} /* Containers */ -.o2k7Skin table {background:#E5EFFD} -.o2k7Skin iframe {display:block; background:#FFF} +.o2k7Skin table {background:transparent} +.o2k7Skin iframe {display:block;} .o2k7Skin .mceToolbar {height:26px} /* External */ @@ -19,7 +19,8 @@ .o2k7Skin table.mceLayout tr.mceLast td {border-bottom:1px solid #ABC6DD} .o2k7Skin table.mceToolbar, .o2k7Skin tr.mceFirst .mceToolbar tr td, .o2k7Skin tr.mceLast .mceToolbar tr td {border:0; margin:0; padding:0} .o2k7Skin .mceIframeContainer {border-top:1px solid #ABC6DD; border-bottom:1px solid #ABC6DD} -.o2k7Skin .mceStatusbar {display:block; font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; height:20px} +.o2k7Skin td.mceToolbar{background:#E5EFFD} +.o2k7Skin .mceStatusbar {background:#E5EFFD; display:block; font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; height:20px} .o2k7Skin .mceStatusbar div {float:left; padding:2px} .o2k7Skin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize; outline:0} .o2k7Skin .mceStatusbar a:hover {text-decoration:underline} @@ -50,7 +51,7 @@ .o2k7Skin .mceSeparator {display:block; background:url(img/button_bg.png) -22px 0; width:5px; height:22px} /* ListBox */ -.o2k7Skin .mceListBox {margin-left:3px} +.o2k7Skin .mceListBox {display: inline-block; margin-left: 3px} .o2k7Skin .mceListBox, .o2k7Skin .mceListBox a {display:block} .o2k7Skin .mceListBox .mceText {padding-left:4px; text-align:left; width:70px; border:1px solid #b3c7e1; border-right:0; background:#eaf2fb; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; height:20px; line-height:20px; overflow:hidden} .o2k7Skin .mceListBox .mceOpen {width:14px; height:22px; background:url(img/button_bg.png) -66px 0} @@ -62,7 +63,7 @@ .o2k7Skin select.mceListBox {font-family:Tahoma,Verdana,Arial,Helvetica; font-size:12px; border:1px solid #b3c7e1; background:#FFF;} /* SplitButton */ -.o2k7Skin .mceSplitButton, .o2k7Skin .mceSplitButton a, .o2k7Skin .mceSplitButton span {display:block; height:22px} +.o2k7Skin .mceSplitButton, .o2k7Skin .mceSplitButton a, .o2k7Skin .mceSplitButton span {display:block; height:22px; direction:ltr} .o2k7Skin .mceSplitButton {background:url(img/button_bg.png)} .o2k7Skin .mceSplitButton a.mceAction {width:22px} .o2k7Skin .mceSplitButton span.mceAction {width:22px; background-image:url(../../img/icons.gif)} @@ -105,6 +106,7 @@ .o2k7Skin .mceNoIcons .mceMenuItemSelected a {background:url(../default/img/menu_arrow.gif) no-repeat -6px center} .o2k7Skin .mceMenu span.mceMenuLine {display:none} .o2k7Skin .mceMenuItemSub a {background:url(../default/img/menu_arrow.gif) no-repeat top right;} +.o2k7Skin .mceMenuItem td, .o2k7Skin .mceMenuItem th {line-height: normal} /* Progress,Resize */ .o2k7Skin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=50); background:#FFF} diff --git a/plugins/TinyMCE/js/themes/advanced/skins/o2k7/ui_black.css b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/ui_black.css index 153f0c38a6..50c9b76a2d 100644 --- a/plugins/TinyMCE/js/themes/advanced/skins/o2k7/ui_black.css +++ b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/ui_black.css @@ -1,6 +1,6 @@ /* Black */ .o2k7SkinBlack .mceToolbar .mceToolbarStart span, .o2k7SkinBlack .mceToolbar .mceToolbarEnd span, .o2k7SkinBlack .mceButton, .o2k7SkinBlack .mceSplitButton, .o2k7SkinBlack .mceSeparator, .o2k7SkinBlack .mceSplitButton a.mceOpen, .o2k7SkinBlack .mceListBox a.mceOpen {background-image:url(img/button_bg_black.png)} -.o2k7SkinBlack table, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack .mceMenuItemTitle span.mceText, .o2k7SkinBlack .mceStatusbar div, .o2k7SkinBlack .mceStatusbar span, .o2k7SkinBlack .mceStatusbar a {background:#535353; color:#FFF} +.o2k7SkinBlack td.mceToolbar, .o2k7SkinBlack td.mceStatusbar, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack .mceMenuItemTitle span.mceText, .o2k7SkinBlack .mceStatusbar div, .o2k7SkinBlack .mceStatusbar span, .o2k7SkinBlack .mceStatusbar a {background:#535353; color:#FFF} .o2k7SkinBlack table.mceListBoxEnabled .mceText, o2k7SkinBlack .mceListBox .mceText {background:#FFF; border:1px solid #CBCFD4; border-bottom-color:#989FA9; border-right:0} .o2k7SkinBlack table.mceListBoxEnabled:hover .mceText, .o2k7SkinBlack .mceListBoxHover .mceText, .o2k7SkinBlack .mceListBoxSelected .mceText {background:#FFF; border:1px solid #FFBD69; border-right:0} .o2k7SkinBlack .mceExternalToolbar, .o2k7SkinBlack .mceListBox .mceText, .o2k7SkinBlack div.mceMenu, .o2k7SkinBlack table.mceLayout, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack table.mceLayout tr.mceFirst td, .o2k7SkinBlack table.mceLayout, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack table.mceLayout tr.mceLast td, .o2k7SkinBlack .mceIframeContainer {border-color: #535353;} diff --git a/plugins/TinyMCE/js/themes/advanced/skins/o2k7/ui_silver.css b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/ui_silver.css index 7fe3b45e12..960a8e4755 100644 --- a/plugins/TinyMCE/js/themes/advanced/skins/o2k7/ui_silver.css +++ b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/ui_silver.css @@ -1,5 +1,5 @@ /* Silver */ .o2k7SkinSilver .mceToolbar .mceToolbarStart span, .o2k7SkinSilver .mceButton, .o2k7SkinSilver .mceSplitButton, .o2k7SkinSilver .mceSeparator, .o2k7SkinSilver .mceSplitButton a.mceOpen, .o2k7SkinSilver .mceListBox a.mceOpen {background-image:url(img/button_bg_silver.png)} -.o2k7SkinSilver table, .o2k7SkinSilver .mceMenuItemTitle a {background:#eee} +.o2k7SkinSilver td.mceToolbar, .o2k7SkinSilver td.mceStatusbar, .o2k7SkinSilver .mceMenuItemTitle a {background:#eee} .o2k7SkinSilver .mceListBox .mceText {background:#FFF} .o2k7SkinSilver .mceExternalToolbar, .o2k7SkinSilver .mceListBox .mceText, .o2k7SkinSilver div.mceMenu, .o2k7SkinSilver table.mceLayout, .o2k7SkinSilver .mceMenuItemTitle a, .o2k7SkinSilver table.mceLayout tr.mceFirst td, .o2k7SkinSilver table.mceLayout, .o2k7SkinSilver .mceMenuItemTitle a, .o2k7SkinSilver table.mceLayout tr.mceLast td, .o2k7SkinSilver .mceIframeContainer {border-color: #bbb} diff --git a/plugins/TinyMCE/js/themes/advanced/source_editor.htm b/plugins/TinyMCE/js/themes/advanced/source_editor.htm index 5957bbd178..3c6d65808a 100644 --- a/plugins/TinyMCE/js/themes/advanced/source_editor.htm +++ b/plugins/TinyMCE/js/themes/advanced/source_editor.htm @@ -6,7 +6,7 @@
        -
        {#advanced_dlg.code_title}
        +
        @@ -17,8 +17,8 @@
        - - + +
        diff --git a/plugins/TinyMCE/js/themes/simple/editor_template.js b/plugins/TinyMCE/js/themes/simple/editor_template.js index ed89abc067..4b3209cc92 100644 --- a/plugins/TinyMCE/js/themes/simple/editor_template.js +++ b/plugins/TinyMCE/js/themes/simple/editor_template.js @@ -1 +1 @@ -(function(){var a=tinymce.DOM;tinymce.ThemeManager.requireLangPack("simple");tinymce.create("tinymce.themes.SimpleTheme",{init:function(c,d){var e=this,b=["Bold","Italic","Underline","Strikethrough","InsertUnorderedList","InsertOrderedList"],f=c.settings;e.editor=c;c.onInit.add(function(){c.onNodeChange.add(function(h,g){tinymce.each(b,function(i){g.get(i.toLowerCase()).setActive(h.queryCommandState(i))})});c.dom.loadCSS(d+"/skins/"+f.skin+"/content.css")});a.loadCSS((f.editor_css?c.documentBaseURI.toAbsolute(f.editor_css):"")||d+"/skins/"+f.skin+"/ui.css")},renderUI:function(h){var e=this,i=h.targetNode,b,c,d=e.editor,f=d.controlManager,g;i=a.insertAfter(a.create("span",{id:d.id+"_container","class":"mceEditor "+d.settings.skin+"SimpleSkin"}),i);i=g=a.add(i,"table",{cellPadding:0,cellSpacing:0,"class":"mceLayout"});i=c=a.add(i,"tbody");i=a.add(c,"tr");i=b=a.add(a.add(i,"td"),"div",{"class":"mceIframeContainer"});i=a.add(a.add(c,"tr",{"class":"last"}),"td",{"class":"mceToolbar mceLast",align:"center"});c=e.toolbar=f.createToolbar("tools1");c.add(f.createButton("bold",{title:"simple.bold_desc",cmd:"Bold"}));c.add(f.createButton("italic",{title:"simple.italic_desc",cmd:"Italic"}));c.add(f.createButton("underline",{title:"simple.underline_desc",cmd:"Underline"}));c.add(f.createButton("strikethrough",{title:"simple.striketrough_desc",cmd:"Strikethrough"}));c.add(f.createSeparator());c.add(f.createButton("undo",{title:"simple.undo_desc",cmd:"Undo"}));c.add(f.createButton("redo",{title:"simple.redo_desc",cmd:"Redo"}));c.add(f.createSeparator());c.add(f.createButton("cleanup",{title:"simple.cleanup_desc",cmd:"mceCleanup"}));c.add(f.createSeparator());c.add(f.createButton("insertunorderedlist",{title:"simple.bullist_desc",cmd:"InsertUnorderedList"}));c.add(f.createButton("insertorderedlist",{title:"simple.numlist_desc",cmd:"InsertOrderedList"}));c.renderTo(i);return{iframeContainer:b,editorContainer:d.id+"_container",sizeContainer:g,deltaHeight:-20}},getInfo:function(){return{longname:"Simple theme",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.ThemeManager.add("simple",tinymce.themes.SimpleTheme)})(); \ No newline at end of file +(function(){var a=tinymce.DOM;tinymce.ThemeManager.requireLangPack("simple");tinymce.create("tinymce.themes.SimpleTheme",{init:function(c,d){var e=this,b=["Bold","Italic","Underline","Strikethrough","InsertUnorderedList","InsertOrderedList"],f=c.settings;e.editor=c;c.contentCSS.push(d+"/skins/"+f.skin+"/content.css");c.onInit.add(function(){c.onNodeChange.add(function(h,g){tinymce.each(b,function(i){g.get(i.toLowerCase()).setActive(h.queryCommandState(i))})})});a.loadCSS((f.editor_css?c.documentBaseURI.toAbsolute(f.editor_css):"")||d+"/skins/"+f.skin+"/ui.css")},renderUI:function(h){var e=this,i=h.targetNode,b,c,d=e.editor,f=d.controlManager,g;i=a.insertAfter(a.create("span",{id:d.id+"_container","class":"mceEditor "+d.settings.skin+"SimpleSkin"}),i);i=g=a.add(i,"table",{cellPadding:0,cellSpacing:0,"class":"mceLayout"});i=c=a.add(i,"tbody");i=a.add(c,"tr");i=b=a.add(a.add(i,"td"),"div",{"class":"mceIframeContainer"});i=a.add(a.add(c,"tr",{"class":"last"}),"td",{"class":"mceToolbar mceLast",align:"center"});c=e.toolbar=f.createToolbar("tools1");c.add(f.createButton("bold",{title:"simple.bold_desc",cmd:"Bold"}));c.add(f.createButton("italic",{title:"simple.italic_desc",cmd:"Italic"}));c.add(f.createButton("underline",{title:"simple.underline_desc",cmd:"Underline"}));c.add(f.createButton("strikethrough",{title:"simple.striketrough_desc",cmd:"Strikethrough"}));c.add(f.createSeparator());c.add(f.createButton("undo",{title:"simple.undo_desc",cmd:"Undo"}));c.add(f.createButton("redo",{title:"simple.redo_desc",cmd:"Redo"}));c.add(f.createSeparator());c.add(f.createButton("cleanup",{title:"simple.cleanup_desc",cmd:"mceCleanup"}));c.add(f.createSeparator());c.add(f.createButton("insertunorderedlist",{title:"simple.bullist_desc",cmd:"InsertUnorderedList"}));c.add(f.createButton("insertorderedlist",{title:"simple.numlist_desc",cmd:"InsertOrderedList"}));c.renderTo(i);return{iframeContainer:b,editorContainer:d.id+"_container",sizeContainer:g,deltaHeight:-20}},getInfo:function(){return{longname:"Simple theme",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.ThemeManager.add("simple",tinymce.themes.SimpleTheme)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/themes/simple/editor_template_src.js b/plugins/TinyMCE/js/themes/simple/editor_template_src.js index 4b862d49d6..01ce87c58a 100644 --- a/plugins/TinyMCE/js/themes/simple/editor_template_src.js +++ b/plugins/TinyMCE/js/themes/simple/editor_template_src.js @@ -19,6 +19,7 @@ var t = this, states = ['Bold', 'Italic', 'Underline', 'Strikethrough', 'InsertUnorderedList', 'InsertOrderedList'], s = ed.settings; t.editor = ed; + ed.contentCSS.push(url + "/skins/" + s.skin + "/content.css"); ed.onInit.add(function() { ed.onNodeChange.add(function(ed, cm) { @@ -26,8 +27,6 @@ cm.get(c.toLowerCase()).setActive(ed.queryCommandState(c)); }); }); - - ed.dom.loadCSS(url + "/skins/" + s.skin + "/content.css"); }); DOM.loadCSS((s.editor_css ? ed.documentBaseURI.toAbsolute(s.editor_css) : '') || url + "/skins/" + s.skin + "/ui.css"); diff --git a/plugins/TinyMCE/js/themes/simple/img/icons.gif b/plugins/TinyMCE/js/themes/simple/img/icons.gif index 16af141ff0..6fcbcb5ded 100644 Binary files a/plugins/TinyMCE/js/themes/simple/img/icons.gif and b/plugins/TinyMCE/js/themes/simple/img/icons.gif differ diff --git a/plugins/TinyMCE/js/tiny_mce.js b/plugins/TinyMCE/js/tiny_mce.js index 782f7f40ba..6463ba05c1 100644 --- a/plugins/TinyMCE/js/tiny_mce.js +++ b/plugins/TinyMCE/js/tiny_mce.js @@ -1 +1 @@ -(function(c){var a=/^\s*|\s*$/g,d;var b={majorVersion:"3",minorVersion:"3.8",releaseDate:"2010-06-30",_init:function(){var r=this,o=document,m=navigator,f=m.userAgent,l,e,k,j,h,q;r.isOpera=c.opera&&opera.buildNumber;r.isWebKit=/WebKit/.test(f);r.isIE=!r.isWebKit&&!r.isOpera&&(/MSIE/gi).test(f)&&(/Explorer/gi).test(m.appName);r.isIE6=r.isIE&&/MSIE [56]/.test(f);r.isGecko=!r.isWebKit&&/Gecko/.test(f);r.isMac=f.indexOf("Mac")!=-1;r.isAir=/adobeair/i.test(f);r.isIDevice=/(iPad|iPhone)/.test(f);if(c.tinyMCEPreInit){r.suffix=tinyMCEPreInit.suffix;r.baseURL=tinyMCEPreInit.base;r.query=tinyMCEPreInit.query;return}r.suffix="";e=o.getElementsByTagName("base");for(l=0;l=c.length){for(e=0,b=g.length;e=c.length||g[e]!=c[e]){f=e+1;break}}}if(g.length=g.length||g[e]!=c[e]){f=e+1;break}}}if(f==1){return h}for(e=0,b=g.length-(f-1);e=0;c--){if(f[c].length==0||f[c]=="."){continue}if(f[c]==".."){b++;continue}if(b>0){b--;continue}h.push(f[c])}c=e.length-b;if(c<=0){g=h.reverse().join("/")}else{g=e.slice(0,c).join("/")+"/"+h.reverse().join("/")}if(g.indexOf("/")!==0){g="/"+g}if(d&&g.lastIndexOf("/")!==g.length-1){g+=d}return g},getURI:function(d){var c,b=this;if(!b.source||d){c="";if(!d){if(b.protocol){c+=b.protocol+"://"}if(b.userInfo){c+=b.userInfo+"@"}if(b.host){c+=b.host}if(b.port){c+=":"+b.port}}if(b.path){c+=b.path}if(b.query){c+="?"+b.query}if(b.anchor){c+="#"+b.anchor}b.source=c}return b.source}})})();(function(){var a=tinymce.each;tinymce.create("static tinymce.util.Cookie",{getHash:function(d){var b=this.get(d),c;if(b){a(b.split("&"),function(e){e=e.split("=");c=c||{};c[unescape(e[0])]=unescape(e[1])})}return c},setHash:function(j,b,g,f,i,c){var h="";a(b,function(e,d){h+=(!h?"":"&")+escape(d)+"="+escape(e)});this.set(j,h,g,f,i,c)},get:function(i){var h=document.cookie,g,f=i+"=",d;if(!h){return}d=h.indexOf("; "+f);if(d==-1){d=h.indexOf(f);if(d!=0){return null}}else{d+=2}g=h.indexOf(";",d);if(g==-1){g=h.length}return unescape(h.substring(d+f.length,g))},set:function(i,b,g,f,h,c){document.cookie=i+"="+escape(b)+((g)?"; expires="+g.toGMTString():"")+((f)?"; path="+escape(f):"")+((h)?"; domain="+h:"")+((c)?"; secure":"")},remove:function(e,b){var c=new Date();c.setTime(c.getTime()-1000);this.set(e,"",c,b,c)}})})();tinymce.create("static tinymce.util.JSON",{serialize:function(e){var c,a,d=tinymce.util.JSON.serialize,b;if(e==null){return"null"}b=typeof e;if(b=="string"){a="\bb\tt\nn\ff\rr\"\"''\\\\";return'"'+e.replace(/([\u0080-\uFFFF\x00-\x1f\"])/g,function(g,f){c=a.indexOf(f);if(c+1){return"\\"+a.charAt(c+1)}g=f.charCodeAt().toString(16);return"\\u"+"0000".substring(g.length)+g})+'"'}if(b=="object"){if(e.hasOwnProperty&&e instanceof Array){for(c=0,a="[";c0?",":"")+d(e[c])}return a+"]"}a="{";for(c in e){a+=typeof e[c]!="function"?(a.length>1?',"':'"')+c+'":'+d(e[c]):""}return a+"}"}return""+e},parse:function(s){try{return eval("("+s+")")}catch(ex){}}});tinymce.create("static tinymce.util.XHR",{send:function(g){var a,e,b=window,h=0;g.scope=g.scope||this;g.success_scope=g.success_scope||g.scope;g.error_scope=g.error_scope||g.scope;g.async=g.async===false?false:true;g.data=g.data||"";function d(i){a=0;try{a=new ActiveXObject(i)}catch(c){}return a}a=b.XMLHttpRequest?new XMLHttpRequest():d("Microsoft.XMLHTTP")||d("Msxml2.XMLHTTP");if(a){if(a.overrideMimeType){a.overrideMimeType(g.content_type)}a.open(g.type||(g.data?"POST":"GET"),g.url,g.async);if(g.content_type){a.setRequestHeader("Content-Type",g.content_type)}a.setRequestHeader("X-Requested-With","XMLHttpRequest");a.send(g.data);function f(){if(!g.async||a.readyState==4||h++>10000){if(g.success&&h<10000&&a.status==200){g.success.call(g.success_scope,""+a.responseText,a,g)}else{if(g.error){g.error.call(g.error_scope,h>10000?"TIMED_OUT":"GENERAL",a,g)}}a=null}else{b.setTimeout(f,10)}}if(!g.async){return f()}e=b.setTimeout(f,10)}}});(function(){var c=tinymce.extend,b=tinymce.util.JSON,a=tinymce.util.XHR;tinymce.create("tinymce.util.JSONRequest",{JSONRequest:function(d){this.settings=c({},d);this.count=0},send:function(f){var e=f.error,d=f.success;f=c(this.settings,f);f.success=function(h,g){h=b.parse(h);if(typeof(h)=="undefined"){h={error:"JSON Parse error."}}if(h.error){e.call(f.error_scope||f.scope,h.error,g)}else{d.call(f.success_scope||f.scope,h.result)}};f.error=function(h,g){e.call(f.error_scope||f.scope,h,g)};f.data=b.serialize({id:f.id||"c"+(this.count++),method:f.method,params:f.params});f.content_type="application/json";a.send(f)},"static":{sendRPC:function(d){return new tinymce.util.JSONRequest().send(d)}}})}());(function(m){var k=m.each,j=m.is,i=m.isWebKit,d=m.isIE,a=/^(H[1-6R]|P|DIV|ADDRESS|PRE|FORM|T(ABLE|BODY|HEAD|FOOT|H|R|D)|LI|OL|UL|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|NOSCRIPT|MENU|ISINDEX|SAMP)$/,e=g("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected"),f=g("src,href,style,coords,shape"),c={"&":"&",'"':""","<":"<",">":">"},n=/[<>&\"]/g,b=/^([a-z0-9],?)+$/i,h=/<(\w+)((?:\s+\w+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)(\s*\/?)>/g,l=/(\w+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g;function g(q){var p={},o;q=q.split(",");for(o=q.length;o>=0;o--){p[q[o]]=1}return p}m.create("tinymce.dom.DOMUtils",{doc:null,root:null,files:null,pixelStyles:/^(top|left|bottom|right|width|height|borderWidth)$/,props:{"for":"htmlFor","class":"className",className:"className",checked:"checked",disabled:"disabled",maxlength:"maxLength",readonly:"readOnly",selected:"selected",value:"value",id:"id",name:"name",type:"type"},DOMUtils:function(u,q){var p=this,o;p.doc=u;p.win=window;p.files={};p.cssFlicker=false;p.counter=0;p.boxModel=!m.isIE||u.compatMode=="CSS1Compat";p.stdMode=u.documentMode===8;p.settings=q=m.extend({keep_values:false,hex_colors:1,process_html:1},q);if(m.isIE6){try{u.execCommand("BackgroundImageCache",false,true)}catch(r){p.cssFlicker=true}}if(q.valid_styles){p._styles={};k(q.valid_styles,function(t,s){p._styles[s]=m.explode(t)})}m.addUnload(p.destroy,p)},getRoot:function(){var o=this,p=o.settings;return(p&&o.get(p.root_element))||o.doc.body},getViewPort:function(p){var q,o;p=!p?this.win:p;q=p.document;o=this.boxModel?q.documentElement:q.body;return{x:p.pageXOffset||o.scrollLeft,y:p.pageYOffset||o.scrollTop,w:p.innerWidth||o.clientWidth,h:p.innerHeight||o.clientHeight}},getRect:function(s){var r,o=this,q;s=o.get(s);r=o.getPos(s);q=o.getSize(s);return{x:r.x,y:r.y,w:q.w,h:q.h}},getSize:function(r){var p=this,o,q;r=p.get(r);o=p.getStyle(r,"width");q=p.getStyle(r,"height");if(o.indexOf("px")===-1){o=0}if(q.indexOf("px")===-1){q=0}return{w:parseInt(o)||r.offsetWidth||r.clientWidth,h:parseInt(q)||r.offsetHeight||r.clientHeight}},getParent:function(q,p,o){return this.getParents(q,p,o,false)},getParents:function(z,v,s,y){var q=this,p,u=q.settings,x=[];z=q.get(z);y=y===undefined;if(u.strict_root){s=s||q.getRoot()}if(j(v,"string")){p=v;if(v==="*"){v=function(o){return o.nodeType==1}}else{v=function(o){return q.is(o,p)}}}while(z){if(z==s||!z.nodeType||z.nodeType===9){break}if(!v||v(z)){if(y){x.push(z)}else{return z}}z=z.parentNode}return y?x:null},get:function(o){var p;if(o&&this.doc&&typeof(o)=="string"){p=o;o=this.doc.getElementById(o);if(o&&o.id!==p){return this.doc.getElementsByName(p)[1]}}return o},getNext:function(p,o){return this._findSib(p,o,"nextSibling")},getPrev:function(p,o){return this._findSib(p,o,"previousSibling")},add:function(s,v,o,r,u){var q=this;return this.run(s,function(y){var x,t;x=j(v,"string")?q.doc.createElement(v):v;q.setAttribs(x,o);if(r){if(r.nodeType){x.appendChild(r)}else{q.setHTML(x,r)}}return !u?y.appendChild(x):x})},create:function(q,o,p){return this.add(this.doc.createElement(q),q,o,p,1)},createHTML:function(v,p,s){var u="",r=this,q;u+="<"+v;for(q in p){if(p.hasOwnProperty(q)){u+=" "+q+'="'+r.encode(p[q])+'"'}}if(m.is(s)){return u+">"+s+""}return u+" />"},remove:function(o,p){return this.run(o,function(r){var q,s;q=r.parentNode;if(!q){return null}if(p){while(s=r.firstChild){if(!m.isIE||s.nodeType!==3||s.nodeValue){q.insertBefore(s,r)}else{r.removeChild(s)}}}return q.removeChild(r)})},setStyle:function(r,o,p){var q=this;return q.run(r,function(v){var u,t;u=v.style;o=o.replace(/-(\D)/g,function(x,s){return s.toUpperCase()});if(q.pixelStyles.test(o)&&(m.is(p,"number")||/^[\-0-9\.]+$/.test(p))){p+="px"}switch(o){case"opacity":if(d){u.filter=p===""?"":"alpha(opacity="+(p*100)+")";if(!r.currentStyle||!r.currentStyle.hasLayout){u.display="inline-block"}}u[o]=u["-moz-opacity"]=u["-khtml-opacity"]=p||"";break;case"float":d?u.styleFloat=p:u.cssFloat=p;break;default:u[o]=p||""}if(q.settings.update_styles){q.setAttrib(v,"_mce_style")}})},getStyle:function(r,o,q){r=this.get(r);if(!r){return false}if(this.doc.defaultView&&q){o=o.replace(/[A-Z]/g,function(s){return"-"+s});try{return this.doc.defaultView.getComputedStyle(r,null).getPropertyValue(o)}catch(p){return null}}o=o.replace(/-(\D)/g,function(t,s){return s.toUpperCase()});if(o=="float"){o=d?"styleFloat":"cssFloat"}if(r.currentStyle&&q){return r.currentStyle[o]}return r.style[o]},setStyles:function(u,v){var q=this,r=q.settings,p;p=r.update_styles;r.update_styles=0;k(v,function(o,s){q.setStyle(u,s,o)});r.update_styles=p;if(r.update_styles){q.setAttrib(u,r.cssText)}},setAttrib:function(q,r,o){var p=this;if(!q||!r){return}if(p.settings.strict){r=r.toLowerCase()}return this.run(q,function(u){var t=p.settings;switch(r){case"style":if(!j(o,"string")){k(o,function(s,x){p.setStyle(u,x,s)});return}if(t.keep_values){if(o&&!p._isRes(o)){u.setAttribute("_mce_style",o,2)}else{u.removeAttribute("_mce_style",2)}}u.style.cssText=o;break;case"class":u.className=o||"";break;case"src":case"href":if(t.keep_values){if(t.url_converter){o=t.url_converter.call(t.url_converter_scope||p,o,r,u)}p.setAttrib(u,"_mce_"+r,o,2)}break;case"shape":u.setAttribute("_mce_style",o);break}if(j(o)&&o!==null&&o.length!==0){u.setAttribute(r,""+o,2)}else{u.removeAttribute(r,2)}})},setAttribs:function(q,r){var p=this;return this.run(q,function(o){k(r,function(s,t){p.setAttrib(o,t,s)})})},getAttrib:function(r,s,q){var o,p=this;r=p.get(r);if(!r||r.nodeType!==1){return false}if(!j(q)){q=""}if(/^(src|href|style|coords|shape)$/.test(s)){o=r.getAttribute("_mce_"+s);if(o){return o}}if(d&&p.props[s]){o=r[p.props[s]];o=o&&o.nodeValue?o.nodeValue:o}if(!o){o=r.getAttribute(s,2)}if(/^(checked|compact|declare|defer|disabled|ismap|multiple|nohref|noshade|nowrap|readonly|selected)$/.test(s)){if(r[p.props[s]]===true&&o===""){return s}return o?s:""}if(r.nodeName==="FORM"&&r.getAttributeNode(s)){return r.getAttributeNode(s).nodeValue}if(s==="style"){o=o||r.style.cssText;if(o){o=p.serializeStyle(p.parseStyle(o),r.nodeName);if(p.settings.keep_values&&!p._isRes(o)){r.setAttribute("_mce_style",o)}}}if(i&&s==="class"&&o){o=o.replace(/(apple|webkit)\-[a-z\-]+/gi,"")}if(d){switch(s){case"rowspan":case"colspan":if(o===1){o=""}break;case"size":if(o==="+0"||o===20||o===0){o=""}break;case"width":case"height":case"vspace":case"checked":case"disabled":case"readonly":if(o===0){o=""}break;case"hspace":if(o===-1){o=""}break;case"maxlength":case"tabindex":if(o===32768||o===2147483647||o==="32768"){o=""}break;case"multiple":case"compact":case"noshade":case"nowrap":if(o===65535){return s}return q;case"shape":o=o.toLowerCase();break;default:if(s.indexOf("on")===0&&o){o=(""+o).replace(/^function\s+\w+\(\)\s+\{\s+(.*)\s+\}$/,"$1")}}}return(o!==undefined&&o!==null&&o!=="")?""+o:q},getPos:function(A,s){var p=this,o=0,z=0,u,v=p.doc,q;A=p.get(A);s=s||v.body;if(A){if(d&&!p.stdMode){A=A.getBoundingClientRect();u=p.boxModel?v.documentElement:v.body;o=p.getStyle(p.select("html")[0],"borderWidth");o=(o=="medium"||p.boxModel&&!p.isIE6)&&2||o;return{x:A.left+u.scrollLeft-o,y:A.top+u.scrollTop-o}}q=A;while(q&&q!=s&&q.nodeType){o+=q.offsetLeft||0;z+=q.offsetTop||0;q=q.offsetParent}q=A.parentNode;while(q&&q!=s&&q.nodeType){o-=q.scrollLeft||0;z-=q.scrollTop||0;q=q.parentNode}}return{x:o,y:z}},parseStyle:function(r){var u=this,v=u.settings,x={};if(!r){return x}function p(D,A,C){var z,B,o,y;z=x[D+"-top"+A];if(!z){return}B=x[D+"-right"+A];if(z!=B){return}o=x[D+"-bottom"+A];if(B!=o){return}y=x[D+"-left"+A];if(o!=y){return}x[C]=y;delete x[D+"-top"+A];delete x[D+"-right"+A];delete x[D+"-bottom"+A];delete x[D+"-left"+A]}function q(y,s,o,A){var z;z=x[s];if(!z){return}z=x[o];if(!z){return}z=x[A];if(!z){return}x[y]=x[s]+" "+x[o]+" "+x[A];delete x[s];delete x[o];delete x[A]}r=r.replace(/&(#?[a-z0-9]+);/g,"&$1_MCE_SEMI_");k(r.split(";"),function(s){var o,t=[];if(s){s=s.replace(/_MCE_SEMI_/g,";");s=s.replace(/url\([^\)]+\)/g,function(y){t.push(y);return"url("+t.length+")"});s=s.split(":");o=m.trim(s[1]);o=o.replace(/url\(([^\)]+)\)/g,function(z,y){return t[parseInt(y)-1]});o=o.replace(/rgb\([^\)]+\)/g,function(y){return u.toHex(y)});if(v.url_converter){o=o.replace(/url\([\'\"]?([^\)\'\"]+)[\'\"]?\)/g,function(y,z){return"url("+v.url_converter.call(v.url_converter_scope||u,u.decode(z),"style",null)+")"})}x[m.trim(s[0]).toLowerCase()]=o}});p("border","","border");p("border","-width","border-width");p("border","-color","border-color");p("border","-style","border-style");p("padding","","padding");p("margin","","margin");q("border","border-width","border-style","border-color");if(d){if(x.border=="medium none"){x.border=""}}return x},serializeStyle:function(v,p){var q=this,r="";function u(s,o){if(o&&s){if(o.indexOf("-")===0){return}switch(o){case"font-weight":if(s==700){s="bold"}break;case"color":case"background-color":s=s.toLowerCase();break}r+=(r?" ":"")+o+": "+s+";"}}if(p&&q._styles){k(q._styles["*"],function(o){u(v[o],o)});k(q._styles[p.toLowerCase()],function(o){u(v[o],o)})}else{k(v,u)}return r},loadCSS:function(o){var q=this,r=q.doc,p;if(!o){o=""}p=q.select("head")[0];k(o.split(","),function(s){var t;if(q.files[s]){return}q.files[s]=true;t=q.create("link",{rel:"stylesheet",href:m._addVer(s)});if(d&&r.documentMode){t.onload=function(){r.recalc();t.onload=null}}p.appendChild(t)})},addClass:function(o,p){return this.run(o,function(q){var r;if(!p){return 0}if(this.hasClass(q,p)){return q.className}r=this.removeClass(q,p);return q.className=(r!=""?(r+" "):"")+p})},removeClass:function(q,r){var o=this,p;return o.run(q,function(t){var s;if(o.hasClass(t,r)){if(!p){p=new RegExp("(^|\\s+)"+r+"(\\s+|$)","g")}s=t.className.replace(p," ");s=m.trim(s!=" "?s:"");t.className=s;if(!s){t.removeAttribute("class");t.removeAttribute("className")}return s}return t.className})},hasClass:function(p,o){p=this.get(p);if(!p||!o){return false}return(" "+p.className+" ").indexOf(" "+o+" ")!==-1},show:function(o){return this.setStyle(o,"display","block")},hide:function(o){return this.setStyle(o,"display","none")},isHidden:function(o){o=this.get(o);return !o||o.style.display=="none"||this.getStyle(o,"display")=="none"},uniqueId:function(o){return(!o?"mce_":o)+(this.counter++)},setHTML:function(q,p){var o=this;return this.run(q,function(v){var r,t,s,z,u,r;p=o.processHTML(p);if(d){function y(){while(v.firstChild){v.firstChild.removeNode()}try{v.innerHTML="
        "+p;v.removeChild(v.firstChild)}catch(x){r=o.create("div");r.innerHTML="
        "+p;k(r.childNodes,function(B,A){if(A){v.appendChild(B)}})}}if(o.settings.fix_ie_paragraphs){p=p.replace(/

        <\/p>|]+)><\/p>|/gi,' 

        ')}y();if(o.settings.fix_ie_paragraphs){s=v.getElementsByTagName("p");for(t=s.length-1,r=0;t>=0;t--){z=s[t];if(!z.hasChildNodes()){if(!z._mce_keep){r=1;break}z.removeAttribute("_mce_keep")}}}if(r){p=p.replace(/

        ]+)>|

        /ig,'

        ');p=p.replace(/<\/p>/gi,"
        ");y();if(o.settings.fix_ie_paragraphs){s=v.getElementsByTagName("DIV");for(t=s.length-1;t>=0;t--){z=s[t];if(z._mce_tmp){u=o.doc.createElement("p");z.cloneNode(false).outerHTML.replace(/([a-z0-9\-_]+)=/gi,function(A,x){var B;if(x!=="_mce_tmp"){B=z.getAttribute(x);if(!B&&x==="class"){B=z.className}u.setAttribute(x,B)}});for(r=0;r]+)\/>|/gi,"");if(q.keep_values){if(/)/g,"\n");t=t.replace(/^[\r\n]*|[\r\n]*$/g,"");t=t.replace(/^\s*(\/\/\s*|\]\]>|-->|\]\]-->)\s*$/g,"");return t}r=r.replace(/]+|)>([\s\S]*?)<\/script>/gi,function(s,x,t){if(!x){x=' type="text/javascript"'}x=x.replace(/src=\"([^\"]+)\"?/i,function(y,z){if(q.url_converter){z=p.encode(q.url_converter.call(q.url_converter_scope||p,p.decode(z),"src","script"))}return'_mce_src="'+z+'"'});if(m.trim(t)){v.push(o(t));t=""}return""+t+""});r=r.replace(/]+|)>([\s\S]*?)<\/style>/gi,function(s,x,t){if(t){v.push(o(t));t=""}return""+t+""});r=r.replace(/]+|)>([\s\S]*?)<\/noscript>/g,function(s,x,t){return""})}r=r.replace(//g,"");function u(s){return s.replace(h,function(y,z,x,t){return"<"+z+x.replace(l,function(B,A,E,D,C){var F;A=A.toLowerCase();E=E||D||C||"";if(e[A]){if(E==="false"||E==="0"){return}return A+'="'+A+'"'}if(f[A]&&x.indexOf("_mce_"+A)==-1){F=p.decode(E);if(q.url_converter&&(A=="src"||A=="href")){F=q.url_converter.call(q.url_converter_scope||p,F,A,z)}if(A=="style"){F=p.serializeStyle(p.parseStyle(F),A)}return A+'="'+E+'" _mce_'+A+'="'+p.encode(F)+'"'}return B})+t+">"})}r=u(r);r=r.replace(/MCE_SCRIPT:([0-9]+)/g,function(t,s){return v[s]})}return r},getOuterHTML:function(o){var p;o=this.get(o);if(!o){return null}if(o.outerHTML!==undefined){return o.outerHTML}p=(o.ownerDocument||this.doc).createElement("body");p.appendChild(o.cloneNode(true));return p.innerHTML},setOuterHTML:function(r,p,s){var o=this;function q(u,t,x){var y,v;v=x.createElement("body");v.innerHTML=t;y=v.lastChild;while(y){o.insertAfter(y.cloneNode(true),u);y=y.previousSibling}o.remove(u)}return this.run(r,function(u){u=o.get(u);if(u.nodeType==1){s=s||u.ownerDocument||o.doc;if(d){try{if(d&&u.nodeType==1){u.outerHTML=p}else{q(u,p,s)}}catch(t){q(u,p,s)}}else{q(u,p,s)}}})},decode:function(p){var q,r,o;if(/&[\w#]+;/.test(p)){q=this.doc.createElement("div");q.innerHTML=p;r=q.firstChild;o="";if(r){do{o+=r.nodeValue}while(r=r.nextSibling)}return o||p}return p},encode:function(o){return(""+o).replace(n,function(p){return c[p]})},insertAfter:function(o,p){p=this.get(p);return this.run(o,function(r){var q,s;q=p.parentNode;s=p.nextSibling;if(s){q.insertBefore(r,s)}else{q.appendChild(r)}return r})},isBlock:function(o){if(o.nodeType&&o.nodeType!==1){return false}o=o.nodeName||o;return a.test(o)},replace:function(s,r,p){var q=this;if(j(r,"array")){s=s.cloneNode(true)}return q.run(r,function(t){if(p){k(m.grep(t.childNodes),function(o){s.appendChild(o)})}return t.parentNode.replaceChild(s,t)})},rename:function(r,o){var q=this,p;if(r.nodeName!=o.toUpperCase()){p=q.create(o);k(q.getAttribs(r),function(s){q.setAttrib(p,s.nodeName,q.getAttrib(r,s.nodeName))});q.replace(p,r,1)}return p||r},findCommonAncestor:function(q,o){var r=q,p;while(r){p=o;while(p&&r!=p){p=p.parentNode}if(r==p){break}r=r.parentNode}if(!r&&q.ownerDocument){return q.ownerDocument.documentElement}return r},toHex:function(o){var q=/^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(o);function p(r){r=parseInt(r).toString(16);return r.length>1?r:"0"+r}if(q){o="#"+p(q[1])+p(q[2])+p(q[3]);return o}return o},getClasses:function(){var s=this,o=[],r,u={},v=s.settings.class_filter,q;if(s.classes){return s.classes}function x(t){k(t.imports,function(y){x(y)});k(t.cssRules||t.rules,function(y){switch(y.type||1){case 1:if(y.selectorText){k(y.selectorText.split(","),function(z){z=z.replace(/^\s*|\s*$|^\s\./g,"");if(/\.mce/.test(z)||!/\.[\w\-]+$/.test(z)){return}q=z;z=z.replace(/.*\.([a-z0-9_\-]+).*/i,"$1");if(v&&!(z=v(z,q))){return}if(!u[z]){o.push({"class":z});u[z]=1}})}break;case 3:x(y.styleSheet);break}})}try{k(s.doc.styleSheets,x)}catch(p){}if(o.length>0){s.classes=o}return o},run:function(u,r,q){var p=this,v;if(p.doc&&typeof(u)==="string"){u=p.get(u)}if(!u){return false}q=q||this;if(!u.nodeType&&(u.length||u.length===0)){v=[];k(u,function(s,o){if(s){if(typeof(s)=="string"){s=p.doc.getElementById(s)}v.push(r.call(q,s,o))}});return v}return r.call(q,u)},getAttribs:function(q){var p;q=this.get(q);if(!q){return[]}if(d){p=[];if(q.nodeName=="OBJECT"){return q.attributes}if(q.nodeName==="OPTION"&&this.getAttrib(q,"selected")){p.push({specified:1,nodeName:"selected"})}q.cloneNode(false).outerHTML.replace(/<\/?[\w:\-]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=[\w\-]+|>/gi,"").replace(/[\w:\-]+/gi,function(o){p.push({specified:1,nodeName:o})});return p}return q.attributes},destroy:function(p){var o=this;if(o.events){o.events.destroy()}o.win=o.doc=o.root=o.events=null;if(!p){m.removeUnload(o.destroy)}},createRng:function(){var o=this.doc;return o.createRange?o.createRange():new m.dom.Range(this)},nodeIndex:function(s,t){var o=0,q,r,p;if(s){for(q=s.nodeType,s=s.previousSibling,r=s;s;s=s.previousSibling){p=s.nodeType;if(t&&p==3){if(p==q||!s.nodeValue.length){continue}}o++;q=p}}return o},split:function(u,s,y){var z=this,o=z.createRng(),v,q,x;function p(A){var t,r=A.childNodes;if(A.nodeType==1&&A.getAttribute("_mce_type")=="bookmark"){return}for(t=r.length-1;t>=0;t--){p(r[t])}if(A.nodeType!=9){if(A.nodeType==3&&A.nodeValue.length>0){return}if(A.nodeType==1){r=A.childNodes;if(r.length==1&&r[0]&&r[0].nodeType==1&&r[0].getAttribute("_mce_type")=="bookmark"){A.parentNode.insertBefore(r[0],A)}if(r.length||/^(br|hr|input|img)$/i.test(A.nodeName)){return}}z.remove(A)}return A}if(u&&s){o.setStart(u.parentNode,z.nodeIndex(u));o.setEnd(s.parentNode,z.nodeIndex(s));v=o.extractContents();o=z.createRng();o.setStart(s.parentNode,z.nodeIndex(s)+1);o.setEnd(u.parentNode,z.nodeIndex(u)+1);q=o.extractContents();x=u.parentNode;x.insertBefore(p(v),u);if(y){x.replaceChild(y,s)}else{x.insertBefore(s,u)}x.insertBefore(p(q),u);z.remove(u);return y||s}},bind:function(s,o,r,q){var p=this;if(!p.events){p.events=new m.dom.EventUtils()}return p.events.add(s,o,r,q||this)},unbind:function(r,o,q){var p=this;if(!p.events){p.events=new m.dom.EventUtils()}return p.events.remove(r,o,q)},_findSib:function(r,o,p){var q=this,s=o;if(r){if(j(s,"string")){s=function(t){return q.is(t,o)}}for(r=r[p];r;r=r[p]){if(s(r)){return r}}}return null},_isRes:function(o){return/^(top|left|bottom|right|width|height)/i.test(o)||/;\s*(top|left|bottom|right|width|height)/i.test(o)}});m.DOM=new m.dom.DOMUtils(document,{process_html:0})})(tinymce);(function(a){function b(c){var N=this,e=c.doc,S=0,E=1,j=2,D=true,R=false,U="startOffset",h="startContainer",P="endContainer",z="endOffset",k=tinymce.extend,n=c.nodeIndex;k(N,{startContainer:e,startOffset:0,endContainer:e,endOffset:0,collapsed:D,commonAncestorContainer:e,START_TO_START:0,START_TO_END:1,END_TO_END:2,END_TO_START:3,setStart:q,setEnd:s,setStartBefore:g,setStartAfter:I,setEndBefore:J,setEndAfter:u,collapse:A,selectNode:x,selectNodeContents:F,compareBoundaryPoints:v,deleteContents:p,extractContents:H,cloneContents:d,insertNode:C,surroundContents:M,cloneRange:K});function q(V,t){B(D,V,t)}function s(V,t){B(R,V,t)}function g(t){q(t.parentNode,n(t))}function I(t){q(t.parentNode,n(t)+1)}function J(t){s(t.parentNode,n(t))}function u(t){s(t.parentNode,n(t)+1)}function A(t){if(t){N[P]=N[h];N[z]=N[U]}else{N[h]=N[P];N[U]=N[z]}N.collapsed=D}function x(t){g(t);u(t)}function F(t){q(t,0);s(t,t.nodeType===1?t.childNodes.length:t.nodeValue.length)}function v(W,X){var Z=N[h],Y=N[U],V=N[P],t=N[z];if(W===0){return G(Z,Y,Z,Y)}if(W===1){return G(Z,Y,V,t)}if(W===2){return G(V,t,V,t)}if(W===3){return G(V,t,Z,Y)}}function p(){m(j)}function H(){return m(S)}function d(){return m(E)}function C(Y){var V=this[h],t=this[U],X,W;if((V.nodeType===3||V.nodeType===4)&&V.nodeValue){if(!t){V.parentNode.insertBefore(Y,V)}else{if(t>=V.nodeValue.length){c.insertAfter(Y,V)}else{X=V.splitText(t);V.parentNode.insertBefore(Y,X)}}}else{if(V.childNodes.length>0){W=V.childNodes[t]}if(W){V.insertBefore(Y,W)}else{V.appendChild(Y)}}}function M(V){var t=N.extractContents();N.insertNode(V);V.appendChild(t);N.selectNode(V)}function K(){return k(new b(c),{startContainer:N[h],startOffset:N[U],endContainer:N[P],endOffset:N[z],collapsed:N.collapsed,commonAncestorContainer:N.commonAncestorContainer})}function O(t,V){var W;if(t.nodeType==3){return t}if(V<0){return t}W=t.firstChild;while(W&&V>0){--V;W=W.nextSibling}if(W){return W}return t}function l(){return(N[h]==N[P]&&N[U]==N[z])}function G(X,Z,V,Y){var aa,W,t,ab,ad,ac;if(X==V){if(Z==Y){return 0}if(Z0){N.collapse(V)}}else{N.collapse(V)}N.collapsed=l();N.commonAncestorContainer=c.findCommonAncestor(N[h],N[P])}function m(ab){var aa,X=0,ad=0,V,Z,W,Y,t,ac;if(N[h]==N[P]){return f(ab)}for(aa=N[P],V=aa.parentNode;V;aa=V,V=V.parentNode){if(V==N[h]){return r(aa,ab)}++X}for(aa=N[h],V=aa.parentNode;V;aa=V,V=V.parentNode){if(V==N[P]){return T(aa,ab)}++ad}Z=ad-X;W=N[h];while(Z>0){W=W.parentNode;Z--}Y=N[P];while(Z<0){Y=Y.parentNode;Z++}for(t=W.parentNode,ac=Y.parentNode;t!=ac;t=t.parentNode,ac=ac.parentNode){W=t;Y=ac}return o(W,Y,ab)}function f(Z){var ab,Y,X,aa,t,W,V;if(Z!=j){ab=e.createDocumentFragment()}if(N[U]==N[z]){return ab}if(N[h].nodeType==3){Y=N[h].nodeValue;X=Y.substring(N[U],N[z]);if(Z!=E){N[h].deleteData(N[U],N[z]-N[U]);N.collapse(D)}if(Z==j){return}ab.appendChild(e.createTextNode(X));return ab}aa=O(N[h],N[U]);t=N[z]-N[U];while(t>0){W=aa.nextSibling;V=y(aa,Z);if(ab){ab.appendChild(V)}--t;aa=W}if(Z!=E){N.collapse(D)}return ab}function r(ab,Y){var aa,Z,V,t,X,W;if(Y!=j){aa=e.createDocumentFragment()}Z=i(ab,Y);if(aa){aa.appendChild(Z)}V=n(ab);t=V-N[U];if(t<=0){if(Y!=E){N.setEndBefore(ab);N.collapse(R)}return aa}Z=ab.previousSibling;while(t>0){X=Z.previousSibling;W=y(Z,Y);if(aa){aa.insertBefore(W,aa.firstChild)}--t;Z=X}if(Y!=E){N.setEndBefore(ab);N.collapse(R)}return aa}function T(Z,Y){var ab,V,aa,t,X,W;if(Y!=j){ab=e.createDocumentFragment()}aa=Q(Z,Y);if(ab){ab.appendChild(aa)}V=n(Z);++V;t=N[z]-V;aa=Z.nextSibling;while(t>0){X=aa.nextSibling;W=y(aa,Y);if(ab){ab.appendChild(W)}--t;aa=X}if(Y!=E){N.setStartAfter(Z);N.collapse(D)}return ab}function o(Z,t,ac){var W,ae,Y,aa,ab,V,ad,X;if(ac!=j){ae=e.createDocumentFragment()}W=Q(Z,ac);if(ae){ae.appendChild(W)}Y=Z.parentNode;aa=n(Z);ab=n(t);++aa;V=ab-aa;ad=Z.nextSibling;while(V>0){X=ad.nextSibling;W=y(ad,ac);if(ae){ae.appendChild(W)}ad=X;--V}W=i(t,ac);if(ae){ae.appendChild(W)}if(ac!=E){N.setStartAfter(Z);N.collapse(D)}return ae}function i(aa,ab){var W=O(N[P],N[z]-1),ac,Z,Y,t,V,X=W!=N[P];if(W==aa){return L(W,X,R,ab)}ac=W.parentNode;Z=L(ac,R,R,ab);while(ac){while(W){Y=W.previousSibling;t=L(W,X,R,ab);if(ab!=j){Z.insertBefore(t,Z.firstChild)}X=D;W=Y}if(ac==aa){return Z}W=ac.previousSibling;ac=ac.parentNode;V=L(ac,R,R,ab);if(ab!=j){V.appendChild(Z)}Z=V}}function Q(aa,ab){var X=O(N[h],N[U]),Y=X!=N[h],ac,Z,W,t,V;if(X==aa){return L(X,Y,D,ab)}ac=X.parentNode;Z=L(ac,R,D,ab);while(ac){while(X){W=X.nextSibling;t=L(X,Y,D,ab);if(ab!=j){Z.appendChild(t)}Y=D;X=W}if(ac==aa){return Z}X=ac.nextSibling;ac=ac.parentNode;V=L(ac,R,D,ab);if(ab!=j){V.appendChild(Z)}Z=V}}function L(t,Y,ab,ac){var X,W,Z,V,aa;if(Y){return y(t,ac)}if(t.nodeType==3){X=t.nodeValue;if(ab){V=N[U];W=X.substring(V);Z=X.substring(0,V)}else{V=N[z];W=X.substring(0,V);Z=X.substring(V)}if(ac!=E){t.nodeValue=Z}if(ac==j){return}aa=t.cloneNode(R);aa.nodeValue=W;return aa}if(ac==j){return}return t.cloneNode(R)}function y(V,t){if(t!=j){return t==E?V.cloneNode(D):V}V.parentNode.removeChild(V)}}a.Range=b})(tinymce.dom);(function(){function a(g){var i=this,j="\uFEFF",e,h,d=g.dom,c=true,f=false;function b(){var n=g.getRng(),k=d.createRng(),m,o;m=n.item?n.item(0):n.parentElement();if(m.ownerDocument!=d.doc){return k}if(n.item||!m.hasChildNodes()){k.setStart(m.parentNode,d.nodeIndex(m));k.setEnd(k.startContainer,k.startOffset+1);return k}o=g.isCollapsed();function l(s){var u,q,t,p,A=0,x,y,z,r,v;r=n.duplicate();r.collapse(s);u=d.create("a");z=r.parentElement();if(!z.hasChildNodes()){k[s?"setStart":"setEnd"](z,0);return}z.appendChild(u);r.moveToElementText(u);v=n.compareEndPoints(s?"StartToStart":"EndToEnd",r);if(v>0){k[s?"setStartAfter":"setEndAfter"](z);d.remove(u);return}p=tinymce.grep(z.childNodes);x=p.length-1;while(A<=x){y=Math.floor((A+x)/2);z.insertBefore(u,p[y]);r.moveToElementText(u);v=n.compareEndPoints(s?"StartToStart":"EndToEnd",r);if(v>0){A=y+1}else{if(v<0){x=y-1}else{found=true;break}}}q=v>0||y==0?u.nextSibling:u.previousSibling;if(q.nodeType==1){d.remove(u);t=d.nodeIndex(q);q=q.parentNode;if(!s||y>0){t++}}else{if(v>0||y==0){r.setEndPoint(s?"StartToStart":"EndToEnd",n);t=r.text.length}else{r.setEndPoint(s?"StartToStart":"EndToEnd",n);t=q.nodeValue.length-r.text.length}d.remove(u)}k[s?"setStart":"setEnd"](q,t)}l(true);if(!o){l()}return k}this.addRange=function(k){var p,n,m,r,u,s,t=g.dom.doc,o=t.body;function l(B){var x,A,v,z,y;v=d.create("a");x=B?m:u;A=B?r:s;z=p.duplicate();if(x==t){x=o;A=0}if(x.nodeType==3){x.parentNode.insertBefore(v,x);z.moveToElementText(v);z.moveStart("character",A);d.remove(v);p.setEndPoint(B?"StartToStart":"EndToEnd",z)}else{y=x.childNodes;if(y.length){if(A>=y.length){d.insertAfter(v,y[y.length-1])}else{x.insertBefore(v,y[A])}z.moveToElementText(v)}else{v=t.createTextNode(j);x.appendChild(v);z.moveToElementText(v.parentNode);z.collapse(c)}p.setEndPoint(B?"StartToStart":"EndToEnd",z);d.remove(v)}}this.destroy();m=k.startContainer;r=k.startOffset;u=k.endContainer;s=k.endOffset;p=o.createTextRange();if(m==u&&m.nodeType==1&&r==s-1){if(r==s-1){try{n=o.createControlRange();n.addElement(m.childNodes[r]);n.select();n.scrollIntoView();return}catch(q){}}}l(true);l();p.select();p.scrollIntoView()};this.getRangeAt=function(){if(!e||!tinymce.dom.RangeUtils.compareRanges(h,g.getRng())){e=b();h=g.getRng()}try{e.startContainer.nextSibling}catch(k){e=b();h=null}return e};this.destroy=function(){h=e=null};if(g.dom.boxModel){(function(){var q=d.doc,l=q.body,n,o;q.documentElement.unselectable=c;function p(r,u){var s=l.createTextRange();try{s.moveToPoint(r,u)}catch(t){s=null}return s}function m(s){var r;if(s.button){r=p(s.x,s.y);if(r){if(r.compareEndPoints("StartToStart",o)>0){r.setEndPoint("StartToStart",o)}else{r.setEndPoint("EndToEnd",o)}r.select()}}else{k()}}function k(){d.unbind(q,"mouseup",k);d.unbind(q,"mousemove",m);n=0}d.bind(q,"mousedown",function(r){if(r.target.nodeName==="HTML"){if(n){k()}n=1;o=p(r.x,r.y);if(o){d.bind(q,"mouseup",k);d.bind(q,"mousemove",m);o.select()}}})})()}}tinymce.dom.TridentSelection=a})();(function(d){var f=d.each,c=d.DOM,b=d.isIE,e=d.isWebKit,a;d.create("tinymce.dom.EventUtils",{EventUtils:function(){this.inits=[];this.events=[]},add:function(m,p,l,j){var g,h=this,i=h.events,k;if(p instanceof Array){k=[];f(p,function(o){k.push(h.add(m,o,l,j))});return k}if(m&&m.hasOwnProperty&&m instanceof Array){k=[];f(m,function(n){n=c.get(n);k.push(h.add(n,p,l,j))});return k}m=c.get(m);if(!m){return}g=function(n){if(h.disabled){return}n=n||window.event;if(n&&b){if(!n.target){n.target=n.srcElement}d.extend(n,h._stoppers)}if(!j){return l(n)}return l.call(j,n)};if(p=="unload"){d.unloads.unshift({func:g});return g}if(p=="init"){if(h.domLoaded){g()}else{h.inits.push(g)}return g}i.push({obj:m,name:p,func:l,cfunc:g,scope:j});h._add(m,p,g);return l},remove:function(l,m,k){var h=this,g=h.events,i=false,j;if(l&&l.hasOwnProperty&&l instanceof Array){j=[];f(l,function(n){n=c.get(n);j.push(h.remove(n,m,k))});return j}l=c.get(l);f(g,function(o,n){if(o.obj==l&&o.name==m&&(!k||(o.func==k||o.cfunc==k))){g.splice(n,1);h._remove(l,m,o.cfunc);i=true;return false}});return i},clear:function(l){var j=this,g=j.events,h,k;if(l){l=c.get(l);for(h=g.length-1;h>=0;h--){k=g[h];if(k.obj===l){j._remove(k.obj,k.name,k.cfunc);k.obj=k.cfunc=null;g.splice(h,1)}}}},cancel:function(g){if(!g){return false}this.stop(g);return this.prevent(g)},stop:function(g){if(g.stopPropagation){g.stopPropagation()}else{g.cancelBubble=true}return false},prevent:function(g){if(g.preventDefault){g.preventDefault()}else{g.returnValue=false}return false},destroy:function(){var g=this;f(g.events,function(j,h){g._remove(j.obj,j.name,j.cfunc);j.obj=j.cfunc=null});g.events=[];g=null},_add:function(h,i,g){if(h.attachEvent){h.attachEvent("on"+i,g)}else{if(h.addEventListener){h.addEventListener(i,g,false)}else{h["on"+i]=g}}},_remove:function(i,j,h){if(i){try{if(i.detachEvent){i.detachEvent("on"+j,h)}else{if(i.removeEventListener){i.removeEventListener(j,h,false)}else{i["on"+j]=null}}}catch(g){}}},_pageInit:function(h){var g=this;if(g.domLoaded){return}g.domLoaded=true;f(g.inits,function(i){i()});g.inits=[]},_wait:function(i){var g=this,h=i.document;if(i.tinyMCE_GZ&&tinyMCE_GZ.loaded){g.domLoaded=1;return}if(h.attachEvent){h.attachEvent("onreadystatechange",function(){if(h.readyState==="complete"){h.detachEvent("onreadystatechange",arguments.callee);g._pageInit(i)}});if(h.documentElement.doScroll&&i==i.top){(function(){if(g.domLoaded){return}try{h.documentElement.doScroll("left")}catch(j){setTimeout(arguments.callee,0);return}g._pageInit(i)})()}}else{if(h.addEventListener){g._add(i,"DOMContentLoaded",function(){g._pageInit(i)})}}g._add(i,"load",function(){g._pageInit(i)})},_stoppers:{preventDefault:function(){this.returnValue=false},stopPropagation:function(){this.cancelBubble=true}}});a=d.dom.Event=new d.dom.EventUtils();a._wait(window);d.addUnload(function(){a.destroy()})})(tinymce);(function(a){a.dom.Element=function(f,d){var b=this,e,c;b.settings=d=d||{};b.id=f;b.dom=e=d.dom||a.DOM;if(!a.isIE){c=e.get(b.id)}a.each(("getPos,getRect,getParent,add,setStyle,getStyle,setStyles,setAttrib,setAttribs,getAttrib,addClass,removeClass,hasClass,getOuterHTML,setOuterHTML,remove,show,hide,isHidden,setHTML,get").split(/,/),function(g){b[g]=function(){var h=[f],j;for(j=0;j_';if(j.startContainer==k&&j.endContainer==k){k.body.innerHTML=i}else{j.deleteContents();if(k.body.childNodes.length==0){k.body.innerHTML=i}else{j.insertNode(j.createContextualFragment(i))}}l=f.dom.get("__caret");j=k.createRange();j.setStartBefore(l);j.setEndBefore(l);f.setRng(j);f.dom.remove("__caret")}else{if(j.item){k.execCommand("Delete",false,null);j=f.getRng()}j.pasteHTML(i)}f.onSetContent.dispatch(f,g)},getStart:function(){var g=this.getRng(),h,f,j,i;if(g.duplicate||g.item){if(g.item){return g.item(0)}j=g.duplicate();j.collapse(1);h=j.parentElement();f=i=g.parentElement();while(i=i.parentNode){if(i==h){h=f;break}}if(h&&h.nodeName=="BODY"){return h.firstChild||h}return h}else{h=g.startContainer;if(h.nodeType==1&&h.hasChildNodes()){h=h.childNodes[Math.min(h.childNodes.length-1,g.startOffset)]}if(h&&h.nodeType==3){return h.parentNode}return h}},getEnd:function(){var g=this,h=g.getRng(),i,f;if(h.duplicate||h.item){if(h.item){return h.item(0)}h=h.duplicate();h.collapse(0);i=h.parentElement();if(i&&i.nodeName=="BODY"){return i.lastChild||i}return i}else{i=h.endContainer;f=h.endOffset;if(i.nodeType==1&&i.hasChildNodes()){i=i.childNodes[f>0?f-1:f]}if(i&&i.nodeType==3){return i.parentNode}return i}},getBookmark:function(q,r){var u=this,m=u.dom,g,j,i,n,h,o,p,l="\uFEFF",s;function f(v,x){var t=0;d(m.select(v),function(z,y){if(z==x){t=y}});return t}if(q==2){function k(){var v=u.getRng(true),t=m.getRoot(),x={};function y(B,G){var A=B[G?"startContainer":"endContainer"],F=B[G?"startOffset":"endOffset"],z=[],C,E,D=0;if(A.nodeType==3){if(r){for(C=A.previousSibling;C&&C.nodeType==3;C=C.previousSibling){F+=C.nodeValue.length}}z.push(F)}else{E=A.childNodes;if(F>=E.length&&E.length){D=1;F=Math.max(0,E.length-1)}z.push(u.dom.nodeIndex(E[F],r)+D)}for(;A&&A!=t;A=A.parentNode){z.push(u.dom.nodeIndex(A,r))}return z}x.start=y(v,true);if(!u.isCollapsed()){x.end=y(v)}return x}return k()}if(q){return{rng:u.getRng()}}g=u.getRng();i=m.uniqueId();n=tinyMCE.activeEditor.selection.isCollapsed();s="overflow:hidden;line-height:0px";if(g.duplicate||g.item){if(!g.item){j=g.duplicate();g.collapse();g.pasteHTML(''+l+"");if(!n){j.collapse(false);j.pasteHTML(''+l+"")}}else{o=g.item(0);h=o.nodeName;return{name:h,index:f(h,o)}}}else{o=u.getNode();h=o.nodeName;if(h=="IMG"){return{name:h,index:f(h,o)}}j=g.cloneRange();if(!n){j.collapse(false);j.insertNode(m.create("span",{_mce_type:"bookmark",id:i+"_end",style:s},l))}g.collapse(true);g.insertNode(m.create("span",{_mce_type:"bookmark",id:i+"_start",style:s},l))}u.moveToBookmark({id:i,keep:1});return{id:i}},moveToBookmark:function(n){var r=this,l=r.dom,i,h,f,q,j,s,o,p;if(r.tridentSel){r.tridentSel.destroy()}if(n){if(n.start){f=l.createRng();q=l.getRoot();function g(z){var t=n[z?"start":"end"],v,x,y,u;if(t){for(x=q,v=t.length-1;v>=1;v--){u=x.childNodes;if(u.length){x=u[t[v]]}}if(z){f.setStart(x,t[0])}else{f.setEnd(x,t[0])}}}g(true);g();r.setRng(f)}else{if(n.id){function k(A){var u=l.get(n.id+"_"+A),z,t,x,y,v=n.keep;if(u){z=u.parentNode;if(A=="start"){if(!v){t=l.nodeIndex(u)}else{z=u.firstChild;t=1}j=s=z;o=p=t}else{if(!v){t=l.nodeIndex(u)}else{z=u.firstChild;t=1}s=z;p=t}if(!v){y=u.previousSibling;x=u.nextSibling;d(c.grep(u.childNodes),function(B){if(B.nodeType==3){B.nodeValue=B.nodeValue.replace(/\uFEFF/g,"")}});while(u=l.get(n.id+"_"+A)){l.remove(u,1)}if(y&&x&&y.nodeType==x.nodeType&&y.nodeType==3){t=y.nodeValue.length;y.appendData(x.nodeValue);l.remove(x);if(A=="start"){j=s=y;o=p=t}else{s=y;p=t}}}}}function m(t){if(!a&&l.isBlock(t)&&!t.innerHTML){t.innerHTML='
        '}return t}k("start");k("end");f=l.createRng();f.setStart(m(j),o);f.setEnd(m(s),p);r.setRng(f)}else{if(n.name){r.select(l.select(n.name)[n.index])}else{if(n.rng){r.setRng(n.rng)}}}}}},select:function(k,j){var i=this,l=i.dom,g=l.createRng(),f;f=l.nodeIndex(k);g.setStart(k.parentNode,f);g.setEnd(k.parentNode,f+1);if(j){function h(m,o){var n=new c.dom.TreeWalker(m,m);do{if(m.nodeType==3&&c.trim(m.nodeValue).length!=0){if(o){g.setStart(m,0)}else{g.setEnd(m,m.nodeValue.length)}return}if(m.nodeName=="BR"){if(o){g.setStartBefore(m)}else{g.setEndBefore(m)}return}}while(m=(o?n.next():n.prev()))}h(k,1);h(k)}i.setRng(g);return k},isCollapsed:function(){var f=this,h=f.getRng(),g=f.getSel();if(!h||h.item){return false}if(h.compareEndPoints){return h.compareEndPoints("StartToEnd",h)===0}return !g||h.collapsed},collapse:function(f){var g=this,h=g.getRng(),i;if(h.item){i=h.item(0);h=this.win.document.body.createTextRange();h.moveToElementText(i)}h.collapse(!!f);g.setRng(h)},getSel:function(){var g=this,f=this.win;return f.getSelection?f.getSelection():f.document.selection},getRng:function(j){var g=this,h,i;if(j&&g.tridentSel){return g.tridentSel.getRangeAt(0)}try{if(h=g.getSel()){i=h.rangeCount>0?h.getRangeAt(0):(h.createRange?h.createRange():g.win.document.createRange())}}catch(f){}if(!i){i=g.win.document.createRange?g.win.document.createRange():g.win.document.body.createTextRange()}if(g.selectedRange&&g.explicitRange){if(i.compareBoundaryPoints(i.START_TO_START,g.selectedRange)===0&&i.compareBoundaryPoints(i.END_TO_END,g.selectedRange)===0){i=g.explicitRange}else{g.selectedRange=null;g.explicitRange=null}}return i},setRng:function(i){var h,g=this;if(!g.tridentSel){h=g.getSel();if(h){g.explicitRange=i;h.removeAllRanges();h.addRange(i);g.selectedRange=h.getRangeAt(0)}}else{if(i.cloneRange){g.tridentSel.addRange(i);return}try{i.select()}catch(f){}}},setNode:function(g){var f=this;f.setContent(f.dom.getOuterHTML(g));return g},getNode:function(){var g=this,f=g.getRng(),h=g.getSel(),i;if(f.setStart){if(!f){return g.dom.getRoot()}i=f.commonAncestorContainer;if(!f.collapsed){if(f.startContainer==f.endContainer){if(f.startOffset-f.endOffset<2){if(f.startContainer.hasChildNodes()){i=f.startContainer.childNodes[f.startOffset]}}}if(c.isWebKit&&h.anchorNode&&h.anchorNode.nodeType==1){return h.anchorNode.childNodes[h.anchorOffset]}}if(i&&i.nodeType==3){return i.parentNode}return i}return f.item?f.item(0):f.parentElement()},getSelectedBlocks:function(g,f){var i=this,j=i.dom,m,h,l,k=[];m=j.getParent(g||i.getStart(),j.isBlock);h=j.getParent(f||i.getEnd(),j.isBlock);if(m){k.push(m)}if(m&&h&&m!=h){l=m;while((l=l.nextSibling)&&l!=h){if(j.isBlock(l)){k.push(l)}}}if(h&&m!=h){k.push(h)}return k},destroy:function(g){var f=this;f.win=null;if(f.tridentSel){f.tridentSel.destroy()}if(!g){c.removeUnload(f.destroy)}}})})(tinymce);(function(a){a.create("tinymce.dom.XMLWriter",{node:null,XMLWriter:function(c){function b(){var e=document.implementation;if(!e||!e.createDocument){try{return new ActiveXObject("MSXML2.DOMDocument")}catch(d){}try{return new ActiveXObject("Microsoft.XmlDom")}catch(d){}}else{return e.createDocument("","",null)}}this.doc=b();this.valid=a.isOpera||a.isWebKit;this.reset()},reset:function(){var b=this,c=b.doc;if(c.firstChild){c.removeChild(c.firstChild)}b.node=c.appendChild(c.createElement("html"))},writeStartElement:function(c){var b=this;b.node=b.node.appendChild(b.doc.createElement(c))},writeAttribute:function(c,b){if(this.valid){b=b.replace(/>/g,"%MCGT%")}this.node.setAttribute(c,b)},writeEndElement:function(){this.node=this.node.parentNode},writeFullEndElement:function(){var b=this,c=b.node;c.appendChild(b.doc.createTextNode(""));b.node=c.parentNode},writeText:function(b){if(this.valid){b=b.replace(/>/g,"%MCGT%")}this.node.appendChild(this.doc.createTextNode(b))},writeCDATA:function(b){this.node.appendChild(this.doc.createCDATASection(b))},writeComment:function(b){if(a.isIE){b=b.replace(/^\-|\-$/g," ")}this.node.appendChild(this.doc.createComment(b.replace(/\-\-/g," ")))},getContent:function(){var b;b=this.doc.xml||new XMLSerializer().serializeToString(this.doc);b=b.replace(/<\?[^?]+\?>||<\/html>||]+>/g,"");b=b.replace(/ ?\/>/g," />");if(this.valid){b=b.replace(/\%MCGT%/g,">")}return b}})})(tinymce);(function(a){a.create("tinymce.dom.StringWriter",{str:null,tags:null,count:0,settings:null,indent:null,StringWriter:function(b){this.settings=a.extend({indent_char:" ",indentation:0},b);this.reset()},reset:function(){this.indent="";this.str="";this.tags=[];this.count=0},writeStartElement:function(b){this._writeAttributesEnd();this.writeRaw("<"+b);this.tags.push(b);this.inAttr=true;this.count++;this.elementCount=this.count},writeAttribute:function(d,b){var c=this;c.writeRaw(" "+c.encode(d)+'="'+c.encode(b)+'"')},writeEndElement:function(){var b;if(this.tags.length>0){b=this.tags.pop();if(this._writeAttributesEnd(1)){this.writeRaw("")}if(this.settings.indentation>0){this.writeRaw("\n")}}},writeFullEndElement:function(){if(this.tags.length>0){this._writeAttributesEnd();this.writeRaw("");if(this.settings.indentation>0){this.writeRaw("\n")}}},writeText:function(b){this._writeAttributesEnd();this.writeRaw(this.encode(b));this.count++},writeCDATA:function(b){this._writeAttributesEnd();this.writeRaw("");this.count++},writeComment:function(b){this._writeAttributesEnd();this.writeRaw("");this.count++},writeRaw:function(b){this.str+=b},encode:function(b){return b.replace(/[<>&"]/g,function(c){switch(c){case"<":return"<";case">":return">";case"&":return"&";case'"':return"""}return c})},getContent:function(){return this.str},_writeAttributesEnd:function(b){if(!this.inAttr){return}this.inAttr=false;if(b&&this.elementCount==this.count){this.writeRaw(" />");return false}this.writeRaw(">");return true}})})(tinymce);(function(e){var g=e.extend,f=e.each,b=e.util.Dispatcher,d=e.isIE,a=e.isGecko;function c(h){return h.replace(/([?+*])/g,".$1")}e.create("tinymce.dom.Serializer",{Serializer:function(j){var i=this;i.key=0;i.onPreProcess=new b(i);i.onPostProcess=new b(i);try{i.writer=new e.dom.XMLWriter()}catch(h){i.writer=new e.dom.StringWriter()}i.settings=j=g({dom:e.DOM,valid_nodes:0,node_filter:0,attr_filter:0,invalid_attrs:/^(_mce_|_moz_|sizset|sizcache)/,closed:/^(br|hr|input|meta|img|link|param|area)$/,entity_encoding:"named",entities:"160,nbsp,161,iexcl,162,cent,163,pound,164,curren,165,yen,166,brvbar,167,sect,168,uml,169,copy,170,ordf,171,laquo,172,not,173,shy,174,reg,175,macr,176,deg,177,plusmn,178,sup2,179,sup3,180,acute,181,micro,182,para,183,middot,184,cedil,185,sup1,186,ordm,187,raquo,188,frac14,189,frac12,190,frac34,191,iquest,192,Agrave,193,Aacute,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,201,Eacute,202,Ecirc,203,Euml,204,Igrave,205,Iacute,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,211,Oacute,212,Ocirc,213,Otilde,214,Ouml,215,times,216,Oslash,217,Ugrave,218,Uacute,219,Ucirc,220,Uuml,221,Yacute,222,THORN,223,szlig,224,agrave,225,aacute,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,233,eacute,234,ecirc,235,euml,236,igrave,237,iacute,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,243,oacute,244,ocirc,245,otilde,246,ouml,247,divide,248,oslash,249,ugrave,250,uacute,251,ucirc,252,uuml,253,yacute,254,thorn,255,yuml,402,fnof,913,Alpha,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,977,thetasym,978,upsih,982,piv,8226,bull,8230,hellip,8242,prime,8243,Prime,8254,oline,8260,frasl,8472,weierp,8465,image,8476,real,8482,trade,8501,alefsym,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8704,forall,8706,part,8707,exist,8709,empty,8711,nabla,8712,isin,8713,notin,8715,ni,8719,prod,8721,sum,8722,minus,8727,lowast,8730,radic,8733,prop,8734,infin,8736,ang,8743,and,8744,or,8745,cap,8746,cup,8747,int,8756,there4,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8804,le,8805,ge,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,338,OElig,339,oelig,352,Scaron,353,scaron,376,Yuml,710,circ,732,tilde,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,8211,ndash,8212,mdash,8216,lsquo,8217,rsquo,8218,sbquo,8220,ldquo,8221,rdquo,8222,bdquo,8224,dagger,8225,Dagger,8240,permil,8249,lsaquo,8250,rsaquo,8364,euro",valid_elements:"*[*]",extended_valid_elements:0,invalid_elements:0,fix_table_elements:1,fix_list_elements:true,fix_content_duplication:true,convert_fonts_to_spans:false,font_size_classes:0,apply_source_formatting:0,indent_mode:"simple",indent_char:"\t",indent_levels:1,remove_linebreaks:1,remove_redundant_brs:1,element_format:"xhtml"},j);i.dom=j.dom;i.schema=j.schema;if(j.entity_encoding=="named"&&!j.entities){j.entity_encoding="raw"}if(j.remove_redundant_brs){i.onPostProcess.add(function(k,l){l.content=l.content.replace(/(
        \s*)+<\/(p|h[1-6]|div|li)>/gi,function(n,m,o){if(/^
        \s*<\//.test(n)){return""}return n})})}if(j.element_format=="html"){i.onPostProcess.add(function(k,l){l.content=l.content.replace(/<([^>]+) \/>/g,"<$1>")})}if(j.fix_list_elements){i.onPreProcess.add(function(v,s){var l,z,y=["ol","ul"],u,t,q,k=/^(OL|UL)$/,A;function m(r,x){var o=x.split(","),p;while((r=r.previousSibling)!=null){for(p=0;p=1767){f(i.dom.select("p table",l.node).reverse(),function(p){var o=i.dom.getParent(p.parentNode,"table,p");if(o.nodeName!="TABLE"){try{i.dom.split(o,p)}catch(m){}}})}})}},setEntities:function(o){var n=this,j,m,h={},k;if(n.entityLookup){return}j=o.split(",");for(m=0;m1){f(q[1].split("|"),function(u){var p={},t;k=k||[];u=u.replace(/::/g,"~");u=/^([!\-])?([\w*.?~_\-]+|)([=:<])?(.+)?$/.exec(u);u[2]=u[2].replace(/~/g,":");if(u[1]=="!"){r=r||[];r.push(u[2])}if(u[1]=="-"){for(t=0;t=1767)){p=j.createHTMLDocument("");f(r.nodeName=="BODY"?r.childNodes:[r],function(h){p.body.appendChild(p.importNode(h,true))});if(r.nodeName!="BODY"){r=p.body.firstChild}else{r=p.body}i=k.dom.doc;k.dom.doc=p}k.key=""+(parseInt(k.key)+1);if(!q.no_events){q.node=r;k.onPreProcess.dispatch(k,q)}k.writer.reset();k._info=q;k._serializeNode(r,q.getInner);q.content=k.writer.getContent();if(i){k.dom.doc=i}if(!q.no_events){k.onPostProcess.dispatch(k,q)}k._postProcess(q);q.node=null;return e.trim(q.content)},_postProcess:function(n){var i=this,k=i.settings,j=n.content,m=[],l;if(n.format=="html"){l=i._protect({content:j,patterns:[{pattern:/(]*>)(.*?)(<\/script>)/g},{pattern:/(]*>)(.*?)(<\/noscript>)/g},{pattern:/(]*>)(.*?)(<\/style>)/g},{pattern:/(]*>)(.*?)(<\/pre>)/g,encode:1},{pattern:/()/g}]});j=l.content;if(k.entity_encoding!=="raw"){j=i._encode(j)}if(!n.set){j=j.replace(/

        \s+<\/p>|]+)>\s+<\/p>/g,k.entity_encoding=="numeric"?" 

        ":" 

        ");if(k.remove_linebreaks){j=j.replace(/\r?\n|\r/g," ");j=j.replace(/(<[^>]+>)\s+/g,"$1 ");j=j.replace(/\s+(<\/[^>]+>)/g," $1");j=j.replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object) ([^>]+)>\s+/g,"<$1 $2>");j=j.replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>\s+/g,"<$1>");j=j.replace(/\s+<\/(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>/g,"")}if(k.apply_source_formatting&&k.indent_mode=="simple"){j=j.replace(/<(\/?)(ul|hr|table|meta|link|tbody|tr|object|body|head|html|map)(|[^>]+)>\s*/g,"\n<$1$2$3>\n");j=j.replace(/\s*<(p|h[1-6]|blockquote|div|title|style|pre|script|td|li|area)(|[^>]+)>/g,"\n<$1$2>");j=j.replace(/<\/(p|h[1-6]|blockquote|div|title|style|pre|script|td|li)>\s*/g,"\n");j=j.replace(/\n\n/g,"\n")}}j=i._unprotect(j,l);j=j.replace(//g,"");if(k.entity_encoding=="raw"){j=j.replace(/

         <\/p>|]+)> <\/p>/g,"\u00a0

        ")}j=j.replace(/]+|)>([\s\S]*?)<\/noscript>/g,function(h,p,o){return""+i.dom.decode(o.replace(//g,""))+""})}n.content=j},_serializeNode:function(E,J){var A=this,B=A.settings,y=A.writer,q,j,u,G,F,I,C,h,z,k,r,D,p,m,H,o,x;if(!B.node_filter||B.node_filter(E)){switch(E.nodeType){case 1:if(E.hasAttribute?E.hasAttribute("_mce_bogus"):E.getAttribute("_mce_bogus")){return}p=H=false;q=E.hasChildNodes();k=E.getAttribute("_mce_name")||E.nodeName.toLowerCase();o=E.getAttribute("_mce_type");if(o){if(!A._info.cleanup){p=true;return}else{H=1}}if(d){x=E.scopeName;if(x&&x!=="HTML"&&x!=="html"){k=x+":"+k}}if(k.indexOf("mce:")===0){k=k.substring(4)}if(!H){if(!A.validElementsRE||!A.validElementsRE.test(k)||(A.invalidElementsRE&&A.invalidElementsRE.test(k))||J){p=true;break}}if(d){if(B.fix_content_duplication){if(E._mce_serialized==A.key){return}E._mce_serialized=A.key}if(k.charAt(0)=="/"){k=k.substring(1)}}else{if(a){if(E.nodeName==="BR"&&E.getAttribute("type")=="_moz"){return}}}if(B.validate_children){if(A.elementName&&!A.schema.isValid(A.elementName,k)){p=true;break}A.elementName=k}r=A.findRule(k);if(!r){p=true;break}k=r.name||k;m=B.closed.test(k);if((!q&&r.noEmpty)||(d&&!k)){p=true;break}if(r.requiredAttribs){I=r.requiredAttribs;for(G=I.length-1;G>=0;G--){if(this.dom.getAttrib(E,I[G])!==""){break}}if(G==-1){p=true;break}}y.writeStartElement(k);if(r.attribs){for(G=0,C=r.attribs,F=C.length;G-1;G--){h=C[G];if(h.specified){I=h.nodeName.toLowerCase();if(B.invalid_attrs.test(I)||!r.validAttribsRE.test(I)){continue}D=A.findAttribRule(r,I);z=A._getAttrib(E,D,I);if(z!==null){y.writeAttribute(I,z)}}}}if(o&&H){y.writeAttribute("_mce_type",o)}if(k==="script"&&e.trim(E.innerHTML)){y.writeText("// ");y.writeCDATA(E.innerHTML.replace(/|<\[CDATA\[|\]\]>/g,""));q=false;break}if(r.padd){if(q&&(u=E.firstChild)&&u.nodeType===1&&E.childNodes.length===1){if(u.hasAttribute?u.hasAttribute("_mce_bogus"):u.getAttribute("_mce_bogus")){y.writeText("\u00a0")}}else{if(!q){y.writeText("\u00a0")}}}break;case 3:if(B.validate_children&&A.elementName&&!A.schema.isValid(A.elementName,"#text")){return}return y.writeText(E.nodeValue);case 4:return y.writeCDATA(E.nodeValue);case 8:return y.writeComment(E.nodeValue)}}else{if(E.nodeType==1){q=E.hasChildNodes()}}if(q&&!m){u=E.firstChild;while(u){A._serializeNode(u);A.elementName=k;u=u.nextSibling}}if(!p){if(!m){y.writeFullEndElement()}else{y.writeEndElement()}}},_protect:function(j){var i=this;j.items=j.items||[];function h(l){return l.replace(/[\r\n\\]/g,function(m){if(m==="\n"){return"\\n"}else{if(m==="\\"){return"\\\\"}}return"\\r"})}function k(l){return l.replace(/\\[\\rn]/g,function(m){if(m==="\\n"){return"\n"}else{if(m==="\\\\"){return"\\"}}return"\r"})}f(j.patterns,function(l){j.content=k(h(j.content).replace(l.pattern,function(n,o,m,p){m=k(m);if(l.encode){m=i._encode(m)}j.items.push(m);return o+""+p}))});return j},_unprotect:function(i,j){i=i.replace(/\"))}if(a&&j.ListBox){if(a.Button||a.SplitButton){e+=b.createHTML("td",{"class":"mceToolbarEnd"},b.createHTML("span",null,""))}}if(b.stdMode){e+='
        '+j.renderHTML()+""+j.renderHTML()+"
        with id -If is specified, use that instead of 'id' - - -ENDOFHELP; - -require_once INSTALLDIR.'/scripts/commandline.inc'; - -if (count($args) < 2 || count($args) > 3) { - show_help(); -} - -$table = $args[0]; -$id = $args[1]; -if (count($args) > 2) { - $column = $args[2]; -} else { - $column = 'id'; -} - -$object = Memcached_DataObject::staticGet($table, $column, $id); - -if (!$object) { - print "No such '$table' with $column = '$id'; it's possible some cache keys won't be cleared properly.\n"; - $class = ucfirst($table); - $object = new $class(); - $object->column = $id; -} - -$result = $object->decache(); diff --git a/scripts/fixup_conversations.php b/scripts/fixup_conversations.php deleted file mode 100755 index 80890fe98d..0000000000 --- a/scripts/fixup_conversations.php +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env php -. - */ - -define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); - -require_once INSTALLDIR.'/scripts/commandline.inc'; - -common_log(LOG_INFO, 'Fixing up conversations.'); - -$notice = new Notice(); -$notice->query('select id, reply_to from notice where conversation is null'); - -while ($notice->fetch()) { - - $cid = null; - - $orig = clone($notice); - - if (empty($notice->reply_to)) { - $notice->conversation = $notice->id; - } else { - $reply = Notice::staticGet('id', $notice->reply_to); - - if (empty($reply)) { - common_log(LOG_WARNING, "Replied-to notice $notice->reply_to not found."); - $notice->conversation = $notice->id; - } else if (empty($reply->conversation)) { - common_log(LOG_WARNING, "Replied-to notice $reply->id has no conversation ID."); - $notice->conversation = $notice->id; - } else { - $notice->conversation = $reply->conversation; - } - - unset($reply); - $reply = null; - } - - print "$notice->conversation"; - - $result = $notice->update($orig); - - if (!$result) { - common_log_db_error($notice, 'UPDATE', __FILE__); - continue; - } - - $orig = null; - unset($orig); - - print ".\n"; -} diff --git a/scripts/fixup_group_uri.php b/scripts/fixup_group_uri.php deleted file mode 100644 index 90938dac3e..0000000000 --- a/scripts/fixup_group_uri.php +++ /dev/null @@ -1,102 +0,0 @@ -#!/usr/bin/env php -. - */ - -define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); - -$shortoptions = 'i:n:a'; -$longoptions = array('id=', 'nickname=', 'all', 'dry-run'); - -$helptext = <<whereAdd('uri IS NULL'); - if ($group->find()) { - while ($group->fetch()) { - updateGroupUri($group); - } - } - } else { - show_help(); - exit(1); - } -} catch (Exception $e) { - print $e->getMessage()."\n"; - exit(1); -} - -function updateGroupUri($group) -{ - if (!have_option('q', 'quiet')) { - print "Updating URI for group '".$group->nickname."' (".$group->id.")..."; - } - - if (empty($group->uri)) { - // Using clone here was screwing up the group->find() iteration - $orig = User_group::staticGet('id', $group->id); - - $group->uri = $group->getUri(); - if (have_option('dry_run')) { - echo " would have set $group->uri "; - } else { - if (!$group->update($orig)) { - throw new Exception("Can't update uri for group " . $group->nickname . "."); - } - echo " set $group->uri "; - } - } else { - print " already set, keeping $group->uri "; - } - - if (have_option('v', 'verbose')) { - print "DONE."; - } - if (!have_option('q', 'quiet') || have_option('v', 'verbose')) { - print "\n"; - } -} diff --git a/scripts/fixup_inboxes.php b/scripts/fixup_inboxes.php deleted file mode 100755 index 2aa5d16900..0000000000 --- a/scripts/fixup_inboxes.php +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/env php -. - */ - -// Abort if called from a web server -if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) { - print "This script must be run from the command line\n"; - exit(); -} - -ini_set("max_execution_time", "0"); -ini_set("max_input_time", "0"); -set_time_limit(0); -mb_internal_encoding('UTF-8'); - -define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); -define('STATUSNET', true); -define('LACONICA', true); // compatibility - -require_once(INSTALLDIR . '/lib/common.php'); - -$start_at = ($argc > 1) ? $argv[1] : null; - -common_log(LOG_INFO, 'Updating user inboxes.'); - -$user = new User(); - -if ($start_at) { - $user->whereAdd('id >= ' . $start_at); -} - -$cnt = $user->find(); -$cache = Cache::instance(); - -while ($user->fetch()) { - common_log(LOG_INFO, 'Updating inbox for user ' . $user->id); - $user->query('BEGIN'); - $inbox = new Notice_inbox(); - $result = $inbox->query('INSERT LOW_PRIORITY INTO notice_inbox (user_id, notice_id, created) ' . - 'SELECT ' . $user->id . ', notice.id, notice.created ' . - 'FROM subscription JOIN notice ON subscription.subscribed = notice.profile_id ' . - 'WHERE subscription.subscriber = ' . $user->id . ' ' . - 'AND notice.created >= subscription.created ' . - 'AND NOT EXISTS (SELECT user_id, notice_id ' . - 'FROM notice_inbox ' . - 'WHERE user_id = ' . $user->id . ' ' . - 'AND notice_id = notice.id)'); - if (is_null($result) || $result === false) { - common_log_db_error($inbox, 'INSERT', __FILE__); - continue; - } - $orig = clone($user); - $user->inboxed = 1; - $result = $user->update($orig); - if (!$result) { - common_log_db_error($user, 'UPDATE', __FILE__); - continue; - } - $user->query('COMMIT'); - $inbox->free(); - unset($inbox); - if ($cache) { - $cache->delete(Cache::key('user:notices_with_friends:' . $user->id)); - } -} diff --git a/scripts/fixup_notices_rendered.php b/scripts/fixup_notices_rendered.php deleted file mode 100755 index cfbdc7479b..0000000000 --- a/scripts/fixup_notices_rendered.php +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env php -. - */ - -// Abort if called from a web server -if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) { - print "This script must be run from the command line\n"; - exit(); -} - -define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); -define('STATUSNET', true); -define('LACONICA', true); // compatibility - -require_once(INSTALLDIR . '/lib/common.php'); - -common_log(LOG_INFO, 'Starting to render old notices.'); - -$start_at = ($argc > 1) ? $argv[1] : null; - -$notice = new Notice(); -if ($start_at) { - $notice->whereAdd('id >= ' . $start_at); -} -$cnt = $notice->find(); - -while ($notice->fetch()) { - common_log(LOG_INFO, 'Pre-rendering notice #' . $notice->id); - $original = clone($notice); - $notice->rendered = common_render_content($notice->content, $notice); - $result = $notice->update($original); - if (!$result) { - common_log_db_error($notice, 'UPDATE', __FILE__); - } -} diff --git a/scripts/getvaliddaemons.php b/scripts/getvaliddaemons.php index 80c21bce58..78cbba8c07 100755 --- a/scripts/getvaliddaemons.php +++ b/scripts/getvaliddaemons.php @@ -39,8 +39,6 @@ $daemons = array(); $daemons[] = INSTALLDIR.'/scripts/queuedaemon.php'; -$daemons[] = INSTALLDIR.'/scripts/imdaemon.php'; - if (Event::handle('GetValidDaemons', array(&$daemons))) { foreach ($daemons as $daemon) { print $daemon . ' '; diff --git a/scripts/init_conversation.php b/scripts/init_conversation.php deleted file mode 100755 index 675e7cabdd..0000000000 --- a/scripts/init_conversation.php +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env php -. - */ - -define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); - -require_once INSTALLDIR.'/scripts/commandline.inc'; - -common_log(LOG_INFO, 'Initializing conversation table...'); - -$notice = new Notice(); -$notice->query('select distinct conversation from notice'); - -while ($notice->fetch()) { - $id = $notice->conversation; - - if ($id) { - $uri = common_local_url('conversation', array('id' => $id)); - - // @fixme db_dataobject won't save our value for an autoincrement - // so we're bypassing the insert wrappers - $conv = new Conversation(); - $sql = "insert into conversation (id,uri,created) values(%d,'%s','%s')"; - $sql = sprintf($sql, - $id, - $conv->escape($uri), - $conv->escape(common_sql_now())); - echo "$id "; - $conv->query($sql); - print "... "; - } -} -print "done.\n"; diff --git a/scripts/initializeinbox.php b/scripts/initializeinbox.php deleted file mode 100644 index 44508fe22a..0000000000 --- a/scripts/initializeinbox.php +++ /dev/null @@ -1,116 +0,0 @@ -#!/usr/bin/env php -. - */ - -define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); - -$shortoptions = 'i:n:af:'; -$longoptions = array('id=', 'nickname=', 'all', 'file='); - -$helptext = <<find()) { - while ($user->fetch()) { - initializeInbox($user); - } - } - } else if (have_option('f', 'file')) { - $filename = get_option_value('f', 'file'); - if (!file_exists($filename)) { - throw new Exception("No such file '$filename'."); - } else if (!is_readable($filename)) { - throw new Exception("Can't read '$filename'."); - } - $ids = file($filename); - foreach ($ids as $id) { - $user = User::staticGet('id', $id); - if (empty($user)) { - print "Can't find user with id '$id'.\n"; - } - initializeInbox($user); - } - } else { - show_help(); - exit(1); - } -} catch (Exception $e) { - print $e->getMessage()."\n"; - exit(1); -} - -function initializeInbox($user) -{ - if (!have_option('q', 'quiet')) { - print "Initializing inbox for $user->nickname..."; - } - - $inbox = Inbox::staticGet('user_id', $user->id); - - if ($inbox && !empty($inbox->fake)) { - if (!have_option('q', 'quiet')) { - echo "(replacing faux cached inbox)"; - } - $inbox = false; - } - if (!empty($inbox)) { - if (!have_option('q', 'quiet')) { - print "SKIP\n"; - } - } else { - $inbox = Inbox::initialize($user->id); - if (!have_option('q', 'quiet')) { - if (empty($inbox)) { - print "ERR\n"; - } else { - print "DONE\n"; - } - } - } -} diff --git a/scripts/install_cli.php b/scripts/install_cli.php index dadbcf66f0..3e18f28f3e 100755 --- a/scripts/install_cli.php +++ b/scripts/install_cli.php @@ -82,7 +82,9 @@ class CliInstaller extends Installer '--admin-nick' => 'adminNick', '--admin-pass' => 'adminPass', '--admin-email' => 'adminEmail', - '--admin-updates' => 'adminUpdates' + '--admin-updates' => 'adminUpdates', + + '--site-profile' => 'siteProfile' ); foreach ($map as $arg => $target) { if (substr($arg, 0, 2) == '--') { @@ -170,6 +172,8 @@ install_cli.php - StatusNet command-line installer --admin-updates 'yes' (default) or 'no', whether to subscribe admin to update@status.net (default yes) + --site-profile site profile ['public', 'private' (default), 'community', 'singleuser'] + --skip-config Don't write a config.php -- use with caution, requires a global configuration file. diff --git a/scripts/joingroup.php b/scripts/joingroup.php new file mode 100644 index 0000000000..658244db9d --- /dev/null +++ b/scripts/joingroup.php @@ -0,0 +1,58 @@ +. + */ + +define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); + +$shortoptions = 'i:n:g:G:'; +$longoptions = array('id=', 'nickname=', 'group=', 'group-id='); + +$helptext = <<group_id); + $user->joinGroup($group); + print "OK\n"; +} catch (Exception $e) { + print $e->getMessage()."\n"; + exit(1); +} diff --git a/scripts/leavegroup.php b/scripts/leavegroup.php new file mode 100644 index 0000000000..653c3b5aad --- /dev/null +++ b/scripts/leavegroup.php @@ -0,0 +1,58 @@ +. + */ + +define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); + +$shortoptions = 'i:n:g:G:'; +$longoptions = array('id=', 'nickname=', 'group=', 'group-id='); + +$helptext = <<group_id); + $user->leaveGroup($group); + print "OK\n"; +} catch (Exception $e) { + print $e->getMessage()."\n"; + exit(1); +} diff --git a/scripts/move_status_network.sh b/scripts/move_status_network.sh new file mode 100755 index 0000000000..2a259c280a --- /dev/null +++ b/scripts/move_status_network.sh @@ -0,0 +1,102 @@ +#!/bin/bash + +# live fast! die young! + +set -e + +# move_status_network.sh nickname newserver + +export nickname="$1" +export newdbhost="$2" + +source /etc/statusnet/setup.cfg + +function set_maintenance_mode() +{ + local nickname=$1; + + php $PHPBASE/scripts/settag.php $nickname maintenancemode; +} + +function get_current_db_info() +{ + local nickname=$1; + + #FIXME I couldn't make this work better + + export dbhost=`mysql -NB -h $SITEDBHOSTNAME -u $ADMIN --password=$ADMINPASS -e "SELECT dbhost FROM status_network WHERE nickname = '$nickname'" $SITEDB` + export dbuser=`mysql -NB -h $SITEDBHOSTNAME -u $ADMIN --password=$ADMINPASS -e "SELECT dbuser FROM status_network WHERE nickname = '$nickname'" $SITEDB` + export dbpass=`mysql -NB -h $SITEDBHOSTNAME -u $ADMIN --password=$ADMINPASS -e "SELECT dbpass FROM status_network WHERE nickname = '$nickname'" $SITEDB` + export dbname=`mysql -NB -h $SITEDBHOSTNAME -u $ADMIN --password=$ADMINPASS -e "SELECT dbname FROM status_network WHERE nickname = '$nickname'" $SITEDB` +} + +function create_empty_db() +{ + local newdbhost=$1; + local dbuser=$2; + local dbpass=$3; + local dbname=$4; + + mysqladmin -h $newdbhost -u $ADMIN --password=$ADMINPASS create $dbname; + + mysql -h $newdbhost -u $ADMIN --password=$ADMINPASS -e "GRANT ALL ON $dbname.* TO '$dbuser'@'localhost' IDENTIFIED BY '$dbpass';" $dbname; + mysql -h $newdbhost -u $ADMIN --password=$ADMINPASS -e "GRANT ALL ON $dbname.* TO '$dbuser'@'%' IDENTIFIED BY '$dbpass';" $dbname; +} + +function transfer_data() +{ + local dbhost=$1; + local newdbhost=$2; + local dbuser=$3; + local dbpass=$4; + local dbname=$5; + local dumpfile=`mktemp`; + + mysqldump -h $dbhost -u $ADMIN --password=$ADMINPASS $dbname > $dumpfile; + mysql -h $newdbhost -u $ADMIN --password=$ADMINPASS $dbname < $dumpfile; + rm $dumpfile; +} + +function update_routing_table() +{ + local nickname=$1; + local newdbhost=$2; + + mysql -h $SITEDBHOSTNAME -u $ADMIN --password=$ADMINPASS -e "UPDATE status_network set dbhost = '$newdbhost' where nickname = '$nickname'" $SITEDB +} + +function flush_site() +{ + local nickname=$1; + + php $PHPBASE/scripts/flushsite.php -s$nickname.$WILDCARD +} + +function unset_maintenance_mode() +{ + local nickname=$1; + + php $PHPBASE/scripts/settag.php -d $nickname maintenancemode; +} + +echo -n Setting maintenance mode on $nickname... +set_maintenance_mode $nickname +echo DONE. +echo -n Getting current database info... +get_current_db_info $nickname +echo DONE. +echo -n Creating empty $dbname database on server $newdbhost... +create_empty_db $newdbhost $dbuser $dbpass $dbname +echo DONE +echo -n Copying $dbname database from $dbhost to $newdbhost... +transfer_data $dbhost $newdbhost $dbuser $dbpass $dbname +echo DONE +echo -n Updating the routing table for $nickname to use $dbname on $newdbhost... +update_routing_table $nickname $newdbhost +echo DONE +echo -n Flushing $nickname site from cache... +flush_site $nickname +echo DONE +echo -n Turning off maintenance mode on $nickname... +unset_maintenance_mode $nickname +echo DONE. diff --git a/scripts/rebuilddb.sh b/scripts/rebuilddb.sh deleted file mode 100755 index 89bc6e252d..0000000000 --- a/scripts/rebuilddb.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -export user=$1 -export password=$2 -export DB=$3 -export SCR=$4 - -mysqldump -u $user --password=$password -c -t --hex-blob $DB > /tmp/$DB.sql -mysqladmin -u $user --password=$password -f drop $DB -mysqladmin -u $user --password=$password create $DB -mysql -u $user --password=$password $DB < $SCR -mysql -u $user --password=$password $DB < /tmp/$DB.sql - - diff --git a/scripts/rebuilddb_psql.sh b/scripts/rebuilddb_psql.sh deleted file mode 100755 index 6b15b9212f..0000000000 --- a/scripts/rebuilddb_psql.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash -# -# ******************************* WARNING ********************************* -# Do not run this script until you have read and understood the information -# below, AND backed up your database. Failure to observe these instructions -# may result in losing all the data in your database. -# -# This script is used to upgrade StatusNet's PostgreSQL database to the -# latest version. It does the following: -# -# 1. Dumps the existing data to /tmp/rebuilddb_psql.sql -# 2. Clears out the objects (tables, etc) in the database schema -# 3. Reconstructs the database schema using the latest script -# 4. Restores the data dumped in step 1 -# -# You MUST run this script as the 'postgres' user. -# You MUST be able to write to /tmp/rebuilddb_psql.sql -# You MUST specify the statusnet database user and database name on the -# command line, e.g. ./rebuilddb_psql.sh myuser mydbname -# - -user=$1 -DB=$2 - -cd `dirname $0` - -pg_dump -a -D --disable-trigger $DB > /tmp/rebuilddb_psql.sql -psql -c "drop schema public cascade; create schema public;" $DB -psql -c "grant all privileges on schema public to $user;" $DB -psql $DB < ../db/statusnet_pg.sql -psql $DB < /tmp/rebuilddb_psql.sql -for tab in `psql -c '\dts' $DB -tA | cut -d\| -f2`; do - psql -c "ALTER TABLE \"$tab\" OWNER TO $user;" $DB -done diff --git a/scripts/settag.php b/scripts/settag.php index ca260f7bf9..19abce43c8 100644 --- a/scripts/settag.php +++ b/scripts/settag.php @@ -66,12 +66,12 @@ if ($i !== false) { } } else { print "Already set.\n"; - exit(-1); + exit(0); } } else { if (have_option('d', 'delete')) { // Delete print "No such tag.\n"; - exit(-1); + exit(0); } else { $tags[] = $tag; $result = $sn->setTags($tags); diff --git a/scripts/setup.cfg.sample b/scripts/setup.cfg.sample index 049cd3e859..3296bbe043 100644 --- a/scripts/setup.cfg.sample +++ b/scripts/setup.cfg.sample @@ -18,3 +18,4 @@ export MAILSUBJECT="Your new StatusNet site" export POSTINSTALL=/etc/statusnet/morestuff.sh export WEBUSER=www-data export WEBGROUP=www-data +export TAGS=tag1,tag2,tag3 diff --git a/scripts/sitemap.php b/scripts/sitemap.php deleted file mode 100755 index f8c3921465..0000000000 --- a/scripts/sitemap.php +++ /dev/null @@ -1,399 +0,0 @@ -#!/usr/bin/env php -. - */ - -define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); - -$shortoptions = 'f:d:u:'; - -$helptext = << Use as output file - -d Use for new sitemaps - -u Use as root for URLs - -END_OF_SITEMAP_HELP; - -require_once INSTALLDIR . '/scripts/commandline.inc'; - -$output_paths = parse_args(); - -standard_map(); -notices_map(); -user_map(); -index_map(); - -// ------------------------------------------------------------------------------ -// Main functions: get data out and turn them into sitemaps -// ------------------------------------------------------------------------------ - -// Generate index sitemap of all other sitemaps. -function index_map() -{ - global $output_paths; - $output_dir = $output_paths['output_dir']; - $output_url = $output_paths['output_url']; - - foreach (glob("$output_dir*.xml") as $file_name) { - - // Just the file name please. - $file_name = preg_replace("|$output_dir|", '', $file_name); - - $index_urls .= sitemap( - array( - 'url' => $output_url . $file_name, - 'changefreq' => 'daily' - ) - ); - } - - write_file($output_paths['index_file'], sitemapindex($index_urls)); -} - -// Generate sitemap of standard site elements. -function standard_map() -{ - global $output_paths; - - $standard_map_urls .= url( - array( - 'url' => common_local_url('public'), - 'changefreq' => 'daily', - 'priority' => '1', - ) - ); - - $standard_map_urls .= url( - array( - 'url' => common_local_url('publicrss'), - 'changefreq' => 'daily', - 'priority' => '0.3', - ) - ); - - $docs = array('about', 'faq', 'contact', 'im', 'openid', 'openmublog', - 'privacy', 'source', 'badge'); - - foreach($docs as $title) { - $standard_map_urls .= url( - array( - 'url' => common_local_url('doc', array('title' => $title)), - 'changefreq' => 'monthly', - 'priority' => '0.2', - ) - ); - } - - $urlset_path = $output_paths['output_dir'] . 'standard.xml'; - - write_file($urlset_path, urlset($standard_map_urls)); -} - -// Generate sitemaps of all notices. -function notices_map() -{ - global $output_paths; - - $notices = DB_DataObject::factory('notice'); - - $notices->query('SELECT id, uri, url, modified FROM notice where is_local = 1'); - - $notice_count = 0; - $map_count = 1; - - while ($notices->fetch()) { - - // Maximum 50,000 URLs per sitemap file. - if ($notice_count == 50000) { - $notice_count = 0; - $map_count++; - } - - // remote notices have an URL - - if (!$notices->url && $notices->uri) { - $notice = array( - 'url' => ($notices->uri) ? $notices->uri : common_local_url('shownotice', array('notice' => $notices->id)), - 'lastmod' => common_date_w3dtf($notices->modified), - 'changefreq' => 'never', - 'priority' => '1', - ); - - $notice_list[$map_count] .= url($notice); - $notice_count++; - } - } - - // Make full sitemaps from the lists and save them. - array_to_map($notice_list, 'notice'); -} - -// Generate sitemaps of all users. -function user_map() -{ - global $output_paths; - - $users = DB_DataObject::factory('user'); - - $users->query('SELECT id, nickname FROM user'); - - $user_count = 0; - $map_count = 1; - - while ($users->fetch()) { - - // Maximum 50,000 URLs per sitemap file. - if ($user_count == 50000) { - $user_count = 0; - $map_count++; - } - - $user_args = array('nickname' => $users->nickname); - - // Define parameters for generating elements. - $user = array( - 'url' => common_local_url('showstream', $user_args), - 'changefreq' => 'daily', - 'priority' => '1', - ); - - $user_rss = array( - 'url' => common_local_url('userrss', $user_args), - 'changefreq' => 'daily', - 'priority' => '0.3', - ); - - $all = array( - 'url' => common_local_url('all', $user_args), - 'changefreq' => 'daily', - 'priority' => '1', - ); - - $all_rss = array( - 'url' => common_local_url('allrss', $user_args), - 'changefreq' => 'daily', - 'priority' => '0.3', - ); - - $replies = array( - 'url' => common_local_url('replies', $user_args), - 'changefreq' => 'daily', - 'priority' => '1', - ); - - $replies_rss = array( - 'url' => common_local_url('repliesrss', $user_args), - 'changefreq' => 'daily', - 'priority' => '0.3', - ); - - $foaf = array( - 'url' => common_local_url('foaf', $user_args), - 'changefreq' => 'weekly', - 'priority' => '0.5', - ); - - // Construct a element for each user facet and add it - // to our existing list of those. - $user_list[$map_count] .= url($user); - $user_rss_list[$map_count] .= url($user_rss); - $all_list[$map_count] .= url($all); - $all_rss_list[$map_count] .= url($all_rss); - $replies_list[$map_count] .= url($replies); - $replies_rss_list[$map_count] .= url($replies_rss); - $foaf_list[$map_count] .= url($foaf); - - $user_count++; - } - - // Make full sitemaps from the lists and save them. - // Possible factoring: put all the lists into a master array, thus allowing - // calling with single argument (i.e., array_to_map('user')). - array_to_map($user_list, 'user'); - array_to_map($user_rss_list, 'user_rss'); - array_to_map($all_list, 'all'); - array_to_map($all_rss_list, 'all_rss'); - array_to_map($replies_list, 'replies'); - array_to_map($replies_rss_list, 'replies_rss'); - array_to_map($foaf_list, 'foaf'); -} - -// ------------------------------------------------------------------------------ -// XML generation functions -// ------------------------------------------------------------------------------ - -// Generate a element. -function url($url_args) -{ - $url = preg_replace('/&/', '&', $url_args['url']); // escape ampersands for XML - $lastmod = $url_args['lastmod']; - $changefreq = $url_args['changefreq']; - $priority = $url_args['priority']; - - if (is_null($url)) { - error("url() arguments require 'url' value."); - } - - $url_out = "\t\n"; - $url_out .= "\t\t$url\n"; - - if ($changefreq) { - $url_out .= "\t\t$changefreq\n"; - } - - if ($lastmod) { - $url_out .= "\t\t$lastmod\n"; - } - - if ($priority) { - $url_out .= "\t\t$priority\n"; - } - - $url_out .= "\t\n"; - - return $url_out; -} - -function sitemap($sitemap_args) -{ - $url = preg_replace('/&/', '&', $sitemap_args['url']); // escape ampersands for XML - $lastmod = $sitemap_args['lastmod']; - - if (is_null($url)) { - error("url() arguments require 'url' value."); - } - - $sitemap_out = "\t\n"; - $sitemap_out .= "\t\t$url\n"; - - if ($lastmod) { - $sitemap_out .= "\t\t$lastmod\n"; - } - - $sitemap_out .= "\t\n"; - - return $sitemap_out; -} - -// Generate a element. -function urlset($urlset_text) -{ - $urlset = '' . "\n" . - '' . "\n" . - $urlset_text . - ''; - - return $urlset; -} - -// Generate a element. -function sitemapindex($sitemapindex_text) -{ - $sitemapindex = '' . "\n" . - '' . "\n" . - $sitemapindex_text . - ''; - - return $sitemapindex; -} - -// Generate a sitemap from an array containing elements and write it to a file. -function array_to_map($url_list, $filename_prefix) -{ - global $output_paths; - - if ($url_list) { - // $map_urls is a long string containing concatenated elements. - while (list($map_idx, $map_urls) = each($url_list)) { - $urlset_path = $output_paths['output_dir'] . "$filename_prefix-$map_idx.xml"; - - write_file($urlset_path, urlset($map_urls)); - } - } -} - -// ------------------------------------------------------------------------------ -// Internal functions -// ------------------------------------------------------------------------------ - -// Parse command line arguments. -function parse_args() -{ - $index_file = get_option_value('f'); - $output_dir = get_option_value('d'); - $output_url = get_option_value('u'); - - if (file_exists($output_dir)) { - if (is_writable($output_dir) === false) { - error("$output_dir is not writable."); - } - } else { - error("output directory $output_dir does not exist."); - } - - $paths = array( - 'index_file' => $index_file, - 'output_dir' => trailing_slash($output_dir), - 'output_url' => trailing_slash($output_url), - ); - - return $paths; -} - -// Ensure paths end with a "/". -function trailing_slash($path) -{ - if (preg_match('/\/$/', $path) == 0) { - $path .= '/'; - } - - return $path; -} - -// Write data to disk. -function write_file($path, $data) -{ - if (is_null($path)) { - error('No path specified for writing to.'); - } elseif (is_null($data)) { - error('No data specified for writing.'); - } - - if (($fh_out = fopen($path,'w')) === false) { - error("couldn't open $path for writing."); - } - - if (fwrite($fh_out, $data) === false) { - error("couldn't write to $path."); - } -} - -// Display an error message and exit. -function error ($error_msg) -{ - if (is_null($error_msg)) { - $error_msg = 'error() was called without any explanation!'; - } - - echo "Error: $error_msg\n"; - exit(1); -} - -?> \ No newline at end of file diff --git a/scripts/stopdaemons.sh b/scripts/stopdaemons.sh index bc1230e645..45a7d5cc8b 100755 --- a/scripts/stopdaemons.sh +++ b/scripts/stopdaemons.sh @@ -23,8 +23,8 @@ SDIR=`dirname $0` DIR=`php $SDIR/getpiddir.php` -for f in ombhandler smshandler pinghandler \ - twitterhandler facebookhandler \ +for f in ombhandler smshandler pinghandler queuedaemon \ + twitterhandler facebookhandler imdaemon \ twitterstatusfetcher synctwitterfriends pluginhandler rsscloudhandler; do FILES="$DIR/$f.*.pid" diff --git a/scripts/updateavatarurl.php b/scripts/updateavatarurl.php deleted file mode 100644 index 3b6681bae9..0000000000 --- a/scripts/updateavatarurl.php +++ /dev/null @@ -1,132 +0,0 @@ -#!/usr/bin/env php -. - */ - -define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); - -$shortoptions = 'i:n:a'; -$longoptions = array('id=', 'nickname=', 'all'); - -$helptext = <<find()) { - while ($user->fetch()) { - updateAvatars($user); - } - } - } else { - show_help(); - exit(1); - } -} catch (Exception $e) { - print $e->getMessage()."\n"; - exit(1); -} - -function updateAvatars($user) -{ - $touched = false; - - if (!have_option('q', 'quiet')) { - print "Updating avatars for user '".$user->nickname."' (".$user->id.")..."; - } - - $avatar = new Avatar(); - - $avatar->profile_id = $user->id; - - if (!$avatar->find()) { - if (have_option('v', 'verbose')) { - print "(none found)..."; - } - } else { - while ($avatar->fetch()) { - if (have_option('v', 'verbose')) { - if ($avatar->original) { - print "original..."; - } else { - print $avatar->width."..."; - } - } - - $orig_url = $avatar->url; - - $avatar->url = Avatar::url($avatar->filename); - - if ($avatar->url != $orig_url) { - $sql = - "UPDATE avatar SET url = '" . $avatar->url . "' ". - "WHERE profile_id = " . $avatar->profile_id . " ". - "AND width = " . $avatar->width . " " . - "AND height = " . $avatar->height . " "; - - if ($avatar->original) { - $sql .= "AND original = 1 "; - } - - if (!$avatar->query($sql)) { - throw new Exception("Can't update avatar for user " . $user->nickname . "."); - } else { - $touched = true; - } - } - } - } - - if ($touched) { - $profile = $user->getProfile(); - common_broadcast_profile($profile); - } - - if (have_option('v', 'verbose')) { - print "DONE."; - } - if (!have_option('q', 'quiet') || have_option('v', 'verbose')) { - print "\n"; - } -} diff --git a/scripts/updateavatarurl_group.php b/scripts/updateavatarurl_group.php deleted file mode 100644 index ada42de202..0000000000 --- a/scripts/updateavatarurl_group.php +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/env php -. - */ - -define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); - -$shortoptions = 'i:n:a'; -$longoptions = array('id=', 'nickname=', 'all'); - -$helptext = <<find()) { - while ($group->fetch()) { - updateGroupAvatars($group); - } - } - } else { - show_help(); - exit(1); - } -} catch (Exception $e) { - print $e->getMessage()."\n"; - exit(1); -} - -function updateGroupAvatars($group) -{ - if (!have_option('q', 'quiet')) { - print "Updating avatars for group '".$group->nickname."' (".$group->id.")..."; - } - - if (empty($group->original_logo)) { - print "(none found)..."; - } else { - // Using clone here was screwing up the group->find() iteration - $orig = User_group::staticGet('id', $group->id); - - $group->original_logo = Avatar::url(basename($group->original_logo)); - $group->homepage_logo = Avatar::url(basename($group->homepage_logo)); - $group->stream_logo = Avatar::url(basename($group->stream_logo)); - $group->mini_logo = Avatar::url(basename($group->mini_logo)); - - if (!$group->update($orig)) { - throw new Exception("Can't update avatars for group " . $group->nickname . "."); - } - } - - if (have_option('v', 'verbose')) { - print "DONE."; - } - if (!have_option('q', 'quiet') || have_option('v', 'verbose')) { - print "\n"; - } -} diff --git a/scripts/updateprofileurl.php b/scripts/updateprofileurl.php deleted file mode 100644 index 2fc6828e60..0000000000 --- a/scripts/updateprofileurl.php +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/env php -. - */ - -define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); - -$shortoptions = 'i:n:a'; -$longoptions = array('id=', 'nickname=', 'all'); - -$helptext = <<find()) { - while ($user->fetch()) { - updateProfileURL($user); - } - } - } else { - show_help(); - exit(1); - } -} catch (Exception $e) { - print $e->getMessage()."\n"; - exit(1); -} - -function updateProfileURL($user) -{ - $profile = $user->getProfile(); - - if (empty($profile)) { - throw new Exception("Can't find profile for user $user->nickname ($user->id)"); - } - - $orig = clone($profile); - - $profile->profileurl = common_profile_url($user->nickname); - - if (!have_option('q', 'quiet')) { - print "Updating profile url for $user->nickname ($user->id) ". - "from $orig->profileurl to $profile->profileurl..."; - } - - $result = $profile->update($orig); - - if (!$result) { - print "FAIL.\n"; - common_log_db_error($profile, 'UPDATE', __FILE__); - throw new Exception("Can't update profile for user $user->nickname ($user->id)"); - } - - common_broadcast_profile($profile); - - print "OK.\n"; -} diff --git a/scripts/updateurls.php b/scripts/updateurls.php new file mode 100644 index 0000000000..01b3c2283b --- /dev/null +++ b/scripts/updateurls.php @@ -0,0 +1,138 @@ +#!/usr/bin/env php +. + */ + +define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); + +$shortoptions = ''; +$longoptions = array(); + +$helptext = <<find()) { + while ($user->fetch()) { + printfv("Updating user {$user->nickname}..."); + try { + $profile = $user->getProfile(); + + updateProfileUrl($profile); + updateAvatarUrls($profile); + + // Broadcast for remote users + + common_broadcast_profile($profile); + + } catch (Exception $e) { + printv("Error updating URLs: " . $e->getMessage()); + } + printfv("DONE."); + } + } +} + +function updateProfileUrl($profile) +{ + $orig = clone($profile); + $profile->profileurl = common_profile_url($profile->nickname); + $profile->update($orig); +} + +function updateAvatarUrls($profile) +{ + $avatar = new Avatar(); + + $avatar->profile_id = $profile->id; + if ($avatar->find()) { + while ($avatar->fetch()) { + $orig_url = $avatar->url; + $avatar->url = Avatar::url($avatar->filename); + if ($avatar->url != $orig_url) { + $sql = + "UPDATE avatar SET url = '" . $avatar->url . "' ". + "WHERE profile_id = " . $avatar->profile_id . " ". + "AND width = " . $avatar->width . " " . + "AND height = " . $avatar->height . " "; + + if ($avatar->original) { + $sql .= "AND original = 1 "; + } + + if (!$avatar->query($sql)) { + throw new Exception("Can't update avatar for user " . $profile->nickname . "."); + } else { + $touched = true; + } + } + } + } +} + +function updateGroupUrls() +{ + printfnq("Updating group URLs...\n"); + + $group = new User_group(); + + if ($group->find()) { + while ($group->fetch()) { + try { + printfv("Updating group {$group->nickname}..."); + $orig = User_group::staticGet('id', $group->id); + if (!empty($group->original_logo)) { + $group->original_logo = Avatar::url(basename($group->original_logo)); + $group->homepage_logo = Avatar::url(basename($group->homepage_logo)); + $group->stream_logo = Avatar::url(basename($group->stream_logo)); + $group->mini_logo = Avatar::url(basename($group->mini_logo)); + } + // XXX: this is a hack to see if a group is local or not + $localUri = common_local_url('groupbyid', + array('id' => $group->id)); + if ($group->getUri() != $localUri) { + $group->mainpage = common_local_url('showgroup', + array('nickname' => $group->nickname)); + } + $group->update($orig); + printfv("DONE."); + } catch (Exception $e) { + printv("Can't update avatars for group " . $group->nickname . ": ". $e->getMessage()); + } + } + } +} + +main(); diff --git a/scripts/upgrade.php b/scripts/upgrade.php new file mode 100644 index 0000000000..7d81c19835 --- /dev/null +++ b/scripts/upgrade.php @@ -0,0 +1,422 @@ +#!/usr/bin/env php +. + */ + +define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); + +$shortoptions = 'x::'; +$longoptions = array('extensions='); + +$helptext = << $def) { + $schemaUpdater->register($table, $def); + } + $schemaUpdater->checkSchema(); + + printfnq("DONE.\n"); +} + +function updateSchemaPlugins() +{ + printfnq("Upgrading plugin schema..."); + + Event::handle('CheckSchema'); + + printfnq("DONE.\n"); +} + +function fixupNoticeRendered() +{ + printfnq("Ensuring all notices have rendered HTML..."); + + $notice = new Notice(); + + $notice->whereAdd('rendered IS NULL'); + $notice->find(); + + while ($notice->fetch()) { + $original = clone($notice); + $notice->rendered = common_render_content($notice->content, $notice); + $notice->update($original); + } + + printfnq("DONE.\n"); +} + +function fixupNoticeConversation() +{ + printfnq("Ensuring all notices have a conversation ID..."); + + $notice = new Notice(); + $notice->whereAdd('conversation is null'); + $notice->orderBy('id'); // try to get originals before replies + $notice->find(); + + while ($notice->fetch()) { + try { + $cid = null; + + $orig = clone($notice); + + if (empty($notice->reply_to)) { + $notice->conversation = $notice->id; + } else { + $reply = Notice::staticGet('id', $notice->reply_to); + + if (empty($reply)) { + $notice->conversation = $notice->id; + } else if (empty($reply->conversation)) { + $notice->conversation = $notice->id; + } else { + $notice->conversation = $reply->conversation; + } + + unset($reply); + $reply = null; + } + + $result = $notice->update($orig); + + $orig = null; + unset($orig); + } catch (Exception $e) { + printv("Error setting conversation: " . $e->getMessage()); + } + } + + printfnq("DONE.\n"); +} + +function fixupGroupURI() +{ + printfnq("Ensuring all groups have an URI..."); + + $group = new User_group(); + $group->whereAdd('uri IS NULL'); + + if ($group->find()) { + while ($group->fetch()) { + $orig = User_group::staticGet('id', $group->id); + $group->uri = $group->getUri(); + $group->update($orig); + } + } + + printfnq("DONE.\n"); +} + +function initConversation() +{ + printfnq("Ensuring all conversations have a row in conversation table..."); + + $notice = new Notice(); + $notice->query('select distinct notice.conversation from notice '. + 'where notice.conversation is not null '. + 'and not exists (select conversation.id from conversation where id = notice.conversation)'); + + while ($notice->fetch()) { + + $id = $notice->conversation; + + $uri = common_local_url('conversation', array('id' => $id)); + + // @fixme db_dataobject won't save our value for an autoincrement + // so we're bypassing the insert wrappers + $conv = new Conversation(); + $sql = "insert into conversation (id,uri,created) values(%d,'%s','%s')"; + $sql = sprintf($sql, + $id, + $conv->escape($uri), + $conv->escape(common_sql_now())); + $conv->query($sql); + } + + printfnq("DONE.\n"); +} + +function initInbox() +{ + printfnq("Ensuring all users have an inbox..."); + + $user = new User(); + $user->whereAdd('not exists (select user_id from inbox where user_id = user.id)'); + $user->orderBy('id'); + + if ($user->find()) { + + while ($user->fetch()) { + + try { + $notice = new Notice(); + + $notice->selectAdd(); + $notice->selectAdd('id'); + $notice->joinAdd(array('profile_id', 'subscription:subscribed')); + $notice->whereAdd('subscription.subscriber = ' . $user->id); + $notice->whereAdd('notice.created >= subscription.created'); + + $ids = array(); + + if ($notice->find()) { + while ($notice->fetch()) { + $ids[] = $notice->id; + } + } + + $notice = null; + + $inbox = new Inbox(); + $inbox->user_id = $user->id; + $inbox->pack($ids); + $inbox->insert(); + } catch (Exception $e) { + printv("Error initializing inbox: " . $e->getMessage()); + } + } + } + + printfnq("DONE.\n"); +} + +function initLocalGroup() +{ + printfnq("Ensuring all local user groups have a local_group..."); + + $group = new User_group(); + $group->whereAdd('NOT EXISTS (select group_id from local_group where group_id = user_group.id)'); + $group->find(); + + while ($group->fetch()) { + try { + // Hack to check for local groups + if ($group->getUri() == common_local_url('groupbyid', array('id' => $group->id))) { + $lg = new Local_group(); + + $lg->group_id = $group->id; + $lg->nickname = $group->nickname; + $lg->created = $group->created; // XXX: common_sql_now() ? + $lg->modified = $group->modified; + + $lg->insert(); + } + } catch (Exception $e) { + printfv("Error initializing local group for {$group->nickname}:" . $e->getMessage()); + } + } + + printfnq("DONE.\n"); +} + +function initNoticeReshare() +{ + printfnq("Ensuring all reshares have the correct verb and object-type..."); + + $notice = new Notice(); + $notice->whereAdd('repeat_of is not null'); + $notice->whereAdd('(verb != "'.ActivityVerb::SHARE.'" OR object_type != "'.ActivityObject::ACTIVITY.'")'); + + if ($notice->find()) { + while ($notice->fetch()) { + try { + $orig = Notice::staticGet('id', $notice->id); + $notice->verb = ActivityVerb::SHARE; + $notice->object_type = ActivityObject::ACTIVITY; + $notice->update($orig); + } catch (Exception $e) { + printfv("Error updating verb and object_type for {$notice->id}:" . $e->getMessage()); + } + } + } + + printfnq("DONE.\n"); +} + +function initFaveURI() +{ + printfnq("Ensuring all faves have a URI..."); + + $fave = new Fave(); + $fave->whereAdd('uri IS NULL'); + + if ($fave->find()) { + while ($fave->fetch()) { + try { + $fave->decache(); + $fave->query(sprintf('update fave '. + 'set uri = "%s", '. + ' modified = "%s" '. + 'where user_id = %d '. + 'and notice_id = %d', + Fave::newURI($fave->user_id, $fave->notice_id, $fave->modified), + common_sql_date(strtotime($fave->modified)), + $fave->user_id, + $fave->notice_id)); + } catch (Exception $e) { + common_log(LOG_ERR, "Error updated fave URI: " . $e->getMessage()); + } + } + } + + printfnq("DONE.\n"); +} + +function initSubscriptionURI() +{ + printfnq("Ensuring all subscriptions have a URI..."); + + $sub = new Subscription(); + $sub->whereAdd('uri IS NULL'); + + if ($sub->find()) { + while ($sub->fetch()) { + try { + $sub->decache(); + $sub->query(sprintf('update subscription '. + 'set uri = "%s" '. + 'where subscriber = %d '. + 'and subscribed = %d', + Subscription::newURI($sub->subscriber, $sub->subscribed, $sub->created), + $sub->subscriber, + $sub->subscribed)); + } catch (Exception $e) { + common_log(LOG_ERR, "Error updated subscription URI: " . $e->getMessage()); + } + } + } + + printfnq("DONE.\n"); +} + +function initGroupMemberURI() +{ + printfnq("Ensuring all group memberships have a URI..."); + + $mem = new Group_member(); + $mem->whereAdd('uri IS NULL'); + + if ($mem->find()) { + while ($mem->fetch()) { + try { + $mem->decache(); + $mem->query(sprintf('update group_member set uri = "%s" '. + 'where profile_id = %d ' . + 'and group_id = %d ', + Group_member::newURI($mem->profile_id, $mem->group_id, $mem->created), + $mem->profile_id, + $mem->group_id)); + } catch (Exception $e) { + common_log(LOG_ERR, "Error updated membership URI: " . $e->getMessage()); + } + } + } + + printfnq("DONE.\n"); +} + +function initProfileLists() +{ + printfnq("Ensuring all profile tags have a corresponding list..."); + + $ptag = new Profile_tag(); + $ptag->selectAdd(); + $ptag->selectAdd('tagger, tag, count(*) as tagged_count'); + $ptag->whereAdd('NOT EXISTS (SELECT tagger, tagged from profile_list '. + 'where profile_tag.tagger = profile_list.tagger '. + 'and profile_tag.tag = profile_list.tag)'); + $ptag->groupBy('tagger, tag'); + $ptag->orderBy('tagger, tag'); + + if ($ptag->find()) { + while ($ptag->fetch()) { + $plist = new Profile_list(); + + $plist->tagger = $ptag->tagger; + $plist->tag = $ptag->tag; + $plist->private = 0; + $plist->created = common_sql_now(); + $plist->modified = $plist->created; + $plist->mainpage = common_local_url('showprofiletag', + array('tagger' => $plist->getTagger()->nickname, + 'tag' => $plist->tag));; + + $plist->tagged_count = $ptag->tagged_count; + $plist->subscriber_count = 0; + + $plist->insert(); + + $orig = clone($plist); + // After insert since it uses auto-generated ID + $plist->uri = common_local_url('profiletagbyid', + array('id' => $plist->id, 'tagger_id' => $plist->tagger)); + + $plist->update($orig); + } + } + + printfnq("DONE.\n"); +} + +main(); diff --git a/tests/ActivityParseTests.php b/tests/ActivityParseTests.php index c2817a4602..6423eaaf03 100644 --- a/tests/ActivityParseTests.php +++ b/tests/ActivityParseTests.php @@ -405,6 +405,28 @@ class ActivityParseTests extends PHPUnit_Framework_TestCase $act = new Activity($entry, $feed); $this->assertEquals($act->actor->id, $expected); } + + public function testBookmarkRelated() + { + global $_example11; + $dom = new DOMDocument(); + $dom->loadXML($_example11); + + $feed = $dom->documentElement; + $entry = $dom->getElementsByTagName('entry')->item(0); + + $expected = 'http://blog.teambox.com/open-source-companies'; + + $links = ActivityUtils::getLinks($entry, 'related'); + + $this->assertFalse(empty($links)); + $this->assertTrue(is_array($links)); + $this->assertEquals(count($links), 1); + + $url = $links[0]->getAttribute('href'); + + $this->assertEquals($url, $expected); + } } $_example1 = << EXAMPLE10; + +$_example11 = << + + StatusNet + http://freelish.us/api/statuses/user_timeline/1.atom + demon timeline + Updates from demon on freelish.us! + http://avatar.status.net/f/freelishus/1-96-20110331163048.jpeg + 2011-05-30T09:36:03-04:00 + + http://activitystrea.ms/schema/1.0/person + http://freelishus.status.net/user/1 + demon + + + + + + 45.50884 -73.58781 + demon + Evan Prodromou + Montreal hacker and entrepreneur. + + Montreal, Quebec + + + + homepage + http://evan.status.net/ + true + + + + + + http://activitystrea.ms/schema/1.0/person + http://freelishus.status.net/user/1 + Evan Prodromou + + + + + + 45.50884 -73.58781 + demon + Evan Prodromou + Montreal hacker and entrepreneur. + + Montreal, Quebec + + + + homepage + http://evan.status.net/ + true + + + + + + + + + + + + + + http://activitystrea.ms/schema/1.0/bookmark + http://freelish.us/bookmark/9e930c3e-7ed9-47de-aba5-df6c60cec542 + Why you should build an open-source startup | Teambox Blog + + + http://activitystrea.ms/schema/1.0/post + 2011-05-26T20:36:25+00:00 + 2011-05-26T20:36:25+00:00 + + + + + + + + + +EXAMPLE11; diff --git a/tests/atompub/atompub_test.php b/tests/atompub/atompub_test.php index e23e4a711b..fb675c778e 100644 --- a/tests/atompub/atompub_test.php +++ b/tests/atompub/atompub_test.php @@ -39,212 +39,6 @@ END_OF_HELP; require_once INSTALLDIR.'/scripts/commandline.inc'; -class AtomPubClient -{ - public $url; - private $user, $pass; - - /** - * - * @param string $url collection feed URL - * @param string $user auth username - * @param string $pass auth password - */ - function __construct($url, $user, $pass) - { - $this->url = $url; - $this->user = $user; - $this->pass = $pass; - } - - /** - * Set up an HTTPClient with auth for our resource. - * - * @param string $method - * @return HTTPClient - */ - private function httpClient($method='GET') - { - $client = new HTTPClient($this->url); - $client->setMethod($method); - $client->setAuth($this->user, $this->pass); - return $client; - } - - function get() - { - $client = $this->httpClient('GET'); - $response = $client->send(); - if ($response->isOk()) { - return $response->getBody(); - } else { - throw new Exception("Bogus return code: " . $response->getStatus() . ': ' . $response->getBody()); - } - } - - /** - * Create a new resource by POSTing it to the collection. - * If successful, will return the URL representing the - * canonical location of the new resource. Neat! - * - * @param string $data - * @param string $type defaults to Atom entry - * @return string URL to the created resource - * - * @throws exceptions on failure - */ - function post($data, $type='application/atom+xml;type=entry') - { - $client = $this->httpClient('POST'); - $client->setHeader('Content-Type', $type); - // optional Slug header not used in this case - $client->setBody($data); - $response = $client->send(); - - if ($response->getStatus() != '201') { - throw new Exception("Expected HTTP 201 on POST, got " . $response->getStatus() . ': ' . $response->getBody()); - } - $loc = $response->getHeader('Location'); - $contentLoc = $response->getHeader('Content-Location'); - - if (empty($loc)) { - throw new Exception("AtomPub POST response missing Location header."); - } - if (!empty($contentLoc)) { - if ($loc != $contentLoc) { - throw new Exception("AtomPub POST response Location and Content-Location headers do not match."); - } - - // If Content-Location and Location match, that means the response - // body is safe to interpret as the resource itself. - if ($type == 'application/atom+xml;type=entry') { - self::validateAtomEntry($response->getBody()); - } - } - - return $loc; - } - - /** - * Note that StatusNet currently doesn't allow PUT editing on notices. - * - * @param string $data - * @param string $type defaults to Atom entry - * @return true on success - * - * @throws exceptions on failure - */ - function put($data, $type='application/atom+xml;type=entry') - { - $client = $this->httpClient('PUT'); - $client->setHeader('Content-Type', $type); - $client->setBody($data); - $response = $client->send(); - - if ($response->getStatus() != '200' && $response->getStatus() != '204') { - throw new Exception("Expected HTTP 200 or 204 on PUT, got " . $response->getStatus() . ': ' . $response->getBody()); - } - - return true; - } - - /** - * Delete the resource. - * - * @return true on success - * - * @throws exceptions on failure - */ - function delete() - { - $client = $this->httpClient('DELETE'); - $client->setBody($data); - $response = $client->send(); - - if ($response->getStatus() != '200' && $response->getStatus() != '204') { - throw new Exception("Expected HTTP 200 or 204 on DELETE, got " . $response->getStatus() . ': ' . $response->getBody()); - } - - return true; - } - - /** - * Ensure that the given string is a parseable Atom entry. - * - * @param string $str - * @return boolean - * @throws Exception on invalid input - */ - static function validateAtomEntry($str) - { - if (empty($str)) { - throw new Exception('Bad Atom entry: empty'); - } - $dom = new DOMDocument; - if (!$dom->loadXML($str)) { - throw new Exception('Bad Atom entry: XML is not well formed.'); - } - - $activity = new Activity($dom->documentRoot); - return true; - } - - static function entryEditURL($str) { - $dom = new DOMDocument; - $dom->loadXML($str); - $path = new DOMXPath($dom); - $path->registerNamespace('atom', 'http://www.w3.org/2005/Atom'); - - $links = $path->query('/atom:entry/atom:link[@rel="edit"]', $dom->documentRoot); - if ($links && $links->length) { - if ($links->length > 1) { - throw new Exception('Bad Atom entry; has multiple rel=edit links.'); - } - $link = $links->item(0); - $url = $link->getAttribute('href'); - return $url; - } else { - throw new Exception('Atom entry lists no rel=edit link.'); - } - } - - static function entryId($str) { - $dom = new DOMDocument; - $dom->loadXML($str); - $path = new DOMXPath($dom); - $path->registerNamespace('atom', 'http://www.w3.org/2005/Atom'); - - $links = $path->query('/atom:entry/atom:id', $dom->documentRoot); - if ($links && $links->length) { - if ($links->length > 1) { - throw new Exception('Bad Atom entry; has multiple id entries.'); - } - $link = $links->item(0); - $url = $link->textContent; - return $url; - } else { - throw new Exception('Atom entry lists no id.'); - } - } - - static function getEntryInFeed($str, $id) - { - $dom = new DOMDocument; - $dom->loadXML($str); - $path = new DOMXPath($dom); - $path->registerNamespace('atom', 'http://www.w3.org/2005/Atom'); - - $query = '/atom:feed/atom:entry[atom:id="'.$id.'"]'; - $items = $path->query($query, $dom->documentRoot); - if ($items && $items->length) { - return $items->item(0); - } else { - return null; - } - } -} - - $user = get_option_value('n', 'nickname'); $pass = get_option_value('p', 'password'); diff --git a/tests/oEmbedTest.php b/tests/oEmbedTest.php index b5e441c42f..1f1d5f826c 100644 --- a/tests/oEmbedTest.php +++ b/tests/oEmbedTest.php @@ -15,22 +15,22 @@ class oEmbedTest extends PHPUnit_Framework_TestCase public function setup() { - $this->old_oohembed = common_config('oohembed', 'endpoint'); + $this->old_ohembed = common_config('ohembed', 'endpoint'); } public function tearDown() { - $GLOBALS['config']['oohembed']['endpoint'] = $this->old_oohembed; + $GLOBALS['config']['oembed']['endpoint'] = $this->old_ohembed; } /** - * Test with oohembed DISABLED. + * Test with ohembed DISABLED. * * @dataProvider discoverableSources */ public function testoEmbed($url, $expectedType) { - $GLOBALS['config']['oohembed']['endpoint'] = false; + $GLOBALS['config']['oembed']['endpoint'] = false; $this->_doTest($url, $expectedType); } @@ -39,14 +39,14 @@ class oEmbedTest extends PHPUnit_Framework_TestCase * * @dataProvider fallbackSources */ - public function testoohEmbed($url, $expectedType) + public function testnoEmbed($url, $expectedType) { - $GLOBALS['config']['oohembed']['endpoint'] = $this->_endpoint(); + $GLOBALS['config']['oembed']['endpoint'] = $this->_endpoint(); $this->_doTest($url, $expectedType); } /** - * Get default oohembed endpoint. + * Get default oembed endpoint. * * @return string */ @@ -55,7 +55,7 @@ class oEmbedTest extends PHPUnit_Framework_TestCase $default = array(); $_server = 'localhost'; $_path = ''; require INSTALLDIR . '/lib/default.php'; - return $default['oohembed']['endpoint']; + return $default['oembed']['endpoint']; } /** @@ -113,7 +113,6 @@ class oEmbedTest extends PHPUnit_Framework_TestCase static public function discoverableSources() { $sources = array( - array('http://identi.ca/attachment/34437400', 'photo'), array('http://www.youtube.com/watch?v=eUgLR232Cnw', 'video'), array('http://vimeo.com/9283184', 'video'), @@ -125,16 +124,20 @@ class oEmbedTest extends PHPUnit_Framework_TestCase } /** - * Sample oEmbed targets that can be found via oohembed.com. + * Sample oEmbed targets that can be found via noembed.com. * Includes also discoverableSources() output. * * @return array */ static public function fallbackSources() { + $sources = array( - array('http://en.wikipedia.org/wiki/File:Wiki.png', 'link'), // @fixme in future there may be a native provider -- will change to 'photo' + array('https://github.com/git/git/commit/85e9c7e1d42849c5c3084a9da748608468310c0e', 'Github Commit'), // @fixme in future there may be a native provider -- will change to 'photo' ); + + $sources = array(); + return array_merge(self::discoverableSources(), $sources); } } diff --git a/theme/README b/theme/README index 56a7a66c38..2e3c134bb6 100644 --- a/theme/README +++ b/theme/README @@ -1,41 +1,8 @@ -/** Howto: create a StatusNet theme - * - * @package StatusNet - * @author Sarven Capadisli - * @copyright 2010 StatusNet, Inc. - * @license http://creativecommons.org/licenses/by/3.0/ Creative Commons Attribution 3.0 unported - * @link http://status.net/ - */ +* To use a theme other than neo, add this to config.php: +$config['site']['theme'] = 'yourthemename'; -== Location of key paths and files == -
        
        -base/css/
        -base/css/display.css                #layout, typography rules
        -base/images/                        #common icons, illustrations
        -base/images/icons/icons-01.png      #main icons file (combined into a single file)
        -
        -default/css/
        -default/css/display.css             #imports the base stylesheet for layout and adds background images and colour rules
        -default/logo.png                    #default site logo for this theme
        -default/mobilelogo.png              #default logo for the mobile output
        -default/default-avatar-mini.png     #24x24 default avatar for minilists
        -default/default-avatar-stream.png   #48x48 default avatar for notice timelines
        -default/default-avatar-profile.png  #96x96 default avatar for the profile page
        -
        - -== How to create your own theme == - -You probably want to do one of the following: - -* If you just want to change the text, link, background, content, sidebar colours, background image: -** Do this from the Admin->Design settings (recommended!). You could also create a directory and a file structure like the default theme, search and replace with your own values. This is more work, but, you can do this if you plan to make additional *minimal* changes. - -* If you want to change the background images and colours: -# Create a directory and a file structure like the default theme. -# Have your stylesheet import base/css/display.css and add your own styles below. It is okay to add *minimal* changes here. - -* If you want to create a different layout, typography, background images and colours: -** Create your own theme directory (base or default) with stylesheets and images like. - -Finally, enable your theme by selecting it from the Admin->Design interface. You can set site's logo from here as well. +* To use/import the base theme, add this to your theme.ini file: +include=base +* To include an external CSS resource (e.g. for a webfont), add this to the top of your theme.ini file: +external[]="yourexternalURL" diff --git a/theme/base/css/display.css b/theme/base/css/display.css index 6ae14d2c7d..b73078295e 100644 --- a/theme/base/css/display.css +++ b/theme/base/css/display.css @@ -1,8 +1,8 @@ -/** theme: rebase +/** theme: base * * @package StatusNet * @author Samantha Doherty - * @copyright 2010 StatusNet, Inc. + * @copyright 2011 StatusNet, Inc. * @license http://creativecommons.org/licenses/by/3.0/ Creative Commons Attribution 3.0 Unported * @link http://status.net/ */ @@ -23,16 +23,14 @@ input, textarea, select, option {padding: 2px;} textarea {overflow:auto;} body { - background-color: #ffffff; + background-color: #f2f2f2; color: #000; - font-family: sans-serif; - font-size: 100%; - line-height: 1.4; - min-width: 700px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.6; } a { - color: #00008c; text-decoration: none; outline: none; } @@ -67,7 +65,7 @@ p { } input, textarea, select, option { - font-family: "DejaVu Sans", "Bitstream Vera Sans", Geneva, Verdana, sans-serif; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 1em; } @@ -82,63 +80,113 @@ option { } #wrap { - width: 92%; - margin-left: 4%; - margin-right: 4%; position: relative; + width: 960px; + margin: 0px auto; + background-color: #fff; + border-left: 10px solid #fff; + border-right: 10px solid #fff; + padding-top: 10px; } -#header { - padding: 1%; +#header { position: relative; + width: 960px; + padding: 0px } #core { - display:inline; - float: left; - position: relative; - margin-left: 1%; - margin-right: 1%; - width: 98%; + position: relative; + float: left; + clear: both; + margin: 0px; + width: 958px; + border-top: 5px solid #ccc; + border-left: 1px solid #ccc; + border-right: 1px solid #ccc; +} + +#aside_primary_wrapper { + width: 100%; + float: left; + overflow: hidden; + position: relative; + background-color: #f2f2f2; +} + +#content_wrapper { + width: 100%; + float: left; + position: relative; + right: 239px; + background-color: #fff; + border-right: 1px solid #ccc; +} + +#site_nav_local_views_wrapper { + width: 100%; + float: left; + position: relative; + right: 561px; + background-color: #f2f2f2; + border-right: 1px solid #ccc; +} + +#site_nav_local_views { + width: 138px; + float: left; + overflow: hidden; + position: relative; + left: 800px; + margin: 0px 0px 20px 0px; + padding: 22px 10px 40px 10px; } #content { - margin-bottom: 20px; + width: 520px; + float: left; + overflow: hidden; + position: relative; + left: 801px; + margin: 0px; + padding: 20px 20px 40px 20px; background-color: #fff; - display:inline; - float: left; - position: relative; - min-height: 300px; - width: 64.667%; - margin-right: 2%; } #aside_primary { - display: inline; - float: right; - position: relative; - width: 33.333%; - padding-top: 15px; - background: #f2f2f2; - margin-bottom: 20px; -} - -#aside_primary .section { - margin: 0px 2% 20px 2%; - position: relative; - width: 96%; + width: 218px; float: left; - clear: both; + overflow: hidden; + position: relative; + left: 802px; + padding: 22px 10px 40px 10px; + margin: 0px 0px 20px 0px; } -body[id$=adminpanel] #aside_primary { - display:none; +#footer { + clear: both; + position: relative; + width: 940px; + background-color: #ccc; + padding: 10px; } /* header elements */ -address { - margin-bottom: 10px; +address { + float: left; + position: relative; + margin: -2px 0 3px 0; + padding: 0px; + z-index: 99; +} + +address a, address img { + display: block; +} + +address img { + max-width: 158px; } address img + .fn { @@ -150,192 +198,165 @@ address .poweredby { width: auto; } -#site_nav_global_primary { - margin: 20px 0px 20px 0px; +#site_nav_global_primary { + display: block; + position: absolute; + top: 0; + right: 0; + width: 800px; + margin: 0px; + height: 24px; + line-height: 20px; } -#site_nav_global_primary dt { - display: none; +#site_nav_global_primary ul { + float: right; } #site_nav_global_primary li { display: inline; - margin-right: 20px; + margin-right: 10px; +} + +#site_nav_global_primary li:last-child { + margin-right: 0px; +} + +#header-search { + float: right; + position: relative; + top: -8px; + margin-left: 10px; } #site_notice { - padding: 1%; + float: right; + width: 300px; + margin: 26px 0px 4px 0px; + padding: 10px; background-color: #f2f2f2; - margin-bottom: 10px; } #site_notice p { margin-bottom: 0px; } -#site_notice ul { - margin-left: 15px; +/* input forms */ + +.input_forms { + float: left; + position: relative; + margin-bottom: 10px; + border-bottom: 1px dotted #ccc; } -#anon_notice { - padding: 1%; - background-color: #ccc; - margin-bottom: 10px; +#input_form_nav { + float: left; + width: 100%; + margin-bottom: 10px; + list-style-type: none; } -#anon_notice p { - margin-bottom: 0px; +#input_form_nav li { + display: inline; } -/* new notice & direct message forms */ +#input_form_nav li a { + margin-right: 10px; +} + +.input_form_nav_tab.current a { + text-decoration: underline; +} + +.input_form { + position: relative; + float: left; + width: 520px; + padding-bottom: 20px; + display: none; +} + +.input_form.current { + display: block; +} + +#input_form_status, #input_form_direct { + padding-bottom: 50px; +} .form_notice { - background: #ccc; margin-bottom: 10px; - padding: 1%; } .form_notice fieldset { - border: 0; - position: relative; - width: 620px; + width: auto; } .form_notice legend { display: none; -} +} + +.form_notice #notice_data-text-label { /* TODO can remove this now? */ + display: none; +} + +.form_notice_placeholder .placeholder { + width: 508px; + padding: 4px 4px 4px 6px; + border: 1px solid #a6a6a6; + z-index: 97; + font-size: 1em; + color: #888; +} .form_notice textarea { clear: left; float: left; - padding: 10px; - border: none; position: relative; - width: 485px; - height: 60px; - padding-bottom: 18px; - z-index: 9; + width: 483px; + height: 42px; + padding: 6px 5px 18px 5px; + border: 1px solid #a6a6a6; + z-index: 97; + font-size: 1.2em; } -.form_notice label[for=notice_data-text] { - float: left; - font-weight: normal; - font-size: 1.2em; - margin-bottom: 0.2em; - opacity: 1; - color: #333 !important; +#form_notice-direct.form_notice textarea { + width: 508px; } .form_notice label.notice_data-attach, .form_notice input.notice_data-attach { - position:absolute; - cursor:pointer; + position: absolute; + cursor: pointer; } .form_notice label.notice_data-attach { - top: 31px; - right: 88px; + top: 0px; + right: 0px; + z-index: 96; + text-indent: -9999px; + width: 16px; + height: 16px; } + .form_notice input.notice_data-attach { - /* Positioned inside the label */ top: 0; right: 0; -} - -.form_notice label.notice_data-attach { - text-indent:-9999px; - width:16px; - height:16px; -} - -.form_notice input.notice_data-attach { padding:0; height:16px; } -.form_notice .count { - position: absolute; - bottom: 0px; - right: 125px; - z-index: 9; - font-size: 0.8em; -} - -.form_notice .count dt { - display:none; -} - -.form_notice .count { - color: #777; -} - -.form_notice.warning .count { - color: #ff0000; -} - -.form_notice .submit { - padding:0; - position:absolute; - right:0; - top: 81px; - height: 2.4em; - width: 106px; -} - -.form_notice label[for=to] { - margin-top: 0px; - float: left; - font-size: 1.2em; - font-weight: normal; - color: #333 !important; -} - -.form_notice select[id=to] { - margin-bottom: 4px; - margin-top: -4px; - margin-left:18px; - float:left; - max-width:322px; -} - -.form_notice .error, -.form_notice .success, -.form_notice .notice-status { - clear: left; - float: left; - overflow: auto; - line-height: 1.2em; - padding: 2px 2px 2px 5px; - width: 498px; - border: 2px solid #ccc; - margin-left: -2px; -} - -.form_notice .attach-status code { - font-size: 1.2em; -} - -.form_notice .error { - border: none; - width: 502px; - padding: 6px 2px 6px 5px; -} - -.form_notice .attach-status button.close, -.form_notice .notice-status button.close { - float:right; - font-size:0.8em; -} - .form_notice .notice_data-geo_wrap label, .form_notice .notice_data-geo_wrap input { - position:absolute; - top: 55px; - right: 88px; - left:auto; - cursor:pointer; - width:16px; - height:16px; - display:block; + position: absolute; + top: 26px; + right: 0px; + cursor: pointer; + width: 16px; + height: 16px; + display: block; + z-index: 99; } .form_notice .notice_data-geo_wrap input { @@ -358,36 +379,231 @@ address .poweredby { } .form_notice input.notice_data-attach { - opacity:0; + opacity: 0; +} + +.form_notice .count { + position: absolute; + top: 50px; + right: 32px; + z-index: 99; + font-size: 0.8em; + height: 1em; + color: #777; +} + +.form_notice.warning .count { + color: #ff0000; +} + +#form_notice-direct.form_notice .count { + top: 84px; + right: 7px; +} + +.form_notice .error, +.form_notice .success, +.form_notice .notice-status { + position: relative; + overflow: auto; + line-height: 1.2em; + padding: 5px 5px 5px 10px; + margin: 10px 0px 0px 0px; + width: 478px; + border: 1px solid #ccc; +} + +.form_notice .error { + border: 1px solid #d05858; +} + +.form_notice .attach-status button.close, +.form_notice .notice-status button.close { + float:right; + font-size:0.8em; +} + +.input_form .form_settings fieldset { + margin: 0px; + padding: 0px; +} + +.input_form .form_settings fieldset fieldset { + width: 400px; + float: left; + background: none; + border: none; + margin-bottom: 0px; + padding: 0px; +} + +.input_form .form_settings .form_data li { + position: relative; + margin-bottom: 12px; +} + +.input_form fieldset fieldset label { + position: absolute; + top: 0; + left: 6px; + float: none; + text-align: left; + color: #888; + cursor: text; + background: #fff; +} + +.input_form .form_settings li input { + width: 388px; + margin-left: 0; + margin-right: 0; + padding: 4px 5px 4px 5px; + border: 1px solid #a6a6a6; + font-size: 1em; +} + +.input_form .form_settings li textarea { + width: 388px; + margin-left: 0; + padding: 4px 5px 4px 5px; + border: 1px solid #a6a6a6; + z-index: 97; + font-size: 1em; +} + +.input_form .form_settings .form_data p.form_guide { + margin-left: 5px; +} + +.form_notice label[for=to] { + float: left; +} + +.form_notice select[id=to] { + float:left; + margin: -4px 0px 10px 10px; + max-width: 450px; } .form_notice .to-selector { - clear:left; + clear: left; + padding-top: 15px; + z-index: 99; } -/* Local navigation */ +.form_settings label[for=notice_to] { + left: 5px; + margin-left: 0px; + margin-right: 10px; + position: relative; + clear: left; + background: none; +} -#site_nav_local_views { +.checkbox-wrapper { + padding: 2px; + margin-left: 10px; +} + +.form_notice .checkbox-wrapper { + display: inline; + margin-left: 10px; +} + +.form_settings .checkbox-wrapper label.checkbox { + margin-left: 0px; + margin-top: 6px; + line-height: 1.2em; + left: -3px; + float: none; +} + +.checkbox-wrapper #notice_private { + display:none; +} + +.checkbox-wrapper.unchecked label.checkbox { + padding-left: 20px; + background: url(../images/icons/lock_open.png) no-repeat 0px 0px; + opacity: 0.6; +} + +.checkbox-wrapper.unchecked label.checkbox:hover { + opacity: 1; + cursor: pointer; +} + +.checkbox-wrapper.checked label.checkbox { + padding-left: 20px; + background: url(../images/icons/lock.png) no-repeat 0px 0px; + color: red; + opacity: 1; +} + +.checkbox-wrapper.checked label.checkbox:hover { + cursor: pointer; +} + +.form_notice input.submit { + position: absolute; + top: 100%; + left: 0px; + margin-top: -49px; + float: left; + width: 100px; + padding: 0px; + z-index: 99; +} + +.input_form .form_settings .submit { + position: relative; + top: 0; + right: 0; + float: right; + width: 100px; + height: 26px; + line-height: 26px; + padding: 0px 10px; + margin: 0px; + z-index: 1; +} + +/* site nav local views */ + + +#site_nav_local_views li { + display: block; + margin: 0px 0px 8px 0px; +} + +#site_nav_local_views li ul { margin-bottom: 20px; } -#site_nav_local_views dt { - display: none; -} - -#site_nav_local_views li { - display: inline; - margin-right: 20px; +#site_nav_local_views a { + word-wrap: break-word; } #site_nav_local_views .current a { text-decoration: underline; } + +/* aside primary */ + +#aside_primary .section { + position: relative; + float: left; + clear: both; + width: 100%; + margin-bottom: 20px; +} + + /* notices */ #notices_primary { - padding-top: 8px; + padding-top: 3px; clear: both; } @@ -397,10 +613,10 @@ address .poweredby { .notice { list-style-type: none; - margin-bottom: 25px; + margin-bottom: 10px; clear: left; - min-height: 54px; padding-bottom: 2px; + line-height: 1.36em; } .notice, .profile, .application, #content .peopletag { @@ -418,8 +634,8 @@ address .poweredby { content: '\25B8'; } -.notice .addressees:empty:before { - content: none; +.notice .addressees .group { + font-style: italic; } .fn { @@ -438,13 +654,14 @@ address .poweredby { #content .notice .author .photo { position: absolute; - top: 4px; - left: 4px; + top: 7px; + left: 0px; float: none; } #content .notice .entry-title { margin: 2px 7px 0px 59px; + min-height: 35px; } .vcard .url { @@ -471,24 +688,27 @@ font-style:italic; display:none; } +#remoteprofile .notice .entry-title, #remoteprofile .notice div.entry-content, #showstream .notice .entry-title, #showstream .notice div.entry-content { margin-left: 0; } +#remoteprofile .notice .entry-title, +#showstream .notice .entry-title { + min-height: 1px; +} + +#remoteprofile #content .notice .author, #showstream #content .notice .author { display: none; } +#remoteprofile .notice, #showstream .notice { min-height: 1em; } -#shownotice .vcard .photo { - margin-bottom: 4px; -} - #shownotice .notice .entry-title { - margin-left:110px; font-size:2.2em; min-height:123px; font-size: 1.6em; @@ -526,6 +746,7 @@ left:0; float: right; margin-top: 12px; margin-right: -6px; + margin-bottom: 10px; } .notice-options fieldset { @@ -613,7 +834,7 @@ clear:both; #jOverlayContent, #jOverlayContent #content, -#jOverlayContent #content_inner { +#jOverlayContent #content_inner { /* TODO can remove this now? */ width: auto !important; margin-bottom:0; } @@ -658,24 +879,148 @@ font-weight:bold; content: ":"; } -#content .notice .notice { - width: 98%; - margin-left: 2%; - margin-top: 16px; +/* threaded replies */ + +.threaded-replies { + clear: both; + float: left; + width: 458px; + margin-left: 59px; + margin-top: 10px; margin-bottom: 10px; + padding-right: 2px; + border-left: 3px solid #ECECF2; + background: #fafafa; + color: #222; + font-size: 1em; } -.notice .notice { -background-color:rgba(200, 200, 200, 0.050); +.threaded-replies:empty { + margin-bottom: 0px; } -.notice .notice .notice { -background-color:rgba(200, 200, 200, 0.100); + +.user_in .threaded-replies { + margin-top: 0px; } -.notice .notice .notice .notice { -background-color:rgba(200, 200, 200, 0.150); + +#content .notice .threaded-replies .notice, +#content .notice .threaded-replies .notice-data { + width: 440px; + padding-bottom: 14px; + padding-top: 5px; + border-bottom: 2px dotted #eee; + line-height: 1.36em; + margin-top: 0px; + margin-bottom: 0px; + margin-left: 10px; + background: none; } -.notice .notice .notice .notice .notice { -background-color:rgba(200, 200, 200, 0.300); + +#content .notice .threaded-replies .entry-title { + min-height: 1px; +} + +#content .threaded-replies .notice .author .photo { + height: 24px; + width: 24px; + top: 12px; +} + +#content .notice .threaded-replies .notice .entry-title { + margin: 2px 7px 0px 35px; +} + +#content .notice .threaded-replies .notice div.entry-content { + clear:left; + float:left; + margin-left: 35px; + margin-top: 6px !important; +} + +#content .notice .threaded-replies .notice div.entry-content.notice-faves { + margin-top: 2px !important; +} + +#content .notice .threaded-replies .notice .notice-options { + margin-top: 5px; + margin-bottom: 0px; +} + +.threaded-replies li { + list-style-type: none; +} + +.threaded-replies .notice-reply-comments { + margin: 2px 0px 4px 10px; +} + +.threaded-replies .placeholder { + margin: 10px; + width: 426px; + padding: 4px 4px 4px 6px; + border: 1px solid #a6a6a6; + color: #888; +} + +.threaded-replies .notice-reply { + clear: left; + position: relative; + padding: 10px; + padding-bottom: 44px; +} + +.threaded-replies .form_notice textarea { + width: 395px; +} + +.threaded-replies .form_notice label.notice_data-attach { + top: 10px; + right: 10px; +} + +.threaded-replies .form_notice .notice_data-geo_wrap label, +.threaded-replies .form_notice .notice_data-geo_wrap input { + top: 36px; + right: 10px; +} + +.threaded-replies .form_notice .count { + top: 60px; + right: 50px; +} + +.threaded-replies .form_notice #notice_action-submit { + left: 10px; + margin-top: -44px; +} + +.threaded-replies .form_notice .error, +.threaded-replies .form_notice .success, +.threaded-replies .form_notice .notice-status { + width: 390px; +} + +.threaded-replies .to-selector { + display: none; +} + +/* old school conversation style */ + +#conversation .notices .notices { + float: left; + background-color:rgba(200, 200, 200, 0.050); + margin-left: 15px; + width: auto; +} + +#conversation .notices .threaded-replies { + margin-left: 59px; + background: #fafafa; +} + +#conversation .notices .notices .notices .notices .notices .notices .notices .notices .notices .notices .notices .notices .notices { + background: none; + margin-left: 0px; } /* aside primary specific styles */ @@ -829,23 +1174,14 @@ display:none; /* secondary elements */ -.processing { -background-image:url(../../base/images/icons/icon_processing.gif); -background-repeat:no-repeat; -background-position:47% 47%; -} - -.error { +.error, .success, .notice-status { background-color: #F7E8E8; + padding: 4px 10px; } -.success { +.success, .notice-status { background-color: #f2f2f2; } -.system_notice dt { - display:none; -} - #page_notice { clear:both; margin-bottom:18px; @@ -934,14 +1270,6 @@ padding-left:4px; margin-bottom:0; } -#wrap form.processing input.submit, -.entity_actions a.processing, -.dialogbox.processing .submit_dialogbox { -cursor:wait; -outline:none; -text-indent:-9999px; -} - #pagination { background-color: #f2f2f2; clear: left; @@ -962,14 +1290,17 @@ text-indent:-9999px; float: right; } -#footer { - clear: both; - background-color: #ccc; - margin-left: 1%; - margin-right: 1%; - padding: 1%; +#wrap form.processing input.submit, +#wrap a.processing, +.dialogbox.processing .submit_dialogbox { + background: url(../images/icons/icon_processing.gif) no-repeat 47% 47%; + cursor: wait; + outline: none; + text-indent: -9999px; } +/* footer elements */ + #site_nav_global_secondary dt { display: none; } @@ -1036,6 +1367,7 @@ margin-left:11px; .form_settings .form_data li { width:100%; float:left; + margin-bottom: 22px; } .form_settings .form_data label { float:left; @@ -1046,6 +1378,12 @@ float:left; margin-left:1.795%; float:left; } + +.form_settings .form_data select { + margin-top: 0px; +} + + .form_settings .form_data input { width:39%; } @@ -1064,12 +1402,36 @@ margin-left:0; .form_settings label { margin-top:2px; -width:24%; + width: 25%; text-align: right; } +.form_settings input.checkbox, .form_settings input.radio { + margin-left: 25%; + margin-top: 3px; + position: relative; + left: -14px; +} + +.form_settings label.checkbox, .form_settings label.radio { + width: auto; + max-width: 60%; + position: relative; + left: -25px; +} + .form_settings label.checkbox { text-align: left; + line-height: 1.2em; +} + +.form_settings label.radio { + text-align: left; + margin: 0px; +} + +.form_settings li input.radio { + clear: left; } .form_actions label { @@ -1123,50 +1485,24 @@ width:50px; .form_settings .form_data p.form_guide { clear:both; -margin-left:26%; + margin-left: 27%; margin-bottom:0; + line-height: 1.2em; + padding-top: 4px; } .form_settings p { margin-bottom:11px; } -.form_settings input.checkbox, -.form_settings input.radio { -margin-top:3px; -margin-left:0; -} -.form_settings label.checkbox { -font-weight:normal; -margin-top:0; -margin-right:0; -margin-left:11px; -float:left; -width:90%; -} -.form_settings label.radio { -margin-top:0; -margin-right:47px; -margin-left:11px; -width:auto; -} - -#form_login p.form_guide, -#form_register #settings_rememberme p.form_guide, -#form_openid_login #settings_rememberme p.form_guide, -#settings_twitter_remove p.form_guide, -#form_search ul.form_data #q, -#design_background-image_onoff p.form_guide { -margin-left:0; -} - .form_settings .form_note { -border-radius:4px; --moz-border-radius:4px; --webkit-border-radius:4px; padding:0 7px; } +.form_settings .form_response { + margin-top: 10px; +} + .form_settings input { margin-right: 20px; } @@ -1187,47 +1523,25 @@ content:'☠'; font-size:150%; } -/* override OStatus plugin style */ +#content .notice-source-activity div.entry-title, .notice-source-activity div.entry-content { + margin-left: 0; +} -#form_ostatus_connect.form_settings.dialogbox, #form_ostatus_sub.dialogbox { - width: 76%; +#content .notice-source-activity div.entry-title { + font-style: italic; + min-height: 0; } -#form_ostatus_connect.form_settings.dialogbox legend { - font-size: 1.4em; - font-weight: normal; - padding-bottom: 10px; +#content .notice-source-activity .notice div.entry-title { + font-style: normal; } -#form_ostatus_connect.dialogbox .form_data label, -#form_ostatus_sub.dialogbox .form_data label { - font-weight: normal; - font-size: 1.2em; - width:34%; -} - -#form_ostatus_connect.dialogbox .form_data input, -#form_ostatus_sub.dialogbox .form_data input { - float: right; - width: 52% !important; -} - -#form_ostatus_connect.dialogbox .form_data .form_guide, -#form_ostatus_sub.dialogbox .form_data .form_guide { - background: none !important; +span.rtl { + display: block; + direction: rtl; text-align: right; - margin-right: 16px; -} - -.section .entity_actions { - margin-right: 0px !important; -} - -.section .entity_remote_subscribe { - color:#000 !important; - padding-left: 26px !important; - background-position: 4px -1183px !important; -} + float: right; +} #filter_tags ul li, .entity_send-a-message .form_notice, @@ -1243,7 +1557,7 @@ background:none; } .form_settings .form_note { -background-color:#9BB43E; + background-color: #d1f7cb; } #form_settings_photo .form_data { @@ -1429,11 +1743,6 @@ display:block; text-align:left; width:100%; } -.entity_actions a { -text-decoration:none; -font-weight:bold; -display:block; -} .entity_actions a, .entity_actions input, .entity_actions p { color: #333 !important; @@ -1442,6 +1751,8 @@ display:block; } .entity_actions a { +text-decoration:none; +display:block; padding: 3px 4px 4px 28px; } @@ -1669,6 +1980,12 @@ display:block; width:auto; } +.profile_block .group_aliases .group_alias { + display:inline; + list-style-type: none; + font-style: italic; +} + .profile_block .entity_tags dt { display: inline; margin-right: 3px; @@ -1808,14 +2125,37 @@ max-height:96px; margin-right:18px; float:left; } + +.oauth-desktop-mode #wrap { + min-width: 500px; +} + +.oauth-desktop-mode #content { + width: 480px; + padding: 6px; + margin: 4px 0px 0px 4px; + border-top-left-radius: 7px; + -moz-border-radius-topleft: 7px; + -webkit-border-top-left-radius: 7px; +} + +.oauth-desktop-mode fieldset { + margin-bottom: 10px !important; +} + +#oauth_pin { + text-align: center; + font-size: 3em; +} + #showapplication .entity_profile { width:68%; } #showapplication .entity_profile .entity_fn { margin-left:0; } -#showapplication .entity_profile .entity_fn .fn:before, -#showapplication .entity_profile .entity_fn .fn:after { +#showapplication .entity_profile .fn:before, +#showapplication .entity_profile .fn:after { content:''; } #showapplication .entity_data { @@ -1825,16 +2165,10 @@ margin-bottom:18px; #showapplication .entity_data h2 { display:none; } -#showapplication .entity_data dl { -margin-bottom:18px; -} -#showapplication .entity_data dt { -font-weight:bold; -} #showapplication .entity_data dd { -margin-left:1.795%; font-family:monospace; font-size:1.3em; + margin-bottom: 10px; } .form_data #application_types label.radio, .form_data #default_access_types label.radio { @@ -2013,6 +2347,13 @@ background-position:0 -64px; #export_data li a.foaf { background-position:0 1px; } + +#export_data li a.json { +background-image:url(../images/icons/activitystreams.png); +background-repeat:no-repeat; +background-color:transparent; +} + .form_group_leave input.submit, .form_user_unsubscribe input.submit, .form_user_remove_peopletag input.submit, @@ -2173,25 +2514,7 @@ margin-bottom:18px; padding-left:20px; } -#input_form_nav { - list-style-type: none; -} -#input_form_nav li { - display:inline; -} - -.input_form_nav_tab.current { - text-decoration: underline; -} - -.input_form { - display: none; -} - -.input_form.current { - display: block; -} .entity_tags li.mode-private { color: #829D25; @@ -2226,6 +2549,15 @@ float:right; display:none; } +#site_nav_local_views li.extended_menu a { + display:none; +} + +.profile_block_otherprofile_list li { + display: inline; + list-style-type: none; +} + /*end of @media screen, projection, tv*/ diff --git a/theme/base/css/ie.css b/theme/base/css/ie.css index a1144b489b..7f0265129b 100644 --- a/theme/base/css/ie.css +++ b/theme/base/css/ie.css @@ -10,13 +10,11 @@ top:0; } .threaded-replies .form_notice textarea { - width: 385px; + width: 395px; } .form_notice .form_note + label { position:absolute; -top:25px; -left:83%; text-indent:-9999px; height:16px; width:16px; @@ -52,10 +50,6 @@ display:block; width: 468px; } -.threaded-replies .form_notice textarea { - width: 395px; -} - .notice-options input.submit { font-size:0; text-align:right; @@ -99,22 +93,6 @@ line-height:auto; filter: alpha(opacity=0); } -/* IE7 */ - -*+html .input_forms { - margin-bottom: -20px; -} - -/* IE6 */ - -#content { - _width: 520px; -} - -#aside_primary { - _width: 190px; -} - -#content h1 { - _clear: left; +.notice .addressees:before { + content: '\003E'; } diff --git a/theme/base/css/ie6.css b/theme/base/css/ie6.css index 1784677d08..c4a87a6631 100644 --- a/theme/base/css/ie6.css +++ b/theme/base/css/ie6.css @@ -1,30 +1,30 @@ -/** - * @package StatusNet - * @author Sarven Capadisli - * @copyright 2009-2010 StatusNet, Inc. - * @license http://creativecommons.org/licenses/by/3.0/ Creative Commons Attribution 3.0 Unported - * @link http://status.net/ - */ -/* IE6 specific styles */ -address { -margin-left:7px; -} -address .fn { -display:none; -} - -#wrap { -width:1003px; -margin:0 auto; -} +/* LTE IE6 styles */ #content { -width:66%; + width: 520px; } + #aside_primary { -padding:1.8%; -width:24%; + width: 220px; } + +#content h1 { + clear: left; +} + +address .fn { + display: none; +} + +#header-search { + width: 240px; +} + +#header-search input { + height: 20px; + font-size: 12px; +} + .entity_profile .entity_nickname, .entity_profile .entity_location, .entity_profile .entity_url, @@ -38,10 +38,23 @@ margin-bottom:123px; .entity_actions { width:20%; } + .notice div.entry-content { -width:65%; -margin-left:30px; + margin-left: 30px; } + +.notice-source-activity div.entry-content { + margin-left: 0; +} + +.threaded-replies { + margin-left: 30px; +} + +#content .notice .threaded-replies .notice div.entry-content { + margin-left: 18px; +} + .notice-options a { width:16px; } diff --git a/theme/base/css/ie7.css b/theme/base/css/ie7.css new file mode 100644 index 0000000000..a4e8a612b3 --- /dev/null +++ b/theme/base/css/ie7.css @@ -0,0 +1,22 @@ +/* LTE IE7 styles */ + +#core { + margin-top: 3px; +} + +#header-search input[type="submit"] { + padding-left: 20px; +} + +.input_forms { + margin-bottom: -20px; +} + +.notice .addressees { + background: url(../images/icons/arrow_right.png) no-repeat top left; + padding-left: 16px; +} + +#content .notice .threaded-replies .notice-data { + margin-left: 0px; +} diff --git a/theme/base/css/mp-screen.css b/theme/base/css/mp-screen.css deleted file mode 100644 index c9fb6dcc4f..0000000000 --- a/theme/base/css/mp-screen.css +++ /dev/null @@ -1,7 +0,0 @@ -/* just a placeholder for now */ - -address img + .fn { -display:block; -margin-top:1em; -float:left; -} diff --git a/theme/base/css/rtl.css b/theme/base/css/rtl.css new file mode 100644 index 0000000000..a9b6e593cd --- /dev/null +++ b/theme/base/css/rtl.css @@ -0,0 +1 @@ +/* placeholder for RTL style */ diff --git a/theme/base/default-avatar-mini.png b/theme/base/default-avatar-mini.png index 7c9fc0348b..3f3f026ab7 100644 Binary files a/theme/base/default-avatar-mini.png and b/theme/base/default-avatar-mini.png differ diff --git a/theme/base/default-avatar-profile.png b/theme/base/default-avatar-profile.png index e8f87006a0..f9addc06b4 100644 Binary files a/theme/base/default-avatar-profile.png and b/theme/base/default-avatar-profile.png differ diff --git a/theme/base/default-avatar-stream.png b/theme/base/default-avatar-stream.png index c8148e42ef..e542854e77 100644 Binary files a/theme/base/default-avatar-stream.png and b/theme/base/default-avatar-stream.png differ diff --git a/theme/base/images/icons/README b/theme/base/images/icons/README index f701959ca0..d124671da1 100644 --- a/theme/base/images/icons/README +++ b/theme/base/images/icons/README @@ -57,3 +57,4 @@ Created by various authors * Atom feed icon from http://intertwingly.net/wiki/pie/Icon with Public Domain license * RSS feed icon from http://www.feedicons.com/ (Mozilla, Microsoft, Matt Brett) with MPL/GPL/LGPL tri-license * Processing icon from/by Unknown with Unknown license //FIXME +* lock and lock_open icons by Mark James http://www.famfamfam.com/lab/icons/silk/ (Creative Commons Attribution 2.5 License) diff --git a/theme/base/images/icons/activitystreams.png b/theme/base/images/icons/activitystreams.png new file mode 100644 index 0000000000..dfb3269365 Binary files /dev/null and b/theme/base/images/icons/activitystreams.png differ diff --git a/theme/base/images/icons/arrow_right.png b/theme/base/images/icons/arrow_right.png new file mode 100644 index 0000000000..7f48cec57e Binary files /dev/null and b/theme/base/images/icons/arrow_right.png differ diff --git a/theme/base/images/icons/lock.png b/theme/base/images/icons/lock.png new file mode 100644 index 0000000000..2ebc4f6f96 Binary files /dev/null and b/theme/base/images/icons/lock.png differ diff --git a/theme/base/images/icons/lock_open.png b/theme/base/images/icons/lock_open.png new file mode 100644 index 0000000000..a471765ff1 Binary files /dev/null and b/theme/base/images/icons/lock_open.png differ diff --git a/theme/base/logo.png b/theme/base/logo.png index b078601019..3891979530 100644 Binary files a/theme/base/logo.png and b/theme/base/logo.png differ diff --git a/theme/base/mobilelogo.png b/theme/base/mobilelogo.png index 66bb5f6787..cd2e0e7f16 100644 Binary files a/theme/base/mobilelogo.png and b/theme/base/mobilelogo.png differ diff --git a/theme/neo-blue/css/display.css b/theme/neo-blue/css/display.css new file mode 100644 index 0000000000..f5163fcdf1 --- /dev/null +++ b/theme/neo-blue/css/display.css @@ -0,0 +1,73 @@ +/** theme: neo-blue + * + * @package StatusNet + * @author Samantha Doherty + * @copyright 2011 StatusNet, Inc. + * @license http://creativecommons.org/licenses/by/3.0/ Creative Commons Attribution 3.0 Unported + * @link http://status.net/ + */ + +@media screen, projection, tv { + +body { + background: #7e89a4; +} + +#wrap { + border: none; + padding: 0px 10px; + box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.7); + -moz-box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.7); + -webkit-box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.7); + background: #fff; +} + +#header { + padding-top: 7px; +} + +#site_nav_global_primary { + top: 0px; + right: -14px; + padding-top: 5px; + height: 30px; + width: 986px; + box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.7); + -moz-box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.7); + -webkit-box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.7); + -webkit-border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; + border-bottom-right-radius: 4px; + z-index: 98; + border-bottom: 1px solid #fff; + border-left: 1px solid #516499; + border-right: 1px solid #516499; +} + +#site_nav_global_primary a:hover { + background: #4c619c; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +#site_notice { + margin: 45px 0px 0px 0px; + background-color: #f2f2f2; /* XXX */ +} + +#core { + border-top: none; + margin-top: 3px; +} + +.input_forms { + background-color: #fff; + left: 0px; + padding: 18px 0px 0px 0px; +} + +}/*end of @media screen, projection, tv*/ diff --git a/theme/neo-blue/css/mp-screen.css b/theme/neo-blue/css/mp-screen.css new file mode 100644 index 0000000000..670843adcf --- /dev/null +++ b/theme/neo-blue/css/mp-screen.css @@ -0,0 +1,129 @@ +address img { + background: none !important; +} + +/* copy of mp-screen.css from neo theme */ + +body { + background-image: none; + min-width: 0; +} + +#header { + padding: 0; +} + +#site_nav_global_primary { + top: 0; + -webkit-border-top-right-radius: 0px; + -moz-border-radius-topright: 0px; + border-top-right-radius: 0px; + line-height: 16px; +} + +#site_nav_global_primary li { + float: left; + margin-right: 8px; +} + +#site_nav_local_views { + line-height: 2em; +} + +#site_nav_local_views h3 { + color: #333; + background: none; + text-transform: none; + letter-spacing: 0; + padding-bottom: 0; +} + +#site_nav_local_views li li { + margin: 0 6px 6px 0; +} + +#login #site_nav_local_views li, #register #site_nav_local_views li, #openidlogin #site_nav_local_views li { + margin: 0 6px 6px 0; +} + +#site_nav_local_views a { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.5);; + background: #364a84; + background: -moz-linear-gradient(top, #7b8dbb , #364a84); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#7b8dbb), color-stop(100%,#364a84)); + font-size: 0.9em; + width: auto; +} + +#site_nav_local_views a:hover { + background: #7b8dbb; + background: -moz-linear-gradient(top, #364a84 , #7b8dbb); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#364a84), color-stop(100%,#7b8dbb)); +} + +.input_forms { + top: -10px; + padding-right: 0; +} + +#input_form_nav li a { + padding: 0px 4px 1px 4px; +} + +.form_notice .count { + top: 44px; + left: 276px; +} + +#form_notice-direct.form_notice .count { + top: 74px; + left: 276px; +} + +#event-startdate, #event-starttime, #event-enddate, #event-endtime { + width: 120px; + margin-right: 12px; +} + +.input_form .form_settings .submit { + font-size: 1em; +} + +.form_notice input.submit { + font-size: 1em; +} + +.question div.question-description { + max-width: 100% !important; +} + +ul.qna-dummy { + width: 80%; +} + +.qna-dummy-placeholder input { + width: 92%; +} + +.question #qna-answer, .qna-full-question #qna-answer { + width: 220px; +} + +.threaded-replies #answer-form fieldset { + width: 220px; +} + +.threaded-replies #qna-answer-submit { + float: left; + clear: left; + position: relative; + top: 0; + bottom: 0px; + left: 0; + margin-top: 10px; +} + +a.company_logo { + display: none !important; +} diff --git a/theme/neo-blue/default-avatar-mini.png b/theme/neo-blue/default-avatar-mini.png new file mode 100644 index 0000000000..3f3f026ab7 Binary files /dev/null and b/theme/neo-blue/default-avatar-mini.png differ diff --git a/theme/neo-blue/default-avatar-profile.png b/theme/neo-blue/default-avatar-profile.png new file mode 100644 index 0000000000..f9addc06b4 Binary files /dev/null and b/theme/neo-blue/default-avatar-profile.png differ diff --git a/theme/neo-blue/default-avatar-stream.png b/theme/neo-blue/default-avatar-stream.png new file mode 100644 index 0000000000..e542854e77 Binary files /dev/null and b/theme/neo-blue/default-avatar-stream.png differ diff --git a/theme/neo-blue/logo.png b/theme/neo-blue/logo.png new file mode 100644 index 0000000000..5bf1063683 Binary files /dev/null and b/theme/neo-blue/logo.png differ diff --git a/theme/neo-blue/mobilelogo.png b/theme/neo-blue/mobilelogo.png new file mode 100644 index 0000000000..c72b6ac0ab Binary files /dev/null and b/theme/neo-blue/mobilelogo.png differ diff --git a/theme/neo-blue/theme.ini b/theme/neo-blue/theme.ini new file mode 100644 index 0000000000..8bdec29d25 --- /dev/null +++ b/theme/neo-blue/theme.ini @@ -0,0 +1 @@ +include=neo diff --git a/theme/neo-light/css/display.css b/theme/neo-light/css/display.css new file mode 100644 index 0000000000..624797f6f8 --- /dev/null +++ b/theme/neo-light/css/display.css @@ -0,0 +1,44 @@ +/** theme: neo-light + * + * @package StatusNet + * @author Samantha Doherty + * @copyright 2011 StatusNet, Inc. + * @license http://creativecommons.org/licenses/by/3.0/ Creative Commons Attribution 3.0 Unported + * @link http://status.net/ + */ + +@media screen, projection, tv { + +body { + background: #f0f2f5; +} + +#wrap { + background-color: #f0f2f5; + border: none; +} + +#aside_primary_wrapper { + background-color: #fafafa; +} + +#content_wrapper { + border-right: 1px solid #fff; +} + +#site_nav_local_views_wrapper { + background-color: #fafafa; + border-right: 1px solid #fff; +} + +#site_notice { + background: #fff; +} + +.input_forms { + background-color: #fff; + left: 0px; + padding: 18px 0px 0px 0px; +} + +}/*end of @media screen, projection, tv*/ diff --git a/theme/neo-light/css/mp-screen.css b/theme/neo-light/css/mp-screen.css new file mode 100644 index 0000000000..ba305c47ad --- /dev/null +++ b/theme/neo-light/css/mp-screen.css @@ -0,0 +1,125 @@ +/* copy of mp-screen.css from neo theme */ + +body { + background-image: none; + min-width: 0; +} + +#header { + padding: 0; +} + +#site_nav_global_primary { + top: 0; + -webkit-border-top-right-radius: 0px; + -moz-border-radius-topright: 0px; + border-top-right-radius: 0px; + line-height: 16px; +} + +#site_nav_global_primary li { + float: left; + margin-right: 8px; +} + +#site_nav_local_views { + line-height: 2em; +} + +#site_nav_local_views h3 { + color: #333; + background: none; + text-transform: none; + letter-spacing: 0; + padding-bottom: 0; +} + +#site_nav_local_views li li { + margin: 0 6px 6px 0; +} + +#login #site_nav_local_views li, #register #site_nav_local_views li, #openidlogin #site_nav_local_views li { + margin: 0 6px 6px 0; +} + +#site_nav_local_views a { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.5);; + background: #364a84; + background: -moz-linear-gradient(top, #7b8dbb , #364a84); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#7b8dbb), color-stop(100%,#364a84)); + font-size: 0.9em; + width: auto; +} + +#site_nav_local_views a:hover { + background: #7b8dbb; + background: -moz-linear-gradient(top, #364a84 , #7b8dbb); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#364a84), color-stop(100%,#7b8dbb)); +} + +.input_forms { + top: -10px; + padding-right: 0; +} + +#input_form_nav li a { + padding: 0px 4px 1px 4px; +} + +.form_notice .count { + top: 44px; + left: 276px; +} + +#form_notice-direct.form_notice .count { + top: 74px; + left: 276px; +} + +#event-startdate, #event-starttime, #event-enddate, #event-endtime { + width: 120px; + margin-right: 12px; +} + +.input_form .form_settings .submit { + font-size: 1em; +} + +.form_notice input.submit { + font-size: 1em; +} + +.question div.question-description { + max-width: 100% !important; +} + +ul.qna-dummy { + width: 80%; +} + +.qna-dummy-placeholder input { + width: 92%; +} + +.question #qna-answer, .qna-full-question #qna-answer { + width: 220px; +} + +.threaded-replies #answer-form fieldset { + width: 220px; +} + +.threaded-replies #qna-answer-submit { + float: left; + clear: left; + position: relative; + top: 0; + bottom: 0px; + left: 0; + margin-top: 10px; +} + +a.company_logo { + display: none !important; +} diff --git a/theme/neo-light/default-avatar-mini.png b/theme/neo-light/default-avatar-mini.png new file mode 100644 index 0000000000..3f3f026ab7 Binary files /dev/null and b/theme/neo-light/default-avatar-mini.png differ diff --git a/theme/neo-light/default-avatar-profile.png b/theme/neo-light/default-avatar-profile.png new file mode 100644 index 0000000000..f9addc06b4 Binary files /dev/null and b/theme/neo-light/default-avatar-profile.png differ diff --git a/theme/neo-light/default-avatar-stream.png b/theme/neo-light/default-avatar-stream.png new file mode 100644 index 0000000000..e542854e77 Binary files /dev/null and b/theme/neo-light/default-avatar-stream.png differ diff --git a/theme/neo-light/logo.png b/theme/neo-light/logo.png new file mode 100644 index 0000000000..3891979530 Binary files /dev/null and b/theme/neo-light/logo.png differ diff --git a/theme/neo-light/mobilelogo.png b/theme/neo-light/mobilelogo.png new file mode 100644 index 0000000000..cd2e0e7f16 Binary files /dev/null and b/theme/neo-light/mobilelogo.png differ diff --git a/theme/neo-light/theme.ini b/theme/neo-light/theme.ini new file mode 100644 index 0000000000..8bdec29d25 --- /dev/null +++ b/theme/neo-light/theme.ini @@ -0,0 +1 @@ +include=neo diff --git a/theme/neo/README b/theme/neo/README index 9e001123cb..eff8cd6dfa 100644 --- a/theme/neo/README +++ b/theme/neo/README @@ -1,7 +1,7 @@ Default avatars are modified from an image by Francesco 'Architetto' Rollandin. http://www.openclipart.org/detail/34957 -Icons by Mark James +Some icons by Mark James http://www.famfamfam.com/lab/icons/silk/ http://creativecommons.org/licenses/by/2.5/ Creative Commons Attribution 2.5 License diff --git a/theme/neo/css/display.css b/theme/neo/css/display.css index a0df1e9cb4..e8ef88fd94 100644 --- a/theme/neo/css/display.css +++ b/theme/neo/css/display.css @@ -30,18 +30,17 @@ @media screen, projection, tv { +/* general styles and layout */ + body { background-color: #C6C8CC; background-image: url(../images/bg.png); font-family: 'Lato', "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.6; color: #222; } input, textarea, select, option { font-family: 'Lato', "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 1em; } a {color: #3e3e8c;} @@ -57,52 +56,57 @@ h5 {font-size: 1.2em;} h6 {font-size: 1em;} #wrap { - width: 960px; - margin: 0px auto; background: #fff url('../images/brdr_black_dot.png') repeat-x 0px 10px; - border-left: 10px solid #fff; - border-right: 10px solid #fff; - padding-top: 10px; } #header { - width: 960px; - padding: 0px; padding-top: 12px; } -address { - float: left; - position: relative; - top: 1px; - left: 2px; - margin: 0px; - padding: 0px; - height: 24px; - width: 148px; - z-index: 99; +#core { + border-top: 5px solid #FB6104; + border-left: 1px solid #d8dae6; + border-right: 1px solid #d8dae6; } +#aside_primary_wrapper { + background-color: #ececf2; +} + +#content_wrapper { + border-right: 1px solid #d8dae6; +} + +#site_nav_local_views_wrapper { + background-color: #ececf2; + border-right: 1px solid #d8dae6; +} + +#footer { + top: -6px; + -webkit-border-top-left-radius: 6px; + -webkit-border-top-right-radius: 6px; + -moz-border-radius-topleft: 6px; + -moz-border-radius-topright: 6px; + border-top-left-radius: 6px; + border-top-right-radius: 6px; +} + +/* header elements */ + #site_nav_global_primary { - display: block; - position: absolute; top: 10px; - right: 0; - width: 800px; - margin: 0px; - height: 24px; - line-height: 20px; -webkit-border-top-right-radius: 6px; -moz-border-radius-topright: 6px; border-top-right-radius: 6px; background: #364A84; - background: -moz-linear-gradient(top, #516499 , #364a84); + background: -moz-linear-gradient(top, #516499 0%, #364a84 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#516499), color-stop(100%,#364a84)); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#516499', endColorstr='#364a84',GradientType=0 ); /* XXX move all to ie.css */ -} - -#site_nav_global_primary ul { - float: right; + background: -webkit-linear-gradient(top, #516499 0%,#364a84 100%); + background: -o-linear-gradient(top, #516499 0%,#364a84 100%); + background: -ms-linear-gradient(top, #516499 0%,#364a84 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#516499', endColorstr='#364a84',GradientType=0 ); + background: linear-gradient(top, #516499 0%,#364a84 100%); } #site_nav_global_primary li { @@ -114,12 +118,12 @@ address { } #site_nav_global_primary a { - color: #fff !important; - text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.5); padding: 2px 10px 2px 10px; height: 20px; display: block; float: left; + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.5); } #site_nav_global_primary a:hover { @@ -129,78 +133,122 @@ address { text-decoration: none; } +#header-search { + top: 1px; + margin-left: 6px; +} + +#header-search #search-q { + position: relative; + width: 131px; + height: 12px; + margin-right: 10px; + padding: 2px 22px 2px 6px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + border: none; + font-size: 0.88em; +} + +#header-search input[type="submit"] { + border: 0; + background: url(../images/magnifier.png) no-repeat 2px 1px; + text-indent: -9999px; + width: 20px; + height: 18px; + position: absolute; + right: 10px; + top: 2px; + z-index: 2; + cursor: pointer; +} + #site_notice { - color: #000; - float: right; - width: 280px; - padding: 10px; - margin-left: 40px; -webkit-border-radius: 6px; -moz-border-radius: 6px; border-radius: 6px; } -#site_notice a { +/* input forms */ + +.input_forms { + float: left; + top: -20px; + left: -20px; + padding: 18px 20px 0px 20px; + border-bottom: none; + margin-bottom: 0px; + background: #fafafa url('../images/brdr_black_dot.png') repeat-x bottom left; +} + +#input_form_nav li a { + display: block; + float: left; + padding: 0px 10px 1px 10px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + border: 1px solid #ECECF2; + font-weight: bold; + line-height: 1.4em; color: #3e3e8c; + text-shadow: 0px 1px 0px rgba(255, 255, 255, 0.9); + background: #ececf2; + background: -moz-linear-gradient(top, #ffffff 0%, #ececf2 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ffffff), color-stop(100%,#ececf2)); + background: -webkit-linear-gradient(top, #ffffff 0%,#ececf2 100%); + background: -o-linear-gradient(top, #ffffff 0%,#ececf2 100%); + background: -ms-linear-gradient(top, #ffffff 0%,#ececf2 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#ececf2',GradientType=0 ); + background: linear-gradient(top, #ffffff 0%,#ececf2 100%); } -#anon_notice { - color: #000; - clear: both; - background: none; - padding: 0px; - margin-bottom: 10px; +#input_form_nav li:hover a, #input_form_nav li.current a { + color: #fff; + text-shadow: 0px 1px 0px rgba(0, 0, 0, 0.5); + border: 1px solid #ececf2; + background: #364a84; + background: -moz-linear-gradient(top, #7b8dbb 0%, #364a84 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#7b8dbb), color-stop(100%,#364a84)); + background: -webkit-linear-gradient(top, #7b8dbb 0%,#364a84 100%); + background: -o-linear-gradient(top, #7b8dbb 0%,#364a84 100%); + background: -ms-linear-gradient(top, #7b8dbb 0%,#364a84 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#7b8dbb', endColorstr='#364a84',GradientType=0 ); + background: linear-gradient(top, #7b8dbb 0%,#364a84 100%); } -#anon_notice a { - color: #3e3e8c; +.input_form_nav_tab a, .input_form_nav_tab.current a { + text-decoration: none; } -#core { - clear: both; - margin: 0px; - width: 958px; - border-top: 5px solid #FB6104; - border-left: 1px solid #d8dae6; - border-right: 1px solid #d8dae6; +.form_notice .error, +.form_notice .success, +.form_notice .notice-status { + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; } -#aside_primary_wrapper { - width: 100%; - float: left; - overflow: hidden; - position: relative; - background-color: #ececf2; -} - -#content_wrapper { - width: 100%; - float: left; - position: relative; - right: 239px; - background-color: #fff; - border-right: 1px solid #d8dae6; -} - -#site_nav_local_views_wrapper { - width: 100%; - float: left; - position: relative; - right: 561px; - background-color: #ececf2; - border-right: 1px solid #d8dae6; -} - -#site_nav_local_views { - width: 138px; - float: left; - overflow: hidden; - position: relative; - left: 800px; - margin-top: 0px; - padding: 22px 10px 40px 10px; +.form_notice_placeholder .placeholder, +.form_notice textarea , +.input_form .form_settings li input, +.input_form .form_settings li textarea, +.threaded-replies .placeholder { /* TODO combine all these declarations */ + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); } +.input_form .form_settings .submit { + font-size: 1.1em; +} + +/* site nav local views */ + #site_nav_local_views H3 { margin-bottom: 10px; padding-bottom: 6px; @@ -212,15 +260,6 @@ address { text-transform: uppercase; } -#site_nav_local_views li { - display: block; - margin: 0px 0px 8px 0px; -} - -#site_nav_local_views li ul { - margin-bottom: 20px; -} - #site_nav_local_views a { display: block; width: 118px; @@ -238,344 +277,18 @@ address { text-decoration: none; text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.5); background: #364a84; - background: -moz-linear-gradient(top, #7b8dbb , #364a84); + background: -moz-linear-gradient(top, #7b8dbb 0%, #364a84 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#7b8dbb), color-stop(100%,#364a84)); + background: -webkit-linear-gradient(top, #7b8dbb 0%,#364a84 100%); + background: -o-linear-gradient(top, #7b8dbb 0%,#364a84 100%); + background: -ms-linear-gradient(top, #7b8dbb 0%,#364a84 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#7b8dbb', endColorstr='#364a84',GradientType=0 ); + background: linear-gradient(top, #7b8dbb 0%,#364a84 100%); } -#content { - width: 520px; - float: left; - overflow: hidden; - position: relative; - left: 801px; - margin: 0px; - padding: 20px 20px 40px 20px; -} - -/* Input forms */ - -.input_forms { - float: left; - position: relative; - top: -20px; - left: -20px; - padding: 18px 20px 0px 20px; - background: #fafafa url('../images/brdr_black_dot.png') repeat-x bottom left; -} - -#input_form_nav { - float: left; - margin-bottom: 10px; -} - -#input_form_nav li a { - display: block; - float: left; - padding: 0px 10px 1px 10px; - margin-right: 10px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - border: 1px solid #ECECF2; - font-weight: bold; - line-height: 1.4em; - text-shadow: 0px 1px 0px rgba(255, 255, 255, 0.9); - background: #ececf2; - background: -moz-linear-gradient(top, #ffffff , #ececf2); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ffffff), color-stop(100%,#ececf2)); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#ececf2',GradientType=0 ); -} - -#input_form_nav li:hover a, #input_form_nav li.current a { - color: #fff; - text-shadow: 0px 1px 0px rgba(0, 0, 0, 0.5); - border: 1px solid #ececf2; - background: #364a84; - background: -moz-linear-gradient(top, #7b8dbb , #364a84); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#7b8dbb), color-stop(100%,#364a84)); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#7b8dbb', endColorstr='#364a84',GradientType=0 ); -} - -.input_form_nav_tab a, .input_form_nav_tab.current { - text-decoration: none !important; /* XXX cf rebase */ -} - -.input_form { - position: relative; - float: left; - width: 520px; - padding-bottom: 20px; -} - -#input_form_status, #input_form_direct { - padding-bottom: 50px; -} - -.form_notice { - padding: 0px; - background: none; -} - -.form_notice fieldset { - width: auto; - position: static; -} - -.form_notice #notice_data-text-label { - display: none; /* XXX move into input with js */ -} - -.form_notice_placeholder .placeholder { - width: 508px; - padding: 4px 4px 4px 6px; - border: 1px solid #a6a6a6; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); - z-index: 97; - font-size: 1em; - color: #888; -} - -.form_notice textarea { - width: 483px; - height: 42px; - padding: 6px 5px 18px 5px; - border: 1px solid #a6a6a6; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); - z-index: 97; - font-size: 1.2em; -} - -#form_notice-direct.form_notice textarea { - width: 508px; -} - -.form_notice label.notice_data-attach { - top: 0px; - right: 0px; - z-index: 96; -} - -.form_notice .notice_data-geo_wrap label, -.form_notice .notice_data-geo_wrap input { - top: 26px; - right: 0px; - z-index: 99; -} - -.form_notice .count { - position: absolute; - top: 50px; - right: 32px; - font-size: 0.8em; - height: 1em; - z-index: 99; -} - -#form_notice-direct.form_notice .count { - top: 78px; - right: 7px; -} - -.form_notice #notice_action-submit { - position: absolute; - top: 100%; - left: 0px; - margin-top: -49px; - float: left; - width: 100px; - padding: 0px; - z-index: 99; -} - -.form_notice .error, -.form_notice .success, -.form_notice .notice-status { - width: 478px; - position: relative; - top: 0px; - float: none; - clear: none; - margin-left: 0px; - margin-top: 10px; - padding: 5px 5px 5px 10px; - border: 1px solid #ccc; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.form_notice .error { - border: 1px solid #d05858; -} - -.form_notice .attach-status code { - font-size: 1em; -} - -.input_form fieldset { - margin: 0px; - padding: 0px; -} - -.input_form fieldset fieldset { - width: 400px; - float: left; - background: none; - border: none; - margin-bottom: 0px !important; - padding: 0px !important; -} - -.input_form .form_settings .form_data li { - position: relative; - margin-bottom: 12px; -} - -.input_form fieldset fieldset label { - position: absolute; - top: 0; - left: 6px; - float: none; - text-align: left; - color: #888; - cursor: text; - background: #fff; -} - -.input_form .form_settings li input { - width: 388px; - margin-left: 0; - margin-right: 0; - padding: 4px 5px 4px 5px; - border: 1px solid #a6a6a6; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); - font-size: 1em; -} - -.input_form .form_settings li textarea { - width: 388px; - margin-left: 0; - padding: 4px 5px 4px 5px; - border: 1px solid #a6a6a6; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); - z-index: 97; - font-size: 1em; -} - -.input_form .form_settings p.form_guide { - margin-left: 5px; -} - -.input_form .form_settings .submit { - position: relative; - top: 0; - right: 0; - float: right; - width: 100px; - height: 26px; - line-height: 26px; - padding: 0px 10px; - margin: 0px; - color:#fff; - font-weight: bold; - text-transform: uppercase; - font-size: 1.1em; - z-index: 1; -} - -.to-selector { - padding-top: 15px; - z-index: 99; -} - -.form_settings label[for=notice_to] { - left: 5px; - margin-left: 0px; - margin-right: 10px; - position: relative; - clear: left; -} - -.checkbox-wrapper { - padding: 2px; - margin-left: 10px; -} - -.form_notice .checkbox-wrapper { - display: inline; - margin-left: 10px; -} - -.form_settings .checkbox-wrapper label.checkbox { - margin-left: 0px; - margin-top: 6px; - line-height: 1.2em; - left: -3px; - float: none; -} - -.checkbox-wrapper #notice_private { - display:none; -} - -.checkbox-wrapper.unchecked label.checkbox { - padding-left: 20px; - background: url(../images/lock_open.png) no-repeat 0px 0px; - opacity: 0.6; -} - -.checkbox-wrapper.unchecked label.checkbox:hover { - opacity: 1; - cursor: pointer; -} - -.checkbox-wrapper.checked label.checkbox { - padding-left: 20px; - background: url(../images/lock.png) no-repeat 0px 0px; - color: red; - opacity: 1; -} - -.checkbox-wrapper.checked label.checkbox:hover { - cursor: pointer; -} - -#aside_primary { - width: 218px; - float: left; - overflow: hidden; - position: relative; - left: 802px; - padding: 22px 10px 40px 10px; - margin-top: 0px; - background: none; -} +/* aside primary */ #aside_primary .section { - width: 100%; - margin-left: 0px; - margin-right: 0px; font-size: 0.88em; } @@ -641,9 +354,13 @@ address { text-decoration: none; text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.5); background: #364a84; - background: -moz-linear-gradient(top, #7b8dbb , #364a84); + background: -moz-linear-gradient(top, #7b8dbb 0%, #364a84 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#7b8dbb), color-stop(100%,#364a84)); + background: -webkit-linear-gradient(top, #7b8dbb 0%,#364a84 100%); + background: -o-linear-gradient(top, #7b8dbb 0%,#364a84 100%); + background: -ms-linear-gradient(top, #7b8dbb 0%,#364a84 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#7b8dbb', endColorstr='#364a84',GradientType=0 ); + background: linear-gradient(top, #7b8dbb 0%,#364a84 100%); } .section ul.entities { @@ -692,9 +409,13 @@ address { -moz-border-radius: 4px; -webkit-border-radius: 4px; background: #FB6104; - background: -moz-linear-gradient(top, #ff9d63 , #FB6104); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ff9d63), color-stop(100%,#FB6104)); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ff9d63', endColorstr='#FB6104',GradientType=0 ); + background: -moz-linear-gradient(top, #ff9d63 0%, #fb6104 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ff9d63), color-stop(100%,#fb6104)); + background: -webkit-linear-gradient(top, #ff9d63 0%,#fb6104 100%); + background: -o-linear-gradient(top, #ff9d63 0%,#fb6104 100%); + background: -ms-linear-gradient(top, #ff9d63 0%,#fb6104 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ff9d63', endColorstr='#fb6104',GradientType=0 ); + background: linear-gradient(top, #ff9d63 0%,#fb6104 100%); } .invite_button:hover { @@ -702,11 +423,17 @@ address { text-decoration: none; text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.6); background: #ff9d63; - background: -moz-linear-gradient(top, #FB6104 , #fc8035); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#FB6104), color-stop(100%,#fc8035)); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#FB6104', endColorstr='#fc8035',GradientType=0 ); + background: -moz-linear-gradient(top, #fb6104 0%, #fc8035 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#fb6104), color-stop(100%,#fc8035)); + background: -webkit-linear-gradient(top, #fb6104 0%,#fc8035 100%); + background: -o-linear-gradient(top, #fb6104 0%,#fc8035 100%); + background: -ms-linear-gradient(top, #fb6104 0%,#fc8035 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fb6104', endColorstr='#fc8035',GradientType=0 ); + background: linear-gradient(top, #fb6104 0%,#fc8035 100%); } +/* notices etc */ + #content h1 { border-bottom: 3px solid #A6ADBF; color: #A6ADBF; @@ -715,37 +442,11 @@ address { text-transform: none; } -#notices_primary { - margin-top: -5px; -} - #content .notice { padding-bottom: 4px; border-bottom: 2px dotted #eee; } -.notice { - line-height: 1.36em; - margin-bottom: 10px; -} - -#content .notice .author .photo { - left: 0px; - top: 7px; -} - -#content .notice .entry-title { - min-height: 35px; -} - -#showstream .notice .entry-title { - min-height: 1px; -} - -#shownotice .notice .entry-title { - min-height:123px; -} - .notice div.entry-content { font-size: 0.88em; line-height: 1.2em; @@ -771,145 +472,38 @@ div.entry-content a.response:after { .notice-options { margin-top: 4px; - margin-bottom: 10px; } -.threaded-replies { - clear: both; - float: left; - width: 458px; - margin-left: 59px; - margin-top: 10px; - margin-bottom: 10px; - padding-right: 2px; - border-left: 3px solid #ECECF2; - background: #fafafa; - font-size: 1em; +.notice-options .form_repeat.dialogbox { + margin-right: 0px; + border: 1px solid #aaa; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.4); + -moz-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.4); + -webkit-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.4); } -.threaded-replies:empty { - display: none; +.notice-options .form_repeat.dialogbox legend { + padding-top: 10px; } -.user_in .threaded-replies { - margin-top: 0px; -} - -#content .notice .threaded-replies .notice, -#content .notice .threaded-replies .notice-data { - width: 440px; - min-height: 1px; - padding-bottom: 14px; - padding-top: 5px; - border-bottom: 2px dotted #eee; - line-height: 1.36em; - margin-top: 0px; - margin-bottom: 0px; - margin-left: 10px; - background: none; -} - -#content .notice .threaded-replies .entry-title { - min-height: 1px; +.notice-options .form_repeat.dialogbox input.submit_dialogbox { + min-width: 80px; } #content .threaded-replies .notice .author .photo { - height: 24px; - width: 24px; - top: 12px; box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5); -moz-box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5); -webkit-box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5); } -#content .notice .threaded-replies .notice .entry-title { - margin: 2px 7px 0px 35px; -} - -#content .notice .threaded-replies .notice div.entry-content { - clear:left; - float:left; - margin-left: 35px; - margin-top: 6px !important; -} - -#content .notice .threaded-replies .notice div.entry-content.notice-faves { - margin-top: 2px !important; -} - -#content .notice .threaded-replies .notice .notice-options { - margin-top: 5px; - margin-bottom: 0px; -} - -.threaded-replies li { - list-style-type: none; -} - -.threaded-replies .notice-reply-comments { - margin: 2px 0px 4px 10px; -} - -.threaded-replies .placeholder { - margin: 10px; - width: 426px; - padding: 4px 4px 4px 6px; - border: 1px solid #a6a6a6; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); - color: #888; -} - -.threaded-replies .notice-reply { - clear: left; - position: relative; - padding: 10px; - padding-bottom: 44px; -} - -.threaded-replies .form_notice textarea { - width: 395px; -} - -.threaded-replies .form_notice label.notice_data-attach { - top: 10px; - right: 10px; -} - -.threaded-replies .form_notice .notice_data-geo_wrap label, -.threaded-replies .form_notice .notice_data-geo_wrap input { - top: 36px; - right: 10px; -} - -.threaded-replies .form_notice .count { - top: 60px; - right: 50px; -} - -.threaded-replies .form_notice #notice_action-submit { - left: 10px; - margin-top: -44px; -} - -.threaded-replies .form_notice .error, -.threaded-replies .form_notice .success, -.threaded-replies .form_notice .notice-status { - width: 390px; -} - -.threaded-replies .to-selector { - display: none; -} - .user_in.realtime-popup .notice div.entry-content { max-width: 320px; } + .realtime-popup .threaded-replies { margin-left: 15px; } @@ -923,35 +517,11 @@ div.entry-content a.response:after { right: 10px !important; } -#content .notice .notice { - width: 100%; - margin-left: 0; - margin-top: 16px; - margin-bottom: 10px; -} - -.notice .notice { -background-color:rgba(200, 200, 200, 0.050); -} -.notice .notice .notice { -background-color:rgba(200, 200, 200, 0.100); -} -.notice .notice .notice .notice { -background-color:rgba(200, 200, 200, 0.150); -} -.notice .notice .notice .notice .notice { -background-color:rgba(200, 200, 200, 0.300); -} .pagination { height: 1.2em; } -#jOverlayContent button { - top: 20px; - right: 36px; -} - .entity_profile { float: left; width: 360px; @@ -996,24 +566,18 @@ background-color:rgba(200, 200, 200, 0.300); top: 46px; } -#aside_primary #entity_remote_subscribe a:hover { - background-color: #fff !important; +.entity_subscribe .dialogbox, .entity_tag .dialogbox { + border: 1px solid #aaa; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.4); + -moz-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.4); + -webkit-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.4); } -#entity_remote_subscribe .dialogbox { - border: 1px solid #7B4E82; - border-radius: 8px; - -moz-border-radius: 8px; - -webkit-border-radius: 8px; -} - -#entity_remote_subscribe input { - padding-left: 4px; -} - -#entity_remote_subscribe .submit_dialogbox { - margin-top: 10px; - float: right; +.entity_subscribe .dialogbox input.submit_dialogbox, .entity_tag .dialogbox input.submit_dialogbox { + color: #fff !important; } #filter_tags_item .submit { @@ -1029,20 +593,11 @@ background-color:rgba(200, 200, 200, 0.300); border-radius: 6px; } -#footer { - position: relative; - top: -6px; - color: #000; - margin-left: 0px; - margin-right: 0px; - -webkit-border-top-left-radius: 6px; - -webkit-border-top-right-radius: 6px; - -moz-border-radius-topleft: 6px; - -moz-border-radius-topright: 6px; - border-top-left-radius: 6px; - border-top-right-radius: 6px; +#pagination a { + color: #3e3e8c; } + #footer a { color: #3e3e8c; } @@ -1052,17 +607,17 @@ background-color:rgba(200, 200, 200, 0.300); } .error, .success, .notice-status { - background-color: #F7E8E8; - padding: 4px 10px; -webkit-border-radius: 6px; -moz-border-radius: 6px; border-radius: 6px; } -.success, .notice-status { - background-color: #f2f2f2; -} -.form_notice input.submit, .form_settings input.submit, .form_settings input.cancel, #form_invite input.submit { + +.form_notice input.submit, .form_settings input.submit, .form_settings input.cancel, #form_invite input.submit, +.entity_subscribe .dialogbox input.submit_dialogbox, +.entity_tag .dialogbox input.submit_dialogbox, +.form_repeat.dialogbox input.submit_dialogbox +{ /* TODO combine all these declarations */ height: 1.9em; padding: 0px 10px; color:#fff; @@ -1075,57 +630,41 @@ background-color:rgba(200, 200, 200, 0.300); -moz-border-radius: 4px; -webkit-border-radius: 4px; background: #FB6104; - background: -moz-linear-gradient(top, #ff9d63 , #FB6104); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ff9d63), color-stop(100%,#FB6104)); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ff9d63', endColorstr='#FB6104',GradientType=0 ); + background: -moz-linear-gradient(top, #ff9d63 0%, #fb6104 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ff9d63), color-stop(100%,#fb6104)); + background: -webkit-linear-gradient(top, #ff9d63 0%,#fb6104 100%); + background: -o-linear-gradient(top, #ff9d63 0%,#fb6104 100%); + background: -ms-linear-gradient(top, #ff9d63 0%,#fb6104 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ff9d63', endColorstr='#fb6104',GradientType=0 ); + background: linear-gradient(top, #ff9d63 0%,#fb6104 100%); } -.form_notice input.submit:hover, .form_settings input.submit:hover, .form_settings input.cancel:hover, #form_invite input.submit:hover { +.form_notice input.submit:hover, .form_settings input.submit:hover, .form_settings input.cancel:hover, #form_invite input.submit:hover, +.entity_subscribe .dialogbox input.submit_dialogbox:hover, +.entity_tag .dialogbox input.submit_dialogbox:hover, +.form_repeat.dialogbox input.submit_dialogbox:hover +{ text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.6); background: #ff9d63; - background: -moz-linear-gradient(top, #FB6104 , #fc8035); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#FB6104), color-stop(100%,#fc8035)); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#FB6104', endColorstr='#fc8035',GradientType=0 ); + background: -moz-linear-gradient(top, #fb6104 0%, #fc8035 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#fb6104), color-stop(100%,#fc8035)); + background: -webkit-linear-gradient(top, #fb6104 0%,#fc8035 100%); + background: -o-linear-gradient(top, #fb6104 0%,#fc8035 100%); + background: -ms-linear-gradient(top, #fb6104 0%,#fc8035 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fb6104', endColorstr='#fc8035',GradientType=0 ); + background: linear-gradient(top, #fb6104 0%,#fc8035 100%); } -.form_settings input#settings_design_reset, .form_settings input.cancel { - background: #e2e2e2; - color: #8e181b; - text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.5); -} - -.form_settings input#settings_design_reset:hover, .form_settings input.cancel:hover { +.form_settings input#settings_design_reset, .form_settings input#cancel, #form_action-no { background: #f2f2f2; - color: #8e181b; + color: #d7621c; text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.5); } -.form_settings input.checkbox, .form_settings input.radio { - margin-left: 24%; - margin-top: 2px; - position: relative; - left: -14px; -} - -.form_settings label.checkbox, .form_settings label.radio { - width: auto; - max-width: 60%; - position: relative; - left: -30px; -} - -.form_settings li input.radio { - clear: left; -} - -.form_settings label.radio { - margin-left: 10px; - margin-right: 10px; - text-align: left; -} - -#form_login p.form_guide, #form_register #settings_rememberme p.form_guide, #form_openid_login #settings_rememberme p.form_guide, #settings_twitter_remove p.form_guide, #design_background-image_onoff p.form_guide { - margin-left: 26%; +.form_settings input#settings_design_reset:hover, .form_settings input#cancel:hover, #form_action-no:hover { + background: #fff; + color: #d7621c; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.5); } .form_settings fieldset fieldset { @@ -1260,7 +799,61 @@ padding-right:0; margin-top: 60px; } +/* Limited-scope */ + +.limited-scope .entry-content .timestamp { + padding-left: 20px; + position: relative; +} + +.limited-scope .entry-content .timestamp:before { + content: url(../images/lock.png); + position: absolute; + top: -2px; + left: 0px; +} + +.limited-scope li .entry-content .timestamp { + padding-left: 0px; +} + +.limited-scope li .entry-content .timestamp:before { + content: none; +} + +.limited-scope li.limited-scope .entry-content .timestamp { + padding-left: 20px; +} + +.limited-scope li.limited-scope .entry-content .timestamp:before { + content: url(../images/lock.png); + position: absolute; + top: -2px; + left: 0px; +} + +/* Blog */ + +label[for=blog-entry-content] { + display: none !important; +} + +#input_form_blog td { + padding-top: 0px; + padding-bottom: 0px; +} + +#input_form_blog td.mceToolbar { + padding-top: 4px; +} + +h4.blog-entry-title { + margin-bottom: 8px; + line-height: 1.2em; +} + /* Bookmark specific styles */ +/* TODO separate base styles and move to plugin */ .bookmark h3 { margin: 0px 0px 8px 0px; @@ -1342,10 +935,6 @@ ul.bookmark-tags a:hover { opacity: 1; } -.bookmark .notice-options { - margin-top: 16px; -} - #bookmarkpopup { min-width: 600px; margin-top: 0px; @@ -1382,9 +971,8 @@ ul.bookmark-tags a:hover { color: #777; } -#bookmarkpopup #submit { - float: right; - margin-right: 0px; +#bookmarkpopup #bookmark-submit { + min-width: 100px; } #bookmarkpopup fieldset fieldset { @@ -1402,6 +990,7 @@ ul.bookmark-tags a:hover { } /* Onboard specific styles */ +/* TODO move to plugin */ #cboxOverlay{ background: url(../images/lightbox_bg.png) repeat 0 0 !important; @@ -1438,7 +1027,7 @@ ul.bookmark-tags a:hover { #aside_primary #onboard_section { background: #f2f2f2; - width: 198px; + width: 196px; padding: 10px; border-radius: 4px; -moz-border-radius: 4px; @@ -1463,9 +1052,13 @@ ul.bookmark-tags a:hover { color: #fff; text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.5); background: #364A84; - background: -moz-linear-gradient(top, #516499 , #364a84); + background: -moz-linear-gradient(top, #516499 0%, #364a84 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#516499), color-stop(100%,#364a84)); + background: -webkit-linear-gradient(top, #516499 0%,#364a84 100%); + background: -o-linear-gradient(top, #516499 0%,#364a84 100%); + background: -ms-linear-gradient(top, #516499 0%,#364a84 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#516499', endColorstr='#364a84',GradientType=0 ); + background: linear-gradient(top, #516499 0%,#364a84 100%); } #onboard_section ul { @@ -1487,6 +1080,7 @@ ul.bookmark-tags a:hover { } /* Billing specific styles */ +/* TODO move to plugin */ #content table.billing_info { margin-top: 10px; @@ -1511,6 +1105,7 @@ ul.bookmark-tags a:hover { } /* Directory specific styles */ +/* TODO separate base styles and move to plugin */ div#profile_directory div.alpha_nav > a { border-left: 1px solid #ccc !important; @@ -1651,6 +1246,7 @@ td.entity_profile { } /* Event specific styles */ +/* TODO separate base styles and move to plugin */ .notice .vevent div { margin-bottom: 8px; @@ -1688,17 +1284,30 @@ td.entity_profile { -moz-border-radius: 4px; -webkit-border-radius: 4px; background: #FB6104; - background: -moz-linear-gradient(top, #ff9d63 , #FB6104); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ff9d63), color-stop(100%,#FB6104)); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ff9d63', endColorstr='#FB6104',GradientType=0 ); + background: -moz-linear-gradient(top, #ff9d63 0%, #fb6104 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ff9d63), color-stop(100%,#fb6104)); + background: -webkit-linear-gradient(top, #ff9d63 0%,#fb6104 100%); + background: -o-linear-gradient(top, #ff9d63 0%,#fb6104 100%); + background: -ms-linear-gradient(top, #ff9d63 0%,#fb6104 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ff9d63', endColorstr='#fb6104',GradientType=0 ); + background: linear-gradient(top, #ff9d63 0%,#fb6104 100%); } #form_event_rsvp input.submit:hover { text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.6); background: #ff9d63; - background: -moz-linear-gradient(top, #FB6104 , #fc8035); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#FB6104), color-stop(100%,#fc8035)); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#FB6104', endColorstr='#fc8035',GradientType=0 ); + background: -moz-linear-gradient(top, #fb6104 0%, #fc8035 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#fb6104), color-stop(100%,#fc8035)); + background: -webkit-linear-gradient(top, #fb6104 0%,#fc8035 100%); + background: -o-linear-gradient(top, #fb6104 0%,#fc8035 100%); + background: -ms-linear-gradient(top, #fb6104 0%,#fc8035 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fb6104', endColorstr='#fc8035',GradientType=0 ); + background: linear-gradient(top, #fb6104 0%,#fc8035 100%); +} + +#wrap .vevent form.processing input.submit { + text-indent: 0; + background: #ff9d63; } #input_form_event .form_settings .form_data { @@ -1714,49 +1323,22 @@ td.entity_profile { width: auto; } -#event-startdate, #event-starttime, #event-enddate, #event-endtime { - width: 120px; +label[for=event-starttime], label[for=event-endtime] { + display: none !important; +} + +#event-starttime, #event-endtime { + margin-top: -1px; + margin-bottom: -1px; + height: 2em; +} + +#event-startdate, #event-enddate { margin-right: 20px; + width: 120px; } -/* Limited-scope specific styles */ - -.limited-scope .entry-content .timestamp { - padding-left: 20px; - position: relative; -} - -.limited-scope .entry-content .timestamp:before { - content: url(../images/lock.png); - position: absolute; - top: -2px; - left: 0px; -} - -.limited-scope li .entry-content .timestamp { - padding-left: 0px; -} - -.limited-scope li .entry-content .timestamp:before { - content: none; -} - -.limited-scope li.limited-scope .entry-content .timestamp { - padding-left: 20px; -} - -.limited-scope li.limited-scope .entry-content .timestamp:before { - content: url(../images/lock.png); - position: absolute; - top: -2px; - left: 0px; -} - -/* QnA specific styles */ - -#content .question .entry-title, #content .qna-full-question .entry-title { - min-height: 1px; -} +/* QnA */ .question div.question-description { font-size: 1em; @@ -1766,95 +1348,17 @@ td.entity_profile { } .question div.answer-content, .qna-full-question div.answer-content { + font-size: 1em; opacity: 1; } -.question .answer-count, .qna-full-question .answer-count { - display: block; - clear: left; -} - -.question .answer-count:before, .qna-full-question .answer-count:before { - content: '('; -} - -.question .answer-count:after, .qna-full-question .answer-count:after { - content: ')'; -} - -.question .notice-answer { - margin-left: 10px; - padding-bottom: 10px; -} - -ul.qna-dummy { - clear: left; - float: left; - list-style-type: none; - width: 458px; - margin-left: 59px; - padding-right: 2px; - border-left: 3px solid #ECECF2; - background: #fafafa; - font-size: 1em; -} - -ul.qna-dummy + ul.threaded-replies li.notice:first-child { - border-top: 2px dotted #eee; - margin-top: -10px; - padding-top: 10px; -} - -.qna-dummy-placeholder input { - margin: 10px; - width: 426px; - padding: 4px 4px 4px 6px; - border: 1px solid #a6a6a6; +.qna-dummy-placeholder input, .question #qna-answer, .qna-full-question #qna-answer { -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); -moz-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); -webkit-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); - color: #888; -} - -li.notice-answer + li.notice { - border-top: 2px dotted #eee; - margin-top: -10px; - padding-top: 10px; -} - -.question fieldset, .qna-full-question fieldset { - margin: 0px; -} - -.question fieldset legend, .qna-full-question fieldset legend, .answer fieldset legend { - display: none; -} - -.question label[for=qna-answer], .qna-full-question label[for=qna-answer] { - display: none; -} - -.question #qna-answer, .qna-full-question #qna-answer { - width: 426px; - height: 54px; - padding: 6px 5px; - border: 1px solid #a6a6a6; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); - font-size: 1.2em; - margin-top: 10px; - margin-bottom: 10px; -} - -.qna-full-question textarea { - width: 508px; } .question-description input.submit, .answer-content input.submit { @@ -1871,17 +1375,29 @@ li.notice-answer + li.notice { -moz-border-radius: 4px; -webkit-border-radius: 4px; background: #FB6104; - background: -moz-linear-gradient(top, #ff9d63 , #FB6104); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ff9d63), color-stop(100%,#FB6104)); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ff9d63', endColorstr='#FB6104',GradientType=0 ); + background: -moz-linear-gradient(top, #ff9d63 0%, #fb6104 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ff9d63), color-stop(100%,#fb6104)); + background: -webkit-linear-gradient(top, #ff9d63 0%,#fb6104 100%); + background: -o-linear-gradient(top, #ff9d63 0%,#fb6104 100%); + background: -ms-linear-gradient(top, #ff9d63 0%,#fb6104 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ff9d63', endColorstr='#fb6104',GradientType=0 ); + background: linear-gradient(top, #ff9d63 0%,#fb6104 100%); +} + +#qna-answer-submit { + min-width: 100px; } .question .question-description input.submit:hover, .question .answer-content input.submit:hover { text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.6); background: #ff9d63; - background: -moz-linear-gradient(top, #FB6104 , #fc8035); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#FB6104), color-stop(100%,#fc8035)); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#FB6104', endColorstr='#fc8035',GradientType=0 ); + background: -moz-linear-gradient(top, #fb6104 0%, #fc8035 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#fb6104), color-stop(100%,#fc8035)); + background: -webkit-linear-gradient(top, #fb6104 0%,#fc8035 100%); + background: -o-linear-gradient(top, #fb6104 0%,#fc8035 100%); + background: -ms-linear-gradient(top, #fb6104 0%,#fc8035 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fb6104', endColorstr='#fc8035',GradientType=0 ); + background: linear-gradient(top, #fb6104 0%,#fc8035 100%); } .question .question-description #answer-form input.submit { @@ -1893,4 +1409,51 @@ li.notice-answer + li.notice { padding-left: 20px; } +.question p.best:before, .answer p.best:before { + content: none !important; +} + +/* Poll specific styles */ + +.notice div.poll-content { + opacity: 1; +} + +#poll-response-submit { + min-width: 100px; +} + +/* SNOD CompanyLogo styling */ +/* TODO move to plugin */ + +#site_nav_local_views a.company_logo { + width: 138px; + padding: 0px; + font-weight: bold; + text-transform: none; + line-height: 1em; + margin-bottom: 20px; + position: relative; + top: -4px; +} + +#site_nav_local_views a.company_logo:hover { + background: none; + color: blue; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.5); +} + +.company_logo img { + max-width: 138px; + margin-bottom: 4px; +} + +.company_logo span { + display: block; +} + +a.company_logo:hover span { + text-decoration: underline; +} + }/*end of @media screen, projection, tv*/ diff --git a/theme/neo/css/mp-screen.css b/theme/neo/css/mp-screen.css index 559e71ce00..013779ca95 100644 --- a/theme/neo/css/mp-screen.css +++ b/theme/neo/css/mp-screen.css @@ -1,137 +1,43 @@ -/* mobile style */ - body { background-image: none; min-width: 0; } -#wrap { - margin: 0; - padding: 0; - min-width:0; - max-width:100%; - width: auto; - border: none; -} - #header { - width: 100%; padding: 0; } -address { - float:left; - margin: 0px; - width: auto; - left: 0px; -} - -address img { - float: left; - background: #fff; - padding: 2px 2px 2px 6px; -} - -address img + .fn { - display:block; - margin-top: 8px; - clear: left; - float: left; - color: #000; - margin-left: 6px; -} - #site_nav_global_primary { - margin:0; - width: 100%; - padding: 2px 0; - height: auto; - position:absolute; - top:0; - left:0; - font-size: 1em; - letter-spacing: 0em; - border-top: none; + top: 0; -webkit-border-top-right-radius: 0px; -moz-border-radius-topright: 0px; border-top-right-radius: 0px; - height: 24px; line-height: 16px; } #site_nav_global_primary li { - margin-left:0; - margin-right: 2px; - float:left; - font-size:0.9em; - padding: 2px 4px; - line-height: 1em; - height: auto; -} - -#site_nav_global_primary li:last-child { - margin-right: 0px; -} - -#site_nav_global_primary a { - padding: 2px 4px; - height: 20px; -} - -#core { - width: 100%; - border-left: none; - border-right: none; -} - -#aside_primary_wrapper { - background: none; -} - -#content_wrapper { - right: 0px; - border: none; -} - -#site_nav_local_views_wrapper { - right: 0px; - border: none; -} - -#navtoggle { - float: right; - padding: 2px 6px; - text-decoration: none; + float: left; + margin-right: 8px; } #site_nav_local_views { - height: auto; - font-size: 1em; line-height: 2em; - margin-bottom: 0px; - padding: 10px 0px 10px 6px; - background: none; - left: 0px; - width: 100%; - display: none; } #site_nav_local_views h3 { color: #333; - font-size: 1em; - margin-bottom: 0px; -} - -#site_nav_local_views li { - margin-right: 6px; - margin-bottom: 0px; - clear: left; + background: none; + text-transform: none; + letter-spacing: 0; + padding-bottom: 0; } #site_nav_local_views li li { - float: left; - clear: none; - margin-bottom: 6px; + margin: 0 6px 6px 0; +} + +#login #site_nav_local_views li, #register #site_nav_local_views li, #openidlogin #site_nav_local_views li { + margin: 0 6px 6px 0; } #site_nav_local_views a { @@ -150,268 +56,40 @@ address img + .fn { background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#364a84), color-stop(100%,#7b8dbb)); } -#login #site_nav_local_views, #register #site_nav_local_views, #openidlogin #site_nav_local_views { - display: block; - margin-top: 25px; -} - -#login #navtoggle, #register #navtoggle, #openidlogin #navtoggle { - display: none; -} - -#login #site_nav_local_views li, #register #site_nav_local_views li, #openidlogin #site_nav_local_views li { - float: left; - clear: none; - margin-bottom: 6px; -} - -#content { - width: 96%; - padding: 10px 2%; - margin: 0; - min-height: auto; - left: 0px; -} - -#content h1 { - clear: left; -} - -#footer { - margin: 0; - padding: 10px 4px 4px 4px; -} - .input_forms { - display: block; - width: 102%; top: -10px; - left: -2%; - padding-left: 2%; padding-right: 0; } #input_form_nav li a { padding: 0px 4px 1px 4px; - margin-right: 6px; -} - -.input_form { - clear: left; - width: 100%; - padding-bottom: 0px; -} - -#input_form_status, #input_form_direct { - padding-bottom: 40px; -} - -.form_notice_placeholder .placeholder { - width: 290px; - margin-bottom: 20px; -} - -.form_notice { - float: left; - margin-left: 0px; - width: 300px; - padding: 4px 0px; -} - -#form_notice-direct.form_notice { - padding-top: 0px; -} - -.form_notice textarea, #form_notice-direct.form_notice textarea { - width: 292px; - height: 36px; - padding: 4px 4px 16px 4px; - font-size: 1em; } .form_notice .count { - position: absolute; top: 44px; - left: 270px; + left: 276px; } #form_notice-direct.form_notice .count { - top: 70px; - left: 270px; + top: 74px; + left: 276px; } - -/*input type=file no good in -iPhone/iPod Touch, Android, Opera Mini Simulator -*/ - -.form_notice .notice_data-attach, .form_notice .notice_data-geo_wrap label, .form_notice .notice_data-geo_wrap input { - display:none; -} - -.checkbox-wrapper { - margin-left: 0px; - clear: left; - float: left; - width: 200px; -} - -.form_notice .checkbox-wrapper { - display: inline; - margin-left: 0px; -} - -.checkbox-wrapper label.checkbox { - display: none; -} - -.checkbox-wrapper #notice_private { - display: inline; - margin-top: 10px; - margin-left: 20px; -} - -.form_notice .checkbox-wrapper #notice_private { - margin-left: 0px; -} - -.checkbox-wrapper:before { - content: "Send privately?"; -} - -.input_form fieldset fieldset { - width: 300px; -} - -.input_form .form_settings li input { - width: 292px; -} - -.input_form .form_settings li textarea { - width: 292px; -} - -.bookmarkform-thumbnail { - display: none; +#event-startdate, #event-starttime, #event-enddate, #event-endtime { + width: 120px; + margin-right: 12px; } .input_form .form_settings .submit { font-size: 1em; - margin: 10px 0; - clear: left; - float: left; } -.form_notice #notice_action-submit { - text-align: center; - left: 0px; - top: 192px; - width: 80px; +.form_notice input.submit { font-size: 1em; } -#form_notice-direct.form_notice #notice_action-submit { - top: 148px; -} - -.threaded-replies { - width: 80%; - margin-left: 59px; -} - -#content .notice .threaded-replies .notice { - width: 95%; -} - -.threaded-replies .placeholder { - margin: 10px; - width: 92%; -} - -.threaded-replies .form_notice { - margin-bottom: 10px; -} - -.threaded-replies .form_notice textarea { - width: 220px; -} - -.threaded-replies .form_notice .count { - left: 205px; - top: 53px; -} - -.threaded-replies .form_notice #notice_action-submit { - position: relative; - top: 0; - bottom: 0px; - left: 0; - margin-top: 10px; -} - -.threaded-replies .form_notice .error, -.threaded-replies .form_notice .success, -.threaded-replies .form_notice .notice-status { - width: 210px; -} - -.form_settings fieldset { -margin-bottom:7px; -} - -.form_settings label { -width:auto; -display:block; -float:none; - text-align: left; -} - -.form_settings .form_data li { -margin-bottom:7px; -} - -.form_settings .form_data textarea, -.form_settings .form_data select, -.form_settings .form_data input { -margin-left:0; -display:block; -} -.form_settings .form_data textarea { -width:96.41%; -} - -.form_settings .form_data label { -float:none; -} - -.form_settings .form_data p.form_guide { -width:auto; -margin-left:0 !important; -} - -#settings_design_color .form_data { - width: auto; - margin-right: 0; -} - -.form_settings input.checkbox, .form_settings input.radio { - left: 0px; -} - -.form_settings label.checkbox, .form_settings label.radio { - left: -10px; -} - -.notice .addressees:before { - content: '\003E'; -} - -.notice .addressees:empty:before { - content: none; -} - -.user_in .notice div.entry-content { - max-width: 150px; +.question div.question-description { + max-width: 100% !important; } ul.qna-dummy { @@ -426,6 +104,10 @@ ul.qna-dummy { width: 220px; } +.threaded-replies #answer-form fieldset { + width: 220px; +} + .threaded-replies #qna-answer-submit { float: left; clear: left; @@ -435,3 +117,7 @@ ul.qna-dummy { left: 0; margin-top: 10px; } + +a.company_logo { + display: none !important; +} diff --git a/theme/neo/css/rtl.css b/theme/neo/css/rtl.css new file mode 100644 index 0000000000..7d044213a3 --- /dev/null +++ b/theme/neo/css/rtl.css @@ -0,0 +1,326 @@ +/** theme: neo + * + * @package StatusNet + * @author Osama Khalid + * @copyright Osama Khalid + * @license http://creativecommons.org/licenses/by/3.0/ Creative Commons Attribution 3.0 Unported + * @link http://status.net/ + */ + +body { + direction: rtl; +} + +span.rtl{ + direction: rtl !important; +} + +#content .notice .entry-title{ + direction: ltr; +} + +.form_notice textarea{ + direction: ltr; +} + +#site_nav_global_primary ul{ + float: left; +} + +.notice div.entry-content { + float: right; + clear: right; +} + +#content .notice .threaded-replies .notice div.entry-content{ + clear: right; + float: right; +} + +#content h1{ + font-weight: bold; + letter-spacing: 0; +} + +.threaded-replies { + border-right: 3px solid #ECECF2; + border-left: 0; + margin-right: 59px; + margin-left: 0; +} + +address{ + float: right; +} + +#site_nav_global_primary { + left: 0; + right: auto; +} + +.input_form .form_settings .submit{ + float: left; +} + +.input_form .form_settings fieldset fieldset{ + float: right; +} + +.input_form fieldset fieldset label{ + right: 6px; + text-align: right; +} + +#input_form_event .form_settings .form_data li{ + float: right; +} + +.notice .author { + direction: rtl; + float: right; + margin-left: 8px; + margin-right: 0; +} + +.section .notice .author { + margin-left: 0; +} + +.notice p.entry-content { + float: left; +} + +.threaded-replies .form_notice #notice_action-submit { + right: 10px; +} + +.form_notice input.submit{ + float: right; +} + +#export_data li a{ + padding-right: 30px; + padding-left: 0; +/* background-position: right center; */ +} + +#content .notice .threaded-replies .notice .entry-title{ + margin: 2px 35px 0 7px; +} + +#content .notice .entry-title { + margin: 2px 59px 0 7px; +} + +#content .notice .author .photo{ + right: 0; + left: auto; +} + +.notice-options{ + float: left; +} + +.notice div.entry-content { + margin-right: 59px; + margin-left: 0; +} + +#core .vcard .photo { + margin-left: 11px; + margin-right: 0; +} + +.threaded-replies .notice-reply-comments { + margin: 2px 10px 4px 0; +} + +#shownotice .notice div.entry-content { + margin-right: 0; +} + +.notice .addressees:before { + content: '\25C2'; +} + +#content thead th { + text-align: right; +} + +.profile_list th.current a { + background-position: left top; + padding-left: 25px; +} + +.form_settings .form_data textarea, .form_settings .form_data select, .form_settings .form_data input { + float: right; + margin-right: 1.795%; +} + +.form_settings .form_data label { + float: right; +} + +.form_settings label { + text-align: left; +} + +#form_search input.submit { + margin-right: 5px; +} + +#site_nav_local_views H3{ + font-weight: bold; + letter-spacing: 0; +} + +#aside_primary h2{ + font-weight: bold; + letter-spacing: 0; +} + +.form_settings label[for="notice_to"] { + margin-left: 10px; + margin-right: 0; +} + +select { + padding-left: 10px; +} + +#input_form_nav li a { + float: right; +} + +#content table.extended-profile td { + padding-left: 0 !important; + padding-right: 8px !important; +} + +.experience-item, .education-item { + float: right; +} + +#site_nav_global_primary a { + float: right; +} + +.form_settings .form_data p.form_guide { + margin-right: 27%; +} + +.form_settings label.checkbox { + text-align: right; +} + +.form_settings label.checkbox, .form_settings label.radio { + left: 0; + right: -25px; +} + +.form_settings input.checkbox, .form_settings input.radio { + margin-right: 25%; + margin-left: 20px; + right: -14px; + left: 0; +} + +.form_settings input { + margin-left: 20px; +} + +.form_settings .form_data li { + float: right; +} + +#header-search { + float: left; +} + +#header-search input[type="submit"] { + left: 0; + right: auto; +} + +#avatarfile { + width: 100%; +} + +.form_settings .checkbox-wrapper label.checkbox { + right: -3px; + left: auto; +} + +.checkbox-wrapper.unchecked label.checkbox, .checkbox-wrapper.checked label.checkbox { + padding-right: 20px; + padding-left: 0; + background-position: right center; +} + +.input_form .form_settings .form_data p.form_guide { + margin-right: 5px; + margin-left: 27%; +} + +.experience-item, .education-item { + float: right !important; +} + +.profile_block .entity_actions { + float: left; +} + +.profile .entity_profile .fn, .profile .entity_profile .label { + margin-right: 11px; + margin-left: 0; +} + +#core .vcard .photo { + float: right; +} + +.profile_list .label { + margin-right: 59px !important; +} + +.profile .entity_profile .note, .profile .entity_profile .url, .profile .entity_profile .entity_tags, .profile .entity_profile .form_subscription_edit { + margin-right: 59px; + margin-left: 0; +} + +.profile_list .entity_actions ul { + left: 20px; + right: auto; +} + +.entity_actions input.submit { + text-align: right; +} + +#entity_statistics dt, #entity_statistics dd { + margin-left: 11px; + margin-right: 0; +} + +#showstream .notice .entry-title, #showstream .notice div.entry-content { + margin-right: 0; +} + +.limited-scope .entry-content .timestamp:before { + right: 0; + left: auto; +} + +.limited-scope .entry-content .timestamp { + padding-left: 0; + padding-right: 20px; +} + +.section ul.entities { + float: right; +} + +.section .entities li { + float: right; +} + diff --git a/theme/neo/images/magnifier.png b/theme/neo/images/magnifier.png new file mode 100644 index 0000000000..cf3d97f75e Binary files /dev/null and b/theme/neo/images/magnifier.png differ diff --git a/theme/neo/logo.png b/theme/neo/logo.png index 3891979530..e4634b9e9c 100644 Binary files a/theme/neo/logo.png and b/theme/neo/logo.png differ diff --git a/tpl/index.php b/tpl/index.php deleted file mode 100644 index 36a1611449..0000000000 --- a/tpl/index.php +++ /dev/null @@ -1,45 +0,0 @@ -xml version="1.0" encoding="UTF-8"?> - - - <?php echo section('title'); ?> - - - - - - - - -
        - -
        - - -
        - - - - - - - - - - - - - -
        -
        - -
        - -