diff --git a/README b/README index 9330d133a5..f2a2d2c516 100644 --- a/README +++ b/README @@ -2,8 +2,8 @@ README ------ -StatusNet 0.9.3 ("Half a World Away") -29 June 2010 +StatusNet 0.9.4beta2 +11 August 2010 This is the README file for StatusNet, the Open Source microblogging platform. It includes installation instructions, descriptions of @@ -77,27 +77,31 @@ for additional terms. New this version ================ -This is a minor bug and feature release since version 0.9.2 released on -4 May 2010. +This is a security, bug and feature release since version 0.9.3 released on +29 June 2010. 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. +Changes from 0.9.4beta1: +- fix for daemon config switching on multi-site setup + Notable changes this version: -- Enhanced API output to aid StatusNet-specific clients +- OpenID and OAuth libraries patched for potential timing attack +- OStatus feed i/o updated for Activity Streams +- Correctness fixes on XRD, other discovery bits +- Support for contacting SNI-based SSL virtual hosts when SSL + certificate verification is enabled (requires PHP 5.3.2+ or + enabling CURL backend with $config['http']['curl'] = true) +- Experimental SubMirror plugin +- Multi-site status_network table mode has been tweaked to support + multiple tags better - Many updates to user interface translation from TranslateWiki -- OStatus now works subscribing to SSL-protected sites by default -- OpenID now works on PHP 5.3, supports closer site integration. -- Numerous API and FOAF output fixes. -- Fixes to Facebook integration for FB API behavior changes -- PostgreSQL support updates -- Initial version of a custom theme uploader (disabled by default) -- LDAP auth plugins cleanup - Many other bugfixes -A full changelog is available at http://status.net/wiki/StatusNet_0.9.3. +A full changelog is available at http://status.net/wiki/StatusNet_0.9.4. Prerequisites ============= @@ -125,7 +129,6 @@ Your PHP installation must include the following PHP extensions: - MySQL. For accessing the database. - GD. For scaling down avatar images. - mbstring. For handling Unicode (UTF-8) encoded strings. -- gettext. For multiple languages. Default on many PHP installs. For some functionality, you will also need the following extensions: @@ -140,6 +143,8 @@ For some functionality, you will also need the following extensions: 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 @@ -209,7 +214,7 @@ 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.2.tar.gz + tar zxf statusnet-0.9.4.tar.gz ...which will make a statusnet-0.9.2 subdirectory in your current directory. (If you don't have shell access on your Web server, you @@ -219,7 +224,7 @@ especially if you've previously installed PHP/MySQL packages. 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.2 /var/www/statusnet + mv statusnet-0.9.4 /var/www/statusnet This will make your StatusNet instance available in the statusnet path of your server, like "http://example.net/statusnet". "microblog" or diff --git a/actions/newnotice.php b/actions/newnotice.php index 748d104ff9..8f1fb1c40f 100644 --- a/actions/newnotice.php +++ b/actions/newnotice.php @@ -131,6 +131,8 @@ class NewnoticeAction extends Action $user = common_current_user(); assert($user); // XXX: maybe an error instead... $content = $this->trimmed('status_textarea'); + $options = array(); + Event::handle('StartSaveNewNoticeWeb', array($this, $user, &$content, &$options)); if (!$content) { $this->clientError(_('No content!')); @@ -157,11 +159,9 @@ class NewnoticeAction extends Action Notice::maxContent())); } - $replyto = $this->trimmed('inreplyto'); - #If an ID of 0 is wrongly passed here, it will cause a database error, - #so override it... - if ($replyto == 0) { - $replyto = 'false'; + $replyto = intval($this->trimmed('inreplyto')); + if ($replyto) { + $options['replyto'] = $replyto; } $upload = null; @@ -169,7 +169,10 @@ class NewnoticeAction extends Action if (isset($upload)) { - $content_shortened .= ' ' . $upload->shortUrl(); + if (Event::handle('StartSaveNewNoticeAppendAttachment', array($this, $upload, &$content_shortened, &$options))) { + $content_shortened .= ' ' . $upload->shortUrl(); + } + Event::handle('EndSaveNewNoticeAppendAttachment', array($this, $upload, &$content_shortened, &$options)); if (Notice::contentTooLong($content_shortened)) { $upload->delete(); @@ -182,8 +185,6 @@ class NewnoticeAction extends Action } } - $options = array('reply_to' => ($replyto == 'false') ? null : $replyto); - if ($user->shareLocation()) { // use browser data if checked; otherwise profile data if ($this->arg('notice_data-geo')) { @@ -208,6 +209,7 @@ class NewnoticeAction extends Action if (isset($upload)) { $upload->attachToNotice($notice); } + Event::handle('EndSaveNewNoticeWeb', array($this, $user, &$content_shortened, &$options)); if ($this->boolean('ajax')) { header('Content-Type: text/xml;charset=utf-8'); diff --git a/classes/Notice.php b/classes/Notice.php index 4646fc6aba..0eeebfadf3 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -485,7 +485,7 @@ class Notice extends Memcached_DataObject function saveKnownUrls($urls) { // @fixme validation? - foreach ($urls as $url) { + foreach (array_unique($urls) as $url) { File::processNew($url, $this->id); } } @@ -893,7 +893,7 @@ class Notice extends Memcached_DataObject } $groups = array(); - foreach ($group_ids as $id) { + foreach (array_unique($group_ids) as $id) { $group = User_group::staticGet('id', $id); if ($group) { common_log(LOG_ERR, "Local delivery to group id $id, $group->nickname"); @@ -1016,7 +1016,7 @@ class Notice extends Memcached_DataObject } $sender = Profile::staticGet($this->profile_id); - foreach ($uris as $uri) { + foreach (array_unique($uris) as $uri) { $user = User::staticGet('uri', $uri); @@ -1029,6 +1029,7 @@ class Notice extends Memcached_DataObject $reply->notice_id = $this->id; $reply->profile_id = $user->id; + common_log(LOG_INFO, __METHOD__ . ": saving reply: notice $this->id to profile $user->id"); $id = $reply->insert(); } diff --git a/js/util.js b/js/util.js index 6a67da4bcd..ad8a44c82a 100644 --- a/js/util.js +++ b/js/util.js @@ -110,7 +110,7 @@ var SN = { // StatusNet return; } - var remaining = MaxLength - form.find('#'+SN.C.S.NoticeDataText).val().length; + var remaining = MaxLength - SN.U.CharacterCount(form); var counter = form.find('#'+SN.C.S.NoticeTextCount); if (remaining.toString() != counter.text()) { @@ -134,6 +134,10 @@ var SN = { // StatusNet } }, + CharacterCount: function(form) { + return form.find('#'+SN.C.S.NoticeDataText).val().length; + }, + ClearCounterBlackout: function(form) { // Allow keyup events to poke the counter again SN.C.I.CounterBlackout = false; diff --git a/lib/activitycontext.php b/lib/activitycontext.php index 5afbb7fd28..09a4579249 100644 --- a/lib/activitycontext.php +++ b/lib/activitycontext.php @@ -71,6 +71,7 @@ class ActivityContext $links = $element->getElementsByTagNameNS(ActivityUtils::ATOM, ActivityUtils::LINK); + $attention = array(); for ($i = 0; $i < $links->length; $i++) { $link = $links->item($i); @@ -80,11 +81,12 @@ class ActivityContext // XXX: Deprecate this in favour of "mentioned" from Salmon spec // http://salmon-protocol.googlecode.com/svn/trunk/draft-panzer-salmon-00.html#SALR if ($linkRel == self::ATTENTION) { - $this->attention[] = $link->getAttribute(self::HREF); + $attention[] = $link->getAttribute(self::HREF); } elseif ($linkRel == self::MENTIONED) { - $this->attention[] = $link->getAttribute(self::HREF); + $attention[] = $link->getAttribute(self::HREF); } } + $this->attention = array_unique($attention); } /** diff --git a/lib/common.php b/lib/common.php index f04bd64b77..570666da79 100644 --- a/lib/common.php +++ b/lib/common.php @@ -22,10 +22,10 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } //exit with 200 response, if this is checking fancy from the installer if (isset($_REQUEST['p']) && $_REQUEST['p'] == 'check-fancy') { exit; } -define('STATUSNET_VERSION', '0.9.3'); +define('STATUSNET_VERSION', '0.9.4beta2'); define('LACONICA_VERSION', STATUSNET_VERSION); // compatibility -define('STATUSNET_CODENAME', 'Half a World Away'); +define('STATUSNET_CODENAME', 'Orange Crush'); define('AVATAR_PROFILE_SIZE', 96); define('AVATAR_STREAM_SIZE', 48); diff --git a/lib/language.php b/lib/language.php index d93e4e0ad5..80d2568074 100644 --- a/lib/language.php +++ b/lib/language.php @@ -310,6 +310,7 @@ function get_all_languages() { 'da' => array('q' => 0.8, 'lang' => 'da', 'name' => 'Danish', 'direction' => 'ltr'), 'de' => array('q' => 0.8, 'lang' => 'de', 'name' => 'German', 'direction' => 'ltr'), 'el' => array('q' => 0.1, 'lang' => 'el', 'name' => 'Greek', 'direction' => 'ltr'), + 'eo' => array('q' => 0.8, 'lang' => 'eo', 'name' => 'Esperanto', 'direction' => 'ltr'), 'en-us' => array('q' => 1, 'lang' => 'en', 'name' => 'English (US)', 'direction' => 'ltr'), 'en-gb' => array('q' => 1, 'lang' => 'en_GB', 'name' => 'English (British)', 'direction' => 'ltr'), 'en' => array('q' => 1, 'lang' => 'en', 'name' => 'English (US)', 'direction' => 'ltr'), diff --git a/lib/mysqlschema.php b/lib/mysqlschema.php index 464c718f99..f9552c1dcd 100644 --- a/lib/mysqlschema.php +++ b/lib/mysqlschema.php @@ -333,7 +333,7 @@ class MysqlSchema extends Schema } if (empty($name)) { - $name = "$table_".implode("_", $columnNames)."_idx"; + $name = "{$table}_".implode("_", $columnNames)."_idx"; } $res = $this->conn->query("ALTER TABLE $table ". diff --git a/lib/noticelist.php b/lib/noticelist.php index dbc5bfb519..529d6a3f90 100644 --- a/lib/noticelist.php +++ b/lib/noticelist.php @@ -499,7 +499,7 @@ class NoticeListItem extends Widget $ns = $this->notice->getSource(); if ($ns) { - $source_name = (empty($ns->name)) ? _($ns->code) : _($ns->name); + $source_name = (empty($ns->name)) ? ($ns->code ? _($ns->code) : _('web')) : _($ns->name); $this->out->text(' '); $this->out->elementStart('span', 'source'); // FIXME: probably i18n issue. If "from" is followed by text, that should be a parameter to "from" (from %s). diff --git a/lib/statusnet.php b/lib/statusnet.php index ac5d101342..ff0502915a 100644 --- a/lib/statusnet.php +++ b/lib/statusnet.php @@ -141,7 +141,7 @@ class StatusNet return true; } - $sn = Status_network::staticGet($nickname); + $sn = Status_network::staticGet('nickname', $nickname); if (empty($sn)) { return false; throw new Exception("No such site nickname '$nickname'"); diff --git a/lib/stompqueuemanager.php b/lib/stompqueuemanager.php index 91faa8c367..fc98c77d40 100644 --- a/lib/stompqueuemanager.php +++ b/lib/stompqueuemanager.php @@ -649,7 +649,7 @@ class StompQueueManager extends QueueManager */ protected function updateSiteConfig($nickname) { - $sn = Status_network::staticGet($nickname); + $sn = Status_network::staticGet('nickname', $nickname); if ($sn) { $this->switchSite($nickname); if (!in_array($nickname, $this->sites)) { diff --git a/locale/af/LC_MESSAGES/statusnet.po b/locale/af/LC_MESSAGES/statusnet.po index 2e4b6b0574..cf8caed596 100644 --- a/locale/af/LC_MESSAGES/statusnet.po +++ b/locale/af/LC_MESSAGES/statusnet.po @@ -8,12 +8,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-07 16:23+0000\n" -"PO-Revision-Date: 2010-08-07 16:23:59+0000\n" +"POT-Creation-Date: 2010-08-11 10:11+0000\n" +"PO-Revision-Date: 2010-08-11 10:11:11+0000\n" "Language-Team: Afrikaans\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70848); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: af\n" "X-Message-Group: out-statusnet\n" @@ -85,9 +85,8 @@ msgstr "Stoor" #. TRANS: Server error when page not found (404) #: actions/all.php:68 actions/public.php:98 actions/replies.php:93 #: actions/showfavorites.php:138 actions/tag.php:52 -#, fuzzy msgid "No such page." -msgstr "Hierdie bladsy bestaan nie" +msgstr "Hierdie bladsy bestaan nie." #: actions/all.php:79 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:114 @@ -355,7 +354,6 @@ msgstr "" "Dit was nie moontlik om die boodskap van u gunstelinge te verwyder nie." #: actions/apifriendshipscreate.php:109 -#, fuzzy msgid "Could not follow user: profile not found." msgstr "U kan nie die gebruiker volg nie: die gebruiker bestaan nie." @@ -379,12 +377,14 @@ msgid "Two valid IDs or screen_names must be supplied." msgstr "" #: actions/apifriendshipsshow.php:134 +#, fuzzy msgid "Could not determine source user." -msgstr "" +msgstr "Kon nie die gebruiker opdateer nie." #: actions/apifriendshipsshow.php:142 +#, fuzzy msgid "Could not find target user." -msgstr "" +msgstr "Kon nie die gebruiker opdateer nie." #: actions/apigroupcreate.php:167 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 @@ -458,7 +458,7 @@ msgstr "Die alias kan nie dieselfde as die gebruikersnaam wees nie." #: actions/apigroupshow.php:83 actions/apitimelinegroup.php:92 #, fuzzy msgid "Group not found." -msgstr "Groep nie gevind nie!" +msgstr "Nie gevind nie." #: actions/apigroupjoin.php:111 actions/joingroup.php:100 msgid "You are already a member of that group." @@ -469,18 +469,18 @@ msgid "You have been blocked from that group by the admin." msgstr "" #: actions/apigroupjoin.php:139 actions/joingroup.php:134 -#, php-format +#, fuzzy, php-format msgid "Could not join user %1$s to group %2$s." -msgstr "" +msgstr "Dit was nie moontlik om die groep by te werk nie." #: actions/apigroupleave.php:115 msgid "You are not a member of this group." -msgstr "" +msgstr "U is nie 'n lid van die groep nie." #: actions/apigroupleave.php:125 actions/leavegroup.php:129 -#, php-format +#, fuzzy, php-format msgid "Could not remove user %1$s from group %2$s." -msgstr "" +msgstr "Kon nie die groep skep nie." #. TRANS: %s is a user name #: actions/apigrouplist.php:98 @@ -542,8 +542,9 @@ msgid "Invalid nickname / password!" msgstr "Ongeldige gebruikersnaam of wagwoord!" #: actions/apioauthauthorize.php:159 +#, fuzzy msgid "Database error deleting OAuth application user." -msgstr "" +msgstr "Moenie die applikasie verwyder nie" #: actions/apioauthauthorize.php:185 msgid "Database error inserting OAuth application user." @@ -678,14 +679,14 @@ msgid "%1$s / Favorites from %2$s" msgstr "%1$s / Gunstelinge van %2$s" #: actions/apitimelinefavorites.php:119 -#, php-format +#, fuzzy, php-format msgid "%1$s updates favorited by %2$s / %2$s." -msgstr "" +msgstr "%1$s / Gunstelinge van %2$s" #: actions/apitimelinementions.php:118 -#, php-format +#, fuzzy, php-format msgid "%1$s / Updates mentioning %2$s" -msgstr "" +msgstr "%1$s / Gunstelinge van %2$s" #: actions/apitimelinementions.php:131 #, php-format @@ -693,9 +694,9 @@ msgid "%1$s updates that reply to updates from %2$s / %3$s." msgstr "" #: actions/apitimelinepublic.php:197 actions/publicrss.php:103 -#, php-format +#, fuzzy, php-format msgid "%s public timeline" -msgstr "" +msgstr "%s tydlyn" #: actions/apitimelinepublic.php:202 actions/publicrss.php:105 #, php-format @@ -713,18 +714,19 @@ msgid "Repeats of %s" msgstr "Herhalings van %s" #: actions/apitimelinetag.php:105 actions/tag.php:67 -#, php-format +#, fuzzy, php-format msgid "Notices tagged with %s" -msgstr "" +msgstr "met die etiket %s" #: actions/apitimelinetag.php:107 actions/tagrss.php:65 -#, php-format +#, fuzzy, php-format msgid "Updates tagged with %1$s on %2$s!" -msgstr "" +msgstr "Opdaterings van %1$s op %2$s." #: actions/apitrends.php:87 +#, fuzzy msgid "API method under construction." -msgstr "" +msgstr "Die API-funksie is nie gevind nie." #: actions/attachment.php:73 msgid "No such attachment." @@ -759,8 +761,9 @@ msgstr "" #: actions/avatarsettings.php:106 actions/avatarsettings.php:185 #: actions/grouplogo.php:181 actions/remotesubscribe.php:191 #: actions/userauthorization.php:72 actions/userrss.php:108 +#, fuzzy msgid "User without matching profile." -msgstr "" +msgstr "Hierdie gebruiker het nie 'n profiel nie." #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 #: actions/grouplogo.php:254 @@ -778,7 +781,7 @@ msgid "Preview" msgstr "Voorskou" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:656 +#: lib/deleteuserform.php:66 lib/noticelist.php:657 msgid "Delete" msgstr "Skrap" @@ -837,7 +840,6 @@ msgstr "" #: actions/block.php:153 actions/deleteapplication.php:154 #: actions/deletenotice.php:147 actions/deleteuser.php:152 #: actions/groupblock.php:178 -#, fuzzy msgctxt "BUTTON" msgid "No" msgstr "Nee" @@ -856,7 +858,6 @@ msgstr "Moenie hierdie gebruiker blokkeer nie" #: actions/block.php:160 actions/deleteapplication.php:161 #: actions/deletenotice.php:154 actions/deleteuser.php:159 #: actions/groupblock.php:185 -#, fuzzy msgctxt "BUTTON" msgid "Yes" msgstr "Ja" @@ -885,18 +886,19 @@ msgid "No such group." msgstr "Die groep bestaan nie." #: actions/blockedfromgroup.php:97 -#, php-format +#, fuzzy, php-format msgid "%s blocked profiles" -msgstr "" +msgstr "%s geblokkeerde gebruikers" #: actions/blockedfromgroup.php:100 -#, php-format +#, fuzzy, php-format msgid "%1$s blocked profiles, page %2$d" -msgstr "" +msgstr "%1$s en vriende, bladsy %2$d" #: actions/blockedfromgroup.php:115 +#, fuzzy msgid "A list of the users blocked from joining this group." -msgstr "" +msgstr "Blok hierdie gebruiker van hierdie groep" #: actions/blockedfromgroup.php:288 msgid "Unblock user from group" @@ -914,19 +916,21 @@ msgstr "Deblokkeer hierdie gebruiker" #: actions/bookmarklet.php:51 #, fuzzy, php-format msgid "Post to %s" -msgstr "Stuur aan " +msgstr "groepe op %s" #: actions/confirmaddress.php:75 msgid "No confirmation code." msgstr "Geen bevestigingskode." #: actions/confirmaddress.php:80 +#, fuzzy msgid "Confirmation code not found." -msgstr "" +msgstr "Geen bevestigingskode." #: actions/confirmaddress.php:85 +#, fuzzy msgid "That confirmation code is not for you!" -msgstr "" +msgstr "Geen bevestigingskode." #. TRANS: Server error for an unknow address type, which can be 'email', 'jabber', or 'sms'. #: actions/confirmaddress.php:91 @@ -936,8 +940,9 @@ msgstr "" #. TRANS: Client error for an already confirmed email/jabbel/sms address. #: actions/confirmaddress.php:96 +#, fuzzy msgid "That address has already been confirmed." -msgstr "" +msgstr "Die E-posadres bestaan reeds." #. TRANS: Server error thrown on database error updating e-mail preferences. #. TRANS: Server error thrown on database error removing a registered e-mail address. @@ -958,7 +963,7 @@ msgstr "Kon nie gebruiker opdateer nie." #: actions/confirmaddress.php:128 actions/emailsettings.php:433 #: actions/smssettings.php:422 msgid "Couldn't delete email confirmation." -msgstr "" +msgstr "Kon nie e-posbevestiging verwyder nie." #: actions/confirmaddress.php:146 msgid "Confirm address" @@ -980,7 +985,7 @@ msgstr "Kennisgewings" #: actions/deleteapplication.php:63 msgid "You must be logged in to delete an application." -msgstr "" +msgstr "U moet aangeteken alvorens u 'n aansoek kan skrap." #: actions/deleteapplication.php:71 msgid "Application not found." @@ -1053,7 +1058,7 @@ msgid "Do not delete this notice" msgstr "Moenie hierdie kennisgewing verwyder nie" #. TRANS: Submit button title for 'Yes' when deleting a notice. -#: actions/deletenotice.php:158 lib/noticelist.php:656 +#: actions/deletenotice.php:158 lib/noticelist.php:657 msgid "Delete this notice" msgstr "Verwyder hierdie kennisgewing" @@ -1098,7 +1103,7 @@ msgstr "Die logo-URL is ongeldig." #: actions/designadminpanel.php:322 #, fuzzy, php-format msgid "Theme not available: %s." -msgstr "Tema is nie beskikbaar nie: %s" +msgstr "IM is nie beskikbaar nie." #: actions/designadminpanel.php:426 msgid "Change logo" @@ -1156,12 +1161,14 @@ msgid "Off" msgstr "Af" #: actions/designadminpanel.php:545 lib/designsettings.php:156 +#, fuzzy msgid "Turn background image on or off." -msgstr "" +msgstr "Verander die agtergrond-prent" #: actions/designadminpanel.php:550 lib/designsettings.php:161 +#, fuzzy msgid "Tile background image" -msgstr "" +msgstr "Verander die agtergrond-prent" #: actions/designadminpanel.php:564 lib/designsettings.php:170 msgid "Change colours" @@ -1185,7 +1192,7 @@ msgstr "Skakels" #: actions/designadminpanel.php:651 msgid "Advanced" -msgstr "" +msgstr "Gevorderd" #: actions/designadminpanel.php:655 msgid "Custom CSS" @@ -1196,8 +1203,9 @@ msgid "Use defaults" msgstr "Gebruik verstekwaardes" #: actions/designadminpanel.php:677 lib/designsettings.php:248 +#, fuzzy msgid "Restore default designs" -msgstr "" +msgstr "Gebruik verstekwaardes" #: actions/designadminpanel.php:683 lib/designsettings.php:254 msgid "Reset back to default" @@ -1368,7 +1376,6 @@ msgstr "Huidige bevestigde e-posadres." #: actions/emailsettings.php:115 actions/emailsettings.php:158 #: actions/imsettings.php:116 actions/smssettings.php:124 #: actions/smssettings.php:180 -#, fuzzy msgctxt "BUTTON" msgid "Remove" msgstr "Verwyder" @@ -1385,7 +1392,6 @@ msgstr "" #. TRANS: Button label #: actions/emailsettings.php:127 actions/imsettings.php:131 #: actions/smssettings.php:137 lib/applicationeditform.php:357 -#, fuzzy msgctxt "BUTTON" msgid "Cancel" msgstr "Kanselleer" @@ -1400,7 +1406,6 @@ msgstr "E-posadres, soos \"UserName@example.org\"" #. TRANS: Button label for adding a SMS phone number in SMS settings form. #: actions/emailsettings.php:139 actions/imsettings.php:148 #: actions/smssettings.php:162 -#, fuzzy msgctxt "BUTTON" msgid "Add" msgstr "Voeg by" @@ -1426,7 +1431,6 @@ msgstr "" #. TRANS: Button label for adding an e-mail address to send notices from. #. TRANS: Button label for adding an SMS e-mail address to send notices from. #: actions/emailsettings.php:168 actions/smssettings.php:189 -#, fuzzy msgctxt "BUTTON" msgid "New" msgstr "Nuut" @@ -1435,7 +1439,7 @@ msgstr "Nuut" #: actions/emailsettings.php:174 #, fuzzy msgid "Email preferences" -msgstr "Voorkeure" +msgstr "E-posadresse" #. TRANS: Checkbox label in e-mail preferences form. #: actions/emailsettings.php:180 @@ -1469,8 +1473,9 @@ msgstr "" #. TRANS: Checkbox label in e-mail preferences form. #: actions/emailsettings.php:219 +#, fuzzy msgid "Publish a MicroID for my email address." -msgstr "" +msgstr "Dit is nie u e-posadres nie." #. TRANS: Confirmation message for successful e-mail preferences save. #: actions/emailsettings.php:334 @@ -1485,8 +1490,9 @@ msgstr "Geen e-posadres." #. TRANS: Message given saving e-mail address that cannot be normalised. #: actions/emailsettings.php:361 +#, fuzzy msgid "Cannot normalize that email address" -msgstr "" +msgstr "Dit was nie moontlik om die Jabber-ID te normaliseer nie" #. TRANS: Message given saving e-mail address that not valid. #: actions/emailsettings.php:366 actions/register.php:208 @@ -1501,16 +1507,18 @@ msgstr "Dit is al reeds u e-posadres." #. TRANS: Message given saving e-mail address that is already set for another user. #: actions/emailsettings.php:374 +#, fuzzy msgid "That email address already belongs to another user." -msgstr "" +msgstr "Die Jabber-ID word reeds deur 'n ander gebruiker gebruik." #. TRANS: Server error thrown on database error adding e-mail confirmation code. #. TRANS: Server error thrown on database error adding IM confirmation code. #. TRANS: Server error thrown on database error adding SMS confirmation code. #: actions/emailsettings.php:391 actions/imsettings.php:348 #: actions/smssettings.php:373 +#, fuzzy msgid "Couldn't insert confirmation code." -msgstr "" +msgstr "Geen bevestigingskode." #. TRANS: Message given saving valid e-mail address that is to be confirmed. #: actions/emailsettings.php:398 @@ -1524,8 +1532,9 @@ msgstr "" #. TRANS: Message given canceling SMS phone number confirmation that is not pending. #: actions/emailsettings.php:419 actions/imsettings.php:383 #: actions/smssettings.php:408 +#, fuzzy msgid "No pending confirmation to cancel." -msgstr "" +msgstr "Geen bevestigingskode." #. TRANS: Message given canceling e-mail address confirmation for the wrong e-mail address. #: actions/emailsettings.php:424 @@ -1537,7 +1546,7 @@ msgstr "Dit is die verkeerde IM-adres." #: actions/emailsettings.php:438 #, fuzzy msgid "Email confirmation cancelled." -msgstr "Bevestiging gekanselleer." +msgstr "Geen bevestigingskode." #. TRANS: Message given trying to remove an e-mail address that is not #. TRANS: registered for the active user. @@ -1549,7 +1558,7 @@ msgstr "Dit is nie u e-posadres nie." #: actions/emailsettings.php:479 #, fuzzy msgid "The email address was removed." -msgstr "Die adres is verwyder." +msgstr "Inkomende e-posadres is verwyder." #: actions/emailsettings.php:493 actions/smssettings.php:568 msgid "No incoming email address." @@ -1569,16 +1578,19 @@ msgstr "Inkomende e-posadres is verwyder." #. TRANS: Message given after successfully adding an incoming e-mail address. #: actions/emailsettings.php:532 actions/smssettings.php:605 +#, fuzzy msgid "New incoming email address added." -msgstr "" +msgstr "Geen inkomende e-posadres." #: actions/favor.php:79 +#, fuzzy msgid "This notice is already a favorite!" -msgstr "" +msgstr "Hierdie kennisgewing is nie 'n gunsteling nie!" #: actions/favor.php:92 lib/disfavorform.php:140 +#, fuzzy msgid "Disfavor favorite" -msgstr "" +msgstr "Voeg by gunstelinge" #: actions/favorited.php:65 lib/popularnoticesection.php:91 #: lib/publicgroupnav.php:93 @@ -1618,9 +1630,9 @@ msgid "%s's favorite notices" msgstr "%s se gunsteling kennisgewings" #: actions/favoritesrss.php:115 -#, php-format +#, fuzzy, php-format msgid "Updates favored by %1$s on %2$s!" -msgstr "" +msgstr "Opdaterings van %1$s op %2$s." #: actions/featured.php:69 lib/featureduserssection.php:87 #: lib/publicgroupnav.php:89 @@ -1650,8 +1662,9 @@ msgid "No attachments." msgstr "Geen aanhangsels." #: actions/file.php:51 +#, fuzzy msgid "No uploaded attachments." -msgstr "" +msgstr "Geen aanhangsels." #: actions/finishremotesubscribe.php:69 msgid "Not expecting this response!" @@ -1662,8 +1675,9 @@ msgid "User being listened to does not exist." msgstr "" #: actions/finishremotesubscribe.php:87 actions/remotesubscribe.php:59 +#, fuzzy msgid "You can use the local subscription!" -msgstr "" +msgstr "U kan slegs lokale gebruikers verwyder." #: actions/finishremotesubscribe.php:99 msgid "That user has blocked you from subscribing." @@ -1703,12 +1717,14 @@ msgid "This role is reserved and cannot be set." msgstr "" #: actions/grantrole.php:75 +#, fuzzy msgid "You cannot grant user roles on this site." -msgstr "" +msgstr "Jy kan nie gebruikers op hierdie webwerf stilmaak nie." #: actions/grantrole.php:82 +#, fuzzy msgid "User already has this role." -msgstr "" +msgstr "Hierdie gebruiker is reeds stilgemaak." #: actions/groupblock.php:71 actions/groupunblock.php:71 #: actions/makeadmin.php:71 actions/subedit.php:46 @@ -1732,12 +1748,14 @@ msgid "Only an admin can block group members." msgstr "" #: actions/groupblock.php:95 +#, fuzzy msgid "User is already blocked from group." -msgstr "" +msgstr "Hierdie gebruiker is reeds stilgemaak." #: actions/groupblock.php:100 +#, fuzzy msgid "User is not a member of group." -msgstr "" +msgstr "U is nie 'n lid van die groep nie." #: actions/groupblock.php:134 actions/groupmembers.php:360 msgid "Block user from group" @@ -1753,8 +1771,9 @@ msgstr "" #. TRANS: Submit button title for 'No' when blocking a user from a group. #: actions/groupblock.php:182 +#, fuzzy msgid "Do not block this user from this group" -msgstr "" +msgstr "Blok hierdie gebruiker van hierdie groep" #. TRANS: Submit button title for 'Yes' when blocking a user from a group. #: actions/groupblock.php:189 @@ -1762,20 +1781,23 @@ msgid "Block this user from this group" msgstr "Blok hierdie gebruiker van hierdie groep" #: actions/groupblock.php:206 +#, fuzzy msgid "Database error blocking user from group." -msgstr "" +msgstr "Gee gebruiker weer toegang tot die groep" #: actions/groupbyid.php:74 actions/userbyid.php:70 msgid "No ID." msgstr "Geen ID." #: actions/groupdesignsettings.php:68 +#, fuzzy msgid "You must be logged in to edit a group." -msgstr "" +msgstr "U moet aangeteken wees alvorens u 'n groep kan skep." #: actions/groupdesignsettings.php:144 +#, fuzzy msgid "Group design" -msgstr "" +msgstr "Groepe" #: actions/groupdesignsettings.php:155 msgid "" @@ -1785,12 +1807,14 @@ msgstr "" #: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 +#, fuzzy msgid "Couldn't update your design." -msgstr "" +msgstr "Dit was nie moontlik om u ontwerp by te werk nie." #: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 +#, fuzzy msgid "Design preferences saved." -msgstr "" +msgstr "Voorkeure is gestoor." #: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" @@ -1820,13 +1844,14 @@ msgid "%s group members" msgstr "lede van die groep %s" #: actions/groupmembers.php:103 -#, php-format +#, fuzzy, php-format msgid "%1$s group members, page %2$d" -msgstr "" +msgstr "%1$s groepe, bladsy %2$d" #: actions/groupmembers.php:118 +#, fuzzy msgid "A list of the users in this group." -msgstr "" +msgstr "Blok hierdie gebruiker van hierdie groep" #: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" @@ -1837,8 +1862,9 @@ msgid "Block" msgstr "Blokkeer" #: actions/groupmembers.php:487 +#, fuzzy msgid "Make user an admin of the group" -msgstr "" +msgstr "U moet 'n administrateur wees alvorens u 'n groep kan wysig." #: actions/groupmembers.php:519 msgid "Make Admin" @@ -1859,9 +1885,9 @@ msgstr "%s tydlyn" #. TRANS: Message is used as link description. %1$s is a username, %2$s is a site name. #: actions/grouprss.php:142 -#, php-format +#, fuzzy, php-format msgid "Updates from members of %1$s on %2$s!" -msgstr "" +msgstr "Opdaterings van %1$s op %2$s." #: actions/groups.php:62 lib/profileaction.php:223 lib/profileaction.php:249 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98 @@ -1895,8 +1921,9 @@ msgid "" msgstr "" #: actions/groupsearch.php:58 +#, fuzzy msgid "Group search" -msgstr "" +msgstr "Soek gebruikers" #: actions/groupsearch.php:79 actions/noticesearch.php:117 #: actions/peoplesearch.php:83 @@ -1922,8 +1949,9 @@ msgid "Only an admin can unblock group members." msgstr "" #: actions/groupunblock.php:95 +#, fuzzy msgid "User is not blocked from group." -msgstr "" +msgstr "Gee gebruiker weer toegang tot die groep" #: actions/groupunblock.php:128 actions/unblock.php:86 msgid "Error removing the block." @@ -1956,8 +1984,9 @@ msgid "IM address" msgstr "IP-adres" #: actions/imsettings.php:113 +#, fuzzy msgid "Current confirmed Jabber/GTalk address." -msgstr "" +msgstr "Huidige bevestigde e-posadres." #. TRANS: Form note in IM settings form. #. TRANS: %s is the IM address set for the site. @@ -1981,7 +2010,7 @@ msgstr "" #: actions/imsettings.php:155 #, fuzzy msgid "IM preferences" -msgstr "Voorkeure" +msgstr "Voorkeure is gestoor." #. TRANS: Checkbox label in IM preferences form. #: actions/imsettings.php:160 @@ -2051,14 +2080,13 @@ msgstr "Dit is die verkeerde IM-adres." #: actions/imsettings.php:397 #, fuzzy msgid "Couldn't delete IM confirmation." -msgstr "" -"Dit was nie moontlik om die boodskap van u gunstelinge te verwyder nie." +msgstr "Kon nie e-posbevestiging verwyder nie." #. TRANS: Message given after successfully canceling IM address confirmation. #: actions/imsettings.php:402 #, fuzzy msgid "IM confirmation cancelled." -msgstr "Bevestiging gekanselleer." +msgstr "Geen bevestigingskode." #. TRANS: Message given trying to remove an IM address that is not #. TRANS: registered for the active user. @@ -2070,17 +2098,17 @@ msgstr "Dit is nie u Jabber-ID nie." #: actions/imsettings.php:447 #, fuzzy msgid "The IM address was removed." -msgstr "Die adres is verwyder." +msgstr "Inkomende e-posadres is verwyder." #: actions/inbox.php:59 -#, php-format +#, fuzzy, php-format msgid "Inbox for %1$s - page %2$d" -msgstr "" +msgstr "%1$s, bladsy %2$d" #: actions/inbox.php:62 -#, php-format +#, fuzzy, php-format msgid "Inbox for %s" -msgstr "" +msgstr "Vriend van 'n vriend (FOAF) vir %s" #: actions/inbox.php:115 msgid "This is your inbox, which lists your incoming private messages." @@ -2101,16 +2129,18 @@ msgid "Invalid email address: %s" msgstr "Ongeldige e-posadres: %s" #: actions/invite.php:110 +#, fuzzy msgid "Invitation(s) sent" -msgstr "" +msgstr "Uitnodigings" #: actions/invite.php:112 msgid "Invite new users" msgstr "Nooi nuwe gebruikers" #: actions/invite.php:128 +#, fuzzy msgid "You are already subscribed to these users:" -msgstr "" +msgstr "U volg hierdie gebruiker:" #. TRANS: Whois output. #. TRANS: %1$s nickname of the queried user, %2$s is their profile URL. @@ -2283,9 +2313,9 @@ msgid "Only an admin can make another user an admin." msgstr "" #: actions/makeadmin.php:96 -#, php-format +#, fuzzy, php-format msgid "%1$s is already an admin for group \"%2$s\"." -msgstr "" +msgstr "%1$s het die groep %2$s verlaat" #: actions/makeadmin.php:133 #, php-format @@ -2300,19 +2330,21 @@ msgstr "" #: actions/microsummary.php:69 #, fuzzy msgid "No current status." -msgstr "Geen huidige status" +msgstr "Geen resultate nie." #: actions/newapplication.php:52 msgid "New Application" msgstr "Nuwe appplikasie" #: actions/newapplication.php:64 +#, fuzzy msgid "You must be logged in to register an application." -msgstr "" +msgstr "U moet aangeteken wees alvorens u 'n applikasie kan wysig." #: actions/newapplication.php:143 +#, fuzzy msgid "Use this form to register a new application." -msgstr "" +msgstr "Gebruik die vorm om u applikasie te wysig." #: actions/newapplication.php:176 msgid "Source URL is required." @@ -2327,8 +2359,9 @@ msgid "New group" msgstr "Nuwe groep" #: actions/newgroup.php:110 +#, fuzzy msgid "Use this form to create a new group." -msgstr "" +msgstr "Gebruik hierdie vorm om die groep te wysig." #: actions/newmessage.php:71 actions/newmessage.php:231 msgid "New message" @@ -2357,21 +2390,23 @@ msgid "Message sent" msgstr "Boodskap is gestuur." #: actions/newmessage.php:185 -#, php-format +#, fuzzy, php-format msgid "Direct message to %s sent." -msgstr "" +msgstr "Direkte boodskappe aan %s" #: actions/newmessage.php:210 actions/newnotice.php:251 lib/channel.php:189 msgid "Ajax Error" msgstr "Ajax-fout" #: actions/newnotice.php:69 +#, fuzzy msgid "New notice" -msgstr "" +msgstr "Geen kennisgewing." #: actions/newnotice.php:217 +#, fuzzy msgid "Notice posted" -msgstr "" +msgstr "Hierdie kennisgewing is verwyder." #: actions/noticesearch.php:68 #, php-format @@ -2385,9 +2420,9 @@ msgid "Text search" msgstr "Teks soektog" #: actions/noticesearch.php:91 -#, php-format +#, fuzzy, php-format msgid "Search results for \"%1$s\" on %2$s" -msgstr "" +msgstr "Opdaterings van %1$s op %2$s." #: actions/noticesearch.php:121 #, php-format @@ -2409,9 +2444,9 @@ msgid "Updates with \"%s\"" msgstr "Opdaterings met \"%s\"" #: actions/noticesearchrss.php:98 -#, php-format +#, fuzzy, php-format msgid "Updates matching search term \"%1$s\" on %2$s!" -msgstr "" +msgstr "Opdaterings van %1$s op %2$s." #: actions/nudge.php:85 msgid "" @@ -2427,33 +2462,37 @@ msgid "Nudge sent!" msgstr "Die por is gestuur!" #: actions/oauthappssettings.php:59 +#, fuzzy msgid "You must be logged in to list your applications." -msgstr "" +msgstr "U moet aangeteken wees alvorens u 'n applikasie kan wysig." #: actions/oauthappssettings.php:74 +#, fuzzy msgid "OAuth applications" -msgstr "" +msgstr "Die applikasie bestaan nie." #: actions/oauthappssettings.php:85 msgid "Applications you have registered" msgstr "" #: actions/oauthappssettings.php:135 -#, php-format +#, fuzzy, php-format msgid "You have not registered any applications yet." -msgstr "" +msgstr "Dit was nie moontlik om die applikasie te skep nie." #: actions/oauthconnectionssettings.php:72 +#, fuzzy msgid "Connected applications" -msgstr "" +msgstr "Skrap applikasie" #: actions/oauthconnectionssettings.php:83 msgid "You have allowed the following applications to access you account." msgstr "" #: actions/oauthconnectionssettings.php:175 +#, fuzzy msgid "You are not a user of that application." -msgstr "" +msgstr "U is nie die eienaar van hierdie applikasie nie." #: actions/oauthconnectionssettings.php:186 #, php-format @@ -2493,20 +2532,23 @@ msgstr "" #. TRANS: Client error on an API request with an unsupported data format. #: actions/oembed.php:184 actions/oembed.php:203 lib/apiaction.php:1204 #: lib/apiaction.php:1232 lib/apiaction.php:1355 +#, fuzzy msgid "Not a supported data format." -msgstr "" +msgstr "Nie-ondersteunde formaat." #: actions/opensearch.php:64 msgid "People Search" msgstr "Mense soek" #: actions/opensearch.php:67 +#, fuzzy msgid "Notice Search" -msgstr "" +msgstr "Mense soek" #: actions/othersettings.php:60 +#, fuzzy msgid "Other settings" -msgstr "" +msgstr "Avatar-instellings" #: actions/othersettings.php:71 msgid "Manage various other options." @@ -2525,46 +2567,52 @@ msgid "Automatic shortening service to use." msgstr "" #: actions/othersettings.php:122 +#, fuzzy msgid "View profile designs" -msgstr "" +msgstr "Wysig profiel-instellings" #: actions/othersettings.php:123 msgid "Show or hide profile designs." msgstr "" #: actions/othersettings.php:153 +#, fuzzy msgid "URL shortening service is too long (max 50 chars)." -msgstr "" +msgstr "Ligging is te lank is (maksimum 255 karakters)." #: actions/otp.php:69 +#, fuzzy msgid "No user ID specified." -msgstr "" +msgstr "Geen groep verskaf nie." #: actions/otp.php:83 +#, fuzzy msgid "No login token specified." -msgstr "" +msgstr "Geen profiel verskaf nie." #: actions/otp.php:90 msgid "No login token requested." msgstr "" #: actions/otp.php:95 +#, fuzzy msgid "Invalid login token specified." -msgstr "" +msgstr "Ongeldige token." #: actions/otp.php:104 +#, fuzzy msgid "Login token expired." -msgstr "" +msgstr "Teken aan" #: actions/outbox.php:58 -#, php-format +#, fuzzy, php-format msgid "Outbox for %1$s - page %2$d" -msgstr "" +msgstr "%1$s, bladsy %2$d" #: actions/outbox.php:61 -#, php-format +#, fuzzy, php-format msgid "Outbox for %s" -msgstr "" +msgstr "Vriend van 'n vriend (FOAF) vir %s" #: actions/outbox.php:116 msgid "This is your outbox, which lists private messages you have sent." @@ -2643,7 +2691,7 @@ msgstr "" #: actions/pathsadminpanel.php:157 #, fuzzy, php-format msgid "Theme directory not readable: %s." -msgstr "Tema is nie beskikbaar nie: %s" +msgstr "Tema-gids" #: actions/pathsadminpanel.php:163 #, fuzzy, php-format @@ -2681,8 +2729,9 @@ msgid "Path" msgstr "Pad" #: actions/pathsadminpanel.php:242 +#, fuzzy msgid "Site path" -msgstr "" +msgstr "Werf se tema" #: actions/pathsadminpanel.php:246 msgid "Path to locales" @@ -2781,8 +2830,9 @@ msgid "Server to direct SSL requests to" msgstr "" #: actions/pathsadminpanel.php:352 +#, fuzzy msgid "Save paths" -msgstr "" +msgstr "Tema-pad" #: actions/peoplesearch.php:52 #, php-format @@ -2816,8 +2866,9 @@ msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’. msgstr "" #: actions/profilesettings.php:60 +#, fuzzy msgid "Profile settings" -msgstr "" +msgstr "Wysig profiel-instellings" #: actions/profilesettings.php:71 msgid "" @@ -2829,8 +2880,11 @@ msgid "Profile information" msgstr "" #: actions/profilesettings.php:108 lib/groupeditform.php:154 +#, fuzzy msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "" +"Die gebruikersnaam mag slegs uit kleinletters en syfers bestaan en mag geen " +"spasies bevat nie." #: actions/profilesettings.php:111 actions/register.php:455 #: actions/showgroup.php:256 actions/tagother.php:104 @@ -2909,17 +2963,18 @@ msgid "" msgstr "" #: actions/profilesettings.php:228 actions/register.php:230 -#, php-format +#, fuzzy, php-format msgid "Bio is too long (max %d chars)." -msgstr "" +msgstr "Die beskrywing is te lank (die maksimum is %d karakters)." #: actions/profilesettings.php:235 actions/siteadminpanel.php:151 msgid "Timezone not selected." msgstr "" #: actions/profilesettings.php:241 +#, fuzzy msgid "Language is too long (max 50 chars)." -msgstr "" +msgstr "Die naam is te lank (maksimum 255 karakters)." #: actions/profilesettings.php:253 actions/tagother.php:178 #, php-format @@ -2927,20 +2982,24 @@ msgid "Invalid tag: \"%s\"" msgstr "Ongeldige etiket: \"$s\"" #: actions/profilesettings.php:306 +#, fuzzy msgid "Couldn't update user for autosubscribe." -msgstr "" +msgstr "Kon nie gebruikersdata opdateer nie." #: actions/profilesettings.php:363 +#, fuzzy msgid "Couldn't save location prefs." -msgstr "" +msgstr "Dit was nie moontlik om die applikasie by te werk nie." #: actions/profilesettings.php:375 +#, fuzzy msgid "Couldn't save profile." -msgstr "" +msgstr "Kon nie die profiel stoor nie." #: actions/profilesettings.php:383 +#, fuzzy msgid "Couldn't save tags." -msgstr "" +msgstr "Kon nie gebruiker opdateer nie." #. TRANS: Message after successful saving of administrative settings. #: actions/profilesettings.php:391 lib/adminpanelaction.php:141 @@ -2953,17 +3012,19 @@ msgid "Beyond the page limit (%s)." msgstr "" #: actions/public.php:92 +#, fuzzy msgid "Could not retrieve public stream." -msgstr "" +msgstr "Dit was nie moontlik om die aliasse te skep nie." #: actions/public.php:130 -#, php-format +#, fuzzy, php-format msgid "Public timeline, page %d" -msgstr "" +msgstr "Populêre kennisgewings, bladsy %d" #: actions/public.php:132 lib/publicgroupnav.php:79 +#, fuzzy msgid "Public timeline" -msgstr "" +msgstr "%s tydlyn" #: actions/public.php:160 msgid "Public Stream Feed (RSS 1.0)" @@ -2978,11 +3039,13 @@ msgid "Public Stream Feed (Atom)" msgstr "" #: actions/public.php:188 -#, php-format +#, fuzzy, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " "yet." msgstr "" +"Hierdie is die tydslyn vir %s en vriende, maar niemand het nog iets gepos " +"nie." #: actions/public.php:191 msgid "Be the first to post!" @@ -3026,8 +3089,9 @@ msgid "No one has posted a notice with a [hashtag](%%doc.tags%%) yet." msgstr "" #: actions/publictagcloud.php:72 +#, fuzzy msgid "Be the first to post one!" -msgstr "" +msgstr "U kan die eerste een wees om 'n boodskap te plaas!" #: actions/publictagcloud.php:75 #, php-format @@ -3037,36 +3101,42 @@ msgid "" msgstr "" #: actions/publictagcloud.php:134 +#, fuzzy msgid "Tag cloud" -msgstr "" +msgstr "Verander kleure" #: actions/recoverpassword.php:36 +#, fuzzy msgid "You are already logged in!" -msgstr "" +msgstr "U is reeds aangeteken." #: actions/recoverpassword.php:62 +#, fuzzy msgid "No such recovery code." -msgstr "" +msgstr "Die kennisgewing bestaan nie." #: actions/recoverpassword.php:66 +#, fuzzy msgid "Not a recovery code." -msgstr "" +msgstr "Nie 'n geregistreerde gebruiker nie." #: actions/recoverpassword.php:73 msgid "Recovery code for unknown user." msgstr "" #: actions/recoverpassword.php:86 +#, fuzzy msgid "Error with confirmation code." -msgstr "" +msgstr "Geen bevestigingskode." #: actions/recoverpassword.php:97 msgid "This confirmation code is too old. Please start again." msgstr "" #: actions/recoverpassword.php:111 +#, fuzzy msgid "Could not update user with confirmed email address." -msgstr "" +msgstr "Huidige bevestigde e-posadres." #: actions/recoverpassword.php:152 msgid "" @@ -3079,28 +3149,33 @@ msgid "You have been identified. Enter a new password below. " msgstr "" #: actions/recoverpassword.php:188 +#, fuzzy msgid "Password recovery" -msgstr "" +msgstr "Verander wagwoord" #: actions/recoverpassword.php:191 +#, fuzzy msgid "Nickname or email address" -msgstr "" +msgstr "Geen e-posadres." #: actions/recoverpassword.php:193 msgid "Your nickname on this server, or your registered email address." msgstr "" #: actions/recoverpassword.php:199 actions/recoverpassword.php:200 +#, fuzzy msgid "Recover" -msgstr "" +msgstr "Verwyder" #: actions/recoverpassword.php:208 +#, fuzzy msgid "Reset password" -msgstr "" +msgstr "Nuwe wagwoord" #: actions/recoverpassword.php:209 +#, fuzzy msgid "Recover password" -msgstr "" +msgstr "Nuwe wagwoord" #: actions/recoverpassword.php:210 actions/recoverpassword.php:335 msgid "Password recovery requested" @@ -3111,16 +3186,18 @@ msgid "Unknown action" msgstr "Onbekende aksie" #: actions/recoverpassword.php:236 +#, fuzzy msgid "6 or more characters, and don't forget it!" -msgstr "" +msgstr "6 of meer karakters" #: actions/recoverpassword.php:243 msgid "Reset" msgstr "Herstel" #: actions/recoverpassword.php:252 +#, fuzzy msgid "Enter a nickname or email address." -msgstr "" +msgstr "Dit is nie u e-posadres nie." #: actions/recoverpassword.php:282 msgid "No user with that email address or username." @@ -3131,8 +3208,9 @@ msgid "No registered email address for that user." msgstr "" #: actions/recoverpassword.php:313 +#, fuzzy msgid "Error saving address confirmation." -msgstr "" +msgstr "Fout tydens stoor van gebruiker; ongeldig." #: actions/recoverpassword.php:338 msgid "" @@ -3141,20 +3219,24 @@ msgid "" msgstr "" #: actions/recoverpassword.php:357 +#, fuzzy msgid "Unexpected password reset." -msgstr "" +msgstr "Die vorm is onverwags ingestuur." #: actions/recoverpassword.php:365 +#, fuzzy msgid "Password must be 6 chars or more." -msgstr "" +msgstr "Wagwoord moet 6 of meer karakters bevat." #: actions/recoverpassword.php:369 +#, fuzzy msgid "Password and confirmation do not match." -msgstr "" +msgstr "Wagwoorde is nie dieselfde nie." #: actions/recoverpassword.php:388 actions/register.php:255 +#, fuzzy msgid "Error setting user." -msgstr "" +msgstr "Fout tydens stoor van gebruiker; ongeldig." #: actions/recoverpassword.php:395 msgid "New password successfully saved. You are now logged in." @@ -3203,12 +3285,14 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces. Required." msgstr "" #: actions/register.php:437 +#, fuzzy msgid "6 or more characters. Required." -msgstr "" +msgstr "6 of meer karakters" #: actions/register.php:441 +#, fuzzy msgid "Same as password above. Required." -msgstr "" +msgstr "Dieselfde as wagwoord hierbo" #. TRANS: Link description in user account settings menu. #: actions/register.php:445 actions/register.php:449 @@ -3295,16 +3379,18 @@ msgid "Subscribe to a remote user" msgstr "" #: actions/remotesubscribe.php:129 +#, fuzzy msgid "User nickname" -msgstr "" +msgstr "Geen gebruikersnaam nie." #: actions/remotesubscribe.php:130 msgid "Nickname of the user you want to follow" msgstr "" #: actions/remotesubscribe.php:133 +#, fuzzy msgid "Profile URL" -msgstr "" +msgstr "Profiel" #: actions/remotesubscribe.php:134 msgid "URL of your profile on another compatible microblogging service" @@ -3336,18 +3422,21 @@ msgid "Only logged-in users can repeat notices." msgstr "" #: actions/repeat.php:64 actions/repeat.php:71 +#, fuzzy msgid "No notice specified." -msgstr "" +msgstr "Geen profiel verskaf nie." #: actions/repeat.php:76 +#, fuzzy msgid "You can't repeat your own notice." -msgstr "" +msgstr "U kan nie u eie kennisgewings herhaal nie." #: actions/repeat.php:90 +#, fuzzy msgid "You already repeated that notice." -msgstr "" +msgstr "U het reeds die kennisgewing herhaal." -#: actions/repeat.php:114 lib/noticelist.php:675 +#: actions/repeat.php:114 lib/noticelist.php:676 msgid "Repeated" msgstr "Herhalend" @@ -3357,29 +3446,29 @@ msgstr "Herhaal!" #: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 -#, php-format +#, fuzzy, php-format msgid "Replies to %s" -msgstr "" +msgstr "Herhalings van %s" #: actions/replies.php:128 -#, php-format +#, fuzzy, php-format msgid "Replies to %1$s, page %2$d" -msgstr "" +msgstr "%1$s, bladsy %2$d" #: actions/replies.php:145 -#, php-format +#, fuzzy, php-format msgid "Replies feed for %s (RSS 1.0)" -msgstr "" +msgstr "Voer vir vriende van %s (RSS 1.0)" #: actions/replies.php:152 -#, php-format +#, fuzzy, php-format msgid "Replies feed for %s (RSS 2.0)" -msgstr "" +msgstr "Voer vir vriende van %s (RSS 2.0)" #: actions/replies.php:159 -#, php-format +#, fuzzy, php-format msgid "Replies feed for %s (Atom)" -msgstr "" +msgstr "Voer vir vriende van %s (Atom)" #: actions/replies.php:199 #, fuzzy, php-format @@ -3405,13 +3494,14 @@ msgid "" msgstr "" #: actions/repliesrss.php:72 -#, php-format +#, fuzzy, php-format msgid "Replies to %1$s on %2$s!" -msgstr "" +msgstr "Opdaterings van %1$s op %2$s." #: actions/revokerole.php:75 +#, fuzzy msgid "You cannot revoke user roles on this site." -msgstr "" +msgstr "Jy kan nie gebruikers op hierdie webwerf stilmaak nie." #: actions/revokerole.php:82 msgid "User doesn't have this role." @@ -3422,12 +3512,14 @@ msgid "StatusNet" msgstr "StatusNet" #: actions/sandbox.php:65 actions/unsandbox.php:65 +#, fuzzy msgid "You cannot sandbox users on this site." -msgstr "" +msgstr "Jy kan nie gebruikers op hierdie webwerf stilmaak nie." #: actions/sandbox.php:72 +#, fuzzy msgid "User is already sandboxed." -msgstr "" +msgstr "Hierdie gebruiker is reeds stilgemaak." #. TRANS: Menu item for site administration #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 @@ -3440,8 +3532,9 @@ msgid "Session settings for this StatusNet site." msgstr "" #: actions/sessionsadminpanel.php:175 +#, fuzzy msgid "Handle sessions" -msgstr "" +msgstr "Sessies" #: actions/sessionsadminpanel.php:177 msgid "Whether to handle sessions ourselves." @@ -3457,16 +3550,19 @@ msgstr "" #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292 #: actions/useradminpanel.php:294 +#, fuzzy msgid "Save site settings" -msgstr "" +msgstr "Stoor toegangsinstellings" #: actions/showapplication.php:82 +#, fuzzy msgid "You must be logged in to view an application." -msgstr "" +msgstr "U moet aangeteken wees alvorens u 'n applikasie kan wysig." #: actions/showapplication.php:157 +#, fuzzy msgid "Application profile" -msgstr "" +msgstr "Die applikasie is nie gevind nie." #. TRANS: Form input field label for application icon. #: actions/showapplication.php:159 lib/applicationeditform.php:182 @@ -3501,16 +3597,18 @@ msgid "Created by %1$s - %2$s access by default - %3$d users" msgstr "" #: actions/showapplication.php:213 +#, fuzzy msgid "Application actions" -msgstr "" +msgstr "Die applikasie is nie gevind nie." #: actions/showapplication.php:236 msgid "Reset key & secret" msgstr "" #: actions/showapplication.php:261 +#, fuzzy msgid "Application info" -msgstr "" +msgstr "Die applikasie is nie gevind nie." #: actions/showapplication.php:263 msgid "Consumer key" @@ -3529,8 +3627,9 @@ msgid "Access token URL" msgstr "" #: actions/showapplication.php:283 +#, fuzzy msgid "Authorize URL" -msgstr "" +msgstr "Outeur" #: actions/showapplication.php:288 msgid "" @@ -3539,32 +3638,34 @@ msgid "" msgstr "" #: actions/showapplication.php:309 +#, fuzzy msgid "Are you sure you want to reset your consumer key and secret?" -msgstr "" +msgstr "Is u seker u wil hierdie kennisgewing verwyder?" #: actions/showfavorites.php:79 -#, php-format +#, fuzzy, php-format msgid "%1$s's favorite notices, page %2$d" -msgstr "" +msgstr "%s se gunsteling kennisgewings" #: actions/showfavorites.php:132 +#, fuzzy msgid "Could not retrieve favorite notices." -msgstr "" +msgstr "Dit was nie moontlik om 'n gunsteling te skep nie." #: actions/showfavorites.php:171 -#, php-format +#, fuzzy, php-format msgid "Feed for favorites of %s (RSS 1.0)" -msgstr "" +msgstr "Voer vir vriende van %s (RSS 1.0)" #: actions/showfavorites.php:178 -#, php-format +#, fuzzy, php-format msgid "Feed for favorites of %s (RSS 2.0)" -msgstr "" +msgstr "Voer vir vriende van %s (RSS 2.0)" #: actions/showfavorites.php:185 -#, php-format +#, fuzzy, php-format msgid "Feed for favorites of %s (Atom)" -msgstr "" +msgstr "Voer vir vriende van %s (Atom)" #: actions/showfavorites.php:206 msgid "" @@ -3624,19 +3725,19 @@ msgid "Group actions" msgstr "Groepsaksies" #: actions/showgroup.php:338 -#, php-format +#, fuzzy, php-format msgid "Notice feed for %s group (RSS 1.0)" -msgstr "" +msgstr "Voer vir vriende van %s (RSS 1.0)" #: actions/showgroup.php:344 -#, php-format +#, fuzzy, php-format msgid "Notice feed for %s group (RSS 2.0)" -msgstr "" +msgstr "Voer vir vriende van %s (RSS 2.0)" #: actions/showgroup.php:350 -#, php-format +#, fuzzy, php-format msgid "Notice feed for %s group (Atom)" -msgstr "" +msgstr "Voer vir vriende van %s (Atom)" #: actions/showgroup.php:355 #, php-format @@ -3693,14 +3794,14 @@ msgid "Only the sender and recipient may read this message." msgstr "" #: actions/showmessage.php:108 -#, php-format +#, fuzzy, php-format msgid "Message to %1$s on %2$s" -msgstr "" +msgstr "Opdaterings van %1$s op %2$s." #: actions/showmessage.php:113 -#, php-format +#, fuzzy, php-format msgid "Message from %1$s on %2$s" -msgstr "" +msgstr "Opdaterings van %1$s op %2$s." #: actions/shownotice.php:90 msgid "Notice deleted." @@ -3717,24 +3818,24 @@ msgid "%1$s, page %2$d" msgstr "%1$s, bladsy %2$d" #: actions/showstream.php:122 -#, php-format +#, fuzzy, php-format msgid "Notice feed for %1$s tagged %2$s (RSS 1.0)" -msgstr "" +msgstr "Voer vir vriende van %s (RSS 1.0)" #: actions/showstream.php:129 -#, php-format +#, fuzzy, php-format msgid "Notice feed for %s (RSS 1.0)" -msgstr "" +msgstr "Voer vir vriende van %s (RSS 1.0)" #: actions/showstream.php:136 -#, php-format +#, fuzzy, php-format msgid "Notice feed for %s (RSS 2.0)" -msgstr "" +msgstr "Voer vir vriende van %s (RSS 2.0)" #: actions/showstream.php:143 -#, php-format +#, fuzzy, php-format msgid "Notice feed for %s (Atom)" -msgstr "" +msgstr "Voer vir vriende van %s (Atom)" #: actions/showstream.php:148 #, php-format @@ -3742,9 +3843,11 @@ msgid "FOAF for %s" msgstr "Vriend van 'n vriend (FOAF) vir %s" #: actions/showstream.php:200 -#, php-format +#, fuzzy, php-format msgid "This is the timeline for %1$s but %2$s hasn't posted anything yet." msgstr "" +"Hierdie is die tydslyn vir %s en vriende, maar niemand het nog iets gepos " +"nie." #: actions/showstream.php:205 msgid "" @@ -3798,8 +3901,9 @@ msgid "Site name must have non-zero length." msgstr "" #: actions/siteadminpanel.php:141 +#, fuzzy msgid "You must have a valid contact email address." -msgstr "" +msgstr "Nie 'n geldige e-posadres nie." #: actions/siteadminpanel.php:159 #, php-format @@ -3819,8 +3923,9 @@ msgid "General" msgstr "Algemeen" #: actions/siteadminpanel.php:224 +#, fuzzy msgid "Site name" -msgstr "" +msgstr "Werf se tema" #: actions/siteadminpanel.php:225 msgid "The name of your site, like \"Yourcompany Microblog\"" @@ -3843,8 +3948,9 @@ msgid "URL used for credits link in footer of each page" msgstr "" #: actions/siteadminpanel.php:239 +#, fuzzy msgid "Contact email address for your site" -msgstr "" +msgstr "Inkomende e-posadres is verwyder." #: actions/siteadminpanel.php:245 msgid "Local" @@ -3859,8 +3965,9 @@ msgid "Default timezone for the site; usually UTC." msgstr "" #: actions/siteadminpanel.php:262 +#, fuzzy msgid "Default language" -msgstr "" +msgstr "Standaardtydsone" #: actions/siteadminpanel.php:263 msgid "Site language when autodetection from browser settings is not available" @@ -3887,32 +3994,37 @@ msgid "How long users must wait (in seconds) to post the same thing again." msgstr "" #: actions/sitenoticeadminpanel.php:56 +#, fuzzy msgid "Site Notice" -msgstr "" +msgstr "Kennisgewings" #: actions/sitenoticeadminpanel.php:67 +#, fuzzy msgid "Edit site-wide message" -msgstr "" +msgstr "Nuwe boodskap" #: actions/sitenoticeadminpanel.php:103 +#, fuzzy msgid "Unable to save site notice." -msgstr "" +msgstr "Dit was nie moontlik om u ontwerp-instellings te stoor nie." #: actions/sitenoticeadminpanel.php:113 msgid "Max length for the site-wide notice is 255 chars." msgstr "" #: actions/sitenoticeadminpanel.php:176 +#, fuzzy msgid "Site notice text" -msgstr "" +msgstr "Verwyder kennisgewing" #: actions/sitenoticeadminpanel.php:178 msgid "Site-wide notice text (255 chars max; HTML okay)" msgstr "" #: actions/sitenoticeadminpanel.php:198 +#, fuzzy msgid "Save site notice" -msgstr "" +msgstr "Verwyder kennisgewing" #. TRANS: Title for SMS settings. #: actions/smssettings.php:59 @@ -3928,8 +4040,9 @@ msgstr "" #. TRANS: Message given in the SMS settings if SMS is not enabled on the site. #: actions/smssettings.php:97 +#, fuzzy msgid "SMS is not available." -msgstr "" +msgstr "IM is nie beskikbaar nie." #. TRANS: Form legend for SMS settings form. #: actions/smssettings.php:111 @@ -3939,8 +4052,9 @@ msgstr "IP-adres" #. TRANS: Form guide in SMS settings form. #: actions/smssettings.php:120 +#, fuzzy msgid "Current confirmed SMS-enabled phone number." -msgstr "" +msgstr "Huidige bevestigde e-posadres." #. TRANS: Form guide in IM settings form. #: actions/smssettings.php:133 @@ -3949,8 +4063,9 @@ msgstr "" #. TRANS: Field label for SMS address input in SMS settings form. #: actions/smssettings.php:142 +#, fuzzy msgid "Confirmation code" -msgstr "" +msgstr "Geen bevestigingskode." #. TRANS: Form field instructions in SMS settings form. #: actions/smssettings.php:144 @@ -3978,7 +4093,7 @@ msgstr "" #: actions/smssettings.php:195 #, fuzzy msgid "SMS preferences" -msgstr "Voorkeure" +msgstr "Voorkeure is gestoor." #. TRANS: Checkbox label in SMS preferences form. #: actions/smssettings.php:201 @@ -4000,18 +4115,21 @@ msgstr "Geen telefoonnommer." #. TRANS: Message given saving SMS phone number without having selected a carrier. #: actions/smssettings.php:344 +#, fuzzy msgid "No carrier selected." -msgstr "" +msgstr "Hierdie kennisgewing is verwyder." #. TRANS: Message given saving SMS phone number that is already set. #: actions/smssettings.php:352 +#, fuzzy msgid "That is already your phone number." -msgstr "" +msgstr "Dit is al reeds u Jabber-ID." #. TRANS: Message given saving SMS phone number that is already set for another user. #: actions/smssettings.php:356 +#, fuzzy msgid "That phone number already belongs to another user." -msgstr "" +msgstr "Die Jabber-ID word reeds deur 'n ander gebruiker gebruik." #. TRANS: Message given saving valid SMS phone number that is to be confirmed. #: actions/smssettings.php:384 @@ -4022,20 +4140,22 @@ msgstr "" #. TRANS: Message given canceling SMS phone number confirmation for the wrong phone number. #: actions/smssettings.php:413 +#, fuzzy msgid "That is the wrong confirmation number." -msgstr "" +msgstr "Dit is die verkeerde IM-adres." #. TRANS: Message given after successfully canceling SMS phone number confirmation. #: actions/smssettings.php:427 #, fuzzy msgid "SMS confirmation cancelled." -msgstr "Bevestiging gekanselleer." +msgstr "SMS-bevestiging" #. TRANS: Message given trying to remove an SMS phone number that is not #. TRANS: registered for the active user. #: actions/smssettings.php:448 +#, fuzzy msgid "That is not your phone number." -msgstr "" +msgstr "Dit is nie u Jabber-ID nie." #. TRANS: Message given after successfully removing a registered SMS phone number. #: actions/smssettings.php:470 @@ -4064,8 +4184,9 @@ msgstr "" #. TRANS: Message given saving SMS phone number confirmation code without having provided one. #: actions/smssettings.php:548 +#, fuzzy msgid "No code entered" -msgstr "" +msgstr "Geen inhoud nie!" #. TRANS: Menu item for site administration #: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196 @@ -4078,16 +4199,18 @@ msgid "Manage snapshot configuration" msgstr "" #: actions/snapshotadminpanel.php:127 +#, fuzzy msgid "Invalid snapshot run value." -msgstr "" +msgstr "Ongeldige rol." #: actions/snapshotadminpanel.php:133 msgid "Snapshot frequency must be a number." msgstr "" #: actions/snapshotadminpanel.php:144 +#, fuzzy msgid "Invalid snapshot report URL." -msgstr "" +msgstr "Die logo-URL is ongeldig." #: actions/snapshotadminpanel.php:200 msgid "Randomly during web hit" @@ -4122,25 +4245,29 @@ msgid "Snapshots will be sent to this URL" msgstr "" #: actions/snapshotadminpanel.php:248 +#, fuzzy msgid "Save snapshot settings" -msgstr "" +msgstr "Stoor toegangsinstellings" #: actions/subedit.php:70 +#, fuzzy msgid "You are not subscribed to that profile." -msgstr "" +msgstr "U volg hierdie gebruiker:" #. TRANS: Exception thrown when a subscription could not be stored on the server. #: actions/subedit.php:83 classes/Subscription.php:136 +#, fuzzy msgid "Could not save subscription." -msgstr "" +msgstr "Kon nie die profiel stoor nie." #: actions/subscribe.php:77 msgid "This action only accepts POST requests." msgstr "" #: actions/subscribe.php:107 +#, fuzzy msgid "No such profile." -msgstr "" +msgstr "Die lêer bestaan nie." #: actions/subscribe.php:117 msgid "You cannot subscribe to an OMB 0.1 remote profile with this action." @@ -4156,9 +4283,9 @@ msgid "%s subscribers" msgstr "" #: actions/subscribers.php:52 -#, php-format +#, fuzzy, php-format msgid "%1$s subscribers, page %2$d" -msgstr "" +msgstr "%1$s en vriende, bladsy %2$d" #: actions/subscribers.php:63 msgid "These are the people who listen to your notices." @@ -4188,14 +4315,14 @@ msgid "" msgstr "" #: actions/subscriptions.php:52 -#, php-format +#, fuzzy, php-format msgid "%s subscriptions" -msgstr "" +msgstr "Beskrywing" #: actions/subscriptions.php:54 -#, php-format +#, fuzzy, php-format msgid "%1$s subscriptions, page %2$d" -msgstr "" +msgstr "%1$s groepe, bladsy %2$d" #: actions/subscriptions.php:65 msgid "These are the people whose notices you listen to." @@ -4230,24 +4357,24 @@ msgid "SMS" msgstr "SMS" #: actions/tag.php:69 -#, php-format +#, fuzzy, php-format msgid "Notices tagged with %1$s, page %2$d" -msgstr "" +msgstr "%1$s, bladsy %2$d" #: actions/tag.php:87 -#, php-format +#, fuzzy, php-format msgid "Notice feed for tag %s (RSS 1.0)" -msgstr "" +msgstr "Voer vir vriende van %s (RSS 1.0)" #: actions/tag.php:93 -#, php-format +#, fuzzy, php-format msgid "Notice feed for tag %s (RSS 2.0)" -msgstr "" +msgstr "Voer vir vriende van %s (RSS 2.0)" #: actions/tag.php:99 -#, php-format +#, fuzzy, php-format msgid "Notice feed for tag %s (Atom)" -msgstr "" +msgstr "Voer vir vriende van %s (Atom)" #: actions/tagother.php:39 msgid "No ID argument." @@ -4283,28 +4410,33 @@ msgid "" msgstr "" #: actions/tagother.php:200 +#, fuzzy msgid "Could not save tags." -msgstr "" +msgstr "Kon nie die profiel stoor nie." #: actions/tagother.php:236 +#, fuzzy msgid "Use this form to add tags to your subscribers or subscriptions." -msgstr "" +msgstr "Gebruik die vorm om u applikasie te wysig." #: actions/tagrss.php:35 msgid "No such tag." msgstr "Onbekende etiket." #: actions/unblock.php:59 +#, fuzzy msgid "You haven't blocked that user." -msgstr "" +msgstr "U het reeds die gebruiker geblokkeer." #: actions/unsandbox.php:72 +#, fuzzy msgid "User is not sandboxed." -msgstr "" +msgstr "Hierdie gebruiker het nie 'n profiel nie." #: actions/unsilence.php:72 +#, fuzzy msgid "User is not silenced." -msgstr "" +msgstr "Hierdie gebruiker is reeds stilgemaak." #: actions/unsubscribe.php:77 #, fuzzy @@ -4363,36 +4495,42 @@ msgid "New users" msgstr "Nuwe gebruikers" #: actions/useradminpanel.php:235 +#, fuzzy msgid "New user welcome" -msgstr "" +msgstr "Nuwe gebruikers" #: actions/useradminpanel.php:236 +#, fuzzy msgid "Welcome text for new users (Max 255 chars)." -msgstr "" +msgstr "Die naam is te lank (maksimum 255 karakters)." #: actions/useradminpanel.php:241 +#, fuzzy msgid "Default subscription" -msgstr "" +msgstr "Beskrywing" #: actions/useradminpanel.php:242 +#, fuzzy msgid "Automatically subscribe new users to this user." -msgstr "" +msgstr "Jy kan nie gebruikers op hierdie webwerf stilmaak nie." #: actions/useradminpanel.php:251 msgid "Invitations" msgstr "Uitnodigings" #: actions/useradminpanel.php:256 +#, fuzzy msgid "Invitations enabled" -msgstr "" +msgstr "Uitnodigings" #: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "" #: actions/userauthorization.php:105 +#, fuzzy msgid "Authorize subscription" -msgstr "" +msgstr "Beskrywing" #: actions/userauthorization.php:110 msgid "" @@ -4411,16 +4549,18 @@ msgstr "Aanvaar" #: actions/userauthorization.php:218 lib/subscribeform.php:115 #: lib/subscribeform.php:139 +#, fuzzy msgid "Subscribe to this user" -msgstr "" +msgstr "U volg hierdie gebruiker:" #: actions/userauthorization.php:219 msgid "Reject" msgstr "Verwerp" #: actions/userauthorization.php:220 +#, fuzzy msgid "Reject this subscription" -msgstr "" +msgstr "Verwyder die gebruiker" #: actions/userauthorization.php:232 msgid "No authorization request!" @@ -4438,8 +4578,9 @@ msgid "" msgstr "" #: actions/userauthorization.php:266 +#, fuzzy msgid "Subscription rejected" -msgstr "" +msgstr "Beskrywing word vereis." #: actions/userauthorization.php:268 msgid "" @@ -4469,9 +4610,9 @@ msgid "Profile URL ‘%s’ is for a local user." msgstr "" #: actions/userauthorization.php:345 -#, php-format +#, fuzzy, php-format msgid "Avatar URL ‘%s’ is not valid." -msgstr "" +msgstr "Die \"callback\"-URL is nie geldig nie." #: actions/userauthorization.php:350 #, php-format @@ -4479,13 +4620,14 @@ msgid "Can’t read avatar URL ‘%s’." msgstr "Kan nie die avatar-URL \"%s\" lees nie." #: actions/userauthorization.php:355 -#, php-format +#, fuzzy, php-format msgid "Wrong image type for avatar URL ‘%s’." -msgstr "" +msgstr "Kan nie die avatar-URL \"%s\" lees nie." #: actions/userdesignsettings.php:76 lib/designsettings.php:65 +#, fuzzy msgid "Profile design" -msgstr "" +msgstr "Profiel" #: actions/userdesignsettings.php:87 lib/designsettings.php:76 msgid "" @@ -4508,9 +4650,9 @@ msgid "Search for more groups" msgstr "Soek vir meer groepe" #: actions/usergroups.php:159 -#, php-format +#, fuzzy, php-format msgid "%s is not a member of any group." -msgstr "" +msgstr "U is nie 'n lid van enige groep nie." #: actions/usergroups.php:164 #, php-format @@ -4622,8 +4764,9 @@ msgstr "Ongeldige grootte." #. TRANS: Exception thrown when joining a group fails. #: classes/Group_member.php:42 +#, fuzzy msgid "Group join failed." -msgstr "" +msgstr "Groepsprofiel" #. TRANS: Exception thrown when trying to leave a group the user is not a member of. #: classes/Group_member.php:55 @@ -4632,20 +4775,22 @@ msgstr "Nie lid van die groep nie." #. TRANS: Exception thrown when trying to leave a group fails. #: classes/Group_member.php:63 +#, fuzzy msgid "Group leave failed." -msgstr "" +msgstr "Groepsprofiel" #. TRANS: Server exception thrown when updating a local group fails. #: classes/Local_group.php:42 +#, fuzzy msgid "Could not update local group." -msgstr "" +msgstr "Dit was nie moontlik om die groep by te werk nie." #. TRANS: Exception thrown when trying creating a login token failed. #. TRANS: %s is the user nickname for which token creation failed. #: classes/Login_token.php:78 -#, php-format +#, fuzzy, php-format msgid "Could not create login token for %s" -msgstr "" +msgstr "Dit was nie moontlik om die aliasse te skep nie." #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 @@ -4654,18 +4799,21 @@ msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. #: classes/Message.php:46 +#, fuzzy msgid "You are banned from sending direct messages." -msgstr "" +msgstr "U inkomende boodskappe" #. TRANS: Message given when a message could not be stored on the server. #: classes/Message.php:63 +#, fuzzy msgid "Could not insert message." -msgstr "" +msgstr "Kan nie boodskap verwerk nie." #. TRANS: Message given when a message could not be updated on the server. #: classes/Message.php:74 +#, fuzzy msgid "Could not update message with new URI." -msgstr "" +msgstr "Kan nie boodskap verwerk nie." #. TRANS: Server exception thrown when a user profile for a notice cannot be found. #. TRANS: %1$d is a profile ID (number), %2$d is a notice ID (number). @@ -4705,8 +4853,9 @@ msgstr "" #. TRANS: Client exception thrown when a user tries to post while being banned. #: classes/Notice.php:286 +#, fuzzy msgid "You are banned from posting notices on this site." -msgstr "" +msgstr "Jy kan nie gebruikers op hierdie webwerf stilmaak nie." #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. @@ -4726,7 +4875,7 @@ 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. -#: classes/Notice.php:1745 +#: classes/Notice.php:1746 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -4769,8 +4918,9 @@ msgstr "" #. TRANS: Exception thrown when trying to subscribe to a user who has blocked the subscribing user. #: classes/Subscription.php:85 +#, fuzzy msgid "User has blocked you." -msgstr "" +msgstr "Hierdie gebruiker het nie 'n profiel nie." #. TRANS: Exception thrown when trying to unsibscribe without a subscription. #: classes/Subscription.php:171 @@ -4812,18 +4962,21 @@ msgstr "Kon nie die groep skep nie." #. TRANS: Server exception thrown when updating a group URI failed. #: classes/User_group.php:506 +#, fuzzy msgid "Could not set group URI." -msgstr "" +msgstr "Kon nie die groep skep nie." #. TRANS: Server exception thrown when setting group membership failed. #: classes/User_group.php:529 +#, fuzzy msgid "Could not set group membership." -msgstr "" +msgstr "Kon nie die groep skep nie." #. TRANS: Server exception thrown when saving local group information failed. #: classes/User_group.php:544 +#, fuzzy msgid "Could not save local group info." -msgstr "" +msgstr "Kon nie die profiel stoor nie." #. TRANS: Link title attribute in user account settings menu. #: lib/accountsettingsaction.php:109 @@ -4832,8 +4985,9 @@ msgstr "Verander u profiel gegewens" #. TRANS: Link title attribute in user account settings menu. #: lib/accountsettingsaction.php:116 +#, fuzzy msgid "Upload an avatar" -msgstr "" +msgstr "Die opdatering van die avatar het gefaal." #. TRANS: Link title attribute in user account settings menu. #: lib/accountsettingsaction.php:123 @@ -4890,9 +5044,10 @@ msgstr "Persoonlik" #. TRANS: Tooltip for main menu option "Account" #: lib/action.php:447 +#, fuzzy msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" -msgstr "" +msgstr "Verander u wagwoord" #. TRANS: Tooltip for main menu option "Services" #: lib/action.php:452 @@ -4932,9 +5087,10 @@ msgstr "Uitnodig" #. TRANS: Tooltip for main menu option "Logout" #: lib/action.php:474 +#, fuzzy msgctxt "TOOLTIP" msgid "Logout from the site" -msgstr "" +msgstr "Meld by die webwerf aan" #. TRANS: Main menu option when logged in to log out the current user #: lib/action.php:477 @@ -4990,18 +5146,21 @@ msgstr "Soek" #. TRANS: DT element for site notice. String is hidden in default CSS. #. TRANS: Menu item for site administration #: lib/action.php:525 lib/adminpanelaction.php:400 +#, fuzzy msgid "Site notice" -msgstr "" +msgstr "Verwyder kennisgewing" #. TRANS: DT element for local views block. String is hidden in default CSS. #: lib/action.php:592 +#, fuzzy msgid "Local views" -msgstr "" +msgstr "Lokaal" #. TRANS: DT element for page notice. String is hidden in default CSS. #: lib/action.php:659 +#, fuzzy msgid "Page notice" -msgstr "" +msgstr "Populêre kennisgewings" #. TRANS: DT element for secondary navigation menu. String is hidden in default CSS. #: lib/action.php:762 @@ -5044,8 +5203,9 @@ msgid "Contact" msgstr "Kontak" #: lib/action.php:794 +#, fuzzy msgid "Badge" -msgstr "" +msgstr "Aanpor" #. TRANS: DT element for StatusNet software license. #: lib/action.php:823 @@ -5107,8 +5267,9 @@ msgstr "" #. TRANS: DT element for pagination (previous/next, etc.). #: lib/action.php:1192 +#, fuzzy msgid "Pagination" -msgstr "" +msgstr "Registratie" #. TRANS: Pagination message to go to a page displaying information more in the #. TRANS: present than the currently displayed information. @@ -5141,13 +5302,15 @@ msgstr "" #. TRANS: Client error message thrown when a user tries to change admin settings but has no access rights. #: lib/adminpanelaction.php:98 +#, fuzzy msgid "You cannot make changes to this site." -msgstr "" +msgstr "Jy kan nie gebruikers op hierdie webwerf stilmaak nie." #. TRANS: Client error message throw when a certain panel's settings cannot be changed. #: lib/adminpanelaction.php:110 +#, fuzzy msgid "Changes to that panel are not allowed." -msgstr "" +msgstr "Registrasie nie toegelaat nie." #. TRANS: Client error message. #: lib/adminpanelaction.php:229 @@ -5162,13 +5325,15 @@ msgstr "" #. TRANS: Client error message thrown if design settings could not be deleted in #. TRANS: the admin panel Design. #: lib/adminpanelaction.php:284 +#, fuzzy msgid "Unable to delete design setting." -msgstr "" +msgstr "Dit was nie moontlik om u ontwerp-instellings te stoor nie." #. TRANS: Menu item title/tooltip #: lib/adminpanelaction.php:350 +#, fuzzy msgid "Basic site configuration" -msgstr "" +msgstr "SMS-bevestiging" #. TRANS: Menu item for site administration #: lib/adminpanelaction.php:352 @@ -5178,8 +5343,9 @@ msgstr "Webtuiste" #. TRANS: Menu item title/tooltip #: lib/adminpanelaction.php:358 +#, fuzzy msgid "Design configuration" -msgstr "" +msgstr "SMS-bevestiging" #. TRANS: Menu item for site administration #: lib/adminpanelaction.php:360 @@ -5189,8 +5355,9 @@ msgstr "Ontwerp" #. TRANS: Menu item title/tooltip #: lib/adminpanelaction.php:366 +#, fuzzy msgid "User configuration" -msgstr "" +msgstr "SMS-bevestiging" #. TRANS: Menu item for site administration #: lib/adminpanelaction.php:368 lib/personalgroupnav.php:115 @@ -5199,28 +5366,33 @@ msgstr "Gebruiker" #. TRANS: Menu item title/tooltip #: lib/adminpanelaction.php:374 +#, fuzzy msgid "Access configuration" -msgstr "" +msgstr "SMS-bevestiging" #. TRANS: Menu item title/tooltip #: lib/adminpanelaction.php:382 +#, fuzzy msgid "Paths configuration" -msgstr "" +msgstr "SMS-bevestiging" #. TRANS: Menu item title/tooltip #: lib/adminpanelaction.php:390 +#, fuzzy msgid "Sessions configuration" -msgstr "" +msgstr "SMS-bevestiging" #. TRANS: Menu item title/tooltip #: lib/adminpanelaction.php:398 +#, fuzzy msgid "Edit site notice" -msgstr "" +msgstr "Verwyder kennisgewing" #. TRANS: Menu item title/tooltip #: lib/adminpanelaction.php:406 +#, fuzzy msgid "Snapshots configuration" -msgstr "" +msgstr "SMS-bevestiging" #. TRANS: Client error 401. #: lib/apiauth.php:113 @@ -5229,13 +5401,15 @@ msgstr "" #. TRANS: Form legend. #: lib/applicationeditform.php:137 +#, fuzzy msgid "Edit application" -msgstr "" +msgstr "Wysig applikasie" #. TRANS: Form guide. #: lib/applicationeditform.php:187 +#, fuzzy msgid "Icon for this application" -msgstr "" +msgstr "Moenie die applikasie verwyder nie" #. TRANS: Form input field instructions. #: lib/applicationeditform.php:209 @@ -5245,23 +5419,27 @@ msgstr "" #. TRANS: Form input field instructions. #: lib/applicationeditform.php:213 +#, fuzzy msgid "Describe your application" -msgstr "" +msgstr "Skrap applikasie" #. TRANS: Form input field instructions. #: lib/applicationeditform.php:224 +#, fuzzy msgid "URL of the homepage of this application" -msgstr "" +msgstr "U is nie die eienaar van hierdie applikasie nie." #. TRANS: Form input field label. #: lib/applicationeditform.php:226 +#, fuzzy msgid "Source URL" -msgstr "" +msgstr "Bron" #. TRANS: Form input field instructions. #: lib/applicationeditform.php:233 +#, fuzzy msgid "Organization responsible for this application" -msgstr "" +msgstr "U is nie die eienaar van hierdie applikasie nie." #. TRANS: Form input field instructions. #: lib/applicationeditform.php:242 @@ -5331,7 +5509,7 @@ msgstr "" #, fuzzy msgctxt "BUTTON" msgid "Revoke" -msgstr "Herroep" +msgstr "Verwyder" #. TRANS: DT element label in attachment list. #: lib/attachmentlist.php:88 @@ -5349,8 +5527,9 @@ msgid "Provider" msgstr "Verskaffer" #: lib/attachmentnoticesection.php:67 +#, fuzzy msgid "Notices where this attachment appears" -msgstr "" +msgstr "Etikette vir hierdie aanhangsel" #: lib/attachmenttagcloudsection.php:48 msgid "Tags for this attachment" @@ -5373,16 +5552,18 @@ msgid "Command complete" msgstr "Opdrag voltooi" #: lib/channel.php:240 +#, fuzzy msgid "Command failed" -msgstr "" +msgstr "Opdrag voltooi" #: lib/command.php:83 lib/command.php:105 msgid "Notice with that id does not exist" msgstr "" #: lib/command.php:99 lib/command.php:596 +#, fuzzy msgid "User has no last notice" -msgstr "" +msgstr "Hierdie gebruiker het nie 'n profiel nie." #. TRANS: Message given requesting a profile for a non-existing user. #. TRANS: %s is the nickname of the user for which the profile could not be found. @@ -5409,9 +5590,9 @@ msgstr "" #. TRANS: Message given having nudged another user. #. TRANS: %s is the nickname of the user that was nudged. #: lib/command.php:234 -#, php-format +#, fuzzy, php-format msgid "Nudge sent to %s" -msgstr "" +msgstr "Die por is gestuur" #: lib/command.php:260 #, php-format @@ -5426,22 +5607,23 @@ msgid "Notice marked as fave." msgstr "" #: lib/command.php:323 +#, fuzzy msgid "You are already a member of that group" -msgstr "" +msgstr "U is reeds 'n lid van die groep." #. TRANS: Message given having failed to add a user to a group. #. TRANS: %1$s is the nickname of the user, %2$s is the nickname of the group. #: lib/command.php:339 -#, fuzzy, php-format +#, php-format msgid "Could not join user %1$s to group %2$s" -msgstr "U kan nie die gebruiker volg nie: die gebruiker bestaan nie." +msgstr "" #. TRANS: Message given having failed to remove a user from a group. #. TRANS: %1$s is the nickname of the user, %2$s is the nickname of the group. #: lib/command.php:385 -#, fuzzy, php-format +#, php-format msgid "Could not remove user %1$s from group %2$s" -msgstr "Kon nie die groep skep nie." +msgstr "" #. TRANS: Whois output. %s is the full name of the queried user. #: lib/command.php:418 @@ -5488,46 +5670,52 @@ msgstr "" #. TRANS: Message given have sent a direct message to another user. #. TRANS: %s is the name of the other user. #: lib/command.php:492 -#, php-format +#, fuzzy, php-format msgid "Direct message to %s sent" -msgstr "" +msgstr "Direkte boodskappe aan %s" #: lib/command.php:494 msgid "Error sending direct message." msgstr "" #: lib/command.php:514 +#, fuzzy msgid "Cannot repeat your own notice" -msgstr "" +msgstr "U kan nie u eie kennisgewings herhaal nie." #: lib/command.php:519 +#, fuzzy msgid "Already repeated that notice" -msgstr "" +msgstr "U het reeds die kennisgewing herhaal." #. TRANS: Message given having repeated a notice from another user. #. TRANS: %s is the name of the user for which the notice was repeated. #: lib/command.php:529 -#, php-format +#, fuzzy, php-format msgid "Notice from %s repeated" -msgstr "" +msgstr "Hierdie kennisgewing is verwyder." #: lib/command.php:531 +#, fuzzy msgid "Error repeating notice." -msgstr "" +msgstr "U kan nie u eie kennisgewings herhaal nie." #: lib/command.php:562 -#, php-format +#, fuzzy, php-format msgid "Notice too long - maximum is %d characters, you sent %d" msgstr "" +"Boodskap is te lank. Die maksimum is %1$d karakters. U het %2$d karakters " +"gestuur." #: lib/command.php:571 -#, php-format +#, fuzzy, php-format msgid "Reply to %s sent" -msgstr "" +msgstr "Na %s herhaal" #: lib/command.php:573 +#, fuzzy msgid "Error saving notice." -msgstr "" +msgstr "Fout tydens stoor van gebruiker; ongeldig." #: lib/command.php:620 msgid "Specify the name of the user to subscribe to" @@ -5552,24 +5740,28 @@ msgid "Unsubscribed from %s" msgstr "" #: lib/command.php:682 lib/command.php:705 +#, fuzzy msgid "Command not yet implemented." -msgstr "" +msgstr "Opdrag voltooi" #: lib/command.php:685 +#, fuzzy msgid "Notification off." -msgstr "" +msgstr "Geen bevestigingskode." #: lib/command.php:687 msgid "Can't turn off notification." msgstr "" #: lib/command.php:708 +#, fuzzy msgid "Notification on." -msgstr "" +msgstr "Geen bevestigingskode." #: lib/command.php:710 +#, fuzzy msgid "Can't turn on notification." -msgstr "" +msgstr "U kan nie u eie kennisgewings herhaal nie." #: lib/command.php:723 msgid "Login command is disabled" @@ -5586,8 +5778,9 @@ msgid "Unsubscribed %s" msgstr "" #: lib/command.php:778 +#, fuzzy msgid "You are not subscribed to anyone." -msgstr "" +msgstr "U volg hierdie gebruiker:" #: lib/command.php:780 msgid "You are subscribed to this person:" @@ -5596,8 +5789,9 @@ msgstr[0] "U volg hierdie gebruiker:" msgstr[1] "U volg hierdie gebruikers:" #: lib/command.php:800 +#, fuzzy msgid "No one is subscribed to you." -msgstr "" +msgstr "Hierdie gebruiker volg u:" #: lib/command.php:802 msgid "This person is subscribed to you:" @@ -5658,8 +5852,9 @@ msgid "" msgstr "" #: lib/common.php:135 +#, fuzzy msgid "No configuration file found. " -msgstr "" +msgstr "Geen bevestigingskode." #: lib/common.php:136 msgid "I looked for configuration files in the following places: " @@ -5686,20 +5881,23 @@ msgid "Updates by SMS" msgstr "" #: lib/connectsettingsaction.php:120 +#, fuzzy msgid "Connections" -msgstr "" +msgstr "Konnekteer" #: lib/connectsettingsaction.php:121 +#, fuzzy msgid "Authorized connected applications" -msgstr "" +msgstr "Skrap applikasie" #: lib/dberroraction.php:60 msgid "Database error" msgstr "Databasisfout" #: lib/designsettings.php:105 +#, fuzzy msgid "Upload file" -msgstr "" +msgstr "Oplaai" #: lib/designsettings.php:109 msgid "" @@ -5711,16 +5909,19 @@ msgid "Design defaults restored." msgstr "" #: lib/disfavorform.php:114 lib/disfavorform.php:140 +#, fuzzy msgid "Disfavor this notice" -msgstr "" +msgstr "Verwyder hierdie kennisgewing" #: lib/favorform.php:114 lib/favorform.php:140 +#, fuzzy msgid "Favor this notice" -msgstr "" +msgstr "Verwyder hierdie kennisgewing" #: lib/favorform.php:140 +#, fuzzy msgid "Favor" -msgstr "" +msgstr "Gunstelinge" #: lib/feed.php:85 msgid "RSS 1.0" @@ -5808,9 +6009,9 @@ msgid "%s blocked users" msgstr "%s geblokkeerde gebruikers" #: lib/groupnav.php:108 -#, php-format +#, fuzzy, php-format msgid "Edit %s group properties" -msgstr "" +msgstr "Groep %s wysig" #: lib/groupnav.php:113 msgid "Logo" @@ -5827,8 +6028,9 @@ msgid "Add or edit %s design" msgstr "" #: lib/groupsbymemberssection.php:71 +#, fuzzy msgid "Groups with most members" -msgstr "" +msgstr "Groepe waarvan %s lid is" #: lib/groupsbypostssection.php:71 msgid "Groups with most posts" @@ -5845,17 +6047,19 @@ msgid "This page is not available in a media type you accept" msgstr "" #: lib/imagefile.php:72 +#, fuzzy msgid "Unsupported image file format." -msgstr "" +msgstr "Nie-ondersteunde formaat." #: lib/imagefile.php:88 -#, php-format +#, fuzzy, php-format msgid "That file is too big. The maximum file size is %s." -msgstr "" +msgstr "Die kennisgewing is te lank. Gebruik maksimum %d karakters." #: lib/imagefile.php:93 +#, fuzzy msgid "Partial upload." -msgstr "" +msgstr "Geen lêer opgelaai nie." #: lib/imagefile.php:101 lib/mediafile.php:170 msgid "System error uploading file." @@ -5866,8 +6070,9 @@ msgid "Not an image or corrupt file." msgstr "" #: lib/imagefile.php:122 +#, fuzzy msgid "Lost our file." -msgstr "" +msgstr "Die lêer bestaan nie." #: lib/imagefile.php:163 lib/imagefile.php:224 msgid "Unknown file type" @@ -5887,9 +6092,9 @@ msgid "[%s]" msgstr "[%s]" #: lib/jabber.php:567 -#, php-format +#, fuzzy, php-format msgid "Unknown inbox source %d." -msgstr "" +msgstr "Onbekende taal \"%s\"." #: lib/joinform.php:114 msgid "Join" @@ -5900,8 +6105,9 @@ msgid "Leave" msgstr "Verlaat" #: lib/logingroupnav.php:80 +#, fuzzy msgid "Login with a username and password" -msgstr "" +msgstr "Ongeldige gebruikersnaam of wagwoord." #: lib/logingroupnav.php:86 msgid "Sign up for a new account" @@ -5909,8 +6115,9 @@ msgstr "" #. TRANS: Subject for address confirmation email #: lib/mail.php:174 +#, fuzzy msgid "Email address confirmation" -msgstr "" +msgstr "E-posadres" #. TRANS: Body for address confirmation email. #: lib/mail.php:177 @@ -5932,9 +6139,9 @@ msgstr "" #. TRANS: Subject of new-subscriber notification e-mail #: lib/mail.php:243 -#, php-format +#, fuzzy, php-format msgid "%1$s is now listening to your notices on %2$s." -msgstr "" +msgstr "%s volg niemand nie." #: lib/mail.php:248 #, php-format @@ -6053,9 +6260,9 @@ msgstr "" #. TRANS: Subject for favorite notification email #: lib/mail.php:589 -#, php-format +#, fuzzy, php-format msgid "%s (@%s) added your notice as a favorite" -msgstr "" +msgstr "Hierdie kennisgewing is nie 'n gunsteling nie!" #. TRANS: Body for favorite notification email #: lib/mail.php:592 @@ -6131,7 +6338,7 @@ msgid "" "users in conversation. People can send you messages for your eyes only." msgstr "" -#: lib/mailbox.php:227 lib/noticelist.php:505 +#: lib/mailbox.php:228 lib/noticelist.php:506 msgid "from" msgstr "van" @@ -6152,9 +6359,9 @@ msgid "Sorry, no incoming email allowed." msgstr "Jammer, inkomende e-pos word nie toegelaat nie." #: lib/mailhandler.php:228 -#, php-format +#, fuzzy, php-format msgid "Unsupported message type: %s" -msgstr "" +msgstr "Nie-ondersteunde formaat." #: lib/mediafile.php:98 lib/mediafile.php:123 msgid "There was a database error while saving your file. Please try again." @@ -6195,8 +6402,10 @@ msgid "File could not be moved to destination directory." msgstr "" #: lib/mediafile.php:202 lib/mediafile.php:238 +#, fuzzy msgid "Could not determine file's MIME type." msgstr "" +"Dit was nie moontlik om die boodskap van u gunstelinge te verwyder nie." #: lib/mediafile.php:318 #, php-format @@ -6209,8 +6418,9 @@ msgid "%s is not a supported file type on this server." msgstr "" #: lib/messageform.php:120 +#, fuzzy msgid "Send a direct notice" -msgstr "" +msgstr "Stuur 'n direkte boodskap aan hierdie gebruiker" #: lib/messageform.php:146 msgid "To" @@ -6226,8 +6436,9 @@ msgid "Send" msgstr "Stuur" #: lib/noticeform.php:160 +#, fuzzy msgid "Send a notice" -msgstr "" +msgstr "Verwyder kennisgewing" #: lib/noticeform.php:173 #, php-format @@ -6247,8 +6458,9 @@ msgid "Share my location" msgstr "" #: lib/noticeform.php:215 +#, fuzzy msgid "Do not share my location" -msgstr "" +msgstr "Moenie die applikasie verwyder nie" #: lib/noticeform.php:216 msgid "" @@ -6285,45 +6497,50 @@ msgstr "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s" msgid "at" msgstr "op" -#: lib/noticelist.php:567 +#: lib/noticelist.php:568 msgid "in context" msgstr "in konteks" -#: lib/noticelist.php:602 +#: lib/noticelist.php:603 msgid "Repeated by" msgstr "Herhaal deur" -#: lib/noticelist.php:629 -msgid "Reply to this notice" -msgstr "" - #: lib/noticelist.php:630 +#, fuzzy +msgid "Reply to this notice" +msgstr "Verwyder hierdie kennisgewing" + +#: lib/noticelist.php:631 msgid "Reply" msgstr "Antwoord" -#: lib/noticelist.php:674 +#: lib/noticelist.php:675 +#, fuzzy msgid "Notice repeated" -msgstr "" +msgstr "Hierdie kennisgewing is verwyder." #: lib/nudgeform.php:116 +#, fuzzy msgid "Nudge this user" -msgstr "" +msgstr "Verwyder die gebruiker" #: lib/nudgeform.php:128 msgid "Nudge" msgstr "Aanpor" #: lib/nudgeform.php:128 +#, fuzzy msgid "Send a nudge to this user" -msgstr "" +msgstr "Stuur 'n direkte boodskap aan hierdie gebruiker" #: lib/oauthstore.php:283 msgid "Error inserting new profile" msgstr "" #: lib/oauthstore.php:291 +#, fuzzy msgid "Error inserting avatar" -msgstr "" +msgstr "Fout tydens stoor van gebruiker; ongeldig." #: lib/oauthstore.php:306 msgid "Error updating remote profile" @@ -6334,12 +6551,14 @@ msgid "Error inserting remote profile" msgstr "" #: lib/oauthstore.php:345 +#, fuzzy msgid "Duplicate notice" -msgstr "" +msgstr "Verwyder kennisgewing" #: lib/oauthstore.php:490 +#, fuzzy msgid "Couldn't insert new subscription." -msgstr "" +msgstr "Kon nie e-posbevestiging verwyder nie." #: lib/personalgroupnav.php:99 msgid "Personal" @@ -6366,8 +6585,9 @@ msgid "Outbox" msgstr "" #: lib/personalgroupnav.php:131 +#, fuzzy msgid "Your sent messages" -msgstr "" +msgstr "U inkomende boodskappe" #: lib/personaltagcloudsection.php:56 #, php-format @@ -6379,20 +6599,23 @@ msgid "Unknown" msgstr "Onbekend" #: lib/profileaction.php:109 lib/profileaction.php:205 lib/subgroupnav.php:82 +#, fuzzy msgid "Subscriptions" -msgstr "" +msgstr "Beskrywing" #: lib/profileaction.php:126 +#, fuzzy msgid "All subscriptions" -msgstr "" +msgstr "Beskrywing" #: lib/profileaction.php:144 lib/profileaction.php:214 lib/subgroupnav.php:90 msgid "Subscribers" msgstr "" #: lib/profileaction.php:161 +#, fuzzy msgid "All subscribers" -msgstr "" +msgstr "Alle lede" #: lib/profileaction.php:191 msgid "User ID" @@ -6436,25 +6659,28 @@ msgid "Popular" msgstr "Gewild" #: lib/redirectingaction.php:95 +#, fuzzy msgid "No return-to arguments." -msgstr "" +msgstr "Geen ID-argument." #: lib/repeatform.php:107 +#, fuzzy msgid "Repeat this notice?" -msgstr "" +msgstr "Verwyder hierdie kennisgewing" #: lib/repeatform.php:132 msgid "Yes" msgstr "Ja" #: lib/repeatform.php:132 +#, fuzzy msgid "Repeat this notice" -msgstr "" +msgstr "Verwyder hierdie kennisgewing" #: lib/revokeroleform.php:91 -#, php-format +#, fuzzy, php-format msgid "Revoke the \"%s\" role from this user" -msgstr "" +msgstr "Blok hierdie gebruiker van hierdie groep" #: lib/router.php:709 msgid "No single user defined for single-user mode." @@ -6465,12 +6691,14 @@ msgid "Sandbox" msgstr "" #: lib/sandboxform.php:78 +#, fuzzy msgid "Sandbox this user" -msgstr "" +msgstr "Deblokkeer hierdie gebruiker" #: lib/searchaction.php:120 +#, fuzzy msgid "Search site" -msgstr "" +msgstr "Soek" #: lib/searchaction.php:126 msgid "Keyword(s)" @@ -6481,8 +6709,9 @@ msgid "Search" msgstr "Soek" #: lib/searchaction.php:162 +#, fuzzy msgid "Search help" -msgstr "" +msgstr "Soek" #: lib/searchgroupnav.php:80 msgid "People" @@ -6497,8 +6726,9 @@ msgid "Find content of notices" msgstr "" #: lib/searchgroupnav.php:85 +#, fuzzy msgid "Find groups on this site" -msgstr "" +msgstr "groepe op %s" #: lib/section.php:89 msgid "Untitled section" @@ -6517,14 +6747,14 @@ msgid "Silence this user" msgstr "Maak die gebruikers stil" #: lib/subgroupnav.php:83 -#, php-format +#, fuzzy, php-format msgid "People %s subscribes to" -msgstr "" +msgstr "Hierdie gebruiker volg u:" #: lib/subgroupnav.php:91 -#, php-format +#, fuzzy, php-format msgid "People subscribed to %s" -msgstr "" +msgstr "U volg hierdie gebruiker:" #: lib/subgroupnav.php:99 #, php-format @@ -6594,9 +6824,8 @@ msgid "Theme contains file of type '.%s', which is not allowed." msgstr "" #: lib/themeuploader.php:234 -#, fuzzy msgid "Error opening theme archive." -msgstr "Kon nie die profiel stoor nie." +msgstr "" #: lib/topposterssection.php:74 msgid "Top posters" @@ -6607,29 +6836,33 @@ msgid "Unsandbox" msgstr "" #: lib/unsandboxform.php:80 +#, fuzzy msgid "Unsandbox this user" -msgstr "" +msgstr "Deblokkeer hierdie gebruiker" #: lib/unsilenceform.php:67 +#, fuzzy msgid "Unsilence" -msgstr "" +msgstr "Maak stil" #: lib/unsilenceform.php:78 +#, fuzzy msgid "Unsilence this user" -msgstr "" +msgstr "Maak die gebruikers stil" #: lib/unsubscribeform.php:113 lib/unsubscribeform.php:137 +#, fuzzy msgid "Unsubscribe from this user" -msgstr "" +msgstr "Deblokkeer hierdie gebruiker" #: lib/unsubscribeform.php:137 msgid "Unsubscribe" msgstr "" #: lib/usernoprofileexception.php:58 -#, php-format +#, fuzzy, php-format msgid "User %s (%d) has no profile record." -msgstr "" +msgstr "Hierdie gebruiker het nie 'n profiel nie." #: lib/userprofile.php:117 msgid "Edit Avatar" diff --git a/locale/br/LC_MESSAGES/statusnet.po b/locale/br/LC_MESSAGES/statusnet.po index 2b12d7f566..e4eb8d8545 100644 --- a/locale/br/LC_MESSAGES/statusnet.po +++ b/locale/br/LC_MESSAGES/statusnet.po @@ -1,6 +1,7 @@ # Translation of StatusNet to Breton # # Author@translatewiki.net: Fulup +# Author@translatewiki.net: Gwendal # Author@translatewiki.net: Y-M D # -- # This file is distributed under the same license as the StatusNet package. @@ -9,12 +10,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-07 16:23+0000\n" -"PO-Revision-Date: 2010-08-07 16:24:10+0000\n" +"POT-Creation-Date: 2010-08-11 10:11+0000\n" +"PO-Revision-Date: 2010-08-11 10:11:33+0000\n" "Language-Team: Dutch\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70848); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: br\n" "X-Message-Group: out-statusnet\n" @@ -149,10 +150,11 @@ msgstr "Gwazh evit mignoned %s (Atom)" #. TRANS: %1$s is user nickname #: actions/all.php:138 -#, php-format +#, fuzzy, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "" +"Kronologiezh foran %%site.name%% eo, met den n'en deus skrivet tra ebet." #: actions/all.php:143 #, php-format @@ -372,9 +374,8 @@ msgid "You cannot unfollow yourself." msgstr "Ne c'hallit ket chom hep ho heuliañ hoc'h-unan." #: actions/apifriendshipsexists.php:91 -#, fuzzy msgid "Two valid IDs or screen_names must be supplied." -msgstr "Rankout a reoc'h reiñ daou id pe lesanv." +msgstr "" #: actions/apifriendshipsshow.php:134 msgid "Could not determine source user." @@ -387,8 +388,9 @@ msgstr "Diposubl eo kavout an implijer pal." #: actions/apigroupcreate.php:167 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:212 +#, fuzzy msgid "Nickname must have only lowercase letters and numbers and no spaces." -msgstr "" +msgstr "1 da 64 lizherenn vihan pe sifr, hep poentaouiñ nag esaouenn" #: actions/apigroupcreate.php:176 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 @@ -536,8 +538,9 @@ msgid "Invalid nickname / password!" msgstr "Lesanv / ger tremen direizh !" #: actions/apioauthauthorize.php:159 +#, fuzzy msgid "Database error deleting OAuth application user." -msgstr "" +msgstr "Arabat eo dilemel ar poellad-mañ" #: actions/apioauthauthorize.php:185 msgid "Database error inserting OAuth application user." @@ -682,9 +685,9 @@ msgid "%1$s / Updates mentioning %2$s" msgstr "%1$s / Hizivadennoù a veneg %2$s" #: actions/apitimelinementions.php:131 -#, php-format +#, fuzzy, php-format msgid "%1$s updates that reply to updates from %2$s / %3$s." -msgstr "" +msgstr "%1$s statud pennroll da %2$s / %2$s." #: actions/apitimelinepublic.php:197 actions/publicrss.php:103 #, php-format @@ -772,7 +775,7 @@ msgid "Preview" msgstr "Rakwelet" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:656 +#: lib/deleteuserform.php:66 lib/noticelist.php:657 msgid "Delete" msgstr "Diverkañ" @@ -1046,7 +1049,7 @@ msgid "Do not delete this notice" msgstr "Arabat dilemel an ali-mañ" #. TRANS: Submit button title for 'Yes' when deleting a notice. -#: actions/deletenotice.php:158 lib/noticelist.php:656 +#: actions/deletenotice.php:158 lib/noticelist.php:657 msgid "Delete this notice" msgstr "Dilemel an ali-mañ" @@ -1403,14 +1406,16 @@ msgstr "Postel o tont" #. TRANS: Form instructions for incoming e-mail form in e-mail settings. #. TRANS: Form instructions for incoming SMS e-mail address form in SMS settings. #: actions/emailsettings.php:155 actions/smssettings.php:178 +#, fuzzy msgid "Send email to this address to post new notices." -msgstr "" +msgstr "Chomlec'h postel nevez evit embann e %s" #. TRANS: Instructions for incoming e-mail address input form. #. TRANS: Instructions for incoming SMS e-mail address input form. #: actions/emailsettings.php:164 actions/smssettings.php:186 +#, fuzzy msgid "Make a new email address for posting to; cancels the old one." -msgstr "" +msgstr "Chomlec'h postel nevez evit embann e %s" #. TRANS: Button label for adding an e-mail address to send notices from. #. TRANS: Button label for adding an SMS e-mail address to send notices from. @@ -1426,8 +1431,9 @@ msgstr "Penndibaboù ar posteloù" #. TRANS: Checkbox label in e-mail preferences form. #: actions/emailsettings.php:180 +#, fuzzy msgid "Send me notices of new subscriptions through email." -msgstr "" +msgstr "Kas din an alioù dre Jabber/GTalk." #. TRANS: Checkbox label in e-mail preferences form. #: actions/emailsettings.php:186 @@ -1471,8 +1477,9 @@ msgstr "Chomlec'h postel ebet." #. TRANS: Message given saving e-mail address that cannot be normalised. #: actions/emailsettings.php:361 +#, fuzzy msgid "Cannot normalize that email address" -msgstr "" +msgstr "Diposubl eo implijout an ID Jabber-mañ" #. TRANS: Message given saving e-mail address that not valid. #: actions/emailsettings.php:366 actions/register.php:208 @@ -1487,8 +1494,9 @@ msgstr "Ho postel eo dija." #. TRANS: Message given saving e-mail address that is already set for another user. #: actions/emailsettings.php:374 +#, fuzzy msgid "That email address already belongs to another user." -msgstr "" +msgstr "D'un implijer all eo an niverenn-mañ dija." #. TRANS: Server error thrown on database error adding e-mail confirmation code. #. TRANS: Server error thrown on database error adding IM confirmation code. @@ -1510,8 +1518,9 @@ msgstr "" #. TRANS: Message given canceling SMS phone number confirmation that is not pending. #: actions/emailsettings.php:419 actions/imsettings.php:383 #: actions/smssettings.php:408 +#, fuzzy msgid "No pending confirmation to cancel." -msgstr "" +msgstr "Nullet eo bet kadarnadenn ar bostelerezh prim." #. TRANS: Message given canceling e-mail address confirmation for the wrong e-mail address. #: actions/emailsettings.php:424 @@ -1547,13 +1556,15 @@ msgstr "Dibosupl eo hizivaat doser an implijer." #. TRANS: Message given after successfully removing an incoming e-mail address. #: actions/emailsettings.php:508 actions/smssettings.php:581 +#, fuzzy msgid "Incoming email address removed." -msgstr "" +msgstr "Chomlec'h postel ebet o tont." #. TRANS: Message given after successfully adding an incoming e-mail address. #: actions/emailsettings.php:532 actions/smssettings.php:605 +#, fuzzy msgid "New incoming email address added." -msgstr "" +msgstr "Chomlec'h postel ebet o tont." #: actions/favor.php:79 msgid "This notice is already a favorite!" @@ -1588,11 +1599,13 @@ msgid "" msgstr "" #: actions/favorited.php:156 -#, php-format +#, fuzzy, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to add a " "notice to your favorites!" msgstr "" +"Perak ne [groufec'h ket ur gont](%%action.register%%) ha bezañ an hini " +"gentañ da embann un dra !" #: actions/favoritesrss.php:111 actions/showfavorites.php:77 #: lib/personalgroupnav.php:115 @@ -1607,13 +1620,14 @@ msgstr "Hizivadennoù brientek gant %1$s war %2$s !" #: actions/featured.php:69 lib/featureduserssection.php:87 #: lib/publicgroupnav.php:89 +#, fuzzy msgid "Featured users" -msgstr "" +msgstr "Diverkañ an implijer" #: actions/featured.php:71 -#, php-format +#, fuzzy, php-format msgid "Featured users, page %d" -msgstr "" +msgstr "Strollad, pajenn %d" #: actions/featured.php:99 #, php-format @@ -1633,8 +1647,9 @@ msgid "No attachments." msgstr "N'eus restr stag ebet." #: actions/file.php:51 +#, fuzzy msgid "No uploaded attachments." -msgstr "" +msgstr "N'eus restr stag ebet." #: actions/finishremotesubscribe.php:69 msgid "Not expecting this response!" @@ -1645,8 +1660,9 @@ msgid "User being listened to does not exist." msgstr "" #: actions/finishremotesubscribe.php:87 actions/remotesubscribe.php:59 +#, fuzzy msgid "You can use the local subscription!" -msgstr "" +msgstr "Dibosupl eo dilemel ar c'houmanant." #: actions/finishremotesubscribe.php:99 msgid "That user has blocked you from subscribing." @@ -1657,8 +1673,9 @@ msgid "You are not authorized." msgstr "N'oc'h ket aotreet." #: actions/finishremotesubscribe.php:113 +#, fuzzy msgid "Could not convert request token to access token." -msgstr "" +msgstr "Dibosupl eo kaout ur jedaouer reked." #: actions/finishremotesubscribe.php:118 msgid "Remote service uses unknown version of OMB protocol." @@ -1744,16 +1761,18 @@ msgid "Block this user from this group" msgstr "Stankañ an implijer-mañ eus ar strollad-se" #: actions/groupblock.php:206 +#, fuzzy msgid "Database error blocking user from group." -msgstr "" +msgstr "Distankañ implijer ar strollad" #: actions/groupbyid.php:74 actions/userbyid.php:70 msgid "No ID." msgstr "ID ebet" #: actions/groupdesignsettings.php:68 +#, fuzzy msgid "You must be logged in to edit a group." -msgstr "" +msgstr "Rankout a reoc'h bezañ luget evit krouiñ ur strollad." #: actions/groupdesignsettings.php:144 msgid "Group design" @@ -1785,8 +1804,9 @@ msgid "" msgstr "" #: actions/grouplogo.php:365 +#, fuzzy msgid "Pick a square area of the image to be the logo." -msgstr "" +msgstr "Diuzit ur zonenn gant ur stumm karrez evit tremeniñ ho avatar" #: actions/grouplogo.php:399 msgid "Logo updated." @@ -1870,11 +1890,14 @@ msgid "Create a new group" msgstr "Krouiñ ur strollad nevez" #: actions/groupsearch.php:52 -#, php-format +#, fuzzy, php-format msgid "" "Search for groups on %%site.name%% by their name, location, or description. " "Separate the terms by spaces; they must be 3 characters or more." msgstr "" +"Klask tud e %%site.name%% dre o anv, o lec'hiadur pe o diduadennoù. " +"Dispartiañ termenoù ar c'hlask gant esaouennoù. Ret eo e vefe da nebeutañ 3 " +"arouezenn." #: actions/groupsearch.php:58 msgid "Group search" @@ -1895,11 +1918,13 @@ msgstr "" "anezhañ](%%action.newgroup%%)." #: actions/groupsearch.php:85 -#, php-format +#, fuzzy, php-format msgid "" "Why not [register an account](%%action.register%%) and [create the group](%%" "action.newgroup%%) yourself!" msgstr "" +"Perak ne [groufec'h ket ur gont](%%action.register%%) ha bezañ an hini " +"gentañ da embann un dra !" #: actions/groupunblock.php:91 msgid "Only an admin can unblock group members." @@ -1973,13 +1998,15 @@ msgstr "Kas din an alioù dre Jabber/GTalk." #. TRANS: Checkbox label in IM preferences form. #: actions/imsettings.php:166 +#, fuzzy msgid "Post a notice when my Jabber/GTalk status changes." -msgstr "" +msgstr "Embann ur MicroID evit ma chomlec'h Jabber/GTalk." #. TRANS: Checkbox label in IM preferences form. #: actions/imsettings.php:172 +#, fuzzy msgid "Send me replies through Jabber/GTalk from people I'm not subscribed to." -msgstr "" +msgstr "Kas din an alioù dre Jabber/GTalk." #. TRANS: Checkbox label in IM preferences form. #: actions/imsettings.php:179 @@ -2049,9 +2076,8 @@ msgstr "N'eo ket ho ID Jabber." #. TRANS: Message given after successfully removing a registered IM address. #: actions/imsettings.php:447 -#, fuzzy msgid "The IM address was removed." -msgstr "Dilamet eo bet ar chomlec'h." +msgstr "Ar chomlec'h IM zo bet dilamet." #: actions/inbox.php:59 #, php-format @@ -2118,9 +2144,10 @@ msgid "" msgstr "" #: actions/invite.php:162 +#, fuzzy msgid "" "Use this form to invite your friends and colleagues to use this service." -msgstr "" +msgstr "Pediñ mignoned hag kenseurted da zont ganeoc'h war %s" #: actions/invite.php:187 msgid "Email addresses" @@ -2278,9 +2305,9 @@ msgid "%1$s is already an admin for group \"%2$s\"." msgstr "%1$s a zo dija merour ar strollad \"%2$s\"." #: actions/makeadmin.php:133 -#, php-format +#, fuzzy, php-format msgid "Can't get membership record for %1$s in group %2$s." -msgstr "" +msgstr "Diposubl eo lakaat %1$s da merour ar strollad %2$s." #: actions/makeadmin.php:146 #, php-format @@ -2365,11 +2392,14 @@ msgid "Notice posted" msgstr "Ali embannet" #: actions/noticesearch.php:68 -#, php-format +#, fuzzy, php-format msgid "" "Search for notices on %%site.name%% by their contents. Separate search terms " "by spaces; they must be 3 characters or more." msgstr "" +"Klask tud e %%site.name%% dre o anv, o lec'hiadur pe o diduadennoù. " +"Dispartiañ termenoù ar c'hlask gant esaouennoù. Ret eo e vefe da nebeutañ 3 " +"arouezenn." #: actions/noticesearch.php:78 msgid "Text search" @@ -2388,11 +2418,13 @@ msgid "" msgstr "" #: actions/noticesearch.php:124 -#, php-format +#, fuzzy, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and be the first to " "[post on this topic](%%%%action.newnotice%%%%?status_textarea=%s)!" msgstr "" +"Perak ne [groufec'h ket ur gont](%%action.register%%) ha bezañ an hini " +"gentañ da embann un dra !" #: actions/noticesearchrss.php:96 #, php-format @@ -2400,9 +2432,9 @@ msgid "Updates with \"%s\"" msgstr "Hizivadenn gant \"%s\"" #: actions/noticesearchrss.php:98 -#, php-format +#, fuzzy, php-format msgid "Updates matching search term \"%1$s\" on %2$s!" -msgstr "" +msgstr "Hizivadennoù merket gant %1$s e %2$s !" #: actions/nudge.php:85 msgid "" @@ -2447,13 +2479,14 @@ msgid "You are not a user of that application." msgstr "N'oc'h ket un implijer eus ar poellad-mañ." #: actions/oauthconnectionssettings.php:186 -#, fuzzy, php-format +#, php-format msgid "Unable to revoke access for app: %s." -msgstr "Dibosupl eo nullañ moned ar poellad : " +msgstr "" #: actions/oauthconnectionssettings.php:198 +#, fuzzy msgid "You have not authorized any applications to use your account." -msgstr "" +msgstr "N'o peus enrollet poellad ebet evit poent." #: actions/oauthconnectionssettings.php:211 msgid "Developers can edit the registration settings for their applications " @@ -2470,9 +2503,9 @@ msgstr "Statud %1$s war %2$s" #. TRANS: Error message displaying attachments. %s is a raw MIME type (eg 'image/png') #: actions/oembed.php:159 -#, fuzzy, php-format +#, php-format msgid "Content type %s not supported." -msgstr "seurt an danvez " +msgstr "" #. TRANS: Error message displaying attachments. %s is the site's base URL. #: actions/oembed.php:163 @@ -2483,8 +2516,9 @@ msgstr "" #. TRANS: Client error on an API request with an unsupported data format. #: actions/oembed.php:184 actions/oembed.php:203 lib/apiaction.php:1204 #: lib/apiaction.php:1232 lib/apiaction.php:1355 +#, fuzzy msgid "Not a supported data format." -msgstr "" +msgstr "Diembreget eo ar furmad-se." #: actions/opensearch.php:64 msgid "People Search" @@ -2515,36 +2549,42 @@ msgid "Automatic shortening service to use." msgstr "" #: actions/othersettings.php:122 +#, fuzzy msgid "View profile designs" -msgstr "" +msgstr "Design ar profil" #: actions/othersettings.php:123 msgid "Show or hide profile designs." msgstr "Diskouez pe kuzhat designoù ar profil." #: actions/othersettings.php:153 +#, fuzzy msgid "URL shortening service is too long (max 50 chars)." -msgstr "" +msgstr "Re hir eo ar yezh (255 arouezenn d'ar muiañ)." #: actions/otp.php:69 msgid "No user ID specified." msgstr "N'eus bet diferet ID implijer ebet." #: actions/otp.php:83 +#, fuzzy msgid "No login token specified." -msgstr "" +msgstr "N'eus bet diferet ali ebet." #: actions/otp.php:90 +#, fuzzy msgid "No login token requested." -msgstr "" +msgstr "N'eus profil ID ebet er reked." #: actions/otp.php:95 +#, fuzzy msgid "Invalid login token specified." -msgstr "" +msgstr "Fichenn direizh." #: actions/otp.php:104 +#, fuzzy msgid "Login token expired." -msgstr "" +msgstr "Kevreañ d'al lec'hienn" #: actions/outbox.php:58 #, php-format @@ -2627,13 +2667,14 @@ msgid "Paths" msgstr "Hentoù" #: actions/pathsadminpanel.php:70 +#, fuzzy msgid "Path and server settings for this StatusNet site." -msgstr "" +msgstr "Arventennoù diazez evit al lec'hienn StatusNet-mañ." #: actions/pathsadminpanel.php:157 #, fuzzy, php-format msgid "Theme directory not readable: %s." -msgstr "N'eus ket tu kaout an dodenn : %s" +msgstr "N'eus ket eus ar gaoz-se : %s." #: actions/pathsadminpanel.php:163 #, fuzzy, php-format @@ -2731,12 +2772,14 @@ msgid "Background server" msgstr "Servijer ar backgroundoù" #: actions/pathsadminpanel.php:309 +#, fuzzy msgid "Background path" -msgstr "" +msgstr "Background" #: actions/pathsadminpanel.php:313 +#, fuzzy msgid "Background directory" -msgstr "" +msgstr "Servijer ar backgroundoù" #: actions/pathsadminpanel.php:320 msgid "SSL" @@ -2998,13 +3041,15 @@ msgstr "" "gentañ da embann un dra !" #: actions/public.php:242 -#, php-format +#, fuzzy, php-format msgid "" "This is %%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 share notices about yourself with " "friends, family, and colleagues! ([Read more](%%doc.help%%))" msgstr "" +"%%site.name%% a zo ur servij [micro-blogging](http://br.wikipedia.org/wiki/" +"Microblog) diazezet war ar meziant frank [StatusNet](http://status.net/)." #: actions/public.php:247 #, php-format @@ -3214,8 +3259,9 @@ msgid "" msgstr "" #: actions/register.php:432 +#, fuzzy msgid "1-64 lowercase letters or numbers, no punctuation or spaces. Required." -msgstr "" +msgstr "1 da 64 lizherenn vihan pe sifr, hep poentaouiñ nag esaouenn" #: actions/register.php:437 msgid "6 or more characters. Required." @@ -3366,7 +3412,7 @@ msgstr "Ne c'helloc'h ket adkemer ho ali deoc'h." msgid "You already repeated that notice." msgstr "Adkemeret o peus dija an ali-mañ." -#: actions/repeat.php:114 lib/noticelist.php:675 +#: actions/repeat.php:114 lib/noticelist.php:676 msgid "Repeated" msgstr "Adlavaret" @@ -3429,7 +3475,7 @@ msgstr "Respontoù da %1$s war %2$s !" #: actions/revokerole.php:75 #, fuzzy msgid "You cannot revoke user roles on this site." -msgstr "Ne c'helloc'h ket kas kemennadennoù d'an implijer-mañ." +msgstr "Ne c'helloc'h ket reiñ rolloù d'an implijerien eus al lec'hienn-mañ." #: actions/revokerole.php:82 msgid "User doesn't have this role." @@ -3440,8 +3486,9 @@ msgid "StatusNet" msgstr "StatusNet" #: actions/sandbox.php:65 actions/unsandbox.php:65 +#, fuzzy msgid "You cannot sandbox users on this site." -msgstr "" +msgstr "Ne c'helloc'h ket reiñ rolloù d'an implijerien eus al lec'hienn-mañ." #: actions/sandbox.php:72 msgid "User is already sandboxed." @@ -3567,8 +3614,9 @@ msgid "%1$s's favorite notices, page %2$d" msgstr "Alioù karetañ %1$s, pajenn %2$d" #: actions/showfavorites.php:132 +#, fuzzy msgid "Could not retrieve favorite notices." -msgstr "" +msgstr "Diposupl eo krouiñ ar pennroll-mañ." #: actions/showfavorites.php:171 #, php-format @@ -3681,7 +3729,7 @@ msgid "Created" msgstr "Krouet" #: actions/showgroup.php:455 -#, php-format +#, fuzzy, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." "wikipedia.org/wiki/Micro-blogging) service based on the Free Software " @@ -3689,15 +3737,19 @@ msgid "" "their life and interests. [Join now](%%%%action.register%%%%) to become part " "of this group and many more! ([Read more](%%%%doc.help%%%%))" msgstr "" +"%%site.name%% a zo ur servij [micro-blogging](http://br.wikipedia.org/wiki/" +"Microblog) diazezet war ar meziant frank [StatusNet](http://status.net/)." #: actions/showgroup.php:461 -#, php-format +#, fuzzy, php-format msgid "" "**%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. " msgstr "" +"%%site.name%% a zo ur servij [micro-blogging](http://br.wikipedia.org/wiki/" +"Microblog) diazezet war ar meziant frank [StatusNet](http://status.net/)." #: actions/showgroup.php:489 msgid "Admins" @@ -3763,9 +3815,10 @@ msgid "FOAF for %s" msgstr "mignon ur mignon evit %s" #: actions/showstream.php:200 -#, php-format +#, fuzzy, php-format msgid "This is the timeline for %1$s but %2$s hasn't posted anything yet." msgstr "" +"Kronologiezh foran %%site.name%% eo, met den n'en deus skrivet tra ebet." #: actions/showstream.php:205 msgid "" @@ -3781,21 +3834,25 @@ msgid "" msgstr "" #: actions/showstream.php:243 -#, php-format +#, fuzzy, php-format msgid "" "**%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%%%%))" msgstr "" +"%%site.name%% a zo ur servij [micro-blogging](http://br.wikipedia.org/wiki/" +"Microblog) diazezet war ar meziant frank [StatusNet](http://status.net/)." #: actions/showstream.php:248 -#, php-format +#, fuzzy, php-format msgid "" "**%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. " msgstr "" +"%%site.name%% a zo ur servij [micro-blogging](http://br.wikipedia.org/wiki/" +"Microblog) diazezet war ar meziant frank [StatusNet](http://status.net/)." #: actions/showstream.php:305 #, php-format @@ -3803,8 +3860,9 @@ msgid "Repeat of %s" msgstr "Adkemeret eus %s" #: actions/silence.php:65 actions/unsilence.php:65 +#, fuzzy msgid "You cannot silence users on this site." -msgstr "" +msgstr "Ne c'helloc'h ket reiñ rolloù d'an implijerien eus al lec'hienn-mañ." #: actions/silence.php:72 msgid "User is already silenced." @@ -3819,8 +3877,9 @@ msgid "Site name must have non-zero length." msgstr "Ne c'hell ket bezañ goullo anv al lec'hienn." #: actions/siteadminpanel.php:141 +#, fuzzy msgid "You must have a valid contact email address." -msgstr "" +msgstr "N'eo ket ur chomlec'h postel reizh." #: actions/siteadminpanel.php:159 #, php-format @@ -3872,8 +3931,9 @@ msgid "Local" msgstr "Lec'hel" #: actions/siteadminpanel.php:256 +#, fuzzy msgid "Default timezone" -msgstr "" +msgstr "Koumanantoù dre ziouer" #: actions/siteadminpanel.php:257 msgid "Default timezone for the site; usually UTC." @@ -3994,8 +4054,9 @@ msgstr "Niverenn bellgomz evit an SMS" #. TRANS: SMS phone number input field instructions in SMS settings form. #: actions/smssettings.php:156 +#, fuzzy msgid "Phone number, no punctuation or spaces, with area code" -msgstr "" +msgstr "1 da 64 lizherenn vihan pe sifr, hep poentaouiñ nag esaouenn" #. TRANS: Form legend for SMS preferences form. #: actions/smssettings.php:195 @@ -4021,8 +4082,9 @@ msgstr "Niverenn bellgomz ebet." #. TRANS: Message given saving SMS phone number without having selected a carrier. #: actions/smssettings.php:344 +#, fuzzy msgid "No carrier selected." -msgstr "" +msgstr "Ali dilammet." #. TRANS: Message given saving SMS phone number that is already set. #: actions/smssettings.php:352 @@ -4093,20 +4155,23 @@ msgid "Snapshots" msgstr "Prim" #: actions/snapshotadminpanel.php:65 +#, fuzzy msgid "Manage snapshot configuration" -msgstr "" +msgstr "Kefluniadur ar primoù" #: actions/snapshotadminpanel.php:127 +#, fuzzy msgid "Invalid snapshot run value." -msgstr "" +msgstr "Roll direizh." #: actions/snapshotadminpanel.php:133 msgid "Snapshot frequency must be a number." msgstr "" #: actions/snapshotadminpanel.php:144 +#, fuzzy msgid "Invalid snapshot report URL." -msgstr "" +msgstr "URL fall evit al logo." #: actions/snapshotadminpanel.php:200 msgid "Randomly during web hit" @@ -4117,8 +4182,9 @@ msgid "In a scheduled job" msgstr "" #: actions/snapshotadminpanel.php:206 +#, fuzzy msgid "Data snapshots" -msgstr "" +msgstr "Prim" #: actions/snapshotadminpanel.php:208 msgid "When to send statistical data to status.net servers" @@ -4143,16 +4209,18 @@ msgstr "" #: actions/snapshotadminpanel.php:248 #, fuzzy msgid "Save snapshot settings" -msgstr "Enrollañ an arventennoù moned" +msgstr "Enrollañ arventennoù al lec'hienn" #: actions/subedit.php:70 +#, fuzzy msgid "You are not subscribed to that profile." -msgstr "" +msgstr "N'hoc'h ket koumanantet da zen ebet." #. TRANS: Exception thrown when a subscription could not be stored on the server. #: actions/subedit.php:83 classes/Subscription.php:136 +#, fuzzy msgid "Could not save subscription." -msgstr "" +msgstr "Dibosupl eo dilemel ar c'houmanant." #: actions/subscribe.php:77 msgid "This action only accepts POST requests." @@ -4181,13 +4249,14 @@ msgid "%1$s subscribers, page %2$d" msgstr "Koumanantet da %1$s, pajenn %2$d" #: actions/subscribers.php:63 +#, fuzzy msgid "These are the people who listen to your notices." -msgstr "" +msgstr "Heuliañ a reoc'h alioù an dud-se." #: actions/subscribers.php:67 -#, php-format +#, fuzzy, php-format msgid "These are the people who listen to %s's notices." -msgstr "" +msgstr "Heuliet eo alioù an den-mañ gant %s." #: actions/subscribers.php:108 msgid "" @@ -4202,11 +4271,13 @@ msgstr "" "n'ez eus den ebet koumanantet da %s. Ha c'hoant o peus bezañ an hini gentañ ?" #: actions/subscribers.php:114 -#, php-format +#, fuzzy, php-format msgid "" "%s has no subscribers. Why not [register an account](%%%%action.register%%%" "%) and be the first?" msgstr "" +"Perak ne [groufec'h ket ur gont](%%action.register%%) ha bezañ an hini " +"gentañ da embann un dra !" #: actions/subscriptions.php:52 #, php-format @@ -4310,24 +4381,28 @@ msgid "Could not save tags." msgstr "Dibosupl eo enrollañ ar merkoù." #: actions/tagother.php:236 +#, fuzzy msgid "Use this form to add tags to your subscribers or subscriptions." -msgstr "" +msgstr "Implijit ar furmskrid-mañ evit kemmañ ho poellad." #: actions/tagrss.php:35 +#, fuzzy msgid "No such tag." -msgstr "" +msgstr "N'eus ket eus ar bajenn-se." #: actions/unblock.php:59 msgid "You haven't blocked that user." msgstr "N'o peus ket stanket an implijer-mañ." #: actions/unsandbox.php:72 +#, fuzzy msgid "User is not sandboxed." -msgstr "" +msgstr "Er poull-traezh emañ dija an implijer." #: actions/unsilence.php:72 +#, fuzzy msgid "User is not silenced." -msgstr "" +msgstr "Lakaet eo bet da mut an implijer-mañ dija." #: actions/unsubscribe.php:77 msgid "No profile ID in request." @@ -4338,10 +4413,12 @@ msgid "Unsubscribed" msgstr "Digoumanantet" #: actions/updateprofile.php:64 actions/userauthorization.php:337 -#, php-format +#, fuzzy, php-format msgid "" "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." msgstr "" +"Aotre-implijout ar menegoù \"%1$s\" ne ya ket gant aotre-implijout al " +"lec'hienn \"%2$s\"." #. TRANS: User admin panel title #: actions/useradminpanel.php:59 @@ -4350,8 +4427,9 @@ msgid "User" msgstr "Implijer" #: actions/useradminpanel.php:70 +#, fuzzy msgid "User settings for this StatusNet site." -msgstr "" +msgstr "Arventennoù design evit al lec'hienn StatusNet-mañ." #: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." @@ -4389,16 +4467,20 @@ msgid "New user welcome" msgstr "Degemer an implijerien nevez" #: actions/useradminpanel.php:236 +#, fuzzy msgid "Welcome text for new users (Max 255 chars)." -msgstr "" +msgstr "Re hir eo an anv (255 arouezenn d'ar muiañ)." #: actions/useradminpanel.php:241 msgid "Default subscription" msgstr "Koumanantoù dre ziouer" #: actions/useradminpanel.php:242 +#, fuzzy msgid "Automatically subscribe new users to this user." msgstr "" +"En em enskrivañ ez emgefre d'an holl re hag en em goumanant din (erbedet " +"evit an implijerien nann-denel)" #: actions/useradminpanel.php:251 msgid "Invitations" @@ -4409,8 +4491,9 @@ msgid "Invitations enabled" msgstr "Pedadennoù gweredekaet" #: actions/useradminpanel.php:258 +#, fuzzy msgid "Whether to allow users to invite new users." -msgstr "" +msgstr "Ma rankomp merañ an dalc'hoù hon unan." #: actions/userauthorization.php:105 msgid "Authorize subscription" @@ -4659,15 +4742,16 @@ msgstr "C'hwitet eo bet an disenskrivadur d'ar strollad." #. TRANS: Server exception thrown when updating a local group fails. #: classes/Local_group.php:42 +#, fuzzy msgid "Could not update local group." -msgstr "" +msgstr "Diposubl eo hizivaat ar strollad." #. TRANS: Exception thrown when trying creating a login token failed. #. TRANS: %s is the user nickname for which token creation failed. #: classes/Login_token.php:78 -#, php-format +#, fuzzy, php-format msgid "Could not create login token for %s" -msgstr "" +msgstr "Diposubl eo krouiñ an aliasoù." #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 @@ -4676,8 +4760,9 @@ msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. #: classes/Message.php:46 +#, fuzzy msgid "You are banned from sending direct messages." -msgstr "" +msgstr "Ur gudenn 'zo bet pa veze kaset ho kemennadenn." #. TRANS: Message given when a message could not be stored on the server. #: classes/Message.php:63 @@ -4698,9 +4783,9 @@ msgstr "" #. TRANS: Server exception. %s are the error details. #: classes/Notice.php:190 -#, php-format +#, fuzzy, php-format msgid "Database error inserting hashtag: %s" -msgstr "" +msgstr "Ur fazi 'zo bet en ur ensoc'hañ an avatar" #. TRANS: Client exception thrown if a notice contains too many characters. #: classes/Notice.php:260 @@ -4727,8 +4812,9 @@ msgstr "" #. TRANS: Client exception thrown when a user tries to post while being banned. #: classes/Notice.php:286 +#, fuzzy msgid "You are banned from posting notices on this site." -msgstr "" +msgstr "Ne c'helloc'h ket reiñ rolloù d'an implijerien eus al lec'hienn-mañ." #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. @@ -4748,7 +4834,7 @@ msgstr "Ur gudenn 'zo bet pa veze enrollet boest degemer ar strollad." #. 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. -#: classes/Notice.php:1745 +#: classes/Notice.php:1746 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -4801,13 +4887,13 @@ msgstr "Nann-koumanantet !" #: classes/Subscription.php:178 #, fuzzy msgid "Could not delete self-subscription." -msgstr "Dibosupl eo paouez gant ar c'houmanant." +msgstr "Dibosupl eo dilemel ar c'houmanant." #. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server. #: classes/Subscription.php:206 #, fuzzy msgid "Could not delete subscription OMB token." -msgstr "Diposubl eo dilemel ar postel kadarnadur." +msgstr "Dibosupl eo dilemel ar c'houmanant." #. TRANS: Exception thrown when a subscription could not be deleted on the server. #: classes/Subscription.php:218 @@ -4889,8 +4975,9 @@ msgstr "Pajenn hep anv" #. TRANS: DT element for primary navigation menu. String is hidden in default CSS. #: lib/action.php:436 +#, fuzzy msgid "Primary site navigation" -msgstr "" +msgstr "Arventennoù diazez al lec'hienn" #. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:442 @@ -5021,8 +5108,9 @@ msgstr "Ali ar bajenn" #. TRANS: DT element for secondary navigation menu. String is hidden in default CSS. #: lib/action.php:762 +#, fuzzy msgid "Secondary site navigation" -msgstr "" +msgstr "Arventennoù diazez al lec'hienn" #. TRANS: Secondary navigation menu option leading to help on StatusNet. #: lib/action.php:768 @@ -5099,9 +5187,9 @@ msgstr "Aotre-implijout diwar-benn danvez al lec'hienn" #. TRANS: Content license displayed when license is set to 'private'. #. TRANS: %1$s is the site name. #: lib/action.php:857 -#, php-format +#, fuzzy, php-format msgid "Content and data of %1$s are private and confidential." -msgstr "" +msgstr "Kompren a ran ez eo prevez danvez ha roadennoù %1$s." #. TRANS: Content license displayed when license is set to 'allrightsreserved'. #. TRANS: %1$s is the copyright owner. @@ -5157,8 +5245,9 @@ msgstr "" #. TRANS: Client error message thrown when a user tries to change admin settings but has no access rights. #: lib/adminpanelaction.php:98 +#, fuzzy msgid "You cannot make changes to this site." -msgstr "" +msgstr "Ne c'helloc'h ket reiñ rolloù d'an implijerien eus al lec'hienn-mañ." #. TRANS: Client error message throw when a certain panel's settings cannot be changed. #: lib/adminpanelaction.php:110 @@ -5367,8 +5456,9 @@ msgid "Notices where this attachment appears" msgstr "" #: lib/attachmenttagcloudsection.php:48 +#, fuzzy msgid "Tags for this attachment" -msgstr "" +msgstr "N'eo ket bet kavet ar restr stag." #: lib/authenticationplugin.php:221 lib/authenticationplugin.php:226 msgid "Password changing failed" @@ -5525,18 +5615,21 @@ msgstr "Ali bet adkemeret dija" #. TRANS: Message given having repeated a notice from another user. #. TRANS: %s is the name of the user for which the notice was repeated. #: lib/command.php:529 -#, php-format +#, fuzzy, php-format msgid "Notice from %s repeated" -msgstr "" +msgstr "Ali adkemeret" #: lib/command.php:531 +#, fuzzy msgid "Error repeating notice." -msgstr "" +msgstr "Fazi en ur hizivaat ar profil a-bell." #: lib/command.php:562 -#, php-format +#, fuzzy, php-format msgid "Notice too long - maximum is %d characters, you sent %d" msgstr "" +"Re hir eo ar gemennadenn - ar ment brasañ a zo %1$d arouezenn, %2$d " +"arouezenn o peus lakaet" #: lib/command.php:571 #, php-format @@ -5544,8 +5637,9 @@ msgid "Reply to %s sent" msgstr "Respont kaset da %s" #: lib/command.php:573 +#, fuzzy msgid "Error saving notice." -msgstr "" +msgstr "Ur gudenn 'zo bet pa veze enrollet an ali." #: lib/command.php:620 msgid "Specify the name of the user to subscribe to" @@ -5570,8 +5664,9 @@ msgid "Unsubscribed from %s" msgstr "Digoumanantiñ da %s" #: lib/command.php:682 lib/command.php:705 +#, fuzzy msgid "Command not yet implemented." -msgstr "" +msgstr "Digarezit, n'eo ket bet emplementet an urzhiad-mañ c'hoazh." #: lib/command.php:685 msgid "Notification off." @@ -5611,8 +5706,8 @@ msgstr "N'hoc'h ket koumanantet da zen ebet." #, fuzzy msgid "You are subscribed to this person:" msgid_plural "You are subscribed to these people:" -msgstr[0] "You are subscribed to this person:" -msgstr[1] "You are subscribed to these people:" +msgstr[0] "Koumanantet oc'h dija d'an implijerien-mañ :" +msgstr[1] "Koumanantet oc'h dija d'an implijerien-mañ :" #: lib/command.php:800 msgid "No one is subscribed to you." @@ -5622,8 +5717,8 @@ msgstr "Den n'eo koumanantet deoc'h." #, fuzzy msgid "This person is subscribed to you:" msgid_plural "These people are subscribed to you:" -msgstr[0] "This person is subscribed to you:" -msgstr[1] "These people are subscribed to you:" +msgstr[0] "Den n'eo koumanantet deoc'h." +msgstr[1] "Den n'eo koumanantet deoc'h." #: lib/command.php:822 msgid "You are not a member of any groups." @@ -5633,8 +5728,8 @@ msgstr "N'oc'h ezel eus strollad ebet." #, fuzzy msgid "You are a member of this group:" msgid_plural "You are a member of these groups:" -msgstr[0] "You are a member of this group:" -msgstr[1] "You are a member of these groups:" +msgstr[0] "N'oc'h ket ezel eus ar strollad-mañ." +msgstr[1] "N'oc'h ket ezel eus ar strollad-mañ." #: lib/command.php:838 msgid "" @@ -5711,8 +5806,9 @@ msgid "Connections" msgstr "Kevreadennoù" #: lib/connectsettingsaction.php:121 +#, fuzzy msgid "Authorized connected applications" -msgstr "" +msgstr "Poeladoù kevreet." #: lib/dberroraction.php:60 msgid "Database error" @@ -5728,8 +5824,9 @@ msgid "" msgstr "" #: lib/designsettings.php:418 +#, fuzzy msgid "Design defaults restored." -msgstr "" +msgstr "Enrollet eo bet an arventennoù design." #: lib/disfavorform.php:114 lib/disfavorform.php:140 msgid "Disfavor this notice" @@ -5772,8 +5869,9 @@ msgid "All" msgstr "An holl" #: lib/galleryaction.php:139 +#, fuzzy msgid "Select tag to filter" -msgstr "" +msgstr "Dibab un douger" #: lib/galleryaction.php:140 msgid "Tag" @@ -5793,22 +5891,25 @@ msgid "Grant this user the \"%s\" role" msgstr "" #: lib/groupeditform.php:163 +#, fuzzy msgid "URL of the homepage or blog of the group or topic" -msgstr "" +msgstr "URL pajenn degemer ar poellad-mañ" #: lib/groupeditform.php:168 +#, fuzzy msgid "Describe the group or topic" -msgstr "" +msgstr "Deskrivit ho poellad" #: lib/groupeditform.php:170 -#, php-format +#, fuzzy, php-format msgid "Describe the group or topic in %d characters" -msgstr "" +msgstr "Diskrivit ho poellad gant %d arouezenn" #: lib/groupeditform.php:179 +#, fuzzy msgid "" "Location for the group, if any, like \"City, State (or Region), Country\"" -msgstr "" +msgstr "El lec'h m'emaoc'h, da skouer \"Kêr, Stad (pe Rannvro), Bro\"" #: lib/groupeditform.php:187 #, php-format @@ -5829,9 +5930,9 @@ msgid "%s blocked users" msgstr "%s implijer stanket" #: lib/groupnav.php:108 -#, php-format +#, fuzzy, php-format msgid "Edit %s group properties" -msgstr "" +msgstr "Kemmañ ar strollad %s" #: lib/groupnav.php:113 msgid "Logo" @@ -5843,13 +5944,14 @@ msgid "Add or edit %s logo" msgstr "Ouzhpennañ pe kemmañ logo %s" #: lib/groupnav.php:120 -#, php-format +#, fuzzy, php-format msgid "Add or edit %s design" -msgstr "" +msgstr "Ouzhpennañ pe kemmañ logo %s" #: lib/groupsbymemberssection.php:71 +#, fuzzy msgid "Groups with most members" -msgstr "" +msgstr "Ezel eo %s eus ar strolladoù" #: lib/groupsbypostssection.php:71 msgid "Groups with most posts" @@ -5866,17 +5968,19 @@ msgid "This page is not available in a media type you accept" msgstr "" #: lib/imagefile.php:72 +#, fuzzy msgid "Unsupported image file format." -msgstr "" +msgstr "Diembreget eo ar furmad-se." #: lib/imagefile.php:88 -#, php-format +#, fuzzy, php-format msgid "That file is too big. The maximum file size is %s." -msgstr "" +msgstr "Re hir eo ! Ment hirañ an ali a zo a %d arouezenn." #: lib/imagefile.php:93 +#, fuzzy msgid "Partial upload." -msgstr "" +msgstr "N'eus bet enporzhiet restr ebet." #: lib/imagefile.php:101 lib/mediafile.php:170 msgid "System error uploading file." @@ -5908,9 +6012,9 @@ msgid "[%s]" msgstr "[%s]" #: lib/jabber.php:567 -#, php-format +#, fuzzy, php-format msgid "Unknown inbox source %d." -msgstr "" +msgstr "Yezh \"%s\" dizanv." #: lib/joinform.php:114 msgid "Join" @@ -5921,8 +6025,9 @@ msgid "Leave" msgstr "Kuitaat" #: lib/logingroupnav.php:80 +#, fuzzy msgid "Login with a username and password" -msgstr "" +msgstr "Kevreit gant ho anv implijer hag ho ker-tremen." #: lib/logingroupnav.php:86 msgid "Sign up for a new account" @@ -5953,9 +6058,9 @@ msgstr "" #. TRANS: Subject of new-subscriber notification e-mail #: lib/mail.php:243 -#, php-format +#, fuzzy, php-format msgid "%1$s is now listening to your notices on %2$s." -msgstr "" +msgstr "Ne heuilh %s den ebet." #: lib/mail.php:248 #, php-format @@ -5982,9 +6087,9 @@ msgstr "" #. TRANS: Profile info line in new-subscriber notification e-mail #: lib/mail.php:274 -#, php-format +#, fuzzy, php-format msgid "Bio: %s" -msgstr "" +msgstr "Lec'hiadur : %s" #. TRANS: Subject of notification mail for new posting email address #: lib/mail.php:304 @@ -6019,9 +6124,9 @@ msgstr "Kadarnadur SMS" #. TRANS: Main body heading for SMS-by-email address confirmation message #: lib/mail.php:463 -#, php-format +#, fuzzy, php-format msgid "%s: confirm you own this phone number with this code:" -msgstr "" +msgstr "Niverenn pellgomz o c'hortoz bezañ kadarnaet." #. TRANS: Subject for 'nudge' notification email #: lib/mail.php:484 @@ -6074,9 +6179,9 @@ msgstr "" #. TRANS: Subject for favorite notification email #: lib/mail.php:589 -#, php-format +#, fuzzy, php-format msgid "%s (@%s) added your notice as a favorite" -msgstr "" +msgstr "Kas din ur postel pa lak unan bennak unan eus va alioù evel pennroll." #. TRANS: Body for favorite notification email #: lib/mail.php:592 @@ -6146,8 +6251,9 @@ msgid "" msgstr "" #: lib/mailbox.php:89 +#, fuzzy msgid "Only the user can read their own mailboxes." -msgstr "" +msgstr "N'eus nemet an implijerien kevreet hag a c'hell adkemer alioù." #: lib/mailbox.php:139 msgid "" @@ -6155,30 +6261,33 @@ msgid "" "users in conversation. People can send you messages for your eyes only." msgstr "" -#: lib/mailbox.php:227 lib/noticelist.php:505 +#: lib/mailbox.php:228 lib/noticelist.php:506 msgid "from" msgstr "eus" #: lib/mailhandler.php:37 +#, fuzzy msgid "Could not parse message." -msgstr "" +msgstr "Diposubl eo ensoc'hañ ur gemenadenn" #: lib/mailhandler.php:42 msgid "Not a registered user." msgstr "N'eo ket un implijer enrollet." #: lib/mailhandler.php:46 +#, fuzzy msgid "Sorry, that is not your incoming email address." -msgstr "" +msgstr "N'eo ket ho postel." #: lib/mailhandler.php:50 +#, fuzzy msgid "Sorry, no incoming email allowed." -msgstr "" +msgstr "Chomlec'h postel ebet o tont." #: lib/mailhandler.php:228 -#, php-format +#, fuzzy, php-format msgid "Unsupported message type: %s" -msgstr "" +msgstr "Diembreget eo ar furmad-se." #: lib/mediafile.php:98 lib/mediafile.php:123 msgid "There was a database error while saving your file. Please try again." @@ -6219,8 +6328,9 @@ msgid "File could not be moved to destination directory." msgstr "" #: lib/mediafile.php:202 lib/mediafile.php:238 +#, fuzzy msgid "Could not determine file's MIME type." -msgstr "" +msgstr "Diposubl eo termeniñ an implijer mammenn." #: lib/mediafile.php:318 #, php-format @@ -6241,8 +6351,9 @@ msgid "To" msgstr "Da" #: lib/messageform.php:159 lib/noticeform.php:185 +#, fuzzy msgid "Available characters" -msgstr "" +msgstr "6 arouezenn pe muioc'h" #: lib/messageform.php:178 lib/noticeform.php:236 msgctxt "Send button for sending notice" @@ -6309,23 +6420,23 @@ msgstr "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s" msgid "at" msgstr "e" -#: lib/noticelist.php:567 +#: lib/noticelist.php:568 msgid "in context" msgstr "en amdro" -#: lib/noticelist.php:602 +#: lib/noticelist.php:603 msgid "Repeated by" msgstr "Adkemeret gant" -#: lib/noticelist.php:629 +#: lib/noticelist.php:630 msgid "Reply to this notice" msgstr "Respont d'an ali-mañ" -#: lib/noticelist.php:630 +#: lib/noticelist.php:631 msgid "Reply" msgstr "Respont" -#: lib/noticelist.php:674 +#: lib/noticelist.php:675 msgid "Notice repeated" msgstr "Ali adkemeret" @@ -6350,20 +6461,23 @@ msgid "Error inserting avatar" msgstr "Ur fazi 'zo bet en ur ensoc'hañ an avatar" #: lib/oauthstore.php:306 +#, fuzzy msgid "Error updating remote profile" -msgstr "" +msgstr "Fazi en ur hizivaat ar profil a-bell." #: lib/oauthstore.php:311 +#, fuzzy msgid "Error inserting remote profile" -msgstr "" +msgstr "Ur fazi 'zo bet en ur ensoc'hañ ar profil nevez" #: lib/oauthstore.php:345 msgid "Duplicate notice" msgstr "Eilañ an ali" #: lib/oauthstore.php:490 +#, fuzzy msgid "Couldn't insert new subscription." -msgstr "" +msgstr "Dibosupl eo dilemel ar c'houmanant." #: lib/personalgroupnav.php:99 msgid "Personal" @@ -6394,9 +6508,9 @@ msgid "Your sent messages" msgstr "Ar c'hemenadennoù kaset ganeoc'h" #: lib/personaltagcloudsection.php:56 -#, php-format +#, fuzzy, php-format msgid "Tags in %s's notices" -msgstr "" +msgstr "N'eus ali nevez evit an implijer-mañ" #: lib/plugin.php:115 msgid "Unknown" @@ -6452,16 +6566,18 @@ msgid "Recent tags" msgstr "Merkoù nevez" #: lib/publicgroupnav.php:88 +#, fuzzy msgid "Featured" -msgstr "" +msgstr "Krouet" #: lib/publicgroupnav.php:92 msgid "Popular" msgstr "Poblek" #: lib/redirectingaction.php:95 +#, fuzzy msgid "No return-to arguments." -msgstr "" +msgstr "Arguzenn ID ebet." #: lib/repeatform.php:107 msgid "Repeat this notice?" @@ -6489,8 +6605,9 @@ msgid "Sandbox" msgstr "Poull-traezh" #: lib/sandboxform.php:78 +#, fuzzy msgid "Sandbox this user" -msgstr "" +msgstr "Distankañ an implijer-mañ" #: lib/searchaction.php:120 msgid "Search site" @@ -6537,18 +6654,19 @@ msgid "Silence" msgstr "Didrouz" #: lib/silenceform.php:78 +#, fuzzy msgid "Silence this user" -msgstr "" +msgstr "Diverkañ an implijer-mañ" #: lib/subgroupnav.php:83 -#, php-format +#, fuzzy, php-format msgid "People %s subscribes to" -msgstr "" +msgstr "Koumanantet da %s" #: lib/subgroupnav.php:91 -#, php-format +#, fuzzy, php-format msgid "People subscribed to %s" -msgstr "" +msgstr "Koumanantet da %s" #: lib/subgroupnav.php:99 #, php-format @@ -6560,9 +6678,9 @@ msgid "Invite" msgstr "Pediñ" #: lib/subgroupnav.php:106 -#, php-format +#, fuzzy, php-format msgid "Invite friends and colleagues to join you on %s" -msgstr "" +msgstr "Pediñ mignoned hag kenseurted da zont ganeoc'h war %s" #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 @@ -6627,20 +6745,24 @@ msgid "Top posters" msgstr "An implijerien an efedusañ" #: lib/unsandboxform.php:69 +#, fuzzy msgid "Unsandbox" -msgstr "" +msgstr "Poull-traezh" #: lib/unsandboxform.php:80 +#, fuzzy msgid "Unsandbox this user" -msgstr "" +msgstr "Distankañ an implijer-mañ" #: lib/unsilenceform.php:67 +#, fuzzy msgid "Unsilence" -msgstr "" +msgstr "Didrouz" #: lib/unsilenceform.php:78 +#, fuzzy msgid "Unsilence this user" -msgstr "" +msgstr "Distankañ an implijer-mañ" #: lib/unsubscribeform.php:113 lib/unsubscribeform.php:137 msgid "Unsubscribe from this user" diff --git a/locale/en_GB/LC_MESSAGES/statusnet.po b/locale/en_GB/LC_MESSAGES/statusnet.po index 6eee49858e..a8a11e4ba6 100644 --- a/locale/en_GB/LC_MESSAGES/statusnet.po +++ b/locale/en_GB/LC_MESSAGES/statusnet.po @@ -11,12 +11,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-07 16:23+0000\n" -"PO-Revision-Date: 2010-08-07 16:24:20+0000\n" +"POT-Creation-Date: 2010-08-11 10:11+0000\n" +"PO-Revision-Date: 2010-08-11 10:11:54+0000\n" "Language-Team: British English\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70848); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: en-gb\n" "X-Message-Group: out-statusnet\n" @@ -173,8 +173,8 @@ msgid "" "You can try to [nudge %1$s](../%2$s) from their profile or [post something " "to them](%%%%action.newnotice%%%%?status_textarea=%3$s)." msgstr "" -"You can try to [nudge %1$s](../%2$s) from his profile or [post something to " -"his or her attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." +"Be the first to [post on this topic](%%%%action.newnotice%%%%?" +"status_textarea=%s)!" #: actions/all.php:149 actions/replies.php:210 actions/showstream.php:211 #, fuzzy, php-format @@ -182,8 +182,8 @@ msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " "post a notice to them." msgstr "" -"Why not [register an account](%%%%action.register%%%%) and then nudge %s or " -"post a notice to his or her attention." +"Why not [register an account](%%action.register%%) and be the first to add a " +"notice to your favourites!" #. TRANS: H1 text #: actions/all.php:182 @@ -367,7 +367,7 @@ msgstr "Could not delete favourite." #: actions/apifriendshipscreate.php:109 #, fuzzy msgid "Could not follow user: profile not found." -msgstr "Could not follow user: User not found." +msgstr "Could not unfollow user: User not found." #: actions/apifriendshipscreate.php:118 #, php-format @@ -383,9 +383,8 @@ msgid "You cannot unfollow yourself." msgstr "You cannot unfollow yourself." #: actions/apifriendshipsexists.php:91 -#, fuzzy msgid "Two valid IDs or screen_names must be supplied." -msgstr "Two user ids or screen_names must be supplied." +msgstr "" #: actions/apifriendshipsshow.php:134 msgid "Could not determine source user." @@ -789,7 +788,7 @@ msgid "Preview" msgstr "Preview" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:656 +#: lib/deleteuserform.php:66 lib/noticelist.php:657 msgid "Delete" msgstr "Delete" @@ -1070,7 +1069,7 @@ msgid "Do not delete this notice" msgstr "Do not delete this notice" #. TRANS: Submit button title for 'Yes' when deleting a notice. -#: actions/deletenotice.php:158 lib/noticelist.php:656 +#: actions/deletenotice.php:158 lib/noticelist.php:657 msgid "Delete this notice" msgstr "Delete this notice" @@ -2128,8 +2127,9 @@ msgid "This is your inbox, which lists your incoming private messages." msgstr "This is your inbox, which lists your incoming private messages." #: actions/invite.php:39 +#, fuzzy msgid "Invites have been disabled." -msgstr "" +msgstr "Invitations enabled" #: actions/invite.php:41 #, php-format @@ -2493,11 +2493,9 @@ msgid "Updates matching search term \"%1$s\" on %2$s!" msgstr "Updates matching search term \"%1$s\" on %2$s!" #: actions/nudge.php:85 -#, fuzzy msgid "" "This user doesn't allow nudges or hasn't confirmed or set their email yet." msgstr "" -"This user doesn't allow nudges or hasn't confirmed or set his e-mail yet." #: actions/nudge.php:94 msgid "Nudge sent" @@ -2529,8 +2527,9 @@ msgid "Connected applications" msgstr "Connected applications" #: actions/oauthconnectionssettings.php:83 +#, fuzzy msgid "You have allowed the following applications to access you account." -msgstr "" +msgstr "You have not authorised any applications to use your account." #: actions/oauthconnectionssettings.php:175 msgid "You are not a user of that application." @@ -2609,8 +2608,9 @@ msgid "View profile designs" msgstr "View profile designs" #: actions/othersettings.php:123 +#, fuzzy msgid "Show or hide profile designs." -msgstr "" +msgstr "View profile designs" #: actions/othersettings.php:153 msgid "URL shortening service is too long (max 50 chars)." @@ -2717,8 +2717,9 @@ msgid "Paths" msgstr "" #: actions/pathsadminpanel.php:70 +#, fuzzy msgid "Path and server settings for this StatusNet site." -msgstr "" +msgstr "Basic settings for this StatusNet site" #: actions/pathsadminpanel.php:157 #, php-format @@ -2785,16 +2786,19 @@ msgid "Theme" msgstr "" #: actions/pathsadminpanel.php:264 +#, fuzzy msgid "Theme server" -msgstr "" +msgstr "SSL server" #: actions/pathsadminpanel.php:268 +#, fuzzy msgid "Theme path" -msgstr "" +msgstr "Site path" #: actions/pathsadminpanel.php:272 +#, fuzzy msgid "Theme directory" -msgstr "" +msgstr "Avatar directory" #: actions/pathsadminpanel.php:279 msgid "Avatars" @@ -2813,20 +2817,24 @@ msgid "Avatar directory" msgstr "Avatar directory" #: actions/pathsadminpanel.php:301 +#, fuzzy msgid "Backgrounds" -msgstr "" +msgstr "Background" #: actions/pathsadminpanel.php:305 +#, fuzzy msgid "Background server" -msgstr "" +msgstr "Background" #: actions/pathsadminpanel.php:309 +#, fuzzy msgid "Background path" -msgstr "" +msgstr "Background" #: actions/pathsadminpanel.php:313 +#, fuzzy msgid "Background directory" -msgstr "" +msgstr "Background directory not writable: %s." #: actions/pathsadminpanel.php:320 msgid "SSL" @@ -2845,8 +2853,9 @@ msgid "Always" msgstr "" #: actions/pathsadminpanel.php:329 +#, fuzzy msgid "Use SSL" -msgstr "" +msgstr "SSL" #: actions/pathsadminpanel.php:330 msgid "When to use SSL" @@ -3062,21 +3071,24 @@ msgid "Public Stream Feed (Atom)" msgstr "Public Stream Feed (Atom)" #: actions/public.php:188 -#, php-format +#, fuzzy, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " "yet." msgstr "" +"This is the timeline for %s and friends but no one has posted anything yet." #: actions/public.php:191 msgid "Be the first to post!" msgstr "" #: actions/public.php:195 -#, php-format +#, fuzzy, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" msgstr "" +"Why not [register an account](%%action.register%%) and be the first to add a " +"notice to your favourites!" #: actions/public.php:242 #, php-format @@ -3121,11 +3133,13 @@ msgid "Be the first to post one!" msgstr "" #: actions/publictagcloud.php:75 -#, php-format +#, fuzzy, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post " "one!" msgstr "" +"Why not [register an account](%%action.register%%) and be the first to add a " +"notice to your favourites!" #: actions/publictagcloud.php:134 msgid "Tag cloud" @@ -3172,8 +3186,9 @@ msgid "You have been identified. Enter a new password below. " msgstr "" #: actions/recoverpassword.php:188 +#, fuzzy msgid "Password recovery" -msgstr "" +msgstr "Password recovery requested" #: actions/recoverpassword.php:191 msgid "Nickname or email address" @@ -3463,7 +3478,7 @@ msgstr "You can't repeat your own notice." msgid "You already repeated that notice." msgstr "You already repeated that notice." -#: actions/repeat.php:114 lib/noticelist.php:675 +#: actions/repeat.php:114 lib/noticelist.php:676 msgid "Repeated" msgstr "Repeated" @@ -3502,9 +3517,7 @@ msgstr "Notice feed for %s" msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " "notice to them yet." -msgstr "" -"This is the timeline showing replies to %1$s but %2$s hasn't received a " -"notice to his attention yet." +msgstr "This is the timeline for %1$s but %2$s hasn't posted anything yet." #: actions/replies.php:204 #, php-format @@ -3519,8 +3532,8 @@ msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to them](%%%%action." "newnotice%%%%?status_textarea=%3$s)." msgstr "" -"You can try to [nudge %1$s](../%2$s) or [post something to his or her " -"attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." +"Be the first to [post on this topic](%%%%action.newnotice%%%%?" +"status_textarea=%s)!" #: actions/repliesrss.php:72 #, php-format @@ -3550,8 +3563,9 @@ msgstr "User is already sandboxed." #. TRANS: Menu item for site administration #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 #: lib/adminpanelaction.php:392 +#, fuzzy msgid "Sessions" -msgstr "" +msgstr "Version" #: actions/sessionsadminpanel.php:65 msgid "Session settings for this StatusNet site." @@ -3619,16 +3633,18 @@ msgid "Created by %1$s - %2$s access by default - %3$d users" msgstr "" #: actions/showapplication.php:213 +#, fuzzy msgid "Application actions" -msgstr "" +msgstr "Application not found." #: actions/showapplication.php:236 msgid "Reset key & secret" msgstr "" #: actions/showapplication.php:261 +#, fuzzy msgid "Application info" -msgstr "" +msgstr "Application not found." #: actions/showapplication.php:263 msgid "Consumer key" @@ -3693,13 +3709,11 @@ msgstr "" "notices you like to bookmark them for later or shed a spotlight on them." #: actions/showfavorites.php:208 -#, fuzzy, php-format +#, php-format msgid "" "%s hasn't added any favorite notices yet. Post something interesting they " "would add to their favorites :)" msgstr "" -"%s hasn't added any notices to his favourites yet. Post something " -"interesting they would add to their favourites :)" #: actions/showfavorites.php:212 #, fuzzy, php-format @@ -3708,9 +3722,8 @@ msgid "" "action.register%%%%) and then post something interesting they would add to " "their favorites :)" msgstr "" -"%s hasn't added any notices to his favourites yet. Why not [register an " -"account](%%%%action.register%%%%) and then post something interesting they " -"would add to their favourites :)" +"Why not [register an account](%%action.register%%) and be the first to add a " +"notice to your favourites!" #: actions/showfavorites.php:243 msgid "This is a way to share what you like." @@ -3892,17 +3905,21 @@ msgid "" "You can try to nudge %1$s or [post something to them](%%%%action.newnotice%%%" "%?status_textarea=%2$s)." msgstr "" -"You can try to nudge %1$s or [post something to his or her attention](%%%%" -"action.newnotice%%%%?status_textarea=%2$s)." +"Be the first to [post on this topic](%%%%action.newnotice%%%%?" +"status_textarea=%s)!" #: actions/showstream.php:243 -#, php-format +#, fuzzy, php-format msgid "" "**%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%%%%))" msgstr "" +"This is %%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 share notices about yourself with " +"friends, family, and colleagues! ([Read more](%%doc.help%%))" #: actions/showstream.php:248 #, php-format @@ -3990,8 +4007,9 @@ msgid "Local" msgstr "Local" #: actions/siteadminpanel.php:256 +#, fuzzy msgid "Default timezone" -msgstr "" +msgstr "Default subscription" #: actions/siteadminpanel.php:257 msgid "Default timezone for the site; usually UTC." @@ -4217,16 +4235,18 @@ msgid "Manage snapshot configuration" msgstr "Manage snapshot configuration" #: actions/snapshotadminpanel.php:127 +#, fuzzy msgid "Invalid snapshot run value." -msgstr "" +msgstr "Invalid role." #: actions/snapshotadminpanel.php:133 msgid "Snapshot frequency must be a number." msgstr "" #: actions/snapshotadminpanel.php:144 +#, fuzzy msgid "Invalid snapshot report URL." -msgstr "" +msgstr "nvalid logo URL." #: actions/snapshotadminpanel.php:200 msgid "Randomly during web hit" @@ -4237,8 +4257,9 @@ msgid "In a scheduled job" msgstr "" #: actions/snapshotadminpanel.php:206 +#, fuzzy msgid "Data snapshots" -msgstr "" +msgstr "Save snapshot settings" #: actions/snapshotadminpanel.php:208 msgid "When to send statistical data to status.net servers" @@ -4253,8 +4274,9 @@ msgid "Snapshots will be sent once every N web hits" msgstr "" #: actions/snapshotadminpanel.php:226 +#, fuzzy msgid "Report URL" -msgstr "" +msgstr "Source URL" #: actions/snapshotadminpanel.php:227 msgid "Snapshots will be sent to this URL" @@ -4322,11 +4344,13 @@ msgid "%s has no subscribers. Want to be the first?" msgstr "" #: actions/subscribers.php:114 -#, php-format +#, fuzzy, php-format msgid "" "%s has no subscribers. Why not [register an account](%%%%action.register%%%" "%) and be the first?" msgstr "" +"Why not [register an account](%%action.register%%) and be the first to add a " +"notice to your favourites!" #: actions/subscriptions.php:52 #, php-format @@ -4472,8 +4496,9 @@ msgid "User" msgstr "User" #: actions/useradminpanel.php:70 +#, fuzzy msgid "User settings for this StatusNet site." -msgstr "" +msgstr "Design settings for this StausNet site." #: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." @@ -4507,12 +4532,14 @@ msgid "New users" msgstr "New users" #: actions/useradminpanel.php:235 +#, fuzzy msgid "New user welcome" -msgstr "" +msgstr "New users" #: actions/useradminpanel.php:236 +#, fuzzy msgid "Welcome text for new users (Max 255 chars)." -msgstr "" +msgstr "Name is too long (max 255 chars)." #: actions/useradminpanel.php:241 msgid "Default subscription" @@ -4622,9 +4649,9 @@ msgid "Profile URL ‘%s’ is for a local user." msgstr "" #: actions/userauthorization.php:345 -#, php-format +#, fuzzy, php-format msgid "Avatar URL ‘%s’ is not valid." -msgstr "" +msgstr "Callback URL is not valid." #: actions/userauthorization.php:350 #, php-format @@ -4696,8 +4723,9 @@ msgid "" msgstr "" #: actions/version.php:163 +#, fuzzy msgid "Contributors" -msgstr "" +msgstr "Connections" #: actions/version.php:170 msgid "" @@ -4894,7 +4922,7 @@ msgstr "Problem saving group inbox." #. 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. -#: classes/Notice.php:1745 +#: classes/Notice.php:1746 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -4932,8 +4960,9 @@ msgstr "You have been banned from subscribing." #. TRANS: Exception thrown when trying to subscribe while already subscribed. #: classes/Subscription.php:80 +#, fuzzy msgid "Already subscribed!" -msgstr "" +msgstr "Not subscribed!" #. TRANS: Exception thrown when trying to subscribe to a user who has blocked the subscribing user. #: classes/Subscription.php:85 @@ -4950,19 +4979,19 @@ msgstr "Not subscribed!" #: classes/Subscription.php:178 #, fuzzy msgid "Could not delete self-subscription." -msgstr "Couldn't delete self-subscription." +msgstr "Could not save subscription." #. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server. #: classes/Subscription.php:206 #, fuzzy msgid "Could not delete subscription OMB token." -msgstr "Couldn't delete subscription OMB token." +msgstr "Could not save subscription." #. TRANS: Exception thrown when a subscription could not be deleted on the server. #: classes/Subscription.php:218 #, fuzzy msgid "Could not delete subscription." -msgstr "Couldn't delete subscription." +msgstr "Could not save subscription." #. TRANS: Notice given on user registration. #. TRANS: %1$s is the sitename, $2$s is the registering user's nickname. @@ -5400,13 +5429,15 @@ msgstr "" #. TRANS: Form legend. #: lib/applicationeditform.php:137 +#, fuzzy msgid "Edit application" -msgstr "" +msgstr "Edit Application" #. TRANS: Form guide. #: lib/applicationeditform.php:187 +#, fuzzy msgid "Icon for this application" -msgstr "" +msgstr "Do not delete this application" #. TRANS: Form input field instructions. #: lib/applicationeditform.php:209 @@ -5503,13 +5534,15 @@ msgstr "Revoke" #. TRANS: DT element label in attachment list. #: lib/attachmentlist.php:88 +#, fuzzy msgid "Attachments" -msgstr "" +msgstr "No attachments." #. TRANS: DT element label in attachment list item. #: lib/attachmentlist.php:265 +#, fuzzy msgid "Author" -msgstr "" +msgstr "Authorise URL" #. TRANS: DT element label in attachment list item. #: lib/attachmentlist.php:279 @@ -5521,8 +5554,9 @@ msgid "Notices where this attachment appears" msgstr "" #: lib/attachmenttagcloudsection.php:48 +#, fuzzy msgid "Tags for this attachment" -msgstr "" +msgstr "No such attachment." #: lib/authenticationplugin.php:221 lib/authenticationplugin.php:226 msgid "Password changing failed" @@ -5912,8 +5946,9 @@ msgstr "" "You can upload your personal background image. The maximum file size is 2MB." #: lib/designsettings.php:418 +#, fuzzy msgid "Design defaults restored." -msgstr "" +msgstr "Design preferences saved." #: lib/disfavorform.php:114 lib/disfavorform.php:140 msgid "Disfavor this notice" @@ -6313,9 +6348,9 @@ msgid "" msgstr "" #: lib/mail.php:657 -#, php-format +#, fuzzy, php-format msgid "%s (@%s) sent a notice to your attention" -msgstr "" +msgstr "%s (@%s) added your notice as a favorite" #. TRANS: Body of @-reply notification e-mail. #: lib/mail.php:660 @@ -6355,7 +6390,7 @@ msgid "" "users in conversation. People can send you messages for your eyes only." msgstr "" -#: lib/mailbox.php:227 lib/noticelist.php:505 +#: lib/mailbox.php:228 lib/noticelist.php:506 msgid "from" msgstr "from" @@ -6509,23 +6544,23 @@ msgstr "" msgid "at" msgstr "" -#: lib/noticelist.php:567 +#: lib/noticelist.php:568 msgid "in context" msgstr "in context" -#: lib/noticelist.php:602 +#: lib/noticelist.php:603 msgid "Repeated by" msgstr "Repeated by" -#: lib/noticelist.php:629 +#: lib/noticelist.php:630 msgid "Reply to this notice" msgstr "Reply to this notice" -#: lib/noticelist.php:630 +#: lib/noticelist.php:631 msgid "Reply" msgstr "Reply" -#: lib/noticelist.php:674 +#: lib/noticelist.php:675 msgid "Notice repeated" msgstr "Notice repeated" @@ -6827,16 +6862,18 @@ msgid "Top posters" msgstr "Top posters" #: lib/unsandboxform.php:69 +#, fuzzy msgid "Unsandbox" -msgstr "" +msgstr "Sandbox" #: lib/unsandboxform.php:80 msgid "Unsandbox this user" msgstr "Unsandbox this user" #: lib/unsilenceform.php:67 +#, fuzzy msgid "Unsilence" -msgstr "" +msgstr "Silence" #: lib/unsilenceform.php:78 msgid "Unsilence this user" diff --git a/locale/eo/LC_MESSAGES/statusnet.po b/locale/eo/LC_MESSAGES/statusnet.po new file mode 100644 index 0000000000..5835365c99 --- /dev/null +++ b/locale/eo/LC_MESSAGES/statusnet.po @@ -0,0 +1,7093 @@ +# Translation of StatusNet to Esperanto +# +# Author@translatewiki.net: AVRS +# Author@translatewiki.net: Brion +# Author@translatewiki.net: Ianmcorvidae +# Author@translatewiki.net: Kris10 +# Author@translatewiki.net: LyzTyphone +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-08-11 10:48+0000\n" +"PO-Revision-Date: 2010-08-11 10:49:34+0000\n" +"Language-Team: Esperanto\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: MediaWiki 1.17alpha (r70848); Translate extension (2010-07-21)\n" +"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-Language-Code: eo\n" +"X-Message-Group: out-statusnet\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Page title +#. TRANS: Menu item for site administration +#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:376 +msgid "Access" +msgstr "Atingo" + +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 +msgid "Site access settings" +msgstr "Retejo-atinga agordo" + +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 +msgid "Registration" +msgstr "Registrado" + +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 +msgid "Prohibit anonymous users (not logged in) from viewing site?" +msgstr "Ĉu malpermesi al anonimaj uzantoj (ne ensalutintaj) vidi retejon?" + +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. +#: actions/accessadminpanel.php:167 +msgctxt "LABEL" +msgid "Private" +msgstr "Nepublika" + +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 +msgid "Make registration invitation only." +msgstr "Permesi registriĝon nur perinvitan." + +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" +msgstr "Nur per invito" + +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 +msgid "Disable new registrations." +msgstr "Malpermesi novan registriĝon." + +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +msgid "Closed" +msgstr "Fermita" + +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 +msgid "Save access settings" +msgstr "Konservu atingan agordon" + +#. TRANS: Button label to save e-mail preferences. +#. TRANS: Button label to save IM preferences. +#. TRANS: Button label to save SMS preferences. +#. TRANS: Button label +#: actions/accessadminpanel.php:203 actions/emailsettings.php:224 +#: actions/imsettings.php:184 actions/smssettings.php:209 +#: lib/applicationeditform.php:361 +msgctxt "BUTTON" +msgid "Save" +msgstr "Konservu" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:68 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 +msgid "No such page." +msgstr "Ne estas tiu paĝo." + +#: actions/all.php:79 actions/allrss.php:68 +#: actions/apiaccountupdatedeliverydevice.php:114 +#: actions/apiaccountupdateprofile.php:105 +#: actions/apiaccountupdateprofilebackgroundimage.php:116 +#: actions/apiaccountupdateprofileimage.php:105 actions/apiblockcreate.php:97 +#: actions/apiblockdestroy.php:96 actions/apidirectmessage.php:77 +#: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 +#: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 +#: actions/apigroupleave.php:100 actions/apigrouplist.php:73 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 +#: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 +#: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 +#: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 +#: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:93 actions/userrss.php:40 +#: actions/xrds.php:71 lib/command.php:478 lib/galleryaction.php:59 +#: lib/mailbox.php:82 lib/profileaction.php:77 +msgid "No such user." +msgstr "Ne ekzistas tiu uzanto." + +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:90 +#, php-format +msgid "%1$s and friends, page %2$d" +msgstr "%1$s kaj amikoj, paĝo %2$d" + +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#. TRANS: Message is used as link title. %s is a user nickname. +#: actions/all.php:93 actions/all.php:185 actions/allrss.php:116 +#: actions/apitimelinefriends.php:210 actions/apitimelinehome.php:116 +#: lib/personalgroupnav.php:100 +#, php-format +msgid "%s and friends" +msgstr "%s kaj amikoj" + +#. TRANS: %1$s is user nickname +#: actions/all.php:107 +#, php-format +msgid "Feed for friends of %s (RSS 1.0)" +msgstr "Fluo por amikoj de %s (RSS 1.0)" + +#. TRANS: %1$s is user nickname +#: actions/all.php:116 +#, php-format +msgid "Feed for friends of %s (RSS 2.0)" +msgstr "Fluo por amikoj de %s (RSS 2.0)" + +#. TRANS: %1$s is user nickname +#: actions/all.php:125 +#, php-format +msgid "Feed for friends of %s (Atom)" +msgstr "Fluo por amikoj de %s (Atom)" + +#. TRANS: %1$s is user nickname +#: actions/all.php:138 +#, php-format +msgid "" +"This is the timeline for %s and friends but no one has posted anything yet." +msgstr "" +"Tie ĉi estas la tempstrio de %s kaj amikoj sed ankoraŭ neniu afiŝis ion ajn." + +#: actions/all.php:143 +#, php-format +msgid "" +"Try subscribing to more people, [join a group](%%action.groups%%) or post " +"something yourself." +msgstr "" +"Provu aboni pli da homoj, [aniĝu al grupo] (%%action.groups%%) aŭ afiŝu ion " +"vi mem." + +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:146 +#, php-format +msgid "" +"You can try to [nudge %1$s](../%2$s) from their profile or [post something " +"to them](%%%%action.newnotice%%%%?status_textarea=%3$s)." +msgstr "" +"Vi povas provi [puŝeti %1$s](../%2$s) de lia profilo aŭ [afiŝi ion al li](%%" +"%%action.newnotice%%%%?status_textarea=%3$s)." + +#: actions/all.php:149 actions/replies.php:210 actions/showstream.php:211 +#, php-format +msgid "" +"Why not [register an account](%%%%action.register%%%%) and then nudge %s or " +"post a notice to them." +msgstr "" +"Kial ne [krei konton]](%%%%action.register%%%%) kaj poste puŝeti %s aŭ afiŝi " +"avizon al li?" + +#. TRANS: H1 text +#: actions/all.php:182 +msgid "You and friends" +msgstr "Vi kaj amikoj" + +#. TRANS: Message is used as link description. %1$s is a username, %2$s is a site name. +#. TRANS: Message is used as a subtitle. %1$s is a user nickname, %2$s is a site name. +#: actions/allrss.php:121 actions/apitimelinefriends.php:216 +#: actions/apitimelinehome.php:122 +#, php-format +msgid "Updates from %1$s and friends on %2$s!" +msgstr "Ĝisdatiĝoj de %1$s kaj amikoj ĉe %2$s!" + +#: actions/apiaccountratelimitstatus.php:72 +#: actions/apiaccountupdatedeliverydevice.php:94 +#: actions/apiaccountupdateprofile.php:97 +#: actions/apiaccountupdateprofilebackgroundimage.php:94 +#: actions/apiaccountupdateprofilecolors.php:118 +#: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 +#: actions/apifavoritecreate.php:100 actions/apifavoritedestroy.php:101 +#: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:139 +#: actions/apigroupismember.php:115 actions/apigroupjoin.php:156 +#: actions/apigroupleave.php:142 actions/apigrouplist.php:137 +#: actions/apigrouplistall.php:122 actions/apigroupmembership.php:107 +#: actions/apigroupshow.php:116 actions/apihelptest.php:88 +#: actions/apistatusesdestroy.php:104 actions/apistatusesretweets.php:112 +#: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 +#: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 +#: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 +#: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 +#: actions/apitimelineretweetedtome.php:121 +#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 +#: actions/apitimelineuser.php:163 actions/apiusershow.php:101 +msgid "API method not found." +msgstr "Metodo de API ne troviĝas." + +#: actions/apiaccountupdatedeliverydevice.php:86 +#: actions/apiaccountupdateprofile.php:89 +#: actions/apiaccountupdateprofilebackgroundimage.php:86 +#: actions/apiaccountupdateprofilecolors.php:110 +#: actions/apiaccountupdateprofileimage.php:84 actions/apiblockcreate.php:89 +#: actions/apiblockdestroy.php:88 actions/apidirectmessagenew.php:109 +#: actions/apifavoritecreate.php:91 actions/apifavoritedestroy.php:92 +#: actions/apifriendshipscreate.php:91 actions/apifriendshipsdestroy.php:91 +#: actions/apigroupcreate.php:105 actions/apigroupjoin.php:92 +#: actions/apigroupleave.php:92 actions/apimediaupload.php:67 +#: actions/apistatusesretweet.php:65 actions/apistatusesupdate.php:198 +msgid "This method requires a POST." +msgstr "Ĉi tiu metodo bezonas POST-on." + +#: actions/apiaccountupdatedeliverydevice.php:106 +msgid "" +"You must specify a parameter named 'device' with a value of one of: sms, im, " +"none." +msgstr "" +"Vi devas specifi parametron nomitan 'device' kun valoro de interalie: 'sms', " +"'im', 'none'." + +#: actions/apiaccountupdatedeliverydevice.php:133 +msgid "Could not update user." +msgstr "Malsukcesis ĝisdatigi uzanton" + +#: actions/apiaccountupdateprofile.php:112 +#: actions/apiaccountupdateprofilebackgroundimage.php:194 +#: actions/apiaccountupdateprofilecolors.php:185 +#: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:100 lib/galleryaction.php:66 +#: lib/profileaction.php:84 +msgid "User has no profile." +msgstr "La uzanto ne havas profilon." + +#: actions/apiaccountupdateprofile.php:147 +msgid "Could not save profile." +msgstr "Malsukcesis konservi la profilon." + +#: actions/apiaccountupdateprofilebackgroundimage.php:108 +#: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 +#: actions/designadminpanel.php:123 actions/editapplication.php:118 +#: actions/newapplication.php:101 actions/newnotice.php:94 +#: lib/designsettings.php:283 +#, php-format +msgid "" +"The server was unable to handle that much POST data (%s bytes) due to its " +"current configuration." +msgstr "" +"La servilo ne povis trakti tiom da POST-datumo (% bajtoj) pro ĝia nuna " +"agordo." + +#: actions/apiaccountupdateprofilebackgroundimage.php:136 +#: actions/apiaccountupdateprofilebackgroundimage.php:146 +#: actions/apiaccountupdateprofilecolors.php:164 +#: actions/apiaccountupdateprofilecolors.php:174 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 +#: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 +#: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 +msgid "Unable to save your design settings." +msgstr "Malsukcesis konservi vian desegnan agordon" + +#: actions/apiaccountupdateprofilebackgroundimage.php:187 +#: actions/apiaccountupdateprofilecolors.php:142 +msgid "Could not update your design." +msgstr "Malsukcesis ĝisdatigi vian desegnon." + +#: actions/apiblockcreate.php:105 +msgid "You cannot block yourself!" +msgstr "Vi ne povas bloki vin mem!" + +#: actions/apiblockcreate.php:126 +msgid "Block user failed." +msgstr "Ne sukcesis bloki uzanton." + +#: actions/apiblockdestroy.php:114 +msgid "Unblock user failed." +msgstr "Ne sukcesis malbloki uzanton." + +#: actions/apidirectmessage.php:89 +#, php-format +msgid "Direct messages from %s" +msgstr "Rektaj mesaĝoj de %s" + +#: actions/apidirectmessage.php:93 +#, php-format +msgid "All the direct messages sent from %s" +msgstr "Ĉiuj rektaj mesaĝoj senditaj de %s" + +#: actions/apidirectmessage.php:101 +#, php-format +msgid "Direct messages to %s" +msgstr "Rektaj mesaĝoj al %s" + +#: actions/apidirectmessage.php:105 +#, php-format +msgid "All the direct messages sent to %s" +msgstr "Ĉiuj rektaj mesaĝoj senditaj al %s" + +#: actions/apidirectmessagenew.php:118 +msgid "No message text!" +msgstr "Sen mesaĝteksto!" + +#: actions/apidirectmessagenew.php:127 actions/newmessage.php:150 +#, php-format +msgid "That's too long. Max message size is %d chars." +msgstr "Tro longas. Mesaĝa longlimo estas %d signoj." + +#: actions/apidirectmessagenew.php:138 +msgid "Recipient user not found." +msgstr "Ricevonta uzanto ne troviĝas." + +#: actions/apidirectmessagenew.php:142 +msgid "Can't send direct messages to users who aren't your friend." +msgstr "Vi ne povas sendi rektan mesaĝon al uzanto kiu ne estas via amiko." + +#: actions/apifavoritecreate.php:109 actions/apifavoritedestroy.php:110 +#: actions/apistatusesdestroy.php:121 +msgid "No status found with that ID." +msgstr "Stato kun tiu ID ne trovitas." + +#: actions/apifavoritecreate.php:120 +msgid "This status is already a favorite." +msgstr "Ĉi tiu stato jam estas ŝatata." + +#: actions/apifavoritecreate.php:131 actions/favor.php:84 lib/command.php:285 +msgid "Could not create favorite." +msgstr "Malsukcesis krei ŝataton." + +#: actions/apifavoritedestroy.php:123 +msgid "That status is not a favorite." +msgstr "La stato ne estas ŝatata." + +#: actions/apifavoritedestroy.php:135 actions/disfavor.php:87 +msgid "Could not delete favorite." +msgstr "Malsukcesis forigi ŝataton." + +#: actions/apifriendshipscreate.php:109 +msgid "Could not follow user: profile not found." +msgstr "Malsukcesis aboni uzanton: profilo ne troviĝas." + +#: actions/apifriendshipscreate.php:118 +#, php-format +msgid "Could not follow user: %s is already on your list." +msgstr "Ne povas aboni uzanton: %s estas jam en via listo." + +#: actions/apifriendshipsdestroy.php:109 +msgid "Could not unfollow user: User not found." +msgstr "Ne povas malaboni uzanton. Uzanto ne troviĝas." + +#: actions/apifriendshipsdestroy.php:120 +msgid "You cannot unfollow yourself." +msgstr "Vi ne povas malaboni vin mem." + +#: actions/apifriendshipsexists.php:91 +msgid "Two valid IDs or screen_names must be supplied." +msgstr "Du uzantajn IDojn aŭ montronomojn vi devas specifi." + +#: actions/apifriendshipsshow.php:134 +msgid "Could not determine source user." +msgstr " Malsukcesis certigi fontan uzanton." + +#: actions/apifriendshipsshow.php:142 +msgid "Could not find target user." +msgstr "Malsukcesis trovi celan uzanton." + +#: actions/apigroupcreate.php:167 actions/editgroup.php:186 +#: actions/newgroup.php:126 actions/profilesettings.php:215 +#: actions/register.php:212 +msgid "Nickname must have only lowercase letters and numbers and no spaces." +msgstr "" +"Kromnomo devas havi nur minuskulajn literojn kaj numerojn sed neniun spacon." + +#: actions/apigroupcreate.php:176 actions/editgroup.php:190 +#: actions/newgroup.php:130 actions/profilesettings.php:238 +#: actions/register.php:215 +msgid "Nickname already in use. Try another one." +msgstr "La uzantnomo jam uziĝis. Provu ion alian." + +#: actions/apigroupcreate.php:183 actions/editgroup.php:193 +#: actions/newgroup.php:133 actions/profilesettings.php:218 +#: actions/register.php:217 +msgid "Not a valid nickname." +msgstr "Ne valida kromnomo." + +#: actions/apigroupcreate.php:199 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 +#: actions/newgroup.php:139 actions/profilesettings.php:222 +#: actions/register.php:224 +msgid "Homepage is not a valid URL." +msgstr "Ĉefpaĝo ne estas valida URL." + +#: actions/apigroupcreate.php:208 actions/editgroup.php:202 +#: actions/newgroup.php:142 actions/profilesettings.php:225 +#: actions/register.php:227 +msgid "Full name is too long (max 255 chars)." +msgstr "Plennomo estas tro longa (maksimume 255 literoj)" + +#: actions/apigroupcreate.php:216 actions/editapplication.php:190 +#: actions/newapplication.php:172 +#, php-format +msgid "Description is too long (max %d chars)." +msgstr "Priskribo estas tro longa (maksimume %d signoj)." + +#: actions/apigroupcreate.php:227 actions/editgroup.php:208 +#: actions/newgroup.php:148 actions/profilesettings.php:232 +#: actions/register.php:234 +msgid "Location is too long (max 255 chars)." +msgstr "lokonomo estas tro longa (maksimume 255 literoj)" + +#: actions/apigroupcreate.php:246 actions/editgroup.php:219 +#: actions/newgroup.php:159 +#, php-format +msgid "Too many aliases! Maximum %d." +msgstr "Tro da alinomoj! Maksimume %d." + +#: actions/apigroupcreate.php:267 +#, php-format +msgid "Invalid alias: \"%s\"." +msgstr "La alinomo estas nevalida: \"%*s\"." + +#: actions/apigroupcreate.php:276 actions/editgroup.php:232 +#: actions/newgroup.php:172 +#, php-format +msgid "Alias \"%s\" already in use. Try another one." +msgstr "La alinomo \"%s\" estas jam okupita. Provu ion alian." + +#: actions/apigroupcreate.php:289 actions/editgroup.php:238 +#: actions/newgroup.php:178 +msgid "Alias can't be the same as nickname." +msgstr "La alinomo devas ne esti sama al la kromnomo." + +#: actions/apigroupismember.php:96 actions/apigroupjoin.php:105 +#: actions/apigroupleave.php:105 actions/apigroupmembership.php:92 +#: actions/apigroupshow.php:83 actions/apitimelinegroup.php:92 +msgid "Group not found." +msgstr "Grupo ne troviĝas." + +#: actions/apigroupjoin.php:111 actions/joingroup.php:100 +msgid "You are already a member of that group." +msgstr "Vi estas jam grupano." + +#: actions/apigroupjoin.php:120 actions/joingroup.php:105 lib/command.php:327 +msgid "You have been blocked from that group by the admin." +msgstr "La administranto blokis vin de tiu grupo." + +#: actions/apigroupjoin.php:139 actions/joingroup.php:134 +#, php-format +msgid "Could not join user %1$s to group %2$s." +msgstr "La uzanto %1$*s ne povas aliĝi al la grupo %2$*s." + +#: actions/apigroupleave.php:115 +msgid "You are not a member of this group." +msgstr "Vi ne estas grupano." + +#: actions/apigroupleave.php:125 actions/leavegroup.php:129 +#, php-format +msgid "Could not remove user %1$s from group %2$s." +msgstr "Malsukcesis forigi uzanton %1$s de grupo %2$s." + +#. TRANS: %s is a user name +#: actions/apigrouplist.php:98 +#, php-format +msgid "%s's groups" +msgstr "Grupoj de %s" + +#. TRANS: Meant to convey the user %2$s is a member of each of the groups listed on site %1$s +#: actions/apigrouplist.php:108 +#, php-format +msgid "%1$s groups %2$s is a member of." +msgstr "Grupoj de %2$s ĉe %1$s." + +#. TRANS: Message is used as a title. %s is a site name. +#. TRANS: Message is used as a page title. %s is a nick name. +#: actions/apigrouplistall.php:92 actions/usergroups.php:63 +#, php-format +msgid "%s groups" +msgstr "Grupoj de %s" + +#: actions/apigrouplistall.php:96 +#, php-format +msgid "groups on %s" +msgstr "grupoj ĉe %s" + +#: actions/apimediaupload.php:99 +msgid "Upload failed." +msgstr "Malsukcesis alŝuti" + +#: actions/apioauthauthorize.php:101 +msgid "No oauth_token parameter provided." +msgstr "Ne oauth_token parametro provizita." + +#: actions/apioauthauthorize.php:106 +msgid "Invalid token." +msgstr "Nevalida ĵetono" + +#: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 +#: actions/deletenotice.php:169 actions/disfavor.php:74 +#: actions/emailsettings.php:267 actions/favor.php:75 actions/geocode.php:55 +#: actions/groupblock.php:66 actions/grouplogo.php:312 +#: actions/groupunblock.php:66 actions/imsettings.php:227 +#: actions/invite.php:56 actions/login.php:137 actions/makeadmin.php:66 +#: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 +#: actions/oauthappssettings.php:159 actions/oauthconnectionssettings.php:135 +#: actions/othersettings.php:145 actions/passwordsettings.php:138 +#: actions/profilesettings.php:194 actions/recoverpassword.php:350 +#: actions/register.php:172 actions/remotesubscribe.php:77 +#: actions/repeat.php:83 actions/smssettings.php:256 actions/subedit.php:38 +#: actions/subscribe.php:86 actions/tagother.php:166 +#: actions/unsubscribe.php:69 actions/userauthorization.php:52 +#: lib/designsettings.php:294 +msgid "There was a problem with your session token. Try again, please." +msgstr "Estis problemo pri via seanco. Bonvolu provi refoje." + +#: actions/apioauthauthorize.php:135 +msgid "Invalid nickname / password!" +msgstr "Nevalida kromnomo / pasvorto!" + +#: actions/apioauthauthorize.php:159 +msgid "Database error deleting OAuth application user." +msgstr "Datumbaza eraro forigi la uzanton de *OAuth-aplikaĵo." + +#: actions/apioauthauthorize.php:185 +msgid "Database error inserting OAuth application user." +msgstr "Datumbaza eraro enigi la uzanton de *OAuth-aplikaĵo." + +#: actions/apioauthauthorize.php:214 +#, php-format +msgid "" +"The request token %s has been authorized. Please exchange it for an access " +"token." +msgstr "" +"La demanda ĵetono %s estis rajtigita. Bonvolu interŝanĝi ĝin por atinga " +"ĵetono." + +#: actions/apioauthauthorize.php:227 +#, php-format +msgid "The request token %s has been denied and revoked." +msgstr "La demanda token %s estis neita kaj revokita." + +#. TRANS: Message given submitting a form with an unknown action in e-mail settings. +#. TRANS: Message given submitting a form with an unknown action in IM settings. +#. TRANS: Message given submitting a form with an unknown action in SMS settings. +#: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 +#: actions/designadminpanel.php:104 actions/editapplication.php:139 +#: actions/emailsettings.php:286 actions/grouplogo.php:322 +#: actions/imsettings.php:242 actions/newapplication.php:121 +#: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 +#: actions/smssettings.php:277 lib/designsettings.php:304 +msgid "Unexpected form submission." +msgstr "Neatendita formo-sendo." + +#: actions/apioauthauthorize.php:259 +msgid "An application would like to connect to your account" +msgstr "Aplikaĵo volas konekti al via konto" + +#: actions/apioauthauthorize.php:276 +msgid "Allow or deny access" +msgstr "Permesi aŭ malpermesi atingon" + +#: actions/apioauthauthorize.php:292 +#, php-format +msgid "" +"The application %1$s by %2$s would like " +"the ability to %3$s your %4$s account data. You should only " +"give access to your %4$s account to third parties you trust." +msgstr "" +"La aplikaĵo %1$s de %2$s volas la kapablon " +"%3$s vian %4$s kontdatumon. Vi devas doni atingon nur al " +"via %4$s konto al triaj partioj, kiujn vi fidas." + +#. TRANS: Main menu option when logged in for access to user settings +#: actions/apioauthauthorize.php:310 lib/action.php:450 +msgid "Account" +msgstr "Konto" + +#: actions/apioauthauthorize.php:313 actions/login.php:252 +#: actions/profilesettings.php:106 actions/register.php:431 +#: actions/showgroup.php:245 actions/tagother.php:94 +#: actions/userauthorization.php:145 lib/groupeditform.php:152 +#: lib/userprofile.php:132 +msgid "Nickname" +msgstr "Kromnomo" + +#. TRANS: Link description in user account settings menu. +#: actions/apioauthauthorize.php:316 actions/login.php:255 +#: actions/register.php:436 lib/accountsettingsaction.php:125 +msgid "Password" +msgstr "Pasvorto" + +#: actions/apioauthauthorize.php:328 +msgid "Deny" +msgstr "Malpermesi" + +#: actions/apioauthauthorize.php:334 +msgid "Allow" +msgstr "Permesi" + +#: actions/apioauthauthorize.php:351 +msgid "Allow or deny access to your account information." +msgstr "Permesi aŭ malpermesi atingon al via kontdatumo." + +#: actions/apistatusesdestroy.php:112 +msgid "This method requires a POST or DELETE." +msgstr "Ĉi tiu metodo bezonas POST aǔ DELETE." + +#: actions/apistatusesdestroy.php:135 +msgid "You may not delete another user's status." +msgstr "Vi ne povas forigi la staton de alia uzanto." + +#: actions/apistatusesretweet.php:75 actions/apistatusesretweets.php:72 +#: actions/deletenotice.php:52 actions/shownotice.php:92 +msgid "No such notice." +msgstr "Ne estas tiu avizo." + +#: actions/apistatusesretweet.php:83 +msgid "Cannot repeat your own notice." +msgstr "Vi ne povas ripeti vian propran avizon." + +#: actions/apistatusesretweet.php:91 +msgid "Already repeated that notice." +msgstr "La avizo jam ripetiĝis." + +#: actions/apistatusesshow.php:139 +msgid "Status deleted." +msgstr "Stato forigita." + +#: actions/apistatusesshow.php:145 +msgid "No status with that ID found." +msgstr "Neniu stato kun tiu ID troviĝas." + +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "Kliento devas providi al \"stato\"-parametro valoron." + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 +#: lib/mailhandler.php:60 +#, php-format +msgid "That's too long. Max notice size is %d chars." +msgstr "Tro longas. Aviza longlimo estas %*d signoj." + +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 +msgid "Not found." +msgstr "Ne troviĝas." + +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 +#, php-format +msgid "Max notice size is %d chars, including attachment URL." +msgstr "Aviza longlimo estas %d signoj, enkalkulante ankaŭ la retadresojn." + +#: actions/apisubscriptions.php:232 actions/apisubscriptions.php:262 +msgid "Unsupported format." +msgstr "Formato ne subtenata." + +#: actions/apitimelinefavorites.php:110 +#, php-format +msgid "%1$s / Favorites from %2$s" +msgstr "%1$*s / Ŝatato de %2$*s" + +#: actions/apitimelinefavorites.php:119 +#, php-format +msgid "%1$s updates favorited by %2$s / %2$s." +msgstr "%1$*s ĝisdatigoj ŝatataj de %2$*s / %2$*s." + +#: actions/apitimelinementions.php:118 +#, php-format +msgid "%1$s / Updates mentioning %2$s" +msgstr "%1$s / Ĝisdatigoj kiuj mencias %2$s" + +#: actions/apitimelinementions.php:131 +#, php-format +msgid "%1$s updates that reply to updates from %2$s / %3$s." +msgstr "%1$s ĝisdatigoj kiuj respondas al ĝisdatigoj de %2$s / %3$s." + +#: actions/apitimelinepublic.php:197 actions/publicrss.php:103 +#, php-format +msgid "%s public timeline" +msgstr "%s publika tempstrio" + +#: actions/apitimelinepublic.php:202 actions/publicrss.php:105 +#, php-format +msgid "%s updates from everyone!" +msgstr "%s ĝisdatigoj de ĉiuj!" + +#: actions/apitimelineretweetedtome.php:111 +#, php-format +msgid "Repeated to %s" +msgstr "Ripetita al %s" + +#: actions/apitimelineretweetsofme.php:114 +#, php-format +msgid "Repeats of %s" +msgstr "Ripetoj de %s" + +#: actions/apitimelinetag.php:105 actions/tag.php:67 +#, php-format +msgid "Notices tagged with %s" +msgstr "Avizoj etikeditaj %s" + +#: actions/apitimelinetag.php:107 actions/tagrss.php:65 +#, php-format +msgid "Updates tagged with %1$s on %2$s!" +msgstr "Ĝisdatigoj etikeditaj %1$s ĉe %2$s!" + +#: actions/apitrends.php:87 +msgid "API method under construction." +msgstr "API-metodo farata." + +#: actions/attachment.php:73 +msgid "No such attachment." +msgstr "Ne estas tiu aldonaĵo." + +#: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 +#: actions/editgroup.php:84 actions/groupdesignsettings.php:84 +#: actions/grouplogo.php:86 actions/groupmembers.php:76 +#: actions/grouprss.php:91 actions/showgroup.php:121 +msgid "No nickname." +msgstr "Neniu kromnomo." + +#: actions/avatarbynickname.php:64 +msgid "No size." +msgstr " Neniu grando." + +#: actions/avatarbynickname.php:69 +msgid "Invalid size." +msgstr "Grando nevalida." + +#. TRANS: Link description in user account settings menu. +#: actions/avatarsettings.php:67 actions/showgroup.php:230 +#: lib/accountsettingsaction.php:118 +msgid "Avatar" +msgstr "Vizaĝbildo" + +#: actions/avatarsettings.php:78 +#, php-format +msgid "You can upload your personal avatar. The maximum file size is %s." +msgstr "Vi povas alŝuti vian personan vizaĝbildon. Dosiero-grandlimo estas %s." + +#: actions/avatarsettings.php:106 actions/avatarsettings.php:185 +#: actions/grouplogo.php:181 actions/remotesubscribe.php:191 +#: actions/userauthorization.php:72 actions/userrss.php:108 +msgid "User without matching profile." +msgstr "Uzanto sen egala profilo." + +#: actions/avatarsettings.php:119 actions/avatarsettings.php:197 +#: actions/grouplogo.php:254 +msgid "Avatar settings" +msgstr "Vizaĝbilda agordo" + +#: actions/avatarsettings.php:127 actions/avatarsettings.php:205 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 +msgid "Original" +msgstr "Originala" + +#: actions/avatarsettings.php:142 actions/avatarsettings.php:217 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 +msgid "Preview" +msgstr "Antaŭrigardo" + +#: actions/avatarsettings.php:149 actions/showapplication.php:252 +#: lib/deleteuserform.php:66 lib/noticelist.php:657 +msgid "Delete" +msgstr "Forigi" + +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 +msgid "Upload" +msgstr "Alŝuti" + +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 +msgid "Crop" +msgstr "Tranĉi" + +#: actions/avatarsettings.php:305 +msgid "No file uploaded." +msgstr "Neniu dosiero alŝutiĝas." + +#: actions/avatarsettings.php:332 +msgid "Pick a square area of the image to be your avatar" +msgstr "Elektu kvadratan parton de la bildo kiel via vizaĝbildo" + +#: actions/avatarsettings.php:347 actions/grouplogo.php:380 +msgid "Lost our file data." +msgstr "Perdiĝis nia dosiera datumo." + +#: actions/avatarsettings.php:370 +msgid "Avatar updated." +msgstr "Vizaĝbildo ĝisdatigita." + +#: actions/avatarsettings.php:373 +msgid "Failed updating avatar." +msgstr "Eraris ĝisdatigi vizaĝbildon." + +#: actions/avatarsettings.php:397 +msgid "Avatar deleted." +msgstr "Vizaĝbildo forigita." + +#: actions/block.php:69 +msgid "You already blocked that user." +msgstr "Vi jam blokis la uzanton." + +#: actions/block.php:107 actions/block.php:136 actions/groupblock.php:158 +msgid "Block user" +msgstr "Bloki uzanton" + +#: actions/block.php:138 +msgid "" +"Are you sure you want to block this user? Afterwards, they will be " +"unsubscribed from you, unable to subscribe to you in the future, and you " +"will not be notified of any @-replies from them." +msgstr "" +"Ĉu vi certe volas bloki la uzanton? Poste, ili malaboniĝos de vi, ne povos " +"aboni vin kaj vi ne ricevos avizon pro ilia ajna @-respondo." + +#. TRANS: Button label on the user block form. +#. TRANS: Button label on the delete application form. +#. TRANS: Button label on the delete notice form. +#. TRANS: Button label on the delete user form. +#. TRANS: Button label on the form to block a user from a group. +#: actions/block.php:153 actions/deleteapplication.php:154 +#: actions/deletenotice.php:147 actions/deleteuser.php:152 +#: actions/groupblock.php:178 +msgctxt "BUTTON" +msgid "No" +msgstr "Ne" + +#. TRANS: Submit button title for 'No' when blocking a user. +#. TRANS: Submit button title for 'No' when deleting a user. +#: actions/block.php:157 actions/deleteuser.php:156 +msgid "Do not block this user" +msgstr "Ne bloki la uzanton" + +#. TRANS: Button label on the user block form. +#. TRANS: Button label on the delete application form. +#. TRANS: Button label on the delete notice form. +#. TRANS: Button label on the delete user form. +#. TRANS: Button label on the form to block a user from a group. +#: actions/block.php:160 actions/deleteapplication.php:161 +#: actions/deletenotice.php:154 actions/deleteuser.php:159 +#: actions/groupblock.php:185 +msgctxt "BUTTON" +msgid "Yes" +msgstr "Jes" + +#. TRANS: Submit button title for 'Yes' when blocking a user. +#: actions/block.php:164 actions/groupmembers.php:392 lib/blockform.php:80 +msgid "Block this user" +msgstr "Bloki la uzanton" + +#: actions/block.php:187 +msgid "Failed to save block information." +msgstr "Eraris konservi blokado-informon." + +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:166 +#: lib/command.php:368 +msgid "No such group." +msgstr "Ne estas tiu grupo." + +#: actions/blockedfromgroup.php:97 +#, php-format +msgid "%s blocked profiles" +msgstr "%s profiloj blokitaj" + +#: actions/blockedfromgroup.php:100 +#, php-format +msgid "%1$s blocked profiles, page %2$d" +msgstr "%1$s profiloj blokitaj, paĝo %2$d" + +#: actions/blockedfromgroup.php:115 +msgid "A list of the users blocked from joining this group." +msgstr "Listo de uzantoj blokita de aniĝi al ĉi tiun grupo." + +#: actions/blockedfromgroup.php:288 +msgid "Unblock user from group" +msgstr "Malbloki uzanton de grupo" + +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 +msgid "Unblock" +msgstr "Malbloki" + +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 +msgid "Unblock this user" +msgstr "Malbloki ĉi tiun uzanton" + +#. TRANS: Title for mini-posting window loaded from bookmarklet. +#: actions/bookmarklet.php:51 +#, php-format +msgid "Post to %s" +msgstr "Sendi al %s" + +#: actions/confirmaddress.php:75 +msgid "No confirmation code." +msgstr "Neniu konfirma kodo." + +#: actions/confirmaddress.php:80 +msgid "Confirmation code not found." +msgstr "Konfirma kodo ne trovitas." + +#: actions/confirmaddress.php:85 +msgid "That confirmation code is not for you!" +msgstr "Tiu komfirmnumero ne estas por vi!" + +#. TRANS: Server error for an unknow address type, which can be 'email', 'jabber', or 'sms'. +#: actions/confirmaddress.php:91 +#, php-format +msgid "Unrecognized address type %s." +msgstr "Nerekonata adrestipo %s." + +#. TRANS: Client error for an already confirmed email/jabbel/sms address. +#: actions/confirmaddress.php:96 +msgid "That address has already been confirmed." +msgstr "La adreso jam estis konfirmita." + +#. TRANS: Server error thrown on database error updating e-mail preferences. +#. TRANS: Server error thrown on database error removing a registered e-mail address. +#. TRANS: Server error thrown on database error updating IM preferences. +#. TRANS: Server error thrown on database error removing a registered IM address. +#. TRANS: Server error thrown on database error updating SMS preferences. +#. TRANS: Server error thrown on database error removing a registered SMS phone number. +#: actions/confirmaddress.php:116 actions/emailsettings.php:327 +#: actions/emailsettings.php:473 actions/imsettings.php:280 +#: actions/imsettings.php:439 actions/othersettings.php:174 +#: actions/profilesettings.php:283 actions/smssettings.php:308 +#: actions/smssettings.php:464 +msgid "Couldn't update user." +msgstr "Ne povus ĝisdatigi uzanton." + +#. TRANS: Server error thrown on database error canceling e-mail address confirmation. +#. TRANS: Server error thrown on database error canceling SMS phone number confirmation. +#: actions/confirmaddress.php:128 actions/emailsettings.php:433 +#: actions/smssettings.php:422 +msgid "Couldn't delete email confirmation." +msgstr "Ne povas forigi retpoŝtan konfirmon." + +#: actions/confirmaddress.php:146 +msgid "Confirm address" +msgstr "Konfirmi retadreson" + +#: actions/confirmaddress.php:161 +#, php-format +msgid "The address \"%s\" has been confirmed for your account." +msgstr "Adreso \"%s\" nun konfirmitas je via konto." + +#: actions/conversation.php:99 +msgid "Conversation" +msgstr "Konversacio" + +#: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87 +#: lib/profileaction.php:229 lib/searchgroupnav.php:82 +msgid "Notices" +msgstr "Avizoj" + +#: actions/deleteapplication.php:63 +msgid "You must be logged in to delete an application." +msgstr "Ensalutu por forigi la aplikaĵon." + +#: actions/deleteapplication.php:71 +msgid "Application not found." +msgstr "Aplikaĵo ne trovita." + +#: actions/deleteapplication.php:78 actions/editapplication.php:77 +#: actions/showapplication.php:94 +msgid "You are not the owner of this application." +msgstr "Vi ne estas la posedanto de ĉi tiu aplikaĵo." + +#: actions/deleteapplication.php:102 actions/editapplication.php:127 +#: actions/newapplication.php:110 actions/showapplication.php:118 +#: lib/action.php:1263 +msgid "There was a problem with your session token." +msgstr "Problemo okazas pri via seancĵetono." + +#: actions/deleteapplication.php:123 actions/deleteapplication.php:147 +msgid "Delete application" +msgstr "Forigi aplikaĵon" + +#: actions/deleteapplication.php:149 +msgid "" +"Are you sure you want to delete this application? This will clear all data " +"about the application from the database, including all existing user " +"connections." +msgstr "" +"Ĉu vi certe volas forigi la aplikaĵon? Ĉiu datumo pri la aplikaĵo viŝiĝos de " +"la datumbazo, inkluzive de ĉiu ekzistanta uzanto-konekto." + +#. TRANS: Submit button title for 'No' when deleting an application. +#: actions/deleteapplication.php:158 +msgid "Do not delete this application" +msgstr "Ne forigu ĉi tiun aplikaĵon." + +#. TRANS: Submit button title for 'Yes' when deleting an application. +#: actions/deleteapplication.php:164 +msgid "Delete this application" +msgstr "Viŝi ĉi tiun aplikon" + +#. TRANS: Client error message thrown when trying to access the admin panel while not logged in. +#: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 +#: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 +#: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 +#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 +#: actions/tagother.php:33 actions/unsubscribe.php:52 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:64 +#: lib/settingsaction.php:72 +msgid "Not logged in." +msgstr "Ne konektita." + +#: actions/deletenotice.php:71 +msgid "Can't delete this notice." +msgstr "Ne povas forigi ĉi tiun avizon." + +#: actions/deletenotice.php:103 +msgid "" +"You are about to permanently delete a notice. Once this is done, it cannot " +"be undone." +msgstr "" +"Vi nun por ĉiam forigos avizon. Kiam tio fariĝos, ne plu eblos malfari tion." + +#: actions/deletenotice.php:109 actions/deletenotice.php:141 +msgid "Delete notice" +msgstr "Forigi avizon" + +#: actions/deletenotice.php:144 +msgid "Are you sure you want to delete this notice?" +msgstr "Ĉu vi certe volas forigi la avizon?" + +#. TRANS: Submit button title for 'No' when deleting a notice. +#: actions/deletenotice.php:151 +msgid "Do not delete this notice" +msgstr "Ne forigi la avizon" + +#. TRANS: Submit button title for 'Yes' when deleting a notice. +#: actions/deletenotice.php:158 lib/noticelist.php:657 +msgid "Delete this notice" +msgstr "Forigi la avizon" + +#: actions/deleteuser.php:67 +msgid "You cannot delete users." +msgstr "Vi ne povas forigi uzantojn." + +#: actions/deleteuser.php:74 +msgid "You can only delete local users." +msgstr "Vi povas forigi nur lokan uzanton." + +#: actions/deleteuser.php:110 actions/deleteuser.php:133 +msgid "Delete user" +msgstr "Forigi uzanton" + +#: actions/deleteuser.php:136 +msgid "" +"Are you sure you want to delete this user? This will clear all data about " +"the user from the database, without a backup." +msgstr "" +"Ĉu vi certe volas forigi la uzanton? Ĉiu datumo pri la uzanto viŝiĝos de la " +"datumbazo sen sekurkopio." + +#. TRANS: Submit button title for 'Yes' when deleting a user. +#: actions/deleteuser.php:163 lib/deleteuserform.php:77 +msgid "Delete this user" +msgstr "Forigi la uzanton" + +#. TRANS: Message used as title for design settings for the site. +#. TRANS: Link description in user account settings menu. +#: actions/designadminpanel.php:63 lib/accountsettingsaction.php:139 +#: lib/groupnav.php:119 +msgid "Design" +msgstr "Aspekto" + +#: actions/designadminpanel.php:74 +msgid "Design settings for this StatusNet site." +msgstr "Aspektaj agordoj por ĉi tiu StatusNet-retejo." + +#: actions/designadminpanel.php:318 +msgid "Invalid logo URL." +msgstr "URL por la emblemo nevalida." + +#: actions/designadminpanel.php:322 +#, php-format +msgid "Theme not available: %s." +msgstr "Desegno ne havebla: %s." + +#: actions/designadminpanel.php:426 +msgid "Change logo" +msgstr "Ŝanĝi emblemon" + +#: actions/designadminpanel.php:431 +msgid "Site logo" +msgstr "Reteja emblemo" + +#: actions/designadminpanel.php:443 +msgid "Change theme" +msgstr "Ŝanĝi desegnon" + +#: actions/designadminpanel.php:460 +msgid "Site theme" +msgstr "Reteja desegno" + +#: actions/designadminpanel.php:461 +msgid "Theme for the site." +msgstr "Desegno por la retejo" + +#: actions/designadminpanel.php:467 +msgid "Custom theme" +msgstr "Propra desegno" + +#: actions/designadminpanel.php:471 +msgid "You can upload a custom StatusNet theme as a .ZIP archive." +msgstr "Vi povas alŝuti propran StatusNet-desegnon kiel .zip-dosiero" + +#: actions/designadminpanel.php:486 lib/designsettings.php:101 +msgid "Change background image" +msgstr "Ŝanĝi fonbildon" + +#: actions/designadminpanel.php:491 actions/designadminpanel.php:574 +#: lib/designsettings.php:178 +msgid "Background" +msgstr "Fono" + +#: actions/designadminpanel.php:496 +#, php-format +msgid "" +"You can upload a background image for the site. The maximum file size is %1" +"$s." +msgstr "Vi povas alŝuti fonbildon por la retejo. Dosiero-grandlimo estas %1$s." + +#. TRANS: Used as radio button label to add a background image. +#: actions/designadminpanel.php:527 lib/designsettings.php:139 +msgid "On" +msgstr "En" + +#. TRANS: Used as radio button label to not add a background image. +#: actions/designadminpanel.php:544 lib/designsettings.php:155 +msgid "Off" +msgstr "For" + +#: actions/designadminpanel.php:545 lib/designsettings.php:156 +msgid "Turn background image on or off." +msgstr "Aktivigi aŭ senaktivigi fonbildon" + +#: actions/designadminpanel.php:550 lib/designsettings.php:161 +msgid "Tile background image" +msgstr "Ripeti la fonbildon" + +#: actions/designadminpanel.php:564 lib/designsettings.php:170 +msgid "Change colours" +msgstr "Ŝanĝi kolorojn" + +#: actions/designadminpanel.php:587 lib/designsettings.php:191 +msgid "Content" +msgstr "Enhavo" + +#: actions/designadminpanel.php:600 lib/designsettings.php:204 +msgid "Sidebar" +msgstr "Flanka strio" + +#: actions/designadminpanel.php:613 lib/designsettings.php:217 +msgid "Text" +msgstr "Teksto" + +#: actions/designadminpanel.php:626 lib/designsettings.php:230 +msgid "Links" +msgstr "Ligiloj" + +#: actions/designadminpanel.php:651 +msgid "Advanced" +msgstr "Speciala" + +#: actions/designadminpanel.php:655 +msgid "Custom CSS" +msgstr "Propra CSS" + +#: actions/designadminpanel.php:676 lib/designsettings.php:247 +msgid "Use defaults" +msgstr "Uzu defaŭlton" + +#: actions/designadminpanel.php:677 lib/designsettings.php:248 +msgid "Restore default designs" +msgstr "Restaŭri defaŭltajn desegnojn" + +#: actions/designadminpanel.php:683 lib/designsettings.php:254 +msgid "Reset back to default" +msgstr "Redefaŭltiĝi" + +#. TRANS: Submit button title +#: actions/designadminpanel.php:685 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292 +#: actions/sitenoticeadminpanel.php:195 actions/snapshotadminpanel.php:245 +#: actions/subscriptions.php:226 actions/tagother.php:154 +#: actions/useradminpanel.php:294 lib/applicationeditform.php:363 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "Konservi" + +#: actions/designadminpanel.php:686 lib/designsettings.php:257 +msgid "Save design" +msgstr "Savi desegnon" + +#: actions/disfavor.php:81 +msgid "This notice is not a favorite!" +msgstr "Ĉi tiu avizo ne estas preferita" + +#: actions/disfavor.php:94 +msgid "Add to favorites" +msgstr "Aldoni al ŝatolisto" + +#: actions/doc.php:158 +#, php-format +msgid "No such document \"%s\"" +msgstr "Ne estas tia dokumento \"%s\"" + +#: actions/editapplication.php:54 +msgid "Edit Application" +msgstr "Redakti Aplikon" + +#: actions/editapplication.php:66 +msgid "You must be logged in to edit an application." +msgstr "Ensalutu por redakti la aplikaĵon." + +#: actions/editapplication.php:81 actions/oauthconnectionssettings.php:166 +#: actions/showapplication.php:87 +msgid "No such application." +msgstr "Ne estas tia aplikaĵo." + +#: actions/editapplication.php:161 +msgid "Use this form to edit your application." +msgstr "Uzu ĉi tiun formularon por redakti vian aplikaĵon." + +#: actions/editapplication.php:177 actions/newapplication.php:159 +msgid "Name is required." +msgstr "Nomo necesas." + +#: actions/editapplication.php:180 actions/newapplication.php:165 +msgid "Name is too long (max 255 chars)." +msgstr "La nomo estas tro longa (maksimume 255 literoj)" + +#: actions/editapplication.php:183 actions/newapplication.php:162 +msgid "Name already in use. Try another one." +msgstr "La nomo jam uziĝis. Provu ion alian." + +#: actions/editapplication.php:186 actions/newapplication.php:168 +msgid "Description is required." +msgstr "Priskribo necesas." + +#: actions/editapplication.php:194 +msgid "Source URL is too long." +msgstr "Fonta URL estas tro longa." + +#: actions/editapplication.php:200 actions/newapplication.php:185 +msgid "Source URL is not valid." +msgstr "Fonta URL estas nevalida." + +#: actions/editapplication.php:203 actions/newapplication.php:188 +msgid "Organization is required." +msgstr "Organizo necesas." + +#: actions/editapplication.php:206 actions/newapplication.php:191 +msgid "Organization is too long (max 255 chars)." +msgstr "Organizonomo estas tro longa (maksimume 255 literoj)." + +#: actions/editapplication.php:209 actions/newapplication.php:194 +msgid "Organization homepage is required." +msgstr "Organiza ĉefpaĝo bezoniĝas." + +#: actions/editapplication.php:218 actions/newapplication.php:206 +msgid "Callback is too long." +msgstr "Revokfunkcio estas tro longa." + +#: actions/editapplication.php:225 actions/newapplication.php:215 +msgid "Callback URL is not valid." +msgstr "Revokfunkcia URL estas nevalida." + +#: actions/editapplication.php:258 +msgid "Could not update application." +msgstr "Malsukcesis ĝisdatigi la aplikaĵon." + +#: actions/editgroup.php:56 +#, php-format +msgid "Edit %s group" +msgstr "Redakti %s grupon" + +#: actions/editgroup.php:68 actions/grouplogo.php:70 actions/newgroup.php:65 +msgid "You must be logged in to create a group." +msgstr "Ensalutu por krei grupon." + +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 +msgid "You must be an admin to edit the group." +msgstr "Vi devas esti administranto por redakti la grupon." + +#: actions/editgroup.php:158 +msgid "Use this form to edit the group." +msgstr "Uzas ĉi tiun formularon por redakti la grupon." + +#: actions/editgroup.php:205 actions/newgroup.php:145 +#, php-format +msgid "description is too long (max %d chars)." +msgstr "Priskribo estas tro longa (maksimume %d signoj)." + +#: actions/editgroup.php:228 actions/newgroup.php:168 +#, php-format +msgid "Invalid alias: \"%s\"" +msgstr "Nevalida alinomo: \"%s\"" + +#: actions/editgroup.php:258 +msgid "Could not update group." +msgstr "Malsukcesis ĝisdatigi grupon." + +#. TRANS: Server exception thrown when creating group aliases failed. +#: actions/editgroup.php:264 classes/User_group.php:514 +msgid "Could not create aliases." +msgstr "Malsukcesis krei alinomon." + +#: actions/editgroup.php:280 +msgid "Options saved." +msgstr "Elektoj konserviĝis." + +#. TRANS: Title for e-mail settings. +#: actions/emailsettings.php:61 +msgid "Email settings" +msgstr "Retpoŝta agordo" + +#. TRANS: E-mail settings page instructions. +#. TRANS: %%site.name%% is the name of the site. +#: actions/emailsettings.php:76 +#, php-format +msgid "Manage how you get email from %%site.name%%." +msgstr "Administri kiel ricevi mesaĝon de %%site.name%%." + +#. TRANS: Form legend for e-mail settings form. +#. TRANS: Field label for e-mail address input in e-mail settings form. +#: actions/emailsettings.php:106 actions/emailsettings.php:132 +msgid "Email address" +msgstr "Retpoŝtadreso" + +#. TRANS: Form note in e-mail settings form. +#: actions/emailsettings.php:112 +msgid "Current confirmed email address." +msgstr "Nuna konfirmita retpoŝtadreso." + +#. TRANS: Button label to remove a confirmed e-mail address. +#. TRANS: Button label for removing a set sender e-mail address to post notices from. +#. TRANS: Button label to remove a confirmed IM address. +#. TRANS: Button label to remove a confirmed SMS address. +#. TRANS: Button label for removing a set sender SMS e-mail address to post notices from. +#: actions/emailsettings.php:115 actions/emailsettings.php:158 +#: actions/imsettings.php:116 actions/smssettings.php:124 +#: actions/smssettings.php:180 +msgctxt "BUTTON" +msgid "Remove" +msgstr "Forigi" + +#: actions/emailsettings.php:122 +msgid "" +"Awaiting confirmation on this address. Check your inbox (and spam box!) for " +"a message with further instructions." +msgstr "" +"Atendanta konfirmon pri ĉi tiu adreso. Kontrolu vian alvenkeston (kaj " +"spamkeston!) pri mesaĝo kun plua instrukcio." + +#. TRANS: Button label to cancel an e-mail address confirmation procedure. +#. TRANS: Button label to cancel an IM address confirmation procedure. +#. TRANS: Button label to cancel a SMS address confirmation procedure. +#. TRANS: Button label +#: actions/emailsettings.php:127 actions/imsettings.php:131 +#: actions/smssettings.php:137 lib/applicationeditform.php:357 +msgctxt "BUTTON" +msgid "Cancel" +msgstr "Nuligi" + +#. TRANS: Instructions for e-mail address input form. +#: actions/emailsettings.php:135 +msgid "Email address, like \"UserName@example.org\"" +msgstr "Retpoŝtadreso, ekzemple \"ViaNomo@example.org\"" + +#. TRANS: Button label for adding an e-mail address in e-mail settings form. +#. TRANS: Button label for adding an IM address in IM settings form. +#. TRANS: Button label for adding a SMS phone number in SMS settings form. +#: actions/emailsettings.php:139 actions/imsettings.php:148 +#: actions/smssettings.php:162 +msgctxt "BUTTON" +msgid "Add" +msgstr "Aldoni" + +#. TRANS: Form legend for incoming e-mail settings form. +#. TRANS: Form legend for incoming SMS settings form. +#: actions/emailsettings.php:147 actions/smssettings.php:171 +msgid "Incoming email" +msgstr "Alveninta poŝto" + +#. TRANS: Form instructions for incoming e-mail form in e-mail settings. +#. TRANS: Form instructions for incoming SMS e-mail address form in SMS settings. +#: actions/emailsettings.php:155 actions/smssettings.php:178 +msgid "Send email to this address to post new notices." +msgstr "Sendu mesaĝon al la adreso por afiŝi novan avizon." + +#. TRANS: Instructions for incoming e-mail address input form. +#. TRANS: Instructions for incoming SMS e-mail address input form. +#: actions/emailsettings.php:164 actions/smssettings.php:186 +msgid "Make a new email address for posting to; cancels the old one." +msgstr "Krei novan retpoŝtadreson por afiŝado kaj nuligi la antaŭan." + +#. TRANS: Button label for adding an e-mail address to send notices from. +#. TRANS: Button label for adding an SMS e-mail address to send notices from. +#: actions/emailsettings.php:168 actions/smssettings.php:189 +msgctxt "BUTTON" +msgid "New" +msgstr "Nova" + +#. TRANS: Form legend for e-mail preferences form. +#: actions/emailsettings.php:174 +msgid "Email preferences" +msgstr "Retpoŝta agordo." + +#. TRANS: Checkbox label in e-mail preferences form. +#: actions/emailsettings.php:180 +msgid "Send me notices of new subscriptions through email." +msgstr "Sendu al mi avizon pri nova abonado per retpoŝto." + +#. TRANS: Checkbox label in e-mail preferences form. +#: actions/emailsettings.php:186 +msgid "Send me email when someone adds my notice as a favorite." +msgstr "Sendu al mi mesaĝon tiam, kiam iu ŝatas mian avizon ." + +#. TRANS: Checkbox label in e-mail preferences form. +#: actions/emailsettings.php:193 +msgid "Send me email when someone sends me a private message." +msgstr "Sendu al mi mesaĝon tiam, kiam iu sendas al mi privatan mesaĝon." + +#. TRANS: Checkbox label in e-mail preferences form. +#: actions/emailsettings.php:199 +msgid "Send me email when someone sends me an \"@-reply\"." +msgstr "Sendu al mi mesaĝon tiam, kiam iu sendas al mi \"@-respondon\"." + +#. TRANS: Checkbox label in e-mail preferences form. +#: actions/emailsettings.php:205 +msgid "Allow friends to nudge me and send me an email." +msgstr "Permesi al amikoj puŝeti min kaj sendi al mi retpoŝtan mesaĝon." + +#. TRANS: Checkbox label in e-mail preferences form. +#: actions/emailsettings.php:212 +msgid "I want to post notices by email." +msgstr "Mi volas afiŝi avizon per retpoŝto." + +#. TRANS: Checkbox label in e-mail preferences form. +#: actions/emailsettings.php:219 +msgid "Publish a MicroID for my email address." +msgstr "Publikigi MikroID por mia retpoŝtadreso." + +#. TRANS: Confirmation message for successful e-mail preferences save. +#: actions/emailsettings.php:334 +msgid "Email preferences saved." +msgstr "Retpoŝta prefero konserviĝis." + +#. TRANS: Message given saving e-mail address without having provided one. +#: actions/emailsettings.php:353 +msgid "No email address." +msgstr "Neniu retpoŝta adreso." + +#. TRANS: Message given saving e-mail address that cannot be normalised. +#: actions/emailsettings.php:361 +msgid "Cannot normalize that email address" +msgstr "Malsukcesis normigi tiun retpoŝtadreson" + +#. TRANS: Message given saving e-mail address that not valid. +#: actions/emailsettings.php:366 actions/register.php:208 +#: actions/siteadminpanel.php:144 +msgid "Not a valid email address." +msgstr "Retpoŝta adreso ne valida" + +#. TRANS: Message given saving e-mail address that is already set. +#: actions/emailsettings.php:370 +msgid "That is already your email address." +msgstr "Tiu jam estas via retpoŝtadreso." + +#. TRANS: Message given saving e-mail address that is already set for another user. +#: actions/emailsettings.php:374 +msgid "That email address already belongs to another user." +msgstr "Tiu retpoŝtadreso jam apartenas al alia uzanto." + +#. TRANS: Server error thrown on database error adding e-mail confirmation code. +#. TRANS: Server error thrown on database error adding IM confirmation code. +#. TRANS: Server error thrown on database error adding SMS confirmation code. +#: actions/emailsettings.php:391 actions/imsettings.php:348 +#: actions/smssettings.php:373 +msgid "Couldn't insert confirmation code." +msgstr "Malsukcesis enmeti konfirmkodon." + +#. TRANS: Message given saving valid e-mail address that is to be confirmed. +#: actions/emailsettings.php:398 +msgid "" +"A confirmation code was sent to the email address you added. Check your " +"inbox (and spam box!) for the code and instructions on how to use it." +msgstr "" +"Konfirmkodo jam senditas al la aldonita retpoŝtadreso. Kontrolu vian " +"alvenkeston (kaj spamkeston!) pri la kodo kaj instrukcio pri kiel uzi ĝin." + +#. TRANS: Message given canceling e-mail address confirmation that is not pending. +#. TRANS: Message given canceling IM address confirmation that is not pending. +#. TRANS: Message given canceling SMS phone number confirmation that is not pending. +#: actions/emailsettings.php:419 actions/imsettings.php:383 +#: actions/smssettings.php:408 +msgid "No pending confirmation to cancel." +msgstr "Ne estas peto-konfirmo por nuligi." + +#. TRANS: Message given canceling e-mail address confirmation for the wrong e-mail address. +#: actions/emailsettings.php:424 +msgid "That is the wrong email address." +msgstr "Tiu retpoŝtadreso estas malĝusta." + +#. TRANS: Message given after successfully canceling e-mail address confirmation. +#: actions/emailsettings.php:438 +msgid "Email confirmation cancelled." +msgstr "Retpoŝta konfirmo nuligita." + +#. TRANS: Message given trying to remove an e-mail address that is not +#. TRANS: registered for the active user. +#: actions/emailsettings.php:458 +msgid "That is not your email address." +msgstr "Tiu ne estas via retpoŝtadreso." + +#. TRANS: Message given after successfully removing a registered e-mail address. +#: actions/emailsettings.php:479 +msgid "The email address was removed." +msgstr "La retpoŝtadreso estas forigita." + +#: actions/emailsettings.php:493 actions/smssettings.php:568 +msgid "No incoming email address." +msgstr "Ne estas alvena retpoŝtadreso" + +#. TRANS: Server error thrown on database error removing incoming e-mail address. +#. TRANS: Server error thrown on database error adding incoming e-mail address. +#: actions/emailsettings.php:504 actions/emailsettings.php:528 +#: actions/smssettings.php:578 actions/smssettings.php:602 +msgid "Couldn't update user record." +msgstr "Malsukcesis ĝisdatigi uzantan informon." + +#. TRANS: Message given after successfully removing an incoming e-mail address. +#: actions/emailsettings.php:508 actions/smssettings.php:581 +msgid "Incoming email address removed." +msgstr "Alvena retpoŝtadreso forigita." + +#. TRANS: Message given after successfully adding an incoming e-mail address. +#: actions/emailsettings.php:532 actions/smssettings.php:605 +msgid "New incoming email address added." +msgstr "Nova alvena retpoŝtadreso aldonita." + +#: actions/favor.php:79 +msgid "This notice is already a favorite!" +msgstr "Ĉi tiu avizo jam estas ŝatata." + +#: actions/favor.php:92 lib/disfavorform.php:140 +msgid "Disfavor favorite" +msgstr "Malŝati ŝataton." + +#: actions/favorited.php:65 lib/popularnoticesection.php:91 +#: lib/publicgroupnav.php:93 +msgid "Popular notices" +msgstr "Populara avizo" + +#: actions/favorited.php:67 +#, php-format +msgid "Popular notices, page %d" +msgstr "Populara avizo, paĝo %d" + +#: actions/favorited.php:79 +msgid "The most popular notices on the site right now." +msgstr "Nunaj plej popularaj avizoj ĉe ĉi tiu retejo." + +#: actions/favorited.php:150 +msgid "Favorite notices appear on this page but no one has favorited one yet." +msgstr "Ŝatataj avizoj aperos ĉi-paĝe sed ankoraŭ nenio ŝatiĝas." + +#: actions/favorited.php:153 +msgid "" +"Be the first to add a notice to your favorites by clicking the fave button " +"next to any notice you like." +msgstr "" +"Fariĝu la unua, kiu aldonis avizon al sia ŝatolisto, per alklako de la ŝato-" +"klavo apud iu ajn avizo, kiun vi ŝatas." + +#: actions/favorited.php:156 +#, php-format +msgid "" +"Why not [register an account](%%action.register%%) and be the first to add a " +"notice to your favorites!" +msgstr "" +"[Kreu konton](%%action.register%%) kaj estu la unua, kiu aldonos avizon al " +"sia ŝatolisto!" + +#: actions/favoritesrss.php:111 actions/showfavorites.php:77 +#: lib/personalgroupnav.php:115 +#, php-format +msgid "%s's favorite notices" +msgstr "Ŝatataj avizoj de %s" + +#: actions/favoritesrss.php:115 +#, php-format +msgid "Updates favored by %1$s on %2$s!" +msgstr "Ŝatataj Ĝisdatiĝoj de %1$s ĉe %2$s!" + +#: actions/featured.php:69 lib/featureduserssection.php:87 +#: lib/publicgroupnav.php:89 +msgid "Featured users" +msgstr "Elstaraj uzantoj" + +#: actions/featured.php:71 +#, php-format +msgid "Featured users, page %d" +msgstr "Elstaraj uzantoj, paĝo %d" + +#: actions/featured.php:99 +#, php-format +msgid "A selection of some great users on %s" +msgstr "Elekto de kelke da elstaraj uzantoj ĉe %s" + +#: actions/file.php:34 +msgid "No notice ID." +msgstr "Ne estas avizo-ID" + +#: actions/file.php:38 +msgid "No notice." +msgstr "Ne estas avizo." + +#: actions/file.php:42 +msgid "No attachments." +msgstr "Ne estas aldonaĵo." + +#: actions/file.php:51 +msgid "No uploaded attachments." +msgstr "Ne estas alŝutita aldonaĵo." + +#: actions/finishremotesubscribe.php:69 +msgid "Not expecting this response!" +msgstr "Neatendita respondo!" + +#: actions/finishremotesubscribe.php:80 +msgid "User being listened to does not exist." +msgstr "Vizitata uzanto ne ekzistas." + +#: actions/finishremotesubscribe.php:87 actions/remotesubscribe.php:59 +msgid "You can use the local subscription!" +msgstr "Vi povas aboni loke!" + +#: actions/finishremotesubscribe.php:99 +msgid "That user has blocked you from subscribing." +msgstr "Tiu uzanto abonblokis vin." + +#: actions/finishremotesubscribe.php:110 +msgid "You are not authorized." +msgstr "Vi ne estas rajtigita." + +#: actions/finishremotesubscribe.php:113 +msgid "Could not convert request token to access token." +msgstr "Malsukcesis interŝanĝi petĵetonon al atingoĵetono." + +#: actions/finishremotesubscribe.php:118 +msgid "Remote service uses unknown version of OMB protocol." +msgstr "Fora servo uzas nekonatan version de OMB-protokolo." + +#: actions/finishremotesubscribe.php:138 +msgid "Error updating remote profile." +msgstr "Eraro je ĝisdatigo de fora profilo." + +#: actions/getfile.php:79 +msgid "No such file." +msgstr "Ne ekzistas tia dosiero." + +#: actions/getfile.php:83 +msgid "Cannot read file." +msgstr "Malsukcesis legi dosieron." + +#: actions/grantrole.php:62 actions/revokerole.php:62 +msgid "Invalid role." +msgstr "Rolo nevalida." + +#: actions/grantrole.php:66 actions/revokerole.php:66 +msgid "This role is reserved and cannot be set." +msgstr "Tiu ĉi rolo estas rezervita, do ne povas esti asignita." + +#: actions/grantrole.php:75 +msgid "You cannot grant user roles on this site." +msgstr "Vi ne rajtas doni al uzanto rolon ĉe ĉi tiu retejo." + +#: actions/grantrole.php:82 +msgid "User already has this role." +msgstr "Uzanto jam havas la rolon." + +#: actions/groupblock.php:71 actions/groupunblock.php:71 +#: actions/makeadmin.php:71 actions/subedit.php:46 +#: lib/profileformaction.php:79 +msgid "No profile specified." +msgstr "Neniu profilo elektita." + +#: actions/groupblock.php:76 actions/groupunblock.php:76 +#: actions/makeadmin.php:76 actions/subedit.php:53 actions/tagother.php:46 +#: actions/unsubscribe.php:84 lib/profileformaction.php:86 +msgid "No profile with that ID." +msgstr "Ne estas profilo kun tiu ID." + +#: actions/groupblock.php:81 actions/groupunblock.php:81 +#: actions/makeadmin.php:81 +msgid "No group specified." +msgstr "Neniu grupo elektita." + +#: actions/groupblock.php:91 +msgid "Only an admin can block group members." +msgstr "Nur administranto rajtas bloki grupanon." + +#: actions/groupblock.php:95 +msgid "User is already blocked from group." +msgstr "La uzanto jam de grupo blokiĝas." + +#: actions/groupblock.php:100 +msgid "User is not a member of group." +msgstr "La uzanto ne estas grupano." + +#: actions/groupblock.php:134 actions/groupmembers.php:360 +msgid "Block user from group" +msgstr "Bloki uzanton de grupo" + +#: actions/groupblock.php:160 +#, php-format +msgid "" +"Are you sure you want to block user \"%1$s\" from the group \"%2$s\"? They " +"will be removed from the group, unable to post, and unable to subscribe to " +"the group in the future." +msgstr "" +"Ĉu vi certe volas forbari uzanton \"%1$s\" de la grupo \"%2$s\"? Li estos " +"forigita de la grupo, ne povos afiŝi, kaj ne povos aboni la grupon." + +#. TRANS: Submit button title for 'No' when blocking a user from a group. +#: actions/groupblock.php:182 +msgid "Do not block this user from this group" +msgstr "Ne bloki la uzanton de la grupo" + +#. TRANS: Submit button title for 'Yes' when blocking a user from a group. +#: actions/groupblock.php:189 +msgid "Block this user from this group" +msgstr "Bloki la uzanton de la grupo" + +#: actions/groupblock.php:206 +msgid "Database error blocking user from group." +msgstr "Malsukcesis forbari uzanton de la grupo pro datumbaza eraro." + +#: actions/groupbyid.php:74 actions/userbyid.php:70 +msgid "No ID." +msgstr "Neniu ID." + +#: actions/groupdesignsettings.php:68 +msgid "You must be logged in to edit a group." +msgstr "Ensalutu por redakti grupon." + +#: actions/groupdesignsettings.php:144 +msgid "Group design" +msgstr "Grupa desegno" + +#: actions/groupdesignsettings.php:155 +msgid "" +"Customize the way your group looks with a background image and a colour " +"palette of your choice." +msgstr "Agordi kiel aspektu via grupo, kun elekto de fonbildo kaj koloraro." + +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 +#: lib/designsettings.php:391 lib/designsettings.php:413 +msgid "Couldn't update your design." +msgstr "Malsukcesis ĝisdatigi vian desegnon." + +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 +msgid "Design preferences saved." +msgstr "Desegna agordo konservita." + +#: actions/grouplogo.php:142 actions/grouplogo.php:195 +msgid "Group logo" +msgstr "Grupa emblemo" + +#: actions/grouplogo.php:153 +#, php-format +msgid "" +"You can upload a logo image for your group. The maximum file size is %s." +msgstr "" +"Vi povas alŝuti emblemo-bildon por via grupo. Dosiero-grandlimo estas $s." + +#: actions/grouplogo.php:365 +msgid "Pick a square area of the image to be the logo." +msgstr "Elektu kvadratan parton de la bildo kiel la emblemo." + +#: actions/grouplogo.php:399 +msgid "Logo updated." +msgstr "Emblemo ĝisdatigita." + +#: actions/grouplogo.php:401 +msgid "Failed updating logo." +msgstr "Malsukcesis ĝisdatigi emblemon." + +#: actions/groupmembers.php:100 lib/groupnav.php:92 +#, php-format +msgid "%s group members" +msgstr "%s grupanoj" + +#: actions/groupmembers.php:103 +#, php-format +msgid "%1$s group members, page %2$d" +msgstr "%1$s grupanoj, paĝo %2$d" + +#: actions/groupmembers.php:118 +msgid "A list of the users in this group." +msgstr "Listo de uzantoj en tiu ĉi grupo" + +#: actions/groupmembers.php:182 lib/groupnav.php:107 +msgid "Admin" +msgstr "Administranto" + +#: actions/groupmembers.php:392 lib/blockform.php:69 +msgid "Block" +msgstr "Bloki" + +#: actions/groupmembers.php:487 +msgid "Make user an admin of the group" +msgstr "Elekti uzanton grupestro." + +#: actions/groupmembers.php:519 +msgid "Make Admin" +msgstr "Estrigi" + +#: actions/groupmembers.php:519 +msgid "Make this user an admin" +msgstr "Estrigi la uzanton" + +#. TRANS: Message is used as link title. %s is a user nickname. +#. TRANS: Title in atom group notice feed. %s is a group name. +#. TRANS: Title in atom user notice feed. %s is a user name. +#: actions/grouprss.php:139 actions/userrss.php:94 +#: lib/atomgroupnoticefeed.php:63 lib/atomusernoticefeed.php:69 +#, php-format +msgid "%s timeline" +msgstr "Tempstrio de %s" + +#. TRANS: Message is used as link description. %1$s is a username, %2$s is a site name. +#: actions/grouprss.php:142 +#, php-format +msgid "Updates from members of %1$s on %2$s!" +msgstr "Ĝisdatigoj de grupano de %1$s ĉe %2$s!" + +#: actions/groups.php:62 lib/profileaction.php:223 lib/profileaction.php:249 +#: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98 +msgid "Groups" +msgstr "Grupoj" + +#: actions/groups.php:64 +#, php-format +msgid "Groups, page %d" +msgstr "Grupoj, paĝo %d" + +#: actions/groups.php:90 +#, php-format +msgid "" +"%%%%site.name%%%% groups let you find and talk with people of similar " +"interests. After you join a group you can send messages to all other members " +"using the syntax \"!groupname\". Don't see a group you like? Try [searching " +"for one](%%%%action.groupsearch%%%%) or [start your own!](%%%%action.newgroup" +"%%%%)" +msgstr "" +"En %%%%site.name%%%% grupoj povas vi babili kun personoj kun similaj " +"interesoj. Post kiam vi aliĝas al grupo vi povos sendi mesaĝon per sintakso" +"\"!groupname\" al ĉiu alia ano. Ĉu vi ne vidas ŝatindan grupon? Provu [serĉi]" +"(%%%%action.groupsearch%%%%) aŭ [kreu vian propran grupon!](%%%%action." +"newgroup%%%%)" + +#: actions/groups.php:107 actions/usergroups.php:126 lib/groupeditform.php:122 +msgid "Create a new group" +msgstr "Krei novan grupon" + +#: actions/groupsearch.php:52 +#, php-format +msgid "" +"Search for groups on %%site.name%% by their name, location, or description. " +"Separate the terms by spaces; they must be 3 characters or more." +msgstr "" +"Serĉi grupon ĉe %%site.name%% per ĝia nomo, loko, aŭ priskribo. Dividu " +"serĉvortojn per spaco; ili estu almenaŭ 3 literojn longaj." + +#: actions/groupsearch.php:58 +msgid "Group search" +msgstr "Grup-serĉo" + +#: actions/groupsearch.php:79 actions/noticesearch.php:117 +#: actions/peoplesearch.php:83 +msgid "No results." +msgstr "Neniu rezulto." + +#: actions/groupsearch.php:82 +#, php-format +msgid "" +"If you can't find the group you're looking for, you can [create it](%%action." +"newgroup%%) yourself." +msgstr "" +"Se vi ne trovas grupon, kiun vi serĉas, vi povas mem [krei ĝin](%%action." +"newgroup%%)." + +#: actions/groupsearch.php:85 +#, php-format +msgid "" +"Why not [register an account](%%action.register%%) and [create the group](%%" +"action.newgroup%%) yourself!" +msgstr "" +"Kial ne [krei konton](%%action.register%%) kaj mem [krei la grupon](%%action." +"newgroup%%)!" + +#: actions/groupunblock.php:91 +msgid "Only an admin can unblock group members." +msgstr "Nur grupestro rajtas malbloki grupanon." + +#: actions/groupunblock.php:95 +msgid "User is not blocked from group." +msgstr "La uzanto ne estas blokita de grupo." + +#: actions/groupunblock.php:128 actions/unblock.php:86 +msgid "Error removing the block." +msgstr "Eraro ĉe provo malbloki." + +#. TRANS: Title for instance messaging settings. +#: actions/imsettings.php:60 +msgid "IM settings" +msgstr "Tujmesaĝila agordo." + +#. TRANS: Instant messaging settings page instructions. +#. TRANS: [instant messages] is link text, "(%%doc.im%%)" is the link. +#. TRANS: the order and formatting of link text and link should remain unchanged. +#: actions/imsettings.php:74 +#, php-format +msgid "" +"You can send and receive notices through Jabber/GTalk [instant messages](%%" +"doc.im%%). Configure your address and settings below." +msgstr "" +"Vi povas sendi kaj ricevi avizojn per Jabber/GTalk-[tujmesaĝiloj](%%doc.im%" +"%). Jen agordu vian adreson kaj ceteron." + +#. TRANS: Message given in the IM settings if XMPP is not enabled on the site. +#: actions/imsettings.php:94 +msgid "IM is not available." +msgstr "Tujmesaĝilo ne estas disponebla." + +#. TRANS: Form legend for IM settings form. +#. TRANS: Field label for IM address input in IM settings form. +#: actions/imsettings.php:106 actions/imsettings.php:136 +msgid "IM address" +msgstr "Tujmesaĝila adreso" + +#: actions/imsettings.php:113 +msgid "Current confirmed Jabber/GTalk address." +msgstr "Nuna konfirmita Jabber/GTalk-adreso." + +#. TRANS: Form note in IM settings form. +#. TRANS: %s is the IM address set for the site. +#: actions/imsettings.php:124 +#, php-format +msgid "" +"Awaiting confirmation on this address. Check your Jabber/GTalk account for a " +"message with further instructions. (Did you add %s to your buddy list?)" +msgstr "" +"Atendante konfirmon por la adreso. Kontrolu vian Jabber/GTalk-konton por " +"mesaĝo kun pli da gvido. (Ĉu vi aldonis %s al via amikolisto?)" + +#. TRANS: IM address input field instructions in IM settings form. +#. TRANS: %s is the IM address set for the site. +#: actions/imsettings.php:140 +#, php-format +msgid "" +"Jabber or GTalk address, like \"UserName@example.org\". First, make sure to " +"add %s to your buddy list in your IM client or on GTalk." +msgstr "" +"Jabber/GTalk-adreso, ekzemple \"UserName@example.org\". Unue, certe aldonu %" +"s al via amikolisto je via tujmesaĝilo-kliento aŭ je GTalk." + +#. TRANS: Form legend for IM preferences form. +#: actions/imsettings.php:155 +msgid "IM preferences" +msgstr "Tujmesaĝilaj preferoj" + +#. TRANS: Checkbox label in IM preferences form. +#: actions/imsettings.php:160 +msgid "Send me notices through Jabber/GTalk." +msgstr "Sendu al mi avizojn per Jabber/GTalk." + +#. TRANS: Checkbox label in IM preferences form. +#: actions/imsettings.php:166 +msgid "Post a notice when my Jabber/GTalk status changes." +msgstr "Afiŝu avizon tiam, kiam mia Jabber/GTalk-stato ŝanĝiĝas." + +#. TRANS: Checkbox label in IM preferences form. +#: actions/imsettings.php:172 +msgid "Send me replies through Jabber/GTalk from people I'm not subscribed to." +msgstr "" +"Sendu al mi per Jabber/GTalk respondojn de personoj, kiujn mi ne abonas." + +#. TRANS: Checkbox label in IM preferences form. +#: actions/imsettings.php:179 +msgid "Publish a MicroID for my Jabber/GTalk address." +msgstr "Publikigu MikroID por mia Jabber/GTalk-adreso." + +#. TRANS: Confirmation message for successful IM preferences save. +#: actions/imsettings.php:287 actions/othersettings.php:180 +msgid "Preferences saved." +msgstr "Prefero konservita." + +#. TRANS: Message given saving IM address without having provided one. +#: actions/imsettings.php:309 +msgid "No Jabber ID." +msgstr "Mankas Jabber-ID." + +#. TRANS: Message given saving IM address that cannot be normalised. +#: actions/imsettings.php:317 +msgid "Cannot normalize that Jabber ID" +msgstr "Malsukcesis normigi la Jabber-ID" + +#. TRANS: Message given saving IM address that not valid. +#: actions/imsettings.php:322 +msgid "Not a valid Jabber ID" +msgstr "Tio ne estas valida Jabber-ID" + +#. TRANS: Message given saving IM address that is already set. +#: actions/imsettings.php:326 +msgid "That is already your Jabber ID." +msgstr "Tio estas jam via Jabber-ID." + +#. TRANS: Message given saving IM address that is already set for another user. +#: actions/imsettings.php:330 +msgid "Jabber ID already belongs to another user." +msgstr "Jabber-ID jam apartenas al alia uzanto." + +#. TRANS: Message given saving valid IM address that is to be confirmed. +#. TRANS: %s is the IM address set for the site. +#: actions/imsettings.php:358 +#, php-format +msgid "" +"A confirmation code was sent to the IM address you added. You must approve %" +"s for sending messages to you." +msgstr "" +"Konfirmo-kodo senditas al la tujmesaĝila adreso aldonita. Vi devas permesi " +"al %s sendi mesaĝojn al vi." + +#. TRANS: Message given canceling IM address confirmation for the wrong IM address. +#: actions/imsettings.php:388 +msgid "That is the wrong IM address." +msgstr "Tiu tujmesaĝila adreso estas malĝusta." + +#. TRANS: Server error thrown on database error canceling IM address confirmation. +#: actions/imsettings.php:397 +msgid "Couldn't delete IM confirmation." +msgstr "Malsukcesis forigi tujmesaĝila agordo." + +#. TRANS: Message given after successfully canceling IM address confirmation. +#: actions/imsettings.php:402 +msgid "IM confirmation cancelled." +msgstr "Tujmesaĝila konfirmo nuligita." + +#. TRANS: Message given trying to remove an IM address that is not +#. TRANS: registered for the active user. +#: actions/imsettings.php:424 +msgid "That is not your Jabber ID." +msgstr "Tio ne estas via Jabber-ID." + +#. TRANS: Message given after successfully removing a registered IM address. +#: actions/imsettings.php:447 +msgid "The IM address was removed." +msgstr "La tujmesaĝila adreso estas forigita." + +#: actions/inbox.php:59 +#, php-format +msgid "Inbox for %1$s - page %2$d" +msgstr "Alvenkesto de %1$s - paĝo %2$d" + +#: actions/inbox.php:62 +#, php-format +msgid "Inbox for %s" +msgstr "Alvenkesto de %s" + +#: actions/inbox.php:115 +msgid "This is your inbox, which lists your incoming private messages." +msgstr "" +"Tio ĉi estas via alvenkesto, kie listiĝas viaj alvenaj privataj mesaĝoj." + +#: actions/invite.php:39 +msgid "Invites have been disabled." +msgstr "Invito estas malebligita." + +#: actions/invite.php:41 +#, php-format +msgid "You must be logged in to invite other users to use %s." +msgstr "Ensalutu por inviti aliajn uzantojn al %s." + +#: actions/invite.php:72 +#, php-format +msgid "Invalid email address: %s" +msgstr "Nevalida retpoŝtadreso: %s" + +#: actions/invite.php:110 +msgid "Invitation(s) sent" +msgstr "Invito(j) senditas" + +#: actions/invite.php:112 +msgid "Invite new users" +msgstr "Inviti novajn uzantojn" + +#: actions/invite.php:128 +msgid "You are already subscribed to these users:" +msgstr "Vi jam abonas jenajn uzantojn:" + +#. TRANS: Whois output. +#. TRANS: %1$s nickname of the queried user, %2$s is their profile URL. +#: actions/invite.php:131 actions/invite.php:139 lib/command.php:414 +#, php-format +msgid "%1$s (%2$s)" +msgstr "%1$s (%2$s)" + +#: actions/invite.php:136 +msgid "" +"These people are already users and you were automatically subscribed to them:" +msgstr "Jenaj personoj estas jam uzantoj kaj vin aŭtomate abonigis al ili." + +#: actions/invite.php:144 +msgid "Invitation(s) sent to the following people:" +msgstr "Invito(j) sendiĝis al jenaj personoj:" + +#: actions/invite.php:150 +msgid "" +"You will be notified when your invitees accept the invitation and register " +"on the site. Thanks for growing the community!" +msgstr "" +"Vi sciiĝos, kiam viaj invititoj akceptos la inviton kaj registriĝos ĉe la " +"retejo. Dankon por kreskigi la komunumon!" + +#: actions/invite.php:162 +msgid "" +"Use this form to invite your friends and colleagues to use this service." +msgstr "" +"Uzu la formularon por inviti viajn amikojn kaj kolegojn al ĉi tiu servo." + +#: actions/invite.php:187 +msgid "Email addresses" +msgstr "Retpoŝtadresoj" + +#: actions/invite.php:189 +msgid "Addresses of friends to invite (one per line)" +msgstr "Adresoj de invitataj amikoj (unu por linio)" + +#: actions/invite.php:192 +msgid "Personal message" +msgstr "Persona mesaĝo" + +#: actions/invite.php:194 +msgid "Optionally add a personal message to the invitation." +msgstr "Vi povas aldoni personan mesaĝon al la invito." + +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +msgctxt "BUTTON" +msgid "Send" +msgstr "Sendi" + +#. TRANS: Subject for invitation email. Note that 'them' is correct as a gender-neutral singular 3rd-person pronoun in English. +#: actions/invite.php:228 +#, php-format +msgid "%1$s has invited you to join them on %2$s" +msgstr "%1$s invitis vin kunaliĝi ĉe %2$s" + +#. TRANS: Body text for invitation email. Note that 'them' is correct as a gender-neutral singular 3rd-person pronoun in English. +#: actions/invite.php:231 +#, php-format +msgid "" +"%1$s has invited you to join them on %2$s (%3$s).\n" +"\n" +"%2$s is a micro-blogging service that lets you keep up-to-date with people " +"you know and people who interest you.\n" +"\n" +"You can also share news about yourself, your thoughts, or your life online " +"with people who know about you. It's also great for meeting new people who " +"share your interests.\n" +"\n" +"%1$s said:\n" +"\n" +"%4$s\n" +"\n" +"You can see %1$s's profile page on %2$s here:\n" +"\n" +"%5$s\n" +"\n" +"If you'd like to try the service, click on the link below to accept the " +"invitation.\n" +"\n" +"%6$s\n" +"\n" +"If not, you can ignore this message. Thanks for your patience and your " +"time.\n" +"\n" +"Sincerely, %2$s\n" +msgstr "" +"%1$s invitas vin al %2$s (%3$s).\n" +"\n" +"%2$s estas mikrobloga servo, kiu ebligas al vi ĝisdate komuniki kun konatojn " +"kaj la interesajn.\n" +"\n" +"Vi povas ankaŭ konigi novaĵon pri vi mem, vian penson, aŭ vian vivon enretan " +"kun persono, kiu komprenas vin. Vi ankaŭ povas per ĝi koniĝi kun novan " +"saminteresannon.\n" +"\n" +"%1$s diras:\n" +"\n" +"%4$s\n" +"\n" +"Vi povas vidi profilo de %1$s ĉe %2$s ĉi tie:\n" +"\n" +"%5$s\n" +"\n" +"Se vi volas provi la servon, alklaku jenan ligilon por akcepti la inviton.\n" +"\n" +"%6$s\n" +"\n" +"Aŭ, vi povas ingnori la mesaĝon. Dankon por via pacienco kaj tempo.\n" +"\n" +"via sincere, %2$s\n" + +#: actions/joingroup.php:60 +msgid "You must be logged in to join a group." +msgstr "Ensalutu por aniĝi al grupo." + +#: actions/joingroup.php:88 actions/leavegroup.php:88 +msgid "No nickname or ID." +msgstr "Ne estas alinomo aŭ ID." + +#. TRANS: Message given having added a user to a group. +#. TRANS: %1$s is the nickname of the user, %2$s is the nickname of the group. +#: actions/joingroup.php:141 lib/command.php:346 +#, php-format +msgid "%1$s joined group %2$s" +msgstr "%1$s aniĝis al grupo %2$s" + +#: actions/leavegroup.php:60 +msgid "You must be logged in to leave a group." +msgstr "Ensalutu por eksaniĝi." + +#: actions/leavegroup.php:100 lib/command.php:373 +msgid "You are not a member of that group." +msgstr "Vi ne estas grupano." + +#. TRANS: Message given having removed a user from a group. +#. TRANS: %1$s is the nickname of the user, %2$s is the nickname of the group. +#: actions/leavegroup.php:137 lib/command.php:392 +#, php-format +msgid "%1$s left group %2$s" +msgstr "%1$s eksaniĝis de grupo %2$s" + +#: actions/login.php:102 actions/otp.php:62 actions/register.php:144 +msgid "Already logged in." +msgstr "Vi jam ensalutis." + +#: actions/login.php:148 +msgid "Incorrect username or password." +msgstr "Malĝusta uzantnomo aŭ pasvorto." + +#: actions/login.php:154 actions/otp.php:120 +msgid "Error setting user. You are probably not authorized." +msgstr "Eraras agordi uzanton. Vi verŝajne ne rajtiĝas." + +#: actions/login.php:210 actions/login.php:263 lib/logingroupnav.php:79 +msgid "Login" +msgstr "Ensaluti" + +#: actions/login.php:249 +msgid "Login to site" +msgstr "Ensaluti al la retejo" + +#: actions/login.php:258 actions/register.php:485 +msgid "Remember me" +msgstr "Memoru min" + +#: actions/login.php:259 actions/register.php:487 +msgid "Automatically login in the future; not for shared computers!" +msgstr "Aŭtomate ensaluti estonte; ne taŭge por komuna komputilo!" + +#: actions/login.php:269 +msgid "Lost or forgotten password?" +msgstr "Ĉi via pasvorto perdiĝas?" + +#: actions/login.php:288 +msgid "" +"For security reasons, please re-enter your user name and password before " +"changing your settings." +msgstr "" +"Por sekureca kialo, bonvole re-entajpi vian uzantnomon kaj pasvorton antaŭ " +"ŝanĝi vian agordon." + +#: actions/login.php:292 +msgid "Login with your username and password." +msgstr "Ensaluti per via uzantnomo kaj pasvorto." + +#: actions/login.php:295 +#, php-format +msgid "" +"Don't have a username yet? [Register](%%action.register%%) a new account." +msgstr "Ĉu sen uzantnomo? [Kreu](%%action.register%%) novan konton." + +#: actions/makeadmin.php:92 +msgid "Only an admin can make another user an admin." +msgstr "Nur administranto rajtas administrantigi uzanton." + +#: actions/makeadmin.php:96 +#, php-format +msgid "%1$s is already an admin for group \"%2$s\"." +msgstr "%1$s estas jam grupestro de \"%2$s\"." + +#: actions/makeadmin.php:133 +#, php-format +msgid "Can't get membership record for %1$s in group %2$s." +msgstr "Malsukcesis kolekti ano-historio de %1$s en grupo %2$s." + +#: actions/makeadmin.php:146 +#, php-format +msgid "Can't make %1$s an admin for group %2$s." +msgstr "Malsukcesis estrigi %1$s por grupo %2$s." + +#: actions/microsummary.php:69 +msgid "No current status." +msgstr "Ne estas kuranta stato." + +#: actions/newapplication.php:52 +msgid "New Application" +msgstr "Nova Apliko" + +#: actions/newapplication.php:64 +msgid "You must be logged in to register an application." +msgstr "Ensalutu por registri aplikaĵon." + +#: actions/newapplication.php:143 +msgid "Use this form to register a new application." +msgstr "Uzu ĉi tiun formularon por registri novan aplikaĵon." + +#: actions/newapplication.php:176 +msgid "Source URL is required." +msgstr "Fonta URL bezonata." + +#: actions/newapplication.php:258 actions/newapplication.php:267 +msgid "Could not create application." +msgstr "Malsukcesis krei aplikaĵon." + +#: actions/newgroup.php:53 +msgid "New group" +msgstr "Nova grupo" + +#: actions/newgroup.php:110 +msgid "Use this form to create a new group." +msgstr "Uzas ĉi tiun formularon por krei novan grupon." + +#: actions/newmessage.php:71 actions/newmessage.php:231 +msgid "New message" +msgstr "Nova mesaĝo" + +#: actions/newmessage.php:121 actions/newmessage.php:161 lib/command.php:481 +msgid "You can't send a message to this user." +msgstr "Vi ne povas sendi mesaĝon al la uzanto." + +#: actions/newmessage.php:144 actions/newnotice.php:136 lib/command.php:463 +#: lib/command.php:555 +msgid "No content!" +msgstr "Neniu enhavo!" + +#: actions/newmessage.php:158 +msgid "No recipient specified." +msgstr "Neniu ricevonto speifiĝas." + +#: actions/newmessage.php:164 lib/command.php:484 +msgid "" +"Don't send a message to yourself; just say it to yourself quietly instead." +msgstr "Ne sendu mesaĝon al vi mem! Simple suspiru anstataŭ." + +#: actions/newmessage.php:181 +msgid "Message sent" +msgstr "Mesaĝo sendita" + +#: actions/newmessage.php:185 +#, php-format +msgid "Direct message to %s sent." +msgstr "Rekta mesaĝo al %s sendiĝis." + +#: actions/newmessage.php:210 actions/newnotice.php:251 lib/channel.php:189 +msgid "Ajax Error" +msgstr "Eraro de Ajax" + +#: actions/newnotice.php:69 +msgid "New notice" +msgstr "Nova avizo" + +#: actions/newnotice.php:217 +msgid "Notice posted" +msgstr "Avizo afiŝiĝas" + +#: actions/noticesearch.php:68 +#, php-format +msgid "" +"Search for notices on %%site.name%% by their contents. Separate search terms " +"by spaces; they must be 3 characters or more." +msgstr "" +"Serĉi avizon ĉe %%site.name%% per ĝia enhavo. Dividu serĉvortojn per spaco; " +"ili estu almenaŭ 3 literojn longaj." + +#: actions/noticesearch.php:78 +msgid "Text search" +msgstr "Teksta serĉado" + +#: actions/noticesearch.php:91 +#, php-format +msgid "Search results for \"%1$s\" on %2$s" +msgstr "Trovito per \"%1$s\" ĉe %2$s" + +#: actions/noticesearch.php:121 +#, php-format +msgid "" +"Be the first to [post on this topic](%%%%action.newnotice%%%%?" +"status_textarea=%s)!" +msgstr "" +"Estu la unua [afiŝi pri la temo](%%%%action.newnotice%%%%?status_textarea=%" +"s)!" + +#: actions/noticesearch.php:124 +#, php-format +msgid "" +"Why not [register an account](%%%%action.register%%%%) and be the first to " +"[post on this topic](%%%%action.newnotice%%%%?status_textarea=%s)!" +msgstr "" +"Kial ne [krei konton](%%%%action.register%%%%) kaj esti la unua [afiŝi pri " +"la temo](%%%%action.newnotice%%%%?status_textarea=%s)!" + +#: actions/noticesearchrss.php:96 +#, php-format +msgid "Updates with \"%s\"" +msgstr "Ĝisdatiĝo enhavante \"%s\"" + +#: actions/noticesearchrss.php:98 +#, php-format +msgid "Updates matching search term \"%1$s\" on %2$s!" +msgstr "Ĝisdatiĝo kongruanta al serĉvorto \"%1$s\" ĉe %2$s!" + +#: actions/nudge.php:85 +msgid "" +"This user doesn't allow nudges or hasn't confirmed or set their email yet." +msgstr "" +"La uzanto ne permesas puŝeton aŭ ne jam konfirmis aŭ registris " +"retpoŝtadreson." + +#: actions/nudge.php:94 +msgid "Nudge sent" +msgstr "Puŝeto sendiĝis" + +#: actions/nudge.php:97 +msgid "Nudge sent!" +msgstr "Puŝeto sendiĝis!" + +#: actions/oauthappssettings.php:59 +msgid "You must be logged in to list your applications." +msgstr "Ensalutu por listigi viajn aplikaĵojn." + +#: actions/oauthappssettings.php:74 +msgid "OAuth applications" +msgstr "OAuth aplikoj" + +#: actions/oauthappssettings.php:85 +msgid "Applications you have registered" +msgstr "Aplikoj kiujn vi enskribis" + +#: actions/oauthappssettings.php:135 +#, php-format +msgid "You have not registered any applications yet." +msgstr "Vi ne jam registri iun ajn aplikaĵon." + +#: actions/oauthconnectionssettings.php:72 +msgid "Connected applications" +msgstr "Konektita aplikaĵo" + +#: actions/oauthconnectionssettings.php:83 +msgid "You have allowed the following applications to access you account." +msgstr "Vi permesis al jenaj aplikaĵoj aliradon al via konto." + +#: actions/oauthconnectionssettings.php:175 +msgid "You are not a user of that application." +msgstr "Mi ne estas uzanto de tiu aplikaĵo." + +#: actions/oauthconnectionssettings.php:186 +#, php-format +msgid "Unable to revoke access for app: %s." +msgstr "Maleble revoki aliradon al aplikaĵo: %s." + +#: actions/oauthconnectionssettings.php:198 +msgid "You have not authorized any applications to use your account." +msgstr "Vi ne rajtigis iun ajn aplikaĵon uzi vian konton." + +#: actions/oauthconnectionssettings.php:211 +msgid "Developers can edit the registration settings for their applications " +msgstr "Programisto povas redakti registradan agordon de sia aplikaĵo " + +#: actions/oembed.php:80 actions/shownotice.php:100 +msgid "Notice has no profile." +msgstr "Avizo sen profilo" + +#: actions/oembed.php:87 actions/shownotice.php:175 +#, php-format +msgid "%1$s's status on %2$s" +msgstr "Stato de %1$s ĉe %2$s" + +#. TRANS: Error message displaying attachments. %s is a raw MIME type (eg 'image/png') +#: actions/oembed.php:159 +#, php-format +msgid "Content type %s not supported." +msgstr "Enhavtipo %s ne subteniĝas." + +#. TRANS: Error message displaying attachments. %s is the site's base URL. +#: actions/oembed.php:163 +#, php-format +msgid "Only %s URLs over plain HTTP please." +msgstr "" + +#. TRANS: Client error on an API request with an unsupported data format. +#: actions/oembed.php:184 actions/oembed.php:203 lib/apiaction.php:1204 +#: lib/apiaction.php:1232 lib/apiaction.php:1355 +msgid "Not a supported data format." +msgstr "Datumformato ne subteniĝas." + +#: actions/opensearch.php:64 +msgid "People Search" +msgstr "Homserĉo" + +#: actions/opensearch.php:67 +msgid "Notice Search" +msgstr "Avizoserĉo" + +#: actions/othersettings.php:60 +msgid "Other settings" +msgstr "Aliaj agordoj" + +#: actions/othersettings.php:71 +msgid "Manage various other options." +msgstr "Agordi diversajn aliajn elektojn." + +#: actions/othersettings.php:108 +msgid " (free service)" +msgstr " (Senpaga servo)" + +#: actions/othersettings.php:116 +msgid "Shorten URLs with" +msgstr "Mallongigu URLojn per" + +#: actions/othersettings.php:117 +msgid "Automatic shortening service to use." +msgstr "Uzota aŭtomata mallongigad-servo." + +#: actions/othersettings.php:122 +msgid "View profile designs" +msgstr "Vidi profilo-desegnon" + +#: actions/othersettings.php:123 +msgid "Show or hide profile designs." +msgstr "Montri aŭ kaŝi profilo-desegnon." + +#: actions/othersettings.php:153 +msgid "URL shortening service is too long (max 50 chars)." +msgstr "URL-mallongigado-servo tro longas (maksimume 50 literojn)." + +#: actions/otp.php:69 +msgid "No user ID specified." +msgstr "Neniu uzanto-ID specifiĝas." + +#: actions/otp.php:83 +msgid "No login token specified." +msgstr "Neniu ensalutado-ĵetono specifiĝas." + +#: actions/otp.php:90 +msgid "No login token requested." +msgstr "Neniu ensalutad-ĵetono bezoniĝas." + +#: actions/otp.php:95 +msgid "Invalid login token specified." +msgstr "Specifita ensalutado-ĵetono nevalidas." + +#: actions/otp.php:104 +msgid "Login token expired." +msgstr "Ensalutado-ĵetono eksvalidiĝas." + +#: actions/outbox.php:58 +#, php-format +msgid "Outbox for %1$s - page %2$d" +msgstr "elirkesto de %1$s - paĝo %2$d" + +#: actions/outbox.php:61 +#, php-format +msgid "Outbox for %s" +msgstr "Elirkesto de %s" + +#: actions/outbox.php:116 +#, fuzzy +msgid "This is your outbox, which lists private messages you have sent." +msgstr "" +"Tio ĉi estas via alvenkesto, kie listiĝas viaj alvenaj privataj mesaĝoj." + +#: actions/passwordsettings.php:58 +msgid "Change password" +msgstr "Ŝanĝi pasvorton" + +#: actions/passwordsettings.php:69 +msgid "Change your password." +msgstr "Ŝanĝi vian pasvorton." + +#: actions/passwordsettings.php:96 actions/recoverpassword.php:231 +msgid "Password change" +msgstr "Pasvorta ŝanĝo" + +#: actions/passwordsettings.php:104 +msgid "Old password" +msgstr "Malnova pasvorto" + +#: actions/passwordsettings.php:108 actions/recoverpassword.php:235 +msgid "New password" +msgstr "Nova pasvorto" + +#: actions/passwordsettings.php:109 +msgid "6 or more characters" +msgstr "6 aŭ pli da literoj" + +#: actions/passwordsettings.php:112 actions/recoverpassword.php:239 +#: actions/register.php:440 +msgid "Confirm" +msgstr "Konfirmi" + +#: actions/passwordsettings.php:113 actions/recoverpassword.php:240 +msgid "Same as password above" +msgstr "Same kiel pasvorto supra" + +#: actions/passwordsettings.php:117 +msgid "Change" +msgstr "Ŝanĝi" + +#: actions/passwordsettings.php:154 actions/register.php:237 +msgid "Password must be 6 or more characters." +msgstr "Pasvorto devas esti 6-litera aŭ pli longa." + +#: actions/passwordsettings.php:157 actions/register.php:240 +msgid "Passwords don't match." +msgstr "La pasvortoj diferencas." + +#: actions/passwordsettings.php:165 +msgid "Incorrect old password" +msgstr "Neĝusta malnova pasvorto" + +#: actions/passwordsettings.php:181 +msgid "Error saving user; invalid." +msgstr "Eraris konservi uzanton: nevalida." + +#: actions/passwordsettings.php:186 actions/recoverpassword.php:381 +msgid "Can't save new password." +msgstr "Malsukcesis konservi novan pasvorton." + +#: actions/passwordsettings.php:192 actions/recoverpassword.php:211 +msgid "Password saved." +msgstr "Pasvorto konservitas." + +#. TRANS: Menu item for site administration +#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:384 +msgid "Paths" +msgstr "Vojoj" + +#: actions/pathsadminpanel.php:70 +msgid "Path and server settings for this StatusNet site." +msgstr "Vojo kaj servila agordo por ĉi tiu StatusNet-retejo." + +#: actions/pathsadminpanel.php:157 +#, fuzzy, php-format +msgid "Theme directory not readable: %s." +msgstr "Desegno ne havebla: %s." + +#: actions/pathsadminpanel.php:163 +#, fuzzy, php-format +msgid "Avatar directory not writable: %s." +msgstr "Avatara adresaro" + +#: actions/pathsadminpanel.php:169 +#, fuzzy, php-format +msgid "Background directory not writable: %s." +msgstr "Fona adresaro" + +#: actions/pathsadminpanel.php:177 +#, php-format +msgid "Locales directory not readable: %s." +msgstr "" + +#: actions/pathsadminpanel.php:183 +msgid "Invalid SSL server. The maximum length is 255 characters." +msgstr "" + +#: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 +msgid "Site" +msgstr "Retejo" + +#: actions/pathsadminpanel.php:238 +msgid "Server" +msgstr "Servilo" + +#: actions/pathsadminpanel.php:238 +msgid "Site's server hostname." +msgstr "Gastigserva Nomo de la retejo" + +#: actions/pathsadminpanel.php:242 +msgid "Path" +msgstr "Vojo" + +#: actions/pathsadminpanel.php:242 +msgid "Site path" +msgstr "Reteja vojo" + +#: actions/pathsadminpanel.php:246 +msgid "Path to locales" +msgstr "Lokigilo al lokaĵaro" + +#: actions/pathsadminpanel.php:246 +msgid "Directory path to locales" +msgstr "Adresara lokigilo al lokaĵaro" + +#: actions/pathsadminpanel.php:250 +msgid "Fancy URLs" +msgstr "" + +#: actions/pathsadminpanel.php:252 +msgid "Use fancy (more readable and memorable) URLs?" +msgstr "" + +#: actions/pathsadminpanel.php:259 +msgid "Theme" +msgstr "Temo" + +#: actions/pathsadminpanel.php:264 +msgid "Theme server" +msgstr "Tema servilo" + +#: actions/pathsadminpanel.php:268 +msgid "Theme path" +msgstr "Temo-lokigilo" + +#: actions/pathsadminpanel.php:272 +msgid "Theme directory" +msgstr "Tema adresaro" + +#: actions/pathsadminpanel.php:279 +msgid "Avatars" +msgstr "Avataroj" + +#: actions/pathsadminpanel.php:284 +msgid "Avatar server" +msgstr "Avatara servilo" + +#: actions/pathsadminpanel.php:288 +msgid "Avatar path" +msgstr "Avataro-lokigilo" + +#: actions/pathsadminpanel.php:292 +msgid "Avatar directory" +msgstr "Avatara adresaro" + +#: actions/pathsadminpanel.php:301 +msgid "Backgrounds" +msgstr "Fono" + +#: actions/pathsadminpanel.php:305 +msgid "Background server" +msgstr "Fono-lokigilo" + +#: actions/pathsadminpanel.php:309 +msgid "Background path" +msgstr "Fono-lokigilo" + +#: actions/pathsadminpanel.php:313 +msgid "Background directory" +msgstr "Fona adresaro" + +#: actions/pathsadminpanel.php:320 +msgid "SSL" +msgstr "\"SSL\"" + +#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202 +msgid "Never" +msgstr "Neniam" + +#: actions/pathsadminpanel.php:324 +msgid "Sometimes" +msgstr "Kelkfoje" + +#: actions/pathsadminpanel.php:325 +msgid "Always" +msgstr "Ĉiam" + +#: actions/pathsadminpanel.php:329 +msgid "Use SSL" +msgstr "Uzi \"SSL\"" + +#: actions/pathsadminpanel.php:330 +msgid "When to use SSL" +msgstr "Kiam uzi \"SSL\"" + +#: actions/pathsadminpanel.php:335 +msgid "SSL server" +msgstr "\"SSL\"a servilo" + +#: actions/pathsadminpanel.php:336 +msgid "Server to direct SSL requests to" +msgstr "Servilo, kien orienti \"SSL\"-peton" + +#: actions/pathsadminpanel.php:352 +msgid "Save paths" +msgstr "Konservu lokigilon" + +#: actions/peoplesearch.php:52 +#, php-format +msgid "" +"Search for people on %%site.name%% by their name, location, or interests. " +"Separate the terms by spaces; they must be 3 characters or more." +msgstr "" +"Serĉi personon ĉe %%site.name%% per ĝia nomo, loko, aŭ intereso. Dividu " +"serĉvortojn per spacoj; ili estu almenaŭ 3 literojn longaj." + +#: actions/peoplesearch.php:58 +msgid "People search" +msgstr "Persona serĉado" + +#: actions/peopletag.php:68 +#, php-format +msgid "Not a valid people tag: %s." +msgstr "Ne valida persona markilo: %s." + +#: actions/peopletag.php:142 +#, php-format +msgid "Users self-tagged with %1$s - page %2$d" +msgstr "Uzantoj sinmarkitaj per %1$s - paĝo %2$d" + +#: actions/postnotice.php:95 +msgid "Invalid notice content." +msgstr "Nevalida avizo-enhavo" + +#: actions/postnotice.php:101 +#, php-format +msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’." +msgstr "Aviza permesilo ‘%1$s’ ne konformas al reteja permesilo ‘%2$s’." + +#: actions/profilesettings.php:60 +msgid "Profile settings" +msgstr "Profila agordo" + +#: actions/profilesettings.php:71 +msgid "" +"You can update your personal profile info here so people know more about you." +msgstr "" +"Vi povas ĝisdatigi vian propran profilan informon, por ke oni sciu pli pri " +"vi." + +#: actions/profilesettings.php:99 +msgid "Profile information" +msgstr "Profila informo" + +#: actions/profilesettings.php:108 lib/groupeditform.php:154 +msgid "1-64 lowercase letters or numbers, no punctuation or spaces" +msgstr "1-64 minusklaj literoj aŭ ciferoj, neniu interpunkcio aŭ spaco" + +#: actions/profilesettings.php:111 actions/register.php:455 +#: actions/showgroup.php:256 actions/tagother.php:104 +#: lib/groupeditform.php:157 lib/userprofile.php:150 +msgid "Full name" +msgstr "Plena nomo" + +#. TRANS: Form input field label. +#: actions/profilesettings.php:115 actions/register.php:460 +#: lib/applicationeditform.php:244 lib/groupeditform.php:161 +msgid "Homepage" +msgstr "Hejmpaĝo" + +#: actions/profilesettings.php:117 actions/register.php:462 +msgid "URL of your homepage, blog, or profile on another site" +msgstr "URL de via hejmpaĝo, blogo aŭ profilo ĉe alia retejo" + +#: actions/profilesettings.php:122 actions/register.php:468 +#, php-format +msgid "Describe yourself and your interests in %d chars" +msgstr "Priskribu vin mem kaj viajn ŝatokupojn per ne pli ol %d signoj" + +#: actions/profilesettings.php:125 actions/register.php:471 +msgid "Describe yourself and your interests" +msgstr "Priskribu vin mem kaj viajn ŝatokupojn" + +#: actions/profilesettings.php:127 actions/register.php:473 +msgid "Bio" +msgstr "Biografio" + +#: actions/profilesettings.php:132 actions/register.php:478 +#: actions/showgroup.php:265 actions/tagother.php:112 +#: actions/userauthorization.php:166 lib/groupeditform.php:177 +#: lib/userprofile.php:165 +msgid "Location" +msgstr "Loko" + +#: actions/profilesettings.php:134 actions/register.php:480 +msgid "Where you are, like \"City, State (or Region), Country\"" +msgstr "Kie vi estas, ekzemple \"Urbo, Ŝtato (aŭ Regiono), Lando\"" + +#: actions/profilesettings.php:138 +msgid "Share my current location when posting notices" +msgstr "Sciigu mian nunan lokon, kiam mi sendas avizon." + +#: actions/profilesettings.php:145 actions/tagother.php:149 +#: actions/tagother.php:209 lib/subscriptionlist.php:106 +#: lib/subscriptionlist.php:108 lib/userprofile.php:210 +msgid "Tags" +msgstr "Markiloj" + +#: actions/profilesettings.php:147 +msgid "" +"Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated" +msgstr "" +"Markiloj por vi mem (literoj, ciferoj, \"-\", \".\", kaj \"_\"), dividite " +"per komoj aŭ spacoj" + +#: actions/profilesettings.php:151 +msgid "Language" +msgstr "Lingvo" + +#: actions/profilesettings.php:152 +msgid "Preferred language" +msgstr "Preferata lingvo" + +#: actions/profilesettings.php:161 +msgid "Timezone" +msgstr "Horzono" + +#: actions/profilesettings.php:162 +msgid "What timezone are you normally in?" +msgstr "En kiu horzono vi kutime troviĝas?" + +#: actions/profilesettings.php:167 +msgid "" +"Automatically subscribe to whoever subscribes to me (best for non-humans)" +msgstr "Aŭtomate aboni iun ajn, kiu abonas min (prefereble por ne-homoj)" + +#: actions/profilesettings.php:228 actions/register.php:230 +#, php-format +msgid "Bio is too long (max %d chars)." +msgstr "Biografio tro longas (maksimume 255 literoj)" + +#: actions/profilesettings.php:235 actions/siteadminpanel.php:151 +msgid "Timezone not selected." +msgstr "Horzono ne elektita" + +#: actions/profilesettings.php:241 +msgid "Language is too long (max 50 chars)." +msgstr "Lingvo tro longas (maksimume 255 literoj)" + +#: actions/profilesettings.php:253 actions/tagother.php:178 +#, php-format +msgid "Invalid tag: \"%s\"" +msgstr "Nevalida markilo: \"%s\"" + +#: actions/profilesettings.php:306 +msgid "Couldn't update user for autosubscribe." +msgstr "Malsukcesis ĝisdatigi uzanton por aŭtomatabonado." + +#: actions/profilesettings.php:363 +msgid "Couldn't save location prefs." +msgstr "Malsukcesis konservi lokan preferon." + +#: actions/profilesettings.php:375 +msgid "Couldn't save profile." +msgstr "Malsukcesis konservi la profilon." + +#: actions/profilesettings.php:383 +msgid "Couldn't save tags." +msgstr "Malsukcesis konservi markilojn." + +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 +msgid "Settings saved." +msgstr "Agordo konservitas." + +#: actions/public.php:83 +#, php-format +msgid "Beyond the page limit (%s)." +msgstr "Trans paĝolimo (%s)." + +#: actions/public.php:92 +msgid "Could not retrieve public stream." +msgstr "Malsukcesis ricevi publikan fluon" + +#: actions/public.php:130 +#, php-format +msgid "Public timeline, page %d" +msgstr "Publika tempstrio, paĝo %d" + +#: actions/public.php:132 lib/publicgroupnav.php:79 +msgid "Public timeline" +msgstr "Publika tempstrio" + +#: actions/public.php:160 +msgid "Public Stream Feed (RSS 1.0)" +msgstr "Publika fluo (RSS 1.0)" + +#: actions/public.php:164 +msgid "Public Stream Feed (RSS 2.0)" +msgstr "Publika fluo (RSS 2.0)" + +#: actions/public.php:168 +msgid "Public Stream Feed (Atom)" +msgstr "Publika fluo (Atom)" + +#: actions/public.php:188 +#, php-format +msgid "" +"This is the public timeline for %%site.name%% but no one has posted anything " +"yet." +msgstr "" +"Tio ĉi estas la publika tempstrio de %%site.name%%, sed ankoraŭ neniu afiŝis " +"ion ajn." + +#: actions/public.php:191 +msgid "Be the first to post!" +msgstr "Estu la unua afiŝanto!" + +#: actions/public.php:195 +#, php-format +msgid "" +"Why not [register an account](%%action.register%%) and be the first to post!" +msgstr "Kial ne [krei konton](%%action.register%%) kaj esti la unua afiŝanto!" + +#: actions/public.php:242 +#, fuzzy, php-format +msgid "" +"This is %%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 share notices about yourself with " +"friends, family, and colleagues! ([Read more](%%doc.help%%))" +msgstr "" +"Tio ĉi estas %%site.name%%, [mikrobloga](http://en.wikipedia.org/wiki/Micro-" +"blogging) servo surbaze de libera servila programo [StatusNet](http://status." +"net/)." + +#: actions/public.php:247 +#, php-format +msgid "" +"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" +"blogging) service based on the Free Software [StatusNet](http://status.net/) " +"tool." +msgstr "" +"Tio ĉi estas %%site.name%%, [mikrobloga](http://en.wikipedia.org/wiki/Micro-" +"blogging) servo surbaze de libera servila programo [StatusNet](http://status." +"net/)." + +#: actions/publictagcloud.php:57 +msgid "Public tag cloud" +msgstr "Publika markil-nubo" + +#: actions/publictagcloud.php:63 +#, php-format +msgid "These are most popular recent tags on %s " +msgstr "" + +#: actions/publictagcloud.php:69 +#, php-format +msgid "No one has posted a notice with a [hashtag](%%doc.tags%%) yet." +msgstr "" + +#: actions/publictagcloud.php:72 +msgid "Be the first to post one!" +msgstr "Estu la unua afiŝanto!" + +#: actions/publictagcloud.php:75 +#, fuzzy, php-format +msgid "" +"Why not [register an account](%%action.register%%) and be the first to post " +"one!" +msgstr "Kial ne [krei konton](%%action.register%%) kaj esti la unua afiŝanto!" + +#: actions/publictagcloud.php:134 +#, fuzzy +msgid "Tag cloud" +msgstr "Publika markil-nubo" + +#: actions/recoverpassword.php:36 +#, fuzzy +msgid "You are already logged in!" +msgstr "Vi jam ensalutis." + +#: actions/recoverpassword.php:62 +#, fuzzy +msgid "No such recovery code." +msgstr "Ne estas tiu avizo." + +#: actions/recoverpassword.php:66 +msgid "Not a recovery code." +msgstr "" + +#: actions/recoverpassword.php:73 +msgid "Recovery code for unknown user." +msgstr "" + +#: actions/recoverpassword.php:86 +#, fuzzy +msgid "Error with confirmation code." +msgstr "Neniu konfirma kodo." + +#: actions/recoverpassword.php:97 +#, fuzzy +msgid "This confirmation code is too old. Please start again." +msgstr "Tiu komfirmnumero ne estas por vi!" + +#: actions/recoverpassword.php:111 +#, fuzzy +msgid "Could not update user with confirmed email address." +msgstr "Nuna konfirmita retpoŝtadreso." + +#: actions/recoverpassword.php:152 +msgid "" +"If you have forgotten or lost your password, you can get a new one sent to " +"the email address you have stored in your account." +msgstr "" + +#: actions/recoverpassword.php:158 +msgid "You have been identified. Enter a new password below. " +msgstr "Vi estis identigita. Enigu sube novan pasvorton." + +#: actions/recoverpassword.php:188 +#, fuzzy +msgid "Password recovery" +msgstr "Pasvorta ŝanĝo" + +#: actions/recoverpassword.php:191 +#, fuzzy +msgid "Nickname or email address" +msgstr "Neniu retpoŝta adreso." + +#: actions/recoverpassword.php:193 +msgid "Your nickname on this server, or your registered email address." +msgstr "" + +#: actions/recoverpassword.php:199 actions/recoverpassword.php:200 +#, fuzzy +msgid "Recover" +msgstr "Forigi" + +#: actions/recoverpassword.php:208 +msgid "Reset password" +msgstr "Refari pasvorton" + +#: actions/recoverpassword.php:209 +msgid "Recover password" +msgstr "Refari pasvorton" + +#: actions/recoverpassword.php:210 actions/recoverpassword.php:335 +msgid "Password recovery requested" +msgstr "" + +#: actions/recoverpassword.php:213 +msgid "Unknown action" +msgstr "" + +#: actions/recoverpassword.php:236 +msgid "6 or more characters, and don't forget it!" +msgstr "Almenaŭ 6 signoj, kaj ne forgesu ĝin!" + +#: actions/recoverpassword.php:243 +msgid "Reset" +msgstr "Restarigi" + +#: actions/recoverpassword.php:252 +#, fuzzy +msgid "Enter a nickname or email address." +msgstr "Tiu ne estas via retpoŝtadreso." + +#: actions/recoverpassword.php:282 +msgid "No user with that email address or username." +msgstr "" + +#: actions/recoverpassword.php:299 +msgid "No registered email address for that user." +msgstr "" + +#: actions/recoverpassword.php:313 +#, fuzzy +msgid "Error saving address confirmation." +msgstr "Eraris konservi uzanton: nevalida." + +#: actions/recoverpassword.php:338 +msgid "" +"Instructions for recovering your password have been sent to the email " +"address registered to your account." +msgstr "" + +#: actions/recoverpassword.php:357 +#, fuzzy +msgid "Unexpected password reset." +msgstr "Neatendita formo-sendo." + +#: actions/recoverpassword.php:365 +msgid "Password must be 6 chars or more." +msgstr "Pasvorto devas enhavi 6 signojn aŭ pli." + +#: actions/recoverpassword.php:369 +#, fuzzy +msgid "Password and confirmation do not match." +msgstr "La pasvortoj diferencas." + +#: actions/recoverpassword.php:388 actions/register.php:255 +#, fuzzy +msgid "Error setting user." +msgstr "Eraris konservi uzanton: nevalida." + +#: actions/recoverpassword.php:395 +msgid "New password successfully saved. You are now logged in." +msgstr "" + +#: actions/register.php:92 actions/register.php:196 actions/register.php:412 +msgid "Sorry, only invited people can register." +msgstr "" + +#: actions/register.php:99 +msgid "Sorry, invalid invitation code." +msgstr "" + +#: actions/register.php:119 +msgid "Registration successful" +msgstr "Registriĝo sukcesa" + +#: actions/register.php:121 actions/register.php:506 lib/logingroupnav.php:85 +msgid "Register" +msgstr "Registri" + +#: actions/register.php:142 +msgid "Registration not allowed." +msgstr "Registriĝo ne permesita." + +#: actions/register.php:205 +msgid "You can't register if you don't agree to the license." +msgstr "Vi ne povas registri se vi ne konsentas al la licenco." + +#: actions/register.php:219 +msgid "Email address already exists." +msgstr "Retpoŝta adreso jam ekzistas." + +#: actions/register.php:250 actions/register.php:272 +msgid "Invalid username or password." +msgstr "Nevalida uzantnomo aŭ pasvorto." + +#: actions/register.php:350 +msgid "" +"With this form you can create a new account. You can then post notices and " +"link up to friends and colleagues. " +msgstr "" + +#: actions/register.php:432 +#, fuzzy +msgid "1-64 lowercase letters or numbers, no punctuation or spaces. Required." +msgstr "1-64 minusklaj literoj aŭ ciferoj, neniu interpunkcio aŭ spaco" + +#: actions/register.php:437 +#, fuzzy +msgid "6 or more characters. Required." +msgstr "6 aŭ pli da literoj" + +#: actions/register.php:441 +#, fuzzy +msgid "Same as password above. Required." +msgstr "Same kiel pasvorto supra" + +#. TRANS: Link description in user account settings menu. +#: actions/register.php:445 actions/register.php:449 +#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:132 +msgid "Email" +msgstr "Retpoŝto" + +#: actions/register.php:446 actions/register.php:450 +msgid "Used only for updates, announcements, and password recovery" +msgstr "" + +#: actions/register.php:457 +msgid "Longer name, preferably your \"real\" name" +msgstr "" + +#: actions/register.php:518 +#, php-format +msgid "" +"I understand that content and data of %1$s are private and confidential." +msgstr "" + +#: actions/register.php:528 +#, php-format +msgid "My text and files are copyright by %1$s." +msgstr "" + +#. TRANS: Copyright checkbox label in registration dialog, for all rights reserved with ownership left to contributors. +#: actions/register.php:532 +msgid "My text and files remain under my own copyright." +msgstr "" + +#. TRANS: Copyright checkbox label in registration dialog, for all rights reserved. +#: actions/register.php:535 +msgid "All rights reserved." +msgstr "" + +#. TRANS: Copyright checkbox label in registration dialog, for Creative Commons-style licenses. +#: actions/register.php:540 +#, php-format +msgid "" +"My text and files are available under %s except this private data: password, " +"email address, IM address, and phone number." +msgstr "" + +#: actions/register.php:583 +#, php-format +msgid "" +"Congratulations, %1$s! And welcome to %%%%site.name%%%%. From here, you may " +"want to...\n" +"\n" +"* Go to [your profile](%2$s) and post your first message.\n" +"* Add a [Jabber/GTalk address](%%%%action.imsettings%%%%) so you can send " +"notices through instant messages.\n" +"* [Search for people](%%%%action.peoplesearch%%%%) that you may know or that " +"share your interests. \n" +"* Update your [profile settings](%%%%action.profilesettings%%%%) to tell " +"others more about you. \n" +"* Read over the [online docs](%%%%doc.help%%%%) for features you may have " +"missed. \n" +"\n" +"Thanks for signing up and we hope you enjoy using this service." +msgstr "" + +#: actions/register.php:607 +msgid "" +"(You should receive a message by email momentarily, with instructions on how " +"to confirm your email address.)" +msgstr "" + +#: actions/remotesubscribe.php:98 +#, php-format +msgid "" +"To subscribe, you can [login](%%action.login%%), or [register](%%action." +"register%%) a new account. If you already have an account on a [compatible " +"microblogging site](%%doc.openmublog%%), enter your profile URL below." +msgstr "" + +#: actions/remotesubscribe.php:112 +#, fuzzy +msgid "Remote subscribe" +msgstr "Malaboni" + +#: actions/remotesubscribe.php:124 +msgid "Subscribe to a remote user" +msgstr "" + +#: actions/remotesubscribe.php:129 +#, fuzzy +msgid "User nickname" +msgstr "Neniu kromnomo." + +#: actions/remotesubscribe.php:130 +msgid "Nickname of the user you want to follow" +msgstr "" + +#: actions/remotesubscribe.php:133 +#, fuzzy +msgid "Profile URL" +msgstr "Profilo" + +#: actions/remotesubscribe.php:134 +msgid "URL of your profile on another compatible microblogging service" +msgstr "" + +#: actions/remotesubscribe.php:137 lib/subscribeform.php:139 +#: lib/userprofile.php:406 +msgid "Subscribe" +msgstr "Aboni" + +#: actions/remotesubscribe.php:159 +msgid "Invalid profile URL (bad format)" +msgstr "" + +#: actions/remotesubscribe.php:168 +msgid "Not a valid profile URL (no YADIS document or invalid XRDS defined)." +msgstr "" + +#: actions/remotesubscribe.php:176 +msgid "That’s a local profile! Login to subscribe." +msgstr "" + +#: actions/remotesubscribe.php:183 +#, fuzzy +msgid "Couldn’t get a request token." +msgstr "Malsukcesis interŝanĝi petĵetonon al atingoĵetono." + +#: actions/repeat.php:57 +msgid "Only logged-in users can repeat notices." +msgstr "" + +#: actions/repeat.php:64 actions/repeat.php:71 +#, fuzzy +msgid "No notice specified." +msgstr "Neniu profilo elektita." + +#: actions/repeat.php:76 +msgid "You can't repeat your own notice." +msgstr "Vi ne povas ripeti vian propran avizon." + +#: actions/repeat.php:90 +msgid "You already repeated that notice." +msgstr "La avizo jam ripetiĝis." + +#: actions/repeat.php:114 lib/noticelist.php:676 +msgid "Repeated" +msgstr "Ripetita" + +#: actions/repeat.php:119 +msgid "Repeated!" +msgstr "Ripetita!" + +#: actions/replies.php:126 actions/repliesrss.php:68 +#: lib/personalgroupnav.php:105 +#, fuzzy, php-format +msgid "Replies to %s" +msgstr "Ripetoj de %s" + +#: actions/replies.php:128 +#, fuzzy, php-format +msgid "Replies to %1$s, page %2$d" +msgstr "Alvenkesto de %1$s - paĝo %2$d" + +#: actions/replies.php:145 +#, fuzzy, php-format +msgid "Replies feed for %s (RSS 1.0)" +msgstr "Fluo por amikoj de %s (RSS 1.0)" + +#: actions/replies.php:152 +#, fuzzy, php-format +msgid "Replies feed for %s (RSS 2.0)" +msgstr "Fluo por amikoj de %s (RSS 2.0)" + +#: actions/replies.php:159 +#, fuzzy, php-format +msgid "Replies feed for %s (Atom)" +msgstr "Fluo por amikoj de %s (Atom)" + +#: actions/replies.php:199 +#, fuzzy, php-format +msgid "" +"This is the timeline showing replies to %1$s but %2$s hasn't received a " +"notice to them yet." +msgstr "" +"Tie ĉi estas la tempstrio de %s kaj amikoj sed ankoraŭ neniu afiŝis ion ajn." + +#: actions/replies.php:204 +#, php-format +msgid "" +"You can engage other users in a conversation, subscribe to more people or " +"[join groups](%%action.groups%%)." +msgstr "" + +#: actions/replies.php:206 +#, fuzzy, php-format +msgid "" +"You can try to [nudge %1$s](../%2$s) or [post something to them](%%%%action." +"newnotice%%%%?status_textarea=%3$s)." +msgstr "" +"Vi povas provi [puŝeti %1$s](../%2$s) de lia profilo aŭ [afiŝi ion al li](%%" +"%%action.newnotice%%%%?status_textarea=%3$s)." + +#: actions/repliesrss.php:72 +#, fuzzy, php-format +msgid "Replies to %1$s on %2$s!" +msgstr "Bonvenon al %1$s, @%2$s!" + +#: actions/revokerole.php:75 +#, fuzzy +msgid "You cannot revoke user roles on this site." +msgstr "Vi ne rajtas doni al uzanto rolon ĉe ĉi tiu retejo." + +#: actions/revokerole.php:82 +#, fuzzy +msgid "User doesn't have this role." +msgstr "Uzanto jam havas la rolon." + +#: actions/rsd.php:146 actions/version.php:159 +#, fuzzy +msgid "StatusNet" +msgstr "Stato forigita." + +#: actions/sandbox.php:65 actions/unsandbox.php:65 +#, fuzzy +msgid "You cannot sandbox users on this site." +msgstr "Vi ne rajtas doni al uzanto rolon ĉe ĉi tiu retejo." + +#: actions/sandbox.php:72 +#, fuzzy +msgid "User is already sandboxed." +msgstr "La uzanto jam de grupo blokiĝas." + +#. TRANS: Menu item for site administration +#: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 +#: lib/adminpanelaction.php:392 +#, fuzzy +msgid "Sessions" +msgstr "Versio" + +#: actions/sessionsadminpanel.php:65 +#, fuzzy +msgid "Session settings for this StatusNet site." +msgstr "Aspektaj agordoj por ĉi tiu StatusNet-retejo." + +#: actions/sessionsadminpanel.php:175 +msgid "Handle sessions" +msgstr "" + +#: actions/sessionsadminpanel.php:177 +msgid "Whether to handle sessions ourselves." +msgstr "" + +#: actions/sessionsadminpanel.php:181 +msgid "Session debugging" +msgstr "" + +#: actions/sessionsadminpanel.php:183 +msgid "Turn on debugging output for sessions." +msgstr "" + +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292 +#: actions/useradminpanel.php:294 +#, fuzzy +msgid "Save site settings" +msgstr "Konservu atingan agordon" + +#: actions/showapplication.php:82 +#, fuzzy +msgid "You must be logged in to view an application." +msgstr "Ensalutu por redakti la aplikaĵon." + +#: actions/showapplication.php:157 +#, fuzzy +msgid "Application profile" +msgstr "Aplikaĵo ne trovita." + +#. TRANS: Form input field label for application icon. +#: actions/showapplication.php:159 lib/applicationeditform.php:182 +msgid "Icon" +msgstr "" + +#. TRANS: Form input field label for application name. +#: actions/showapplication.php:169 actions/version.php:197 +#: lib/applicationeditform.php:199 +msgid "Name" +msgstr "Nomo" + +#. TRANS: Form input field label. +#: actions/showapplication.php:178 lib/applicationeditform.php:235 +msgid "Organization" +msgstr "Organizaĵo" + +#. TRANS: Form input field label. +#: actions/showapplication.php:187 actions/version.php:200 +#: lib/applicationeditform.php:216 lib/groupeditform.php:172 +msgid "Description" +msgstr "Priskribo" + +#: actions/showapplication.php:192 actions/showgroup.php:436 +#: lib/profileaction.php:187 +msgid "Statistics" +msgstr "" + +#: actions/showapplication.php:203 +#, php-format +msgid "Created by %1$s - %2$s access by default - %3$d users" +msgstr "" + +#: actions/showapplication.php:213 +#, fuzzy +msgid "Application actions" +msgstr "Aplikaĵo ne trovita." + +#: actions/showapplication.php:236 +msgid "Reset key & secret" +msgstr "" + +#: actions/showapplication.php:261 +#, fuzzy +msgid "Application info" +msgstr "Aplikaĵo ne trovita." + +#: actions/showapplication.php:263 +msgid "Consumer key" +msgstr "" + +#: actions/showapplication.php:268 +msgid "Consumer secret" +msgstr "" + +#: actions/showapplication.php:273 +msgid "Request token URL" +msgstr "" + +#: actions/showapplication.php:278 +msgid "Access token URL" +msgstr "" + +#: actions/showapplication.php:283 +msgid "Authorize URL" +msgstr "" + +#: actions/showapplication.php:288 +msgid "" +"Note: We support HMAC-SHA1 signatures. We do not support the plaintext " +"signature method." +msgstr "" + +#: actions/showapplication.php:309 +#, fuzzy +msgid "Are you sure you want to reset your consumer key and secret?" +msgstr "Ĉu vi certe volas forigi la avizon?" + +#: actions/showfavorites.php:79 +#, fuzzy, php-format +msgid "%1$s's favorite notices, page %2$d" +msgstr "Ŝatataj avizoj de %s" + +#: actions/showfavorites.php:132 +#, fuzzy +msgid "Could not retrieve favorite notices." +msgstr "Malsukcesis krei ŝataton." + +#: actions/showfavorites.php:171 +#, fuzzy, php-format +msgid "Feed for favorites of %s (RSS 1.0)" +msgstr "Fluo por amikoj de %s (RSS 1.0)" + +#: actions/showfavorites.php:178 +#, fuzzy, php-format +msgid "Feed for favorites of %s (RSS 2.0)" +msgstr "Fluo por amikoj de %s (RSS 2.0)" + +#: actions/showfavorites.php:185 +#, fuzzy, php-format +msgid "Feed for favorites of %s (Atom)" +msgstr "Fluo por amikoj de %s (Atom)" + +#: actions/showfavorites.php:206 +msgid "" +"You haven't chosen any favorite notices yet. Click the fave button on " +"notices you like to bookmark them for later or shed a spotlight on them." +msgstr "" + +#: actions/showfavorites.php:208 +#, php-format +msgid "" +"%s hasn't added any favorite notices yet. Post something interesting they " +"would add to their favorites :)" +msgstr "" + +#: actions/showfavorites.php:212 +#, fuzzy, php-format +msgid "" +"%s hasn't added any favorite notices yet. Why not [register an account](%%%%" +"action.register%%%%) and then post something interesting they would add to " +"their favorites :)" +msgstr "" +"[Kreu konton](%%action.register%%) kaj estu la unua, kiu aldonos avizon al " +"sia ŝatolisto!" + +#: actions/showfavorites.php:243 +msgid "This is a way to share what you like." +msgstr "" + +#: actions/showgroup.php:82 lib/groupnav.php:86 +#, fuzzy, php-format +msgid "%s group" +msgstr "Grupoj de %s" + +#: actions/showgroup.php:84 +#, fuzzy, php-format +msgid "%1$s group, page %2$d" +msgstr "%1$s grupanoj, paĝo %2$d" + +#: actions/showgroup.php:227 +#, fuzzy +msgid "Group profile" +msgstr "Grupa emblemo" + +#: actions/showgroup.php:272 actions/tagother.php:118 +#: actions/userauthorization.php:175 lib/userprofile.php:178 +msgid "URL" +msgstr "URL" + +#: actions/showgroup.php:283 actions/tagother.php:128 +#: actions/userauthorization.php:187 lib/userprofile.php:195 +msgid "Note" +msgstr "Noto" + +#: actions/showgroup.php:293 lib/groupeditform.php:184 +#, fuzzy +msgid "Aliases" +msgstr "Ĉiam" + +#: actions/showgroup.php:302 +#, fuzzy +msgid "Group actions" +msgstr "grupoj ĉe %s" + +#: actions/showgroup.php:338 +#, fuzzy, php-format +msgid "Notice feed for %s group (RSS 1.0)" +msgstr "Fluo por amikoj de %s (RSS 1.0)" + +#: actions/showgroup.php:344 +#, fuzzy, php-format +msgid "Notice feed for %s group (RSS 2.0)" +msgstr "Fluo por amikoj de %s (RSS 2.0)" + +#: actions/showgroup.php:350 +#, fuzzy, php-format +msgid "Notice feed for %s group (Atom)" +msgstr "Fluo por amikoj de %s (Atom)" + +#: actions/showgroup.php:355 +#, fuzzy, php-format +msgid "FOAF for %s group" +msgstr "Grupoj de %s" + +#: actions/showgroup.php:393 actions/showgroup.php:445 lib/groupnav.php:91 +msgid "Members" +msgstr "Grupanoj" + +#: actions/showgroup.php:398 lib/profileaction.php:117 +#: lib/profileaction.php:152 lib/profileaction.php:255 lib/section.php:95 +#: lib/subscriptionlist.php:127 lib/tagcloudsection.php:71 +#, fuzzy +msgid "(None)" +msgstr "Noto" + +#: actions/showgroup.php:404 +msgid "All members" +msgstr "Ĉiuj grupanoj" + +#: actions/showgroup.php:439 +#, fuzzy +msgid "Created" +msgstr "Ripetita" + +#: actions/showgroup.php:455 +#, fuzzy, php-format +msgid "" +"**%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%%%%))" +msgstr "" +"Tio ĉi estas %%site.name%%, [mikrobloga](http://en.wikipedia.org/wiki/Micro-" +"blogging) servo surbaze de libera servila programo [StatusNet](http://status." +"net/)." + +#: actions/showgroup.php:461 +#, fuzzy, php-format +msgid "" +"**%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. " +msgstr "" +"Tio ĉi estas %%site.name%%, [mikrobloga](http://en.wikipedia.org/wiki/Micro-" +"blogging) servo surbaze de libera servila programo [StatusNet](http://status." +"net/)." + +#: actions/showgroup.php:489 +#, fuzzy +msgid "Admins" +msgstr "Administranto" + +#: actions/showmessage.php:81 +#, fuzzy +msgid "No such message." +msgstr "Ne estas tiu paĝo." + +#: actions/showmessage.php:98 +msgid "Only the sender and recipient may read this message." +msgstr "" + +#: actions/showmessage.php:108 +#, fuzzy, php-format +msgid "Message to %1$s on %2$s" +msgstr "Ĝisdatigoj etikeditaj %1$s ĉe %2$s!" + +#: actions/showmessage.php:113 +#, fuzzy, php-format +msgid "Message from %1$s on %2$s" +msgstr "Ĝisdatigoj etikeditaj %1$s ĉe %2$s!" + +#: actions/shownotice.php:90 +msgid "Notice deleted." +msgstr "Avizo viŝiĝas" + +#: actions/showstream.php:73 +#, fuzzy, php-format +msgid " tagged %s" +msgstr "Avizoj etikeditaj %s" + +#: actions/showstream.php:79 +#, fuzzy, php-format +msgid "%1$s, page %2$d" +msgstr "%1$s kaj amikoj, paĝo %2$d" + +#: actions/showstream.php:122 +#, fuzzy, php-format +msgid "Notice feed for %1$s tagged %2$s (RSS 1.0)" +msgstr "Fluo por amikoj de %s (RSS 1.0)" + +#: actions/showstream.php:129 +#, fuzzy, php-format +msgid "Notice feed for %s (RSS 1.0)" +msgstr "Fluo por amikoj de %s (RSS 1.0)" + +#: actions/showstream.php:136 +#, fuzzy, php-format +msgid "Notice feed for %s (RSS 2.0)" +msgstr "Fluo por amikoj de %s (RSS 2.0)" + +#: actions/showstream.php:143 +#, fuzzy, php-format +msgid "Notice feed for %s (Atom)" +msgstr "Fluo por amikoj de %s (Atom)" + +#: actions/showstream.php:148 +#, fuzzy, php-format +msgid "FOAF for %s" +msgstr "Elirkesto de %s" + +#: actions/showstream.php:200 +#, fuzzy, php-format +msgid "This is the timeline for %1$s but %2$s hasn't posted anything yet." +msgstr "" +"Tie ĉi estas la tempstrio de %s kaj amikoj sed ankoraŭ neniu afiŝis ion ajn." + +#: actions/showstream.php:205 +msgid "" +"Seen anything interesting recently? You haven't posted any notices yet, now " +"would be a good time to start :)" +msgstr "" + +#: actions/showstream.php:207 +#, fuzzy, php-format +msgid "" +"You can try to nudge %1$s or [post something to them](%%%%action.newnotice%%%" +"%?status_textarea=%2$s)." +msgstr "" +"Vi povas provi [puŝeti %1$s](../%2$s) de lia profilo aŭ [afiŝi ion al li](%%" +"%%action.newnotice%%%%?status_textarea=%3$s)." + +#: actions/showstream.php:243 +#, fuzzy, php-format +msgid "" +"**%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%%%%))" +msgstr "" +"Tio ĉi estas %%site.name%%, [mikrobloga](http://en.wikipedia.org/wiki/Micro-" +"blogging) servo surbaze de libera servila programo [StatusNet](http://status." +"net/)." + +#: actions/showstream.php:248 +#, fuzzy, php-format +msgid "" +"**%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. " +msgstr "" +"Tio ĉi estas %%site.name%%, [mikrobloga](http://en.wikipedia.org/wiki/Micro-" +"blogging) servo surbaze de libera servila programo [StatusNet](http://status." +"net/)." + +#: actions/showstream.php:305 +#, fuzzy, php-format +msgid "Repeat of %s" +msgstr "Ripetoj de %s" + +#: actions/silence.php:65 actions/unsilence.php:65 +#, fuzzy +msgid "You cannot silence users on this site." +msgstr "Vi ne rajtas doni al uzanto rolon ĉe ĉi tiu retejo." + +#: actions/silence.php:72 +#, fuzzy +msgid "User is already silenced." +msgstr "La uzanto jam de grupo blokiĝas." + +#: actions/siteadminpanel.php:69 +#, fuzzy +msgid "Basic settings for this StatusNet site" +msgstr "Aspektaj agordoj por ĉi tiu StatusNet-retejo." + +#: actions/siteadminpanel.php:133 +msgid "Site name must have non-zero length." +msgstr "" + +#: actions/siteadminpanel.php:141 +#, fuzzy +msgid "You must have a valid contact email address." +msgstr "Retpoŝta adreso ne valida" + +#: actions/siteadminpanel.php:159 +#, php-format +msgid "Unknown language \"%s\"." +msgstr "" + +#: actions/siteadminpanel.php:165 +msgid "Minimum text limit is 0 (unlimited)." +msgstr "" + +#: actions/siteadminpanel.php:171 +msgid "Dupe limit must be one or more seconds." +msgstr "" + +#: actions/siteadminpanel.php:221 +msgid "General" +msgstr "Ĝenerala" + +#: actions/siteadminpanel.php:224 +#, fuzzy +msgid "Site name" +msgstr "Reteja desegno" + +#: actions/siteadminpanel.php:225 +msgid "The name of your site, like \"Yourcompany Microblog\"" +msgstr "" + +#: actions/siteadminpanel.php:229 +msgid "Brought by" +msgstr "" + +#: actions/siteadminpanel.php:230 +msgid "Text used for credits link in footer of each page" +msgstr "" + +#: actions/siteadminpanel.php:234 +msgid "Brought by URL" +msgstr "" + +#: actions/siteadminpanel.php:235 +msgid "URL used for credits link in footer of each page" +msgstr "" + +#: actions/siteadminpanel.php:239 +#, fuzzy +msgid "Contact email address for your site" +msgstr "Alvena retpoŝtadreso forigita." + +#: actions/siteadminpanel.php:245 +#, fuzzy +msgid "Local" +msgstr "Loko" + +#: actions/siteadminpanel.php:256 +msgid "Default timezone" +msgstr "" + +#: actions/siteadminpanel.php:257 +msgid "Default timezone for the site; usually UTC." +msgstr "" + +#: actions/siteadminpanel.php:262 +#, fuzzy +msgid "Default language" +msgstr "Preferata lingvo" + +#: actions/siteadminpanel.php:263 +msgid "Site language when autodetection from browser settings is not available" +msgstr "" + +#: actions/siteadminpanel.php:271 +msgid "Limits" +msgstr "" + +#: actions/siteadminpanel.php:274 +msgid "Text limit" +msgstr "" + +#: actions/siteadminpanel.php:274 +msgid "Maximum number of characters for notices." +msgstr "" + +#: actions/siteadminpanel.php:278 +msgid "Dupe limit" +msgstr "" + +#: actions/siteadminpanel.php:278 +msgid "How long users must wait (in seconds) to post the same thing again." +msgstr "" + +#: actions/sitenoticeadminpanel.php:56 +#, fuzzy +msgid "Site Notice" +msgstr "Avizoj" + +#: actions/sitenoticeadminpanel.php:67 +#, fuzzy +msgid "Edit site-wide message" +msgstr "Nova mesaĝo" + +#: actions/sitenoticeadminpanel.php:103 +#, fuzzy +msgid "Unable to save site notice." +msgstr "Malsukcesis konservi vian desegnan agordon" + +#: actions/sitenoticeadminpanel.php:113 +msgid "Max length for the site-wide notice is 255 chars." +msgstr "" + +#: actions/sitenoticeadminpanel.php:176 +#, fuzzy +msgid "Site notice text" +msgstr "Forigi avizon" + +#: actions/sitenoticeadminpanel.php:178 +msgid "Site-wide notice text (255 chars max; HTML okay)" +msgstr "" + +#: actions/sitenoticeadminpanel.php:198 +#, fuzzy +msgid "Save site notice" +msgstr "Forigi avizon" + +#. TRANS: Title for SMS settings. +#: actions/smssettings.php:59 +#, fuzzy +msgid "SMS settings" +msgstr "Tujmesaĝila agordo." + +#. TRANS: SMS settings page instructions. +#. TRANS: %%site.name%% is the name of the site. +#: actions/smssettings.php:74 +#, fuzzy, php-format +msgid "You can receive SMS messages through email from %%site.name%%." +msgstr "Administri kiel ricevi mesaĝon de %%site.name%%." + +#. TRANS: Message given in the SMS settings if SMS is not enabled on the site. +#: actions/smssettings.php:97 +#, fuzzy +msgid "SMS is not available." +msgstr "Tujmesaĝilo ne estas disponebla." + +#. TRANS: Form legend for SMS settings form. +#: actions/smssettings.php:111 +#, fuzzy +msgid "SMS address" +msgstr "Tujmesaĝila adreso" + +#. TRANS: Form guide in SMS settings form. +#: actions/smssettings.php:120 +#, fuzzy +msgid "Current confirmed SMS-enabled phone number." +msgstr "Nuna konfirmita retpoŝtadreso." + +#. TRANS: Form guide in IM settings form. +#: actions/smssettings.php:133 +msgid "Awaiting confirmation on this phone number." +msgstr "" + +#. TRANS: Field label for SMS address input in SMS settings form. +#: actions/smssettings.php:142 +#, fuzzy +msgid "Confirmation code" +msgstr "Neniu konfirma kodo." + +#. TRANS: Form field instructions in SMS settings form. +#: actions/smssettings.php:144 +msgid "Enter the code you received on your phone." +msgstr "" + +#. TRANS: Button label to confirm SMS confirmation code in SMS settings. +#: actions/smssettings.php:148 +msgctxt "BUTTON" +msgid "Confirm" +msgstr "Konfirmi" + +#. TRANS: Field label for SMS phone number input in SMS settings form. +#: actions/smssettings.php:153 +msgid "SMS phone number" +msgstr "" + +#. TRANS: SMS phone number input field instructions in SMS settings form. +#: actions/smssettings.php:156 +#, fuzzy +msgid "Phone number, no punctuation or spaces, with area code" +msgstr "1-64 minusklaj literoj aŭ ciferoj, neniu interpunkcio aŭ spaco" + +#. TRANS: Form legend for SMS preferences form. +#: actions/smssettings.php:195 +#, fuzzy +msgid "SMS preferences" +msgstr "Tujmesaĝilaj preferoj" + +#. TRANS: Checkbox label in SMS preferences form. +#: actions/smssettings.php:201 +msgid "" +"Send me notices through SMS; I understand I may incur exorbitant charges " +"from my carrier." +msgstr "" + +#. TRANS: Confirmation message for successful SMS preferences save. +#: actions/smssettings.php:315 +#, fuzzy +msgid "SMS preferences saved." +msgstr "Prefero konservita." + +#. TRANS: Message given saving SMS phone number without having provided one. +#: actions/smssettings.php:338 +#, fuzzy +msgid "No phone number." +msgstr "Ne ekzistas tiu uzanto." + +#. TRANS: Message given saving SMS phone number without having selected a carrier. +#: actions/smssettings.php:344 +#, fuzzy +msgid "No carrier selected." +msgstr "Avizo viŝiĝas" + +#. TRANS: Message given saving SMS phone number that is already set. +#: actions/smssettings.php:352 +#, fuzzy +msgid "That is already your phone number." +msgstr "Tio estas jam via Jabber-ID." + +#. TRANS: Message given saving SMS phone number that is already set for another user. +#: actions/smssettings.php:356 +#, fuzzy +msgid "That phone number already belongs to another user." +msgstr "Tiu retpoŝtadreso jam apartenas al alia uzanto." + +#. TRANS: Message given saving valid SMS phone number that is to be confirmed. +#: actions/smssettings.php:384 +#, fuzzy +msgid "" +"A confirmation code was sent to the phone number you added. Check your phone " +"for the code and instructions on how to use it." +msgstr "" +"Konfirmkodo jam senditas al la aldonita retpoŝtadreso. Kontrolu vian " +"alvenkeston (kaj spamkeston!) pri la kodo kaj instrukcio pri kiel uzi ĝin." + +#. TRANS: Message given canceling SMS phone number confirmation for the wrong phone number. +#: actions/smssettings.php:413 +#, fuzzy +msgid "That is the wrong confirmation number." +msgstr "Tiu retpoŝtadreso estas malĝusta." + +#. TRANS: Message given after successfully canceling SMS phone number confirmation. +#: actions/smssettings.php:427 +#, fuzzy +msgid "SMS confirmation cancelled." +msgstr "Tujmesaĝila konfirmo nuligita." + +#. TRANS: Message given trying to remove an SMS phone number that is not +#. TRANS: registered for the active user. +#: actions/smssettings.php:448 +#, fuzzy +msgid "That is not your phone number." +msgstr "Tio ne estas via Jabber-ID." + +#. TRANS: Message given after successfully removing a registered SMS phone number. +#: actions/smssettings.php:470 +#, fuzzy +msgid "The SMS phone number was removed." +msgstr "La tujmesaĝila adreso estas forigita." + +#. TRANS: Label for mobile carrier dropdown menu in SMS settings. +#: actions/smssettings.php:511 +msgid "Mobile carrier" +msgstr "" + +#. TRANS: Default option for mobile carrier dropdown menu in SMS settings. +#: actions/smssettings.php:516 +msgid "Select a carrier" +msgstr "" + +#. TRANS: Form instructions for mobile carrier dropdown menu in SMS settings. +#. TRANS: %s is an administrative contact's e-mail address. +#: actions/smssettings.php:525 +#, php-format +msgid "" +"Mobile carrier for your phone. If you know a carrier that accepts SMS over " +"email but isn't listed here, send email to let us know at %s." +msgstr "" + +#. TRANS: Message given saving SMS phone number confirmation code without having provided one. +#: actions/smssettings.php:548 +#, fuzzy +msgid "No code entered" +msgstr "Neniu enhavo!" + +#. TRANS: Menu item for site administration +#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196 +#: lib/adminpanelaction.php:408 +msgid "Snapshots" +msgstr "" + +#: actions/snapshotadminpanel.php:65 +#, fuzzy +msgid "Manage snapshot configuration" +msgstr "Ŝanĝi agordojn de la retejo" + +#: actions/snapshotadminpanel.php:127 +#, fuzzy +msgid "Invalid snapshot run value." +msgstr "Rolo nevalida." + +#: actions/snapshotadminpanel.php:133 +msgid "Snapshot frequency must be a number." +msgstr "" + +#: actions/snapshotadminpanel.php:144 +#, fuzzy +msgid "Invalid snapshot report URL." +msgstr "URL por la emblemo nevalida." + +#: actions/snapshotadminpanel.php:200 +msgid "Randomly during web hit" +msgstr "" + +#: actions/snapshotadminpanel.php:201 +msgid "In a scheduled job" +msgstr "" + +#: actions/snapshotadminpanel.php:206 +msgid "Data snapshots" +msgstr "" + +#: actions/snapshotadminpanel.php:208 +msgid "When to send statistical data to status.net servers" +msgstr "" + +#: actions/snapshotadminpanel.php:217 +msgid "Frequency" +msgstr "Ofteco" + +#: actions/snapshotadminpanel.php:218 +msgid "Snapshots will be sent once every N web hits" +msgstr "" + +#: actions/snapshotadminpanel.php:226 +msgid "Report URL" +msgstr "" + +#: actions/snapshotadminpanel.php:227 +msgid "Snapshots will be sent to this URL" +msgstr "" + +#: actions/snapshotadminpanel.php:248 +#, fuzzy +msgid "Save snapshot settings" +msgstr "Konservu atingan agordon" + +#: actions/subedit.php:70 +#, fuzzy +msgid "You are not subscribed to that profile." +msgstr "Vi ne estas grupano." + +#. TRANS: Exception thrown when a subscription could not be stored on the server. +#: actions/subedit.php:83 classes/Subscription.php:136 +#, fuzzy +msgid "Could not save subscription." +msgstr "Malsukcesis konservi la profilon." + +#: actions/subscribe.php:77 +msgid "This action only accepts POST requests." +msgstr "" + +#: actions/subscribe.php:107 +#, fuzzy +msgid "No such profile." +msgstr "Ne ekzistas tia dosiero." + +#: actions/subscribe.php:117 +msgid "You cannot subscribe to an OMB 0.1 remote profile with this action." +msgstr "" + +#: actions/subscribe.php:145 +msgid "Subscribed" +msgstr "Abonita" + +#: actions/subscribers.php:50 +#, fuzzy, php-format +msgid "%s subscribers" +msgstr "Malaboni" + +#: actions/subscribers.php:52 +#, fuzzy, php-format +msgid "%1$s subscribers, page %2$d" +msgstr "%1$s grupanoj, paĝo %2$d" + +#: actions/subscribers.php:63 +msgid "These are the people who listen to your notices." +msgstr "" + +#: actions/subscribers.php:67 +#, php-format +msgid "These are the people who listen to %s's notices." +msgstr "" + +#: actions/subscribers.php:108 +msgid "" +"You have no subscribers. Try subscribing to people you know and they might " +"return the favor" +msgstr "" + +#: actions/subscribers.php:110 +#, php-format +msgid "%s has no subscribers. Want to be the first?" +msgstr "" + +#: actions/subscribers.php:114 +#, fuzzy, php-format +msgid "" +"%s has no subscribers. Why not [register an account](%%%%action.register%%%" +"%) and be the first?" +msgstr "Kial ne [krei konton](%%action.register%%) kaj esti la unua afiŝanto!" + +#: actions/subscriptions.php:52 +#, fuzzy, php-format +msgid "%s subscriptions" +msgstr "Priskribo" + +#: actions/subscriptions.php:54 +#, fuzzy, php-format +msgid "%1$s subscriptions, page %2$d" +msgstr "%1$s kaj amikoj, paĝo %2$d" + +#: actions/subscriptions.php:65 +msgid "These are the people whose notices you listen to." +msgstr "" + +#: actions/subscriptions.php:69 +#, php-format +msgid "These are the people whose notices %s listens to." +msgstr "" + +#: actions/subscriptions.php:126 +#, php-format +msgid "" +"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." +msgstr "" + +#: actions/subscriptions.php:128 actions/subscriptions.php:132 +#, php-format +msgid "%s is not listening to anyone." +msgstr "" + +#: actions/subscriptions.php:208 +msgid "Jabber" +msgstr "Jabber" + +#: actions/subscriptions.php:222 lib/connectsettingsaction.php:115 +msgid "SMS" +msgstr "SMS" + +#: actions/tag.php:69 +#, fuzzy, php-format +msgid "Notices tagged with %1$s, page %2$d" +msgstr "Uzantoj sinmarkitaj per %1$s - paĝo %2$d" + +#: actions/tag.php:87 +#, fuzzy, php-format +msgid "Notice feed for tag %s (RSS 1.0)" +msgstr "Fluo por amikoj de %s (RSS 1.0)" + +#: actions/tag.php:93 +#, fuzzy, php-format +msgid "Notice feed for tag %s (RSS 2.0)" +msgstr "Fluo por amikoj de %s (RSS 2.0)" + +#: actions/tag.php:99 +#, fuzzy, php-format +msgid "Notice feed for tag %s (Atom)" +msgstr "Fluo por amikoj de %s (Atom)" + +#: actions/tagother.php:39 +#, fuzzy +msgid "No ID argument." +msgstr "Ne estas aldonaĵo." + +#: actions/tagother.php:65 +#, fuzzy, php-format +msgid "Tag %s" +msgstr "Markiloj" + +#: actions/tagother.php:77 lib/userprofile.php:76 +#, fuzzy +msgid "User profile" +msgstr "La uzanto ne havas profilon." + +#: actions/tagother.php:81 actions/userauthorization.php:132 +#: lib/userprofile.php:103 +msgid "Photo" +msgstr "Foto" + +#: actions/tagother.php:141 +#, fuzzy +msgid "Tag user" +msgstr "Markiloj" + +#: actions/tagother.php:151 +#, fuzzy +msgid "" +"Tags for this user (letters, numbers, -, ., and _), comma- or space- " +"separated" +msgstr "" +"Markiloj por vi mem (literoj, ciferoj, \"-\", \".\", kaj \"_\"), dividite " +"per komoj aŭ spacoj" + +#: actions/tagother.php:193 +msgid "" +"You can only tag people you are subscribed to or who are subscribed to you." +msgstr "" + +#: actions/tagother.php:200 +#, fuzzy +msgid "Could not save tags." +msgstr "Malsukcesis konservi markilojn." + +#: actions/tagother.php:236 +#, fuzzy +msgid "Use this form to add tags to your subscribers or subscriptions." +msgstr "Uzu ĉi tiun formularon por redakti vian aplikaĵon." + +#: actions/tagrss.php:35 +#, fuzzy +msgid "No such tag." +msgstr "Ne estas tiu paĝo." + +#: actions/unblock.php:59 +#, fuzzy +msgid "You haven't blocked that user." +msgstr "Vi jam blokis la uzanton." + +#: actions/unsandbox.php:72 +#, fuzzy +msgid "User is not sandboxed." +msgstr "La uzanto ne estas blokita de grupo." + +#: actions/unsilence.php:72 +#, fuzzy +msgid "User is not silenced." +msgstr "La uzanto ne havas profilon." + +#: actions/unsubscribe.php:77 +#, fuzzy +msgid "No profile ID in request." +msgstr "Neniu ensalutad-ĵetono bezoniĝas." + +#: actions/unsubscribe.php:98 +#, fuzzy +msgid "Unsubscribed" +msgstr "Malaboni" + +#: actions/updateprofile.php:64 actions/userauthorization.php:337 +#, fuzzy, php-format +msgid "" +"Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." +msgstr "Aviza permesilo ‘%1$s’ ne konformas al reteja permesilo ‘%2$s’." + +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +msgctxt "TITLE" +msgid "User" +msgstr "Uzanto" + +#: actions/useradminpanel.php:70 +#, fuzzy +msgid "User settings for this StatusNet site." +msgstr "Aspektaj agordoj por ĉi tiu StatusNet-retejo." + +#: actions/useradminpanel.php:149 +msgid "Invalid bio limit. Must be numeric." +msgstr "" + +#: actions/useradminpanel.php:155 +msgid "Invalid welcome text. Max length is 255 characters." +msgstr "" + +#: actions/useradminpanel.php:165 +#, php-format +msgid "Invalid default subscripton: '%1$s' is not user." +msgstr "" + +#. TRANS: Link description in user account settings menu. +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:111 +#: lib/personalgroupnav.php:109 +msgid "Profile" +msgstr "Profilo" + +#: actions/useradminpanel.php:222 +msgid "Bio Limit" +msgstr "" + +#: actions/useradminpanel.php:223 +msgid "Maximum length of a profile bio in characters." +msgstr "" + +#: actions/useradminpanel.php:231 +#, fuzzy +msgid "New users" +msgstr "Inviti novajn uzantojn" + +#: actions/useradminpanel.php:235 +msgid "New user welcome" +msgstr "" + +#: actions/useradminpanel.php:236 +#, fuzzy +msgid "Welcome text for new users (Max 255 chars)." +msgstr "La nomo estas tro longa (maksimume 255 literoj)" + +#: actions/useradminpanel.php:241 +#, fuzzy +msgid "Default subscription" +msgstr "Priskribo" + +#: actions/useradminpanel.php:242 +#, fuzzy +msgid "Automatically subscribe new users to this user." +msgstr "Aŭtomate aboni iun ajn, kiu abonas min (prefereble por ne-homoj)" + +#: actions/useradminpanel.php:251 +#, fuzzy +msgid "Invitations" +msgstr "Invito(j) senditas" + +#: actions/useradminpanel.php:256 +#, fuzzy +msgid "Invitations enabled" +msgstr "Invito(j) senditas" + +#: actions/useradminpanel.php:258 +msgid "Whether to allow users to invite new users." +msgstr "" + +#: actions/userauthorization.php:105 +#, fuzzy +msgid "Authorize subscription" +msgstr "Priskribo" + +#: actions/userauthorization.php:110 +msgid "" +"Please check these details to make sure that you want to subscribe to this " +"user’s notices. If you didn’t just ask to subscribe to someone’s notices, " +"click “Reject”." +msgstr "" + +#: actions/userauthorization.php:196 actions/version.php:167 +msgid "License" +msgstr "Licenco" + +#: actions/userauthorization.php:217 +msgid "Accept" +msgstr "Akcepti" + +#: actions/userauthorization.php:218 lib/subscribeform.php:115 +#: lib/subscribeform.php:139 +#, fuzzy +msgid "Subscribe to this user" +msgstr "Forigi la uzanton" + +#: actions/userauthorization.php:219 +msgid "Reject" +msgstr "Malakcepti" + +#: actions/userauthorization.php:220 +#, fuzzy +msgid "Reject this subscription" +msgstr "Forigi la uzanton" + +#: actions/userauthorization.php:232 +#, fuzzy +msgid "No authorization request!" +msgstr "Neniu ensalutad-ĵetono bezoniĝas." + +#: actions/userauthorization.php:254 +#, fuzzy +msgid "Subscription authorized" +msgstr "Vi ne estas rajtigita." + +#: actions/userauthorization.php:256 +msgid "" +"The subscription has been authorized, but no callback URL was passed. Check " +"with the site’s instructions for details on how to authorize the " +"subscription. Your subscription token is:" +msgstr "" + +#: actions/userauthorization.php:266 +#, fuzzy +msgid "Subscription rejected" +msgstr "Priskribo necesas." + +#: actions/userauthorization.php:268 +msgid "" +"The subscription has been rejected, but no callback URL was passed. Check " +"with the site’s instructions for details on how to fully reject the " +"subscription." +msgstr "" + +#: actions/userauthorization.php:303 +#, php-format +msgid "Listener URI ‘%s’ not found here." +msgstr "" + +#: actions/userauthorization.php:308 +#, php-format +msgid "Listenee URI ‘%s’ is too long." +msgstr "" + +#: actions/userauthorization.php:314 +#, php-format +msgid "Listenee URI ‘%s’ is a local user." +msgstr "" + +#: actions/userauthorization.php:329 +#, php-format +msgid "Profile URL ‘%s’ is for a local user." +msgstr "" + +#: actions/userauthorization.php:345 +#, fuzzy, php-format +msgid "Avatar URL ‘%s’ is not valid." +msgstr "Revokfunkcia URL estas nevalida." + +#: actions/userauthorization.php:350 +#, php-format +msgid "Can’t read avatar URL ‘%s’." +msgstr "" + +#: actions/userauthorization.php:355 +#, php-format +msgid "Wrong image type for avatar URL ‘%s’." +msgstr "" + +#: actions/userdesignsettings.php:76 lib/designsettings.php:65 +#, fuzzy +msgid "Profile design" +msgstr "Vidi profilo-desegnon" + +#: actions/userdesignsettings.php:87 lib/designsettings.php:76 +#, fuzzy +msgid "" +"Customize the way your profile looks with a background image and a colour " +"palette of your choice." +msgstr "Agordi kiel aspektu via grupo, kun elekto de fonbildo kaj koloraro." + +#: actions/userdesignsettings.php:282 +msgid "Enjoy your hotdog!" +msgstr "" + +#. TRANS: Message is used as a page title. %1$s is a nick name, %2$d is a page number. +#: actions/usergroups.php:66 +#, fuzzy, php-format +msgid "%1$s groups, page %2$d" +msgstr "%1$s grupanoj, paĝo %2$d" + +#: actions/usergroups.php:132 +msgid "Search for more groups" +msgstr "" + +#: actions/usergroups.php:159 +#, fuzzy, php-format +msgid "%s is not a member of any group." +msgstr "La uzanto ne estas grupano." + +#: actions/usergroups.php:164 +#, php-format +msgid "Try [searching for groups](%%action.groupsearch%%) and joining them." +msgstr "" + +#. TRANS: Message is used as link description. %1$s is a username, %2$s is a site name. +#. TRANS: Message is used as a subtitle in atom group notice feed. +#. TRANS: %1$s is a group name, %2$s is a site name. +#. TRANS: Message is used as a subtitle in atom user notice feed. +#. TRANS: %1$s is a user name, %2$s is a site name. +#: actions/userrss.php:97 lib/atomgroupnoticefeed.php:70 +#: lib/atomusernoticefeed.php:76 +#, fuzzy, php-format +msgid "Updates from %1$s on %2$s!" +msgstr "Ŝatataj Ĝisdatiĝoj de %1$s ĉe %2$s!" + +#: actions/version.php:75 +#, php-format +msgid "StatusNet %s" +msgstr "" + +#: actions/version.php:155 +#, php-format +msgid "" +"This site is powered by %1$s version %2$s, Copyright 2008-2010 StatusNet, " +"Inc. and contributors." +msgstr "" + +#: actions/version.php:163 +msgid "Contributors" +msgstr "Kontribuantoj" + +#: actions/version.php:170 +msgid "" +"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. " +msgstr "" + +#: actions/version.php:176 +msgid "" +"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. " +msgstr "" + +#: actions/version.php:182 +#, php-format +msgid "" +"You should have received a copy of the GNU Affero General Public License " +"along with this program. If not, see %s." +msgstr "" + +#: actions/version.php:191 +msgid "Plugins" +msgstr "" + +#. TRANS: Secondary navigation menu option leading to version information on the StatusNet site. +#: actions/version.php:198 lib/action.php:789 +msgid "Version" +msgstr "Versio" + +#: actions/version.php:199 +msgid "Author(s)" +msgstr "Aŭtoro(j)" + +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + +#. TRANS: Server exception thrown when... Robin thinks something is impossible! +#: classes/File.php:175 +msgid "Robin thinks something is impossible." +msgstr "" + +#. 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. +#: classes/File.php:190 +#, php-format +msgid "" +"No file may be larger than %1$d bytes and the file you sent was %2$d bytes. " +"Try to upload a smaller version." +msgstr "" + +#. TRANS: Message given if an upload would exceed user quota. +#. TRANS: %d (number) is the user quota in bytes. +#: classes/File.php:202 +#, php-format +msgid "A file this large would exceed your user quota of %d bytes." +msgstr "" + +#. TRANS: Message given id an upload would exceed a user's monthly quota. +#. TRANS: $d (number) is the monthly user quota in bytes. +#: classes/File.php:211 +#, php-format +msgid "A file this large would exceed your monthly quota of %d bytes." +msgstr "" + +#. TRANS: Client exception thrown if a file upload does not have a valid name. +#: classes/File.php:248 classes/File.php:263 +#, fuzzy +msgid "Invalid filename." +msgstr "Grando nevalida." + +#. TRANS: Exception thrown when joining a group fails. +#: classes/Group_member.php:42 +#, fuzzy +msgid "Group join failed." +msgstr "Grupo ne troviĝas." + +#. TRANS: Exception thrown when trying to leave a group the user is not a member of. +#: classes/Group_member.php:55 +#, fuzzy +msgid "Not part of group." +msgstr "Malsukcesis ĝisdatigi grupon." + +#. TRANS: Exception thrown when trying to leave a group fails. +#: classes/Group_member.php:63 +#, fuzzy +msgid "Group leave failed." +msgstr "Malsukcesis alŝuti" + +#. TRANS: Server exception thrown when updating a local group fails. +#: classes/Local_group.php:42 +#, fuzzy +msgid "Could not update local group." +msgstr "Malsukcesis ĝisdatigi grupon." + +#. TRANS: Exception thrown when trying creating a login token failed. +#. TRANS: %s is the user nickname for which token creation failed. +#: classes/Login_token.php:78 +#, fuzzy, php-format +msgid "Could not create login token for %s" +msgstr "Malsukcesis krei alinomon." + +#. TRANS: Exception thrown when database name or Data Source Name could not be found. +#: classes/Memcached_DataObject.php:533 +msgid "No database name or DSN found anywhere." +msgstr "" + +#. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. +#: classes/Message.php:46 +msgid "You are banned from sending direct messages." +msgstr "" + +#. TRANS: Message given when a message could not be stored on the server. +#: classes/Message.php:63 +#, fuzzy +msgid "Could not insert message." +msgstr "Malsukcesis trovi celan uzanton." + +#. TRANS: Message given when a message could not be updated on the server. +#: classes/Message.php:74 +#, fuzzy +msgid "Could not update message with new URI." +msgstr "Malsukcesis ĝisdatigi uzanton" + +#. TRANS: Server exception thrown when a user profile for a notice cannot be found. +#. TRANS: %1$d is a profile ID (number), %2$d is a notice ID (number). +#: classes/Notice.php:98 +#, php-format +msgid "No such profile (%1$d) for notice (%2$d)." +msgstr "" + +#. TRANS: Server exception. %s are the error details. +#: classes/Notice.php:190 +#, fuzzy, php-format +msgid "Database error inserting hashtag: %s" +msgstr "Datumbaza eraro enigi la uzanton de *OAuth-aplikaĵo." + +#. TRANS: Client exception thrown if a notice contains too many characters. +#: classes/Notice.php:260 +msgid "Problem saving notice. Too long." +msgstr "" + +#. TRANS: Client exception thrown when trying to save a notice for an unknown user. +#: classes/Notice.php:265 +msgid "Problem saving notice. Unknown user." +msgstr "" + +#. TRANS: Client exception thrown when a user tries to post too many notices in a given time frame. +#: classes/Notice.php:271 +msgid "" +"Too many notices too fast; take a breather and post again in a few minutes." +msgstr "" + +#. TRANS: Client exception thrown when a user tries to post too many duplicate notices in a given time frame. +#: classes/Notice.php:278 +msgid "" +"Too many duplicate messages too quickly; take a breather and post again in a " +"few minutes." +msgstr "" + +#. TRANS: Client exception thrown when a user tries to post while being banned. +#: classes/Notice.php:286 +#, fuzzy +msgid "You are banned from posting notices on this site." +msgstr "Vi ne rajtas doni al uzanto rolon ĉe ĉi tiu retejo." + +#. TRANS: Server exception thrown when a notice cannot be saved. +#. TRANS: Server exception thrown when a notice cannot be updated. +#: classes/Notice.php:353 classes/Notice.php:380 +msgid "Problem saving notice." +msgstr "" + +#. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). +#: classes/Notice.php:892 +msgid "Bad type provided to saveKnownGroups" +msgstr "" + +#. TRANS: Server exception thrown when an update for a group inbox fails. +#: classes/Notice.php:991 +msgid "Problem saving group inbox." +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. +#: classes/Notice.php:1746 +#, php-format +msgid "RT @%1$s %2$s" +msgstr "RT @%1$s %2$s" + +#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). +#: classes/Profile.php:737 +#, php-format +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." +msgstr "" + +#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). +#: classes/Profile.php:746 +#, php-format +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." +msgstr "" + +#. TRANS: Exception thrown when a right for a non-existing user profile is checked. +#: classes/Remote_profile.php:54 +#, fuzzy +msgid "Missing profile." +msgstr "La uzanto ne havas profilon." + +#. TRANS: Exception thrown when a tag cannot be saved. +#: classes/Status_network.php:346 +#, fuzzy +msgid "Unable to save tag." +msgstr "Malsukcesis konservi vian desegnan agordon" + +#. TRANS: Exception thrown when trying to subscribe while being banned from subscribing. +#: classes/Subscription.php:75 lib/oauthstore.php:465 +#, fuzzy +msgid "You have been banned from subscribing." +msgstr "Tiu uzanto abonblokis vin." + +#. TRANS: Exception thrown when trying to subscribe while already subscribed. +#: classes/Subscription.php:80 +#, fuzzy +msgid "Already subscribed!" +msgstr "Abonita" + +#. TRANS: Exception thrown when trying to subscribe to a user who has blocked the subscribing user. +#: classes/Subscription.php:85 +#, fuzzy +msgid "User has blocked you." +msgstr "La uzanto ne estas blokita de grupo." + +#. TRANS: Exception thrown when trying to unsibscribe without a subscription. +#: classes/Subscription.php:171 +#, fuzzy +msgid "Not subscribed!" +msgstr "Abonita" + +#. TRANS: Exception thrown when trying to unsubscribe a user from themselves. +#: classes/Subscription.php:178 +#, fuzzy +msgid "Could not delete self-subscription." +msgstr "Malsukcesis forigi ŝataton." + +#. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server. +#: classes/Subscription.php:206 +#, fuzzy +msgid "Could not delete subscription OMB token." +msgstr "Malsukcesis forigi ŝataton." + +#. TRANS: Exception thrown when a subscription could not be deleted on the server. +#: classes/Subscription.php:218 +#, fuzzy +msgid "Could not delete subscription." +msgstr "Malsukcesis forigi ŝataton." + +#. TRANS: Notice given on user registration. +#. TRANS: %1$s is the sitename, $2$s is the registering user's nickname. +#: classes/User.php:365 +#, php-format +msgid "Welcome to %1$s, @%2$s!" +msgstr "Bonvenon al %1$s, @%2$s!" + +#. TRANS: Server exception thrown when creating a group failed. +#: classes/User_group.php:496 +#, fuzzy +msgid "Could not create group." +msgstr "Malsukcesis ĝisdatigi grupon." + +#. TRANS: Server exception thrown when updating a group URI failed. +#: classes/User_group.php:506 +#, fuzzy +msgid "Could not set group URI." +msgstr "Malsukcesis ĝisdatigi grupon." + +#. TRANS: Server exception thrown when setting group membership failed. +#: classes/User_group.php:529 +#, fuzzy +msgid "Could not set group membership." +msgstr "Malsukcesis ĝisdatigi grupon." + +#. TRANS: Server exception thrown when saving local group information failed. +#: classes/User_group.php:544 +#, fuzzy +msgid "Could not save local group info." +msgstr "Malsukcesis konservi la profilon." + +#. TRANS: Link title attribute in user account settings menu. +#: lib/accountsettingsaction.php:109 +#, fuzzy +msgid "Change your profile settings" +msgstr "Profila agordo" + +#. TRANS: Link title attribute in user account settings menu. +#: lib/accountsettingsaction.php:116 +#, fuzzy +msgid "Upload an avatar" +msgstr "Eraris ĝisdatigi vizaĝbildon." + +#. TRANS: Link title attribute in user account settings menu. +#: lib/accountsettingsaction.php:123 +#, fuzzy +msgid "Change your password" +msgstr "Ŝanĝi vian pasvorton." + +#. TRANS: Link title attribute in user account settings menu. +#: lib/accountsettingsaction.php:130 +msgid "Change email handling" +msgstr "" + +#. TRANS: Link title attribute in user account settings menu. +#: lib/accountsettingsaction.php:137 +#, fuzzy +msgid "Design your profile" +msgstr "La uzanto ne havas profilon." + +#. TRANS: Link title attribute in user account settings menu. +#: lib/accountsettingsaction.php:144 +#, fuzzy +msgid "Other options" +msgstr "Aliaj agordoj" + +#. TRANS: Link description in user account settings menu. +#: lib/accountsettingsaction.php:146 +msgid "Other" +msgstr "Alia" + +#. TRANS: Page title. %1$s is the title, %2$s is the site name. +#: lib/action.php:145 +#, php-format +msgid "%1$s - %2$s" +msgstr "%1$s - %2$s" + +#. TRANS: Page title for a page without a title set. +#: lib/action.php:161 +msgid "Untitled page" +msgstr "" + +#. TRANS: DT element for primary navigation menu. String is hidden in default CSS. +#: lib/action.php:436 +#, fuzzy +msgid "Primary site navigation" +msgstr "Ŝanĝi agordojn de la retejo" + +#. TRANS: Tooltip for main menu option "Personal" +#: lib/action.php:442 +msgctxt "TOOLTIP" +msgid "Personal profile and friends timeline" +msgstr "" + +#. TRANS: Main menu option when logged in for access to personal profile and friends timeline +#: lib/action.php:445 +msgctxt "MENU" +msgid "Personal" +msgstr "Persona" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:447 +#, fuzzy +msgctxt "TOOLTIP" +msgid "Change your email, avatar, password, profile" +msgstr "Ŝanĝi vian pasvorton." + +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:452 +msgctxt "TOOLTIP" +msgid "Connect to services" +msgstr "Konekti al servoj" + +#. TRANS: Main menu option when logged in and connection are possible for access to options to connect to other services +#: lib/action.php:455 +msgid "Connect" +msgstr "Konekti" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:458 +msgctxt "TOOLTIP" +msgid "Change site configuration" +msgstr "Ŝanĝi agordojn de la retejo" + +#. TRANS: Main menu option when logged in and site admin for access to site configuration +#: lib/action.php:461 +msgctxt "MENU" +msgid "Admin" +msgstr "Administranto" + +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:465 +#, php-format +msgctxt "TOOLTIP" +msgid "Invite friends and colleagues to join you on %s" +msgstr "Inviti amikojn kaj kolegojn aliĝi vin sur %s" + +#. TRANS: Main menu option when logged in and invitations are allowed for inviting new users +#: lib/action.php:468 +msgctxt "MENU" +msgid "Invite" +msgstr "Inviti" + +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:474 +#, fuzzy +msgctxt "TOOLTIP" +msgid "Logout from the site" +msgstr "Desegno por la retejo" + +#. TRANS: Main menu option when logged in to log out the current user +#: lib/action.php:477 +msgctxt "MENU" +msgid "Logout" +msgstr " Elsaluti" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:482 +msgctxt "TOOLTIP" +msgid "Create an account" +msgstr "Krei konton" + +#. TRANS: Main menu option when not logged in to register a new account +#: lib/action.php:485 +msgctxt "MENU" +msgid "Register" +msgstr "Registriĝi" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:488 +#, fuzzy +msgctxt "TOOLTIP" +msgid "Login to the site" +msgstr "Ensaluti al la retejo" + +#: lib/action.php:491 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "Ensaluti" + +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:494 +msgctxt "TOOLTIP" +msgid "Help me!" +msgstr "Helpu min!" + +#: lib/action.php:497 +msgctxt "MENU" +msgid "Help" +msgstr "Helpo" + +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:500 +msgctxt "TOOLTIP" +msgid "Search for people or text" +msgstr "" + +#: lib/action.php:503 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "Homserĉo" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#. TRANS: Menu item for site administration +#: lib/action.php:525 lib/adminpanelaction.php:400 +#, fuzzy +msgid "Site notice" +msgstr "Nova avizo" + +#. TRANS: DT element for local views block. String is hidden in default CSS. +#: lib/action.php:592 +msgid "Local views" +msgstr "" + +#. TRANS: DT element for page notice. String is hidden in default CSS. +#: lib/action.php:659 +#, fuzzy +msgid "Page notice" +msgstr "Nova avizo" + +#. TRANS: DT element for secondary navigation menu. String is hidden in default CSS. +#: lib/action.php:762 +msgid "Secondary site navigation" +msgstr "" + +#. TRANS: Secondary navigation menu option leading to help on StatusNet. +#: lib/action.php:768 +msgid "Help" +msgstr "Helpo" + +#. TRANS: Secondary navigation menu option leading to text about StatusNet site. +#: lib/action.php:771 +msgid "About" +msgstr "Enkonduko" + +#. TRANS: Secondary navigation menu option leading to Frequently Asked Questions. +#: lib/action.php:774 +msgid "FAQ" +msgstr "Oftaj demandoj" + +#. TRANS: Secondary navigation menu option leading to Terms of Service. +#: lib/action.php:779 +msgid "TOS" +msgstr "" + +#. TRANS: Secondary navigation menu option leading to privacy policy. +#: lib/action.php:783 +msgid "Privacy" +msgstr "Privateco" + +#. TRANS: Secondary navigation menu option. +#: lib/action.php:786 +msgid "Source" +msgstr "Fontkodo" + +#. TRANS: Secondary navigation menu option leading to contact information on the StatusNet site. +#: lib/action.php:792 +msgid "Contact" +msgstr "Kontakto" + +#: lib/action.php:794 +msgid "Badge" +msgstr "Insigno" + +#. TRANS: DT element for StatusNet software license. +#: lib/action.php:823 +msgid "StatusNet software license" +msgstr "Licenco de la programaro StatusNet" + +#. TRANS: First sentence of the StatusNet site license. Used if 'broughtby' is set. +#: lib/action.php:827 +#, php-format +msgid "" +"**%%site.name%%** is a microblogging service brought to you by [%%site." +"broughtby%%](%%site.broughtbyurl%%)." +msgstr "" + +#. TRANS: First sentence of the StatusNet site license. Used if 'broughtby' is not set. +#: lib/action.php:830 +#, php-format +msgid "**%%site.name%%** is a microblogging service." +msgstr "" + +#. TRANS: Second sentence of the StatusNet site license. Mentions the StatusNet source code license. +#: lib/action.php:834 +#, php-format +msgid "" +"It runs the [StatusNet](http://status.net/) microblogging software, version %" +"s, available under the [GNU Affero General Public License](http://www.fsf." +"org/licensing/licenses/agpl-3.0.html)." +msgstr "" + +#. TRANS: DT element for StatusNet site content license. +#: lib/action.php:850 +#, fuzzy +msgid "Site content license" +msgstr "Licenco de la programaro StatusNet" + +#. TRANS: Content license displayed when license is set to 'private'. +#. TRANS: %1$s is the site name. +#: lib/action.php:857 +#, php-format +msgid "Content and data of %1$s are private and confidential." +msgstr "" + +#. TRANS: Content license displayed when license is set to 'allrightsreserved'. +#. TRANS: %1$s is the copyright owner. +#: lib/action.php:864 +#, php-format +msgid "Content and data copyright by %1$s. All rights reserved." +msgstr "" + +#. TRANS: Content license displayed when license is set to 'allrightsreserved' and no owner is set. +#: lib/action.php:868 +msgid "Content and data copyright by contributors. All rights reserved." +msgstr "" + +#. TRANS: license message in footer. %1$s is the site name, %2$s is a link to the license URL, with a licence name set in configuration. +#: lib/action.php:881 +#, php-format +msgid "All %1$s content and data are available under the %2$s license." +msgstr "" + +#. TRANS: DT element for pagination (previous/next, etc.). +#: lib/action.php:1192 +#, fuzzy +msgid "Pagination" +msgstr "Registrado" + +#. TRANS: Pagination message to go to a page displaying information more in the +#. TRANS: present than the currently displayed information. +#: lib/action.php:1203 +msgid "After" +msgstr "Poste" + +#. TRANS: Pagination message to go to a page displaying information more in the +#. TRANS: past than the currently displayed information. +#: lib/action.php:1213 +msgid "Before" +msgstr "Antaŭe" + +#. TRANS: Client exception thrown when a feed instance is a DOMDocument. +#: lib/activity.php:122 +msgid "Expecting a root feed element but got a whole XML document." +msgstr "" + +#: lib/activityutils.php:208 +msgid "Can't handle remote content yet." +msgstr "" + +#: lib/activityutils.php:244 +msgid "Can't handle embedded XML content yet." +msgstr "" + +#: lib/activityutils.php:248 +msgid "Can't handle embedded Base64 content yet." +msgstr "" + +#. TRANS: Client error message thrown when a user tries to change admin settings but has no access rights. +#: lib/adminpanelaction.php:98 +#, fuzzy +msgid "You cannot make changes to this site." +msgstr "Vi ne rajtas doni al uzanto rolon ĉe ĉi tiu retejo." + +#. TRANS: Client error message throw when a certain panel's settings cannot be changed. +#: lib/adminpanelaction.php:110 +#, fuzzy +msgid "Changes to that panel are not allowed." +msgstr "Registriĝo ne permesita." + +#. TRANS: Client error message. +#: lib/adminpanelaction.php:229 +msgid "showForm() not implemented." +msgstr "" + +#. TRANS: Client error message +#: lib/adminpanelaction.php:259 +msgid "saveSettings() not implemented." +msgstr "" + +#. TRANS: Client error message thrown if design settings could not be deleted in +#. TRANS: the admin panel Design. +#: lib/adminpanelaction.php:284 +#, fuzzy +msgid "Unable to delete design setting." +msgstr "Malsukcesis konservi vian desegnan agordon" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:350 +#, fuzzy +msgid "Basic site configuration" +msgstr "Ŝanĝi agordojn de la retejo" + +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:352 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "Retejo" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:358 +#, fuzzy +msgid "Design configuration" +msgstr "Ŝanĝi agordojn de la retejo" + +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:360 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "Aspekto" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:366 +#, fuzzy +msgid "User configuration" +msgstr "Ŝanĝi agordojn de la retejo" + +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:368 lib/personalgroupnav.php:115 +msgid "User" +msgstr "Uzanto" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:374 +#, fuzzy +msgid "Access configuration" +msgstr "Ŝanĝi agordojn de la retejo" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:382 +#, fuzzy +msgid "Paths configuration" +msgstr "Ŝanĝi agordojn de la retejo" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:390 +#, fuzzy +msgid "Sessions configuration" +msgstr "Ŝanĝi agordojn de la retejo" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:398 +#, fuzzy +msgid "Edit site notice" +msgstr "Forigi avizon" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:406 +#, fuzzy +msgid "Snapshots configuration" +msgstr "Ŝanĝi agordojn de la retejo" + +#. TRANS: Client error 401. +#: lib/apiauth.php:113 +msgid "API resource requires read-write access, but you only have read access." +msgstr "" + +#. TRANS: Form legend. +#: lib/applicationeditform.php:137 +#, fuzzy +msgid "Edit application" +msgstr "Redakti Aplikon" + +#. TRANS: Form guide. +#: lib/applicationeditform.php:187 +#, fuzzy +msgid "Icon for this application" +msgstr "Ne forigu ĉi tiun aplikaĵon." + +#. TRANS: Form input field instructions. +#: lib/applicationeditform.php:209 +#, fuzzy, php-format +msgid "Describe your application in %d characters" +msgstr "Priskribu vin mem kaj viajn ŝatokupojn per ne pli ol %d signoj" + +#. TRANS: Form input field instructions. +#: lib/applicationeditform.php:213 +#, fuzzy +msgid "Describe your application" +msgstr "Forigi aplikaĵon" + +#. TRANS: Form input field instructions. +#: lib/applicationeditform.php:224 +#, fuzzy +msgid "URL of the homepage of this application" +msgstr "Vi ne estas la posedanto de ĉi tiu aplikaĵo." + +#. TRANS: Form input field label. +#: lib/applicationeditform.php:226 +#, fuzzy +msgid "Source URL" +msgstr "Fontkodo" + +#. TRANS: Form input field instructions. +#: lib/applicationeditform.php:233 +#, fuzzy +msgid "Organization responsible for this application" +msgstr "Vi ne estas la posedanto de ĉi tiu aplikaĵo." + +#. TRANS: Form input field instructions. +#: lib/applicationeditform.php:242 +msgid "URL for the homepage of the organization" +msgstr "" + +#. TRANS: Form input field instructions. +#: lib/applicationeditform.php:251 +msgid "URL to redirect to after authentication" +msgstr "" + +#. TRANS: Radio button label for application type +#: lib/applicationeditform.php:278 +msgid "Browser" +msgstr "" + +#. TRANS: Radio button label for application type +#: lib/applicationeditform.php:295 +msgid "Desktop" +msgstr "" + +#. TRANS: Form guide. +#: lib/applicationeditform.php:297 +msgid "Type of application, browser or desktop" +msgstr "" + +#. TRANS: Radio button label for access type. +#: lib/applicationeditform.php:320 +msgid "Read-only" +msgstr "" + +#. TRANS: Radio button label for access type. +#: lib/applicationeditform.php:339 +msgid "Read-write" +msgstr "" + +#. TRANS: Form guide. +#: lib/applicationeditform.php:341 +msgid "Default access for this application: read-only, or read-write" +msgstr "" + +#. TRANS: Submit button title +#: lib/applicationeditform.php:359 +#, fuzzy +msgid "Cancel" +msgstr "Nuligi" + +#. TRANS: Application access type +#: lib/applicationlist.php:136 +msgid "read-write" +msgstr "" + +#. TRANS: Application access type +#: lib/applicationlist.php:138 +msgid "read-only" +msgstr "" + +#. TRANS: Used in application list. %1$s is a modified date, %2$s is access type (read-write or read-only) +#: lib/applicationlist.php:144 +#, php-format +msgid "Approved %1$s - \"%2$s\" access." +msgstr "" + +#. TRANS: Button label +#: lib/applicationlist.php:159 +#, fuzzy +msgctxt "BUTTON" +msgid "Revoke" +msgstr "Forigi" + +#. TRANS: DT element label in attachment list. +#: lib/attachmentlist.php:88 +#, fuzzy +msgid "Attachments" +msgstr "Ne estas aldonaĵo." + +#. TRANS: DT element label in attachment list item. +#: lib/attachmentlist.php:265 +#, fuzzy +msgid "Author" +msgstr "Aŭtoro(j)" + +#. TRANS: DT element label in attachment list item. +#: lib/attachmentlist.php:279 +#, fuzzy +msgid "Provider" +msgstr "Antaŭrigardo" + +#: lib/attachmentnoticesection.php:67 +msgid "Notices where this attachment appears" +msgstr "" + +#: lib/attachmenttagcloudsection.php:48 +#, fuzzy +msgid "Tags for this attachment" +msgstr "Ne estas tiu aldonaĵo." + +#: lib/authenticationplugin.php:221 lib/authenticationplugin.php:226 +#, fuzzy +msgid "Password changing failed" +msgstr "Pasvorta ŝanĝo" + +#: lib/authenticationplugin.php:236 +#, fuzzy +msgid "Password changing is not allowed" +msgstr "Pasvorta ŝanĝo" + +#: lib/channel.php:157 lib/channel.php:177 +#, fuzzy +msgid "Command results" +msgstr "Neniu rezulto." + +#: lib/channel.php:229 lib/mailhandler.php:142 +msgid "Command complete" +msgstr "" + +#: lib/channel.php:240 +#, fuzzy +msgid "Command failed" +msgstr "Malsukcesis alŝuti" + +#: lib/command.php:83 lib/command.php:105 +msgid "Notice with that id does not exist" +msgstr "" + +#: lib/command.php:99 lib/command.php:596 +#, fuzzy +msgid "User has no last notice" +msgstr "La uzanto ne havas profilon." + +#. TRANS: Message given requesting a profile for a non-existing user. +#. TRANS: %s is the nickname of the user for which the profile could not be found. +#: lib/command.php:127 +#, fuzzy, php-format +msgid "Could not find a user with nickname %s" +msgstr "Malsukcesis trovi celan uzanton." + +#. TRANS: Message given getting a non-existing user. +#. TRANS: %s is the nickname of the user that could not be found. +#: lib/command.php:147 +#, php-format +msgid "Could not find a local user with nickname %s" +msgstr "" + +#: lib/command.php:180 +msgid "Sorry, this command is not yet implemented." +msgstr "" + +#: lib/command.php:225 +msgid "It does not make a lot of sense to nudge yourself!" +msgstr "" + +#. TRANS: Message given having nudged another user. +#. TRANS: %s is the nickname of the user that was nudged. +#: lib/command.php:234 +#, fuzzy, php-format +msgid "Nudge sent to %s" +msgstr "Puŝeto sendiĝis" + +#: lib/command.php:260 +#, php-format +msgid "" +"Subscriptions: %1$s\n" +"Subscribers: %2$s\n" +"Notices: %3$s" +msgstr "" + +#: lib/command.php:302 +#, fuzzy +msgid "Notice marked as fave." +msgstr "Ĉi tiu avizo jam estas ŝatata." + +#: lib/command.php:323 +#, fuzzy +msgid "You are already a member of that group" +msgstr "Vi estas jam grupano." + +#. TRANS: Message given having failed to add a user to a group. +#. TRANS: %1$s is the nickname of the user, %2$s is the nickname of the group. +#: lib/command.php:339 +#, fuzzy, php-format +msgid "Could not join user %1$s to group %2$s" +msgstr "La uzanto %1$*s ne povas aliĝi al la grupo %2$*s." + +#. TRANS: Message given having failed to remove a user from a group. +#. TRANS: %1$s is the nickname of the user, %2$s is the nickname of the group. +#: lib/command.php:385 +#, fuzzy, php-format +msgid "Could not remove user %1$s from group %2$s" +msgstr "Malsukcesis forigi uzanton %1$s de grupo %2$s." + +#. TRANS: Whois output. %s is the full name of the queried user. +#: lib/command.php:418 +#, fuzzy, php-format +msgid "Fullname: %s" +msgstr "Plena nomo" + +#. TRANS: Whois output. %s is the location of the queried user. +#. TRANS: Profile info line in new-subscriber notification e-mail +#: lib/command.php:422 lib/mail.php:268 +#, fuzzy, php-format +msgid "Location: %s" +msgstr "Loko" + +#. TRANS: Whois output. %s is the homepage of the queried user. +#. TRANS: Profile info line in new-subscriber notification e-mail +#: lib/command.php:426 lib/mail.php:271 +#, fuzzy, php-format +msgid "Homepage: %s" +msgstr "Hejmpaĝo" + +#. TRANS: Whois output. %s is the bio information of the queried user. +#: lib/command.php:430 +#, fuzzy, php-format +msgid "About: %s" +msgstr "Enkonduko" + +#: lib/command.php:457 +#, php-format +msgid "" +"%s is a remote profile; you can only send direct messages to users on the " +"same server." +msgstr "" + +#. TRANS: Message given if content is too long. +#. TRANS: %1$d is the maximum number of characters, %2$d is the number of submitted characters. +#: lib/command.php:472 +#, php-format +msgid "Message too long - maximum is %1$d characters, you sent %2$d" +msgstr "" + +#. TRANS: Message given have sent a direct message to another user. +#. TRANS: %s is the name of the other user. +#: lib/command.php:492 +#, fuzzy, php-format +msgid "Direct message to %s sent" +msgstr "Rekta mesaĝo al %s sendiĝis." + +#: lib/command.php:494 +msgid "Error sending direct message." +msgstr "" + +#: lib/command.php:514 +#, fuzzy +msgid "Cannot repeat your own notice" +msgstr "Vi ne povas ripeti vian propran avizon." + +#: lib/command.php:519 +#, fuzzy +msgid "Already repeated that notice" +msgstr "La avizo jam ripetiĝis." + +#. TRANS: Message given having repeated a notice from another user. +#. TRANS: %s is the name of the user for which the notice was repeated. +#: lib/command.php:529 +#, fuzzy, php-format +msgid "Notice from %s repeated" +msgstr "Avizo afiŝiĝas" + +#: lib/command.php:531 +#, fuzzy +msgid "Error repeating notice." +msgstr "Eraro je ĝisdatigo de fora profilo." + +#: lib/command.php:562 +#, php-format +msgid "Notice too long - maximum is %d characters, you sent %d" +msgstr "" + +#: lib/command.php:571 +#, fuzzy, php-format +msgid "Reply to %s sent" +msgstr "Ripetita al %s" + +#: lib/command.php:573 +#, fuzzy +msgid "Error saving notice." +msgstr "Eraris konservi uzanton: nevalida." + +#: lib/command.php:620 +msgid "Specify the name of the user to subscribe to" +msgstr "" + +#: lib/command.php:628 +msgid "Can't subscribe to OMB profiles by command." +msgstr "" + +#: lib/command.php:634 +#, fuzzy, php-format +msgid "Subscribed to %s" +msgstr "Abonita" + +#: lib/command.php:655 lib/command.php:754 +msgid "Specify the name of the user to unsubscribe from" +msgstr "" + +#: lib/command.php:664 +#, fuzzy, php-format +msgid "Unsubscribed from %s" +msgstr "Malaboni" + +#: lib/command.php:682 lib/command.php:705 +msgid "Command not yet implemented." +msgstr "" + +#: lib/command.php:685 +#, fuzzy +msgid "Notification off." +msgstr "Neniu konfirma kodo." + +#: lib/command.php:687 +msgid "Can't turn off notification." +msgstr "" + +#: lib/command.php:708 +#, fuzzy +msgid "Notification on." +msgstr "Neniu konfirma kodo." + +#: lib/command.php:710 +#, fuzzy +msgid "Can't turn on notification." +msgstr "Vi ne povas ripeti vian propran avizon." + +#: lib/command.php:723 +msgid "Login command is disabled" +msgstr "" + +#: lib/command.php:734 +#, php-format +msgid "This link is useable only once, and is good for only 2 minutes: %s" +msgstr "" + +#: lib/command.php:761 +#, fuzzy, php-format +msgid "Unsubscribed %s" +msgstr "Malaboni" + +#: lib/command.php:778 +#, fuzzy +msgid "You are not subscribed to anyone." +msgstr "Vi ne estas rajtigita." + +#: lib/command.php:780 +#, fuzzy +msgid "You are subscribed to this person:" +msgid_plural "You are subscribed to these people:" +msgstr[0] "Vi jam abonas jenajn uzantojn:" +msgstr[1] "Vi jam abonas jenajn uzantojn:" + +#: lib/command.php:800 +msgid "No one is subscribed to you." +msgstr "" + +#: lib/command.php:802 +msgid "This person is subscribed to you:" +msgid_plural "These people are subscribed to you:" +msgstr[0] "" +msgstr[1] "" + +#: lib/command.php:822 +#, fuzzy +msgid "You are not a member of any groups." +msgstr "Vi ne estas grupano." + +#: lib/command.php:824 +#, fuzzy +msgid "You are a member of this group:" +msgid_plural "You are a member of these groups:" +msgstr[0] "Vi ne estas grupano." +msgstr[1] "Vi ne estas grupano." + +#: lib/command.php:838 +msgid "" +"Commands:\n" +"on - turn on notifications\n" +"off - turn off notifications\n" +"help - show this help\n" +"follow - subscribe to user\n" +"groups - lists the groups you have joined\n" +"subscriptions - list the people you follow\n" +"subscribers - list the people that follow you\n" +"leave - unsubscribe from user\n" +"d - direct message to user\n" +"get - get last notice from user\n" +"whois - get profile info on user\n" +"lose - force user to stop following you\n" +"fav - add user's last notice as a 'fave'\n" +"fav # - add notice with the given id as a 'fave'\n" +"repeat # - repeat a notice with a given id\n" +"repeat - repeat the last notice from user\n" +"reply # - reply to notice with a given id\n" +"reply - reply to the last notice from user\n" +"join - join group\n" +"login - Get a link to login to the web interface\n" +"drop - leave group\n" +"stats - get your stats\n" +"stop - same as 'off'\n" +"quit - same as 'off'\n" +"sub - same as 'follow'\n" +"unsub - same as 'leave'\n" +"last - same as 'get'\n" +"on - not yet implemented.\n" +"off - not yet implemented.\n" +"nudge - remind a user to update.\n" +"invite - not yet implemented.\n" +"track - not yet implemented.\n" +"untrack - not yet implemented.\n" +"track off - not yet implemented.\n" +"untrack all - not yet implemented.\n" +"tracks - not yet implemented.\n" +"tracking - not yet implemented.\n" +msgstr "" + +#: lib/common.php:135 +#, fuzzy +msgid "No configuration file found. " +msgstr "Neniu konfirma kodo." + +#: lib/common.php:136 +msgid "I looked for configuration files in the following places: " +msgstr "" + +#: lib/common.php:138 +msgid "You may wish to run the installer to fix this." +msgstr "" + +#: lib/common.php:139 +msgid "Go to the installer." +msgstr "" + +#: lib/connectsettingsaction.php:110 +msgid "IM" +msgstr "" + +#: lib/connectsettingsaction.php:111 +msgid "Updates by instant messenger (IM)" +msgstr "" + +#: lib/connectsettingsaction.php:116 +msgid "Updates by SMS" +msgstr "" + +#: lib/connectsettingsaction.php:120 +#, fuzzy +msgid "Connections" +msgstr "Konekti" + +#: lib/connectsettingsaction.php:121 +#, fuzzy +msgid "Authorized connected applications" +msgstr "Konektita aplikaĵo" + +#: lib/dberroraction.php:60 +msgid "Database error" +msgstr "" + +#: lib/designsettings.php:105 +#, fuzzy +msgid "Upload file" +msgstr "Malsukcesis alŝuti" + +#: lib/designsettings.php:109 +#, fuzzy +msgid "" +"You can upload your personal background image. The maximum file size is 2MB." +msgstr "Vi povas alŝuti vian personan vizaĝbildon. Dosiero-grandlimo estas %s." + +#: lib/designsettings.php:418 +#, fuzzy +msgid "Design defaults restored." +msgstr "Desegna agordo konservita." + +#: lib/disfavorform.php:114 lib/disfavorform.php:140 +#, fuzzy +msgid "Disfavor this notice" +msgstr "Forigi la avizon" + +#: lib/favorform.php:114 lib/favorform.php:140 +#, fuzzy +msgid "Favor this notice" +msgstr "Forigi la avizon" + +#: lib/favorform.php:140 +msgid "Favor" +msgstr "" + +#: lib/feed.php:85 +msgid "RSS 1.0" +msgstr "" + +#: lib/feed.php:87 +msgid "RSS 2.0" +msgstr "" + +#: lib/feed.php:89 +msgid "Atom" +msgstr "" + +#: lib/feed.php:91 +msgid "FOAF" +msgstr "" + +#: lib/feedlist.php:64 +msgid "Export data" +msgstr "" + +#: lib/galleryaction.php:121 +msgid "Filter tags" +msgstr "" + +#: lib/galleryaction.php:131 +#, fuzzy +msgid "All" +msgstr "Permesi" + +#: lib/galleryaction.php:139 +msgid "Select tag to filter" +msgstr "" + +#: lib/galleryaction.php:140 +#, fuzzy +msgid "Tag" +msgstr "Markiloj" + +#: lib/galleryaction.php:141 +msgid "Choose a tag to narrow list" +msgstr "" + +#: lib/galleryaction.php:143 +msgid "Go" +msgstr "Iri" + +#: lib/grantroleform.php:91 +#, php-format +msgid "Grant this user the \"%s\" role" +msgstr "" + +#: lib/groupeditform.php:163 +#, fuzzy +msgid "URL of the homepage or blog of the group or topic" +msgstr "URL de via hejmpaĝo, blogo aŭ profilo ĉe alia retejo" + +#: lib/groupeditform.php:168 +msgid "Describe the group or topic" +msgstr "" + +#: lib/groupeditform.php:170 +#, fuzzy, php-format +msgid "Describe the group or topic in %d characters" +msgstr "Priskribu vin mem kaj viajn ŝatokupojn per ne pli ol %d signoj" + +#: lib/groupeditform.php:179 +#, fuzzy +msgid "" +"Location for the group, if any, like \"City, State (or Region), Country\"" +msgstr "Kie vi estas, ekzemple \"Urbo, Ŝtato (aŭ Regiono), Lando\"" + +#: lib/groupeditform.php:187 +#, php-format +msgid "Extra nicknames for the group, comma- or space- separated, max %d" +msgstr "" + +#: lib/groupnav.php:85 +#, fuzzy +msgid "Group" +msgstr "Grupoj" + +#: lib/groupnav.php:101 +#, fuzzy +msgid "Blocked" +msgstr "Bloki" + +#: lib/groupnav.php:102 +#, fuzzy, php-format +msgid "%s blocked users" +msgstr "%s profiloj blokitaj" + +#: lib/groupnav.php:108 +#, fuzzy, php-format +msgid "Edit %s group properties" +msgstr "Redakti %s grupon" + +#: lib/groupnav.php:113 +#, fuzzy +msgid "Logo" +msgstr " Elsaluti" + +#: lib/groupnav.php:114 +#, php-format +msgid "Add or edit %s logo" +msgstr "" + +#: lib/groupnav.php:120 +#, php-format +msgid "Add or edit %s design" +msgstr "" + +#: lib/groupsbymemberssection.php:71 +#, fuzzy +msgid "Groups with most members" +msgstr "%s grupanoj" + +#: lib/groupsbypostssection.php:71 +msgid "Groups with most posts" +msgstr "" + +#: lib/grouptagcloudsection.php:56 +#, php-format +msgid "Tags in %s group's notices" +msgstr "" + +#. TRANS: Client exception 406 +#: lib/htmloutputter.php:104 +msgid "This page is not available in a media type you accept" +msgstr "" + +#: lib/imagefile.php:72 +#, fuzzy +msgid "Unsupported image file format." +msgstr "Formato ne subtenata." + +#: lib/imagefile.php:88 +#, fuzzy, php-format +msgid "That file is too big. The maximum file size is %s." +msgstr "" +"Vi povas alŝuti emblemo-bildon por via grupo. Dosiero-grandlimo estas $s." + +#: lib/imagefile.php:93 +#, fuzzy +msgid "Partial upload." +msgstr "Neniu dosiero alŝutiĝas." + +#: lib/imagefile.php:101 lib/mediafile.php:170 +msgid "System error uploading file." +msgstr "" + +#: lib/imagefile.php:109 +msgid "Not an image or corrupt file." +msgstr "" + +#: lib/imagefile.php:122 +#, fuzzy +msgid "Lost our file." +msgstr "Perdiĝis nia dosiera datumo." + +#: lib/imagefile.php:163 lib/imagefile.php:224 +msgid "Unknown file type" +msgstr "" + +#: lib/imagefile.php:244 +msgid "MB" +msgstr "" + +#: lib/imagefile.php:246 +msgid "kB" +msgstr "" + +#: lib/jabber.php:387 +#, php-format +msgid "[%s]" +msgstr "" + +#: lib/jabber.php:567 +#, php-format +msgid "Unknown inbox source %d." +msgstr "" + +#: lib/joinform.php:114 +#, fuzzy +msgid "Join" +msgstr "Ensaluti" + +#: lib/leaveform.php:114 +msgid "Leave" +msgstr "Forlasi" + +#: lib/logingroupnav.php:80 +#, fuzzy +msgid "Login with a username and password" +msgstr "Ensaluti per via uzantnomo kaj pasvorto." + +#: lib/logingroupnav.php:86 +msgid "Sign up for a new account" +msgstr "" + +#. TRANS: Subject for address confirmation email +#: lib/mail.php:174 +#, fuzzy +msgid "Email address confirmation" +msgstr "Retpoŝtadreso" + +#. TRANS: Body for address confirmation email. +#: lib/mail.php:177 +#, php-format +msgid "" +"Hey, %s.\n" +"\n" +"Someone just entered this email address on %s.\n" +"\n" +"If it was you, and you want to confirm your entry, use the URL below:\n" +"\n" +"\t%s\n" +"\n" +"If not, just ignore this message.\n" +"\n" +"Thanks for your time, \n" +"%s\n" +msgstr "" + +#. TRANS: Subject of new-subscriber notification e-mail +#: lib/mail.php:243 +#, fuzzy, php-format +msgid "%1$s is now listening to your notices on %2$s." +msgstr "%1$s invitis vin kunaliĝi ĉe %2$s" + +#: lib/mail.php:248 +#, php-format +msgid "" +"If you believe this account is being used abusively, you can block them from " +"your subscribers list and report as spam to site administrators at %s" +msgstr "" + +#. TRANS: Main body of new-subscriber notification e-mail +#: lib/mail.php:254 +#, php-format +msgid "" +"%1$s is now listening to your notices on %2$s.\n" +"\n" +"\t%3$s\n" +"\n" +"%4$s%5$s%6$s\n" +"Faithfully yours,\n" +"%7$s.\n" +"\n" +"----\n" +"Change your email address or notification options at %8$s\n" +msgstr "" + +#. TRANS: Profile info line in new-subscriber notification e-mail +#: lib/mail.php:274 +#, fuzzy, php-format +msgid "Bio: %s" +msgstr "Biografio" + +#. TRANS: Subject of notification mail for new posting email address +#: lib/mail.php:304 +#, fuzzy, php-format +msgid "New email address for posting to %s" +msgstr "Krei novan retpoŝtadreson por afiŝado kaj nuligi la antaŭan." + +#. TRANS: Body of notification mail for new posting email address +#: lib/mail.php:308 +#, php-format +msgid "" +"You have a new posting address on %1$s.\n" +"\n" +"Send email to %2$s to post new messages.\n" +"\n" +"More email instructions at %3$s.\n" +"\n" +"Faithfully yours,\n" +"%4$s" +msgstr "" + +#. TRANS: Subject line for SMS-by-email notification messages +#: lib/mail.php:433 +#, fuzzy, php-format +msgid "%s status" +msgstr "Stato de %1$s ĉe %2$s" + +#. TRANS: Subject line for SMS-by-email address confirmation message +#: lib/mail.php:460 +#, fuzzy +msgid "SMS confirmation" +msgstr "Neniu konfirma kodo." + +#. TRANS: Main body heading for SMS-by-email address confirmation message +#: lib/mail.php:463 +#, php-format +msgid "%s: confirm you own this phone number with this code:" +msgstr "" + +#. TRANS: Subject for 'nudge' notification email +#: lib/mail.php:484 +#, php-format +msgid "You've been nudged by %s" +msgstr "" + +#. TRANS: Body for 'nudge' notification email +#: lib/mail.php:489 +#, php-format +msgid "" +"%1$s (%2$s) is wondering what you are up to these days and is inviting you " +"to post some news.\n" +"\n" +"So let's hear from you :)\n" +"\n" +"%3$s\n" +"\n" +"Don't reply to this email; it won't get to them.\n" +"\n" +"With kind regards,\n" +"%4$s\n" +msgstr "" + +#. TRANS: Subject for direct-message notification email +#: lib/mail.php:536 +#, fuzzy, php-format +msgid "New private message from %s" +msgstr "Rektaj mesaĝoj de %s" + +#. TRANS: Body for direct-message notification email +#: lib/mail.php:541 +#, php-format +msgid "" +"%1$s (%2$s) sent you a private message:\n" +"\n" +"------------------------------------------------------\n" +"%3$s\n" +"------------------------------------------------------\n" +"\n" +"You can reply to their message here:\n" +"\n" +"%4$s\n" +"\n" +"Don't reply to this email; it won't get to them.\n" +"\n" +"With kind regards,\n" +"%5$s\n" +msgstr "" + +#. TRANS: Subject for favorite notification email +#: lib/mail.php:589 +#, fuzzy, php-format +msgid "%s (@%s) added your notice as a favorite" +msgstr "Sendu al mi mesaĝon tiam, kiam iu ŝatas mian avizon ." + +#. TRANS: Body for favorite notification email +#: lib/mail.php:592 +#, php-format +msgid "" +"%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n" +"\n" +"The URL of your notice is:\n" +"\n" +"%3$s\n" +"\n" +"The text of your notice is:\n" +"\n" +"%4$s\n" +"\n" +"You can see the list of %1$s's favorites here:\n" +"\n" +"%5$s\n" +"\n" +"Faithfully yours,\n" +"%6$s\n" +msgstr "" + +#. TRANS: Line in @-reply notification e-mail. %s is conversation URL. +#: lib/mail.php:651 +#, php-format +msgid "" +"The full conversation can be read here:\n" +"\n" +"\t%s" +msgstr "" + +#: lib/mail.php:657 +#, php-format +msgid "%s (@%s) sent a notice to your attention" +msgstr "" + +#. TRANS: Body of @-reply notification e-mail. +#: lib/mail.php:660 +#, php-format +msgid "" +"%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n" +"\n" +"The notice is here:\n" +"\n" +"\t%3$s\n" +"\n" +"It reads:\n" +"\n" +"\t%4$s\n" +"\n" +"%5$sYou can reply back here:\n" +"\n" +"\t%6$s\n" +"\n" +"The list of all @-replies for you here:\n" +"\n" +"%7$s\n" +"\n" +"Faithfully yours,\n" +"%2$s\n" +"\n" +"P.S. You can turn off these email notifications here: %8$s\n" +msgstr "" + +#: lib/mailbox.php:89 +msgid "Only the user can read their own mailboxes." +msgstr "" + +#: lib/mailbox.php:139 +msgid "" +"You have no private messages. You can send private message to engage other " +"users in conversation. People can send you messages for your eyes only." +msgstr "" + +#: lib/mailbox.php:228 lib/noticelist.php:506 +msgid "from" +msgstr "" + +#: lib/mailhandler.php:37 +#, fuzzy +msgid "Could not parse message." +msgstr "Malsukcesis ĝisdatigi uzanton" + +#: lib/mailhandler.php:42 +msgid "Not a registered user." +msgstr "" + +#: lib/mailhandler.php:46 +#, fuzzy +msgid "Sorry, that is not your incoming email address." +msgstr "Tiu ne estas via retpoŝtadreso." + +#: lib/mailhandler.php:50 +#, fuzzy +msgid "Sorry, no incoming email allowed." +msgstr "Ne estas alvena retpoŝtadreso" + +#: lib/mailhandler.php:228 +#, fuzzy, php-format +msgid "Unsupported message type: %s" +msgstr "Formato ne subtenata." + +#: lib/mediafile.php:98 lib/mediafile.php:123 +msgid "There was a database error while saving your file. Please try again." +msgstr "" + +#: lib/mediafile.php:142 +msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini." +msgstr "" + +#: lib/mediafile.php:147 +msgid "" +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " +"the HTML form." +msgstr "" + +#: lib/mediafile.php:152 +msgid "The uploaded file was only partially uploaded." +msgstr "" + +#: lib/mediafile.php:159 +msgid "Missing a temporary folder." +msgstr "" + +#: lib/mediafile.php:162 +msgid "Failed to write file to disk." +msgstr "" + +#: lib/mediafile.php:165 +msgid "File upload stopped by extension." +msgstr "" + +#: lib/mediafile.php:179 lib/mediafile.php:217 +msgid "File exceeds user's quota." +msgstr "" + +#: lib/mediafile.php:197 lib/mediafile.php:234 +msgid "File could not be moved to destination directory." +msgstr "" + +#: lib/mediafile.php:202 lib/mediafile.php:238 +#, fuzzy +msgid "Could not determine file's MIME type." +msgstr " Malsukcesis certigi fontan uzanton." + +#: lib/mediafile.php:318 +#, php-format +msgid " Try using another %s format." +msgstr "" + +#: lib/mediafile.php:323 +#, php-format +msgid "%s is not a supported file type on this server." +msgstr "" + +#: lib/messageform.php:120 +#, fuzzy +msgid "Send a direct notice" +msgstr "Forigi avizon" + +#: lib/messageform.php:146 +msgid "To" +msgstr "Al" + +#: lib/messageform.php:159 lib/noticeform.php:185 +msgid "Available characters" +msgstr "Haveblaj karakteroj" + +#: lib/messageform.php:178 lib/noticeform.php:236 +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "Sendi" + +#: lib/noticeform.php:160 +#, fuzzy +msgid "Send a notice" +msgstr "Nova avizo" + +#: lib/noticeform.php:173 +#, php-format +msgid "What's up, %s?" +msgstr "" + +#: lib/noticeform.php:192 +msgid "Attach" +msgstr "" + +#: lib/noticeform.php:196 +msgid "Attach a file" +msgstr "" + +#: lib/noticeform.php:212 +msgid "Share my location" +msgstr "" + +#: lib/noticeform.php:215 +#, fuzzy +msgid "Do not share my location" +msgstr "Ne forigu ĉi tiun aplikaĵon." + +#: lib/noticeform.php:216 +msgid "" +"Sorry, retrieving your geo location is taking longer than expected, please " +"try again later" +msgstr "" + +#. TRANS: Used in coordinates as abbreviation of north +#: lib/noticelist.php:436 +#, fuzzy +msgid "N" +msgstr "Ne" + +#. TRANS: Used in coordinates as abbreviation of south +#: lib/noticelist.php:438 +msgid "S" +msgstr "" + +#. TRANS: Used in coordinates as abbreviation of east +#: lib/noticelist.php:440 +msgid "E" +msgstr "" + +#. TRANS: Used in coordinates as abbreviation of west +#: lib/noticelist.php:442 +msgid "W" +msgstr "" + +#: lib/noticelist.php:444 +#, php-format +msgid "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s" +msgstr "" + +#: lib/noticelist.php:453 +msgid "at" +msgstr "al" + +#: lib/noticelist.php:568 +#, fuzzy +msgid "in context" +msgstr "Neniu enhavo!" + +#: lib/noticelist.php:603 +#, fuzzy +msgid "Repeated by" +msgstr "Ripetita" + +#: lib/noticelist.php:630 +#, fuzzy +msgid "Reply to this notice" +msgstr "Forigi la avizon" + +#: lib/noticelist.php:631 +msgid "Reply" +msgstr "" + +#: lib/noticelist.php:675 +#, fuzzy +msgid "Notice repeated" +msgstr "Avizo viŝiĝas" + +#: lib/nudgeform.php:116 +#, fuzzy +msgid "Nudge this user" +msgstr "Forigi la uzanton" + +#: lib/nudgeform.php:128 +#, fuzzy +msgid "Nudge" +msgstr "Puŝeto sendiĝis" + +#: lib/nudgeform.php:128 +#, fuzzy +msgid "Send a nudge to this user" +msgstr "Vi ne povas sendi mesaĝon al la uzanto." + +#: lib/oauthstore.php:283 +#, fuzzy +msgid "Error inserting new profile" +msgstr "Eraro je ĝisdatigo de fora profilo." + +#: lib/oauthstore.php:291 +#, fuzzy +msgid "Error inserting avatar" +msgstr "Eraris konservi uzanton: nevalida." + +#: lib/oauthstore.php:306 +#, fuzzy +msgid "Error updating remote profile" +msgstr "Eraro je ĝisdatigo de fora profilo." + +#: lib/oauthstore.php:311 +#, fuzzy +msgid "Error inserting remote profile" +msgstr "Eraro je ĝisdatigo de fora profilo." + +#: lib/oauthstore.php:345 +#, fuzzy +msgid "Duplicate notice" +msgstr "Forigi avizon" + +#: lib/oauthstore.php:490 +#, fuzzy +msgid "Couldn't insert new subscription." +msgstr "Malsukcesis enmeti konfirmkodon." + +#: lib/personalgroupnav.php:99 +#, fuzzy +msgid "Personal" +msgstr "Persona" + +#: lib/personalgroupnav.php:104 +msgid "Replies" +msgstr "" + +#: lib/personalgroupnav.php:114 +#, fuzzy +msgid "Favorites" +msgstr "Aldoni al ŝatolisto" + +#: lib/personalgroupnav.php:125 +msgid "Inbox" +msgstr "" + +#: lib/personalgroupnav.php:126 +#, fuzzy +msgid "Your incoming messages" +msgstr "Ne estas alvena retpoŝtadreso" + +#: lib/personalgroupnav.php:130 +#, fuzzy +msgid "Outbox" +msgstr "Elirkesto de %s" + +#: lib/personalgroupnav.php:131 +#, fuzzy +msgid "Your sent messages" +msgstr "Persona mesaĝo" + +#: lib/personaltagcloudsection.php:56 +#, php-format +msgid "Tags in %s's notices" +msgstr "" + +#: lib/plugin.php:115 +msgid "Unknown" +msgstr "" + +#: lib/profileaction.php:109 lib/profileaction.php:205 lib/subgroupnav.php:82 +#, fuzzy +msgid "Subscriptions" +msgstr "Priskribo" + +#: lib/profileaction.php:126 +#, fuzzy +msgid "All subscriptions" +msgstr "Priskribo" + +#: lib/profileaction.php:144 lib/profileaction.php:214 lib/subgroupnav.php:90 +#, fuzzy +msgid "Subscribers" +msgstr "Aboni" + +#: lib/profileaction.php:161 +#, fuzzy +msgid "All subscribers" +msgstr "Malaboni" + +#: lib/profileaction.php:191 +#, fuzzy +msgid "User ID" +msgstr "Uzanto" + +#: lib/profileaction.php:196 +#, fuzzy +msgid "Member since" +msgstr "Grupanoj" + +#. TRANS: Average count of posts made per day since account registration +#: lib/profileaction.php:235 +msgid "Daily average" +msgstr "" + +#: lib/profileaction.php:264 +#, fuzzy +msgid "All groups" +msgstr "Grupoj de %s" + +#: lib/profileformaction.php:123 +msgid "Unimplemented method." +msgstr "" + +#: lib/publicgroupnav.php:78 +msgid "Public" +msgstr "Publika" + +#: lib/publicgroupnav.php:82 +msgid "User groups" +msgstr "Uzantaj grupoj" + +#: lib/publicgroupnav.php:84 lib/publicgroupnav.php:85 +msgid "Recent tags" +msgstr "Freŝaj etikedoj" + +#: lib/publicgroupnav.php:88 +#, fuzzy +msgid "Featured" +msgstr "Elstaraj uzantoj" + +#: lib/publicgroupnav.php:92 +#, fuzzy +msgid "Popular" +msgstr "Populara avizo" + +#: lib/redirectingaction.php:95 +#, fuzzy +msgid "No return-to arguments." +msgstr "Ne estas aldonaĵo." + +#: lib/repeatform.php:107 +#, fuzzy +msgid "Repeat this notice?" +msgstr "Forigi la avizon" + +#: lib/repeatform.php:132 +msgid "Yes" +msgstr "Jes" + +#: lib/repeatform.php:132 +#, fuzzy +msgid "Repeat this notice" +msgstr "Forigi la avizon" + +#: lib/revokeroleform.php:91 +#, fuzzy, php-format +msgid "Revoke the \"%s\" role from this user" +msgstr "Bloki la uzanton de la grupo" + +#: lib/router.php:709 +msgid "No single user defined for single-user mode." +msgstr "" + +#: lib/sandboxform.php:67 +msgid "Sandbox" +msgstr "" + +#: lib/sandboxform.php:78 +#, fuzzy +msgid "Sandbox this user" +msgstr "Malbloki ĉi tiun uzanton" + +#: lib/searchaction.php:120 +msgid "Search site" +msgstr "" + +#: lib/searchaction.php:126 +msgid "Keyword(s)" +msgstr "" + +#: lib/searchaction.php:127 +#, fuzzy +msgid "Search" +msgstr "Homserĉo" + +#: lib/searchaction.php:162 +msgid "Search help" +msgstr "" + +#: lib/searchgroupnav.php:80 +#, fuzzy +msgid "People" +msgstr "Homserĉo" + +#: lib/searchgroupnav.php:81 +msgid "Find people on this site" +msgstr "" + +#: lib/searchgroupnav.php:83 +msgid "Find content of notices" +msgstr "" + +#: lib/searchgroupnav.php:85 +#, fuzzy +msgid "Find groups on this site" +msgstr "grupoj ĉe %s" + +#: lib/section.php:89 +msgid "Untitled section" +msgstr "" + +#: lib/section.php:106 +msgid "More..." +msgstr "Pli..." + +#: lib/silenceform.php:67 +msgid "Silence" +msgstr "Silento" + +#: lib/silenceform.php:78 +#, fuzzy +msgid "Silence this user" +msgstr "Forigi la uzanton" + +#: lib/subgroupnav.php:83 +#, php-format +msgid "People %s subscribes to" +msgstr "" + +#: lib/subgroupnav.php:91 +#, php-format +msgid "People subscribed to %s" +msgstr "" + +#: lib/subgroupnav.php:99 +#, fuzzy, php-format +msgid "Groups %s is a member of" +msgstr "Grupoj de %2$s ĉe %1$s." + +#: lib/subgroupnav.php:105 +#, fuzzy +msgid "Invite" +msgstr "Inviti" + +#: lib/subgroupnav.php:106 +#, fuzzy, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "Inviti amikojn kaj kolegojn aliĝi vin sur %s" + +#: lib/subscriberspeopleselftagcloudsection.php:48 +#: lib/subscriptionspeopleselftagcloudsection.php:48 +msgid "People Tagcloud as self-tagged" +msgstr "" + +#: lib/subscriberspeopletagcloudsection.php:48 +#: lib/subscriptionspeopletagcloudsection.php:48 +msgid "People Tagcloud as tagged" +msgstr "" + +#: lib/tagcloudsection.php:56 +#, fuzzy +msgid "None" +msgstr "Noto" + +#: lib/themeuploader.php:50 +msgid "This server cannot handle theme uploads without ZIP support." +msgstr "" + +#: lib/themeuploader.php:58 lib/themeuploader.php:61 +msgid "The theme file is missing or the upload failed." +msgstr "" + +#: lib/themeuploader.php:91 lib/themeuploader.php:102 +#: lib/themeuploader.php:253 lib/themeuploader.php:257 +#: lib/themeuploader.php:265 lib/themeuploader.php:272 +#, fuzzy +msgid "Failed saving theme." +msgstr "Eraris ĝisdatigi vizaĝbildon." + +#: lib/themeuploader.php:139 +msgid "Invalid theme: bad directory structure." +msgstr "" + +#: lib/themeuploader.php:166 +#, php-format +msgid "Uploaded theme is too large; must be less than %d bytes uncompressed." +msgstr "" + +#: lib/themeuploader.php:178 +msgid "Invalid theme archive: missing file css/display.css" +msgstr "" + +#: lib/themeuploader.php:205 +msgid "" +"Theme contains invalid file or folder name. Stick with ASCII letters, " +"digits, underscore, and minus sign." +msgstr "" + +#: lib/themeuploader.php:216 +#, php-format +msgid "Theme contains file of type '.%s', which is not allowed." +msgstr "" + +#: lib/themeuploader.php:234 +#, fuzzy +msgid "Error opening theme archive." +msgstr "Eraro je ĝisdatigo de fora profilo." + +#: lib/topposterssection.php:74 +msgid "Top posters" +msgstr "" + +#: lib/unsandboxform.php:69 +msgid "Unsandbox" +msgstr "" + +#: lib/unsandboxform.php:80 +#, fuzzy +msgid "Unsandbox this user" +msgstr "Malbloki ĉi tiun uzanton" + +#: lib/unsilenceform.php:67 +#, fuzzy +msgid "Unsilence" +msgstr "Silento" + +#: lib/unsilenceform.php:78 +#, fuzzy +msgid "Unsilence this user" +msgstr "Malbloki ĉi tiun uzanton" + +#: lib/unsubscribeform.php:113 lib/unsubscribeform.php:137 +#, fuzzy +msgid "Unsubscribe from this user" +msgstr "Malbloki ĉi tiun uzanton" + +#: lib/unsubscribeform.php:137 +msgid "Unsubscribe" +msgstr "Malaboni" + +#: lib/usernoprofileexception.php:58 +#, fuzzy, php-format +msgid "User %s (%d) has no profile record." +msgstr "La uzanto ne havas profilon." + +#: lib/userprofile.php:117 +#, fuzzy +msgid "Edit Avatar" +msgstr "Vizaĝbildo" + +#: lib/userprofile.php:234 lib/userprofile.php:248 +#, fuzzy +msgid "User actions" +msgstr "Uzantaj grupoj" + +#: lib/userprofile.php:237 +msgid "User deletion in progress..." +msgstr "" + +#: lib/userprofile.php:263 +#, fuzzy +msgid "Edit profile settings" +msgstr "Profila agordo" + +#: lib/userprofile.php:264 +msgid "Edit" +msgstr "Redakti" + +#: lib/userprofile.php:287 +#, fuzzy +msgid "Send a direct message to this user" +msgstr "Vi ne povas sendi mesaĝon al la uzanto." + +#: lib/userprofile.php:288 +msgid "Message" +msgstr "Mesaĝo" + +#: lib/userprofile.php:326 +msgid "Moderate" +msgstr "Moderigi" + +#: lib/userprofile.php:364 +#, fuzzy +msgid "User role" +msgstr "Uzantaj grupoj" + +#: lib/userprofile.php:366 +msgctxt "role" +msgid "Administrator" +msgstr "Administranto" + +#: lib/userprofile.php:367 +msgctxt "role" +msgid "Moderator" +msgstr "Moderanto" + +#. TRANS: Used in notices to indicate when the notice was made compared to now. +#: lib/util.php:1100 +msgid "a few seconds ago" +msgstr "antaŭ kelkaj sekundoj" + +#. TRANS: Used in notices to indicate when the notice was made compared to now. +#: lib/util.php:1103 +msgid "about a minute ago" +msgstr "antaŭ ĉirkaŭ unu minuto" + +#. TRANS: Used in notices to indicate when the notice was made compared to now. +#: lib/util.php:1107 +#, php-format +msgid "about %d minutes ago" +msgstr "antaŭ ĉirkaŭ %d minutoj" + +#. TRANS: Used in notices to indicate when the notice was made compared to now. +#: lib/util.php:1110 +msgid "about an hour ago" +msgstr "antaŭ ĉirkaŭ unu horo" + +#. TRANS: Used in notices to indicate when the notice was made compared to now. +#: lib/util.php:1114 +#, php-format +msgid "about %d hours ago" +msgstr "antaŭ ĉirkaŭ %d horoj" + +#. TRANS: Used in notices to indicate when the notice was made compared to now. +#: lib/util.php:1117 +msgid "about a day ago" +msgstr "antaŭ ĉirkaŭ unu tago" + +#. TRANS: Used in notices to indicate when the notice was made compared to now. +#: lib/util.php:1121 +#, fuzzy, php-format +msgid "about %d days ago" +msgstr "antaŭ ĉirkaŭ unu tago" + +#. TRANS: Used in notices to indicate when the notice was made compared to now. +#: lib/util.php:1124 +#, fuzzy +msgid "about a month ago" +msgstr "antaŭ ĉirkaŭ unu minuto" + +#. TRANS: Used in notices to indicate when the notice was made compared to now. +#: lib/util.php:1128 +#, fuzzy, php-format +msgid "about %d months ago" +msgstr "antaŭ ĉirkaŭ %d minutoj" + +#. TRANS: Used in notices to indicate when the notice was made compared to now. +#: lib/util.php:1131 +#, fuzzy +msgid "about a year ago" +msgstr "antaŭ ĉirkaŭ unu tago" + +#: lib/webcolor.php:82 +#, fuzzy, php-format +msgid "%s is not a valid color!" +msgstr "Ĉefpaĝo ne estas valida URL." + +#: lib/webcolor.php:123 +#, php-format +msgid "%s is not a valid color! Use 3 or 6 hex chars." +msgstr "" + +#: lib/xmppmanager.php:403 +#, php-format +msgid "Message too long - maximum is %1$d characters, you sent %2$d." +msgstr "" diff --git a/locale/fr/LC_MESSAGES/statusnet.po b/locale/fr/LC_MESSAGES/statusnet.po index e9890ef360..4f7b3f0e70 100644 --- a/locale/fr/LC_MESSAGES/statusnet.po +++ b/locale/fr/LC_MESSAGES/statusnet.po @@ -15,12 +15,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-07 16:23+0000\n" -"PO-Revision-Date: 2010-08-07 16:24:27+0000\n" +"POT-Creation-Date: 2010-08-11 10:11+0000\n" +"PO-Revision-Date: 2010-08-11 10:12:08+0000\n" "Language-Team: French\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70848); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: fr\n" "X-Message-Group: out-statusnet\n" @@ -805,7 +805,7 @@ msgid "Preview" msgstr "Aperçu" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:656 +#: lib/deleteuserform.php:66 lib/noticelist.php:657 msgid "Delete" msgstr "Supprimer" @@ -1086,7 +1086,7 @@ msgid "Do not delete this notice" msgstr "Ne pas supprimer cet avis" #. TRANS: Submit button title for 'Yes' when deleting a notice. -#: actions/deletenotice.php:158 lib/noticelist.php:656 +#: actions/deletenotice.php:158 lib/noticelist.php:657 msgid "Delete this notice" msgstr "Supprimer cet avis" @@ -3538,7 +3538,7 @@ msgstr "Vous ne pouvez pas reprendre votre propre avis." msgid "You already repeated that notice." msgstr "Vous avez déjà repris cet avis." -#: actions/repeat.php:114 lib/noticelist.php:675 +#: actions/repeat.php:114 lib/noticelist.php:676 msgid "Repeated" msgstr "Repris" @@ -5020,7 +5020,7 @@ msgstr "Problème lors de l’enregistrement de la boîte de réception du group #. 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. -#: classes/Notice.php:1745 +#: classes/Notice.php:1746 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -6594,7 +6594,7 @@ msgstr "" "pour démarrer des conversations avec d’autres utilisateurs. Ceux-ci peuvent " "vous envoyer des messages destinés à vous seul(e)." -#: lib/mailbox.php:227 lib/noticelist.php:505 +#: lib/mailbox.php:228 lib/noticelist.php:506 msgid "from" msgstr "de" @@ -6754,23 +6754,23 @@ msgstr "%1$u° %2$u' %3$u\" %4$s %5$u° %6$u' %7$u\" %8$s" msgid "at" msgstr "chez" -#: lib/noticelist.php:567 +#: lib/noticelist.php:568 msgid "in context" msgstr "dans le contexte" -#: lib/noticelist.php:602 +#: lib/noticelist.php:603 msgid "Repeated by" msgstr "Repris par" -#: lib/noticelist.php:629 +#: lib/noticelist.php:630 msgid "Reply to this notice" msgstr "Répondre à cet avis" -#: lib/noticelist.php:630 +#: lib/noticelist.php:631 msgid "Reply" msgstr "Répondre" -#: lib/noticelist.php:674 +#: lib/noticelist.php:675 msgid "Notice repeated" msgstr "Avis repris" diff --git a/locale/ia/LC_MESSAGES/statusnet.po b/locale/ia/LC_MESSAGES/statusnet.po index 82541026bc..ccde993d4a 100644 --- a/locale/ia/LC_MESSAGES/statusnet.po +++ b/locale/ia/LC_MESSAGES/statusnet.po @@ -8,12 +8,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-07 16:23+0000\n" -"PO-Revision-Date: 2010-08-07 16:24:35+0000\n" +"POT-Creation-Date: 2010-08-11 10:11+0000\n" +"PO-Revision-Date: 2010-08-11 10:12:24+0000\n" "Language-Team: Interlingua\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70848); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ia\n" "X-Message-Group: out-statusnet\n" @@ -790,7 +790,7 @@ msgid "Preview" msgstr "Previsualisation" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:656 +#: lib/deleteuserform.php:66 lib/noticelist.php:657 msgid "Delete" msgstr "Deler" @@ -1071,7 +1071,7 @@ msgid "Do not delete this notice" msgstr "Non deler iste nota" #. TRANS: Submit button title for 'Yes' when deleting a notice. -#: actions/deletenotice.php:158 lib/noticelist.php:656 +#: actions/deletenotice.php:158 lib/noticelist.php:657 msgid "Delete this notice" msgstr "Deler iste nota" @@ -3499,7 +3499,7 @@ msgstr "Tu non pote repeter tu proprie nota." msgid "You already repeated that notice." msgstr "Tu ha ja repetite iste nota." -#: actions/repeat.php:114 lib/noticelist.php:675 +#: actions/repeat.php:114 lib/noticelist.php:676 msgid "Repeated" msgstr "Repetite" @@ -4964,7 +4964,7 @@ msgstr "Problema salveguardar le cassa de entrata del gruppo." #. 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. -#: classes/Notice.php:1745 +#: classes/Notice.php:1746 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -6522,7 +6522,7 @@ msgstr "" "altere usatores in conversation. Altere personas pote inviar te messages que " "solmente tu pote leger." -#: lib/mailbox.php:227 lib/noticelist.php:505 +#: lib/mailbox.php:228 lib/noticelist.php:506 msgid "from" msgstr "de" @@ -6682,23 +6682,23 @@ msgstr "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s" msgid "at" msgstr "a" -#: lib/noticelist.php:567 +#: lib/noticelist.php:568 msgid "in context" msgstr "in contexto" -#: lib/noticelist.php:602 +#: lib/noticelist.php:603 msgid "Repeated by" msgstr "Repetite per" -#: lib/noticelist.php:629 +#: lib/noticelist.php:630 msgid "Reply to this notice" msgstr "Responder a iste nota" -#: lib/noticelist.php:630 +#: lib/noticelist.php:631 msgid "Reply" msgstr "Responder" -#: lib/noticelist.php:674 +#: lib/noticelist.php:675 msgid "Notice repeated" msgstr "Nota repetite" diff --git a/locale/ko/LC_MESSAGES/statusnet.po b/locale/ko/LC_MESSAGES/statusnet.po index 5b5bb04249..8ba2443a63 100644 --- a/locale/ko/LC_MESSAGES/statusnet.po +++ b/locale/ko/LC_MESSAGES/statusnet.po @@ -1,6 +1,7 @@ # Translation of StatusNet to Korean # # Author@translatewiki.net: Brion +# Author@translatewiki.net: Changwoo # Author@translatewiki.net: Twkang # -- # This file is distributed under the same license as the StatusNet package. @@ -9,12 +10,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-07 16:23+0000\n" -"PO-Revision-Date: 2010-08-07 16:24:43+0000\n" +"POT-Creation-Date: 2010-08-11 10:11+0000\n" +"PO-Revision-Date: 2010-08-11 10:12:37+0000\n" "Language-Team: Korean\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70848); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ko\n" "X-Message-Group: out-statusnet\n" @@ -322,7 +323,7 @@ msgstr "메시지 내용이 없습니다!" #: actions/apidirectmessagenew.php:127 actions/newmessage.php:150 #, php-format msgid "That's too long. Max message size is %d chars." -msgstr "너무 깁니다. 최대 메시지 길이는 %d 자까지입니다." +msgstr "너무 깁니다. 최대 메시지 길이는 %d자 까지입니다." #: actions/apidirectmessagenew.php:138 msgid "Recipient user not found." @@ -356,7 +357,7 @@ msgstr "관심소식을 삭제할 수 없습니다." #: actions/apifriendshipscreate.php:109 #, fuzzy msgid "Could not follow user: profile not found." -msgstr "팔로우할 수 없습니다: 이용자 없음." +msgstr "언팔로우할 수 없습니다: 이용자 없음." #: actions/apifriendshipscreate.php:118 #, php-format @@ -372,9 +373,8 @@ msgid "You cannot unfollow yourself." msgstr "자기 자신을 언팔로우할 수 없습니다." #: actions/apifriendshipsexists.php:91 -#, fuzzy msgid "Two valid IDs or screen_names must be supplied." -msgstr "두 개의 사용자 ID나 대화명을 입력해야 합니다." +msgstr "" #: actions/apifriendshipsshow.php:134 msgid "Could not determine source user." @@ -456,15 +456,16 @@ msgstr "" #: actions/apigroupshow.php:83 actions/apitimelinegroup.php:92 #, fuzzy msgid "Group not found." -msgstr "그룹을 찾을 수 없습니다." +msgstr "찾을 수가 없습니다." #: actions/apigroupjoin.php:111 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "당신은 이미 이 그룹의 멤버입니다." #: actions/apigroupjoin.php:120 actions/joingroup.php:105 lib/command.php:327 +#, fuzzy msgid "You have been blocked from that group by the admin." -msgstr "" +msgstr "귀하는 구독이 금지되었습니다." #: actions/apigroupjoin.php:139 actions/joingroup.php:134 #, php-format @@ -478,19 +479,19 @@ msgstr "당신은 해당 그룹의 멤버가 아닙니다." #: actions/apigroupleave.php:125 actions/leavegroup.php:129 #, fuzzy, php-format msgid "Could not remove user %1$s from group %2$s." -msgstr "그룹 %s에서 %s 사용자를 제거할 수 없습니다." +msgstr "이용자 %1$s 의 그룹 %2$s 가입에 실패했습니다." #. TRANS: %s is a user name #: actions/apigrouplist.php:98 #, php-format msgid "%s's groups" -msgstr "%s의 그룹들" +msgstr "%s의 그룹" #. TRANS: Meant to convey the user %2$s is a member of each of the groups listed on site %1$s #: actions/apigrouplist.php:108 -#, fuzzy, php-format +#, php-format msgid "%1$s groups %2$s is a member of." -msgstr "%s 그룹들은 의 멤버입니다." +msgstr "%1$s 사이트의 그룹에 %2$s 사용자가 멤버입니다." #. TRANS: Message is used as a title. %s is a site name. #. TRANS: Message is used as a page title. %s is a nick name. @@ -502,12 +503,12 @@ msgstr "%s 그룹" #: actions/apigrouplistall.php:96 #, php-format msgid "groups on %s" -msgstr "%s 상의 그룹들" +msgstr "%s 사이트의 그룹" #: actions/apimediaupload.php:99 #, fuzzy msgid "Upload failed." -msgstr "올리기" +msgstr "실행 실패" #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." @@ -534,7 +535,7 @@ msgstr "옳지 않은 크기" #: actions/unsubscribe.php:69 actions/userauthorization.php:52 #: lib/designsettings.php:294 msgid "There was a problem with your session token. Try again, please." -msgstr "세션토큰에 문제가 있습니다. 다시 시도해주세요." +msgstr "세션토큰에 문제가 있습니다. 다시 시도해주십시오." #: actions/apioauthauthorize.php:135 #, fuzzy @@ -678,17 +679,17 @@ msgstr "지원하지 않는 형식입니다." #: actions/apitimelinefavorites.php:110 #, fuzzy, php-format msgid "%1$s / Favorites from %2$s" -msgstr "%s / %s의 좋아하는 글들" +msgstr "%1$s의 상태 (%2$s에서)" #: actions/apitimelinefavorites.php:119 #, fuzzy, php-format msgid "%1$s updates favorited by %2$s / %2$s." -msgstr "%s 좋아하는 글이 업데이트 됐습니다. %S에 의해 / %s." +msgstr "%1$s님이 %2$s/%3$s의 업데이트에 답변했습니다." #: actions/apitimelinementions.php:118 #, fuzzy, php-format msgid "%1$s / Updates mentioning %2$s" -msgstr "%1$s / %2$s에게 답신 업데이트" +msgstr "%1$s의 상태 (%2$s에서)" #: actions/apitimelinementions.php:131 #, php-format @@ -764,7 +765,7 @@ msgstr "당신의 개인 아바타를 업로드할 수 있습니다. 최대 파 #: actions/userauthorization.php:72 actions/userrss.php:108 #, fuzzy msgid "User without matching profile." -msgstr "프로필 매칭이 없는 사용자" +msgstr "이용자가 프로필을 가지고 있지 않습니다." #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 #: actions/grouplogo.php:254 @@ -782,7 +783,7 @@ msgid "Preview" msgstr "미리보기" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:656 +#: lib/deleteuserform.php:66 lib/noticelist.php:657 msgid "Delete" msgstr "삭제" @@ -801,7 +802,7 @@ msgstr "프로필을 지정하지 않았습니다." #: actions/avatarsettings.php:332 msgid "Pick a square area of the image to be your avatar" -msgstr "당신의 아바타가 될 이미지영역을 지정하세요." +msgstr "그림에서 당신의 아바타로 사용할 영역을 지정하십시오." #: actions/avatarsettings.php:347 actions/grouplogo.php:380 msgid "Lost our file data." @@ -844,7 +845,6 @@ msgstr "" #: actions/block.php:153 actions/deleteapplication.php:154 #: actions/deletenotice.php:147 actions/deleteuser.php:152 #: actions/groupblock.php:178 -#, fuzzy msgctxt "BUTTON" msgid "No" msgstr "아니오" @@ -863,10 +863,9 @@ msgstr "이용자를 차단하지 않는다." #: actions/block.php:160 actions/deleteapplication.php:161 #: actions/deletenotice.php:154 actions/deleteuser.php:159 #: actions/groupblock.php:185 -#, fuzzy msgctxt "BUTTON" msgid "Yes" -msgstr "네, 맞습니다." +msgstr "예" #. TRANS: Submit button title for 'Yes' when blocking a user. #: actions/block.php:164 actions/groupmembers.php:392 lib/blockform.php:80 @@ -899,7 +898,7 @@ msgstr "이용자 프로필" #: actions/blockedfromgroup.php:100 #, fuzzy, php-format msgid "%1$s blocked profiles, page %2$d" -msgstr "%s 와 친구들, %d 페이지" +msgstr "%s 및 친구들, %d 페이지" #: actions/blockedfromgroup.php:115 #, fuzzy @@ -922,7 +921,7 @@ msgstr "이 사용자를 차단해제합니다." #: actions/bookmarklet.php:51 #, fuzzy, php-format msgid "Post to %s" -msgstr "사진" +msgstr "%s 사이트의 그룹" #: actions/confirmaddress.php:75 msgid "No confirmation code." @@ -938,9 +937,9 @@ msgstr "그 인증 코드는 귀하의 것이 아닙니다!" #. TRANS: Server error for an unknow address type, which can be 'email', 'jabber', or 'sms'. #: actions/confirmaddress.php:91 -#, fuzzy, php-format +#, php-format msgid "Unrecognized address type %s." -msgstr "인식되지않은 주소유형 %s" +msgstr "" #. TRANS: Client error for an already confirmed email/jabbel/sms address. #: actions/confirmaddress.php:96 @@ -966,7 +965,7 @@ msgstr "사용자를 업데이트 할 수 없습니다." #: actions/confirmaddress.php:128 actions/emailsettings.php:433 #: actions/smssettings.php:422 msgid "Couldn't delete email confirmation." -msgstr "이메일 승인을 삭제 할 수 없습니다." +msgstr "메일 승인을 삭제 할 수 없습니다." #: actions/confirmaddress.php:146 msgid "Confirm address" @@ -978,9 +977,8 @@ msgid "The address \"%s\" has been confirmed for your account." msgstr "\"%s\" 는 귀하의 계정으로 승인되었습니다." #: actions/conversation.php:99 -#, fuzzy msgid "Conversation" -msgstr "인증 코드" +msgstr "대화" #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87 #: lib/profileaction.php:229 lib/searchgroupnav.php:82 @@ -990,12 +988,12 @@ msgstr "통지" #: actions/deleteapplication.php:63 #, fuzzy msgid "You must be logged in to delete an application." -msgstr "그룹을 만들기 위해서는 로그인해야 합니다." +msgstr "응용 프로그램 수정을 위해서는 로그인해야 합니다." #: actions/deleteapplication.php:71 #, fuzzy msgid "Application not found." -msgstr "통지에 프로필이 없습니다." +msgstr "인증 코드가 없습니다." #: actions/deleteapplication.php:78 actions/editapplication.php:77 #: actions/showapplication.php:94 @@ -1024,13 +1022,13 @@ msgstr "" #: actions/deleteapplication.php:158 #, fuzzy msgid "Do not delete this application" -msgstr "이 통지를 지울 수 없습니다." +msgstr "응용프로그램 삭제" #. TRANS: Submit button title for 'Yes' when deleting an application. #: actions/deleteapplication.php:164 #, fuzzy msgid "Delete this application" -msgstr "이 게시글 삭제하기" +msgstr "응용프로그램 삭제" #. TRANS: Client error message thrown when trying to access the admin panel while not logged in. #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 @@ -1048,12 +1046,10 @@ msgid "Can't delete this notice." msgstr "이 통지를 지울 수 없습니다." #: actions/deletenotice.php:103 -#, fuzzy msgid "" "You are about to permanently delete a notice. Once this is done, it cannot " "be undone." msgstr "" -"영구적으로 게시글을 삭제하려고 합니다. 한번 삭제되면, 복구할 수 없습니다." #: actions/deletenotice.php:109 actions/deletenotice.php:141 msgid "Delete notice" @@ -1070,14 +1066,14 @@ msgid "Do not delete this notice" msgstr "이 통지를 지울 수 없습니다." #. TRANS: Submit button title for 'Yes' when deleting a notice. -#: actions/deletenotice.php:158 lib/noticelist.php:656 +#: actions/deletenotice.php:158 lib/noticelist.php:657 msgid "Delete this notice" msgstr "이 게시글 삭제하기" #: actions/deleteuser.php:67 #, fuzzy msgid "You cannot delete users." -msgstr "사용자를 업데이트 할 수 없습니다." +msgstr "이용자를 업데이트 할 수 없습니다." #: actions/deleteuser.php:74 #, fuzzy @@ -1096,16 +1092,15 @@ msgstr "" #. TRANS: Submit button title for 'Yes' when deleting a user. #: actions/deleteuser.php:163 lib/deleteuserform.php:77 -#, fuzzy msgid "Delete this user" -msgstr "이 게시글 삭제하기" +msgstr "이 사용자 삭제" #. TRANS: Message used as title for design settings for the site. #. TRANS: Link description in user account settings menu. #: actions/designadminpanel.php:63 lib/accountsettingsaction.php:139 #: lib/groupnav.php:119 msgid "Design" -msgstr "" +msgstr "디자인" #: actions/designadminpanel.php:74 msgid "Design settings for this StatusNet site." @@ -1118,7 +1113,7 @@ msgstr "잘못된 로고 URL 입니다." #: actions/designadminpanel.php:322 #, fuzzy, php-format msgid "Theme not available: %s." -msgstr "테마를 이용할 수 없습니다: %s" +msgstr "인스턴트 메신저를 사용할 수 없습니다." #: actions/designadminpanel.php:426 msgid "Change logo" @@ -1141,9 +1136,8 @@ msgid "Theme for the site." msgstr "사이트에 대한 테마" #: actions/designadminpanel.php:467 -#, fuzzy msgid "Custom theme" -msgstr "사이트 테마" +msgstr "사용자 지정 테마" #: actions/designadminpanel.php:471 msgid "You can upload a custom StatusNet theme as a .ZIP archive." @@ -1189,9 +1183,8 @@ msgid "Change colours" msgstr "색상 변경" #: actions/designadminpanel.php:587 lib/designsettings.php:191 -#, fuzzy msgid "Content" -msgstr "연결" +msgstr "만족하는" #: actions/designadminpanel.php:600 lib/designsettings.php:204 #, fuzzy @@ -1203,17 +1196,16 @@ msgid "Text" msgstr "문자" #: actions/designadminpanel.php:626 lib/designsettings.php:230 -#, fuzzy msgid "Links" -msgstr "로그인" +msgstr "링크" #: actions/designadminpanel.php:651 msgid "Advanced" -msgstr "" +msgstr "고급 검색" #: actions/designadminpanel.php:655 msgid "Custom CSS" -msgstr "" +msgstr "사용자 CSS" #: actions/designadminpanel.php:676 lib/designsettings.php:247 msgid "Use defaults" @@ -1239,8 +1231,9 @@ msgid "Save" msgstr "저장" #: actions/designadminpanel.php:686 lib/designsettings.php:257 +#, fuzzy msgid "Save design" -msgstr "" +msgstr "프로필 디자인" #: actions/disfavor.php:81 msgid "This notice is not a favorite!" @@ -1253,7 +1246,7 @@ msgstr "좋아하는 게시글로 추가하기" #: actions/doc.php:158 #, fuzzy, php-format msgid "No such document \"%s\"" -msgstr "그러한 문서는 없습니다." +msgstr "해당하는 첨부파일이 없습니다." #: actions/editapplication.php:54 msgid "Edit Application" @@ -1267,7 +1260,7 @@ msgstr "응용 프로그램 수정을 위해서는 로그인해야 합니다." #: actions/showapplication.php:87 #, fuzzy msgid "No such application." -msgstr "그러한 통지는 없습니다." +msgstr "신규 응용 프로그램" #: actions/editapplication.php:161 #, fuzzy @@ -1295,8 +1288,9 @@ msgid "Description is required." msgstr "설명" #: actions/editapplication.php:194 +#, fuzzy msgid "Source URL is too long." -msgstr "" +msgstr "소스 코드 URL" #: actions/editapplication.php:200 actions/newapplication.php:185 #, fuzzy @@ -1364,34 +1358,34 @@ msgstr "그룹을 업데이트 할 수 없습니다." #: actions/editgroup.php:264 classes/User_group.php:514 #, fuzzy msgid "Could not create aliases." -msgstr "좋아하는 게시글을 생성할 수 없습니다." +msgstr "관심소식을 생성할 수 없습니다." #: actions/editgroup.php:280 msgid "Options saved." -msgstr "옵션들이 저장되었습니다." +msgstr "옵션을 저장했습니다." #. TRANS: Title for e-mail settings. #: actions/emailsettings.php:61 msgid "Email settings" -msgstr "이메일 설정" +msgstr "메일 설정" #. TRANS: E-mail settings page instructions. #. TRANS: %%site.name%% is the name of the site. #: actions/emailsettings.php:76 #, php-format msgid "Manage how you get email from %%site.name%%." -msgstr "%%site.name%%에서 어떻게 이메일을 받을지 정하십시오." +msgstr "%%site.name%%에서 어떻게 메일을 받을지 정하십시오." #. TRANS: Form legend for e-mail settings form. #. TRANS: Field label for e-mail address input in e-mail settings form. #: actions/emailsettings.php:106 actions/emailsettings.php:132 msgid "Email address" -msgstr "이메일 주소" +msgstr "메일 주소" #. TRANS: Form note in e-mail settings form. #: actions/emailsettings.php:112 msgid "Current confirmed email address." -msgstr "확인된 최신의 이메일 계정" +msgstr "확인된 최신의 메일 계정" #. TRANS: Button label to remove a confirmed e-mail address. #. TRANS: Button label for removing a set sender e-mail address to post notices from. @@ -1401,10 +1395,9 @@ msgstr "확인된 최신의 이메일 계정" #: actions/emailsettings.php:115 actions/emailsettings.php:158 #: actions/imsettings.php:116 actions/smssettings.php:124 #: actions/smssettings.php:180 -#, fuzzy msgctxt "BUTTON" msgid "Remove" -msgstr "삭제" +msgstr "제거" #: actions/emailsettings.php:122 msgid "" @@ -1420,7 +1413,6 @@ msgstr "" #. TRANS: Button label #: actions/emailsettings.php:127 actions/imsettings.php:131 #: actions/smssettings.php:137 lib/applicationeditform.php:357 -#, fuzzy msgctxt "BUTTON" msgid "Cancel" msgstr "취소" @@ -1428,14 +1420,13 @@ msgstr "취소" #. TRANS: Instructions for e-mail address input form. #: actions/emailsettings.php:135 msgid "Email address, like \"UserName@example.org\"" -msgstr "\"UserName@example.org\" 와 같은 이메일 계정" +msgstr "\"사용자이름@예제.org\"와 같은 메일 계정" #. TRANS: Button label for adding an e-mail address in e-mail settings form. #. TRANS: Button label for adding an IM address in IM settings form. #. TRANS: Button label for adding a SMS phone number in SMS settings form. #: actions/emailsettings.php:139 actions/imsettings.php:148 #: actions/smssettings.php:162 -#, fuzzy msgctxt "BUTTON" msgid "Add" msgstr "추가" @@ -1444,13 +1435,13 @@ msgstr "추가" #. TRANS: Form legend for incoming SMS settings form. #: actions/emailsettings.php:147 actions/smssettings.php:171 msgid "Incoming email" -msgstr "받은 이메일" +msgstr "받은 메일" #. TRANS: Form instructions for incoming e-mail form in e-mail settings. #. TRANS: Form instructions for incoming SMS e-mail address form in SMS settings. #: actions/emailsettings.php:155 actions/smssettings.php:178 msgid "Send email to this address to post new notices." -msgstr "새로운 통지를 올리려면 이 주소로 메일을 보내십시오/" +msgstr "새로운 통지를 올리려면 이 주소로 메일을 보내십시오." #. TRANS: Instructions for incoming e-mail address input form. #. TRANS: Instructions for incoming SMS e-mail address input form. @@ -1461,84 +1452,80 @@ msgstr "포스팅을 위한 새 이메일 계정의 생성; 전 이메일 계정 #. TRANS: Button label for adding an e-mail address to send notices from. #. TRANS: Button label for adding an SMS e-mail address to send notices from. #: actions/emailsettings.php:168 actions/smssettings.php:189 -#, fuzzy msgctxt "BUTTON" msgid "New" -msgstr "새로운" +msgstr "새 게임" #. TRANS: Form legend for e-mail preferences form. #: actions/emailsettings.php:174 -#, fuzzy msgid "Email preferences" -msgstr "설정" +msgstr "메일 설정" #. TRANS: Checkbox label in e-mail preferences form. #: actions/emailsettings.php:180 msgid "Send me notices of new subscriptions through email." -msgstr "새로운 예약 구독의 통지를 이메일로 보내주세요." +msgstr "새로운 예약 구독의 통지를 메일로 보내주세요." #. TRANS: Checkbox label in e-mail preferences form. #: actions/emailsettings.php:186 msgid "Send me email when someone adds my notice as a favorite." -msgstr "누군가 내 글을 좋아하는 게시글로 추가했을때, 이메일을 보냅니다." +msgstr "누군가 내 글을 좋아하는 게시글로 추가했을 때, 메일을 보냅니다." #. TRANS: Checkbox label in e-mail preferences form. #: actions/emailsettings.php:193 msgid "Send me email when someone sends me a private message." -msgstr "누군가 내게 비밀메시지를 보냈을때, 이메일을 보냅니다." +msgstr "누군가 내게 비밀메시지를 보냈을 때, 메일을 보냅니다." #. TRANS: Checkbox label in e-mail preferences form. #: actions/emailsettings.php:199 -#, fuzzy msgid "Send me email when someone sends me an \"@-reply\"." -msgstr "누군가 내게 비밀메시지를 보냈을때, 이메일을 보냅니다." +msgstr "누군가 내게 @ 답장을 보냈을 때, 메일을 보냅니다." #. TRANS: Checkbox label in e-mail preferences form. #: actions/emailsettings.php:205 msgid "Allow friends to nudge me and send me an email." -msgstr "친구들이 내게 이메일이나 쪽지를 보낼 수 있도록 허용합니다." +msgstr "친구들이 내게 메일이나 쪽지를 보낼 수 있도록 허용합니다." #. TRANS: Checkbox label in e-mail preferences form. #: actions/emailsettings.php:212 msgid "I want to post notices by email." -msgstr "이메일로 통보를 포스트 하길 원합니다." +msgstr "메일로 통보를 포스트합니다." #. TRANS: Checkbox label in e-mail preferences form. #: actions/emailsettings.php:219 msgid "Publish a MicroID for my email address." -msgstr "이메일 주소를 위한 MicroID의 생성" +msgstr "메일 주소를 위한 MicroID의 생성" #. TRANS: Confirmation message for successful e-mail preferences save. #: actions/emailsettings.php:334 -#, fuzzy msgid "Email preferences saved." -msgstr "싱크설정이 저장되었습니다." +msgstr "메일 설정이 저장되었습니다." #. TRANS: Message given saving e-mail address without having provided one. #: actions/emailsettings.php:353 msgid "No email address." -msgstr "이메일이 추가 되지 않았습니다." +msgstr "메일 주소가 없습니다." #. TRANS: Message given saving e-mail address that cannot be normalised. #: actions/emailsettings.php:361 msgid "Cannot normalize that email address" -msgstr "그 이메일 주소를 정규화 할 수 없습니다." +msgstr "메일 주소를 정규화 할 수 없습니다." #. TRANS: Message given saving e-mail address that not valid. #: actions/emailsettings.php:366 actions/register.php:208 #: actions/siteadminpanel.php:144 msgid "Not a valid email address." -msgstr "유효한 이메일 주소가 아닙니다." +msgstr "올바른 메일 주소가 아닙니다." #. TRANS: Message given saving e-mail address that is already set. #: actions/emailsettings.php:370 msgid "That is already your email address." -msgstr "그 이메일 주소는 이미 귀하의 것입니다." +msgstr "그 메일 주소는 이미 귀하의 것입니다." #. TRANS: Message given saving e-mail address that is already set for another user. #: actions/emailsettings.php:374 msgid "That email address already belongs to another user." -msgstr "그 이메일 주소는 이미 다른 사용자의 소유입니다." +msgstr "그 메일 주소는 이미 다른 사용자의 소유입니다." #. TRANS: Server error thrown on database error adding e-mail confirmation code. #. TRANS: Server error thrown on database error adding IM confirmation code. @@ -1554,7 +1541,7 @@ msgid "" "A confirmation code was sent to the email address you added. Check your " "inbox (and spam box!) for the code and instructions on how to use it." msgstr "" -"추가한 이메일로 인증 코드를 보냈습니다. 수신함(또는 스팸함)을 확인하셔서 코드" +"추가한 메일로 인증 코드를 보냈습니다. 수신함(또는 스팸함)을 확인하셔서 코드" "와 사용법을 확인하여 주시기 바랍니다." #. TRANS: Message given canceling e-mail address confirmation that is not pending. @@ -1575,23 +1562,22 @@ msgstr "옳지 않은 메신저 계정 입니다." #: actions/emailsettings.php:438 #, fuzzy msgid "Email confirmation cancelled." -msgstr "인증 취소" +msgstr "취소 할 대기중인 인증이 없습니다." #. TRANS: Message given trying to remove an e-mail address that is not #. TRANS: registered for the active user. #: actions/emailsettings.php:458 msgid "That is not your email address." -msgstr "그 이메일 주소는 귀하의 것이 아닙니다." +msgstr "그 메일 주소는 귀하의 것이 아닙니다." #. TRANS: Message given after successfully removing a registered e-mail address. #: actions/emailsettings.php:479 -#, fuzzy msgid "The email address was removed." -msgstr "주소가 삭제되었습니다." +msgstr "메일 주소를 지웠습니다." #: actions/emailsettings.php:493 actions/smssettings.php:568 msgid "No incoming email address." -msgstr "이메일 주소가 없습니다." +msgstr "받는 메일 주소가 없습니다." #. TRANS: Server error thrown on database error removing incoming e-mail address. #. TRANS: Server error thrown on database error adding incoming e-mail address. @@ -1603,12 +1589,12 @@ msgstr "사용자 기록을 업데이트 할 수 없습니다." #. TRANS: Message given after successfully removing an incoming e-mail address. #: actions/emailsettings.php:508 actions/smssettings.php:581 msgid "Incoming email address removed." -msgstr "받은 이메일 계정 삭제" +msgstr "받는 메일 주소를 지웠습니다." #. TRANS: Message given after successfully adding an incoming e-mail address. #: actions/emailsettings.php:532 actions/smssettings.php:605 msgid "New incoming email address added." -msgstr "새로운 이메일 주소가 추가 되었습니다." +msgstr "새로운 받는 메일 주소를 추가했습니다." #: actions/favor.php:79 msgid "This notice is already a favorite!" @@ -1653,7 +1639,7 @@ msgstr "" #: lib/personalgroupnav.php:115 #, php-format msgid "%s's favorite notices" -msgstr "%s 님의 좋아하는 글들" +msgstr "%s 님의 좋아하는 글" #: actions/favoritesrss.php:115 #, fuzzy, php-format @@ -1671,19 +1657,19 @@ msgid "Featured users, page %d" msgstr "인기있는 회원, %d페이지" #: actions/featured.php:99 -#, fuzzy, php-format +#, php-format msgid "A selection of some great users on %s" -msgstr "%s의 훌륭한 회원의 일부 선택" +msgstr "" #: actions/file.php:34 #, fuzzy msgid "No notice ID." -msgstr "새로운 통지" +msgstr "그러한 통지는 없습니다." #: actions/file.php:38 #, fuzzy msgid "No notice." -msgstr "새로운 통지" +msgstr "그러한 통지는 없습니다." #: actions/file.php:42 msgid "No attachments." @@ -1692,16 +1678,15 @@ msgstr "첨부문서 없음" #: actions/file.php:51 #, fuzzy msgid "No uploaded attachments." -msgstr "그러한 문서는 없습니다." +msgstr "첨부문서 없음" #: actions/finishremotesubscribe.php:69 msgid "Not expecting this response!" msgstr "예상치 못한 반응 입니다." #: actions/finishremotesubscribe.php:80 -#, fuzzy msgid "User being listened to does not exist." -msgstr "살펴 보고 있는 사용자가 없습니다." +msgstr "" #: actions/finishremotesubscribe.php:87 actions/remotesubscribe.php:59 msgid "You can use the local subscription!" @@ -1709,22 +1694,20 @@ msgstr "당신은 로컬 구독을 사용할 수 있습니다." #: actions/finishremotesubscribe.php:99 msgid "That user has blocked you from subscribing." -msgstr "이 회원은 구독으로부터 당신을 차단해왔다." +msgstr "이 사용자는 귀하의 구독을 차단했습니다." #: actions/finishremotesubscribe.php:110 #, fuzzy msgid "You are not authorized." -msgstr "인증이 되지 않았습니다." +msgstr "당신은 이 프로필에 구독되지 않고있습니다." #: actions/finishremotesubscribe.php:113 -#, fuzzy msgid "Could not convert request token to access token." -msgstr "리퀘스트 토큰을 엑세스 토큰으로 변환 할 수 없습니다." +msgstr "" #: actions/finishremotesubscribe.php:118 -#, fuzzy msgid "Remote service uses unknown version of OMB protocol." -msgstr "OMB 프로토콜의 알려지지 않은 버전" +msgstr "" #: actions/finishremotesubscribe.php:138 #, fuzzy @@ -1751,12 +1734,12 @@ msgstr "" #: actions/grantrole.php:75 #, fuzzy msgid "You cannot grant user roles on this site." -msgstr "당신은 이 사용자에게 메시지를 보낼 수 없습니다." +msgstr "이 사이트의 이용자에 대해 권한정지 할 수 없습니다." #: actions/grantrole.php:82 #, fuzzy msgid "User already has this role." -msgstr "회원이 당신을 차단해왔습니다." +msgstr "이용자가 프로필을 가지고 있지 않습니다." #: actions/groupblock.php:71 actions/groupunblock.php:71 #: actions/makeadmin.php:71 actions/subedit.php:46 @@ -1783,7 +1766,7 @@ msgstr "" #: actions/groupblock.php:95 #, fuzzy msgid "User is already blocked from group." -msgstr "회원이 당신을 차단해왔습니다." +msgstr "사용자가 귀하를 차단했습니다." #: actions/groupblock.php:100 #, fuzzy @@ -1793,34 +1776,36 @@ msgstr "당신은 해당 그룹의 멤버가 아닙니다." #: actions/groupblock.php:134 actions/groupmembers.php:360 #, fuzzy msgid "Block user from group" -msgstr "사용자를 차단합니다." +msgstr "그룹 이용자는 차단해제" #: actions/groupblock.php:160 -#, php-format +#, fuzzy, php-format msgid "" "Are you sure you want to block user \"%1$s\" from the group \"%2$s\"? They " "will be removed from the group, unable to post, and unable to subscribe to " "the group in the future." msgstr "" +"정말 이용자를 차단하시겠습니까? 차단된 이용자는 구독해제되고, 이후 당신을 구" +"독할 수 없으며, 차단된 이용자로부터 @-답장의 통보를 받지 않게 됩니다." #. TRANS: Submit button title for 'No' when blocking a user from a group. #: actions/groupblock.php:182 #, fuzzy msgid "Do not block this user from this group" -msgstr "이 그룹의 회원리스트" +msgstr "이용자를 차단하지 않는다." #. TRANS: Submit button title for 'Yes' when blocking a user from a group. #: actions/groupblock.php:189 #, fuzzy msgid "Block this user from this group" -msgstr "이 그룹의 회원리스트" +msgstr "그룹 이용자는 차단해제" #: actions/groupblock.php:206 +#, fuzzy msgid "Database error blocking user from group." -msgstr "" +msgstr "그룹 이용자는 차단해제" #: actions/groupbyid.php:74 actions/userbyid.php:70 -#, fuzzy msgid "No ID." msgstr "ID가 없습니다." @@ -1832,7 +1817,7 @@ msgstr "그룹을 만들기 위해서는 로그인해야 합니다." #: actions/groupdesignsettings.php:144 #, fuzzy msgid "Group design" -msgstr "그룹" +msgstr "프로필 디자인" #: actions/groupdesignsettings.php:155 msgid "" @@ -1848,7 +1833,7 @@ msgstr "디자인을 수정할 수 없습니다." #: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 #, fuzzy msgid "Design preferences saved." -msgstr "싱크설정이 저장되었습니다." +msgstr "메일 설정이 저장되었습니다." #: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" @@ -1858,7 +1843,8 @@ msgstr "그룹 로고" #, fuzzy, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." -msgstr "당신그룹의 로고 이미지를 업로드할 수 있습니다." +msgstr "" +"사이트의 배경 이미지를 업로드할 수 있습니다. 최대 파일 크기는 %1$s 입니다." #: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." @@ -1880,7 +1866,7 @@ msgstr "%s 그룹 회원" #: actions/groupmembers.php:103 #, fuzzy, php-format msgid "%1$s group members, page %2$d" -msgstr "%s 그룹 회원, %d페이지" +msgstr "%s 그룹 회원" #: actions/groupmembers.php:118 msgid "A list of the users in this group." @@ -1953,8 +1939,8 @@ msgid "" "Search for groups on %%site.name%% by their name, location, or description. " "Separate the terms by spaces; they must be 3 characters or more." msgstr "" -"%%site.name%% 의 사람을 이름, 장소, 흥미로 검색. 검색어는 스페이스 구분한다; " -"적어도 3글자 이상 필요." +"%%site.name%%의 사람을 이름, 장소, 관심 거리로 검색합니다. 검색어는 공백으로 " +"구분하고, 적어도 3글자 이상 필요합니다." #: actions/groupsearch.php:58 msgid "Group search" @@ -1962,7 +1948,6 @@ msgstr "그룹 찾기" #: actions/groupsearch.php:79 actions/noticesearch.php:117 #: actions/peoplesearch.php:83 -#, fuzzy msgid "No results." msgstr "결과 없음" @@ -1987,7 +1972,7 @@ msgstr "" #: actions/groupunblock.php:95 #, fuzzy msgid "User is not blocked from group." -msgstr "회원이 당신을 차단해왔습니다." +msgstr "그룹 이용자는 차단해제" #: actions/groupunblock.php:128 actions/unblock.php:86 msgid "Error removing the block." @@ -1997,7 +1982,7 @@ msgstr "차단 제거 에러!" #: actions/imsettings.php:60 #, fuzzy msgid "IM settings" -msgstr "메신저 설정" +msgstr "메일 설정" #. TRANS: Instant messaging settings page instructions. #. TRANS: [instant messages] is link text, "(%%doc.im%%)" is the link. @@ -2021,7 +2006,7 @@ msgstr "인스턴트 메신저를 사용할 수 없습니다." #: actions/imsettings.php:106 actions/imsettings.php:136 #, fuzzy msgid "IM address" -msgstr "메신저 주소" +msgstr "SMS 주소" #: actions/imsettings.php:113 msgid "Current confirmed Jabber/GTalk address." @@ -2053,7 +2038,7 @@ msgstr "" #: actions/imsettings.php:155 #, fuzzy msgid "IM preferences" -msgstr "설정" +msgstr "메일 설정" #. TRANS: Checkbox label in IM preferences form. #: actions/imsettings.php:160 @@ -2124,15 +2109,14 @@ msgstr "옳지 않은 메신저 계정 입니다." #. TRANS: Server error thrown on database error canceling IM address confirmation. #: actions/imsettings.php:397 -#, fuzzy msgid "Couldn't delete IM confirmation." -msgstr "이메일 승인을 삭제 할 수 없습니다." +msgstr "메신저 승인을 삭제 할 수 없습니다." #. TRANS: Message given after successfully canceling IM address confirmation. #: actions/imsettings.php:402 #, fuzzy msgid "IM confirmation cancelled." -msgstr "인증 취소" +msgstr "확인 코드가 없습니다." #. TRANS: Message given trying to remove an IM address that is not #. TRANS: registered for the active user. @@ -2144,7 +2128,7 @@ msgstr "그 Jabber ID는 귀하의 것이 아닙니다." #: actions/imsettings.php:447 #, fuzzy msgid "The IM address was removed." -msgstr "주소가 삭제되었습니다." +msgstr "메일 주소를 지웠습니다." #: actions/inbox.php:59 #, fuzzy, php-format @@ -2167,12 +2151,12 @@ msgstr "" #: actions/invite.php:41 #, fuzzy, php-format msgid "You must be logged in to invite other users to use %s." -msgstr "로그인을 해야 다른 사용자를 %s에 초대할 수 있습니다." +msgstr "그룹가입을 위해서는 로그인이 필요합니다." #: actions/invite.php:72 #, php-format msgid "Invalid email address: %s" -msgstr "옳지 않은 이메일 주소 : %s" +msgstr "올바르지 않은 메일 주소 : %s" #: actions/invite.php:110 msgid "Invitation(s) sent" @@ -2217,15 +2201,15 @@ msgstr "다음 양식을 이용해 친구와 동료를 이 서비스에 초대 #: actions/invite.php:187 msgid "Email addresses" -msgstr "이메일 주소" +msgstr "메일 주소" #: actions/invite.php:189 msgid "Addresses of friends to invite (one per line)" -msgstr "초청할 친구들의 주소 (한 줄에 한 명씩)" +msgstr "초청할 친구 주소 (한 줄에 한 명씩)" #: actions/invite.php:192 msgid "Personal message" -msgstr "개인적인 메시지" +msgstr "개인 메시지" #: actions/invite.php:194 msgid "Optionally add a personal message to the invitation." @@ -2233,7 +2217,6 @@ msgstr "초대장에 메시지 첨부하기." #. TRANS: Send button for inviting friends #: actions/invite.php:198 -#, fuzzy msgctxt "BUTTON" msgid "Send" msgstr "보내기" @@ -2309,9 +2292,9 @@ msgstr "별명이 없습니다." #. TRANS: Message given having added a user to a group. #. TRANS: %1$s is the nickname of the user, %2$s is the nickname of the group. #: actions/joingroup.php:141 lib/command.php:346 -#, fuzzy, php-format +#, php-format msgid "%1$s joined group %2$s" -msgstr "%s 는 그룹 %s에 가입했습니다." +msgstr "" #: actions/leavegroup.php:60 msgid "You must be logged in to leave a group." @@ -2326,7 +2309,7 @@ msgstr "당신은 해당 그룹의 멤버가 아닙니다." #: actions/leavegroup.php:137 lib/command.php:392 #, fuzzy, php-format msgid "%1$s left group %2$s" -msgstr "%s가 그룹%s를 떠났습니다." +msgstr "%1$s의 상태 (%2$s에서)" #: actions/login.php:102 actions/otp.php:62 actions/register.php:144 msgid "Already logged in." @@ -2337,9 +2320,8 @@ msgid "Incorrect username or password." msgstr "틀린 계정 또는 비밀 번호" #: actions/login.php:154 actions/otp.php:120 -#, fuzzy msgid "Error setting user. You are probably not authorized." -msgstr "인증이 되지 않았습니다." +msgstr "" #: actions/login.php:210 actions/login.php:263 lib/logingroupnav.php:79 msgid "Login" @@ -2374,37 +2356,34 @@ msgid "Login with your username and password." msgstr "사용자 이름과 비밀번호로 로그인" #: actions/login.php:295 -#, fuzzy, php-format +#, php-format msgid "" "Don't have a username yet? [Register](%%action.register%%) a new account." msgstr "" -"귀하의 계정과 비밀 번호로 로그인 하세요. 계정이 아직 없으세요? [가입](%%" -"action.register%%) 새 계정을 생성 또는 [OpenID](%%action.openidlogin%%)를 사" -"용해 보세요." #: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "" #: actions/makeadmin.php:96 -#, fuzzy, php-format +#, php-format msgid "%1$s is already an admin for group \"%2$s\"." -msgstr "회원이 당신을 차단해왔습니다." +msgstr "" #: actions/makeadmin.php:133 -#, fuzzy, php-format +#, php-format msgid "Can't get membership record for %1$s in group %2$s." -msgstr "그룹 %s에서 %s 사용자를 제거할 수 없습니다." +msgstr "" #: actions/makeadmin.php:146 #, fuzzy, php-format msgid "Can't make %1$s an admin for group %2$s." -msgstr "관리자만 그룹을 편집할 수 있습니다." +msgstr "이용자 %1$s 의 그룹 %2$s 가입에 실패했습니다." #: actions/microsummary.php:69 #, fuzzy msgid "No current status." -msgstr "현재 상태가 없습니다." +msgstr "결과 없음" #: actions/newapplication.php:52 msgid "New Application" @@ -2413,7 +2392,7 @@ msgstr "신규 응용 프로그램" #: actions/newapplication.php:64 #, fuzzy msgid "You must be logged in to register an application." -msgstr "그룹을 만들기 위해서는 로그인해야 합니다." +msgstr "응용 프로그램 수정을 위해서는 로그인해야 합니다." #: actions/newapplication.php:143 #, fuzzy @@ -2421,13 +2400,14 @@ msgid "Use this form to register a new application." msgstr "새 그룹을 만들기 위해 이 양식을 사용하세요." #: actions/newapplication.php:176 +#, fuzzy msgid "Source URL is required." -msgstr "" +msgstr "소스 코드 URL" #: actions/newapplication.php:258 actions/newapplication.php:267 #, fuzzy msgid "Could not create application." -msgstr "좋아하는 게시글을 생성할 수 없습니다." +msgstr "관심소식을 생성할 수 없습니다." #: actions/newgroup.php:53 msgid "New group" @@ -2461,9 +2441,8 @@ msgstr "" "자신에게 메시지를 보내지 마세요. 대신 조용하게 스스로에게 그것을 말하세요;;" #: actions/newmessage.php:181 -#, fuzzy msgid "Message sent" -msgstr "메시지" +msgstr "쪽지가 전송되었습니다." #: actions/newmessage.php:185 #, fuzzy, php-format @@ -2488,8 +2467,8 @@ msgid "" "Search for notices on %%site.name%% by their contents. Separate search terms " "by spaces; they must be 3 characters or more." msgstr "" -"%%site.name%% 의 통지를 내용으로부터 검색. 검색어는 스페이스로 구분한다; 적어" -"도 3글자 이상 필요." +"%%site.name%%의 글 내용을 검색합니다. 검색어는 공백으로 구분하고, 적어도 3글" +"자 이상 필요합니다." #: actions/noticesearch.php:78 msgid "Text search" @@ -2498,7 +2477,7 @@ msgstr "문자 검색" #: actions/noticesearch.php:91 #, fuzzy, php-format msgid "Search results for \"%1$s\" on %2$s" -msgstr "스트림에서 \"%s\" 검색" +msgstr "%1$s에서 %2$s까지 메시지" #: actions/noticesearch.php:121 #, php-format @@ -2515,21 +2494,19 @@ msgid "" msgstr "" #: actions/noticesearchrss.php:96 -#, fuzzy, php-format +#, php-format msgid "Updates with \"%s\"" -msgstr "%2$s에 있는 %1$s의 업데이트!" +msgstr "" #: actions/noticesearchrss.php:98 #, fuzzy, php-format msgid "Updates matching search term \"%1$s\" on %2$s!" -msgstr "\"%s\" 에 일치하는 모든 업데이트" +msgstr "%2$s에 있는 %1$s의 업데이트!" #: actions/nudge.php:85 -#, fuzzy msgid "" "This user doesn't allow nudges or hasn't confirmed or set their email yet." msgstr "" -"이 사용자는 nudge를 허용하지 않았고, 아직 그의 이메일을 인증하지 않았습니다." #: actions/nudge.php:94 msgid "Nudge sent" @@ -2542,25 +2519,26 @@ msgstr "찔러 보기를 보냈습니다!" #: actions/oauthappssettings.php:59 #, fuzzy msgid "You must be logged in to list your applications." -msgstr "그룹을 만들기 위해서는 로그인해야 합니다." +msgstr "응용 프로그램 수정을 위해서는 로그인해야 합니다." #: actions/oauthappssettings.php:74 #, fuzzy msgid "OAuth applications" -msgstr "다른 옵션들" +msgstr "응용프로그램 삭제" #: actions/oauthappssettings.php:85 msgid "Applications you have registered" msgstr "" #: actions/oauthappssettings.php:135 -#, php-format +#, fuzzy, php-format msgid "You have not registered any applications yet." -msgstr "" +msgstr "응용 프로그램 수정을 위해서는 로그인해야 합니다." #: actions/oauthconnectionssettings.php:72 +#, fuzzy msgid "Connected applications" -msgstr "" +msgstr "응용프로그램 삭제" #: actions/oauthconnectionssettings.php:83 msgid "You have allowed the following applications to access you account." @@ -2577,8 +2555,9 @@ msgid "Unable to revoke access for app: %s." msgstr "" #: actions/oauthconnectionssettings.php:198 +#, fuzzy msgid "You have not authorized any applications to use your account." -msgstr "" +msgstr "다음 응용 프로그램이 계정에 접근하도록 허용되어 있습니다." #: actions/oauthconnectionssettings.php:211 msgid "Developers can edit the registration settings for their applications " @@ -2587,7 +2566,7 @@ msgstr "" #: actions/oembed.php:80 actions/shownotice.php:100 #, fuzzy msgid "Notice has no profile." -msgstr "통지에 프로필이 없습니다." +msgstr "이용자가 프로필을 가지고 있지 않습니다." #: actions/oembed.php:87 actions/shownotice.php:175 #, php-format @@ -2596,9 +2575,9 @@ msgstr "%1$s의 상태 (%2$s에서)" #. TRANS: Error message displaying attachments. %s is a raw MIME type (eg 'image/png') #: actions/oembed.php:159 -#, fuzzy, php-format +#, php-format msgid "Content type %s not supported." -msgstr "연결" +msgstr "" #. TRANS: Error message displaying attachments. %s is the site's base URL. #: actions/oembed.php:163 @@ -2623,11 +2602,11 @@ msgstr "통지 검색" #: actions/othersettings.php:60 #, fuzzy msgid "Other settings" -msgstr "기타 설정" +msgstr "아바타 설정" #: actions/othersettings.php:71 msgid "Manage various other options." -msgstr "다양한 다른 옵션관리" +msgstr "여러가지 기타 옵션을 관리합니다." #: actions/othersettings.php:108 msgid " (free service)" @@ -2635,20 +2614,20 @@ msgstr "" #: actions/othersettings.php:116 msgid "Shorten URLs with" -msgstr "" +msgstr "URL 줄이기 기능" #: actions/othersettings.php:117 msgid "Automatic shortening service to use." -msgstr "사용할 URL 자동 줄이기 서비스" +msgstr "사용할 URL 자동 줄이기 서비스." #: actions/othersettings.php:122 -#, fuzzy msgid "View profile designs" -msgstr "프로필 세팅" +msgstr "프로필 디자인 보기" #: actions/othersettings.php:123 +#, fuzzy msgid "Show or hide profile designs." -msgstr "" +msgstr "프로필 디자인 보기" #: actions/othersettings.php:153 msgid "URL shortening service is too long (max 50 chars)." @@ -2667,12 +2646,11 @@ msgstr "프로필을 지정하지 않았습니다." #: actions/otp.php:90 #, fuzzy msgid "No login token requested." -msgstr "요청한 프로필id가 없습니다." +msgstr "허용되지 않는 요청입니다." #: actions/otp.php:95 -#, fuzzy msgid "Invalid login token specified." -msgstr "옳지 않은 통지 내용" +msgstr "" #: actions/otp.php:104 #, fuzzy @@ -2728,7 +2706,7 @@ msgstr "위와 같은 비밀 번호" #: actions/passwordsettings.php:117 msgid "Change" -msgstr "변환" +msgstr "변경" #: actions/passwordsettings.php:154 actions/register.php:237 msgid "Password must be 6 or more characters." @@ -2756,32 +2734,34 @@ msgstr "비밀 번호 저장" #. TRANS: Menu item for site administration #: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:384 +#, fuzzy msgid "Paths" -msgstr "" +msgstr "경로" #: actions/pathsadminpanel.php:70 +#, fuzzy msgid "Path and server settings for this StatusNet site." -msgstr "" +msgstr "이 StatusNet 사이트에 대한 디자인 설정" #: actions/pathsadminpanel.php:157 -#, fuzzy, php-format +#, php-format msgid "Theme directory not readable: %s." -msgstr "이 페이지는 귀하가 승인한 미디어 타입에서는 이용할 수 없습니다." +msgstr "" #: actions/pathsadminpanel.php:163 -#, fuzzy, php-format +#, php-format msgid "Avatar directory not writable: %s." -msgstr "아바타 디렉토리에 쓸 수 없습니다 : %s" +msgstr "" #: actions/pathsadminpanel.php:169 -#, fuzzy, php-format +#, php-format msgid "Background directory not writable: %s." -msgstr "아바타 디렉토리에 쓸 수 없습니다 : %s" +msgstr "" #: actions/pathsadminpanel.php:177 -#, fuzzy, php-format +#, php-format msgid "Locales directory not readable: %s." -msgstr "이 페이지는 귀하가 승인한 미디어 타입에서는 이용할 수 없습니다." +msgstr "" #: actions/pathsadminpanel.php:183 msgid "Invalid SSL server. The maximum length is 255 characters." @@ -2790,12 +2770,12 @@ msgstr "" #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 #, fuzzy msgid "Site" -msgstr "초대" +msgstr "사이트" #: actions/pathsadminpanel.php:238 #, fuzzy msgid "Server" -msgstr "복구" +msgstr "SSL 서버" #: actions/pathsadminpanel.php:238 msgid "Site's server hostname." @@ -2803,12 +2783,12 @@ msgstr "" #: actions/pathsadminpanel.php:242 msgid "Path" -msgstr "" +msgstr "경로" #: actions/pathsadminpanel.php:242 #, fuzzy msgid "Site path" -msgstr "사이트 공지" +msgstr "사이트 테마" #: actions/pathsadminpanel.php:246 msgid "Path to locales" @@ -2831,12 +2811,14 @@ msgid "Theme" msgstr "테마" #: actions/pathsadminpanel.php:264 +#, fuzzy msgid "Theme server" -msgstr "" +msgstr "SSL 서버" #: actions/pathsadminpanel.php:268 +#, fuzzy msgid "Theme path" -msgstr "" +msgstr "테마" #: actions/pathsadminpanel.php:272 msgid "Theme directory" @@ -2860,28 +2842,31 @@ msgstr "아바타가 업데이트 되었습니다." #: actions/pathsadminpanel.php:292 #, fuzzy msgid "Avatar directory" -msgstr "아바타가 업데이트 되었습니다." +msgstr "아바타가 삭제되었습니다." #: actions/pathsadminpanel.php:301 +#, fuzzy msgid "Backgrounds" -msgstr "" +msgstr "배경" #: actions/pathsadminpanel.php:305 +#, fuzzy msgid "Background server" -msgstr "" +msgstr "배경" #: actions/pathsadminpanel.php:309 +#, fuzzy msgid "Background path" -msgstr "" +msgstr "배경" #: actions/pathsadminpanel.php:313 +#, fuzzy msgid "Background directory" -msgstr "" +msgstr "배경" #: actions/pathsadminpanel.php:320 -#, fuzzy msgid "SSL" -msgstr "SMS" +msgstr "SSL" #: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202 #, fuzzy @@ -2906,18 +2891,16 @@ msgid "When to use SSL" msgstr "" #: actions/pathsadminpanel.php:335 -#, fuzzy msgid "SSL server" -msgstr "복구" +msgstr "SSL 서버" #: actions/pathsadminpanel.php:336 msgid "Server to direct SSL requests to" msgstr "" #: actions/pathsadminpanel.php:352 -#, fuzzy msgid "Save paths" -msgstr "사이트 공지" +msgstr "" #: actions/peoplesearch.php:52 #, php-format @@ -2925,8 +2908,8 @@ msgid "" "Search for people on %%site.name%% by their name, location, or interests. " "Separate the terms by spaces; they must be 3 characters or more." msgstr "" -"%%site.name%% 의 사람을 이름, 장소, 흥미로 검색. 검색어는 스페이스 구분한다; " -"적어도 3글자 이상 필요." +"%%site.name%%의 사람을 이름, 장소, 관심 거리로 검색합니다. 검색어는 공백으로 " +"구분하고, 적어도 3글자 이상 필요합니다." #: actions/peoplesearch.php:58 msgid "People search" @@ -2935,17 +2918,17 @@ msgstr "사람 찾기" #: actions/peopletag.php:68 #, fuzzy, php-format msgid "Not a valid people tag: %s." -msgstr "유효한 태그가 아닙니다: %s" +msgstr "올바른 메일 주소가 아닙니다." #: actions/peopletag.php:142 -#, fuzzy, php-format +#, php-format msgid "Users self-tagged with %1$s - page %2$d" -msgstr "이용자 셀프 테크 %s - %d 페이지" +msgstr "" #: actions/postnotice.php:95 #, fuzzy msgid "Invalid notice content." -msgstr "옳지 않은 통지 내용" +msgstr "옳지 않은 크기" #: actions/postnotice.php:101 #, php-format @@ -2954,7 +2937,7 @@ msgstr "" #: actions/profilesettings.php:60 msgid "Profile settings" -msgstr "프로필 세팅" +msgstr "프로필 설정" #: actions/profilesettings.php:71 msgid "" @@ -2988,14 +2971,13 @@ msgid "URL of your homepage, blog, or profile on another site" msgstr "귀하의 홈페이지, 블로그 혹은 다른 사이트의 프로필 페이지 URL" #: actions/profilesettings.php:122 actions/register.php:468 -#, fuzzy, php-format +#, php-format msgid "Describe yourself and your interests in %d chars" -msgstr "140자 이내에서 자기 소개" +msgstr "" #: actions/profilesettings.php:125 actions/register.php:471 -#, fuzzy msgid "Describe yourself and your interests" -msgstr "당신에 대해 소개해주세요." +msgstr "" #: actions/profilesettings.php:127 actions/register.php:473 msgid "Bio" @@ -3010,7 +2992,7 @@ msgstr "위치" #: actions/profilesettings.php:134 actions/register.php:480 msgid "Where you are, like \"City, State (or Region), Country\"" -msgstr "당신은 어디에 삽니까? \"시, 도 (or 군,구), 나라" +msgstr "당신은 어디에 삽니까? \"시, 도 (or 군,구), 나라\"" #: actions/profilesettings.php:138 msgid "Share my current location when posting notices" @@ -3037,11 +3019,11 @@ msgstr "언어 설정" #: actions/profilesettings.php:161 msgid "Timezone" -msgstr "타임존" +msgstr "시간대" #: actions/profilesettings.php:162 msgid "What timezone are you normally in?" -msgstr "당신이 주로 생활하는 곳이 어떤 타임존입니까?" +msgstr "주로 생활하는 곳이 어느 시간대입니까?" #: actions/profilesettings.php:167 msgid "" @@ -3051,7 +3033,7 @@ msgstr "나에게 구독하는 사람에게 자동 구독 신청" #: actions/profilesettings.php:228 actions/register.php:230 #, fuzzy, php-format msgid "Bio is too long (max %d chars)." -msgstr "자기소개가 너무 깁니다. (최대 140글자)" +msgstr "설명이 너무 깁니다. (최대 %d 글자)" #: actions/profilesettings.php:235 actions/siteadminpanel.php:151 msgid "Timezone not selected." @@ -3064,7 +3046,7 @@ msgstr "언어가 너무 깁니다. (최대 50글자)" #: actions/profilesettings.php:253 actions/tagother.php:178 #, php-format msgid "Invalid tag: \"%s\"" -msgstr "유효하지 않은태그: \"%s\"" +msgstr "올바르지 않은 태그: \"%s\"" #: actions/profilesettings.php:306 msgid "Couldn't update user for autosubscribe." @@ -3107,19 +3089,16 @@ msgid "Public timeline" msgstr "퍼블릭 타임라인" #: actions/public.php:160 -#, fuzzy msgid "Public Stream Feed (RSS 1.0)" -msgstr "퍼블릭 스트림 피드" +msgstr "" #: actions/public.php:164 -#, fuzzy msgid "Public Stream Feed (RSS 2.0)" -msgstr "퍼블릭 스트림 피드" +msgstr "" #: actions/public.php:168 -#, fuzzy msgid "Public Stream Feed (Atom)" -msgstr "퍼블릭 스트림 피드" +msgstr "" #: actions/public.php:188 #, php-format @@ -3130,8 +3109,9 @@ msgstr "" "%%site.name%% 의 공개 타임라인이지만, 아직 아무도 글을 쓰지 않았습니다." #: actions/public.php:191 +#, fuzzy msgid "Be the first to post!" -msgstr "" +msgstr "글을 올린 첫번째 사람이 되세요!" #: actions/public.php:195 #, php-format @@ -3149,14 +3129,12 @@ msgid "" msgstr "" #: actions/public.php:247 -#, fuzzy, php-format +#, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" "blogging) service based on the Free Software [StatusNet](http://status.net/) " "tool." msgstr "" -"%%site.name%% 는 마이크로블로깅(http://en.wikipedia.org/wiki/Micro-blogging) " -"서비스 입니다." #: actions/publictagcloud.php:57 msgid "Public tag cloud" @@ -3216,22 +3194,25 @@ msgid "Could not update user with confirmed email address." msgstr "이 이메일 주소로 사용자를 업데이트 할 수 없습니다." #: actions/recoverpassword.php:152 +#, fuzzy msgid "" "If you have forgotten or lost your password, you can get a new one sent to " "the email address you have stored in your account." -msgstr "" +msgstr "가입하신 이메일로 비밀 번호 재발급에 관한 안내를 보냈습니다." #: actions/recoverpassword.php:158 msgid "You have been identified. Enter a new password below. " msgstr "" #: actions/recoverpassword.php:188 +#, fuzzy msgid "Password recovery" -msgstr "" +msgstr "비밀 번호 복구가 요청되었습니다." #: actions/recoverpassword.php:191 +#, fuzzy msgid "Nickname or email address" -msgstr "" +msgstr "별명이나 이메일 계정을 입력하십시오." #: actions/recoverpassword.php:193 msgid "Your nickname on this server, or your registered email address." @@ -3323,7 +3304,7 @@ msgstr "회원 가입이 성공적입니다." #: actions/register.php:121 actions/register.php:506 lib/logingroupnav.php:85 msgid "Register" -msgstr "회원가입" +msgstr "등록" #: actions/register.php:142 msgid "Registration not allowed." @@ -3376,10 +3357,10 @@ msgid "Longer name, preferably your \"real\" name" msgstr "더욱 긴 이름을 요구합니다." #: actions/register.php:518 -#, php-format +#, fuzzy, php-format msgid "" "I understand that content and data of %1$s are private and confidential." -msgstr "" +msgstr "%1$s의 컨텐츠와 데이터는 외부 유출을 금지합니다." #: actions/register.php:528 #, php-format @@ -3398,14 +3379,14 @@ msgstr "" #. TRANS: Copyright checkbox label in registration dialog, for Creative Commons-style licenses. #: actions/register.php:540 -#, fuzzy, php-format +#, php-format msgid "" "My text and files are available under %s except this private data: password, " "email address, IM address, and phone number." -msgstr "다음 개인정보 제외: 비밀 번호, 메일 주소, 메신저 주소, 전화 번호" +msgstr "" #: actions/register.php:583 -#, fuzzy, php-format +#, php-format msgid "" "Congratulations, %1$s! And welcome to %%%%site.name%%%%. From here, you may " "want to...\n" @@ -3422,20 +3403,6 @@ msgid "" "\n" "Thanks for signing up and we hope you enjoy using this service." msgstr "" -"%s님 축하드립니다! %%%%site.name%%%%에 가입하신 것을 환영합니다!. 이제부터 아" -"래의 일을 할 수 있습니다...\n" -"\n" -"* [나의 프로필](%s) 로 가셔서 첫 메시지를 포스트 해보십시오.\n" -"* [Jabber 또는 GTalk계정](%%%%action.imsettings%%%%)을 추가하셔서 메신저로 통" -"보를 받아 보십시오.\n" -"* [친구 찾기](%%%%action.peoplesearch%%%%) 알거나 같은 관심사를 가지고 있는 " -"분들을 찾아 보십시오. \n" -"* [프로필 셋팅](%%%%action.profilesettings%%%%)을 업데이트 하셔서 다른분들에" -"게 자신을 알려보십시오. \n" -"* [온라인 도움말](%%%%doc.help%%%%)을 읽으면서 더 많은 기능을 확인해 보십시" -"오. \n" -"\n" -"다시 한번 가입하신 것을 환영하면서 즐거운 서비스가 되셨으면 합니다." #: actions/register.php:607 msgid "" @@ -3491,19 +3458,16 @@ msgid "Invalid profile URL (bad format)" msgstr "옳지 않은 프로필 URL (나쁜 포멧)" #: actions/remotesubscribe.php:168 -#, fuzzy msgid "Not a valid profile URL (no YADIS document or invalid XRDS defined)." -msgstr "유효한 프로필 URL이 아닙니다. (YADIS 문서가 없습니다)" +msgstr "" #: actions/remotesubscribe.php:176 -#, fuzzy msgid "That’s a local profile! Login to subscribe." -msgstr "그것은 로컬프로필입니다. 구독을 위해서는 로그인하십시오." +msgstr "" #: actions/remotesubscribe.php:183 -#, fuzzy msgid "Couldn’t get a request token." -msgstr "리퀘스트 토큰을 취득 할 수 없습니다." +msgstr "" #: actions/repeat.php:57 #, fuzzy @@ -3522,9 +3486,9 @@ msgstr "자신의 글은 재전송할 수 없습니다." #: actions/repeat.php:90 #, fuzzy msgid "You already repeated that notice." -msgstr "당신은 이미 이 사용자를 차단하고 있습니다." +msgstr "이미 재전송된 소식입니다." -#: actions/repeat.php:114 lib/noticelist.php:675 +#: actions/repeat.php:114 lib/noticelist.php:676 msgid "Repeated" msgstr "재전송됨" @@ -3541,7 +3505,7 @@ msgstr "%s에 답신" #: actions/replies.php:128 #, fuzzy, php-format msgid "Replies to %1$s, page %2$d" -msgstr "%2$s에서 %1$s까지 메시지" +msgstr "%s에 답신" #: actions/replies.php:145 #, fuzzy, php-format @@ -3587,36 +3551,36 @@ msgstr "%2$s에서 %1$s까지 메시지" #: actions/revokerole.php:75 #, fuzzy msgid "You cannot revoke user roles on this site." -msgstr "당신은 이 사용자에게 메시지를 보낼 수 없습니다." +msgstr "이 사이트의 이용자에 대해 권한정지 할 수 없습니다." #: actions/revokerole.php:82 -#, fuzzy msgid "User doesn't have this role." -msgstr "프로필 매칭이 없는 사용자" +msgstr "" #: actions/rsd.php:146 actions/version.php:159 #, fuzzy msgid "StatusNet" -msgstr "아바타가 업데이트 되었습니다." +msgstr "StatusNet %s" #: actions/sandbox.php:65 actions/unsandbox.php:65 msgid "You cannot sandbox users on this site." msgstr "이 사이트의 이용자에 대해 권한정지 할 수 없습니다." #: actions/sandbox.php:72 -#, fuzzy msgid "User is already sandboxed." -msgstr "회원이 당신을 차단해왔습니다." +msgstr "" #. TRANS: Menu item for site administration #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 #: lib/adminpanelaction.php:392 +#, fuzzy msgid "Sessions" -msgstr "" +msgstr "버전" #: actions/sessionsadminpanel.php:65 +#, fuzzy msgid "Session settings for this StatusNet site." -msgstr "" +msgstr "이 StatusNet 사이트에 대한 디자인 설정" #: actions/sessionsadminpanel.php:175 msgid "Handle sessions" @@ -3638,17 +3602,17 @@ msgstr "" #: actions/useradminpanel.php:294 #, fuzzy msgid "Save site settings" -msgstr "아바타 설정" +msgstr "접근 설정을 저장" #: actions/showapplication.php:82 #, fuzzy msgid "You must be logged in to view an application." -msgstr "그룹을 떠나기 위해서는 로그인해야 합니다." +msgstr "응용 프로그램 수정을 위해서는 로그인해야 합니다." #: actions/showapplication.php:157 #, fuzzy msgid "Application profile" -msgstr "통지에 프로필이 없습니다." +msgstr "신규 응용 프로그램" #. TRANS: Form input field label for application icon. #: actions/showapplication.php:159 lib/applicationeditform.php:182 @@ -3658,9 +3622,8 @@ msgstr "" #. TRANS: Form input field label for application name. #: actions/showapplication.php:169 actions/version.php:197 #: lib/applicationeditform.php:199 -#, fuzzy msgid "Name" -msgstr "별명" +msgstr "이름" #. TRANS: Form input field label. #: actions/showapplication.php:178 lib/applicationeditform.php:235 @@ -3685,16 +3648,18 @@ msgid "Created by %1$s - %2$s access by default - %3$d users" msgstr "" #: actions/showapplication.php:213 +#, fuzzy msgid "Application actions" -msgstr "" +msgstr "신규 응용 프로그램" #: actions/showapplication.php:236 msgid "Reset key & secret" msgstr "" #: actions/showapplication.php:261 +#, fuzzy msgid "Application info" -msgstr "" +msgstr "신규 응용 프로그램" #: actions/showapplication.php:263 msgid "Consumer key" @@ -3713,8 +3678,9 @@ msgid "Access token URL" msgstr "" #: actions/showapplication.php:283 +#, fuzzy msgid "Authorize URL" -msgstr "" +msgstr "작성자" #: actions/showapplication.php:288 msgid "" @@ -3730,7 +3696,7 @@ msgstr "정말로 통지를 삭제하시겠습니까?" #: actions/showfavorites.php:79 #, fuzzy, php-format msgid "%1$s's favorite notices, page %2$d" -msgstr "%s 님의 좋아하는 글들" +msgstr "%s 님의 좋아하는 글" #: actions/showfavorites.php:132 msgid "Could not retrieve favorite notices." @@ -3774,7 +3740,7 @@ msgstr "" #: actions/showfavorites.php:243 msgid "This is a way to share what you like." -msgstr "" +msgstr "좋아하는 글을 지정하면 자기가 무엇을 좋아하는지 알릴 수 있습니다." #: actions/showgroup.php:82 lib/groupnav.php:86 #, php-format @@ -3784,7 +3750,7 @@ msgstr "%s 그룹" #: actions/showgroup.php:84 #, fuzzy, php-format msgid "%1$s group, page %2$d" -msgstr "%s 그룹 회원, %d페이지" +msgstr "그룹, %d 페이지" #: actions/showgroup.php:227 msgid "Group profile" @@ -3836,16 +3802,15 @@ msgstr "회원" #: lib/profileaction.php:152 lib/profileaction.php:255 lib/section.php:95 #: lib/subscriptionlist.php:127 lib/tagcloudsection.php:71 msgid "(None)" -msgstr "(없습니다.)" +msgstr "(없음)" #: actions/showgroup.php:404 msgid "All members" msgstr "모든 회원" #: actions/showgroup.php:439 -#, fuzzy msgid "Created" -msgstr "생성" +msgstr "생성됨" #: actions/showgroup.php:455 #, php-format @@ -3858,15 +3823,13 @@ msgid "" msgstr "" #: actions/showgroup.php:461 -#, fuzzy, php-format +#, php-format msgid "" "**%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. " msgstr "" -"**%s** 는 %%%%site.name%%%% [마이크로블로깅)(http://en.wikipedia.org/wiki/" -"Micro-blogging)의 사용자 그룹입니다. " #: actions/showgroup.php:489 #, fuzzy @@ -3904,27 +3867,27 @@ msgstr "%s 태그된 통지" #: actions/showstream.php:79 #, fuzzy, php-format msgid "%1$s, page %2$d" -msgstr "%s 와 친구들, %d 페이지" +msgstr "%s 및 친구들, %d 페이지" #: actions/showstream.php:122 #, fuzzy, php-format msgid "Notice feed for %1$s tagged %2$s (RSS 1.0)" -msgstr "%s 그룹을 위한 공지피드" +msgstr "%s 그룹을 위한 공지피드 (RSS 1.0)" #: actions/showstream.php:129 #, fuzzy, php-format msgid "Notice feed for %s (RSS 1.0)" -msgstr "%s의 통지 피드" +msgstr "%s 그룹을 위한 공지피드 (RSS 1.0)" #: actions/showstream.php:136 #, fuzzy, php-format msgid "Notice feed for %s (RSS 2.0)" -msgstr "%s의 통지 피드" +msgstr "%s 그룹을 위한 공지피드 (RSS 2.0)" #: actions/showstream.php:143 #, fuzzy, php-format msgid "Notice feed for %s (Atom)" -msgstr "%s의 통지 피드" +msgstr "%s 그룹을 위한 공지피드 (Atom)" #: actions/showstream.php:148 #, fuzzy, php-format @@ -3932,9 +3895,9 @@ msgid "FOAF for %s" msgstr "%s의 보낸쪽지함" #: actions/showstream.php:200 -#, php-format +#, fuzzy, php-format msgid "This is the timeline for %1$s but %2$s hasn't posted anything yet." -msgstr "" +msgstr "%s 및 친구들의 타임라인이지만, 아직 아무도 글을 작성하지 않았습니다." #: actions/showstream.php:205 msgid "" @@ -3961,14 +3924,12 @@ msgid "" msgstr "" #: actions/showstream.php:248 -#, fuzzy, php-format +#, php-format msgid "" "**%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. " msgstr "" -"**%s**는 %%%%site.name%%%% [마이크로블로깅](http://en.wikipedia.org/wiki/" -"Micro-blogging) 서비스에 계정을 갖고 있습니다." #: actions/showstream.php:305 #, fuzzy, php-format @@ -3978,16 +3939,16 @@ msgstr "%s에 답신" #: actions/silence.php:65 actions/unsilence.php:65 #, fuzzy msgid "You cannot silence users on this site." -msgstr "당신은 이 사용자에게 메시지를 보낼 수 없습니다." +msgstr "이 사이트의 이용자에 대해 권한정지 할 수 없습니다." #: actions/silence.php:72 -#, fuzzy msgid "User is already silenced." -msgstr "회원이 당신을 차단해왔습니다." +msgstr "" #: actions/siteadminpanel.php:69 +#, fuzzy msgid "Basic settings for this StatusNet site" -msgstr "" +msgstr "이 StatusNet 사이트에 대한 디자인 설정" #: actions/siteadminpanel.php:133 msgid "Site name must have non-zero length." @@ -3996,7 +3957,7 @@ msgstr "" #: actions/siteadminpanel.php:141 #, fuzzy msgid "You must have a valid contact email address." -msgstr "유효한 이메일 주소가 아닙니다." +msgstr "올바른 메일 주소가 아닙니다." #: actions/siteadminpanel.php:159 #, php-format @@ -4018,7 +3979,7 @@ msgstr "" #: actions/siteadminpanel.php:224 #, fuzzy msgid "Site name" -msgstr "사이트 공지" +msgstr "사이트 테마" #: actions/siteadminpanel.php:225 msgid "The name of your site, like \"Yourcompany Microblog\"" @@ -4043,7 +4004,7 @@ msgstr "" #: actions/siteadminpanel.php:239 #, fuzzy msgid "Contact email address for your site" -msgstr "%s에 포스팅 할 새로운 이메일 주소" +msgstr "%s에 포스팅 할 새로운 메일 주소" #: actions/siteadminpanel.php:245 #, fuzzy @@ -4100,7 +4061,7 @@ msgstr "새로운 메시지입니다." #: actions/sitenoticeadminpanel.php:103 #, fuzzy msgid "Unable to save site notice." -msgstr "트위터 환경설정을 저장할 수 없습니다." +msgstr "디자인 설정을 저장할 수 없습니다." #: actions/sitenoticeadminpanel.php:113 msgid "Max length for the site-wide notice is 255 chars." @@ -4124,7 +4085,7 @@ msgstr "사이트 공지" #: actions/smssettings.php:59 #, fuzzy msgid "SMS settings" -msgstr "SMS 세팅" +msgstr "메일 설정" #. TRANS: SMS settings page instructions. #. TRANS: %%site.name%% is the name of the site. @@ -4138,13 +4099,12 @@ msgstr "" #: actions/smssettings.php:97 #, fuzzy msgid "SMS is not available." -msgstr "이 페이지는 귀하가 승인한 미디어 타입에서는 이용할 수 없습니다." +msgstr "인스턴트 메신저를 사용할 수 없습니다." #. TRANS: Form legend for SMS settings form. #: actions/smssettings.php:111 -#, fuzzy msgid "SMS address" -msgstr "메신저 주소" +msgstr "SMS 주소" #. TRANS: Form guide in SMS settings form. #: actions/smssettings.php:120 @@ -4168,16 +4128,15 @@ msgstr "휴대폰으로 받으신 인증번호를 입력하십시오." #. TRANS: Button label to confirm SMS confirmation code in SMS settings. #: actions/smssettings.php:148 -#, fuzzy msgctxt "BUTTON" msgid "Confirm" -msgstr "인증" +msgstr "확인" #. TRANS: Field label for SMS phone number input in SMS settings form. #: actions/smssettings.php:153 #, fuzzy msgid "SMS phone number" -msgstr "SMS 휴대폰 번호" +msgstr "휴대폰 번호가 없습니다." #. TRANS: SMS phone number input field instructions in SMS settings form. #: actions/smssettings.php:156 @@ -4188,7 +4147,7 @@ msgstr "지역번호와 함께 띄어쓰기 없이 번호를 적어 주세요." #: actions/smssettings.php:195 #, fuzzy msgid "SMS preferences" -msgstr "설정" +msgstr "메일 설정" #. TRANS: Checkbox label in SMS preferences form. #: actions/smssettings.php:201 @@ -4232,8 +4191,8 @@ msgid "" "A confirmation code was sent to the phone number you added. Check your phone " "for the code and instructions on how to use it." msgstr "" -"추가한 휴대폰으로 인증 코드를 보냈습니다. 수신함(또는 스팸함)을 확인하셔서 코" -"드와 사용법을 확인하여 주시기 바랍니다." +"추가한 메일로 인증 코드를 보냈습니다. 수신함(또는 스팸함)을 확인하셔서 코드" +"와 사용법을 확인하여 주시기 바랍니다." #. TRANS: Message given canceling SMS phone number confirmation for the wrong phone number. #: actions/smssettings.php:413 @@ -4244,7 +4203,7 @@ msgstr "옳지 않은 인증 번호 입니다." #: actions/smssettings.php:427 #, fuzzy msgid "SMS confirmation cancelled." -msgstr "인증 취소" +msgstr "SMS 인증" #. TRANS: Message given trying to remove an SMS phone number that is not #. TRANS: registered for the active user. @@ -4256,7 +4215,7 @@ msgstr "그 휴대폰 번호는 귀하의 것이 아닙니다." #: actions/smssettings.php:470 #, fuzzy msgid "The SMS phone number was removed." -msgstr "SMS 휴대폰 번호" +msgstr "메일 주소를 지웠습니다." #. TRANS: Label for mobile carrier dropdown menu in SMS settings. #: actions/smssettings.php:511 @@ -4291,7 +4250,7 @@ msgstr "" #: actions/snapshotadminpanel.php:65 #, fuzzy msgid "Manage snapshot configuration" -msgstr "주 사이트 네비게이션" +msgstr "메일 주소 확인" #: actions/snapshotadminpanel.php:127 msgid "Invalid snapshot run value." @@ -4302,8 +4261,9 @@ msgid "Snapshot frequency must be a number." msgstr "" #: actions/snapshotadminpanel.php:144 +#, fuzzy msgid "Invalid snapshot report URL." -msgstr "" +msgstr "잘못된 로고 URL 입니다." #: actions/snapshotadminpanel.php:200 msgid "Randomly during web hit" @@ -4330,8 +4290,9 @@ msgid "Snapshots will be sent once every N web hits" msgstr "" #: actions/snapshotadminpanel.php:226 +#, fuzzy msgid "Report URL" -msgstr "" +msgstr "소스 코드 URL" #: actions/snapshotadminpanel.php:227 msgid "Snapshots will be sent to this URL" @@ -4340,7 +4301,7 @@ msgstr "" #: actions/snapshotadminpanel.php:248 #, fuzzy msgid "Save snapshot settings" -msgstr "아바타 설정" +msgstr "접근 설정을 저장" #: actions/subedit.php:70 msgid "You are not subscribed to that profile." @@ -4358,7 +4319,7 @@ msgstr "" #: actions/subscribe.php:107 #, fuzzy msgid "No such profile." -msgstr "그러한 통지는 없습니다." +msgstr "해당하는 파일이 없습니다." #: actions/subscribe.php:117 #, fuzzy @@ -4377,7 +4338,7 @@ msgstr "%s 구독자" #: actions/subscribers.php:52 #, fuzzy, php-format msgid "%1$s subscribers, page %2$d" -msgstr "%s 구독자, %d 페이지" +msgstr "%s 및 친구들, %d 페이지" #: actions/subscribers.php:63 msgid "These are the people who listen to your notices." @@ -4414,7 +4375,7 @@ msgstr "%s 구독" #: actions/subscriptions.php:54 #, fuzzy, php-format msgid "%1$s subscriptions, page %2$d" -msgstr "%s subscriptions, %d 페이지" +msgstr "%s 및 친구들, %d 페이지" #: actions/subscriptions.php:65 msgid "These are the people whose notices you listen to." @@ -4438,7 +4399,7 @@ msgstr "" #: actions/subscriptions.php:128 actions/subscriptions.php:132 #, fuzzy, php-format msgid "%s is not listening to anyone." -msgstr "%1$s 는 지금 듣고 있습니다." +msgstr "%1$s님이 귀하의 알림 메시지를 %2$s에서 듣고 있습니다." #: actions/subscriptions.php:208 msgid "Jabber" @@ -4451,27 +4412,27 @@ msgstr "SMS" #: actions/tag.php:69 #, fuzzy, php-format msgid "Notices tagged with %1$s, page %2$d" -msgstr "이용자 셀프 테크 %s - %d 페이지" +msgstr "%s 태그된 통지" #: actions/tag.php:87 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 1.0)" -msgstr "%s의 통지 피드" +msgstr "%s 그룹을 위한 공지피드 (RSS 1.0)" #: actions/tag.php:93 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 2.0)" -msgstr "%s의 통지 피드" +msgstr "%s 그룹을 위한 공지피드 (RSS 2.0)" #: actions/tag.php:99 #, fuzzy, php-format msgid "Notice feed for tag %s (Atom)" -msgstr "%s의 통지 피드" +msgstr "%s 그룹을 위한 공지피드 (Atom)" #: actions/tagother.php:39 #, fuzzy msgid "No ID argument." -msgstr "id 인자가 없습니다." +msgstr "첨부문서 없음" #: actions/tagother.php:65 #, php-format @@ -4520,12 +4481,12 @@ msgstr "그러한 태그가 없습니다." #: actions/unblock.php:59 #, fuzzy msgid "You haven't blocked that user." -msgstr "당신은 이미 이 사용자를 차단하고 있습니다." +msgstr "이미 차단된 이용자입니다." #: actions/unsandbox.php:72 #, fuzzy msgid "User is not sandboxed." -msgstr "회원이 당신을 차단해왔습니다." +msgstr "이용자의 지속적인 게시글이 없습니다." #: actions/unsilence.php:72 #, fuzzy @@ -4535,7 +4496,7 @@ msgstr "이용자가 프로필을 가지고 있지 않습니다." #: actions/unsubscribe.php:77 #, fuzzy msgid "No profile ID in request." -msgstr "요청한 프로필id가 없습니다." +msgstr "해당 ID의 프로필이 없습니다." #: actions/unsubscribe.php:98 msgid "Unsubscribed" @@ -4549,14 +4510,14 @@ msgstr "" #. TRANS: User admin panel title #: actions/useradminpanel.php:59 -#, fuzzy msgctxt "TITLE" msgid "User" -msgstr "이용자" +msgstr "사용자" #: actions/useradminpanel.php:70 +#, fuzzy msgid "User settings for this StatusNet site." -msgstr "" +msgstr "이 StatusNet 사이트에 대한 디자인 설정" #: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." @@ -4627,19 +4588,15 @@ msgid "Authorize subscription" msgstr "구독을 허가" #: actions/userauthorization.php:110 -#, fuzzy msgid "" "Please check these details to make sure that you want to subscribe to this " "user’s notices. If you didn’t just ask to subscribe to someone’s notices, " "click “Reject”." msgstr "" -"사용자의 통지를 구독하려면 상세를 확인해 주세요. 구독하지 않는 경우는, \"취소" -"\"를 클릭해 주세요." #: actions/userauthorization.php:196 actions/version.php:167 -#, fuzzy msgid "License" -msgstr "라이선스" +msgstr "라이센스" #: actions/userauthorization.php:217 msgid "Accept" @@ -4668,28 +4625,22 @@ msgid "Subscription authorized" msgstr "구독 허가" #: actions/userauthorization.php:256 -#, fuzzy msgid "" "The subscription has been authorized, but no callback URL was passed. Check " "with the site’s instructions for details on how to authorize the " "subscription. Your subscription token is:" msgstr "" -"구독이 승인 되었습니다. 하지만 콜백 URL이 통과 되지 않았습니다. 웹사이트의 지" -"시를 찾아 구독 승인 방법에 대하여 읽어보십시오. 귀하의 구독 토큰은 : " #: actions/userauthorization.php:266 msgid "Subscription rejected" msgstr "구독 거부" #: actions/userauthorization.php:268 -#, fuzzy msgid "" "The subscription has been rejected, but no callback URL was passed. Check " "with the site’s instructions for details on how to fully reject the " "subscription." msgstr "" -"구독이 해지 되었습니다. 하지만 콜백 URL이 통과 되지 않았습니다. 웹사이트의 지" -"시를 찾아 구독 해지 방법에 대하여 읽어보십시오." #: actions/userauthorization.php:303 #, php-format @@ -4717,19 +4668,18 @@ msgid "Avatar URL ‘%s’ is not valid." msgstr "" #: actions/userauthorization.php:350 -#, fuzzy, php-format +#, php-format msgid "Can’t read avatar URL ‘%s’." -msgstr "아바타 URL '%s'을(를) 읽어낼 수 없습니다." +msgstr "" #: actions/userauthorization.php:355 -#, fuzzy, php-format +#, php-format msgid "Wrong image type for avatar URL ‘%s’." -msgstr "%S 잘못된 그림 파일 타입입니다. " +msgstr "" #: actions/userdesignsettings.php:76 lib/designsettings.php:65 -#, fuzzy msgid "Profile design" -msgstr "프로필 세팅" +msgstr "프로필 디자인" #: actions/userdesignsettings.php:87 lib/designsettings.php:76 msgid "" @@ -4745,12 +4695,11 @@ msgstr "" #: actions/usergroups.php:66 #, fuzzy, php-format msgid "%1$s groups, page %2$d" -msgstr "%s 그룹 회원, %d페이지" +msgstr "그룹, %d 페이지" #: actions/usergroups.php:132 -#, fuzzy msgid "Search for more groups" -msgstr "프로필이나 텍스트 검색" +msgstr "" #: actions/usergroups.php:159 #, fuzzy, php-format @@ -4774,9 +4723,9 @@ msgid "Updates from %1$s on %2$s!" msgstr "%2$s에 있는 %1$s의 업데이트!" #: actions/version.php:75 -#, fuzzy, php-format +#, php-format msgid "StatusNet %s" -msgstr "통계" +msgstr "StatusNet %s" #: actions/version.php:155 #, php-format @@ -4787,7 +4736,7 @@ msgstr "" #: actions/version.php:163 msgid "Contributors" -msgstr "" +msgstr "편집자" #: actions/version.php:170 msgid "" @@ -4819,11 +4768,12 @@ msgstr "" #. TRANS: Secondary navigation menu option leading to version information on the StatusNet site. #: actions/version.php:198 lib/action.php:789 msgid "Version" -msgstr "버젼" +msgstr "버전" #: actions/version.php:199 +#, fuzzy msgid "Author(s)" -msgstr "" +msgstr "작성자" #. TRANS: Server exception thrown when a URL cannot be processed. #: classes/File.php:143 @@ -4880,7 +4830,7 @@ msgstr "그룹을 업데이트 할 수 없습니다." #: classes/Group_member.php:63 #, fuzzy msgid "Group leave failed." -msgstr "그룹 프로필" +msgstr "그룹에 가입하지 못했습니다." #. TRANS: Server exception thrown when updating a local group fails. #: classes/Local_group.php:42 @@ -4927,7 +4877,7 @@ msgstr "" #: classes/Notice.php:190 #, fuzzy, php-format msgid "Database error inserting hashtag: %s" -msgstr "해쉬테그를 추가 할 때에 데이타베이스 에러 : %s" +msgstr "OAuth 응용 프로그램 사용자 추가 중 데이터베이스 오류" #. TRANS: Client exception thrown if a notice contains too many characters. #: classes/Notice.php:260 @@ -4982,7 +4932,7 @@ 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. -#: classes/Notice.php:1745 +#: classes/Notice.php:1746 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" @@ -5011,23 +4961,23 @@ msgstr "이용자가 프로필을 가지고 있지 않습니다." #: classes/Status_network.php:346 #, fuzzy msgid "Unable to save tag." -msgstr "트위터 환경설정을 저장할 수 없습니다." +msgstr "태그를 저장할 수 없습니다." #. TRANS: Exception thrown when trying to subscribe while being banned from subscribing. #: classes/Subscription.php:75 lib/oauthstore.php:465 -#, fuzzy msgid "You have been banned from subscribing." -msgstr "이 회원은 구독으로부터 당신을 차단해왔다." +msgstr "귀하는 구독이 금지되었습니다." #. TRANS: Exception thrown when trying to subscribe while already subscribed. #: classes/Subscription.php:80 +#, fuzzy msgid "Already subscribed!" -msgstr "" +msgstr "구독하고 있지 않습니다!" #. TRANS: Exception thrown when trying to subscribe to a user who has blocked the subscribing user. #: classes/Subscription.php:85 msgid "User has blocked you." -msgstr "회원이 당신을 차단해왔습니다." +msgstr "사용자가 귀하를 차단했습니다." #. TRANS: Exception thrown when trying to unsibscribe without a subscription. #: classes/Subscription.php:171 @@ -5039,19 +4989,19 @@ msgstr "구독하고 있지 않습니다!" #: classes/Subscription.php:178 #, fuzzy msgid "Could not delete self-subscription." -msgstr "예약 구독을 삭제 할 수 없습니다." +msgstr "구독을 저장할 수 없습니다." #. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server. #: classes/Subscription.php:206 #, fuzzy msgid "Could not delete subscription OMB token." -msgstr "예약 구독을 삭제 할 수 없습니다." +msgstr "구독을 저장할 수 없습니다." #. TRANS: Exception thrown when a subscription could not be deleted on the server. #: classes/Subscription.php:218 #, fuzzy msgid "Could not delete subscription." -msgstr "예약 구독을 삭제 할 수 없습니다." +msgstr "구독을 저장할 수 없습니다." #. TRANS: Notice given on user registration. #. TRANS: %1$s is the sitename, $2$s is the registering user's nickname. @@ -5069,7 +5019,7 @@ msgstr "새 그룹을 만들 수 없습니다." #: classes/User_group.php:506 #, fuzzy msgid "Could not set group URI." -msgstr "그룹 맴버십을 세팅할 수 없습니다." +msgstr "새 그룹을 만들 수 없습니다." #. TRANS: Server exception thrown when setting group membership failed. #: classes/User_group.php:529 @@ -5136,17 +5086,15 @@ msgstr "주 사이트 네비게이션" #. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:442 -#, fuzzy msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" -msgstr "개인 프로필과 친구 타임라인" +msgstr "" #. TRANS: Main menu option when logged in for access to personal profile and friends timeline #: lib/action.php:445 -#, fuzzy msgctxt "MENU" msgid "Personal" -msgstr "개인적인" +msgstr "개인" #. TRANS: Tooltip for main menu option "Account" #: lib/action.php:447 @@ -5156,10 +5104,9 @@ msgstr "당신의 이메일, 아바타, 비밀 번호, 프로필을 변경하세 #. TRANS: Tooltip for main menu option "Services" #: lib/action.php:452 -#, fuzzy msgctxt "TOOLTIP" msgid "Connect to services" -msgstr "서버에 재접속 할 수 없습니다 : %s" +msgstr "" #. TRANS: Main menu option when logged in and connection are possible for access to options to connect to other services #: lib/action.php:455 @@ -5175,10 +5122,9 @@ msgstr "주 사이트 네비게이션" #. TRANS: Main menu option when logged in and site admin for access to site configuration #: lib/action.php:461 -#, fuzzy msgctxt "MENU" msgid "Admin" -msgstr "관리자" +msgstr "관리" #. TRANS: Tooltip for main menu option "Invite" #: lib/action.php:465 @@ -5195,41 +5141,35 @@ msgstr "초대" #. TRANS: Tooltip for main menu option "Logout" #: lib/action.php:474 -#, fuzzy msgctxt "TOOLTIP" msgid "Logout from the site" -msgstr "이 사이트로부터 로그아웃" +msgstr "이 사이트에서 로그아웃" #. TRANS: Main menu option when logged in to log out the current user #: lib/action.php:477 -#, fuzzy msgctxt "MENU" msgid "Logout" msgstr "로그아웃" #. TRANS: Tooltip for main menu option "Register" #: lib/action.php:482 -#, fuzzy msgctxt "TOOLTIP" msgid "Create an account" -msgstr "계정 만들기" +msgstr "새 계정 만들기" #. TRANS: Main menu option when not logged in to register a new account #: lib/action.php:485 -#, fuzzy msgctxt "MENU" msgid "Register" -msgstr "회원가입" +msgstr "등록" #. TRANS: Tooltip for main menu option "Login" #: lib/action.php:488 -#, fuzzy msgctxt "TOOLTIP" msgid "Login to the site" -msgstr "이 사이트 로그인" +msgstr "이 사이트에 로그인" #: lib/action.php:491 -#, fuzzy msgctxt "MENU" msgid "Login" msgstr "로그인" @@ -5239,23 +5179,20 @@ msgstr "로그인" #, fuzzy msgctxt "TOOLTIP" msgid "Help me!" -msgstr "도움이 필요해!" +msgstr "도움말" #: lib/action.php:497 -#, fuzzy msgctxt "MENU" msgid "Help" msgstr "도움말" #. TRANS: Tooltip for main menu option "Search" #: lib/action.php:500 -#, fuzzy msgctxt "TOOLTIP" msgid "Search for people or text" -msgstr "프로필이나 텍스트 검색" +msgstr "" #: lib/action.php:503 -#, fuzzy msgctxt "MENU" msgid "Search" msgstr "검색" @@ -5299,7 +5236,7 @@ msgstr "자주 묻는 질문" #. TRANS: Secondary navigation menu option leading to Terms of Service. #: lib/action.php:779 msgid "TOS" -msgstr "" +msgstr "서비스 약관" #. TRANS: Secondary navigation menu option leading to privacy policy. #: lib/action.php:783 @@ -5317,24 +5254,21 @@ msgid "Contact" msgstr "연락하기" #: lib/action.php:794 -#, fuzzy msgid "Badge" -msgstr "찔러 보기" +msgstr "배지" #. TRANS: DT element for StatusNet software license. #: lib/action.php:823 msgid "StatusNet software license" -msgstr "라코니카 소프트웨어 라이선스" +msgstr "StatusNet 소프트웨어 라이선스" #. TRANS: First sentence of the StatusNet site license. Used if 'broughtby' is set. #: lib/action.php:827 -#, fuzzy, php-format +#, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." "broughtby%%](%%site.broughtbyurl%%)." msgstr "" -"**%%site.name%%** 는 [%%site.broughtby%%](%%site.broughtbyurl%%)가 제공하는 " -"마이크로블로깅서비스입니다." #. TRANS: First sentence of the StatusNet site license. Used if 'broughtby' is not set. #: lib/action.php:830 @@ -5356,34 +5290,34 @@ msgstr "" #. TRANS: DT element for StatusNet site content license. #: lib/action.php:850 -#, fuzzy msgid "Site content license" -msgstr "라코니카 소프트웨어 라이선스" +msgstr "사이트 컨텐츠 라이선스" #. TRANS: Content license displayed when license is set to 'private'. #. TRANS: %1$s is the site name. #: lib/action.php:857 #, php-format msgid "Content and data of %1$s are private and confidential." -msgstr "" +msgstr "%1$s의 컨텐츠와 데이터는 외부 유출을 금지합니다." #. TRANS: Content license displayed when license is set to 'allrightsreserved'. #. TRANS: %1$s is the copyright owner. #: lib/action.php:864 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." -msgstr "" +msgstr "컨텐츠와 데이터의 저작권은 %1$s의 소유입니다. All rights reserved." #. TRANS: Content license displayed when license is set to 'allrightsreserved' and no owner is set. #: lib/action.php:868 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" +"컨텐츠와 데이터의 저작권은 각 이용자의 소유입니다. All rights reserved." #. TRANS: license message in footer. %1$s is the site name, %2$s is a link to the license URL, with a licence name set in configuration. #: lib/action.php:881 #, php-format msgid "All %1$s content and data are available under the %2$s license." -msgstr "" +msgstr "%1$s의 모든 컨텐츠와 데이터는 %2$s 라이선스에 따라 이용할 수 있습니다." #. TRANS: DT element for pagination (previous/next, etc.). #: lib/action.php:1192 @@ -5423,7 +5357,7 @@ msgstr "" #: lib/adminpanelaction.php:98 #, fuzzy msgid "You cannot make changes to this site." -msgstr "당신은 이 사용자에게 메시지를 보낼 수 없습니다." +msgstr "이 사이트의 이용자에 대해 권한정지 할 수 없습니다." #. TRANS: Client error message throw when a certain panel's settings cannot be changed. #: lib/adminpanelaction.php:110 @@ -5448,20 +5382,19 @@ msgstr "명령이 아직 실행되지 않았습니다." #: lib/adminpanelaction.php:284 #, fuzzy msgid "Unable to delete design setting." -msgstr "트위터 환경설정을 저장할 수 없습니다." +msgstr "디자인 설정을 저장할 수 없습니다." #. TRANS: Menu item title/tooltip #: lib/adminpanelaction.php:350 #, fuzzy msgid "Basic site configuration" -msgstr "이메일 주소 확인서" +msgstr "메일 주소 확인" #. TRANS: Menu item for site administration #: lib/adminpanelaction.php:352 -#, fuzzy msgctxt "MENU" msgid "Site" -msgstr "초대" +msgstr "사이트" #. TRANS: Menu item title/tooltip #: lib/adminpanelaction.php:358 @@ -5471,10 +5404,9 @@ msgstr "SMS 인증" #. TRANS: Menu item for site administration #: lib/adminpanelaction.php:360 -#, fuzzy msgctxt "MENU" msgid "Design" -msgstr "개인적인" +msgstr "디자인" #. TRANS: Menu item title/tooltip #: lib/adminpanelaction.php:366 @@ -5485,7 +5417,7 @@ msgstr "SMS 인증" #. TRANS: Menu item for site administration #: lib/adminpanelaction.php:368 lib/personalgroupnav.php:115 msgid "User" -msgstr "이용자" +msgstr "사용자" #. TRANS: Menu item title/tooltip #: lib/adminpanelaction.php:374 @@ -5524,25 +5456,27 @@ msgstr "" #. TRANS: Form legend. #: lib/applicationeditform.php:137 +#, fuzzy msgid "Edit application" -msgstr "" +msgstr "응용 프로그램 수정" #. TRANS: Form guide. #: lib/applicationeditform.php:187 +#, fuzzy msgid "Icon for this application" -msgstr "" +msgstr "응용프로그램 삭제" #. TRANS: Form input field instructions. #: lib/applicationeditform.php:209 -#, fuzzy, php-format +#, php-format msgid "Describe your application in %d characters" -msgstr "140글자로 그룹이나 토픽 설명하기" +msgstr "" #. TRANS: Form input field instructions. #: lib/applicationeditform.php:213 #, fuzzy msgid "Describe your application" -msgstr "140글자로 그룹이나 토픽 설명하기" +msgstr "응용프로그램 삭제" #. TRANS: Form input field instructions. #: lib/applicationeditform.php:224 @@ -5552,9 +5486,8 @@ msgstr "그룹 혹은 토픽의 홈페이지나 블로그 URL" #. TRANS: Form input field label. #: lib/applicationeditform.php:226 -#, fuzzy msgid "Source URL" -msgstr "소스 코드" +msgstr "소스 코드 URL" #. TRANS: Form input field instructions. #: lib/applicationeditform.php:233 @@ -5628,31 +5561,32 @@ msgstr "" #, fuzzy msgctxt "BUTTON" msgid "Revoke" -msgstr "삭제" +msgstr "제거" #. TRANS: DT element label in attachment list. #: lib/attachmentlist.php:88 msgid "Attachments" -msgstr "" +msgstr "첨부파일" #. TRANS: DT element label in attachment list item. #: lib/attachmentlist.php:265 msgid "Author" -msgstr "" +msgstr "작성자" #. TRANS: DT element label in attachment list item. #: lib/attachmentlist.php:279 #, fuzzy msgid "Provider" -msgstr "프로필" +msgstr "미리보기" #: lib/attachmentnoticesection.php:67 msgid "Notices where this attachment appears" msgstr "" #: lib/attachmenttagcloudsection.php:48 +#, fuzzy msgid "Tags for this attachment" -msgstr "" +msgstr "해당하는 첨부파일이 없습니다." #: lib/authenticationplugin.php:221 lib/authenticationplugin.php:226 #, fuzzy @@ -5677,9 +5611,8 @@ msgid "Command failed" msgstr "실행 실패" #: lib/command.php:83 lib/command.php:105 -#, fuzzy msgid "Notice with that id does not exist" -msgstr "해당 id의 프로필이 없습니다." +msgstr "" #: lib/command.php:99 lib/command.php:596 msgid "User has no last notice" @@ -5742,7 +5675,7 @@ msgstr "이용자 %1$s 의 그룹 %2$s 가입에 실패했습니다." #: lib/command.php:385 #, fuzzy, php-format msgid "Could not remove user %1$s from group %2$s" -msgstr "그룹 %s에서 %s 사용자를 제거할 수 없습니다." +msgstr "이용자 %1$s 의 그룹 %2$s 가입에 실패했습니다." #. TRANS: Whois output. %s is the full name of the queried user. #: lib/command.php:418 @@ -5780,9 +5713,9 @@ msgstr "" #. TRANS: Message given if content is too long. #. TRANS: %1$d is the maximum number of characters, %2$d is the number of submitted characters. #: lib/command.php:472 -#, fuzzy, php-format +#, php-format msgid "Message too long - maximum is %1$d characters, you sent %2$d" -msgstr "당신이 보낸 메시지가 너무 길어요. 최대 140글자까지입니다." +msgstr "" #. TRANS: Message given have sent a direct message to another user. #. TRANS: %s is the name of the other user. @@ -5798,12 +5731,12 @@ msgstr "직접 메시지 보내기 오류." #: lib/command.php:514 #, fuzzy msgid "Cannot repeat your own notice" -msgstr "알림을 켤 수 없습니다." +msgstr "자기 자신의 소식은 재전송할 수 없습니다." #: lib/command.php:519 #, fuzzy msgid "Already repeated that notice" -msgstr "이 게시글 삭제하기" +msgstr "이미 재전송된 소식입니다." #. TRANS: Message given having repeated a notice from another user. #. TRANS: %s is the name of the user for which the notice was repeated. @@ -5815,12 +5748,12 @@ msgstr "게시글이 등록되었습니다." #: lib/command.php:531 #, fuzzy msgid "Error repeating notice." -msgstr "통지를 저장하는데 문제가 발생했습니다." +msgstr "사용자 세팅 오류" #: lib/command.php:562 -#, fuzzy, php-format +#, php-format msgid "Notice too long - maximum is %d characters, you sent %d" -msgstr "당신이 보낸 메시지가 너무 길어요. 최대 140글자까지입니다." +msgstr "" #: lib/command.php:571 #, fuzzy, php-format @@ -5977,7 +5910,7 @@ msgstr "" #: lib/common.php:139 #, fuzzy msgid "Go to the installer." -msgstr "이 사이트 로그인" +msgstr "이 사이트에 로그인" #: lib/connectsettingsaction.php:110 msgid "IM" @@ -5997,8 +5930,9 @@ msgid "Connections" msgstr "연결" #: lib/connectsettingsaction.php:121 +#, fuzzy msgid "Authorized connected applications" -msgstr "" +msgstr "응용프로그램 삭제" #: lib/dberroraction.php:60 msgid "Database error" @@ -6010,10 +5944,9 @@ msgid "Upload file" msgstr "올리기" #: lib/designsettings.php:109 -#, fuzzy msgid "" "You can upload your personal background image. The maximum file size is 2MB." -msgstr "당신의 개인적인 아바타를 업로드할 수 있습니다." +msgstr "개인 아바타를 올릴 수 있습니다. 최대 파일 크기는 2MB입니다." #: lib/designsettings.php:418 msgid "Design defaults restored." @@ -6033,19 +5966,19 @@ msgstr "좋아합니다" #: lib/feed.php:85 msgid "RSS 1.0" -msgstr "" +msgstr "RSS 1.0" #: lib/feed.php:87 msgid "RSS 2.0" -msgstr "" +msgstr "RSS 2.0" #: lib/feed.php:89 msgid "Atom" -msgstr "" +msgstr "Atom" #: lib/feed.php:91 msgid "FOAF" -msgstr "" +msgstr "FOAF" #: lib/feedlist.php:64 msgid "Export data" @@ -6086,19 +6019,18 @@ msgid "URL of the homepage or blog of the group or topic" msgstr "그룹 혹은 토픽의 홈페이지나 블로그 URL" #: lib/groupeditform.php:168 -#, fuzzy msgid "Describe the group or topic" -msgstr "140글자로 그룹이나 토픽 설명하기" +msgstr "" #: lib/groupeditform.php:170 -#, fuzzy, php-format +#, php-format msgid "Describe the group or topic in %d characters" -msgstr "140글자로 그룹이나 토픽 설명하기" +msgstr "" #: lib/groupeditform.php:179 msgid "" "Location for the group, if any, like \"City, State (or Region), Country\"" -msgstr "그룹의 위치, \"시/군/구, 도, 나라\"" +msgstr "그룹의 위치, \"시/군/구, 도, 국가\"" #: lib/groupeditform.php:187 #, php-format @@ -6110,9 +6042,8 @@ msgid "Group" msgstr "그룹" #: lib/groupnav.php:101 -#, fuzzy msgid "Blocked" -msgstr "차단하기" +msgstr "차단" #: lib/groupnav.php:102 #, fuzzy, php-format @@ -6131,12 +6062,12 @@ msgstr "로고" #: lib/groupnav.php:114 #, php-format msgid "Add or edit %s logo" -msgstr "%s logo 추가 혹은 수정" +msgstr "%s 로고 추가 혹은 편집" #: lib/groupnav.php:120 #, fuzzy, php-format msgid "Add or edit %s design" -msgstr "%s logo 추가 혹은 수정" +msgstr "%s 로고 추가 혹은 편집" #: lib/groupsbymemberssection.php:71 msgid "Groups with most members" @@ -6222,7 +6153,7 @@ msgstr "새 계정을 위한 회원가입" #. TRANS: Subject for address confirmation email #: lib/mail.php:174 msgid "Email address confirmation" -msgstr "이메일 주소 확인서" +msgstr "메일 주소 확인" #. TRANS: Body for address confirmation email. #: lib/mail.php:177 @@ -6257,7 +6188,7 @@ msgstr "" #. TRANS: Main body of new-subscriber notification e-mail #: lib/mail.php:254 -#, fuzzy, php-format +#, php-format msgid "" "%1$s is now listening to your notices on %2$s.\n" "\n" @@ -6270,24 +6201,18 @@ msgid "" "----\n" "Change your email address or notification options at %8$s\n" msgstr "" -"%1$s님이 귀하의 알림 메시지를 %2$s에서 듣고 있습니다.\n" -"\t%3$s\n" -"\n" -"그럼 이만,%4$s.\n" #. TRANS: Profile info line in new-subscriber notification e-mail #: lib/mail.php:274 #, fuzzy, php-format msgid "Bio: %s" -msgstr "" -"소개: %s\n" -"\n" +msgstr "위치: %s" #. TRANS: Subject of notification mail for new posting email address #: lib/mail.php:304 #, php-format msgid "New email address for posting to %s" -msgstr "%s에 포스팅 할 새로운 이메일 주소" +msgstr "%s에 포스팅 할 새로운 메일 주소" #. TRANS: Body of notification mail for new posting email address #: lib/mail.php:308 @@ -6375,7 +6300,7 @@ msgstr "" #: lib/mail.php:589 #, fuzzy, php-format msgid "%s (@%s) added your notice as a favorite" -msgstr "%s님이 당신의 게시글을 좋아하는 글로 추가했습니다." +msgstr "누군가 내 글을 좋아하는 게시글로 추가했을 때, 메일을 보냅니다." #. TRANS: Body for favorite notification email #: lib/mail.php:592 @@ -6451,10 +6376,9 @@ msgid "" "users in conversation. People can send you messages for your eyes only." msgstr "" -#: lib/mailbox.php:227 lib/noticelist.php:505 -#, fuzzy +#: lib/mailbox.php:228 lib/noticelist.php:506 msgid "from" -msgstr "다음에서:" +msgstr "" #: lib/mailhandler.php:37 msgid "Could not parse message." @@ -6518,7 +6442,7 @@ msgstr "" #: lib/mediafile.php:202 lib/mediafile.php:238 #, fuzzy msgid "Could not determine file's MIME type." -msgstr "공개 stream을 불러올 수 없습니다." +msgstr "소스 이용자를 확인할 수 없습니다." #: lib/mediafile.php:318 #, php-format @@ -6536,14 +6460,13 @@ msgstr "직접 메시지 보내기" #: lib/messageform.php:146 msgid "To" -msgstr "에게" +msgstr "받는 이" #: lib/messageform.php:159 lib/noticeform.php:185 msgid "Available characters" msgstr "사용 가능한 글자" #: lib/messageform.php:178 lib/noticeform.php:236 -#, fuzzy msgctxt "Send button for sending notice" msgid "Send" msgstr "보내기" @@ -6558,22 +6481,21 @@ msgid "What's up, %s?" msgstr "뭐하세요? %?" #: lib/noticeform.php:192 +#, fuzzy msgid "Attach" -msgstr "" +msgstr "첨부파일" #: lib/noticeform.php:196 msgid "Attach a file" msgstr "" #: lib/noticeform.php:212 -#, fuzzy msgid "Share my location" -msgstr "태그를 저장할 수 없습니다." +msgstr "" #: lib/noticeform.php:215 -#, fuzzy msgid "Do not share my location" -msgstr "태그를 저장할 수 없습니다." +msgstr "" #: lib/noticeform.php:216 msgid "" @@ -6583,53 +6505,53 @@ msgstr "" #. TRANS: Used in coordinates as abbreviation of north #: lib/noticelist.php:436 -#, fuzzy msgid "N" -msgstr "아니오" +msgstr "북" #. TRANS: Used in coordinates as abbreviation of south #: lib/noticelist.php:438 msgid "S" -msgstr "" +msgstr "남" #. TRANS: Used in coordinates as abbreviation of east #: lib/noticelist.php:440 msgid "E" -msgstr "" +msgstr "동" #. TRANS: Used in coordinates as abbreviation of west #: lib/noticelist.php:442 msgid "W" -msgstr "" +msgstr "서" #: lib/noticelist.php:444 #, php-format msgid "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s" -msgstr "" +msgstr "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s" #: lib/noticelist.php:453 +#, fuzzy msgid "at" -msgstr "" +msgstr "경로" -#: lib/noticelist.php:567 +#: lib/noticelist.php:568 #, fuzzy msgid "in context" msgstr "내용이 없습니다!" -#: lib/noticelist.php:602 +#: lib/noticelist.php:603 #, fuzzy msgid "Repeated by" -msgstr "생성" +msgstr "재전송됨" -#: lib/noticelist.php:629 +#: lib/noticelist.php:630 msgid "Reply to this notice" msgstr "이 게시글에 대해 답장하기" -#: lib/noticelist.php:630 +#: lib/noticelist.php:631 msgid "Reply" msgstr "답장하기" -#: lib/noticelist.php:674 +#: lib/noticelist.php:675 #, fuzzy msgid "Notice repeated" msgstr "게시글이 등록되었습니다." @@ -6673,7 +6595,7 @@ msgstr "예약 구독을 추가 할 수 없습니다." #: lib/personalgroupnav.php:99 msgid "Personal" -msgstr "개인적인" +msgstr "개인" #: lib/personalgroupnav.php:104 msgid "Replies" @@ -6689,7 +6611,7 @@ msgstr "받은 쪽지함" #: lib/personalgroupnav.php:126 msgid "Your incoming messages" -msgstr "당신의 받은 메시지들" +msgstr "받은 메시지" #: lib/personalgroupnav.php:130 msgid "Outbox" @@ -6697,7 +6619,7 @@ msgstr "보낸 쪽지함" #: lib/personalgroupnav.php:131 msgid "Your sent messages" -msgstr "당신의 보낸 메시지들" +msgstr "보낸 메시지" #: lib/personaltagcloudsection.php:56 #, php-format @@ -6726,9 +6648,8 @@ msgid "All subscribers" msgstr "모든 구독자" #: lib/profileaction.php:191 -#, fuzzy msgid "User ID" -msgstr "이용자" +msgstr "이용자 ID" #: lib/profileaction.php:196 msgid "Member since" @@ -6737,7 +6658,7 @@ msgstr "가입한 때" #. TRANS: Average count of posts made per day since account registration #: lib/profileaction.php:235 msgid "Daily average" -msgstr "" +msgstr "하루 평균" #: lib/profileaction.php:264 msgid "All groups" @@ -6770,7 +6691,7 @@ msgstr "인기있는" #: lib/redirectingaction.php:95 #, fuzzy msgid "No return-to arguments." -msgstr "id 인자가 없습니다." +msgstr "첨부문서 없음" #: lib/repeatform.php:107 #, fuzzy @@ -6779,7 +6700,7 @@ msgstr "이 게시글에 대해 답장하기" #: lib/repeatform.php:132 msgid "Yes" -msgstr "네, 맞습니다." +msgstr "예" #: lib/repeatform.php:132 #, fuzzy @@ -6787,9 +6708,9 @@ msgid "Repeat this notice" msgstr "이 게시글에 대해 답장하기" #: lib/revokeroleform.php:91 -#, fuzzy, php-format +#, php-format msgid "Revoke the \"%s\" role from this user" -msgstr "이 그룹의 회원리스트" +msgstr "" #: lib/router.php:709 msgid "No single user defined for single-user mode." @@ -6808,7 +6729,7 @@ msgstr "이 사용자를 차단해제합니다." #: lib/searchaction.php:120 #, fuzzy msgid "Search site" -msgstr "검색" +msgstr "검색 도움말" #: lib/searchaction.php:126 msgid "Keyword(s)" @@ -6819,9 +6740,8 @@ msgid "Search" msgstr "검색" #: lib/searchaction.php:162 -#, fuzzy msgid "Search help" -msgstr "검색" +msgstr "검색 도움말" #: lib/searchgroupnav.php:80 msgid "People" @@ -6845,7 +6765,7 @@ msgstr "제목없는 섹션" #: lib/section.php:106 msgid "More..." -msgstr "" +msgstr "더 보기..." #: lib/silenceform.php:67 #, fuzzy @@ -6855,7 +6775,7 @@ msgstr "사이트 공지" #: lib/silenceform.php:78 #, fuzzy msgid "Silence this user" -msgstr "이 사용자 차단하기" +msgstr "이 사용자 삭제" #: lib/subgroupnav.php:83 #, php-format @@ -6870,7 +6790,7 @@ msgstr "%s에 의해 구독되는 사람들" #: lib/subgroupnav.php:99 #, php-format msgid "Groups %s is a member of" -msgstr "%s 그룹들은 의 멤버입니다." +msgstr "%s 사용자가 멤버인 그룹" #: lib/subgroupnav.php:105 msgid "Invite" @@ -6937,7 +6857,7 @@ msgstr "" #: lib/themeuploader.php:234 #, fuzzy msgid "Error opening theme archive." -msgstr "리모트 프로필 업데이트 오류" +msgstr "차단 제거 에러!" #: lib/topposterssection.php:74 msgid "Top posters" @@ -6990,11 +6910,11 @@ msgstr "" #: lib/userprofile.php:263 #, fuzzy msgid "Edit profile settings" -msgstr "프로필 세팅" +msgstr "프로필 설정" #: lib/userprofile.php:264 msgid "Edit" -msgstr "" +msgstr "편집" #: lib/userprofile.php:287 msgid "Send a direct message to this user" @@ -7014,7 +6934,6 @@ msgid "User role" msgstr "이용자 프로필" #: lib/userprofile.php:366 -#, fuzzy msgctxt "role" msgid "Administrator" msgstr "관리자" @@ -7089,6 +7008,6 @@ msgid "%s is not a valid color! Use 3 or 6 hex chars." msgstr "" #: lib/xmppmanager.php:403 -#, fuzzy, php-format +#, php-format msgid "Message too long - maximum is %1$d characters, you sent %2$d." -msgstr "당신이 보낸 메시지가 너무 길어요. 최대 140글자까지입니다." +msgstr "" diff --git a/locale/mk/LC_MESSAGES/statusnet.po b/locale/mk/LC_MESSAGES/statusnet.po index 551c61dce7..8c4981fbe2 100644 --- a/locale/mk/LC_MESSAGES/statusnet.po +++ b/locale/mk/LC_MESSAGES/statusnet.po @@ -9,12 +9,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-07 16:23+0000\n" -"PO-Revision-Date: 2010-08-07 16:24:45+0000\n" +"POT-Creation-Date: 2010-08-11 10:11+0000\n" +"PO-Revision-Date: 2010-08-11 10:12:44+0000\n" "Language-Team: Macedonian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70848); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: mk\n" "X-Message-Group: out-statusnet\n" @@ -792,7 +792,7 @@ msgid "Preview" msgstr "Преглед" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:656 +#: lib/deleteuserform.php:66 lib/noticelist.php:657 msgid "Delete" msgstr "Бриши" @@ -1074,7 +1074,7 @@ msgid "Do not delete this notice" msgstr "Не ја бриши оваа забелешка" #. TRANS: Submit button title for 'Yes' when deleting a notice. -#: actions/deletenotice.php:158 lib/noticelist.php:656 +#: actions/deletenotice.php:158 lib/noticelist.php:657 msgid "Delete this notice" msgstr "Бриши ја оваа забелешка" @@ -3510,7 +3510,7 @@ msgstr "Не можете да повторувате сопствена заб msgid "You already repeated that notice." msgstr "Веќе ја имате повторено таа забелешка." -#: actions/repeat.php:114 lib/noticelist.php:675 +#: actions/repeat.php:114 lib/noticelist.php:676 msgid "Repeated" msgstr "Повторено" @@ -4983,7 +4983,7 @@ 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. -#: classes/Notice.php:1745 +#: classes/Notice.php:1746 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -5377,13 +5377,13 @@ msgstr "Прелом на страници" #. TRANS: present than the currently displayed information. #: lib/action.php:1203 msgid "After" -msgstr "По" +msgstr "Следно" #. TRANS: Pagination message to go to a page displaying information more in the #. TRANS: past than the currently displayed information. #: lib/action.php:1213 msgid "Before" -msgstr "Пред" +msgstr "Претходно" #. TRANS: Client exception thrown when a feed instance is a DOMDocument. #: lib/activity.php:122 @@ -6547,7 +6547,7 @@ msgstr "" "впуштите во разговор со други корисници. Луѓето можат да ви испраќаат пораки " "што ќе можете да ги видите само Вие." -#: lib/mailbox.php:227 lib/noticelist.php:505 +#: lib/mailbox.php:228 lib/noticelist.php:506 msgid "from" msgstr "од" @@ -6709,23 +6709,23 @@ msgstr "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s" msgid "at" msgstr "во" -#: lib/noticelist.php:567 +#: lib/noticelist.php:568 msgid "in context" msgstr "во контекст" -#: lib/noticelist.php:602 +#: lib/noticelist.php:603 msgid "Repeated by" msgstr "Повторено од" -#: lib/noticelist.php:629 +#: lib/noticelist.php:630 msgid "Reply to this notice" msgstr "Одговори на забелешкава" -#: lib/noticelist.php:630 +#: lib/noticelist.php:631 msgid "Reply" msgstr "Одговор" -#: lib/noticelist.php:674 +#: lib/noticelist.php:675 msgid "Notice repeated" msgstr "Забелешката е повторена" diff --git a/locale/nl/LC_MESSAGES/statusnet.po b/locale/nl/LC_MESSAGES/statusnet.po index 8c432b7b17..b704f8aefa 100644 --- a/locale/nl/LC_MESSAGES/statusnet.po +++ b/locale/nl/LC_MESSAGES/statusnet.po @@ -11,12 +11,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-07 16:23+0000\n" -"PO-Revision-Date: 2010-08-07 16:24:50+0000\n" +"POT-Creation-Date: 2010-08-11 10:11+0000\n" +"PO-Revision-Date: 2010-08-11 10:12:58+0000\n" "Language-Team: Dutch\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70848); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: nl\n" "X-Message-Group: out-statusnet\n" @@ -804,7 +804,7 @@ msgid "Preview" msgstr "Voorvertoning" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:656 +#: lib/deleteuserform.php:66 lib/noticelist.php:657 msgid "Delete" msgstr "Verwijderen" @@ -1086,7 +1086,7 @@ msgid "Do not delete this notice" msgstr "Deze mededeling niet verwijderen" #. TRANS: Submit button title for 'Yes' when deleting a notice. -#: actions/deletenotice.php:158 lib/noticelist.php:656 +#: actions/deletenotice.php:158 lib/noticelist.php:657 msgid "Delete this notice" msgstr "Deze mededeling verwijderen" @@ -3537,7 +3537,7 @@ msgstr "U kunt uw eigen mededeling niet herhalen." msgid "You already repeated that notice." msgstr "U hent die mededeling al herhaald." -#: actions/repeat.php:114 lib/noticelist.php:675 +#: actions/repeat.php:114 lib/noticelist.php:676 msgid "Repeated" msgstr "Herhaald" @@ -5026,7 +5026,7 @@ 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. -#: classes/Notice.php:1745 +#: classes/Notice.php:1746 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -6599,7 +6599,7 @@ msgstr "" "U hebt geen privéberichten. U kunt privéberichten verzenden aan andere " "gebruikers. Mensen kunnen u privéberichten sturen die alleen u kunt lezen." -#: lib/mailbox.php:227 lib/noticelist.php:505 +#: lib/mailbox.php:228 lib/noticelist.php:506 msgid "from" msgstr "van" @@ -6697,7 +6697,7 @@ msgstr "Beschikbare tekens" #: lib/messageform.php:178 lib/noticeform.php:236 msgctxt "Send button for sending notice" msgid "Send" -msgstr "OK" +msgstr "Verzenden" #: lib/noticeform.php:160 msgid "Send a notice" @@ -6761,23 +6761,23 @@ msgstr "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s" msgid "at" msgstr "op" -#: lib/noticelist.php:567 +#: lib/noticelist.php:568 msgid "in context" msgstr "in context" -#: lib/noticelist.php:602 +#: lib/noticelist.php:603 msgid "Repeated by" msgstr "Herhaald door" -#: lib/noticelist.php:629 +#: lib/noticelist.php:630 msgid "Reply to this notice" msgstr "Op deze mededeling antwoorden" -#: lib/noticelist.php:630 +#: lib/noticelist.php:631 msgid "Reply" msgstr "Antwoorden" -#: lib/noticelist.php:674 +#: lib/noticelist.php:675 msgid "Notice repeated" msgstr "Mededeling herhaald" diff --git a/locale/statusnet.pot b/locale/statusnet.pot index 81c5a97c4d..822d4fcf88 100644 --- a/locale/statusnet.pot +++ b/locale/statusnet.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"POT-Creation-Date: 2010-08-11 10:48+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -763,7 +763,7 @@ msgid "Preview" msgstr "" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:656 +#: lib/deleteuserform.php:66 lib/noticelist.php:657 msgid "Delete" msgstr "" @@ -1036,7 +1036,7 @@ msgid "Do not delete this notice" msgstr "" #. TRANS: Submit button title for 'Yes' when deleting a notice. -#: actions/deletenotice.php:158 lib/noticelist.php:656 +#: actions/deletenotice.php:158 lib/noticelist.php:657 msgid "Delete this notice" msgstr "" @@ -3310,7 +3310,7 @@ msgstr "" msgid "You already repeated that notice." msgstr "" -#: actions/repeat.php:114 lib/noticelist.php:675 +#: actions/repeat.php:114 lib/noticelist.php:676 msgid "Repeated" msgstr "" @@ -4679,7 +4679,7 @@ 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. -#: classes/Notice.php:1745 +#: classes/Notice.php:1746 #, php-format msgid "RT @%1$s %2$s" msgstr "" @@ -6071,7 +6071,7 @@ msgid "" "users in conversation. People can send you messages for your eyes only." msgstr "" -#: lib/mailbox.php:227 lib/noticelist.php:505 +#: lib/mailbox.php:228 lib/noticelist.php:506 msgid "from" msgstr "" @@ -6225,23 +6225,23 @@ msgstr "" msgid "at" msgstr "" -#: lib/noticelist.php:567 +#: lib/noticelist.php:568 msgid "in context" msgstr "" -#: lib/noticelist.php:602 +#: lib/noticelist.php:603 msgid "Repeated by" msgstr "" -#: lib/noticelist.php:629 +#: lib/noticelist.php:630 msgid "Reply to this notice" msgstr "" -#: lib/noticelist.php:630 +#: lib/noticelist.php:631 msgid "Reply" msgstr "" -#: lib/noticelist.php:674 +#: lib/noticelist.php:675 msgid "Notice repeated" msgstr "" diff --git a/locale/uk/LC_MESSAGES/statusnet.po b/locale/uk/LC_MESSAGES/statusnet.po index 8e1e37ced9..e425f6c621 100644 --- a/locale/uk/LC_MESSAGES/statusnet.po +++ b/locale/uk/LC_MESSAGES/statusnet.po @@ -11,12 +11,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-07 16:23+0000\n" -"PO-Revision-Date: 2010-08-07 16:25:05+0000\n" +"POT-Creation-Date: 2010-08-11 10:11+0000\n" +"PO-Revision-Date: 2010-08-11 10:13:19+0000\n" "Language-Team: Ukrainian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70848); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: uk\n" "X-Message-Group: out-statusnet\n" @@ -792,7 +792,7 @@ msgid "Preview" msgstr "Перегляд" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:656 +#: lib/deleteuserform.php:66 lib/noticelist.php:657 msgid "Delete" msgstr "Видалити" @@ -1071,7 +1071,7 @@ msgid "Do not delete this notice" msgstr "Не видаляти цей допис" #. TRANS: Submit button title for 'Yes' when deleting a notice. -#: actions/deletenotice.php:158 lib/noticelist.php:656 +#: actions/deletenotice.php:158 lib/noticelist.php:657 msgid "Delete this notice" msgstr "Видалити допис" @@ -3494,7 +3494,7 @@ msgstr "Ви не можете повторювати свої власні до msgid "You already repeated that notice." msgstr "Ви вже повторили цей допис." -#: actions/repeat.php:114 lib/noticelist.php:675 +#: actions/repeat.php:114 lib/noticelist.php:676 msgid "Repeated" msgstr "Повторено" @@ -4960,7 +4960,7 @@ 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. -#: classes/Notice.php:1745 +#: classes/Notice.php:1746 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -6517,7 +6517,7 @@ msgstr "" "повідомлення аби долучити користувачів до розмови. Такі повідомлення бачите " "лише Ви." -#: lib/mailbox.php:227 lib/noticelist.php:505 +#: lib/mailbox.php:228 lib/noticelist.php:506 msgid "from" msgstr "від" @@ -6676,23 +6676,23 @@ msgstr "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s" msgid "at" msgstr "в" -#: lib/noticelist.php:567 +#: lib/noticelist.php:568 msgid "in context" msgstr "в контексті" -#: lib/noticelist.php:602 +#: lib/noticelist.php:603 msgid "Repeated by" msgstr "Повторено" -#: lib/noticelist.php:629 +#: lib/noticelist.php:630 msgid "Reply to this notice" msgstr "Відповісти на цей допис" -#: lib/noticelist.php:630 +#: lib/noticelist.php:631 msgid "Reply" msgstr "Відповісти" -#: lib/noticelist.php:674 +#: lib/noticelist.php:675 msgid "Notice repeated" msgstr "Допис повторили" diff --git a/locale/zh_CN/LC_MESSAGES/statusnet.po b/locale/zh_CN/LC_MESSAGES/statusnet.po index 9de9d8e750..0a982b2e44 100644 --- a/locale/zh_CN/LC_MESSAGES/statusnet.po +++ b/locale/zh_CN/LC_MESSAGES/statusnet.po @@ -2,6 +2,7 @@ # # Author@translatewiki.net: Chenxiaoqino # Author@translatewiki.net: Shizhao +# Author@translatewiki.net: Sweeite012f # -- # Messages of identi.ca # Copyright (C) 2008 Gouki @@ -11,12 +12,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-07 16:23+0000\n" -"PO-Revision-Date: 2010-08-07 16:25:08+0000\n" +"POT-Creation-Date: 2010-08-11 10:11+0000\n" +"PO-Revision-Date: 2010-08-11 10:13:25+0000\n" "Language-Team: Simplified Chinese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70848); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: zh-hans\n" "X-Message-Group: out-statusnet\n" @@ -71,9 +72,8 @@ msgstr "禁止新用户注册" #. TRANS: Checkbox label for disabling new user registrations. #: actions/accessadminpanel.php:185 -#, fuzzy msgid "Closed" -msgstr "已关闭" +msgstr "" #. TRANS: Title / tooltip for button to save access settings in site admin panel #: actions/accessadminpanel.php:202 @@ -98,7 +98,7 @@ msgstr "保存" #: actions/showfavorites.php:138 actions/tag.php:52 #, fuzzy msgid "No such page." -msgstr "没有该页面" +msgstr "未找到此消息。" #: actions/all.php:79 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:114 @@ -296,9 +296,8 @@ msgid "Could not update your design." msgstr "无法更新用户。" #: actions/apiblockcreate.php:105 -#, fuzzy msgid "You cannot block yourself!" -msgstr "无法更新用户。" +msgstr "" #: actions/apiblockcreate.php:126 msgid "Block user failed." @@ -335,7 +334,7 @@ msgstr "消息没有正文!" #: actions/apidirectmessagenew.php:127 actions/newmessage.php:150 #, fuzzy, php-format msgid "That's too long. Max message size is %d chars." -msgstr "超出长度限制。不能超过 140 个字符。" +msgstr "你可以给你的组上载一个logo图。" #: actions/apidirectmessagenew.php:138 msgid "Recipient user not found." @@ -371,7 +370,7 @@ msgstr "无法删除收藏。" #: actions/apifriendshipscreate.php:109 #, fuzzy msgid "Could not follow user: profile not found." -msgstr "无法订阅用户:未找到。" +msgstr "无法订阅用户:%s 已在订阅列表中。" #: actions/apifriendshipscreate.php:118 #, php-format @@ -381,27 +380,25 @@ msgstr "无法订阅用户:%s 已在订阅列表中。" #: actions/apifriendshipsdestroy.php:109 #, fuzzy msgid "Could not unfollow user: User not found." -msgstr "无法订阅用户:未找到。" +msgstr "无法订阅用户:%s 已在订阅列表中。" #: actions/apifriendshipsdestroy.php:120 -#, fuzzy msgid "You cannot unfollow yourself." -msgstr "无法更新用户。" +msgstr "" #: actions/apifriendshipsexists.php:91 -#, fuzzy msgid "Two valid IDs or screen_names must be supplied." -msgstr "必须提供两个用户帐号或昵称。" +msgstr "" #: actions/apifriendshipsshow.php:134 #, fuzzy msgid "Could not determine source user." -msgstr "无法获取收藏的通告。" +msgstr "无法更新用户。" #: actions/apifriendshipsshow.php:142 #, fuzzy msgid "Could not find target user." -msgstr "找不到任何信息。" +msgstr "无法更新用户。" #: actions/apigroupcreate.php:167 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 @@ -438,7 +435,7 @@ msgstr "全名过长(不能超过 255 个字符)。" #: actions/newapplication.php:172 #, fuzzy, php-format msgid "Description is too long (max %d chars)." -msgstr "描述过长(不能超过%d 个字符)。" +msgstr "位置过长(不能超过255个字符)。" #: actions/apigroupcreate.php:227 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 @@ -455,13 +452,13 @@ msgstr "太多化名了!最多%d 个。" #: actions/apigroupcreate.php:267 #, fuzzy, php-format msgid "Invalid alias: \"%s\"." -msgstr "主页'%s'不正确" +msgstr "电子邮件地址 %s 不正确" #: actions/apigroupcreate.php:276 actions/editgroup.php:232 #: actions/newgroup.php:172 #, fuzzy, php-format msgid "Alias \"%s\" already in use. Try another one." -msgstr "昵称%s已被使用,换一个吧。" +msgstr "昵称已被使用,换一个吧。" #: actions/apigroupcreate.php:289 actions/editgroup.php:238 #: actions/newgroup.php:178 @@ -486,7 +483,7 @@ msgstr "" #: actions/apigroupjoin.php:139 actions/joingroup.php:134 #, fuzzy, php-format msgid "Could not join user %1$s to group %2$s." -msgstr "无法把 %s 用户添加到 %s 组" +msgstr "无法更新组" #: actions/apigroupleave.php:115 #, fuzzy @@ -496,7 +493,7 @@ msgstr "您未告知此个人信息" #: actions/apigroupleave.php:125 actions/leavegroup.php:129 #, fuzzy, php-format msgid "Could not remove user %1$s from group %2$s." -msgstr "无法订阅用户:未找到。" +msgstr "无法创建组。" #. TRANS: %s is a user name #: actions/apigrouplist.php:98 @@ -523,9 +520,8 @@ msgid "groups on %s" msgstr "组动作" #: actions/apimediaupload.php:99 -#, fuzzy msgid "Upload failed." -msgstr "上传" +msgstr "上传失败" #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." @@ -560,14 +556,12 @@ msgid "Invalid nickname / password!" msgstr "用户名或密码不正确。" #: actions/apioauthauthorize.php:159 -#, fuzzy msgid "Database error deleting OAuth application user." -msgstr "保存用户设置时出错。" +msgstr "" #: actions/apioauthauthorize.php:185 -#, fuzzy msgid "Database error inserting OAuth application user." -msgstr "添加标签时数据库出错:%s" +msgstr "" #: actions/apioauthauthorize.php:214 #, php-format @@ -662,12 +656,11 @@ msgstr "无法开启通告。" #: actions/apistatusesretweet.php:91 #, fuzzy msgid "Already repeated that notice." -msgstr "删除通告" +msgstr "无法删除通告。" #: actions/apistatusesshow.php:139 -#, fuzzy msgid "Status deleted." -msgstr "头像已更新。" +msgstr "" #: actions/apistatusesshow.php:145 msgid "No status with that ID found." @@ -681,12 +674,12 @@ msgstr "" #: lib/mailhandler.php:60 #, fuzzy, php-format msgid "That's too long. Max notice size is %d chars." -msgstr "超出长度限制。不能超过 140 个字符。" +msgstr "你可以给你的组上载一个logo图。" #: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 #, fuzzy msgid "Not found." -msgstr "未找到" +msgstr "小组未找到。" #: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format @@ -701,17 +694,17 @@ msgstr "不支持这种图像格式。" #: actions/apitimelinefavorites.php:110 #, fuzzy, php-format msgid "%1$s / Favorites from %2$s" -msgstr "%s 的收藏 / %s" +msgstr "%1$s 的 %2$s 状态" #: actions/apitimelinefavorites.php:119 #, fuzzy, php-format msgid "%1$s updates favorited by %2$s / %2$s." -msgstr "%s 收藏了 %s 的 %s 通告。" +msgstr "回复 %2$s / %3$s 的 %1$s 更新。" #: actions/apitimelinementions.php:118 #, fuzzy, php-format msgid "%1$s / Updates mentioning %2$s" -msgstr "%1$s / 回复 %2$s 的消息" +msgstr "%1$s 的 %2$s 状态" #: actions/apitimelinementions.php:131 #, php-format @@ -755,7 +748,7 @@ msgstr "API 方法尚未实现。" #: actions/attachment.php:73 #, fuzzy msgid "No such attachment." -msgstr "没有这份文档。" +msgstr "没有这份通告。" #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 @@ -781,14 +774,14 @@ msgstr "头像" #: actions/avatarsettings.php:78 #, fuzzy, php-format msgid "You can upload your personal avatar. The maximum file size is %s." -msgstr "您可以在这里上传个人头像。" +msgstr "你可以给你的组上载一个logo图。" #: actions/avatarsettings.php:106 actions/avatarsettings.php:185 #: actions/grouplogo.php:181 actions/remotesubscribe.php:191 #: actions/userauthorization.php:72 actions/userrss.php:108 #, fuzzy msgid "User without matching profile." -msgstr "找不到匹配的用户。" +msgstr "用户没有个人信息。" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 #: actions/grouplogo.php:254 @@ -806,10 +799,10 @@ msgid "Preview" msgstr "预览" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:656 +#: lib/deleteuserform.php:66 lib/noticelist.php:657 #, fuzzy msgid "Delete" -msgstr "删除" +msgstr "删除通告" #: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" @@ -822,7 +815,7 @@ msgstr "剪裁" #: actions/avatarsettings.php:305 #, fuzzy msgid "No file uploaded." -msgstr "没有收件人。" +msgstr "部分上传。" #: actions/avatarsettings.php:332 msgid "Pick a square area of the image to be your avatar" @@ -848,12 +841,12 @@ msgstr "头像已更新。" #: actions/block.php:69 #, fuzzy msgid "You already blocked that user." -msgstr "您已成功阻止该用户:" +msgstr "您已订阅这些用户:" #: actions/block.php:107 actions/block.php:136 actions/groupblock.php:158 #, fuzzy msgid "Block user" -msgstr "阻止用户" +msgstr "阻止用户失败。" #: actions/block.php:138 msgid "" @@ -870,17 +863,15 @@ msgstr "" #: actions/block.php:153 actions/deleteapplication.php:154 #: actions/deletenotice.php:147 actions/deleteuser.php:152 #: actions/groupblock.php:178 -#, fuzzy msgctxt "BUTTON" msgid "No" -msgstr "否" +msgstr "" #. TRANS: Submit button title for 'No' when blocking a user. #. TRANS: Submit button title for 'No' when deleting a user. #: actions/block.php:157 actions/deleteuser.php:156 -#, fuzzy msgid "Do not block this user" -msgstr "取消阻止次用户" +msgstr "" #. TRANS: Button label on the user block form. #. TRANS: Button label on the delete application form. @@ -899,7 +890,7 @@ msgstr "是" #: actions/block.php:164 actions/groupmembers.php:392 lib/blockform.php:80 #, fuzzy msgid "Block this user" -msgstr "阻止该用户" +msgstr "呼叫这个用户" #: actions/block.php:187 msgid "Failed to save block information." @@ -920,14 +911,14 @@ msgid "No such group." msgstr "没有这个组。" #: actions/blockedfromgroup.php:97 -#, fuzzy, php-format +#, php-format msgid "%s blocked profiles" -msgstr "用户没有个人信息。" +msgstr "" #: actions/blockedfromgroup.php:100 #, fuzzy, php-format msgid "%1$s blocked profiles, page %2$d" -msgstr "%s 及好友" +msgstr "%1$s 和好友,第%2$d页" #: actions/blockedfromgroup.php:115 #, fuzzy @@ -946,13 +937,13 @@ msgstr "取消阻止" #: actions/blockedfromgroup.php:320 lib/unblockform.php:80 #, fuzzy msgid "Unblock this user" -msgstr "取消阻止次用户" +msgstr "取消阻止用户失败。" #. TRANS: Title for mini-posting window loaded from bookmarklet. #: actions/bookmarklet.php:51 #, fuzzy, php-format msgid "Post to %s" -msgstr "相片" +msgstr "%s 的回复" #: actions/confirmaddress.php:75 msgid "No confirmation code." @@ -968,9 +959,9 @@ msgstr "此确认码不适用!" #. TRANS: Server error for an unknow address type, which can be 'email', 'jabber', or 'sms'. #: actions/confirmaddress.php:91 -#, fuzzy, php-format +#, php-format msgid "Unrecognized address type %s." -msgstr "不可识别的地址类型 %s" +msgstr "" #. TRANS: Client error for an already confirmed email/jabbel/sms address. #: actions/confirmaddress.php:96 @@ -1001,7 +992,7 @@ msgstr "无法删除电子邮件确认。" #: actions/confirmaddress.php:146 #, fuzzy msgid "Confirm address" -msgstr "确认地址" +msgstr "已确认的电子邮件。" #: actions/confirmaddress.php:161 #, php-format @@ -1026,7 +1017,7 @@ msgstr "您必须登录才能创建小组。" #: actions/deleteapplication.php:71 #, fuzzy msgid "Application not found." -msgstr "通告没有关联个人信息" +msgstr "未找到确认码。" #: actions/deleteapplication.php:78 actions/editapplication.php:77 #: actions/showapplication.php:94 @@ -1042,9 +1033,8 @@ msgid "There was a problem with your session token." msgstr "会话标识有问题,请重试。" #: actions/deleteapplication.php:123 actions/deleteapplication.php:147 -#, fuzzy msgid "Delete application" -msgstr "没有这份通告。" +msgstr "" #: actions/deleteapplication.php:149 msgid "" @@ -1063,9 +1053,8 @@ msgstr "无法删除通告。" #. TRANS: Submit button title for 'Yes' when deleting an application. #: actions/deleteapplication.php:164 -#, fuzzy msgid "Delete this application" -msgstr "删除通告" +msgstr "" #. TRANS: Client error message thrown when trying to access the admin panel while not logged in. #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 @@ -1083,11 +1072,10 @@ msgid "Can't delete this notice." msgstr "无法删除通告。" #: actions/deletenotice.php:103 -#, fuzzy msgid "" "You are about to permanently delete a notice. Once this is done, it cannot " "be undone." -msgstr "您选择了永久删除通告。这样做是无法恢复的。" +msgstr "" #: actions/deletenotice.php:109 actions/deletenotice.php:141 msgid "Delete notice" @@ -1104,7 +1092,7 @@ msgid "Do not delete this notice" msgstr "无法删除通告。" #. TRANS: Submit button title for 'Yes' when deleting a notice. -#: actions/deletenotice.php:158 lib/noticelist.php:656 +#: actions/deletenotice.php:158 lib/noticelist.php:657 #, fuzzy msgid "Delete this notice" msgstr "删除通告" @@ -1122,19 +1110,22 @@ msgstr "您不能删除其他用户的状态。" #: actions/deleteuser.php:110 actions/deleteuser.php:133 #, fuzzy msgid "Delete user" -msgstr "删除" +msgstr "删除通告" #: actions/deleteuser.php:136 +#, fuzzy msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." msgstr "" +"你确定要删除这个组件吗?这将从数据库中清除有关这个组件的所有数据,包括所有的" +"用户联系。" #. TRANS: Submit button title for 'Yes' when deleting a user. #: actions/deleteuser.php:163 lib/deleteuserform.php:77 #, fuzzy msgid "Delete this user" -msgstr "删除通告" +msgstr "呼叫这个用户" #. TRANS: Message used as title for design settings for the site. #. TRANS: Link description in user account settings menu. @@ -1153,19 +1144,18 @@ msgid "Invalid logo URL." msgstr "大小不正确。" #: actions/designadminpanel.php:322 -#, fuzzy, php-format +#, php-format msgid "Theme not available: %s." -msgstr "这个页面不提供您想要的媒体类型" +msgstr "" #: actions/designadminpanel.php:426 #, fuzzy msgid "Change logo" -msgstr "修改密码" +msgstr "修改" #: actions/designadminpanel.php:431 -#, fuzzy msgid "Site logo" -msgstr "邀请" +msgstr "" #: actions/designadminpanel.php:443 #, fuzzy @@ -1173,19 +1163,16 @@ msgid "Change theme" msgstr "修改" #: actions/designadminpanel.php:460 -#, fuzzy msgid "Site theme" -msgstr "新通告" +msgstr "" #: actions/designadminpanel.php:461 -#, fuzzy msgid "Theme for the site." -msgstr "登出本站" +msgstr "" #: actions/designadminpanel.php:467 -#, fuzzy msgid "Custom theme" -msgstr "新通告" +msgstr "" #: actions/designadminpanel.php:471 msgid "You can upload a custom StatusNet theme as a .ZIP archive." @@ -1295,12 +1282,11 @@ msgstr "加入收藏" #: actions/doc.php:158 #, fuzzy, php-format msgid "No such document \"%s\"" -msgstr "没有这份文档。" +msgstr "没有这份通告。" #: actions/editapplication.php:54 -#, fuzzy msgid "Edit Application" -msgstr "其他选项" +msgstr "" #: actions/editapplication.php:66 #, fuzzy @@ -1336,7 +1322,7 @@ msgstr "昵称已被使用,换一个吧。" #: actions/editapplication.php:186 actions/newapplication.php:168 #, fuzzy msgid "Description is required." -msgstr "描述" +msgstr "订阅被拒绝" #: actions/editapplication.php:194 msgid "Source URL is too long." @@ -1386,7 +1372,7 @@ msgstr "您必须登录才能创建小组。" #: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 #, fuzzy msgid "You must be an admin to edit the group." -msgstr "只有admin才能编辑这个组" +msgstr "您必须登录才能创建小组。" #: actions/editgroup.php:158 msgid "Use this form to edit the group." @@ -1395,12 +1381,12 @@ msgstr "使用这个表单来编辑组" #: actions/editgroup.php:205 actions/newgroup.php:145 #, fuzzy, php-format msgid "description is too long (max %d chars)." -msgstr "描述过长(不能超过140字符)。" +msgstr "位置过长(不能超过255个字符)。" #: actions/editgroup.php:228 actions/newgroup.php:168 #, fuzzy, php-format msgid "Invalid alias: \"%s\"" -msgstr "主页'%s'不正确" +msgstr "电子邮件地址 %s 不正确" #: actions/editgroup.php:258 msgid "Could not update group." @@ -1420,7 +1406,7 @@ msgstr "选项已保存。" #: actions/emailsettings.php:61 #, fuzzy msgid "Email settings" -msgstr "电子邮件设置" +msgstr "个人设置" #. TRANS: E-mail settings page instructions. #. TRANS: %%site.name%% is the name of the site. @@ -1452,7 +1438,7 @@ msgstr "已确认的电子邮件。" #, fuzzy msgctxt "BUTTON" msgid "Remove" -msgstr "移除" +msgstr "恢复" #: actions/emailsettings.php:122 msgid "" @@ -1483,10 +1469,9 @@ msgstr "电子邮件,类似 \"UserName@example.org\"" #. TRANS: Button label for adding a SMS phone number in SMS settings form. #: actions/emailsettings.php:139 actions/imsettings.php:148 #: actions/smssettings.php:162 -#, fuzzy msgctxt "BUTTON" msgid "Add" -msgstr "添加" +msgstr "" #. TRANS: Form legend for incoming e-mail settings form. #. TRANS: Form legend for incoming SMS settings form. @@ -1509,16 +1494,15 @@ msgstr "生成新的电子邮件地址用于发布信息;取消旧的。" #. TRANS: Button label for adding an e-mail address to send notices from. #. TRANS: Button label for adding an SMS e-mail address to send notices from. #: actions/emailsettings.php:168 actions/smssettings.php:189 -#, fuzzy msgctxt "BUTTON" msgid "New" -msgstr "新建" +msgstr "" #. TRANS: Form legend for e-mail preferences form. #: actions/emailsettings.php:174 #, fuzzy msgid "Email preferences" -msgstr "首选项" +msgstr "电子邮件地址" #. TRANS: Checkbox label in e-mail preferences form. #: actions/emailsettings.php:180 @@ -1560,7 +1544,7 @@ msgstr "公开电子邮件的 MicroID。" #: actions/emailsettings.php:334 #, fuzzy msgid "Email preferences saved." -msgstr "同步选项已保存。" +msgstr "首选项已保存。" #. TRANS: Message given saving e-mail address without having provided one. #: actions/emailsettings.php:353 @@ -1623,7 +1607,7 @@ msgstr "即时通讯帐号错误。" #: actions/emailsettings.php:438 #, fuzzy msgid "Email confirmation cancelled." -msgstr "已取消确认。" +msgstr "没有可以取消的确认。" #. TRANS: Message given trying to remove an e-mail address that is not #. TRANS: registered for the active user. @@ -1635,7 +1619,7 @@ msgstr "这是他人的电子邮件。" #: actions/emailsettings.php:479 #, fuzzy msgid "The email address was removed." -msgstr "地址被移除。" +msgstr "发布用的电子邮件被移除。" #: actions/emailsettings.php:493 actions/smssettings.php:568 msgid "No incoming email address." @@ -1665,7 +1649,7 @@ msgstr "已收藏此通告!" #: actions/favor.php:92 lib/disfavorform.php:140 #, fuzzy msgid "Disfavor favorite" -msgstr "取消收藏" +msgstr "加入收藏" #: actions/favorited.php:65 lib/popularnoticesection.php:91 #: lib/publicgroupnav.php:93 @@ -1676,12 +1660,11 @@ msgstr "没有这份通告。" #: actions/favorited.php:67 #, fuzzy, php-format msgid "Popular notices, page %d" -msgstr "没有这份通告。" +msgstr "组,第 %d 页" #: actions/favorited.php:79 -#, fuzzy msgid "The most popular notices on the site right now." -msgstr "显示上周以来最流行的标签" +msgstr "" #: actions/favorited.php:150 msgid "Favorite notices appear on this page but no one has favorited one yet." @@ -1722,38 +1705,35 @@ msgid "Featured users, page %d" msgstr "推荐用户,第 %d 页" #: actions/featured.php:99 -#, fuzzy, php-format +#, php-format msgid "A selection of some great users on %s" -msgstr "%s 优秀用户摘选" +msgstr "" #: actions/file.php:34 #, fuzzy msgid "No notice ID." -msgstr "新通告" +msgstr "没有这份通告。" #: actions/file.php:38 #, fuzzy msgid "No notice." -msgstr "新通告" +msgstr "没有这份通告。" #: actions/file.php:42 -#, fuzzy msgid "No attachments." -msgstr "没有这份文档。" +msgstr "" #: actions/file.php:51 -#, fuzzy msgid "No uploaded attachments." -msgstr "没有这份文档。" +msgstr "" #: actions/finishremotesubscribe.php:69 msgid "Not expecting this response!" msgstr "未预料的响应!" #: actions/finishremotesubscribe.php:80 -#, fuzzy msgid "User being listened to does not exist." -msgstr "要查看的用户不存在。" +msgstr "" #: actions/finishremotesubscribe.php:87 actions/remotesubscribe.php:59 msgid "You can use the local subscription!" @@ -1766,17 +1746,15 @@ msgstr "那个用户阻止了你的订阅。" #: actions/finishremotesubscribe.php:110 #, fuzzy msgid "You are not authorized." -msgstr "未认证。" +msgstr "订阅已确认" #: actions/finishremotesubscribe.php:113 -#, fuzzy msgid "Could not convert request token to access token." -msgstr "无法将请求标记转换为访问令牌。" +msgstr "" #: actions/finishremotesubscribe.php:118 -#, fuzzy msgid "Remote service uses unknown version of OMB protocol." -msgstr "此OMB协议版本无效。" +msgstr "" #: actions/finishremotesubscribe.php:138 #, fuzzy @@ -1791,7 +1769,7 @@ msgstr "没有这份通告。" #: actions/getfile.php:83 #, fuzzy msgid "Cannot read file." -msgstr "没有这份通告。" +msgstr "无法创建收藏。" #: actions/grantrole.php:62 actions/revokerole.php:62 #, fuzzy @@ -1805,7 +1783,7 @@ msgstr "" #: actions/grantrole.php:75 #, fuzzy msgid "You cannot grant user roles on this site." -msgstr "无法向此用户发送消息。" +msgstr "在这个网站你被禁止发布消息。" #: actions/grantrole.php:82 #, fuzzy @@ -1837,9 +1815,8 @@ msgid "Only an admin can block group members." msgstr "" #: actions/groupblock.php:95 -#, fuzzy msgid "User is already blocked from group." -msgstr "用户没有个人信息。" +msgstr "" #: actions/groupblock.php:100 #, fuzzy @@ -1849,7 +1826,7 @@ msgstr "您未告知此个人信息" #: actions/groupblock.php:134 actions/groupmembers.php:360 #, fuzzy msgid "Block user from group" -msgstr "阻止用户" +msgstr "阻止用户失败。" #: actions/groupblock.php:160 #, php-format @@ -1878,7 +1855,7 @@ msgstr "" #: actions/groupbyid.php:74 actions/userbyid.php:70 #, fuzzy msgid "No ID." -msgstr "没有ID" +msgstr "没有 Jabber ID。" #: actions/groupdesignsettings.php:68 #, fuzzy @@ -1905,7 +1882,7 @@ msgstr "无法更新用户。" #: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 #, fuzzy msgid "Design preferences saved." -msgstr "同步选项已保存。" +msgstr "首选项已保存。" #: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" @@ -1929,7 +1906,7 @@ msgstr "logo已更新。" #: actions/grouplogo.php:401 #, fuzzy msgid "Failed updating logo." -msgstr "更新logo失败。" +msgstr "更新头像失败。" #: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format @@ -1939,7 +1916,7 @@ msgstr "%s 组成员" #: actions/groupmembers.php:103 #, fuzzy, php-format msgid "%1$s group members, page %2$d" -msgstr "%s 组成员, 第 %d 页" +msgstr "%s 组成员" #: actions/groupmembers.php:118 msgid "A list of the users in this group." @@ -1954,9 +1931,8 @@ msgid "Block" msgstr "阻止" #: actions/groupmembers.php:487 -#, fuzzy msgid "Make user an admin of the group" -msgstr "只有admin才能编辑这个组" +msgstr "" #: actions/groupmembers.php:519 #, fuzzy @@ -2005,7 +1981,7 @@ msgstr "" #: actions/groups.php:107 actions/usergroups.php:126 lib/groupeditform.php:122 #, fuzzy msgid "Create a new group" -msgstr "创建新组" +msgstr "使用此表格创建组。" #: actions/groupsearch.php:52 #, fuzzy, php-format @@ -2024,7 +2000,7 @@ msgstr "组检索" #: actions/peoplesearch.php:83 #, fuzzy msgid "No results." -msgstr "没有结果" +msgstr "执行结果" #: actions/groupsearch.php:82 #, php-format @@ -2047,18 +2023,17 @@ msgstr "" #: actions/groupunblock.php:95 #, fuzzy msgid "User is not blocked from group." -msgstr "用户没有个人信息。" +msgstr "使用这个表单来编辑组" #: actions/groupunblock.php:128 actions/unblock.php:86 -#, fuzzy msgid "Error removing the block." -msgstr "保存用户时出错。" +msgstr "" #. TRANS: Title for instance messaging settings. #: actions/imsettings.php:60 #, fuzzy msgid "IM settings" -msgstr "IM 设置" +msgstr "头像设置" #. TRANS: Instant messaging settings page instructions. #. TRANS: [instant messages] is link text, "(%%doc.im%%)" is the link. @@ -2074,16 +2049,15 @@ msgstr "" #. TRANS: Message given in the IM settings if XMPP is not enabled on the site. #: actions/imsettings.php:94 -#, fuzzy msgid "IM is not available." -msgstr "这个页面不提供您想要的媒体类型" +msgstr "" #. TRANS: Form legend for IM settings form. #. TRANS: Field label for IM address input in IM settings form. #: actions/imsettings.php:106 actions/imsettings.php:136 #, fuzzy msgid "IM address" -msgstr "IM 帐号" +msgstr "电子邮件地址" #: actions/imsettings.php:113 msgid "Current confirmed Jabber/GTalk address." @@ -2115,7 +2089,7 @@ msgstr "" #: actions/imsettings.php:155 #, fuzzy msgid "IM preferences" -msgstr "首选项" +msgstr "首选项已保存。" #. TRANS: Checkbox label in IM preferences form. #: actions/imsettings.php:160 @@ -2191,7 +2165,7 @@ msgstr "无法删除电子邮件确认。" #: actions/imsettings.php:402 #, fuzzy msgid "IM confirmation cancelled." -msgstr "已取消确认。" +msgstr "没有验证码" #. TRANS: Message given trying to remove an IM address that is not #. TRANS: registered for the active user. @@ -2203,7 +2177,7 @@ msgstr "这不是您的Jabber帐号。" #: actions/imsettings.php:447 #, fuzzy msgid "The IM address was removed." -msgstr "地址被移除。" +msgstr "发布用的电子邮件被移除。" #: actions/inbox.php:59 #, fuzzy, php-format @@ -2226,7 +2200,7 @@ msgstr "" #: actions/invite.php:41 #, fuzzy, php-format msgid "You must be logged in to invite other users to use %s." -msgstr "您必须登录才能邀请其他人使用 %s" +msgstr "您必须登录才能创建小组。" #: actions/invite.php:72 #, php-format @@ -2290,10 +2264,9 @@ msgstr "在邀请中加几句话(可选)。" #. TRANS: Send button for inviting friends #: actions/invite.php:198 -#, fuzzy msgctxt "BUTTON" msgid "Send" -msgstr "发送" +msgstr "" #. TRANS: Subject for invitation email. Note that 'them' is correct as a gender-neutral singular 3rd-person pronoun in English. #: actions/invite.php:228 @@ -2356,7 +2329,7 @@ msgstr "" #: actions/joingroup.php:60 #, fuzzy msgid "You must be logged in to join a group." -msgstr "您必须登录才能加入组。" +msgstr "您必须登录才能创建小组。" #: actions/joingroup.php:88 actions/leavegroup.php:88 #, fuzzy @@ -2366,26 +2339,26 @@ msgstr "没有昵称。" #. TRANS: Message given having added a user to a group. #. TRANS: %1$s is the nickname of the user, %2$s is the nickname of the group. #: actions/joingroup.php:141 lib/command.php:346 -#, fuzzy, php-format +#, php-format msgid "%1$s joined group %2$s" -msgstr "%s 加入 %s 组" +msgstr "" #: actions/leavegroup.php:60 #, fuzzy msgid "You must be logged in to leave a group." -msgstr "您必须登录才能邀请其他人使用 %s" +msgstr "您必须登录才能创建小组。" #: actions/leavegroup.php:100 lib/command.php:373 #, fuzzy msgid "You are not a member of that group." -msgstr "您未告知此个人信息" +msgstr "您已经是该组成员" #. TRANS: Message given having removed a user from a group. #. TRANS: %1$s is the nickname of the user, %2$s is the nickname of the group. #: actions/leavegroup.php:137 lib/command.php:392 #, fuzzy, php-format msgid "%1$s left group %2$s" -msgstr "%s 离开群 %s" +msgstr "%1$s 的 %2$s 状态" #: actions/login.php:102 actions/otp.php:62 actions/register.php:144 msgid "Already logged in." @@ -2396,9 +2369,8 @@ msgid "Incorrect username or password." msgstr "用户名或密码不正确。" #: actions/login.php:154 actions/otp.php:120 -#, fuzzy msgid "Error setting user. You are probably not authorized." -msgstr "未认证。" +msgstr "" #: actions/login.php:210 actions/login.php:263 lib/logingroupnav.php:79 msgid "Login" @@ -2429,44 +2401,40 @@ msgstr "由于安全原因,修改设置前需要输入用户名和密码。" #: actions/login.php:292 #, fuzzy msgid "Login with your username and password." -msgstr "输入用户名和密码以登录。" +msgstr "用户名或密码不正确。" #: actions/login.php:295 -#, fuzzy, php-format +#, php-format msgid "" "Don't have a username yet? [Register](%%action.register%%) a new account." msgstr "" -"请使用你的帐号和密码登入。没有帐号?[注册](%%action.register%%) 一个新帐号, " -"或使用 [OpenID](%%action.openidlogin%%). " #: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "" #: actions/makeadmin.php:96 -#, fuzzy, php-format +#, php-format msgid "%1$s is already an admin for group \"%2$s\"." -msgstr "用户没有个人信息。" +msgstr "" #: actions/makeadmin.php:133 -#, fuzzy, php-format +#, php-format msgid "Can't get membership record for %1$s in group %2$s." -msgstr "无法订阅用户:未找到。" +msgstr "" #: actions/makeadmin.php:146 -#, fuzzy, php-format +#, php-format msgid "Can't make %1$s an admin for group %2$s." -msgstr "只有admin才能编辑这个组" +msgstr "" #: actions/microsummary.php:69 -#, fuzzy msgid "No current status." -msgstr "没有当前状态" +msgstr "" #: actions/newapplication.php:52 -#, fuzzy msgid "New Application" -msgstr "没有这份通告。" +msgstr "" #: actions/newapplication.php:64 #, fuzzy @@ -2520,7 +2488,7 @@ msgstr "不要向自己发送消息;跟自己悄悄说就得了。" #: actions/newmessage.php:181 #, fuzzy msgid "Message sent" -msgstr "新消息" +msgstr "消息没有正文!" #: actions/newmessage.php:185 #, fuzzy, php-format @@ -2555,7 +2523,7 @@ msgstr "搜索文本" #: actions/noticesearch.php:91 #, fuzzy, php-format msgid "Search results for \"%1$s\" on %2$s" -msgstr "搜索有关\"%s\"的消息" +msgstr "来自 %1$s 的 %2$s 消息" #: actions/noticesearch.php:121 #, php-format @@ -2572,20 +2540,19 @@ msgid "" msgstr "" #: actions/noticesearchrss.php:96 -#, fuzzy, php-format +#, php-format msgid "Updates with \"%s\"" -msgstr "%2$s 上 %1$s 的更新!" +msgstr "" #: actions/noticesearchrss.php:98 #, fuzzy, php-format msgid "Updates matching search term \"%1$s\" on %2$s!" -msgstr "所有匹配搜索条件\"%s\"的消息" +msgstr "%2$s 上 %1$s 的更新!" #: actions/nudge.php:85 -#, fuzzy msgid "" "This user doesn't allow nudges or hasn't confirmed or set their email yet." -msgstr "此用户不允许振铃呼叫或者还没有确认或设置TA的电子邮件。" +msgstr "" #: actions/nudge.php:94 msgid "Nudge sent" @@ -2623,9 +2590,8 @@ msgid "You have allowed the following applications to access you account." msgstr "" #: actions/oauthconnectionssettings.php:175 -#, fuzzy msgid "You are not a user of that application." -msgstr "您未告知此个人信息" +msgstr "" #: actions/oauthconnectionssettings.php:186 #, php-format @@ -2643,7 +2609,7 @@ msgstr "" #: actions/oembed.php:80 actions/shownotice.php:100 #, fuzzy msgid "Notice has no profile." -msgstr "通告没有关联个人信息" +msgstr "用户没有个人信息。" #: actions/oembed.php:87 actions/shownotice.php:175 #, php-format @@ -2652,9 +2618,9 @@ msgstr "%1$s 的 %2$s 状态" #. TRANS: Error message displaying attachments. %s is a raw MIME type (eg 'image/png') #: actions/oembed.php:159 -#, fuzzy, php-format +#, php-format msgid "Content type %s not supported." -msgstr "连接" +msgstr "" #. TRANS: Error message displaying attachments. %s is the site's base URL. #: actions/oembed.php:163 @@ -2679,7 +2645,7 @@ msgstr "搜索通告" #: actions/othersettings.php:60 #, fuzzy msgid "Other settings" -msgstr "Twitter 设置" +msgstr "头像设置" #: actions/othersettings.php:71 msgid "Manage various other options." @@ -2709,7 +2675,7 @@ msgstr "" #: actions/othersettings.php:153 #, fuzzy msgid "URL shortening service is too long (max 50 chars)." -msgstr "URL缩短服务超长(最多50个字符)。" +msgstr "语言过长(不能超过50个字符)。" #: actions/otp.php:69 #, fuzzy @@ -2724,12 +2690,11 @@ msgstr "没有收件人。" #: actions/otp.php:90 #, fuzzy msgid "No login token requested." -msgstr "服务器没有返回个人信息URL。" +msgstr "未收到认证请求!" #: actions/otp.php:95 -#, fuzzy msgid "Invalid login token specified." -msgstr "通告内容不正确" +msgstr "" #: actions/otp.php:104 #, fuzzy @@ -2823,24 +2788,24 @@ msgid "Path and server settings for this StatusNet site." msgstr "" #: actions/pathsadminpanel.php:157 -#, fuzzy, php-format +#, php-format msgid "Theme directory not readable: %s." -msgstr "这个页面不提供您想要的媒体类型" +msgstr "" #: actions/pathsadminpanel.php:163 -#, fuzzy, php-format +#, php-format msgid "Avatar directory not writable: %s." -msgstr "这个页面不提供您想要的媒体类型" +msgstr "" #: actions/pathsadminpanel.php:169 -#, fuzzy, php-format +#, php-format msgid "Background directory not writable: %s." -msgstr "这个页面不提供您想要的媒体类型" +msgstr "" #: actions/pathsadminpanel.php:177 -#, fuzzy, php-format +#, php-format msgid "Locales directory not readable: %s." -msgstr "这个页面不提供您想要的媒体类型" +msgstr "" #: actions/pathsadminpanel.php:183 msgid "Invalid SSL server. The maximum length is 255 characters." @@ -2865,9 +2830,8 @@ msgid "Path" msgstr "" #: actions/pathsadminpanel.php:242 -#, fuzzy msgid "Site path" -msgstr "新通告" +msgstr "" #: actions/pathsadminpanel.php:246 msgid "Path to locales" @@ -2917,9 +2881,8 @@ msgid "Avatar path" msgstr "头像已更新。" #: actions/pathsadminpanel.php:292 -#, fuzzy msgid "Avatar directory" -msgstr "头像已更新。" +msgstr "" #: actions/pathsadminpanel.php:301 msgid "Backgrounds" @@ -2965,18 +2928,16 @@ msgid "When to use SSL" msgstr "" #: actions/pathsadminpanel.php:335 -#, fuzzy msgid "SSL server" -msgstr "恢复" +msgstr "" #: actions/pathsadminpanel.php:336 msgid "Server to direct SSL requests to" msgstr "" #: actions/pathsadminpanel.php:352 -#, fuzzy msgid "Save paths" -msgstr "新通告" +msgstr "" #: actions/peoplesearch.php:52 #, php-format @@ -2994,17 +2955,17 @@ msgstr "搜索用户" #: actions/peopletag.php:68 #, fuzzy, php-format msgid "Not a valid people tag: %s." -msgstr "不是有效的电子邮件" +msgstr "不是有效的电子邮件。" #: actions/peopletag.php:142 -#, fuzzy, php-format +#, php-format msgid "Users self-tagged with %1$s - page %2$d" -msgstr "用户自加标签 %s - 第 %d 页" +msgstr "" #: actions/postnotice.php:95 #, fuzzy msgid "Invalid notice content." -msgstr "通告内容不正确" +msgstr "大小不正确。" #: actions/postnotice.php:101 #, php-format @@ -3023,7 +2984,7 @@ msgstr "在这里更新个人信息,让大家对您了解得更多。" #: actions/profilesettings.php:99 #, fuzzy msgid "Profile information" -msgstr "未知的帐号" +msgstr "个人设置" #: actions/profilesettings.php:108 lib/groupeditform.php:154 msgid "1-64 lowercase letters or numbers, no punctuation or spaces" @@ -3046,14 +3007,13 @@ msgid "URL of your homepage, blog, or profile on another site" msgstr "您的主页、博客或在其他站点的URL" #: actions/profilesettings.php:122 actions/register.php:468 -#, fuzzy, php-format +#, php-format msgid "Describe yourself and your interests in %d chars" -msgstr "用不超过140个字符描述您自己和您的爱好" +msgstr "" #: actions/profilesettings.php:125 actions/register.php:471 -#, fuzzy msgid "Describe yourself and your interests" -msgstr "用不超过140个字符描述您自己和您的爱好" +msgstr "" #: actions/profilesettings.php:127 actions/register.php:473 msgid "Bio" @@ -3109,7 +3069,7 @@ msgstr "自动订阅任何订阅我的更新的人(这个选项最适合机器 #: actions/profilesettings.php:228 actions/register.php:230 #, fuzzy, php-format msgid "Bio is too long (max %d chars)." -msgstr "自述过长(不能超过140字符)。" +msgstr "位置过长(不能超过255个字符)。" #: actions/profilesettings.php:235 actions/siteadminpanel.php:151 msgid "Timezone not selected." @@ -3122,7 +3082,7 @@ msgstr "语言过长(不能超过50个字符)。" #: actions/profilesettings.php:253 actions/tagother.php:178 #, fuzzy, php-format msgid "Invalid tag: \"%s\"" -msgstr "主页'%s'不正确" +msgstr "电子邮件地址 %s 不正确" #: actions/profilesettings.php:306 msgid "Couldn't update user for autosubscribe." @@ -3167,26 +3127,23 @@ msgid "Public timeline" msgstr "公开的时间表" #: actions/public.php:160 -#, fuzzy msgid "Public Stream Feed (RSS 1.0)" -msgstr "公开的聚合" +msgstr "" #: actions/public.php:164 -#, fuzzy msgid "Public Stream Feed (RSS 2.0)" -msgstr "公开的聚合" +msgstr "" #: actions/public.php:168 -#, fuzzy msgid "Public Stream Feed (Atom)" -msgstr "公开的聚合" +msgstr "" #: actions/public.php:188 -#, php-format +#, fuzzy, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " "yet." -msgstr "" +msgstr "这是 %s 和好友的时间线,但是没有任何人发布内容。" #: actions/public.php:191 msgid "Be the first to post!" @@ -3208,19 +3165,17 @@ msgid "" msgstr "" #: actions/public.php:247 -#, fuzzy, php-format +#, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" "blogging) service based on the Free Software [StatusNet](http://status.net/) " "tool." msgstr "" -"这里是 %%site.name%%,一个微博客 [micro-blogging](http://en.wikipedia.org/" -"wiki/Micro-blogging) 服务" #: actions/publictagcloud.php:57 #, fuzzy msgid "Public tag cloud" -msgstr "公开的聚合" +msgstr "标签云聚集" #: actions/publictagcloud.php:63 #, php-format @@ -3276,22 +3231,25 @@ msgid "Could not update user with confirmed email address." msgstr "无法更新已确认的电子邮件。" #: actions/recoverpassword.php:152 +#, fuzzy msgid "" "If you have forgotten or lost your password, you can get a new one sent to " "the email address you have stored in your account." -msgstr "" +msgstr "恢复密码的指示已被发送到您的注册邮箱。" #: actions/recoverpassword.php:158 msgid "You have been identified. Enter a new password below. " msgstr "" #: actions/recoverpassword.php:188 +#, fuzzy msgid "Password recovery" -msgstr "" +msgstr "请求恢复密码" #: actions/recoverpassword.php:191 +#, fuzzy msgid "Nickname or email address" -msgstr "" +msgstr "输入昵称或电子邮件。" #: actions/recoverpassword.php:193 msgid "Your nickname on this server, or your registered email address." @@ -3455,14 +3413,14 @@ msgstr "" #. TRANS: Copyright checkbox label in registration dialog, for Creative Commons-style licenses. #: actions/register.php:540 -#, fuzzy, php-format +#, php-format msgid "" "My text and files are available under %s except this private data: password, " "email address, IM address, and phone number." -msgstr "除了隐私内容:密码,电子邮件,即时通讯帐号,电话号码。" +msgstr "" #: actions/register.php:583 -#, fuzzy, php-format +#, php-format msgid "" "Congratulations, %1$s! And welcome to %%%%site.name%%%%. From here, you may " "want to...\n" @@ -3479,18 +3437,6 @@ msgid "" "\n" "Thanks for signing up and we hope you enjoy using this service." msgstr "" -"恭喜, %s! 欢迎来到 %%%%site.name%%%%. 这里,你需要\n" -"\n" -"* 查看你的资料Go to [your profile](%s) 发布你的第一条消息.\n" -"* 填加 [Jabber/GTalk address](%%%%action.imsettings%%%%) 然后你可以通过即时消" -"息平台发布信息。\n" -"* [Search for people](%%%%action.peoplesearch%%%%) 你认识的或和你有共同兴趣的" -"朋友。 \n" -"* 更新你的 [profile settings](%%%%action.profilesettings%%%%) 告诉大家更多关" -"于你的情况。 \n" -"* 请阅读 [online docs](%%%%doc.help%%%%) 有的功能也许你还不熟悉。\n" -"\n" -"感谢您的注册,希望您喜欢这个服务。" #: actions/register.php:607 msgid "" @@ -3544,19 +3490,16 @@ msgid "Invalid profile URL (bad format)" msgstr "个人信息URL不正确(格式错误)" #: actions/remotesubscribe.php:168 -#, fuzzy msgid "Not a valid profile URL (no YADIS document or invalid XRDS defined)." -msgstr "不是有效的个人信息URL(没有YADIS数据)。" +msgstr "" #: actions/remotesubscribe.php:176 -#, fuzzy msgid "That’s a local profile! Login to subscribe." -msgstr "那是一个本地资料!需要登录才能订阅。" +msgstr "" #: actions/remotesubscribe.php:183 -#, fuzzy msgid "Couldn’t get a request token." -msgstr "无法获得一份请求标记。" +msgstr "" #: actions/repeat.php:57 #, fuzzy @@ -3574,19 +3517,17 @@ msgid "You can't repeat your own notice." msgstr "您必须同意此授权方可注册。" #: actions/repeat.php:90 -#, fuzzy msgid "You already repeated that notice." -msgstr "您已成功阻止该用户:" +msgstr "" -#: actions/repeat.php:114 lib/noticelist.php:675 +#: actions/repeat.php:114 lib/noticelist.php:676 #, fuzzy msgid "Repeated" -msgstr "创建" +msgstr "特征" #: actions/repeat.php:119 -#, fuzzy msgid "Repeated!" -msgstr "创建" +msgstr "" #: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 @@ -3597,22 +3538,22 @@ msgstr "%s 的回复" #: actions/replies.php:128 #, fuzzy, php-format msgid "Replies to %1$s, page %2$d" -msgstr "发送给 %1$s 的 %2$s 消息" +msgstr "%s 的回复" #: actions/replies.php:145 #, fuzzy, php-format msgid "Replies feed for %s (RSS 1.0)" -msgstr "%s 的通告聚合" +msgstr "%s 好友的聚合(RSS 1.0)" #: actions/replies.php:152 #, fuzzy, php-format msgid "Replies feed for %s (RSS 2.0)" -msgstr "%s 的通告聚合" +msgstr "%s 好友的聚合(RSS 2.0)" #: actions/replies.php:159 #, fuzzy, php-format msgid "Replies feed for %s (Atom)" -msgstr "%s 的通告聚合" +msgstr "%s 好友的聚合(Atom)" #: actions/replies.php:199 #, fuzzy, php-format @@ -3643,17 +3584,16 @@ msgstr "发送给 %1$s 的 %2$s 消息" #: actions/revokerole.php:75 #, fuzzy msgid "You cannot revoke user roles on this site." -msgstr "无法向此用户发送消息。" +msgstr "在这个网站你被禁止发布消息。" #: actions/revokerole.php:82 -#, fuzzy msgid "User doesn't have this role." -msgstr "找不到匹配的用户。" +msgstr "" #: actions/rsd.php:146 actions/version.php:159 #, fuzzy msgid "StatusNet" -msgstr "头像已更新。" +msgstr "统计" #: actions/sandbox.php:65 actions/unsandbox.php:65 #, fuzzy @@ -3661,9 +3601,8 @@ msgid "You cannot sandbox users on this site." msgstr "无法向此用户发送消息。" #: actions/sandbox.php:72 -#, fuzzy msgid "User is already sandboxed." -msgstr "用户没有个人信息。" +msgstr "" #. TRANS: Menu item for site administration #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 @@ -3700,12 +3639,11 @@ msgstr "头像设置" #: actions/showapplication.php:82 #, fuzzy msgid "You must be logged in to view an application." -msgstr "您必须登录才能邀请其他人使用 %s" +msgstr "您必须登录才能创建小组。" #: actions/showapplication.php:157 -#, fuzzy msgid "Application profile" -msgstr "通告没有关联个人信息" +msgstr "" #. TRANS: Form input field label for application icon. #: actions/showapplication.php:159 lib/applicationeditform.php:182 @@ -3730,7 +3668,7 @@ msgstr "分页" #: lib/applicationeditform.php:216 lib/groupeditform.php:172 #, fuzzy msgid "Description" -msgstr "描述" +msgstr "订阅" #: actions/showapplication.php:192 actions/showgroup.php:436 #: lib/profileaction.php:187 @@ -3842,12 +3780,12 @@ msgstr "%s 组" #: actions/showgroup.php:84 #, fuzzy, php-format msgid "%1$s group, page %2$d" -msgstr "%s 组成员, 第 %d 页" +msgstr "组,第 %d 页" #: actions/showgroup.php:227 #, fuzzy msgid "Group profile" -msgstr "组资料" +msgstr "组logo" #: actions/showgroup.php:272 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:178 @@ -3871,17 +3809,17 @@ msgstr "组动作" #: actions/showgroup.php:338 #, fuzzy, php-format msgid "Notice feed for %s group (RSS 1.0)" -msgstr "%s 的通告聚合" +msgstr "%s 好友的聚合(RSS 1.0)" #: actions/showgroup.php:344 #, fuzzy, php-format msgid "Notice feed for %s group (RSS 2.0)" -msgstr "%s 的通告聚合" +msgstr "%s 好友的聚合(RSS 2.0)" #: actions/showgroup.php:350 #, fuzzy, php-format msgid "Notice feed for %s group (Atom)" -msgstr "%s 的通告聚合" +msgstr "%s 好友的聚合(Atom)" #: actions/showgroup.php:355 #, php-format @@ -3891,7 +3829,7 @@ msgstr "%s 的发件箱" #: actions/showgroup.php:393 actions/showgroup.php:445 lib/groupnav.php:91 #, fuzzy msgid "Members" -msgstr "注册于" +msgstr "用户始于" #: actions/showgroup.php:398 lib/profileaction.php:117 #: lib/profileaction.php:152 lib/profileaction.php:255 lib/section.php:95 @@ -3906,7 +3844,7 @@ msgstr "所有成员" #: actions/showgroup.php:439 #, fuzzy msgid "Created" -msgstr "创建" +msgstr "特征" #: actions/showgroup.php:455 #, php-format @@ -3919,15 +3857,13 @@ msgid "" msgstr "" #: actions/showgroup.php:461 -#, fuzzy, php-format +#, php-format msgid "" "**%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. " msgstr "" -"**%s** 是一个 %%%%site.name%%%% 的用户组,一个微博客服务 [micro-blogging]" -"(http://en.wikipedia.org/wiki/Micro-blogging)" #: actions/showgroup.php:489 #, fuzzy @@ -3965,27 +3901,27 @@ msgstr "带 %s 标签的通告" #: actions/showstream.php:79 #, fuzzy, php-format msgid "%1$s, page %2$d" -msgstr "%s 及好友" +msgstr "%1$s 和好友,第%2$d页" #: actions/showstream.php:122 #, fuzzy, php-format msgid "Notice feed for %1$s tagged %2$s (RSS 1.0)" -msgstr "%s 的通告聚合" +msgstr "%s 好友的聚合(RSS 1.0)" #: actions/showstream.php:129 #, fuzzy, php-format msgid "Notice feed for %s (RSS 1.0)" -msgstr "%s 的通告聚合" +msgstr "%s 好友的聚合(RSS 1.0)" #: actions/showstream.php:136 #, fuzzy, php-format msgid "Notice feed for %s (RSS 2.0)" -msgstr "%s 的通告聚合" +msgstr "%s 好友的聚合(RSS 2.0)" #: actions/showstream.php:143 #, fuzzy, php-format msgid "Notice feed for %s (Atom)" -msgstr "%s 的通告聚合" +msgstr "%s 好友的聚合(Atom)" #: actions/showstream.php:148 #, fuzzy, php-format @@ -4020,14 +3956,12 @@ msgid "" msgstr "" #: actions/showstream.php:248 -#, fuzzy, php-format +#, php-format msgid "" "**%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. " msgstr "" -"**%s** 有一个帐号在 %%%%site.name%%%%, 一个微博客服务 [micro-blogging]" -"(http://en.wikipedia.org/wiki/Micro-blogging)" #: actions/showstream.php:305 #, fuzzy, php-format @@ -4040,9 +3974,8 @@ msgid "You cannot silence users on this site." msgstr "无法向此用户发送消息。" #: actions/silence.php:72 -#, fuzzy msgid "User is already silenced." -msgstr "用户没有个人信息。" +msgstr "" #: actions/siteadminpanel.php:69 msgid "Basic settings for this StatusNet site" @@ -4055,7 +3988,7 @@ msgstr "" #: actions/siteadminpanel.php:141 #, fuzzy msgid "You must have a valid contact email address." -msgstr "不是有效的电子邮件" +msgstr "不是有效的电子邮件。" #: actions/siteadminpanel.php:159 #, php-format @@ -4075,9 +4008,8 @@ msgid "General" msgstr "" #: actions/siteadminpanel.php:224 -#, fuzzy msgid "Site name" -msgstr "新通告" +msgstr "" #: actions/siteadminpanel.php:225 msgid "The name of your site, like \"Yourcompany Microblog\"" @@ -4149,7 +4081,7 @@ msgstr "" #: actions/sitenoticeadminpanel.php:56 #, fuzzy msgid "Site Notice" -msgstr "新通告" +msgstr "通告" #: actions/sitenoticeadminpanel.php:67 #, fuzzy @@ -4168,7 +4100,7 @@ msgstr "" #: actions/sitenoticeadminpanel.php:176 #, fuzzy msgid "Site notice text" -msgstr "新通告" +msgstr "删除通告" #: actions/sitenoticeadminpanel.php:178 msgid "Site-wide notice text (255 chars max; HTML okay)" @@ -4177,13 +4109,13 @@ msgstr "" #: actions/sitenoticeadminpanel.php:198 #, fuzzy msgid "Save site notice" -msgstr "新通告" +msgstr "删除通告" #. TRANS: Title for SMS settings. #: actions/smssettings.php:59 #, fuzzy msgid "SMS settings" -msgstr "SMS短信设置" +msgstr "头像设置" #. TRANS: SMS settings page instructions. #. TRANS: %%site.name%% is the name of the site. @@ -4194,15 +4126,14 @@ msgstr "您可以通过 %%site.name%% 的电子邮件接收SMS短信。" #. TRANS: Message given in the SMS settings if SMS is not enabled on the site. #: actions/smssettings.php:97 -#, fuzzy msgid "SMS is not available." -msgstr "这个页面不提供您想要的媒体类型" +msgstr "" #. TRANS: Form legend for SMS settings form. #: actions/smssettings.php:111 #, fuzzy msgid "SMS address" -msgstr "IM 帐号" +msgstr "电子邮件地址" #. TRANS: Form guide in SMS settings form. #: actions/smssettings.php:120 @@ -4235,7 +4166,7 @@ msgstr "确认" #: actions/smssettings.php:153 #, fuzzy msgid "SMS phone number" -msgstr "SMS短信电话号码" +msgstr "没有电话号码。" #. TRANS: SMS phone number input field instructions in SMS settings form. #: actions/smssettings.php:156 @@ -4246,7 +4177,7 @@ msgstr "电话号码,不带标点或空格,包含地区代码" #: actions/smssettings.php:195 #, fuzzy msgid "SMS preferences" -msgstr "首选项" +msgstr "首选项已保存。" #. TRANS: Checkbox label in SMS preferences form. #: actions/smssettings.php:201 @@ -4288,7 +4219,7 @@ msgid "" "A confirmation code was sent to the phone number you added. Check your phone " "for the code and instructions on how to use it." msgstr "" -"验证码已被发送到您新增的电话号码。请检查收件箱(和垃圾箱),找到验证码并按要求" +"验证码已被发送到您新增的电子邮件。请检查收件箱(和垃圾箱),找到验证码并按要求" "使用它。" #. TRANS: Message given canceling SMS phone number confirmation for the wrong phone number. @@ -4300,7 +4231,7 @@ msgstr "确认码错误。" #: actions/smssettings.php:427 #, fuzzy msgid "SMS confirmation cancelled." -msgstr "已取消确认。" +msgstr "SMS短信确认" #. TRANS: Message given trying to remove an SMS phone number that is not #. TRANS: registered for the active user. @@ -4310,9 +4241,8 @@ msgstr "这是他人的电话号码。" #. TRANS: Message given after successfully removing a registered SMS phone number. #: actions/smssettings.php:470 -#, fuzzy msgid "The SMS phone number was removed." -msgstr "SMS短信电话号码" +msgstr "" #. TRANS: Label for mobile carrier dropdown menu in SMS settings. #: actions/smssettings.php:511 @@ -4350,7 +4280,7 @@ msgstr "" #: actions/snapshotadminpanel.php:65 #, fuzzy msgid "Manage snapshot configuration" -msgstr "主站导航" +msgstr "电子邮件地址确认" #: actions/snapshotadminpanel.php:127 msgid "Invalid snapshot run value." @@ -4404,13 +4334,13 @@ msgstr "头像设置" #: actions/subedit.php:70 #, fuzzy msgid "You are not subscribed to that profile." -msgstr "您未告知此个人信息" +msgstr "您已订阅这些用户:" #. TRANS: Exception thrown when a subscription could not be stored on the server. #: actions/subedit.php:83 classes/Subscription.php:136 #, fuzzy msgid "Could not save subscription." -msgstr "无法删除订阅。" +msgstr "无法添加新的订阅。" #: actions/subscribe.php:77 msgid "This action only accepts POST requests." @@ -4422,9 +4352,8 @@ msgid "No such profile." msgstr "没有这份通告。" #: actions/subscribe.php:117 -#, fuzzy msgid "You cannot subscribe to an OMB 0.1 remote profile with this action." -msgstr "您未告知此个人信息" +msgstr "" #: actions/subscribe.php:145 #, fuzzy @@ -4439,7 +4368,7 @@ msgstr "订阅者" #: actions/subscribers.php:52 #, fuzzy, php-format msgid "%1$s subscribers, page %2$d" -msgstr "%s 订阅者, 第 %d 页" +msgstr "%1$s 和好友,第%2$d页" #: actions/subscribers.php:63 msgid "These are the people who listen to your notices." @@ -4476,7 +4405,7 @@ msgstr "所有订阅" #: actions/subscriptions.php:54 #, fuzzy, php-format msgid "%1$s subscriptions, page %2$d" -msgstr "所有订阅" +msgstr "%1$s 和好友,第%2$d页" #: actions/subscriptions.php:65 msgid "These are the people whose notices you listen to." @@ -4514,27 +4443,26 @@ msgstr "SMS短信" #: actions/tag.php:69 #, fuzzy, php-format msgid "Notices tagged with %1$s, page %2$d" -msgstr "用户自加标签 %s - 第 %d 页" +msgstr "带 %s 标签的通告" #: actions/tag.php:87 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 1.0)" -msgstr "%s 的通告聚合" +msgstr "%s 好友的聚合" #: actions/tag.php:93 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 2.0)" -msgstr "%s 的通告聚合" +msgstr "%s 好友的聚合" #: actions/tag.php:99 #, fuzzy, php-format msgid "Notice feed for tag %s (Atom)" -msgstr "%s 的通告聚合" +msgstr "%s 好友的聚合" #: actions/tagother.php:39 -#, fuzzy msgid "No ID argument." -msgstr "没有这份文档。" +msgstr "" #: actions/tagother.php:65 #, fuzzy, php-format @@ -4571,7 +4499,7 @@ msgstr "你只能给你订阅的人或订阅你的人加标签。" #: actions/tagother.php:200 #, fuzzy msgid "Could not save tags." -msgstr "无法保存头像" +msgstr "无法保存个人信息。" #: actions/tagother.php:236 msgid "Use this form to add tags to your subscribers or subscriptions." @@ -4583,14 +4511,13 @@ msgid "No such tag." msgstr "未找到此消息。" #: actions/unblock.php:59 -#, fuzzy msgid "You haven't blocked that user." -msgstr "您已成功阻止该用户:" +msgstr "" #: actions/unsandbox.php:72 #, fuzzy msgid "User is not sandboxed." -msgstr "用户没有个人信息。" +msgstr "用户没有通告。" #: actions/unsilence.php:72 #, fuzzy @@ -4600,7 +4527,7 @@ msgstr "用户没有个人信息。" #: actions/unsubscribe.php:77 #, fuzzy msgid "No profile ID in request." -msgstr "服务器没有返回个人信息URL。" +msgstr "未收到认证请求!" #: actions/unsubscribe.php:98 #, fuzzy @@ -4693,19 +4620,15 @@ msgid "Authorize subscription" msgstr "确认订阅" #: actions/userauthorization.php:110 -#, fuzzy msgid "" "Please check these details to make sure that you want to subscribe to this " "user’s notices. If you didn’t just ask to subscribe to someone’s notices, " "click “Reject”." msgstr "" -"请检查详细信息,确认希望订阅此用户的通告。如果您刚才没有要求订阅任何人的通" -"告,请点击\"取消\"。" #: actions/userauthorization.php:196 actions/version.php:167 -#, fuzzy msgid "License" -msgstr "注册证" +msgstr "" #: actions/userauthorization.php:217 msgid "Accept" @@ -4724,7 +4647,7 @@ msgstr "拒绝" #: actions/userauthorization.php:220 #, fuzzy msgid "Reject this subscription" -msgstr "所有订阅" +msgstr "确认订阅" #: actions/userauthorization.php:232 msgid "No authorization request!" @@ -4735,25 +4658,22 @@ msgid "Subscription authorized" msgstr "订阅已确认" #: actions/userauthorization.php:256 -#, fuzzy msgid "" "The subscription has been authorized, but no callback URL was passed. Check " "with the site’s instructions for details on how to authorize the " "subscription. Your subscription token is:" msgstr "" -"订阅已确认,但是没有回传URL。请到此网站查看如何确认订阅。您的订阅标识是:" #: actions/userauthorization.php:266 msgid "Subscription rejected" msgstr "订阅被拒绝" #: actions/userauthorization.php:268 -#, fuzzy msgid "" "The subscription has been rejected, but no callback URL was passed. Check " "with the site’s instructions for details on how to fully reject the " "subscription." -msgstr "订阅已被拒绝,但是没有回传URL。请到此网站查看如何拒绝订阅。" +msgstr "" #: actions/userauthorization.php:303 #, php-format @@ -4781,14 +4701,14 @@ msgid "Avatar URL ‘%s’ is not valid." msgstr "" #: actions/userauthorization.php:350 -#, fuzzy, php-format +#, php-format msgid "Can’t read avatar URL ‘%s’." -msgstr "无法访问头像URL '%s'" +msgstr "" #: actions/userauthorization.php:355 -#, fuzzy, php-format +#, php-format msgid "Wrong image type for avatar URL ‘%s’." -msgstr "'%s' 图像格式错误" +msgstr "" #: actions/userdesignsettings.php:76 lib/designsettings.php:65 #, fuzzy @@ -4809,12 +4729,11 @@ msgstr "" #: actions/usergroups.php:66 #, fuzzy, php-format msgid "%1$s groups, page %2$d" -msgstr "%s 组成员, 第 %d 页" +msgstr "组,第 %d 页" #: actions/usergroups.php:132 -#, fuzzy msgid "Search for more groups" -msgstr "检索人或文字" +msgstr "" #: actions/usergroups.php:159 #, fuzzy, php-format @@ -4934,7 +4853,7 @@ msgstr "大小不正确。" #: classes/Group_member.php:42 #, fuzzy msgid "Group join failed." -msgstr "组资料" +msgstr "小组未找到。" #. TRANS: Exception thrown when trying to leave a group the user is not a member of. #: classes/Group_member.php:55 @@ -4946,7 +4865,7 @@ msgstr "无法更新组" #: classes/Group_member.php:63 #, fuzzy msgid "Group leave failed." -msgstr "组资料" +msgstr "上传失败" #. TRANS: Server exception thrown when updating a local group fails. #: classes/Local_group.php:42 @@ -4993,7 +4912,7 @@ msgstr "" #: classes/Notice.php:190 #, fuzzy, php-format msgid "Database error inserting hashtag: %s" -msgstr "添加标签时数据库出错:%s" +msgstr "添加头像出错" #. TRANS: Client exception thrown if a notice contains too many characters. #: classes/Notice.php:260 @@ -5045,7 +4964,7 @@ 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. -#: classes/Notice.php:1745 +#: classes/Notice.php:1746 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" @@ -5084,8 +5003,9 @@ msgstr "那个用户阻止了你的订阅。" #. TRANS: Exception thrown when trying to subscribe while already subscribed. #: classes/Subscription.php:80 +#, fuzzy msgid "Already subscribed!" -msgstr "" +msgstr "未订阅!" #. TRANS: Exception thrown when trying to subscribe to a user who has blocked the subscribing user. #: classes/Subscription.php:85 @@ -5103,19 +5023,19 @@ msgstr "未订阅!" #: classes/Subscription.php:178 #, fuzzy msgid "Could not delete self-subscription." -msgstr "无法删除订阅。" +msgstr "无法添加新的订阅。" #. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server. #: classes/Subscription.php:206 #, fuzzy msgid "Could not delete subscription OMB token." -msgstr "无法删除订阅。" +msgstr "无法添加新的订阅。" #. TRANS: Exception thrown when a subscription could not be deleted on the server. #: classes/Subscription.php:218 #, fuzzy msgid "Could not delete subscription." -msgstr "无法删除订阅。" +msgstr "无法添加新的订阅。" #. TRANS: Notice given on user registration. #. TRANS: %1$s is the sitename, $2$s is the registering user's nickname. @@ -5133,19 +5053,19 @@ msgstr "无法创建组。" #: classes/User_group.php:506 #, fuzzy msgid "Could not set group URI." -msgstr "无法删除订阅。" +msgstr "无法创建组。" #. TRANS: Server exception thrown when setting group membership failed. #: classes/User_group.php:529 #, fuzzy msgid "Could not set group membership." -msgstr "无法删除订阅。" +msgstr "无法创建组。" #. TRANS: Server exception thrown when saving local group information failed. #: classes/User_group.php:544 #, fuzzy msgid "Could not save local group info." -msgstr "无法删除订阅。" +msgstr "无法保存个人信息。" #. TRANS: Link title attribute in user account settings menu. #: lib/accountsettingsaction.php:109 @@ -5201,10 +5121,9 @@ msgstr "主站导航" #. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:442 -#, fuzzy msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" -msgstr "个人资料及朋友年表" +msgstr "" #. TRANS: Main menu option when logged in for access to personal profile and friends timeline #: lib/action.php:445 @@ -5218,14 +5137,13 @@ msgstr "个人" #, fuzzy msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" -msgstr "修改资料" +msgstr "修改密码" #. TRANS: Tooltip for main menu option "Services" #: lib/action.php:452 -#, fuzzy msgctxt "TOOLTIP" msgid "Connect to services" -msgstr "无法重定向到服务器:%s" +msgstr "" #. TRANS: Main menu option when logged in and connection are possible for access to options to connect to other services #: lib/action.php:455 @@ -5265,21 +5183,20 @@ msgstr "邀请" #, fuzzy msgctxt "TOOLTIP" msgid "Logout from the site" -msgstr "登出本站" +msgstr "登录" #. TRANS: Main menu option when logged in to log out the current user #: lib/action.php:477 #, fuzzy msgctxt "MENU" msgid "Logout" -msgstr "登出" +msgstr "logo已更新。" #. TRANS: Tooltip for main menu option "Register" #: lib/action.php:482 -#, fuzzy msgctxt "TOOLTIP" msgid "Create an account" -msgstr "创建新帐号" +msgstr "" #. TRANS: Main menu option when not logged in to register a new account #: lib/action.php:485 @@ -5293,7 +5210,7 @@ msgstr "注册" #, fuzzy msgctxt "TOOLTIP" msgid "Login to the site" -msgstr "登入本站" +msgstr "登录" #: lib/action.php:491 #, fuzzy @@ -5316,10 +5233,9 @@ msgstr "帮助" #. TRANS: Tooltip for main menu option "Search" #: lib/action.php:500 -#, fuzzy msgctxt "TOOLTIP" msgid "Search for people or text" -msgstr "检索人或文字" +msgstr "" #: lib/action.php:503 #, fuzzy @@ -5349,7 +5265,7 @@ msgstr "新通告" #: lib/action.php:762 #, fuzzy msgid "Secondary site navigation" -msgstr "次项站导航" +msgstr "主站导航" #. TRANS: Secondary navigation menu option leading to help on StatusNet. #: lib/action.php:768 @@ -5398,13 +5314,11 @@ msgstr "StatusNet软件注册证" #. TRANS: First sentence of the StatusNet site license. Used if 'broughtby' is set. #: lib/action.php:827 -#, fuzzy, php-format +#, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." "broughtby%%](%%site.broughtbyurl%%)." msgstr "" -"**%%site.name%%** 是一个微博客服务,提供者为 [%%site.broughtby%%](%%site." -"broughtbyurl%%)。" #. TRANS: First sentence of the StatusNet site license. Used if 'broughtby' is not set. #: lib/action.php:830 @@ -5465,14 +5379,13 @@ msgstr "分页" #: lib/action.php:1203 #, fuzzy msgid "After" -msgstr "« 之后" +msgstr "其他" #. TRANS: Pagination message to go to a page displaying information more in the #. TRANS: past than the currently displayed information. #: lib/action.php:1213 -#, fuzzy msgid "Before" -msgstr "之前 »" +msgstr "" #. TRANS: Client exception thrown when a feed instance is a DOMDocument. #: lib/activity.php:122 @@ -5543,10 +5456,9 @@ msgstr "SMS短信确认" #. TRANS: Menu item for site administration #: lib/adminpanelaction.php:360 -#, fuzzy msgctxt "MENU" msgid "Design" -msgstr "个人" +msgstr "" #. TRANS: Menu item title/tooltip #: lib/adminpanelaction.php:366 @@ -5581,7 +5493,7 @@ msgstr "SMS短信确认" #: lib/adminpanelaction.php:398 #, fuzzy msgid "Edit site notice" -msgstr "新通告" +msgstr "删除通告" #. TRANS: Menu item title/tooltip #: lib/adminpanelaction.php:406 @@ -5606,21 +5518,19 @@ msgstr "" #. TRANS: Form input field instructions. #: lib/applicationeditform.php:209 -#, fuzzy, php-format +#, php-format msgid "Describe your application in %d characters" -msgstr "用不超过140个字符描述您自己和您的爱好" +msgstr "" #. TRANS: Form input field instructions. #: lib/applicationeditform.php:213 -#, fuzzy msgid "Describe your application" -msgstr "用不超过140个字符描述您自己和您的爱好" +msgstr "" #. TRANS: Form input field instructions. #: lib/applicationeditform.php:224 -#, fuzzy msgid "URL of the homepage of this application" -msgstr "您的主页、博客或在其他站点的URL" +msgstr "" #. TRANS: Form input field label. #: lib/applicationeditform.php:226 @@ -5635,9 +5545,8 @@ msgstr "" #. TRANS: Form input field instructions. #: lib/applicationeditform.php:242 -#, fuzzy msgid "URL for the homepage of the organization" -msgstr "您的主页、博客或在其他站点的URL" +msgstr "" #. TRANS: Form input field instructions. #: lib/applicationeditform.php:251 @@ -5700,7 +5609,7 @@ msgstr "" #, fuzzy msgctxt "BUTTON" msgid "Revoke" -msgstr "移除" +msgstr "恢复" #. TRANS: DT element label in attachment list. #: lib/attachmentlist.php:88 @@ -5716,7 +5625,7 @@ msgstr "" #: lib/attachmentlist.php:279 #, fuzzy msgid "Provider" -msgstr "个人信息" +msgstr "预览" #: lib/attachmentnoticesection.php:67 msgid "Notices where this attachment appears" @@ -5732,9 +5641,8 @@ msgid "Password changing failed" msgstr "密码已保存。" #: lib/authenticationplugin.php:236 -#, fuzzy msgid "Password changing is not allowed" -msgstr "密码已保存。" +msgstr "" #: lib/channel.php:157 lib/channel.php:177 msgid "Command results" @@ -5749,9 +5657,8 @@ msgid "Command failed" msgstr "执行失败" #: lib/command.php:83 lib/command.php:105 -#, fuzzy msgid "Notice with that id does not exist" -msgstr "没有找到此ID的信息。" +msgstr "" #: lib/command.php:99 lib/command.php:596 msgid "User has no last notice" @@ -5805,16 +5712,16 @@ msgstr "您已经是该组成员" #. TRANS: Message given having failed to add a user to a group. #. TRANS: %1$s is the nickname of the user, %2$s is the nickname of the group. #: lib/command.php:339 -#, fuzzy, php-format +#, php-format msgid "Could not join user %1$s to group %2$s" -msgstr "无法把 %s 用户添加到 %s 组" +msgstr "" #. TRANS: Message given having failed to remove a user from a group. #. TRANS: %1$s is the nickname of the user, %2$s is the nickname of the group. #: lib/command.php:385 -#, fuzzy, php-format +#, php-format msgid "Could not remove user %1$s from group %2$s" -msgstr "无法订阅用户:未找到。" +msgstr "" #. TRANS: Whois output. %s is the full name of the queried user. #: lib/command.php:418 @@ -5852,9 +5759,9 @@ msgstr "" #. TRANS: Message given if content is too long. #. TRANS: %1$d is the maximum number of characters, %2$d is the number of submitted characters. #: lib/command.php:472 -#, fuzzy, php-format +#, php-format msgid "Message too long - maximum is %1$d characters, you sent %2$d" -msgstr "您的消息包含 %d 个字符,超出长度限制 - 不能超过 140 个字符。" +msgstr "" #. TRANS: Message given have sent a direct message to another user. #. TRANS: %s is the name of the other user. @@ -5875,7 +5782,7 @@ msgstr "无法开启通告。" #: lib/command.php:519 #, fuzzy msgid "Already repeated that notice" -msgstr "删除通告" +msgstr "无法删除通告。" #. TRANS: Message given having repeated a notice from another user. #. TRANS: %s is the name of the user for which the notice was repeated. @@ -5887,17 +5794,17 @@ msgstr "消息已发布。" #: lib/command.php:531 #, fuzzy msgid "Error repeating notice." -msgstr "保存通告时出错。" +msgstr "保存用户设置时出错。" #: lib/command.php:562 -#, fuzzy, php-format +#, php-format msgid "Notice too long - maximum is %d characters, you sent %d" -msgstr "您的消息包含 %d 个字符,超出长度限制 - 不能超过 140 个字符。" +msgstr "" #: lib/command.php:571 #, fuzzy, php-format msgid "Reply to %s sent" -msgstr "无法删除通告。" +msgstr "%s 的回复" #: lib/command.php:573 #, fuzzy @@ -5909,9 +5816,8 @@ msgid "Specify the name of the user to subscribe to" msgstr "指定要订阅的用户名" #: lib/command.php:628 -#, fuzzy msgid "Can't subscribe to OMB profiles by command." -msgstr "您未告知此个人信息" +msgstr "" #: lib/command.php:634 #, php-format @@ -5964,7 +5870,7 @@ msgstr "取消订阅 %s" #: lib/command.php:778 #, fuzzy msgid "You are not subscribed to anyone." -msgstr "您未告知此个人信息" +msgstr "您已订阅这些用户:" #: lib/command.php:780 msgid "You are subscribed to this person:" @@ -6047,9 +5953,8 @@ msgid "You may wish to run the installer to fix this." msgstr "" #: lib/common.php:139 -#, fuzzy msgid "Go to the installer." -msgstr "登入本站" +msgstr "" #: lib/connectsettingsaction.php:110 msgid "IM" @@ -6079,13 +5984,13 @@ msgstr "" #: lib/designsettings.php:105 #, fuzzy msgid "Upload file" -msgstr "上传" +msgstr "上传失败" #: lib/designsettings.php:109 #, fuzzy msgid "" "You can upload your personal background image. The maximum file size is 2MB." -msgstr "您可以在这里上传个人头像。" +msgstr "你可以给你的组上载一个logo图。" #: lib/designsettings.php:418 msgid "Design defaults restored." @@ -6126,9 +6031,8 @@ msgid "Export data" msgstr "导出数据" #: lib/galleryaction.php:121 -#, fuzzy msgid "Filter tags" -msgstr "%s 标签的聚合" +msgstr "" #: lib/galleryaction.php:131 msgid "All" @@ -6163,14 +6067,13 @@ msgid "URL of the homepage or blog of the group or topic" msgstr "您的主页、博客或在其他站点的URL" #: lib/groupeditform.php:168 -#, fuzzy msgid "Describe the group or topic" -msgstr "用不超过140个字符描述您自己和您的爱好" +msgstr "" #: lib/groupeditform.php:170 -#, fuzzy, php-format +#, php-format msgid "Describe the group or topic in %d characters" -msgstr "用不超过140个字符描述您自己和您的爱好" +msgstr "" #: lib/groupeditform.php:179 #, fuzzy @@ -6193,9 +6096,9 @@ msgid "Blocked" msgstr "阻止" #: lib/groupnav.php:102 -#, fuzzy, php-format +#, php-format msgid "%s blocked users" -msgstr "阻止用户" +msgstr "" #: lib/groupnav.php:108 #, php-format @@ -6205,7 +6108,7 @@ msgstr "编辑 %s群选项" #: lib/groupnav.php:113 #, fuzzy msgid "Logo" -msgstr "Logo图标" +msgstr "登录" #: lib/groupnav.php:114 #, php-format @@ -6259,7 +6162,7 @@ msgstr "不是图片文件或文件已损坏。" #: lib/imagefile.php:122 #, fuzzy msgid "Lost our file." -msgstr "没有这份通告。" +msgstr "文件数据丢失" #: lib/imagefile.php:163 lib/imagefile.php:224 msgid "Unknown file type" @@ -6286,7 +6189,7 @@ msgstr "" #: lib/joinform.php:114 #, fuzzy msgid "Join" -msgstr "加入" +msgstr "登录" #: lib/leaveform.php:114 #, fuzzy @@ -6296,12 +6199,11 @@ msgstr "保存" #: lib/logingroupnav.php:80 #, fuzzy msgid "Login with a username and password" -msgstr "输入用户名和密码以登录。" +msgstr "用户名或密码不正确。" #: lib/logingroupnav.php:86 -#, fuzzy msgid "Sign up for a new account" -msgstr "创建新帐号" +msgstr "" #. TRANS: Subject for address confirmation email #: lib/mail.php:174 @@ -6341,7 +6243,7 @@ msgstr "" #. TRANS: Main body of new-subscriber notification e-mail #: lib/mail.php:254 -#, fuzzy, php-format +#, php-format msgid "" "%1$s is now listening to your notices on %2$s.\n" "\n" @@ -6354,19 +6256,12 @@ msgid "" "----\n" "Change your email address or notification options at %8$s\n" msgstr "" -"%1$s 开始关注您的 %2$s 信息。\n" -"\n" -"\t%3$s\n" -"\n" -"为您效力的 %4$s\n" #. TRANS: Profile info line in new-subscriber notification e-mail #: lib/mail.php:274 #, fuzzy, php-format msgid "Bio: %s" -msgstr "" -"自传Bio: %s\n" -"\n" +msgstr "位置:%s" #. TRANS: Subject of notification mail for new posting email address #: lib/mail.php:304 @@ -6465,7 +6360,7 @@ msgstr "" #: lib/mail.php:589 #, fuzzy, php-format msgid "%s (@%s) added your notice as a favorite" -msgstr "%s 收藏了您的通告" +msgstr "如果有人收藏我的通告,发邮件通知我。" #. TRANS: Body for favorite notification email #: lib/mail.php:592 @@ -6541,10 +6436,9 @@ msgid "" "users in conversation. People can send you messages for your eyes only." msgstr "" -#: lib/mailbox.php:227 lib/noticelist.php:505 -#, fuzzy +#: lib/mailbox.php:228 lib/noticelist.php:506 msgid "from" -msgstr " 从 " +msgstr "" #: lib/mailhandler.php:37 msgid "Could not parse message." @@ -6608,7 +6502,7 @@ msgstr "" #: lib/mediafile.php:202 lib/mediafile.php:238 #, fuzzy msgid "Could not determine file's MIME type." -msgstr "无法获取收藏的通告。" +msgstr "无法删除收藏。" #: lib/mediafile.php:318 #, php-format @@ -6635,15 +6529,14 @@ msgid "Available characters" msgstr "6 个或更多字符" #: lib/messageform.php:178 lib/noticeform.php:236 -#, fuzzy msgctxt "Send button for sending notice" msgid "Send" -msgstr "发送" +msgstr "" #: lib/noticeform.php:160 #, fuzzy msgid "Send a notice" -msgstr "发送消息" +msgstr "新通告" #: lib/noticeform.php:173 #, php-format @@ -6659,14 +6552,12 @@ msgid "Attach a file" msgstr "" #: lib/noticeform.php:212 -#, fuzzy msgid "Share my location" -msgstr "无法保存个人信息。" +msgstr "" #: lib/noticeform.php:215 -#, fuzzy msgid "Do not share my location" -msgstr "无法保存个人信息。" +msgstr "" #: lib/noticeform.php:216 msgid "" @@ -6676,9 +6567,8 @@ msgstr "" #. TRANS: Used in coordinates as abbreviation of north #: lib/noticelist.php:436 -#, fuzzy msgid "N" -msgstr "否" +msgstr "" #. TRANS: Used in coordinates as abbreviation of south #: lib/noticelist.php:438 @@ -6704,27 +6594,26 @@ msgstr "" msgid "at" msgstr "" -#: lib/noticelist.php:567 +#: lib/noticelist.php:568 #, fuzzy msgid "in context" msgstr "没有内容!" -#: lib/noticelist.php:602 -#, fuzzy +#: lib/noticelist.php:603 msgid "Repeated by" -msgstr "创建" +msgstr "" -#: lib/noticelist.php:629 +#: lib/noticelist.php:630 #, fuzzy msgid "Reply to this notice" msgstr "无法删除通告。" -#: lib/noticelist.php:630 +#: lib/noticelist.php:631 #, fuzzy msgid "Reply" msgstr "回复" -#: lib/noticelist.php:674 +#: lib/noticelist.php:675 #, fuzzy msgid "Notice repeated" msgstr "消息已发布。" @@ -6798,7 +6687,7 @@ msgstr "您发送的消息" #: lib/personaltagcloudsection.php:56 #, fuzzy, php-format msgid "Tags in %s's notices" -msgstr "%s's 的消息的标签" +msgstr "这个组所发布的消息的标签" #: lib/plugin.php:115 #, fuzzy @@ -6853,9 +6742,8 @@ msgid "User groups" msgstr "用户组" #: lib/publicgroupnav.php:84 lib/publicgroupnav.php:85 -#, fuzzy msgid "Recent tags" -msgstr "最近的标签" +msgstr "" #: lib/publicgroupnav.php:88 msgid "Featured" @@ -6867,9 +6755,8 @@ msgid "Popular" msgstr "用户" #: lib/redirectingaction.php:95 -#, fuzzy msgid "No return-to arguments." -msgstr "没有这份文档。" +msgstr "" #: lib/repeatform.php:107 #, fuzzy @@ -6886,9 +6773,9 @@ msgid "Repeat this notice" msgstr "无法删除通告。" #: lib/revokeroleform.php:91 -#, fuzzy, php-format +#, php-format msgid "Revoke the \"%s\" role from this user" -msgstr "该组成员列表。" +msgstr "" #: lib/router.php:709 msgid "No single user defined for single-user mode." @@ -6902,7 +6789,7 @@ msgstr "收件箱" #: lib/sandboxform.php:78 #, fuzzy msgid "Sandbox this user" -msgstr "取消阻止次用户" +msgstr "呼叫这个用户" #: lib/searchaction.php:120 #, fuzzy @@ -6948,19 +6835,18 @@ msgid "More..." msgstr "更多..." #: lib/silenceform.php:67 -#, fuzzy msgid "Silence" -msgstr "新通告" +msgstr "" #: lib/silenceform.php:78 #, fuzzy msgid "Silence this user" -msgstr "阻止该用户" +msgstr "呼叫这个用户" #: lib/subgroupnav.php:83 #, fuzzy, php-format msgid "People %s subscribes to" -msgstr "%s 订阅的人" +msgstr "远程订阅" #: lib/subgroupnav.php:91 #, fuzzy, php-format @@ -6994,7 +6880,7 @@ msgstr "" #: lib/tagcloudsection.php:56 #, fuzzy msgid "None" -msgstr "否" +msgstr "(没有)" #: lib/themeuploader.php:50 msgid "This server cannot handle theme uploads without ZIP support." @@ -7038,12 +6924,11 @@ msgstr "" #: lib/themeuploader.php:234 #, fuzzy msgid "Error opening theme archive." -msgstr "更新远程的个人信息时出错" +msgstr "发送消息出错。" #: lib/topposterssection.php:74 -#, fuzzy msgid "Top posters" -msgstr "灌水精英" +msgstr "" #: lib/unsandboxform.php:69 msgid "Unsandbox" @@ -7052,7 +6937,7 @@ msgstr "" #: lib/unsandboxform.php:80 #, fuzzy msgid "Unsandbox this user" -msgstr "取消阻止次用户" +msgstr "呼叫这个用户" #: lib/unsilenceform.php:67 msgid "Unsilence" @@ -7061,7 +6946,7 @@ msgstr "" #: lib/unsilenceform.php:78 #, fuzzy msgid "Unsilence this user" -msgstr "取消阻止次用户" +msgstr "呼叫这个用户" #: lib/unsubscribeform.php:113 lib/unsubscribeform.php:137 #, fuzzy @@ -7085,7 +6970,7 @@ msgstr "头像" #: lib/userprofile.php:234 lib/userprofile.php:248 #, fuzzy msgid "User actions" -msgstr "未知动作" +msgstr "组动作" #: lib/userprofile.php:237 msgid "User deletion in progress..." @@ -7117,13 +7002,12 @@ msgstr "" #: lib/userprofile.php:364 #, fuzzy msgid "User role" -msgstr "用户没有个人信息。" +msgstr "用户组" #: lib/userprofile.php:366 -#, fuzzy msgctxt "role" msgid "Administrator" -msgstr "admin管理员" +msgstr "" #: lib/userprofile.php:367 msgctxt "role" @@ -7195,6 +7079,6 @@ msgid "%s is not a valid color! Use 3 or 6 hex chars." msgstr "" #: lib/xmppmanager.php:403 -#, fuzzy, php-format +#, php-format msgid "Message too long - maximum is %1$d characters, you sent %2$d." -msgstr "您的消息包含 %d 个字符,超出长度限制 - 不能超过 140 个字符。" +msgstr "" diff --git a/locale/zh_TW/LC_MESSAGES/statusnet.po b/locale/zh_TW/LC_MESSAGES/statusnet.po index be09ed6d75..3f29e3f5bf 100644 --- a/locale/zh_TW/LC_MESSAGES/statusnet.po +++ b/locale/zh_TW/LC_MESSAGES/statusnet.po @@ -7,12 +7,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-07 16:23+0000\n" -"PO-Revision-Date: 2010-08-07 16:25:10+0000\n" +"POT-Creation-Date: 2010-08-11 10:11+0000\n" +"PO-Revision-Date: 2010-08-11 10:13:29+0000\n" "Language-Team: Traditional Chinese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70848); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: zh-hant\n" "X-Message-Group: out-statusnet\n" @@ -27,15 +27,13 @@ msgstr "接受" #. TRANS: Page notice #: actions/accessadminpanel.php:67 -#, fuzzy msgid "Site access settings" -msgstr "線上即時通設定" +msgstr "" #. TRANS: Form legend for registration form. #: actions/accessadminpanel.php:161 -#, fuzzy msgid "Registration" -msgstr "所有訂閱" +msgstr "" #. TRANS: Checkbox instructions for admin setting "Private" #: actions/accessadminpanel.php:165 @@ -65,15 +63,13 @@ msgstr "" #. TRANS: Checkbox label for disabling new user registrations. #: actions/accessadminpanel.php:185 -#, fuzzy msgid "Closed" -msgstr "無此使用者" +msgstr "" #. TRANS: Title / tooltip for button to save access settings in site admin panel #: actions/accessadminpanel.php:202 -#, fuzzy msgid "Save access settings" -msgstr "線上即時通設定" +msgstr "" #. TRANS: Button label to save e-mail preferences. #. TRANS: Button label to save IM preferences. @@ -91,7 +87,7 @@ msgstr "" #: actions/showfavorites.php:138 actions/tag.php:52 #, fuzzy msgid "No such page." -msgstr "無此通知" +msgstr "無此使用者" #: actions/all.php:79 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:114 @@ -135,21 +131,21 @@ msgstr "%s與好友" #. TRANS: %1$s is user nickname #: actions/all.php:107 -#, fuzzy, php-format +#, php-format msgid "Feed for friends of %s (RSS 1.0)" -msgstr "發送給%s好友的訂閱" +msgstr "" #. TRANS: %1$s is user nickname #: actions/all.php:116 -#, fuzzy, php-format +#, php-format msgid "Feed for friends of %s (RSS 2.0)" -msgstr "發送給%s好友的訂閱" +msgstr "" #. TRANS: %1$s is user nickname #: actions/all.php:125 -#, fuzzy, php-format +#, php-format msgid "Feed for friends of %s (Atom)" -msgstr "發送給%s好友的訂閱" +msgstr "" #. TRANS: %1$s is user nickname #: actions/all.php:138 @@ -289,9 +285,8 @@ msgid "Could not update your design." msgstr "無法更新使用者" #: actions/apiblockcreate.php:105 -#, fuzzy msgid "You cannot block yourself!" -msgstr "無法更新使用者" +msgstr "" #: actions/apiblockcreate.php:126 msgid "Block user failed." @@ -331,8 +326,9 @@ msgid "That's too long. Max message size is %d chars." msgstr "" #: actions/apidirectmessagenew.php:138 +#, fuzzy msgid "Recipient user not found." -msgstr "" +msgstr "確認碼遺失" #: actions/apidirectmessagenew.php:142 msgid "Can't send direct messages to users who aren't your friend." @@ -348,21 +344,23 @@ msgid "This status is already a favorite." msgstr "" #: actions/apifavoritecreate.php:131 actions/favor.php:84 lib/command.php:285 +#, fuzzy msgid "Could not create favorite." -msgstr "" +msgstr "無法儲存個人資料" #: actions/apifavoritedestroy.php:123 msgid "That status is not a favorite." msgstr "" #: actions/apifavoritedestroy.php:135 actions/disfavor.php:87 +#, fuzzy msgid "Could not delete favorite." -msgstr "" +msgstr "無法更新使用者" #: actions/apifriendshipscreate.php:109 #, fuzzy msgid "Could not follow user: profile not found." -msgstr "無法連結到伺服器:%s" +msgstr "無法儲存個人資料" #: actions/apifriendshipscreate.php:118 #, php-format @@ -370,14 +368,12 @@ msgid "Could not follow user: %s is already on your list." msgstr "" #: actions/apifriendshipsdestroy.php:109 -#, fuzzy msgid "Could not unfollow user: User not found." -msgstr "無法連結到伺服器:%s" +msgstr "" #: actions/apifriendshipsdestroy.php:120 -#, fuzzy msgid "You cannot unfollow yourself." -msgstr "無法更新使用者" +msgstr "" #: actions/apifriendshipsexists.php:91 msgid "Two valid IDs or screen_names must be supplied." @@ -408,8 +404,9 @@ msgstr "此暱稱已有人使用。再試試看別的吧。" #: actions/apigroupcreate.php:183 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:217 +#, fuzzy msgid "Not a valid nickname." -msgstr "" +msgstr "無暱稱" #: actions/apigroupcreate.php:199 actions/editapplication.php:215 #: actions/editgroup.php:199 actions/newapplication.php:203 @@ -428,7 +425,7 @@ msgstr "全名過長(最多255字元)" #: actions/newapplication.php:172 #, fuzzy, php-format msgid "Description is too long (max %d chars)." -msgstr "自我介紹過長(共140個字元)" +msgstr "地點過長(共255個字)" #: actions/apigroupcreate.php:227 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 @@ -445,7 +442,7 @@ msgstr "" #: actions/apigroupcreate.php:267 #, fuzzy, php-format msgid "Invalid alias: \"%s\"." -msgstr "個人首頁連結%s無效" +msgstr "尺寸錯誤" #: actions/apigroupcreate.php:276 actions/editgroup.php:232 #: actions/newgroup.php:172 @@ -463,20 +460,21 @@ msgstr "" #: actions/apigroupshow.php:83 actions/apitimelinegroup.php:92 #, fuzzy msgid "Group not found." -msgstr "目前無請求" +msgstr "確認碼遺失" #: actions/apigroupjoin.php:111 actions/joingroup.php:100 +#, fuzzy msgid "You are already a member of that group." -msgstr "" +msgstr "無法連結到伺服器:%s" #: actions/apigroupjoin.php:120 actions/joingroup.php:105 lib/command.php:327 msgid "You have been blocked from that group by the admin." msgstr "" #: actions/apigroupjoin.php:139 actions/joingroup.php:134 -#, fuzzy, php-format +#, php-format msgid "Could not join user %1$s to group %2$s." -msgstr "無法連結到伺服器:%s" +msgstr "" #: actions/apigroupleave.php:115 #, fuzzy @@ -484,21 +482,21 @@ msgid "You are not a member of this group." msgstr "無法連結到伺服器:%s" #: actions/apigroupleave.php:125 actions/leavegroup.php:129 -#, fuzzy, php-format +#, php-format msgid "Could not remove user %1$s from group %2$s." -msgstr "無法從 %s 建立OpenID" +msgstr "" #. TRANS: %s is a user name #: actions/apigrouplist.php:98 -#, fuzzy, php-format +#, php-format msgid "%s's groups" -msgstr "無此通知" +msgstr "" #. TRANS: Meant to convey the user %2$s is a member of each of the groups listed on site %1$s #: actions/apigrouplist.php:108 -#, fuzzy, php-format +#, php-format msgid "%1$s groups %2$s is a member of." -msgstr "無法連結到伺服器:%s" +msgstr "" #. TRANS: Message is used as a title. %s is a site name. #. TRANS: Message is used as a page title. %s is a nick name. @@ -513,9 +511,8 @@ msgid "groups on %s" msgstr "" #: actions/apimediaupload.php:99 -#, fuzzy msgid "Upload failed." -msgstr "無此通知" +msgstr "" #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." @@ -550,14 +547,12 @@ msgid "Invalid nickname / password!" msgstr "使用者名稱或密碼無效" #: actions/apioauthauthorize.php:159 -#, fuzzy msgid "Database error deleting OAuth application user." -msgstr "使用者設定發生錯誤" +msgstr "" #: actions/apioauthauthorize.php:185 -#, fuzzy msgid "Database error inserting OAuth application user." -msgstr "增加回覆時,資料庫發生錯誤: %s" +msgstr "" #: actions/apioauthauthorize.php:214 #, php-format @@ -616,8 +611,9 @@ msgstr "暱稱" #. TRANS: Link description in user account settings menu. #: actions/apioauthauthorize.php:316 actions/login.php:255 #: actions/register.php:436 lib/accountsettingsaction.php:125 +#, fuzzy msgid "Password" -msgstr "" +msgstr "新密碼" #: actions/apioauthauthorize.php:328 msgid "Deny" @@ -645,19 +641,16 @@ msgid "No such notice." msgstr "無此通知" #: actions/apistatusesretweet.php:83 -#, fuzzy msgid "Cannot repeat your own notice." -msgstr "儲存使用者發生錯誤" +msgstr "" #: actions/apistatusesretweet.php:91 -#, fuzzy msgid "Already repeated that notice." -msgstr "無此使用者" +msgstr "" #: actions/apistatusesshow.php:139 -#, fuzzy msgid "Status deleted." -msgstr "更新個人圖像" +msgstr "" #: actions/apistatusesshow.php:145 msgid "No status with that ID found." @@ -674,9 +667,8 @@ msgid "That's too long. Max notice size is %d chars." msgstr "" #: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 -#, fuzzy msgid "Not found." -msgstr "目前無請求" +msgstr "" #: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format @@ -693,9 +685,9 @@ msgid "%1$s / Favorites from %2$s" msgstr "%1$s的狀態是%2$s" #: actions/apitimelinefavorites.php:119 -#, fuzzy, php-format +#, php-format msgid "%1$s updates favorited by %2$s / %2$s." -msgstr "&s的微型部落格" +msgstr "" #: actions/apitimelinementions.php:118 #, fuzzy, php-format @@ -733,18 +725,19 @@ msgid "Notices tagged with %s" msgstr "" #: actions/apitimelinetag.php:107 actions/tagrss.php:65 -#, fuzzy, php-format +#, php-format msgid "Updates tagged with %1$s on %2$s!" -msgstr "&s的微型部落格" +msgstr "" #: actions/apitrends.php:87 +#, fuzzy msgid "API method under construction." -msgstr "" +msgstr "確認碼遺失" #: actions/attachment.php:73 #, fuzzy msgid "No such attachment." -msgstr "無此文件" +msgstr "無此通知" #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 @@ -780,9 +773,8 @@ msgstr "" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 #: actions/grouplogo.php:254 -#, fuzzy msgid "Avatar settings" -msgstr "線上即時通設定" +msgstr "" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 #: actions/grouplogo.php:202 actions/grouplogo.php:262 @@ -795,7 +787,7 @@ msgid "Preview" msgstr "" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:656 +#: lib/deleteuserform.php:66 lib/noticelist.php:657 msgid "Delete" msgstr "" @@ -835,7 +827,7 @@ msgstr "更新個人圖像" #: actions/block.php:69 #, fuzzy msgid "You already blocked that user." -msgstr "無此使用者" +msgstr "此Jabber ID已有人使用" #: actions/block.php:107 actions/block.php:136 actions/groupblock.php:158 #, fuzzy @@ -864,9 +856,8 @@ msgstr "" #. TRANS: Submit button title for 'No' when blocking a user. #. TRANS: Submit button title for 'No' when deleting a user. #: actions/block.php:157 actions/deleteuser.php:156 -#, fuzzy msgid "Do not block this user" -msgstr "無此使用者" +msgstr "" #. TRANS: Button label on the user block form. #. TRANS: Button label on the delete application form. @@ -882,9 +873,8 @@ msgstr "" #. TRANS: Submit button title for 'Yes' when blocking a user. #: actions/block.php:164 actions/groupmembers.php:392 lib/blockform.php:80 -#, fuzzy msgid "Block this user" -msgstr "無此使用者" +msgstr "" #: actions/block.php:187 msgid "Failed to save block information." @@ -903,35 +893,33 @@ msgstr "" #: lib/command.php:368 #, fuzzy msgid "No such group." -msgstr "無此通知" +msgstr "無此使用者" #: actions/blockedfromgroup.php:97 -#, fuzzy, php-format +#, php-format msgid "%s blocked profiles" -msgstr "無此通知" +msgstr "" #: actions/blockedfromgroup.php:100 -#, fuzzy, php-format +#, php-format msgid "%1$s blocked profiles, page %2$d" -msgstr "%s與好友" +msgstr "" #: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "" #: actions/blockedfromgroup.php:288 -#, fuzzy msgid "Unblock user from group" -msgstr "無此使用者" +msgstr "" #: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "" #: actions/blockedfromgroup.php:320 lib/unblockform.php:80 -#, fuzzy msgid "Unblock this user" -msgstr "無此使用者" +msgstr "" #. TRANS: Title for mini-posting window loaded from bookmarklet. #: actions/bookmarklet.php:51 @@ -948,8 +936,9 @@ msgid "Confirmation code not found." msgstr "確認碼遺失" #: actions/confirmaddress.php:85 +#, fuzzy msgid "That confirmation code is not for you!" -msgstr "" +msgstr "確認碼遺失" #. TRANS: Server error for an unknow address type, which can be 'email', 'jabber', or 'sms'. #: actions/confirmaddress.php:91 @@ -959,8 +948,9 @@ msgstr "" #. TRANS: Client error for an already confirmed email/jabbel/sms address. #: actions/confirmaddress.php:96 +#, fuzzy msgid "That address has already been confirmed." -msgstr "" +msgstr "此電子信箱已註冊過了" #. TRANS: Server error thrown on database error updating e-mail preferences. #. TRANS: Server error thrown on database error removing a registered e-mail address. @@ -986,7 +976,7 @@ msgstr "無法取消信箱確認" #: actions/confirmaddress.php:146 #, fuzzy msgid "Confirm address" -msgstr "確認信箱" +msgstr "確認" #: actions/confirmaddress.php:161 #, php-format @@ -1000,13 +990,13 @@ msgstr "地點" #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87 #: lib/profileaction.php:229 lib/searchgroupnav.php:82 +#, fuzzy msgid "Notices" -msgstr "" +msgstr "新訊息" #: actions/deleteapplication.php:63 -#, fuzzy msgid "You must be logged in to delete an application." -msgstr "無法更新使用者" +msgstr "" #: actions/deleteapplication.php:71 #, fuzzy @@ -1026,9 +1016,8 @@ msgid "There was a problem with your session token." msgstr "" #: actions/deleteapplication.php:123 actions/deleteapplication.php:147 -#, fuzzy msgid "Delete application" -msgstr "無此通知" +msgstr "" #: actions/deleteapplication.php:149 msgid "" @@ -1039,15 +1028,13 @@ msgstr "" #. TRANS: Submit button title for 'No' when deleting an application. #: actions/deleteapplication.php:158 -#, fuzzy msgid "Do not delete this application" -msgstr "無此通知" +msgstr "" #. TRANS: Submit button title for 'Yes' when deleting an application. #: actions/deleteapplication.php:164 -#, fuzzy msgid "Delete this application" -msgstr "請在140個字以內描述你自己與你的興趣" +msgstr "" #. TRANS: Client error message thrown when trying to access the admin panel while not logged in. #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 @@ -1057,12 +1044,14 @@ msgstr "請在140個字以內描述你自己與你的興趣" #: actions/tagother.php:33 actions/unsubscribe.php:52 #: lib/adminpanelaction.php:73 lib/profileformaction.php:64 #: lib/settingsaction.php:72 +#, fuzzy msgid "Not logged in." -msgstr "" +msgstr "已登入" #: actions/deletenotice.php:71 +#, fuzzy msgid "Can't delete this notice." -msgstr "" +msgstr "無法取消信箱確認" #: actions/deletenotice.php:103 msgid "" @@ -1071,8 +1060,9 @@ msgid "" msgstr "" #: actions/deletenotice.php:109 actions/deletenotice.php:141 +#, fuzzy msgid "Delete notice" -msgstr "" +msgstr "新訊息" #: actions/deletenotice.php:144 msgid "Are you sure you want to delete this notice?" @@ -1080,12 +1070,11 @@ msgstr "" #. TRANS: Submit button title for 'No' when deleting a notice. #: actions/deletenotice.php:151 -#, fuzzy msgid "Do not delete this notice" -msgstr "無此通知" +msgstr "" #. TRANS: Submit button title for 'Yes' when deleting a notice. -#: actions/deletenotice.php:158 lib/noticelist.php:656 +#: actions/deletenotice.php:158 lib/noticelist.php:657 msgid "Delete this notice" msgstr "" @@ -1095,9 +1084,8 @@ msgid "You cannot delete users." msgstr "無法更新使用者" #: actions/deleteuser.php:74 -#, fuzzy msgid "You can only delete local users." -msgstr "無此使用者" +msgstr "" #: actions/deleteuser.php:110 actions/deleteuser.php:133 msgid "Delete user" @@ -1111,9 +1099,8 @@ msgstr "" #. TRANS: Submit button title for 'Yes' when deleting a user. #: actions/deleteuser.php:163 lib/deleteuserform.php:77 -#, fuzzy msgid "Delete this user" -msgstr "無此使用者" +msgstr "" #. TRANS: Message used as title for design settings for the site. #. TRANS: Link description in user account settings menu. @@ -1132,19 +1119,18 @@ msgid "Invalid logo URL." msgstr "尺寸錯誤" #: actions/designadminpanel.php:322 -#, fuzzy, php-format +#, php-format msgid "Theme not available: %s." -msgstr "個人首頁位址錯誤" +msgstr "" #: actions/designadminpanel.php:426 #, fuzzy msgid "Change logo" -msgstr "更改密碼" +msgstr "更改" #: actions/designadminpanel.php:431 -#, fuzzy msgid "Site logo" -msgstr "新訊息" +msgstr "" #: actions/designadminpanel.php:443 #, fuzzy @@ -1152,18 +1138,16 @@ msgid "Change theme" msgstr "更改" #: actions/designadminpanel.php:460 -#, fuzzy msgid "Site theme" -msgstr "新訊息" +msgstr "" #: actions/designadminpanel.php:461 msgid "Theme for the site." msgstr "" #: actions/designadminpanel.php:467 -#, fuzzy msgid "Custom theme" -msgstr "新訊息" +msgstr "" #: actions/designadminpanel.php:471 msgid "You can upload a custom StatusNet theme as a .ZIP archive." @@ -1272,12 +1256,11 @@ msgstr "" #: actions/doc.php:158 #, fuzzy, php-format msgid "No such document \"%s\"" -msgstr "無此文件" +msgstr "無此通知" #: actions/editapplication.php:54 -#, fuzzy msgid "Edit Application" -msgstr "無此通知" +msgstr "" #: actions/editapplication.php:66 msgid "You must be logged in to edit an application." @@ -1308,9 +1291,8 @@ msgid "Name already in use. Try another one." msgstr "此暱稱已有人使用。再試試看別的吧。" #: actions/editapplication.php:186 actions/newapplication.php:168 -#, fuzzy msgid "Description is required." -msgstr "所有訂閱" +msgstr "" #: actions/editapplication.php:194 msgid "Source URL is too long." @@ -1368,12 +1350,12 @@ msgstr "" #: actions/editgroup.php:205 actions/newgroup.php:145 #, fuzzy, php-format msgid "description is too long (max %d chars)." -msgstr "自我介紹過長(共140個字元)" +msgstr "地點過長(共255個字)" #: actions/editgroup.php:228 actions/newgroup.php:168 -#, fuzzy, php-format +#, php-format msgid "Invalid alias: \"%s\"" -msgstr "個人首頁連結%s無效" +msgstr "" #: actions/editgroup.php:258 #, fuzzy @@ -1384,7 +1366,7 @@ msgstr "無法更新使用者" #: actions/editgroup.php:264 classes/User_group.php:514 #, fuzzy msgid "Could not create aliases." -msgstr "無法存取個人圖像資料" +msgstr "無法更新使用者" #: actions/editgroup.php:280 msgid "Options saved." @@ -1394,7 +1376,7 @@ msgstr "" #: actions/emailsettings.php:61 #, fuzzy msgid "Email settings" -msgstr "線上即時通設定" +msgstr "使用者設定發生錯誤" #. TRANS: E-mail settings page instructions. #. TRANS: %%site.name%% is the name of the site. @@ -1412,8 +1394,9 @@ msgstr "確認信箱" #. TRANS: Form note in e-mail settings form. #: actions/emailsettings.php:112 +#, fuzzy msgid "Current confirmed email address." -msgstr "" +msgstr "目前已確認的Jabber/Gtalk地址" #. TRANS: Button label to remove a confirmed e-mail address. #. TRANS: Button label for removing a set sender e-mail address to post notices from. @@ -1428,10 +1411,13 @@ msgid "Remove" msgstr "" #: actions/emailsettings.php:122 +#, fuzzy msgid "" "Awaiting confirmation on this address. Check your inbox (and spam box!) for " "a message with further instructions." msgstr "" +"等待確認此信箱。看看你的Jabber/GTalk是否有訊息指示下一步動作。(你加入%s到你的" +"好友清單了嗎?)" #. TRANS: Button label to cancel an e-mail address confirmation procedure. #. TRANS: Button label to cancel an IM address confirmation procedure. @@ -1454,10 +1440,9 @@ msgstr "" #. TRANS: Button label for adding a SMS phone number in SMS settings form. #: actions/emailsettings.php:139 actions/imsettings.php:148 #: actions/smssettings.php:162 -#, fuzzy msgctxt "BUTTON" msgid "Add" -msgstr "新增" +msgstr "" #. TRANS: Form legend for incoming e-mail settings form. #. TRANS: Form legend for incoming SMS settings form. @@ -1486,9 +1471,8 @@ msgstr "" #. TRANS: Form legend for e-mail preferences form. #: actions/emailsettings.php:174 -#, fuzzy msgid "Email preferences" -msgstr "確認信箱" +msgstr "" #. TRANS: Checkbox label in e-mail preferences form. #: actions/emailsettings.php:180 @@ -1522,8 +1506,9 @@ msgstr "" #. TRANS: Checkbox label in e-mail preferences form. #: actions/emailsettings.php:219 +#, fuzzy msgid "Publish a MicroID for my email address." -msgstr "" +msgstr "請輸入暱稱或電子信箱" #. TRANS: Confirmation message for successful e-mail preferences save. #: actions/emailsettings.php:334 @@ -1532,13 +1517,15 @@ msgstr "" #. TRANS: Message given saving e-mail address without having provided one. #: actions/emailsettings.php:353 +#, fuzzy msgid "No email address." -msgstr "" +msgstr "此信箱無效" #. TRANS: Message given saving e-mail address that cannot be normalised. #: actions/emailsettings.php:361 +#, fuzzy msgid "Cannot normalize that email address" -msgstr "" +msgstr "此JabberID錯誤" #. TRANS: Message given saving e-mail address that not valid. #: actions/emailsettings.php:366 actions/register.php:208 @@ -1548,13 +1535,15 @@ msgstr "此信箱無效" #. TRANS: Message given saving e-mail address that is already set. #: actions/emailsettings.php:370 +#, fuzzy msgid "That is already your email address." -msgstr "" +msgstr "此信箱無效" #. TRANS: Message given saving e-mail address that is already set for another user. #: actions/emailsettings.php:374 +#, fuzzy msgid "That email address already belongs to another user." -msgstr "" +msgstr "此Jabber ID已有人使用" #. TRANS: Server error thrown on database error adding e-mail confirmation code. #. TRANS: Server error thrown on database error adding IM confirmation code. @@ -1566,18 +1555,20 @@ msgstr "無法輸入確認碼" #. TRANS: Message given saving valid e-mail address that is to be confirmed. #: actions/emailsettings.php:398 +#, fuzzy msgid "" "A confirmation code was sent to the email address you added. Check your " "inbox (and spam box!) for the code and instructions on how to use it." -msgstr "" +msgstr "確認信已寄到你的線上即時通信箱。%s送給你得訊息要先經過你的認可。" #. TRANS: Message given canceling e-mail address confirmation that is not pending. #. TRANS: Message given canceling IM address confirmation that is not pending. #. TRANS: Message given canceling SMS phone number confirmation that is not pending. #: actions/emailsettings.php:419 actions/imsettings.php:383 #: actions/smssettings.php:408 +#, fuzzy msgid "No pending confirmation to cancel." -msgstr "" +msgstr "無確認碼" #. TRANS: Message given canceling e-mail address confirmation for the wrong e-mail address. #: actions/emailsettings.php:424 @@ -1589,13 +1580,14 @@ msgstr "請輸入暱稱或電子信箱" #: actions/emailsettings.php:438 #, fuzzy msgid "Email confirmation cancelled." -msgstr "確認取消" +msgstr "無確認碼" #. TRANS: Message given trying to remove an e-mail address that is not #. TRANS: registered for the active user. #: actions/emailsettings.php:458 +#, fuzzy msgid "That is not your email address." -msgstr "" +msgstr "請輸入暱稱或電子信箱" #. TRANS: Message given after successfully removing a registered e-mail address. #: actions/emailsettings.php:479 @@ -1604,15 +1596,17 @@ msgid "The email address was removed." msgstr "此電子信箱已註冊過了" #: actions/emailsettings.php:493 actions/smssettings.php:568 +#, fuzzy msgid "No incoming email address." -msgstr "" +msgstr "此信箱無效" #. TRANS: Server error thrown on database error removing incoming e-mail address. #. TRANS: Server error thrown on database error adding incoming e-mail address. #: actions/emailsettings.php:504 actions/emailsettings.php:528 #: actions/smssettings.php:578 actions/smssettings.php:602 +#, fuzzy msgid "Couldn't update user record." -msgstr "" +msgstr "無法更新使用者" #. TRANS: Message given after successfully removing an incoming e-mail address. #: actions/emailsettings.php:508 actions/smssettings.php:581 @@ -1621,8 +1615,9 @@ msgstr "" #. TRANS: Message given after successfully adding an incoming e-mail address. #: actions/emailsettings.php:532 actions/smssettings.php:605 +#, fuzzy msgid "New incoming email address added." -msgstr "" +msgstr "此信箱無效" #: actions/favor.php:79 msgid "This notice is already a favorite!" @@ -1639,9 +1634,9 @@ msgid "Popular notices" msgstr "無此通知" #: actions/favorited.php:67 -#, fuzzy, php-format +#, php-format msgid "Popular notices, page %d" -msgstr "無此通知" +msgstr "" #: actions/favorited.php:79 msgid "The most popular notices on the site right now." @@ -1671,9 +1666,9 @@ msgid "%s's favorite notices" msgstr "" #: actions/favoritesrss.php:115 -#, fuzzy, php-format +#, php-format msgid "Updates favored by %1$s on %2$s!" -msgstr "&s的微型部落格" +msgstr "" #: actions/featured.php:69 lib/featureduserssection.php:87 #: lib/publicgroupnav.php:89 @@ -1693,22 +1688,20 @@ msgstr "" #: actions/file.php:34 #, fuzzy msgid "No notice ID." -msgstr "新訊息" +msgstr "無此通知" #: actions/file.php:38 #, fuzzy msgid "No notice." -msgstr "新訊息" +msgstr "無此通知" #: actions/file.php:42 -#, fuzzy msgid "No attachments." -msgstr "無此文件" +msgstr "" #: actions/file.php:51 -#, fuzzy msgid "No uploaded attachments." -msgstr "無此文件" +msgstr "" #: actions/finishremotesubscribe.php:69 msgid "Not expecting this response!" @@ -1719,8 +1712,9 @@ msgid "User being listened to does not exist." msgstr "" #: actions/finishremotesubscribe.php:87 actions/remotesubscribe.php:59 +#, fuzzy msgid "You can use the local subscription!" -msgstr "" +msgstr "無法新增訂閱" #: actions/finishremotesubscribe.php:99 msgid "That user has blocked you from subscribing." @@ -1731,9 +1725,8 @@ msgid "You are not authorized." msgstr "" #: actions/finishremotesubscribe.php:113 -#, fuzzy msgid "Could not convert request token to access token." -msgstr "無法轉換請求標記以致無法存取標記" +msgstr "" #: actions/finishremotesubscribe.php:118 msgid "Remote service uses unknown version of OMB protocol." @@ -1752,7 +1745,7 @@ msgstr "無此通知" #: actions/getfile.php:83 #, fuzzy msgid "Cannot read file." -msgstr "無此通知" +msgstr "無法儲存個人資料" #: actions/grantrole.php:62 actions/revokerole.php:62 #, fuzzy @@ -1764,9 +1757,8 @@ msgid "This role is reserved and cannot be set." msgstr "" #: actions/grantrole.php:75 -#, fuzzy msgid "You cannot grant user roles on this site." -msgstr "無法連結到伺服器:%s" +msgstr "" #: actions/grantrole.php:82 msgid "User already has this role." @@ -1798,13 +1790,13 @@ msgid "User is already blocked from group." msgstr "" #: actions/groupblock.php:100 +#, fuzzy msgid "User is not a member of group." -msgstr "" +msgstr "無法連結到伺服器:%s" #: actions/groupblock.php:134 actions/groupmembers.php:360 -#, fuzzy msgid "Block user from group" -msgstr "無此使用者" +msgstr "" #: actions/groupblock.php:160 #, php-format @@ -1816,15 +1808,13 @@ msgstr "" #. TRANS: Submit button title for 'No' when blocking a user from a group. #: actions/groupblock.php:182 -#, fuzzy msgid "Do not block this user from this group" -msgstr "無法連結到伺服器:%s" +msgstr "" #. TRANS: Submit button title for 'Yes' when blocking a user from a group. #: actions/groupblock.php:189 -#, fuzzy msgid "Block this user from this group" -msgstr "無此使用者" +msgstr "" #: actions/groupblock.php:206 msgid "Database error blocking user from group." @@ -1928,9 +1918,9 @@ msgstr "" #. TRANS: Message is used as link description. %1$s is a username, %2$s is a site name. #: actions/grouprss.php:142 -#, fuzzy, php-format +#, php-format msgid "Updates from members of %1$s on %2$s!" -msgstr "&s的微型部落格" +msgstr "" #: actions/groups.php:62 lib/profileaction.php:223 lib/profileaction.php:249 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98 @@ -1953,9 +1943,8 @@ msgid "" msgstr "" #: actions/groups.php:107 actions/usergroups.php:126 lib/groupeditform.php:122 -#, fuzzy msgid "Create a new group" -msgstr "新增帳號" +msgstr "" #: actions/groupsearch.php:52 #, php-format @@ -1970,9 +1959,8 @@ msgstr "" #: actions/groupsearch.php:79 actions/noticesearch.php:117 #: actions/peoplesearch.php:83 -#, fuzzy msgid "No results." -msgstr "無結果" +msgstr "" #: actions/groupsearch.php:82 #, php-format @@ -2005,7 +1993,7 @@ msgstr "儲存使用者發生錯誤" #: actions/imsettings.php:60 #, fuzzy msgid "IM settings" -msgstr "線上即時通設定" +msgstr "使用者設定發生錯誤" #. TRANS: Instant messaging settings page instructions. #. TRANS: [instant messages] is link text, "(%%doc.im%%)" is the link. @@ -2019,16 +2007,14 @@ msgstr "" #. TRANS: Message given in the IM settings if XMPP is not enabled on the site. #: actions/imsettings.php:94 -#, fuzzy msgid "IM is not available." -msgstr "個人首頁位址錯誤" +msgstr "" #. TRANS: Form legend for IM settings form. #. TRANS: Field label for IM address input in IM settings form. #: actions/imsettings.php:106 actions/imsettings.php:136 -#, fuzzy msgid "IM address" -msgstr "線上即時通信箱" +msgstr "" #: actions/imsettings.php:113 msgid "Current confirmed Jabber/GTalk address." @@ -2076,8 +2062,9 @@ msgstr "" #. TRANS: Checkbox label in IM preferences form. #: actions/imsettings.php:179 +#, fuzzy msgid "Publish a MicroID for my Jabber/GTalk address." -msgstr "" +msgstr "目前已確認的Jabber/Gtalk地址" #. TRANS: Confirmation message for successful IM preferences save. #: actions/imsettings.php:287 actions/othersettings.php:180 @@ -2101,8 +2088,9 @@ msgstr "此JabberID無效" #. TRANS: Message given saving IM address that is already set. #: actions/imsettings.php:326 +#, fuzzy msgid "That is already your Jabber ID." -msgstr "" +msgstr "此JabberID無效" #. TRANS: Message given saving IM address that is already set for another user. #: actions/imsettings.php:330 @@ -2133,13 +2121,14 @@ msgstr "無法取消信箱確認" #: actions/imsettings.php:402 #, fuzzy msgid "IM confirmation cancelled." -msgstr "確認取消" +msgstr "無確認碼" #. TRANS: Message given trying to remove an IM address that is not #. TRANS: registered for the active user. #: actions/imsettings.php:424 +#, fuzzy msgid "That is not your Jabber ID." -msgstr "" +msgstr "查無此Jabber ID" #. TRANS: Message given after successfully removing a registered IM address. #: actions/imsettings.php:447 @@ -2165,14 +2154,14 @@ msgid "Invites have been disabled." msgstr "" #: actions/invite.php:41 -#, fuzzy, php-format +#, php-format msgid "You must be logged in to invite other users to use %s." -msgstr "無法更新使用者" +msgstr "" #: actions/invite.php:72 -#, php-format +#, fuzzy, php-format msgid "Invalid email address: %s" -msgstr "" +msgstr "此信箱無效" #: actions/invite.php:110 msgid "Invitation(s) sent" @@ -2183,8 +2172,9 @@ msgid "Invite new users" msgstr "" #: actions/invite.php:128 +#, fuzzy msgid "You are already subscribed to these users:" -msgstr "" +msgstr "此帳號已註冊" #. TRANS: Whois output. #. TRANS: %1$s nickname of the queried user, %2$s is their profile URL. @@ -2214,8 +2204,9 @@ msgid "" msgstr "" #: actions/invite.php:187 +#, fuzzy msgid "Email addresses" -msgstr "" +msgstr "此電子信箱已註冊過了" #: actions/invite.php:189 msgid "Addresses of friends to invite (one per line)" @@ -2237,9 +2228,9 @@ msgstr "" #. TRANS: Subject for invitation email. Note that 'them' is correct as a gender-neutral singular 3rd-person pronoun in English. #: actions/invite.php:228 -#, php-format +#, fuzzy, php-format msgid "%1$s has invited you to join them on %2$s" -msgstr "" +msgstr "現在%1$s在%2$s成為你的粉絲囉" #. TRANS: Body text for invitation email. Note that 'them' is correct as a gender-neutral singular 3rd-person pronoun in English. #: actions/invite.php:231 @@ -2294,8 +2285,9 @@ msgid "You must be logged in to leave a group." msgstr "" #: actions/leavegroup.php:100 lib/command.php:373 +#, fuzzy msgid "You are not a member of that group." -msgstr "" +msgstr "無法連結到伺服器:%s" #. TRANS: Message given having removed a user from a group. #. TRANS: %1$s is the nickname of the user, %2$s is the nickname of the group. @@ -2325,8 +2317,9 @@ msgid "Login to site" msgstr "" #: actions/login.php:258 actions/register.php:485 +#, fuzzy msgid "Remember me" -msgstr "" +msgstr "何時加入會員的呢?" #: actions/login.php:259 actions/register.php:487 msgid "Automatically login in the future; not for shared computers!" @@ -2345,7 +2338,7 @@ msgstr "為安全起見,請先重新輸入你的使用者名稱與密碼再更 #: actions/login.php:292 #, fuzzy msgid "Login with your username and password." -msgstr "使用者名稱或密碼無效" +msgstr "使用者名稱或密碼錯誤" #: actions/login.php:295 #, php-format @@ -2363,24 +2356,22 @@ msgid "%1$s is already an admin for group \"%2$s\"." msgstr "" #: actions/makeadmin.php:133 -#, fuzzy, php-format +#, php-format msgid "Can't get membership record for %1$s in group %2$s." -msgstr "無法從 %s 建立OpenID" +msgstr "" #: actions/makeadmin.php:146 -#, fuzzy, php-format +#, php-format msgid "Can't make %1$s an admin for group %2$s." -msgstr "無法從 %s 建立OpenID" +msgstr "" #: actions/microsummary.php:69 -#, fuzzy msgid "No current status." -msgstr "無結果" +msgstr "" #: actions/newapplication.php:52 -#, fuzzy msgid "New Application" -msgstr "無此通知" +msgstr "" #: actions/newapplication.php:64 msgid "You must be logged in to register an application." @@ -2397,7 +2388,7 @@ msgstr "" #: actions/newapplication.php:258 actions/newapplication.php:267 #, fuzzy msgid "Could not create application." -msgstr "無法存取個人圖像資料" +msgstr "無法取消信箱確認" #: actions/newgroup.php:53 msgid "New group" @@ -2412,8 +2403,9 @@ msgid "New message" msgstr "" #: actions/newmessage.php:121 actions/newmessage.php:161 lib/command.php:481 +#, fuzzy msgid "You can't send a message to this user." -msgstr "" +msgstr "無法連結到伺服器:%s" #: actions/newmessage.php:144 actions/newnotice.php:136 lib/command.php:463 #: lib/command.php:555 @@ -2462,9 +2454,9 @@ msgid "Text search" msgstr "" #: actions/noticesearch.php:91 -#, fuzzy, php-format +#, php-format msgid "Search results for \"%1$s\" on %2$s" -msgstr "搜尋 \"%s\"相關資料" +msgstr "" #: actions/noticesearch.php:121 #, php-format @@ -2481,14 +2473,14 @@ msgid "" msgstr "" #: actions/noticesearchrss.php:96 -#, fuzzy, php-format +#, php-format msgid "Updates with \"%s\"" -msgstr "&s的微型部落格" +msgstr "" #: actions/noticesearchrss.php:98 -#, fuzzy, php-format +#, php-format msgid "Updates matching search term \"%1$s\" on %2$s!" -msgstr "所有符合 \"%s\"的更新" +msgstr "" #: actions/nudge.php:85 msgid "" @@ -2529,9 +2521,8 @@ msgid "You have allowed the following applications to access you account." msgstr "" #: actions/oauthconnectionssettings.php:175 -#, fuzzy msgid "You are not a user of that application." -msgstr "無法連結到伺服器:%s" +msgstr "" #: actions/oauthconnectionssettings.php:186 #, php-format @@ -2547,9 +2538,8 @@ msgid "Developers can edit the registration settings for their applications " msgstr "" #: actions/oembed.php:80 actions/shownotice.php:100 -#, fuzzy msgid "Notice has no profile." -msgstr "無此通知" +msgstr "" #: actions/oembed.php:87 actions/shownotice.php:175 #, php-format @@ -2558,9 +2548,9 @@ msgstr "%1$s的狀態是%2$s" #. TRANS: Error message displaying attachments. %s is a raw MIME type (eg 'image/png') #: actions/oembed.php:159 -#, fuzzy, php-format +#, php-format msgid "Content type %s not supported." -msgstr "連結" +msgstr "" #. TRANS: Error message displaying attachments. %s is the site's base URL. #: actions/oembed.php:163 @@ -2585,7 +2575,7 @@ msgstr "" #: actions/othersettings.php:60 #, fuzzy msgid "Other settings" -msgstr "線上即時通設定" +msgstr "使用者設定發生錯誤" #: actions/othersettings.php:71 msgid "Manage various other options." @@ -2617,14 +2607,12 @@ msgid "URL shortening service is too long (max 50 chars)." msgstr "地點過長(共255個字)" #: actions/otp.php:69 -#, fuzzy msgid "No user ID specified." -msgstr "新訊息" +msgstr "" #: actions/otp.php:83 -#, fuzzy msgid "No login token specified." -msgstr "新訊息" +msgstr "" #: actions/otp.php:90 #, fuzzy @@ -2632,9 +2620,8 @@ msgid "No login token requested." msgstr "無確認請求" #: actions/otp.php:95 -#, fuzzy msgid "Invalid login token specified." -msgstr "新訊息" +msgstr "" #: actions/otp.php:104 msgid "Login token expired." @@ -2668,8 +2655,9 @@ msgid "Password change" msgstr "" #: actions/passwordsettings.php:104 +#, fuzzy msgid "Old password" -msgstr "" +msgstr "新密碼" #: actions/passwordsettings.php:108 actions/recoverpassword.php:235 msgid "New password" @@ -2693,8 +2681,9 @@ msgid "Change" msgstr "更改" #: actions/passwordsettings.php:154 actions/register.php:237 +#, fuzzy msgid "Password must be 6 or more characters." -msgstr "" +msgstr "6個以上字元" #: actions/passwordsettings.php:157 actions/register.php:240 msgid "Passwords don't match." @@ -2726,24 +2715,24 @@ msgid "Path and server settings for this StatusNet site." msgstr "" #: actions/pathsadminpanel.php:157 -#, fuzzy, php-format +#, php-format msgid "Theme directory not readable: %s." -msgstr "個人首頁位址錯誤" +msgstr "" #: actions/pathsadminpanel.php:163 -#, fuzzy, php-format +#, php-format msgid "Avatar directory not writable: %s." -msgstr "個人首頁位址錯誤" +msgstr "" #: actions/pathsadminpanel.php:169 -#, fuzzy, php-format +#, php-format msgid "Background directory not writable: %s." -msgstr "個人首頁位址錯誤" +msgstr "" #: actions/pathsadminpanel.php:177 -#, fuzzy, php-format +#, php-format msgid "Locales directory not readable: %s." -msgstr "個人首頁位址錯誤" +msgstr "" #: actions/pathsadminpanel.php:183 msgid "Invalid SSL server. The maximum length is 255 characters." @@ -2766,9 +2755,8 @@ msgid "Path" msgstr "" #: actions/pathsadminpanel.php:242 -#, fuzzy msgid "Site path" -msgstr "新訊息" +msgstr "" #: actions/pathsadminpanel.php:246 msgid "Path to locales" @@ -2810,7 +2798,7 @@ msgstr "個人圖像" #: actions/pathsadminpanel.php:284 #, fuzzy msgid "Avatar server" -msgstr "線上即時通設定" +msgstr "個人圖像" #: actions/pathsadminpanel.php:288 #, fuzzy @@ -2818,9 +2806,8 @@ msgid "Avatar path" msgstr "更新個人圖像" #: actions/pathsadminpanel.php:292 -#, fuzzy msgid "Avatar directory" -msgstr "更新個人圖像" +msgstr "" #: actions/pathsadminpanel.php:301 msgid "Backgrounds" @@ -2863,18 +2850,16 @@ msgid "When to use SSL" msgstr "" #: actions/pathsadminpanel.php:335 -#, fuzzy msgid "SSL server" -msgstr "線上即時通設定" +msgstr "" #: actions/pathsadminpanel.php:336 msgid "Server to direct SSL requests to" msgstr "" #: actions/pathsadminpanel.php:352 -#, fuzzy msgid "Save paths" -msgstr "新訊息" +msgstr "" #: actions/peoplesearch.php:52 #, php-format @@ -2893,9 +2878,9 @@ msgid "Not a valid people tag: %s." msgstr "此信箱無效" #: actions/peopletag.php:142 -#, fuzzy, php-format +#, php-format msgid "Users self-tagged with %1$s - page %2$d" -msgstr "&s的微型部落格" +msgstr "" #: actions/postnotice.php:95 #, fuzzy @@ -2908,8 +2893,9 @@ msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’. msgstr "" #: actions/profilesettings.php:60 +#, fuzzy msgid "Profile settings" -msgstr "" +msgstr "使用者設定發生錯誤" #: actions/profilesettings.php:71 msgid "" @@ -2941,14 +2927,13 @@ msgid "URL of your homepage, blog, or profile on another site" msgstr "" #: actions/profilesettings.php:122 actions/register.php:468 -#, fuzzy, php-format +#, php-format msgid "Describe yourself and your interests in %d chars" -msgstr "請在140個字以內描述你自己與你的興趣" +msgstr "" #: actions/profilesettings.php:125 actions/register.php:471 -#, fuzzy msgid "Describe yourself and your interests" -msgstr "請在140個字以內描述你自己與你的興趣" +msgstr "" #: actions/profilesettings.php:127 actions/register.php:473 msgid "Bio" @@ -3004,24 +2989,26 @@ msgstr "" #: actions/profilesettings.php:228 actions/register.php:230 #, fuzzy, php-format msgid "Bio is too long (max %d chars)." -msgstr "自我介紹過長(共140個字元)" +msgstr "地點過長(共255個字)" #: actions/profilesettings.php:235 actions/siteadminpanel.php:151 msgid "Timezone not selected." msgstr "" #: actions/profilesettings.php:241 +#, fuzzy msgid "Language is too long (max 50 chars)." -msgstr "" +msgstr "地點過長(共255個字)" #: actions/profilesettings.php:253 actions/tagother.php:178 #, fuzzy, php-format msgid "Invalid tag: \"%s\"" -msgstr "個人首頁連結%s無效" +msgstr "尺寸錯誤" #: actions/profilesettings.php:306 +#, fuzzy msgid "Couldn't update user for autosubscribe." -msgstr "" +msgstr "無法更新使用者" #: actions/profilesettings.php:363 #, fuzzy @@ -3048,8 +3035,9 @@ msgid "Beyond the page limit (%s)." msgstr "" #: actions/public.php:92 +#, fuzzy msgid "Could not retrieve public stream." -msgstr "" +msgstr "無法更新使用者" #: actions/public.php:130 #, php-format @@ -3069,9 +3057,8 @@ msgid "Public Stream Feed (RSS 2.0)" msgstr "" #: actions/public.php:168 -#, fuzzy msgid "Public Stream Feed (Atom)" -msgstr "%s的公開內容" +msgstr "" #: actions/public.php:188 #, php-format @@ -3137,8 +3124,9 @@ msgid "Tag cloud" msgstr "" #: actions/recoverpassword.php:36 +#, fuzzy msgid "You are already logged in!" -msgstr "" +msgstr "已登入" #: actions/recoverpassword.php:62 msgid "No such recovery code." @@ -3161,14 +3149,16 @@ msgid "This confirmation code is too old. Please start again." msgstr "" #: actions/recoverpassword.php:111 +#, fuzzy msgid "Could not update user with confirmed email address." -msgstr "" +msgstr "無法更新使用者" #: actions/recoverpassword.php:152 +#, fuzzy msgid "" "If you have forgotten or lost your password, you can get a new one sent to " "the email address you have stored in your account." -msgstr "" +msgstr "我們已寄出一封信到你帳號中的信箱,告訴你如何取回你的密碼。" #: actions/recoverpassword.php:158 msgid "You have been identified. Enter a new password below. " @@ -3179,8 +3169,9 @@ msgid "Password recovery" msgstr "" #: actions/recoverpassword.php:191 +#, fuzzy msgid "Nickname or email address" -msgstr "" +msgstr "請輸入暱稱或電子信箱" #: actions/recoverpassword.php:193 msgid "Your nickname on this server, or your registered email address." @@ -3191,12 +3182,14 @@ msgid "Recover" msgstr "" #: actions/recoverpassword.php:208 +#, fuzzy msgid "Reset password" -msgstr "" +msgstr "新密碼" #: actions/recoverpassword.php:209 +#, fuzzy msgid "Recover password" -msgstr "" +msgstr "新密碼" #: actions/recoverpassword.php:210 actions/recoverpassword.php:335 msgid "Password recovery requested" @@ -3219,8 +3212,9 @@ msgid "Enter a nickname or email address." msgstr "請輸入暱稱或電子信箱" #: actions/recoverpassword.php:282 +#, fuzzy msgid "No user with that email address or username." -msgstr "" +msgstr "查無此使用者所註冊的信箱" #: actions/recoverpassword.php:299 msgid "No registered email address for that user." @@ -3296,12 +3290,14 @@ msgid "" msgstr "" #: actions/register.php:432 +#, fuzzy msgid "1-64 lowercase letters or numbers, no punctuation or spaces. Required." -msgstr "" +msgstr "1-64個小寫英文字母或數字,勿加標點符號或空格" #: actions/register.php:437 +#, fuzzy msgid "6 or more characters. Required." -msgstr "" +msgstr "6個以上字元" #: actions/register.php:441 msgid "Same as password above. Required." @@ -3344,11 +3340,11 @@ msgstr "" #. TRANS: Copyright checkbox label in registration dialog, for Creative Commons-style licenses. #: actions/register.php:540 -#, fuzzy, php-format +#, php-format msgid "" "My text and files are available under %s except this private data: password, " "email address, IM address, and phone number." -msgstr "不包含這些個人資料:密碼、電子信箱、線上即時通信箱、電話號碼" +msgstr "" #: actions/register.php:583 #, php-format @@ -3384,16 +3380,18 @@ msgid "" msgstr "" #: actions/remotesubscribe.php:112 +#, fuzzy msgid "Remote subscribe" -msgstr "" +msgstr "此帳號已註冊" #: actions/remotesubscribe.php:124 msgid "Subscribe to a remote user" msgstr "" #: actions/remotesubscribe.php:129 +#, fuzzy msgid "User nickname" -msgstr "" +msgstr "無暱稱" #: actions/remotesubscribe.php:130 msgid "Nickname of the user you want to follow" @@ -3409,8 +3407,9 @@ msgstr "" #: actions/remotesubscribe.php:137 lib/subscribeform.php:139 #: lib/userprofile.php:406 +#, fuzzy msgid "Subscribe" -msgstr "" +msgstr "此帳號已註冊" #: actions/remotesubscribe.php:159 msgid "Invalid profile URL (bad format)" @@ -3425,37 +3424,32 @@ msgid "That’s a local profile! Login to subscribe." msgstr "" #: actions/remotesubscribe.php:183 -#, fuzzy msgid "Couldn’t get a request token." -msgstr "無法取得轉換標記" +msgstr "" #: actions/repeat.php:57 msgid "Only logged-in users can repeat notices." msgstr "" #: actions/repeat.php:64 actions/repeat.php:71 -#, fuzzy msgid "No notice specified." -msgstr "新訊息" +msgstr "" #: actions/repeat.php:76 msgid "You can't repeat your own notice." msgstr "" #: actions/repeat.php:90 -#, fuzzy msgid "You already repeated that notice." -msgstr "無此使用者" +msgstr "" -#: actions/repeat.php:114 lib/noticelist.php:675 -#, fuzzy +#: actions/repeat.php:114 lib/noticelist.php:676 msgid "Repeated" -msgstr "新增" +msgstr "" #: actions/repeat.php:119 -#, fuzzy msgid "Repeated!" -msgstr "新增" +msgstr "" #: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 @@ -3464,24 +3458,24 @@ msgid "Replies to %s" msgstr "" #: actions/replies.php:128 -#, fuzzy, php-format +#, php-format msgid "Replies to %1$s, page %2$d" -msgstr "&s的微型部落格" +msgstr "" #: actions/replies.php:145 -#, fuzzy, php-format +#, php-format msgid "Replies feed for %s (RSS 1.0)" -msgstr "發送給%s好友的訂閱" +msgstr "" #: actions/replies.php:152 -#, fuzzy, php-format +#, php-format msgid "Replies feed for %s (RSS 2.0)" -msgstr "發送給%s好友的訂閱" +msgstr "" #: actions/replies.php:159 -#, fuzzy, php-format +#, php-format msgid "Replies feed for %s (Atom)" -msgstr "發送給%s好友的訂閱" +msgstr "" #: actions/replies.php:199 #, php-format @@ -3505,28 +3499,25 @@ msgid "" msgstr "" #: actions/repliesrss.php:72 -#, fuzzy, php-format +#, php-format msgid "Replies to %1$s on %2$s!" -msgstr "&s的微型部落格" +msgstr "" #: actions/revokerole.php:75 -#, fuzzy msgid "You cannot revoke user roles on this site." -msgstr "無法連結到伺服器:%s" +msgstr "" #: actions/revokerole.php:82 msgid "User doesn't have this role." msgstr "" #: actions/rsd.php:146 actions/version.php:159 -#, fuzzy msgid "StatusNet" -msgstr "更新個人圖像" +msgstr "" #: actions/sandbox.php:65 actions/unsandbox.php:65 -#, fuzzy msgid "You cannot sandbox users on this site." -msgstr "無法連結到伺服器:%s" +msgstr "" #: actions/sandbox.php:72 msgid "User is already sandboxed." @@ -3560,9 +3551,8 @@ msgstr "" #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292 #: actions/useradminpanel.php:294 -#, fuzzy msgid "Save site settings" -msgstr "線上即時通設定" +msgstr "" #: actions/showapplication.php:82 msgid "You must be logged in to view an application." @@ -3586,9 +3576,8 @@ msgstr "暱稱" #. TRANS: Form input field label. #: actions/showapplication.php:178 lib/applicationeditform.php:235 -#, fuzzy msgid "Organization" -msgstr "地點" +msgstr "" #. TRANS: Form input field label. #: actions/showapplication.php:187 actions/version.php:200 @@ -3650,28 +3639,29 @@ msgid "Are you sure you want to reset your consumer key and secret?" msgstr "" #: actions/showfavorites.php:79 -#, fuzzy, php-format +#, php-format msgid "%1$s's favorite notices, page %2$d" -msgstr "%s與好友" - -#: actions/showfavorites.php:132 -msgid "Could not retrieve favorite notices." msgstr "" +#: actions/showfavorites.php:132 +#, fuzzy +msgid "Could not retrieve favorite notices." +msgstr "無法儲存個人資料" + #: actions/showfavorites.php:171 -#, fuzzy, php-format +#, php-format msgid "Feed for favorites of %s (RSS 1.0)" -msgstr "發送給%s好友的訂閱" +msgstr "" #: actions/showfavorites.php:178 -#, fuzzy, php-format +#, php-format msgid "Feed for favorites of %s (RSS 2.0)" -msgstr "發送給%s好友的訂閱" +msgstr "" #: actions/showfavorites.php:185 -#, fuzzy, php-format +#, php-format msgid "Feed for favorites of %s (Atom)" -msgstr "發送給%s好友的訂閱" +msgstr "" #: actions/showfavorites.php:206 msgid "" @@ -3704,14 +3694,13 @@ msgid "%s group" msgstr "" #: actions/showgroup.php:84 -#, fuzzy, php-format +#, php-format msgid "%1$s group, page %2$d" -msgstr "所有訂閱" +msgstr "" #: actions/showgroup.php:227 -#, fuzzy msgid "Group profile" -msgstr "無此通知" +msgstr "" #: actions/showgroup.php:272 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:178 @@ -3747,9 +3736,9 @@ msgid "Notice feed for %s group (Atom)" msgstr "" #: actions/showgroup.php:355 -#, fuzzy, php-format +#, php-format msgid "FOAF for %s group" -msgstr "無此通知" +msgstr "" #: actions/showgroup.php:393 actions/showgroup.php:445 lib/groupnav.php:91 #, fuzzy @@ -3767,9 +3756,8 @@ msgid "All members" msgstr "" #: actions/showgroup.php:439 -#, fuzzy msgid "Created" -msgstr "新增" +msgstr "" #: actions/showgroup.php:455 #, php-format @@ -3795,8 +3783,9 @@ msgid "Admins" msgstr "" #: actions/showmessage.php:81 +#, fuzzy msgid "No such message." -msgstr "" +msgstr "無此使用者" #: actions/showmessage.php:98 msgid "Only the sender and recipient may read this message." @@ -3813,9 +3802,8 @@ msgid "Message from %1$s on %2$s" msgstr "" #: actions/shownotice.php:90 -#, fuzzy msgid "Notice deleted." -msgstr "更新個人圖像" +msgstr "" #: actions/showstream.php:73 #, php-format @@ -3823,14 +3811,14 @@ msgid " tagged %s" msgstr "" #: actions/showstream.php:79 -#, fuzzy, php-format +#, php-format msgid "%1$s, page %2$d" -msgstr "%s與好友" +msgstr "" #: actions/showstream.php:122 -#, fuzzy, php-format +#, php-format msgid "Notice feed for %1$s tagged %2$s (RSS 1.0)" -msgstr "發送給%s好友的訂閱" +msgstr "" #: actions/showstream.php:129 #, php-format @@ -3931,9 +3919,8 @@ msgid "General" msgstr "" #: actions/siteadminpanel.php:224 -#, fuzzy msgid "Site name" -msgstr "新訊息" +msgstr "" #: actions/siteadminpanel.php:225 msgid "The name of your site, like \"Yourcompany Microblog\"" @@ -4011,9 +3998,8 @@ msgid "Edit site-wide message" msgstr "" #: actions/sitenoticeadminpanel.php:103 -#, fuzzy msgid "Unable to save site notice." -msgstr "新訊息" +msgstr "" #: actions/sitenoticeadminpanel.php:113 msgid "Max length for the site-wide notice is 255 chars." @@ -4035,9 +4021,8 @@ msgstr "新訊息" #. TRANS: Title for SMS settings. #: actions/smssettings.php:59 -#, fuzzy msgid "SMS settings" -msgstr "線上即時通設定" +msgstr "" #. TRANS: SMS settings page instructions. #. TRANS: %%site.name%% is the name of the site. @@ -4048,15 +4033,13 @@ msgstr "" #. TRANS: Message given in the SMS settings if SMS is not enabled on the site. #: actions/smssettings.php:97 -#, fuzzy msgid "SMS is not available." -msgstr "個人首頁位址錯誤" +msgstr "" #. TRANS: Form legend for SMS settings form. #: actions/smssettings.php:111 -#, fuzzy msgid "SMS address" -msgstr "線上即時通信箱" +msgstr "" #. TRANS: Form guide in SMS settings form. #: actions/smssettings.php:120 @@ -4070,8 +4053,9 @@ msgstr "" #. TRANS: Field label for SMS address input in SMS settings form. #: actions/smssettings.php:142 +#, fuzzy msgid "Confirmation code" -msgstr "" +msgstr "無確認碼" #. TRANS: Form field instructions in SMS settings form. #: actions/smssettings.php:144 @@ -4092,8 +4076,9 @@ msgstr "" #. TRANS: SMS phone number input field instructions in SMS settings form. #: actions/smssettings.php:156 +#, fuzzy msgid "Phone number, no punctuation or spaces, with area code" -msgstr "" +msgstr "1-64個小寫英文字母或數字,勿加標點符號或空格" #. TRANS: Form legend for SMS preferences form. #: actions/smssettings.php:195 @@ -4114,8 +4099,9 @@ msgstr "" #. TRANS: Message given saving SMS phone number without having provided one. #: actions/smssettings.php:338 +#, fuzzy msgid "No phone number." -msgstr "" +msgstr "無此使用者" #. TRANS: Message given saving SMS phone number without having selected a carrier. #: actions/smssettings.php:344 @@ -4129,8 +4115,9 @@ msgstr "" #. TRANS: Message given saving SMS phone number that is already set for another user. #: actions/smssettings.php:356 +#, fuzzy msgid "That phone number already belongs to another user." -msgstr "" +msgstr "此Jabber ID已有人使用" #. TRANS: Message given saving valid SMS phone number that is to be confirmed. #: actions/smssettings.php:384 @@ -4142,14 +4129,15 @@ msgstr "確認信已寄到你的線上即時通信箱。%s送給你得訊息要 #. TRANS: Message given canceling SMS phone number confirmation for the wrong phone number. #: actions/smssettings.php:413 +#, fuzzy msgid "That is the wrong confirmation number." -msgstr "" +msgstr "無法輸入確認碼" #. TRANS: Message given after successfully canceling SMS phone number confirmation. #: actions/smssettings.php:427 #, fuzzy msgid "SMS confirmation cancelled." -msgstr "確認取消" +msgstr "無確認碼" #. TRANS: Message given trying to remove an SMS phone number that is not #. TRANS: registered for the active user. @@ -4183,8 +4171,9 @@ msgstr "" #. TRANS: Message given saving SMS phone number confirmation code without having provided one. #: actions/smssettings.php:548 +#, fuzzy msgid "No code entered" -msgstr "" +msgstr "無內容" #. TRANS: Menu item for site administration #: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196 @@ -4242,19 +4231,19 @@ msgid "Snapshots will be sent to this URL" msgstr "" #: actions/snapshotadminpanel.php:248 -#, fuzzy msgid "Save snapshot settings" -msgstr "線上即時通設定" +msgstr "" #: actions/subedit.php:70 +#, fuzzy msgid "You are not subscribed to that profile." -msgstr "" +msgstr "此帳號已註冊" #. TRANS: Exception thrown when a subscription could not be stored on the server. #: actions/subedit.php:83 classes/Subscription.php:136 #, fuzzy msgid "Could not save subscription." -msgstr "註冊失敗" +msgstr "無法新增訂閱" #: actions/subscribe.php:77 msgid "This action only accepts POST requests." @@ -4280,13 +4269,14 @@ msgid "%s subscribers" msgstr "此帳號已註冊" #: actions/subscribers.php:52 -#, fuzzy, php-format +#, php-format msgid "%1$s subscribers, page %2$d" -msgstr "所有訂閱" +msgstr "" #: actions/subscribers.php:63 +#, fuzzy msgid "These are the people who listen to your notices." -msgstr "" +msgstr "現在%1$s在%2$s成為你的粉絲囉" #: actions/subscribers.php:67 #, php-format @@ -4355,9 +4345,9 @@ msgid "SMS" msgstr "" #: actions/tag.php:69 -#, fuzzy, php-format +#, php-format msgid "Notices tagged with %1$s, page %2$d" -msgstr "&s的微型部落格" +msgstr "" #: actions/tag.php:87 #, php-format @@ -4365,9 +4355,9 @@ msgid "Notice feed for tag %s (RSS 1.0)" msgstr "" #: actions/tag.php:93 -#, fuzzy, php-format +#, php-format msgid "Notice feed for tag %s (RSS 2.0)" -msgstr "發送給%s好友的訂閱" +msgstr "" #: actions/tag.php:99 #, php-format @@ -4375,9 +4365,8 @@ msgid "Notice feed for tag %s (Atom)" msgstr "" #: actions/tagother.php:39 -#, fuzzy msgid "No ID argument." -msgstr "無此文件" +msgstr "" #: actions/tagother.php:65 #, php-format @@ -4385,9 +4374,8 @@ msgid "Tag %s" msgstr "" #: actions/tagother.php:77 lib/userprofile.php:76 -#, fuzzy msgid "User profile" -msgstr "無此通知" +msgstr "" #: actions/tagother.php:81 actions/userauthorization.php:132 #: lib/userprofile.php:103 @@ -4412,7 +4400,7 @@ msgstr "" #: actions/tagother.php:200 #, fuzzy msgid "Could not save tags." -msgstr "無法存取個人圖像資料" +msgstr "無法儲存個人資料" #: actions/tagother.php:236 msgid "Use this form to add tags to your subscribers or subscriptions." @@ -4424,9 +4412,8 @@ msgid "No such tag." msgstr "無此通知" #: actions/unblock.php:59 -#, fuzzy msgid "You haven't blocked that user." -msgstr "無此使用者" +msgstr "" #: actions/unsandbox.php:72 msgid "User is not sandboxed." @@ -4511,9 +4498,8 @@ msgid "Automatically subscribe new users to this user." msgstr "" #: actions/useradminpanel.php:251 -#, fuzzy msgid "Invitations" -msgstr "地點" +msgstr "" #: actions/useradminpanel.php:256 msgid "Invitations enabled" @@ -4544,8 +4530,9 @@ msgstr "接受" #: actions/userauthorization.php:218 lib/subscribeform.php:115 #: lib/subscribeform.php:139 +#, fuzzy msgid "Subscribe to this user" -msgstr "" +msgstr "此帳號已註冊" #: actions/userauthorization.php:219 msgid "Reject" @@ -4554,7 +4541,7 @@ msgstr "" #: actions/userauthorization.php:220 #, fuzzy msgid "Reject this subscription" -msgstr "所有訂閱" +msgstr "註冊確認" #: actions/userauthorization.php:232 msgid "No authorization request!" @@ -4608,9 +4595,9 @@ msgid "Avatar URL ‘%s’ is not valid." msgstr "" #: actions/userauthorization.php:350 -#, fuzzy, php-format +#, php-format msgid "Can’t read avatar URL ‘%s’." -msgstr "無法讀取此%sURL的圖像" +msgstr "" #: actions/userauthorization.php:355 #, php-format @@ -4633,18 +4620,18 @@ msgstr "" #. TRANS: Message is used as a page title. %1$s is a nick name, %2$d is a page number. #: actions/usergroups.php:66 -#, fuzzy, php-format +#, php-format msgid "%1$s groups, page %2$d" -msgstr "所有訂閱" +msgstr "" #: actions/usergroups.php:132 msgid "Search for more groups" msgstr "" #: actions/usergroups.php:159 -#, php-format +#, fuzzy, php-format msgid "%s is not a member of any group." -msgstr "" +msgstr "無法連結到伺服器:%s" #: actions/usergroups.php:164 #, php-format @@ -4707,9 +4694,8 @@ msgstr "" #. TRANS: Secondary navigation menu option leading to version information on the StatusNet site. #: actions/version.php:198 lib/action.php:789 -#, fuzzy msgid "Version" -msgstr "地點" +msgstr "" #: actions/version.php:199 msgid "Author(s)" @@ -4757,21 +4743,18 @@ msgstr "尺寸錯誤" #. TRANS: Exception thrown when joining a group fails. #: classes/Group_member.php:42 -#, fuzzy msgid "Group join failed." -msgstr "無此通知" +msgstr "" #. TRANS: Exception thrown when trying to leave a group the user is not a member of. #: classes/Group_member.php:55 -#, fuzzy msgid "Not part of group." -msgstr "無法更新使用者" +msgstr "" #. TRANS: Exception thrown when trying to leave a group fails. #: classes/Group_member.php:63 -#, fuzzy msgid "Group leave failed." -msgstr "無此通知" +msgstr "" #. TRANS: Server exception thrown when updating a local group fails. #: classes/Local_group.php:42 @@ -4782,9 +4765,9 @@ msgstr "無法更新使用者" #. TRANS: Exception thrown when trying creating a login token failed. #. TRANS: %s is the user nickname for which token creation failed. #: classes/Login_token.php:78 -#, fuzzy, php-format +#, php-format msgid "Could not create login token for %s" -msgstr "無法存取個人圖像資料" +msgstr "" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 @@ -4798,13 +4781,15 @@ msgstr "" #. TRANS: Message given when a message could not be stored on the server. #: classes/Message.php:63 +#, fuzzy msgid "Could not insert message." -msgstr "" +msgstr "無法新增訂閱" #. TRANS: Message given when a message could not be updated on the server. #: classes/Message.php:74 +#, fuzzy msgid "Could not update message with new URI." -msgstr "" +msgstr "無法更新使用者" #. TRANS: Server exception thrown when a user profile for a notice cannot be found. #. TRANS: %1$d is a profile ID (number), %2$d is a notice ID (number). @@ -4817,7 +4802,7 @@ msgstr "" #: classes/Notice.php:190 #, fuzzy, php-format msgid "Database error inserting hashtag: %s" -msgstr "增加回覆時,資料庫發生錯誤: %s" +msgstr "個人圖像插入錯誤" #. TRANS: Client exception thrown if a notice contains too many characters. #: classes/Notice.php:260 @@ -4852,8 +4837,9 @@ msgstr "" #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. #: classes/Notice.php:353 classes/Notice.php:380 +#, fuzzy msgid "Problem saving notice." -msgstr "" +msgstr "儲存使用者發生錯誤" #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). #: classes/Notice.php:892 @@ -4862,13 +4848,12 @@ msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. #: classes/Notice.php:991 -#, fuzzy msgid "Problem saving group inbox." -msgstr "儲存使用者發生錯誤" +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. -#: classes/Notice.php:1745 +#: classes/Notice.php:1746 #, php-format msgid "RT @%1$s %2$s" msgstr "" @@ -4891,13 +4876,12 @@ msgstr "" #: classes/Remote_profile.php:54 #, fuzzy msgid "Missing profile." -msgstr "無此通知" +msgstr "新的更人資料輸入錯誤" #. TRANS: Exception thrown when a tag cannot be saved. #: classes/Status_network.php:346 -#, fuzzy msgid "Unable to save tag." -msgstr "新訊息" +msgstr "" #. TRANS: Exception thrown when trying to subscribe while being banned from subscribing. #: classes/Subscription.php:75 lib/oauthstore.php:465 @@ -4906,8 +4890,9 @@ msgstr "" #. TRANS: Exception thrown when trying to subscribe while already subscribed. #: classes/Subscription.php:80 +#, fuzzy msgid "Already subscribed!" -msgstr "" +msgstr "此帳號已註冊" #. TRANS: Exception thrown when trying to subscribe to a user who has blocked the subscribing user. #: classes/Subscription.php:85 @@ -4924,19 +4909,19 @@ msgstr "此帳號已註冊" #: classes/Subscription.php:178 #, fuzzy msgid "Could not delete self-subscription." -msgstr "無法刪除帳號" +msgstr "無法新增訂閱" #. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server. #: classes/Subscription.php:206 #, fuzzy msgid "Could not delete subscription OMB token." -msgstr "無法刪除帳號" +msgstr "無法新增訂閱" #. TRANS: Exception thrown when a subscription could not be deleted on the server. #: classes/Subscription.php:218 #, fuzzy msgid "Could not delete subscription." -msgstr "無法刪除帳號" +msgstr "無法新增訂閱" #. TRANS: Notice given on user registration. #. TRANS: %1$s is the sitename, $2$s is the registering user's nickname. @@ -4949,25 +4934,25 @@ msgstr "" #: classes/User_group.php:496 #, fuzzy msgid "Could not create group." -msgstr "無法存取個人圖像資料" +msgstr "無法更新使用者" #. TRANS: Server exception thrown when updating a group URI failed. #: classes/User_group.php:506 #, fuzzy msgid "Could not set group URI." -msgstr "註冊失敗" +msgstr "無法儲存個人資料" #. TRANS: Server exception thrown when setting group membership failed. #: classes/User_group.php:529 #, fuzzy msgid "Could not set group membership." -msgstr "註冊失敗" +msgstr "無法更新使用者" #. TRANS: Server exception thrown when saving local group information failed. #: classes/User_group.php:544 #, fuzzy msgid "Could not save local group info." -msgstr "註冊失敗" +msgstr "無法儲存個人資料" #. TRANS: Link title attribute in user account settings menu. #: lib/accountsettingsaction.php:109 @@ -4982,8 +4967,9 @@ msgstr "無法上傳個人圖像" #. TRANS: Link title attribute in user account settings menu. #: lib/accountsettingsaction.php:123 +#, fuzzy msgid "Change your password" -msgstr "" +msgstr "更改密碼" #. TRANS: Link title attribute in user account settings menu. #: lib/accountsettingsaction.php:130 @@ -4992,9 +4978,8 @@ msgstr "" #. TRANS: Link title attribute in user account settings menu. #: lib/accountsettingsaction.php:137 -#, fuzzy msgid "Design your profile" -msgstr "無此通知" +msgstr "" #. TRANS: Link title attribute in user account settings menu. #: lib/accountsettingsaction.php:144 @@ -5030,24 +5015,21 @@ msgstr "" #. TRANS: Main menu option when logged in for access to personal profile and friends timeline #: lib/action.php:445 -#, fuzzy msgctxt "MENU" msgid "Personal" -msgstr "地點" +msgstr "" #. TRANS: Tooltip for main menu option "Account" #: lib/action.php:447 -#, fuzzy msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" -msgstr "更改密碼" +msgstr "" #. TRANS: Tooltip for main menu option "Services" #: lib/action.php:452 -#, fuzzy msgctxt "TOOLTIP" msgid "Connect to services" -msgstr "無法連結到伺服器:%s" +msgstr "" #. TRANS: Main menu option when logged in and connection are possible for access to options to connect to other services #: lib/action.php:455 @@ -5056,10 +5038,9 @@ msgstr "連結" #. TRANS: Tooltip for menu option "Admin" #: lib/action.php:458 -#, fuzzy msgctxt "TOOLTIP" msgid "Change site configuration" -msgstr "確認信箱" +msgstr "" #. TRANS: Main menu option when logged in and site admin for access to site configuration #: lib/action.php:461 @@ -5076,10 +5057,9 @@ msgstr "" #. TRANS: Main menu option when logged in and invitations are allowed for inviting new users #: lib/action.php:468 -#, fuzzy msgctxt "MENU" msgid "Invite" -msgstr "尺寸錯誤" +msgstr "" #. TRANS: Tooltip for main menu option "Logout" #: lib/action.php:474 @@ -5089,24 +5069,21 @@ msgstr "" #. TRANS: Main menu option when logged in to log out the current user #: lib/action.php:477 -#, fuzzy msgctxt "MENU" msgid "Logout" -msgstr "登出" +msgstr "" #. TRANS: Tooltip for main menu option "Register" #: lib/action.php:482 -#, fuzzy msgctxt "TOOLTIP" msgid "Create an account" -msgstr "新增帳號" +msgstr "" #. TRANS: Main menu option when not logged in to register a new account #: lib/action.php:485 -#, fuzzy msgctxt "MENU" msgid "Register" -msgstr "所有訂閱" +msgstr "" #. TRANS: Tooltip for main menu option "Login" #: lib/action.php:488 @@ -5213,13 +5190,11 @@ msgstr "" #. TRANS: First sentence of the StatusNet site license. Used if 'broughtby' is set. #: lib/action.php:827 -#, fuzzy, php-format +#, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." "broughtby%%](%%site.broughtbyurl%%)." msgstr "" -"**%%site.name%%**是由[%%site.broughtby%%](%%site.broughtbyurl%%)所提供的微型" -"部落格服務" #. TRANS: First sentence of the StatusNet site license. Used if 'broughtby' is not set. #: lib/action.php:830 @@ -5238,9 +5213,8 @@ msgstr "" #. TRANS: DT element for StatusNet site content license. #: lib/action.php:850 -#, fuzzy msgid "Site content license" -msgstr "新訊息" +msgstr "" #. TRANS: Content license displayed when license is set to 'private'. #. TRANS: %1$s is the site name. @@ -5281,9 +5255,8 @@ msgstr "" #. TRANS: Pagination message to go to a page displaying information more in the #. TRANS: past than the currently displayed information. #: lib/action.php:1213 -#, fuzzy msgid "Before" -msgstr "之前的內容»" +msgstr "" #. TRANS: Client exception thrown when a feed instance is a DOMDocument. #: lib/activity.php:122 @@ -5336,10 +5309,9 @@ msgstr "確認信箱" #. TRANS: Menu item for site administration #: lib/adminpanelaction.php:352 -#, fuzzy msgctxt "MENU" msgid "Site" -msgstr "新訊息" +msgstr "" #. TRANS: Menu item title/tooltip #: lib/adminpanelaction.php:358 @@ -5349,16 +5321,15 @@ msgstr "確認信箱" #. TRANS: Menu item for site administration #: lib/adminpanelaction.php:360 -#, fuzzy msgctxt "MENU" msgid "Design" -msgstr "地點" +msgstr "" #. TRANS: Menu item title/tooltip #: lib/adminpanelaction.php:366 #, fuzzy msgid "User configuration" -msgstr "確認信箱" +msgstr "無確認碼" #. TRANS: Menu item for site administration #: lib/adminpanelaction.php:368 lib/personalgroupnav.php:115 @@ -5412,15 +5383,14 @@ msgstr "" #. TRANS: Form input field instructions. #: lib/applicationeditform.php:209 -#, fuzzy, php-format +#, php-format msgid "Describe your application in %d characters" -msgstr "請在140個字以內描述你自己與你的興趣" +msgstr "" #. TRANS: Form input field instructions. #: lib/applicationeditform.php:213 -#, fuzzy msgid "Describe your application" -msgstr "請在140個字以內描述你自己與你的興趣" +msgstr "" #. TRANS: Form input field instructions. #: lib/applicationeditform.php:224 @@ -5552,9 +5522,8 @@ msgid "Notice with that id does not exist" msgstr "" #: lib/command.php:99 lib/command.php:596 -#, fuzzy msgid "User has no last notice" -msgstr "新訊息" +msgstr "" #. TRANS: Message given requesting a profile for a non-existing user. #. TRANS: %s is the nickname of the user for which the profile could not be found. @@ -5607,14 +5576,14 @@ msgstr "無法連結到伺服器:%s" #: lib/command.php:339 #, fuzzy, php-format msgid "Could not join user %1$s to group %2$s" -msgstr "無法連結到伺服器:%s" +msgstr "無法更新使用者" #. TRANS: Message given having failed to remove a user from a group. #. TRANS: %1$s is the nickname of the user, %2$s is the nickname of the group. #: lib/command.php:385 -#, fuzzy, php-format +#, php-format msgid "Could not remove user %1$s from group %2$s" -msgstr "無法從 %s 建立OpenID" +msgstr "" #. TRANS: Whois output. %s is the full name of the queried user. #: lib/command.php:418 @@ -5625,22 +5594,22 @@ msgstr "全名" #. TRANS: Whois output. %s is the location of the queried user. #. TRANS: Profile info line in new-subscriber notification e-mail #: lib/command.php:422 lib/mail.php:268 -#, php-format +#, fuzzy, php-format msgid "Location: %s" -msgstr "" +msgstr "地點" #. TRANS: Whois output. %s is the homepage of the queried user. #. TRANS: Profile info line in new-subscriber notification e-mail #: lib/command.php:426 lib/mail.php:271 -#, php-format +#, fuzzy, php-format msgid "Homepage: %s" -msgstr "" +msgstr "個人首頁" #. TRANS: Whois output. %s is the bio information of the queried user. #: lib/command.php:430 -#, php-format +#, fuzzy, php-format msgid "About: %s" -msgstr "" +msgstr "關於" #: lib/command.php:457 #, php-format @@ -5664,25 +5633,24 @@ msgid "Direct message to %s sent" msgstr "" #: lib/command.php:494 +#, fuzzy msgid "Error sending direct message." -msgstr "" +msgstr "使用者設定發生錯誤" #: lib/command.php:514 -#, fuzzy msgid "Cannot repeat your own notice" -msgstr "儲存使用者發生錯誤" +msgstr "" #: lib/command.php:519 -#, fuzzy msgid "Already repeated that notice" -msgstr "無此使用者" +msgstr "" #. TRANS: Message given having repeated a notice from another user. #. TRANS: %s is the name of the user for which the notice was repeated. #: lib/command.php:529 -#, fuzzy, php-format +#, php-format msgid "Notice from %s repeated" -msgstr "更新個人圖像" +msgstr "" #: lib/command.php:531 #, fuzzy @@ -5695,9 +5663,9 @@ msgid "Notice too long - maximum is %d characters, you sent %d" msgstr "" #: lib/command.php:571 -#, fuzzy, php-format +#, php-format msgid "Reply to %s sent" -msgstr "&s的微型部落格" +msgstr "" #: lib/command.php:573 msgid "Error saving notice." @@ -5730,16 +5698,18 @@ msgid "Command not yet implemented." msgstr "" #: lib/command.php:685 +#, fuzzy msgid "Notification off." -msgstr "" +msgstr "無確認碼" #: lib/command.php:687 msgid "Can't turn off notification." msgstr "" #: lib/command.php:708 +#, fuzzy msgid "Notification on." -msgstr "" +msgstr "無確認碼" #: lib/command.php:710 msgid "Can't turn on notification." @@ -5874,9 +5844,8 @@ msgid "Database error" msgstr "" #: lib/designsettings.php:105 -#, fuzzy msgid "Upload file" -msgstr "無此通知" +msgstr "" #: lib/designsettings.php:109 msgid "" @@ -5954,14 +5923,13 @@ msgid "URL of the homepage or blog of the group or topic" msgstr "" #: lib/groupeditform.php:168 -#, fuzzy msgid "Describe the group or topic" -msgstr "請在140個字以內描述你自己與你的興趣" +msgstr "" #: lib/groupeditform.php:170 -#, fuzzy, php-format +#, php-format msgid "Describe the group or topic in %d characters" -msgstr "請在140個字以內描述你自己與你的興趣" +msgstr "" #: lib/groupeditform.php:179 msgid "" @@ -5978,14 +5946,13 @@ msgid "Group" msgstr "" #: lib/groupnav.php:101 -#, fuzzy msgid "Blocked" -msgstr "無此使用者" +msgstr "" #: lib/groupnav.php:102 -#, fuzzy, php-format +#, php-format msgid "%s blocked users" -msgstr "無此使用者" +msgstr "" #: lib/groupnav.php:108 #, php-format @@ -5995,7 +5962,7 @@ msgstr "" #: lib/groupnav.php:113 #, fuzzy msgid "Logo" -msgstr "登出" +msgstr "登入" #: lib/groupnav.php:114 #, php-format @@ -6035,8 +6002,9 @@ msgid "That file is too big. The maximum file size is %s." msgstr "" #: lib/imagefile.php:93 +#, fuzzy msgid "Partial upload." -msgstr "" +msgstr "更新個人圖像" #: lib/imagefile.php:101 lib/mediafile.php:170 msgid "System error uploading file." @@ -6047,9 +6015,8 @@ msgid "Not an image or corrupt file." msgstr "" #: lib/imagefile.php:122 -#, fuzzy msgid "Lost our file." -msgstr "無此通知" +msgstr "" #: lib/imagefile.php:163 lib/imagefile.php:224 msgid "Unknown file type" @@ -6088,9 +6055,8 @@ msgid "Login with a username and password" msgstr "使用者名稱或密碼無效" #: lib/logingroupnav.php:86 -#, fuzzy msgid "Sign up for a new account" -msgstr "新增帳號" +msgstr "" #. TRANS: Subject for address confirmation email #: lib/mail.php:174 @@ -6130,7 +6096,7 @@ msgstr "" #. TRANS: Main body of new-subscriber notification e-mail #: lib/mail.php:254 -#, fuzzy, php-format +#, php-format msgid "" "%1$s is now listening to your notices on %2$s.\n" "\n" @@ -6143,13 +6109,6 @@ msgid "" "----\n" "Change your email address or notification options at %8$s\n" msgstr "" -"現在%1$s在%2$s成為你的粉絲囉。\n" -"\n" -"\t%3$s\n" -"\n" -"\n" -"%4$s.\n" -"敬上。\n" #. TRANS: Profile info line in new-subscriber notification e-mail #: lib/mail.php:274 @@ -6159,9 +6118,9 @@ msgstr "自我介紹" #. TRANS: Subject of notification mail for new posting email address #: lib/mail.php:304 -#, php-format +#, fuzzy, php-format msgid "New email address for posting to %s" -msgstr "" +msgstr "查無此使用者所註冊的信箱" #. TRANS: Body of notification mail for new posting email address #: lib/mail.php:308 @@ -6179,14 +6138,15 @@ msgstr "" #. TRANS: Subject line for SMS-by-email notification messages #: lib/mail.php:433 -#, php-format +#, fuzzy, php-format msgid "%s status" -msgstr "" +msgstr "%1$s的狀態是%2$s" #. TRANS: Subject line for SMS-by-email address confirmation message #: lib/mail.php:460 +#, fuzzy msgid "SMS confirmation" -msgstr "" +msgstr "無確認碼" #. TRANS: Main body heading for SMS-by-email address confirmation message #: lib/mail.php:463 @@ -6245,9 +6205,9 @@ msgstr "" #. TRANS: Subject for favorite notification email #: lib/mail.php:589 -#, fuzzy, php-format +#, php-format msgid "%s (@%s) added your notice as a favorite" -msgstr "現在%1$s在%2$s成為你的粉絲囉" +msgstr "" #. TRANS: Body for favorite notification email #: lib/mail.php:592 @@ -6323,17 +6283,19 @@ msgid "" "users in conversation. People can send you messages for your eyes only." msgstr "" -#: lib/mailbox.php:227 lib/noticelist.php:505 +#: lib/mailbox.php:228 lib/noticelist.php:506 msgid "from" msgstr "" #: lib/mailhandler.php:37 +#, fuzzy msgid "Could not parse message." -msgstr "" +msgstr "無法更新使用者" #: lib/mailhandler.php:42 +#, fuzzy msgid "Not a registered user." -msgstr "" +msgstr "此恢復碼錯誤" #: lib/mailhandler.php:46 msgid "Sorry, that is not your incoming email address." @@ -6387,9 +6349,8 @@ msgid "File could not be moved to destination directory." msgstr "" #: lib/mediafile.php:202 lib/mediafile.php:238 -#, fuzzy msgid "Could not determine file's MIME type." -msgstr "無法更新使用者" +msgstr "" #: lib/mediafile.php:318 #, php-format @@ -6438,14 +6399,12 @@ msgid "Attach a file" msgstr "" #: lib/noticeform.php:212 -#, fuzzy msgid "Share my location" -msgstr "無法儲存個人資料" +msgstr "" #: lib/noticeform.php:215 -#, fuzzy msgid "Do not share my location" -msgstr "無法儲存個人資料" +msgstr "" #: lib/noticeform.php:216 msgid "" @@ -6482,28 +6441,26 @@ msgstr "" msgid "at" msgstr "" -#: lib/noticelist.php:567 +#: lib/noticelist.php:568 #, fuzzy msgid "in context" msgstr "無內容" -#: lib/noticelist.php:602 -#, fuzzy +#: lib/noticelist.php:603 msgid "Repeated by" -msgstr "新增" - -#: lib/noticelist.php:629 -msgid "Reply to this notice" msgstr "" #: lib/noticelist.php:630 +msgid "Reply to this notice" +msgstr "" + +#: lib/noticelist.php:631 msgid "Reply" msgstr "" -#: lib/noticelist.php:674 -#, fuzzy +#: lib/noticelist.php:675 msgid "Notice repeated" -msgstr "更新個人圖像" +msgstr "" #: lib/nudgeform.php:116 msgid "Nudge this user" @@ -6580,16 +6537,18 @@ msgid "Unknown" msgstr "" #: lib/profileaction.php:109 lib/profileaction.php:205 lib/subgroupnav.php:82 +#, fuzzy msgid "Subscriptions" -msgstr "" +msgstr "所有訂閱" #: lib/profileaction.php:126 msgid "All subscriptions" msgstr "所有訂閱" #: lib/profileaction.php:144 lib/profileaction.php:214 lib/subgroupnav.php:90 +#, fuzzy msgid "Subscribers" -msgstr "" +msgstr "此帳號已註冊" #: lib/profileaction.php:161 #, fuzzy @@ -6638,28 +6597,25 @@ msgid "Popular" msgstr "" #: lib/redirectingaction.php:95 -#, fuzzy msgid "No return-to arguments." -msgstr "無此文件" +msgstr "" #: lib/repeatform.php:107 -#, fuzzy msgid "Repeat this notice?" -msgstr "無此通知" +msgstr "" #: lib/repeatform.php:132 msgid "Yes" msgstr "" #: lib/repeatform.php:132 -#, fuzzy msgid "Repeat this notice" -msgstr "無此通知" +msgstr "" #: lib/revokeroleform.php:91 -#, fuzzy, php-format +#, php-format msgid "Revoke the \"%s\" role from this user" -msgstr "無此使用者" +msgstr "" #: lib/router.php:709 msgid "No single user defined for single-user mode." @@ -6670,9 +6626,8 @@ msgid "Sandbox" msgstr "" #: lib/sandboxform.php:78 -#, fuzzy msgid "Sandbox this user" -msgstr "無此使用者" +msgstr "" #: lib/searchaction.php:120 msgid "Search site" @@ -6715,14 +6670,12 @@ msgid "More..." msgstr "" #: lib/silenceform.php:67 -#, fuzzy msgid "Silence" -msgstr "新訊息" +msgstr "" #: lib/silenceform.php:78 -#, fuzzy msgid "Silence this user" -msgstr "無此使用者" +msgstr "" #: lib/subgroupnav.php:83 #, fuzzy, php-format @@ -6815,26 +6768,26 @@ msgid "Unsandbox" msgstr "" #: lib/unsandboxform.php:80 -#, fuzzy msgid "Unsandbox this user" -msgstr "無此使用者" +msgstr "" #: lib/unsilenceform.php:67 msgid "Unsilence" msgstr "" #: lib/unsilenceform.php:78 -#, fuzzy msgid "Unsilence this user" -msgstr "無此使用者" +msgstr "" #: lib/unsubscribeform.php:113 lib/unsubscribeform.php:137 +#, fuzzy msgid "Unsubscribe from this user" -msgstr "" +msgstr "此帳號已註冊" #: lib/unsubscribeform.php:137 +#, fuzzy msgid "Unsubscribe" -msgstr "" +msgstr "此帳號已註冊" #: lib/usernoprofileexception.php:58 #, php-format @@ -6857,7 +6810,7 @@ msgstr "" #: lib/userprofile.php:263 #, fuzzy msgid "Edit profile settings" -msgstr "線上即時通設定" +msgstr "使用者設定發生錯誤" #: lib/userprofile.php:264 msgid "Edit" @@ -6876,9 +6829,8 @@ msgid "Moderate" msgstr "" #: lib/userprofile.php:364 -#, fuzzy msgid "User role" -msgstr "無此通知" +msgstr "" #: lib/userprofile.php:366 msgctxt "role" diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 3b073a5d13..6fef20d6f5 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -28,6 +28,15 @@ set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/ext class FeedSubException extends Exception { + function __construct($msg=null) + { + $type = get_class($this); + if ($msg) { + parent::__construct("$type: $msg"); + } else { + parent::__construct($type); + } + } } class OStatusPlugin extends Plugin diff --git a/plugins/OStatus/README b/plugins/OStatus/README index 3a98b7b256..ea5dfc055f 100644 --- a/plugins/OStatus/README +++ b/plugins/OStatus/README @@ -1,18 +1,42 @@ -Plugin to support importing updates from external RSS and Atom feeds into your timeline. +Plugin to support importing and exporting notices through Atom and RSS feeds. +The OStatus plugin concentrates on user-to-user cases for federating StatusNet +and similar social networking / microblogging / blogging sites, but includes +low-level feed subscription systems which are used by some other plugins. + +Uses PubSubHubbub for push feed updates; currently non-PuSH feeds cannot be +subscribed unless an external PuSH hub proxy is used. -Uses PubSubHubbub for push feed updates; currently non-PuSH feeds cannot be subscribed. Configuration options available: $config['ostatus']['hub'] (default internal hub) - Set to URL of an external PuSH hub to use it instead of our internal hub. + Set to URL of an external PuSH hub to use it instead of our internal hub + for sending outgoing updates in user and group feeds. $config['ostatus']['hub_retries'] (default 0) Number of times to retry a PuSH send to consumers if using internal hub +Settings controlling incoming feed subscription: + +$config['feedsub']['fallback_hub'] + To subscribe to feeds that don't have a hub, an external PuSH proxy hub + such as Superfeedr may be used. Any feed without a hub of its own will + be subscribed through the specified hub URL instead. If the external hub + has usage charges, be aware that there is no restriction placed to how + many feeds may be subscribed! + + $config['feedsub']['fallback_hub'] = 'https://superfeedr.com/hubbub'; + +$config['feedsub']['hub_user'] +$config['feedsub']['hub_password'] + If using the fallback hub mode, these settings may be used to provide + HTTP authentication credentials for contacting the hub. Default hubs + specified from feeds are assumed to not require + + For testing, shouldn't be used in production: $config['ostatus']['skip_signatures'] @@ -23,12 +47,11 @@ $config['feedsub']['nohub'] (default require hub) Allow low-level feed subscription setup for feeds without hubs. Not actually usable at this stage, OStatus will check for hubs too - and we have no polling backend. + and we have no polling backend. (The fallback hub option can be used + with a 3rd-party service to provide such polling.) Todo: -* fully functional l10n -* redo non-OStatus feed support -** rssCloud support? -** possibly a polling daemon to support non-PuSH feeds? +* better support for feeds that aren't natively oriented at social networking * make use of tags/categories from feeds +* better repeat handling diff --git a/plugins/OStatus/classes/FeedSub.php b/plugins/OStatus/classes/FeedSub.php index 9cd35e29c9..dd1968db12 100644 --- a/plugins/OStatus/classes/FeedSub.php +++ b/plugins/OStatus/classes/FeedSub.php @@ -207,8 +207,8 @@ class FeedSub extends Memcached_DataObject $discover = new FeedDiscovery(); $discover->discoverFromFeedURL($feeduri); - $huburi = $discover->getAtomLink('hub'); - if (!$huburi) { + $huburi = $discover->getHubLink(); + if (!$huburi && !common_config('feedsub', 'fallback_hub')) { throw new FeedSubNoHubException(); } @@ -241,8 +241,12 @@ class FeedSub extends Memcached_DataObject common_log(LOG_WARNING, "Attempting to (re)start PuSH subscription to $this->uri in unexpected state $this->sub_state"); } if (empty($this->huburi)) { - if (common_config('feedsub', 'nohub')) { + if (common_config('feedsub', 'fallback_hub')) { + // No native hub on this feed? + // Use our fallback hub, which handles polling on our behalf. + } else if (common_config('feedsub', 'nohub')) { // Fake it! We're just testing remote feeds w/o hubs. + // We'll never actually get updates in this mode. return true; } else { throw new ServerException("Attempting to start PuSH subscription for feed with no hub"); @@ -267,8 +271,12 @@ class FeedSub extends Memcached_DataObject common_log(LOG_WARNING, "Attempting to (re)end PuSH subscription to $this->uri in unexpected state $this->sub_state"); } if (empty($this->huburi)) { - if (common_config('feedsub', 'nohub')) { + if (common_config('feedsub', 'fallback_hub')) { + // No native hub on this feed? + // Use our fallback hub, which handles polling on our behalf. + } else if (common_config('feedsub', 'nohub')) { // Fake it! We're just testing remote feeds w/o hubs. + // We'll never actually get updates in this mode. return true; } else { throw new ServerException("Attempting to end PuSH subscription for feed with no hub"); @@ -326,7 +334,21 @@ class FeedSub extends Memcached_DataObject 'hub.secret' => $this->secret, 'hub.topic' => $this->uri); $client = new HTTPClient(); - $response = $client->post($this->huburi, $headers, $post); + if ($this->huburi) { + $hub = $this->huburi; + } else { + if (common_config('feedsub', 'fallback_hub')) { + $hub = common_config('feedsub', 'fallback_hub'); + if (common_config('feedsub', 'hub_user')) { + $u = common_config('feedsub', 'hub_user'); + $p = common_config('feedsub', 'hub_pass'); + $client->setAuth($u, $p); + } + } else { + throw new FeedSubException('WTF?'); + } + } + $response = $client->post($hub, $headers, $post); $status = $response->getStatus(); if ($status == 202) { common_log(LOG_INFO, __METHOD__ . ': sub req ok, awaiting verification callback'); diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 2d7c632e63..8f8eb773f8 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -493,8 +493,14 @@ class Ostatus_profile extends Memcached_DataObject // OK here! assume the default } else if ($actor->id == $this->uri || $actor->link == $this->uri) { $this->updateFromActivityObject($actor); - } else { + } else if ($actor->id) { + // We have an ActivityStreams actor with an explicit ID that doesn't match the feed owner. + // This isn't what we expect from mainline OStatus person feeds! + // Group feeds go down another path, with different validation. throw new Exception("Got an actor '{$actor->title}' ({$actor->id}) on single-user feed for {$this->uri}"); + } else { + // Plain without ActivityStreams actor info. + // We'll just ignore this info for now and save the update under the feed's identity. } $oprofile = $this; @@ -675,7 +681,7 @@ class Ostatus_profile extends Memcached_DataObject common_log(LOG_DEBUG, "Original reply recipients: " . implode(', ', $attention_uris)); $groups = array(); $replies = array(); - foreach ($attention_uris as $recipient) { + foreach (array_unique($attention_uris) as $recipient) { // Is the recipient a local user? $user = User::staticGet('uri', $recipient); if ($user) { @@ -869,12 +875,12 @@ class Ostatus_profile extends Memcached_DataObject $feeduri = $discover->discoverFromFeedURL($feed_url); $hints['feedurl'] = $feeduri; - $huburi = $discover->getAtomLink('hub'); + $huburi = $discover->getHubLink(); $hints['hub'] = $huburi; $salmonuri = $discover->getAtomLink(Salmon::NS_REPLIES); $hints['salmon'] = $salmonuri; - if (!$huburi) { + if (!$huburi && !common_config('feedsub', 'fallback_hub')) { // We can only deal with folks with a PuSH hub throw new FeedSubNoHubException(); } @@ -1270,10 +1276,10 @@ class Ostatus_profile extends Memcached_DataObject $discover = new FeedDiscovery(); $discover->discoverFromFeedURL($hints['feedurl']); } - $huburi = $discover->getAtomLink('hub'); + $huburi = $discover->getHubLink(); } - if (!$huburi) { + if (!$huburi && !common_config('feedsub', 'fallback_hub')) { // We can only deal with folks with a PuSH hub throw new FeedSubNoHubException(); } diff --git a/plugins/OStatus/lib/feeddiscovery.php b/plugins/OStatus/lib/feeddiscovery.php index 4ac2438326..a55399d7c8 100644 --- a/plugins/OStatus/lib/feeddiscovery.php +++ b/plugins/OStatus/lib/feeddiscovery.php @@ -87,6 +87,16 @@ class FeedDiscovery return ActivityUtils::getLink($this->root, $rel, $type); } + /** + * Get the referenced PuSH hub link from an Atom feed. + * + * @return mixed string or false + */ + public function getHubLink() + { + return $this->getAtomLink('hub'); + } + /** * @param string $url * @param bool $htmlOk pass false here if you don't want to follow web pages. diff --git a/plugins/OStatus/scripts/update-profile.php b/plugins/OStatus/scripts/update-profile.php index d06de4f903..64afa0f356 100644 --- a/plugins/OStatus/scripts/update-profile.php +++ b/plugins/OStatus/scripts/update-profile.php @@ -55,7 +55,7 @@ print "Re-running feed discovery for profile URL $oprofile->uri\n"; // @fixme will bork where the URI isn't the profile URL for now $discover = new FeedDiscovery(); $feedurl = $discover->discoverFromURL($oprofile->uri); -$huburi = $discover->getAtomLink('hub'); +$huburi = $discover->getHubLink(); $salmonuri = $discover->getAtomLink(Salmon::NS_REPLIES); print " Feed URL: $feedurl\n"; diff --git a/plugins/OStatus/tests/FeedDiscoveryTest.php b/plugins/OStatus/tests/FeedDiscoveryTest.php index 1c52497012..0e6354a867 100644 --- a/plugins/OStatus/tests/FeedDiscoveryTest.php +++ b/plugins/OStatus/tests/FeedDiscoveryTest.php @@ -10,7 +10,7 @@ define('STATUSNET', true); define('LACONICA', true); require_once INSTALLDIR . '/lib/common.php'; -require_once INSTALLDIR . '/plugins/FeedSub/feedsub.php'; +require_once INSTALLDIR . '/plugins/OStatus/lib/feeddiscovery.php'; class FeedDiscoveryTest extends PHPUnit_Framework_TestCase { diff --git a/plugins/Sitemap/sitemapaction.php b/plugins/Sitemap/sitemapaction.php index 45edfccc51..73b9248a38 100644 --- a/plugins/Sitemap/sitemapaction.php +++ b/plugins/Sitemap/sitemapaction.php @@ -53,6 +53,8 @@ class SitemapAction extends Action function handle($args) { + parent::handle($args); + header('Content-Type: text/xml; charset=UTF-8'); $this->startXML(); @@ -67,6 +69,27 @@ class SitemapAction extends Action $this->endXML(); } + function lastModified() + { + $y = $this->trimmed('year'); + + $m = $this->trimmed('month'); + $d = $this->trimmed('day'); + + $y += 0; + $m += 0; + $d += 0; + + $begdate = strtotime("$y-$m-$d 00:00:00"); + $enddate = $begdate + (24 * 60 * 60); + + if ($enddate < time()) { + return $enddate; + } else { + return null; + } + } + function showUrl($url, $lastMod=null, $changeFreq=null, $priority=null) { $this->elementStart('url'); diff --git a/plugins/SubMirror/SubMirrorPlugin.php b/plugins/SubMirror/SubMirrorPlugin.php index 7289e77938..80c6c5a88f 100644 --- a/plugins/SubMirror/SubMirrorPlugin.php +++ b/plugins/SubMirror/SubMirrorPlugin.php @@ -120,6 +120,9 @@ class SubMirrorPlugin extends Plugin { $schema = Schema::get(); $schema->ensureTable('submirror', SubMirror::schemaDef()); + + // @hack until key definition support is merged + SubMirror::fixIndexes($schema); return true; } diff --git a/plugins/SubMirror/classes/SubMirror.php b/plugins/SubMirror/classes/SubMirror.php index 4e7e005db2..bd8fc80a5f 100644 --- a/plugins/SubMirror/classes/SubMirror.php +++ b/plugins/SubMirror/classes/SubMirror.php @@ -76,6 +76,22 @@ class SubMirror extends Memcached_DataObject null, false)); } + /** + * Temporary hack to set up the compound index, since we can't do + * it yet through regular Schema interface. (Coming for 1.0...) + * + * @param Schema $schema + * @return void + */ + static function fixIndexes($schema) + { + try { + $schema->createIndex('submirror', array('subscribed', 'subscriber')); + } catch (Exception $e) { + common_log(LOG_ERR, __METHOD__ . ': ' . $e->getMessage()); + } + } + /** * return key definitions for DB_DataObject * diff --git a/plugins/TinyMCE/TinyMCEPlugin.php b/plugins/TinyMCE/TinyMCEPlugin.php new file mode 100644 index 0000000000..ca16f60591 --- /dev/null +++ b/plugins/TinyMCE/TinyMCEPlugin.php @@ -0,0 +1,325 @@ +. + * + * @category WYSIWYG + * @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); +} + +/** + * Use TinyMCE library to allow rich text editing in the browser + * + * Converts the notice form in browser to a rich-text editor. + * + * @category WYSIWYG + * @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 TinyMCEPlugin extends Plugin +{ + + var $html; + + function onEndShowScripts($action) + { + if (common_logged_in ()) { + $action->script(common_path('plugins/TinyMCE/js/jquery.tinymce.js')); + $action->inlineScript($this->_inlineScript()); + } + + return true; + } + + function onEndShowStyles($action) + { + $action->style('span#notice_data-text_container, span#notice_data-text_parent { float: left }'); + return true; + } + + function onPluginVersion(&$versions) + { + $versions[] = array('name' => 'TinyMCE', + 'version' => STATUSNET_VERSION, + 'author' => 'Evan Prodromou', + 'homepage' => 'http://status.net/wiki/Plugin:TinyMCE', + 'rawdescription' => + _m('Use TinyMCE library to allow rich text editing in the browser')); + return true; + } + + /** + * Sanitize HTML input and strip out potentially dangerous bits. + * + * @param string $raw HTML + * @return string HTML + */ + private function sanitizeHtml($raw) + { + require_once INSTALLDIR . '/extlib/htmLawed/htmLawed.php'; + + $config = array('safe' => 1, + 'deny_attribute' => 'id,style,on*'); + + return htmLawed($raw, $config); + } + + /** + * Strip HTML to plaintext string + * + * @param string $html HTML + * @return string plaintext, single line + */ + private function stripHtml($html) + { + return str_replace("\n", " ", html_entity_decode(strip_tags($html), ENT_QUOTES, 'UTF-8')); + } + + /** + * Hook for new-notice form processing to take our HTML goodies; + * won't affect API posting etc. + * + * @param NewNoticeAction $action + * @param User $user + * @param string $content + * @param array $options + * @return boolean hook return + */ + function onStartSaveNewNoticeWeb($action, $user, &$content, &$options) + { + if ($action->arg('richedit')) { + $html = $this->sanitizeHtml($content); + $options['rendered'] = $html; + $content = $this->stripHtml($html); + } + return true; + } + + /** + * Hook for new-notice form processing to process file upload appending... + * + * @param NewNoticeAction $action + * @param MediaFile $media + * @param string $content + * @param array $options + * @return boolean hook return + */ + function onStartSaveNewNoticeAppendAttachment($action, $media, &$content, &$options) + { + if ($action->arg('richedit')) { + // See if we've got a placeholder inline image; if so, fill it! + $dom = new DOMDocument(); + + if ($dom->loadHTML($options['rendered'])) { + $imgs = $dom->getElementsByTagName('img'); + foreach ($imgs as $img) { + if (preg_match('/(^| )placeholder( |$)/', $img->getAttribute('class'))) { + // Create a link to the attachment page... + $this->formatAttachment($img, $media); + } + } + $options['rendered'] = $this->saveHtml($dom); + } + + // The regular code will append the short URL to the plaintext content. + // Carry on and let it through... + } + return true; + } + + /** + * Format the attachment placeholder img with the final version. + * + * @param DOMElement $img + * @param MediaFile $media + */ + private function formatAttachment($img, $media) + { + $parent = $img->parentNode; + $dom = $img->ownerDocument; + + $link = $dom->createElement('a'); + $link->setAttribute('href', $media->fileurl); + $link->setAttribute('title', File::url($media->filename)); + + if ($this->isEmbeddable($media)) { + // Fix the the attributes and wrap the link around it... + $this->insertImage($img, $media); + $parent->replaceChild($link, $img); //it dies in here?! + $link->appendChild($img); + } else { + // Not an image? Replace it with a text link. + $link->setAttribute('rel', 'external'); + $link->setAttribute('class', 'attachment'); + $link->setAttribute('id', 'attachment-' . $media->fileRecord->id); + $text = $dom->createTextNode($media->shortUrl()); + $link->appendChild($text); + $parent->replaceChild($link, $img); + } + } + + /** + * Is this media file a type we can display inline? + * + * @param MediaFile $media + * @return boolean + */ + private function isEmbeddable($media) + { + $showable = array('image/png', + 'image/gif', + 'image/jpeg'); + return in_array($media->mimetype, $showable); + } + + /** + * Rewrite and resize a placeholder image element to match the uploaded + * file. If the holder is smaller than the file, the file is scaled to fit + * with correct aspect ratio (but will be loaded at full resolution). + * + * @param DOMElement $img + * @param MediaFile $media + */ + private function insertImage($img, $media) + { + $img->setAttribute('src', $media->fileRecord->url); + + $holderWidth = intval($img->getAttribute('width')); + $holderHeight = intval($img->getAttribute('height')); + + $path = File::path($media->filename); + $imgInfo = getimagesize($path); + + if ($imgInfo) { + $origWidth = $imgInfo[0]; + $origHeight = $imgInfo[1]; + + list($width, $height) = $this->sizeBox( + $origWidth, $origHeight, + $holderWidth, $holderHeight); + + $img->setAttribute('width', $width); + $img->setAttribute('height', $height); + } + } + + /** + * + * @param int $origWidth + * @param int $origHeight + * @param int $holderWidth + * @param int $holderHeight + * @return array($width, $height) + */ + private function sizeBox($origWidth, $origHeight, $holderWidth, $holderHeight) + { + $holderAspect = $holderWidth / $holderHeight; + $origAspect = $origWidth / $origHeight; + if ($origAspect >= 1.0) { + // wide image + if ($origWidth > $holderWidth) { + return array($holderWidth, intval($holderWidth / $origAspect)); + } else { + return array($origWidth, $origHeight); + } + } else { + if ($origHeight > $holderHeight) { + return array(intval($holderWidth * $origAspect), $holderHeight); + } else { + return array($origWidth, $origHeight); + } + } + } + + private function saveHtml($dom) + { + $html = $dom->saveHTML(); + // hack to remove surrounding crap added to the dom + // all we wanted was a fragment + $stripped = preg_replace('/^.*]*>(.*)<\/body.*$/is', '$1', $html); + return $stripped; + } + + function _inlineScript() + { + $path = common_path('plugins/TinyMCE/js/tiny_mce.js'); + $placeholder = common_path('plugins/TinyMCE/icons/placeholder.png'); + + // Note: the normal on-submit triggering to save data from + // the HTML editor into the textarea doesn't play well with + // our AJAX form submission. Manually moving it to trigger + // on our send button click. + $scr = <<'); + + $('#notice_action-submit').click(function() { + tinymce.triggerSave(); + }); + + var origCounter = SN.U.CharacterCount; + SN.U.CharacterCount = function(form) { + var text = $(ed.getDoc()).text(); + return text.length; + }; + ed.onKeyUp.add(function (ed, e) { + SN.U.Counter(noticeForm); + }); + + $('#'+SN.C.S.NoticeDataAttach).change(function() { + var img = ''; + var html = tinyMCE.activeEditor.getContent(); + ed.setContent(html + img); + }); + } + }); + }); +END_OF_SCRIPT; + + return $scr; + } + +} diff --git a/plugins/TinyMCE/icons/placeholder.png b/plugins/TinyMCE/icons/placeholder.png new file mode 100644 index 0000000000..911f257d50 Binary files /dev/null and b/plugins/TinyMCE/icons/placeholder.png differ diff --git a/plugins/TinyMCE/icons/placeholder.xcf b/plugins/TinyMCE/icons/placeholder.xcf new file mode 100644 index 0000000000..e05f8a9c98 Binary files /dev/null and b/plugins/TinyMCE/icons/placeholder.xcf differ diff --git a/plugins/TinyMCE/js/jquery.tinymce.js b/plugins/TinyMCE/js/jquery.tinymce.js new file mode 100644 index 0000000000..4866c2a06b --- /dev/null +++ b/plugins/TinyMCE/js/jquery.tinymce.js @@ -0,0 +1 @@ +(function(b){var e,d,a=[],c=window;b.fn.tinymce=function(j){var p=this,g,k,h,m,i,l="",n="";if(!p.length){return p}if(!j){return tinyMCE.get(p[0].id)}function o(){var r=[],q=0;if(f){f();f=null}p.each(function(t,u){var s,w=u.id,v=j.oninit;if(!w){u.id=w=tinymce.DOM.uniqueId()}s=new tinymce.Editor(w,j);r.push(s);if(v){s.onInit.add(function(){var x,y=v;if(++q==r.length){if(tinymce.is(y,"string")){x=(y.indexOf(".")===-1)?null:tinymce.resolve(y.replace(/\.\w+$/,""));y=tinymce.resolve(y)}y.apply(x||tinymce,r)}})}});b.each(r,function(t,s){s.render()})}if(!c.tinymce&&!d&&(g=j.script_url)){d=1;h=g.substring(0,g.lastIndexOf("/"));if(/_(src|dev)\.js/g.test(g)){n="_src"}m=g.lastIndexOf("?");if(m!=-1){l=g.substring(m+1)}c.tinyMCEPreInit=c.tinyMCEPreInit||{base:h,suffix:n,query:l};if(g.indexOf("gzip")!=-1){i=j.language||"en";g=g+(/\?/.test(g)?"&":"?")+"js=true&core=true&suffix="+escape(n)+"&themes="+escape(j.theme)+"&plugins="+escape(j.plugins)+"&languages="+i;if(!c.tinyMCE_GZ){tinyMCE_GZ={start:function(){tinymce.suffix=n;function q(r){tinymce.ScriptLoader.markDone(tinyMCE.baseURI.toAbsolute(r))}q("langs/"+i+".js");q("themes/"+j.theme+"/editor_template"+n+".js");q("themes/"+j.theme+"/langs/"+i+".js");b.each(j.plugins.split(","),function(s,r){if(r){q("plugins/"+r+"/editor_plugin"+n+".js");q("plugins/"+r+"/langs/"+i+".js")}})},end:function(){}}}}b.ajax({type:"GET",url:g,dataType:"script",cache:true,success:function(){tinymce.dom.Event.domLoaded=1;d=2;if(j.script_loaded){j.script_loaded()}o();b.each(a,function(q,r){r()})}})}else{if(d===1){a.push(o)}else{o()}}return p};b.extend(b.expr[":"],{tinymce:function(g){return g.id&&!!tinyMCE.get(g.id)}});function f(){function i(l){if(l==="remove"){this.each(function(n,o){var m=h(o);if(m){m.remove()}})}this.find("span.mceEditor,div.mceEditor").each(function(n,o){var m=tinyMCE.get(o.id.replace(/_parent$/,""));if(m){m.remove()}})}function k(n){var m=this,l;if(n!==e){i.call(m);m.each(function(p,q){var o;if(o=tinyMCE.get(q.id)){o.setContent(n)}})}else{if(m.length>0){if(l=tinyMCE.get(m[0].id)){return l.getContent()}}}}function h(m){var l=null;(m)&&(m.id)&&(c.tinymce)&&(l=tinyMCE.get(m.id));return l}function g(l){return !!((l)&&(l.length)&&(c.tinymce)&&(l.is(":tinymce")))}var j={};b.each(["text","html","val"],function(n,l){var o=j[l]=b.fn[l],m=(l==="text");b.fn[l]=function(s){var p=this;if(!g(p)){return o.apply(p,arguments)}if(s!==e){k.call(p.filter(":tinymce"),s);o.apply(p.not(":tinymce"),arguments);return p}else{var r="";var q=arguments;(m?p:p.eq(0)).each(function(u,v){var t=h(v);r+=t?(m?t.getContent().replace(/<(?:"[^"]*"|'[^']*'|[^'">])*>/g,""):t.getContent()):o.apply(b(v),q)});return r}}});b.each(["append","prepend"],function(n,m){var o=j[m]=b.fn[m],l=(m==="prepend");b.fn[m]=function(q){var p=this;if(!g(p)){return o.apply(p,arguments)}if(q!==e){p.filter(":tinymce").each(function(s,t){var r=h(t);r&&r.setContent(l?q+r.getContent():r.getContent()+q)});o.apply(p.not(":tinymce"),arguments);return p}}});b.each(["remove","replaceWith","replaceAll","empty"],function(m,l){var n=j[l]=b.fn[l];b.fn[l]=function(){i.call(this,l);return n.apply(this,arguments)}});j.attr=b.fn.attr;b.fn.attr=function(n,q,o){var m=this;if((!n)||(n!=="value")||(!g(m))){return j.attr.call(m,n,q,o)}if(q!==e){k.call(m.filter(":tinymce"),q);j.attr.call(m.not(":tinymce"),n,q,o);return m}else{var p=m[0],l=h(p);return l?l.getContent():j.attr.call(b(p),n,q,o)}}}})(jQuery); \ No newline at end of file diff --git a/plugins/TinyMCE/js/langs/en.js b/plugins/TinyMCE/js/langs/en.js new file mode 100644 index 0000000000..ea4a1b0e14 --- /dev/null +++ b/plugins/TinyMCE/js/langs/en.js @@ -0,0 +1,170 @@ +tinyMCE.addI18n({en:{ +common:{ +edit_confirm:"Do you want to use the WYSIWYG mode for this textarea?", +apply:"Apply", +insert:"Insert", +update:"Update", +cancel:"Cancel", +close:"Close", +browse:"Browse", +class_name:"Class", +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.", +more_colors:"More colors" +}, +contextmenu:{ +align:"Alignment", +left:"Left", +center:"Center", +right:"Right", +full:"Full" +}, +insertdatetime:{ +date_fmt:"%Y-%m-%d", +time_fmt:"%H:%M:%S", +insertdate_desc:"Insert date", +inserttime_desc:"Insert time", +months_long:"January,February,March,April,May,June,July,August,September,October,November,December", +months_short:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", +day_long:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday", +day_short:"Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun" +}, +print:{ +print_desc:"Print" +}, +preview:{ +preview_desc:"Preview" +}, +directionality:{ +ltr_desc:"Direction left to right", +rtl_desc:"Direction right to left" +}, +layer:{ +insertlayer_desc:"Insert new layer", +forward_desc:"Move forward", +backward_desc:"Move backward", +absolute_desc:"Toggle absolute positioning", +content:"New layer..." +}, +save:{ +save_desc:"Save", +cancel_desc:"Cancel all changes" +}, +nonbreaking:{ +nonbreaking_desc:"Insert non-breaking space character" +}, +iespell:{ +iespell_desc:"Run spell checking", +download:"ieSpell not detected. Do you want to install it now?" +}, +advhr:{ +advhr_desc:"Horizontal rule" +}, +emotions:{ +emotions_desc:"Emotions" +}, +searchreplace:{ +search_desc:"Find", +replace_desc:"Find/Replace" +}, +advimage:{ +image_desc:"Insert/edit image" +}, +advlink:{ +link_desc:"Insert/edit link" +}, +xhtmlxtras:{ +cite_desc:"Citation", +abbr_desc:"Abbreviation", +acronym_desc:"Acronym", +del_desc:"Deletion", +ins_desc:"Insertion", +attribs_desc:"Insert/Edit Attributes" +}, +style:{ +desc:"Edit CSS Style" +}, +paste:{ +paste_text_desc:"Paste as Plain Text", +paste_word_desc:"Paste from Word", +selectall_desc:"Select All", +plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.", +plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode." +}, +paste_dlg:{ +text_title:"Use CTRL+V on your keyboard to paste the text into the window.", +text_linebreaks:"Keep linebreaks", +word_title:"Use CTRL+V on your keyboard to paste the text into the window." +}, +table:{ +desc:"Inserts a new table", +row_before_desc:"Insert row before", +row_after_desc:"Insert row after", +delete_row_desc:"Delete row", +col_before_desc:"Insert column before", +col_after_desc:"Insert column after", +delete_col_desc:"Remove column", +split_cells_desc:"Split merged table cells", +merge_cells_desc:"Merge table cells", +row_desc:"Table row properties", +cell_desc:"Table cell properties", +props_desc:"Table properties", +paste_row_before_desc:"Paste table row before", +paste_row_after_desc:"Paste table row after", +cut_row_desc:"Cut table row", +copy_row_desc:"Copy table row", +del:"Delete table", +row:"Row", +col:"Column", +cell:"Cell" +}, +autosave:{ +unload_msg:"The changes you made will be lost if you navigate away from this page.", +restore_content:"Restore auto-saved content.", +warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?." +}, +fullscreen:{ +desc:"Toggle fullscreen mode" +}, +media:{ +desc:"Insert / edit embedded media", +edit:"Edit embedded media" +}, +fullpage:{ +desc:"Document properties" +}, +template:{ +desc:"Insert predefined template content" +}, +visualchars:{ +desc:"Visual control characters on/off." +}, +spellchecker:{ +desc:"Toggle spellchecker", +menu:"Spellchecker settings", +ignore_word:"Ignore word", +ignore_words:"Ignore all", +langs:"Languages", +wait:"Please wait...", +sug:"Suggestions", +no_sug:"No suggestions", +no_mpell:"No misspellings found." +}, +pagebreak:{ +desc:"Insert page break." +}, +advlist:{ +types:"Types", +def:"Default", +lower_alpha:"Lower alpha", +lower_greek:"Lower greek", +lower_roman:"Lower roman", +upper_alpha:"Upper alpha", +upper_roman:"Upper roman", +circle:"Circle", +disc:"Disc", +square:"Square" +}}}); \ No newline at end of file diff --git a/plugins/TinyMCE/js/license.txt b/plugins/TinyMCE/js/license.txt new file mode 100644 index 0000000000..60d6d4c8f5 --- /dev/null +++ b/plugins/TinyMCE/js/license.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/plugins/TinyMCE/js/plugins/advhr/css/advhr.css b/plugins/TinyMCE/js/plugins/advhr/css/advhr.css new file mode 100644 index 0000000000..0e22834985 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/advhr/css/advhr.css @@ -0,0 +1,5 @@ +input.radio {border:1px none #000; background:transparent; vertical-align:middle;} +.panel_wrapper div.current {height:80px;} +#width {width:50px; vertical-align:middle;} +#width2 {width:50px; vertical-align:middle;} +#size {width:100px;} diff --git a/plugins/TinyMCE/js/plugins/advhr/editor_plugin.js b/plugins/TinyMCE/js/plugins/advhr/editor_plugin.js new file mode 100644 index 0000000000..4d3b062dee --- /dev/null +++ b/plugins/TinyMCE/js/plugins/advhr/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.AdvancedHRPlugin",{init:function(a,b){a.addCommand("mceAdvancedHr",function(){a.windowManager.open({file:b+"/rule.htm",width:250+parseInt(a.getLang("advhr.delta_width",0)),height:160+parseInt(a.getLang("advhr.delta_height",0)),inline:1},{plugin_url:b})});a.addButton("advhr",{title:"advhr.advhr_desc",cmd:"mceAdvancedHr"});a.onNodeChange.add(function(d,c,e){c.setActive("advhr",e.nodeName=="HR")});a.onClick.add(function(c,d){d=d.target;if(d.nodeName==="HR"){c.selection.select(d)}})},getInfo:function(){return{longname:"Advanced HR",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advhr",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advhr",tinymce.plugins.AdvancedHRPlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/advhr/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/advhr/editor_plugin_src.js new file mode 100644 index 0000000000..0c652d3303 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/advhr/editor_plugin_src.js @@ -0,0 +1,57 @@ +/** + * 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.AdvancedHRPlugin', { + init : function(ed, url) { + // Register commands + ed.addCommand('mceAdvancedHr', function() { + ed.windowManager.open({ + file : url + '/rule.htm', + width : 250 + parseInt(ed.getLang('advhr.delta_width', 0)), + height : 160 + parseInt(ed.getLang('advhr.delta_height', 0)), + inline : 1 + }, { + plugin_url : url + }); + }); + + // Register buttons + ed.addButton('advhr', { + title : 'advhr.advhr_desc', + cmd : 'mceAdvancedHr' + }); + + ed.onNodeChange.add(function(ed, cm, n) { + cm.setActive('advhr', n.nodeName == 'HR'); + }); + + ed.onClick.add(function(ed, e) { + e = e.target; + + if (e.nodeName === 'HR') + ed.selection.select(e); + }); + }, + + getInfo : function() { + return { + longname : 'Advanced HR', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advhr', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('advhr', tinymce.plugins.AdvancedHRPlugin); +})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/advhr/js/rule.js b/plugins/TinyMCE/js/plugins/advhr/js/rule.js new file mode 100644 index 0000000000..b6cbd66c75 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/advhr/js/rule.js @@ -0,0 +1,43 @@ +var AdvHRDialog = { + init : function(ed) { + var dom = ed.dom, f = document.forms[0], n = ed.selection.getNode(), w; + + w = dom.getAttrib(n, 'width'); + f.width.value = w ? parseInt(w) : (dom.getStyle('width') || ''); + f.size.value = dom.getAttrib(n, 'size') || parseInt(dom.getStyle('height')) || ''; + f.noshade.checked = !!dom.getAttrib(n, 'noshade') || !!dom.getStyle('border-width'); + selectByValue(f, 'width2', w.indexOf('%') != -1 ? '%' : 'px'); + }, + + update : function() { + var ed = tinyMCEPopup.editor, h, f = document.forms[0], st = ''; + + h = ' + + + {#advhr.advhr_desc} + + + + + + + +
+ + +
+
+ + + + + + + + + + + + + +
+ + +
+
+
+ +
+ + +
+
+ + diff --git a/plugins/TinyMCE/js/plugins/advimage/css/advimage.css b/plugins/TinyMCE/js/plugins/advimage/css/advimage.css new file mode 100644 index 0000000000..0a6251a696 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/advimage/css/advimage.css @@ -0,0 +1,13 @@ +#src_list, #over_list, #out_list {width:280px;} +.mceActionPanel {margin-top:7px;} +.alignPreview {border:1px solid #000; width:140px; height:140px; overflow:hidden; padding:5px;} +.checkbox {border:0;} +.panel_wrapper div.current {height:305px;} +#prev {margin:0; border:1px solid #000; width:428px; height:150px; overflow:auto;} +#align, #classlist {width:150px;} +#width, #height {vertical-align:middle; width:50px; text-align:center;} +#vspace, #hspace, #border {vertical-align:middle; width:30px; text-align:center;} +#class_list {width:180px;} +input {width: 280px;} +#constrain, #onmousemovecheck {width:auto;} +#id, #dir, #lang, #usemap, #longdesc {width:200px;} diff --git a/plugins/TinyMCE/js/plugins/advimage/editor_plugin.js b/plugins/TinyMCE/js/plugins/advimage/editor_plugin.js new file mode 100644 index 0000000000..4c7a9c3a88 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/advimage/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.AdvancedImagePlugin",{init:function(a,b){a.addCommand("mceAdvImage",function(){if(a.dom.getAttrib(a.selection.getNode(),"class").indexOf("mceItem")!=-1){return}a.windowManager.open({file:b+"/image.htm",width:480+parseInt(a.getLang("advimage.delta_width",0)),height:385+parseInt(a.getLang("advimage.delta_height",0)),inline:1},{plugin_url:b})});a.addButton("image",{title:"advimage.image_desc",cmd:"mceAdvImage"})},getInfo:function(){return{longname:"Advanced image",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advimage",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advimage",tinymce.plugins.AdvancedImagePlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/advimage/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/advimage/editor_plugin_src.js new file mode 100644 index 0000000000..2625dd2131 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/advimage/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.AdvancedImagePlugin', { + init : function(ed, url) { + // Register commands + ed.addCommand('mceAdvImage', function() { + // Internal image object like a flash placeholder + if (ed.dom.getAttrib(ed.selection.getNode(), 'class').indexOf('mceItem') != -1) + return; + + ed.windowManager.open({ + file : url + '/image.htm', + width : 480 + parseInt(ed.getLang('advimage.delta_width', 0)), + height : 385 + parseInt(ed.getLang('advimage.delta_height', 0)), + inline : 1 + }, { + plugin_url : url + }); + }); + + // Register buttons + ed.addButton('image', { + title : 'advimage.image_desc', + cmd : 'mceAdvImage' + }); + }, + + getInfo : function() { + return { + longname : 'Advanced image', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advimage', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('advimage', tinymce.plugins.AdvancedImagePlugin); +})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/advimage/image.htm b/plugins/TinyMCE/js/plugins/advimage/image.htm new file mode 100644 index 0000000000..79cff3f19f --- /dev/null +++ b/plugins/TinyMCE/js/plugins/advimage/image.htm @@ -0,0 +1,232 @@ + + + + {#advimage_dlg.dialog_title} + + + + + + + + + +
+ + +
+
+
+ {#advimage_dlg.general} + + + + + + + + + + + + + + + + + + +
+ + + + +
 
+
+ +
+ {#advimage_dlg.preview} + +
+
+ +
+
+ {#advimage_dlg.tab_appearance} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ {#advimage_dlg.example_img} + Lorem ipsum, Dolor sit amet, consectetuer adipiscing loreum ipsum edipiscing elit, sed diam + nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.Loreum ipsum + edipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam + erat volutpat. +
+
+ x + px +
  + + + + +
+
+
+
+ +
+
+ {#advimage_dlg.swap_image} + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
 
+ + + + +
 
+
+ +
+ {#advimage_dlg.misc} + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +
+ + + + +
 
+
+
+
+ +
+ + +
+
+ + diff --git a/plugins/TinyMCE/js/plugins/advimage/img/sample.gif b/plugins/TinyMCE/js/plugins/advimage/img/sample.gif new file mode 100644 index 0000000000..53bf6890b5 Binary files /dev/null and b/plugins/TinyMCE/js/plugins/advimage/img/sample.gif differ diff --git a/plugins/TinyMCE/js/plugins/advimage/js/image.js b/plugins/TinyMCE/js/plugins/advimage/js/image.js new file mode 100644 index 0000000000..3bda86a2d3 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/advimage/js/image.js @@ -0,0 +1,443 @@ +var ImageDialog = { + preInit : function() { + var url; + + tinyMCEPopup.requireLangPack(); + + if (url = tinyMCEPopup.getParam("external_image_list_url")) + document.write(''); + }, + + init : function(ed) { + var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, dom = ed.dom, n = ed.selection.getNode(); + + tinyMCEPopup.resizeToInnerSize(); + this.fillClassList('class_list'); + this.fillFileList('src_list', 'tinyMCEImageList'); + this.fillFileList('over_list', 'tinyMCEImageList'); + this.fillFileList('out_list', 'tinyMCEImageList'); + TinyMCE_EditableSelects.init(); + + if (n.nodeName == 'IMG') { + nl.src.value = dom.getAttrib(n, 'src'); + nl.width.value = dom.getAttrib(n, 'width'); + nl.height.value = dom.getAttrib(n, 'height'); + nl.alt.value = dom.getAttrib(n, 'alt'); + nl.title.value = dom.getAttrib(n, 'title'); + nl.vspace.value = this.getAttrib(n, 'vspace'); + nl.hspace.value = this.getAttrib(n, 'hspace'); + nl.border.value = this.getAttrib(n, 'border'); + selectByValue(f, 'align', this.getAttrib(n, 'align')); + selectByValue(f, 'class_list', dom.getAttrib(n, 'class'), true, true); + nl.style.value = dom.getAttrib(n, 'style'); + nl.id.value = dom.getAttrib(n, 'id'); + nl.dir.value = dom.getAttrib(n, 'dir'); + nl.lang.value = dom.getAttrib(n, 'lang'); + nl.usemap.value = dom.getAttrib(n, 'usemap'); + nl.longdesc.value = dom.getAttrib(n, 'longdesc'); + nl.insert.value = ed.getLang('update'); + + if (/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/.test(dom.getAttrib(n, 'onmouseover'))) + nl.onmouseoversrc.value = dom.getAttrib(n, 'onmouseover').replace(/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/, '$1'); + + if (/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/.test(dom.getAttrib(n, 'onmouseout'))) + nl.onmouseoutsrc.value = dom.getAttrib(n, 'onmouseout').replace(/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/, '$1'); + + if (ed.settings.inline_styles) { + // Move attribs to styles + if (dom.getAttrib(n, 'align')) + this.updateStyle('align'); + + if (dom.getAttrib(n, 'hspace')) + this.updateStyle('hspace'); + + if (dom.getAttrib(n, 'border')) + this.updateStyle('border'); + + if (dom.getAttrib(n, 'vspace')) + this.updateStyle('vspace'); + } + } + + // Setup browse button + document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image'); + if (isVisible('srcbrowser')) + document.getElementById('src').style.width = '260px'; + + // Setup browse button + document.getElementById('onmouseoversrccontainer').innerHTML = getBrowserHTML('overbrowser','onmouseoversrc','image','theme_advanced_image'); + if (isVisible('overbrowser')) + document.getElementById('onmouseoversrc').style.width = '260px'; + + // Setup browse button + document.getElementById('onmouseoutsrccontainer').innerHTML = getBrowserHTML('outbrowser','onmouseoutsrc','image','theme_advanced_image'); + if (isVisible('outbrowser')) + document.getElementById('onmouseoutsrc').style.width = '260px'; + + // If option enabled default contrain proportions to checked + if (ed.getParam("advimage_constrain_proportions", true)) + f.constrain.checked = true; + + // Check swap image if valid data + if (nl.onmouseoversrc.value || nl.onmouseoutsrc.value) + this.setSwapImage(true); + else + this.setSwapImage(false); + + this.changeAppearance(); + this.showPreviewImage(nl.src.value, 1); + }, + + insert : function(file, title) { + var ed = tinyMCEPopup.editor, t = this, f = document.forms[0]; + + if (f.src.value === '') { + if (ed.selection.getNode().nodeName == 'IMG') { + ed.dom.remove(ed.selection.getNode()); + ed.execCommand('mceRepaint'); + } + + tinyMCEPopup.close(); + return; + } + + if (tinyMCEPopup.getParam("accessibility_warnings", 1)) { + if (!f.alt.value) { + tinyMCEPopup.confirm(tinyMCEPopup.getLang('advimage_dlg.missing_alt'), function(s) { + if (s) + t.insertAndClose(); + }); + + return; + } + } + + t.insertAndClose(); + }, + + insertAndClose : function() { + var ed = tinyMCEPopup.editor, f = document.forms[0], nl = f.elements, v, args = {}, el; + + tinyMCEPopup.restoreSelection(); + + // Fixes crash in Safari + if (tinymce.isWebKit) + ed.getWin().focus(); + + if (!ed.settings.inline_styles) { + args = { + vspace : nl.vspace.value, + hspace : nl.hspace.value, + border : nl.border.value, + align : getSelectValue(f, 'align') + }; + } else { + // Remove deprecated values + args = { + vspace : '', + hspace : '', + border : '', + align : '' + }; + } + + tinymce.extend(args, { + src : nl.src.value, + width : nl.width.value, + height : nl.height.value, + alt : nl.alt.value, + title : nl.title.value, + 'class' : getSelectValue(f, 'class_list'), + style : nl.style.value, + id : nl.id.value, + dir : nl.dir.value, + lang : nl.lang.value, + usemap : nl.usemap.value, + longdesc : nl.longdesc.value + }); + + args.onmouseover = args.onmouseout = ''; + + if (f.onmousemovecheck.checked) { + if (nl.onmouseoversrc.value) + args.onmouseover = "this.src='" + nl.onmouseoversrc.value + "';"; + + if (nl.onmouseoutsrc.value) + args.onmouseout = "this.src='" + nl.onmouseoutsrc.value + "';"; + } + + el = ed.selection.getNode(); + + if (el && el.nodeName == 'IMG') { + ed.dom.setAttribs(el, args); + } else { + ed.execCommand('mceInsertContent', false, '', {skip_undo : 1}); + ed.dom.setAttribs('__mce_tmp', args); + ed.dom.setAttrib('__mce_tmp', 'id', ''); + ed.undoManager.add(); + } + + tinyMCEPopup.close(); + }, + + getAttrib : function(e, at) { + var ed = tinyMCEPopup.editor, dom = ed.dom, v, v2; + + if (ed.settings.inline_styles) { + switch (at) { + case 'align': + if (v = dom.getStyle(e, 'float')) + return v; + + if (v = dom.getStyle(e, 'vertical-align')) + return v; + + break; + + case 'hspace': + v = dom.getStyle(e, 'margin-left') + v2 = dom.getStyle(e, 'margin-right'); + + if (v && v == v2) + return parseInt(v.replace(/[^0-9]/g, '')); + + break; + + case 'vspace': + v = dom.getStyle(e, 'margin-top') + v2 = dom.getStyle(e, 'margin-bottom'); + if (v && v == v2) + return parseInt(v.replace(/[^0-9]/g, '')); + + break; + + case 'border': + v = 0; + + tinymce.each(['top', 'right', 'bottom', 'left'], function(sv) { + sv = dom.getStyle(e, 'border-' + sv + '-width'); + + // False or not the same as prev + if (!sv || (sv != v && v !== 0)) { + v = 0; + return false; + } + + if (sv) + v = sv; + }); + + if (v) + return parseInt(v.replace(/[^0-9]/g, '')); + + break; + } + } + + if (v = dom.getAttrib(e, at)) + return v; + + return ''; + }, + + setSwapImage : function(st) { + var f = document.forms[0]; + + f.onmousemovecheck.checked = st; + setBrowserDisabled('overbrowser', !st); + setBrowserDisabled('outbrowser', !st); + + if (f.over_list) + f.over_list.disabled = !st; + + if (f.out_list) + f.out_list.disabled = !st; + + f.onmouseoversrc.disabled = !st; + f.onmouseoutsrc.disabled = !st; + }, + + fillClassList : function(id) { + var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; + + if (v = tinyMCEPopup.getParam('theme_advanced_styles')) { + cl = []; + + tinymce.each(v.split(';'), function(v) { + var p = v.split('='); + + cl.push({'title' : p[0], 'class' : p[1]}); + }); + } else + cl = tinyMCEPopup.editor.dom.getClasses(); + + if (cl.length > 0) { + lst.options.length = 0; + lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), ''); + + tinymce.each(cl, function(o) { + lst.options[lst.options.length] = new Option(o.title || o['class'], o['class']); + }); + } else + dom.remove(dom.getParent(id, 'tr')); + }, + + fillFileList : function(id, l) { + var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; + + l = window[l]; + lst.options.length = 0; + + if (l && l.length > 0) { + lst.options[lst.options.length] = new Option('', ''); + + tinymce.each(l, function(o) { + lst.options[lst.options.length] = new Option(o[0], o[1]); + }); + } else + dom.remove(dom.getParent(id, 'tr')); + }, + + resetImageData : function() { + var f = document.forms[0]; + + f.elements.width.value = f.elements.height.value = ''; + }, + + updateImageData : function(img, st) { + var f = document.forms[0]; + + if (!st) { + f.elements.width.value = img.width; + f.elements.height.value = img.height; + } + + this.preloadImg = img; + }, + + changeAppearance : function() { + var ed = tinyMCEPopup.editor, f = document.forms[0], img = document.getElementById('alignSampleImg'); + + if (img) { + if (ed.getParam('inline_styles')) { + ed.dom.setAttrib(img, 'style', f.style.value); + } else { + img.align = f.align.value; + img.border = f.border.value; + img.hspace = f.hspace.value; + img.vspace = f.vspace.value; + } + } + }, + + changeHeight : function() { + var f = document.forms[0], tp, t = this; + + if (!f.constrain.checked || !t.preloadImg) { + return; + } + + if (f.width.value == "" || f.height.value == "") + return; + + tp = (parseInt(f.width.value) / parseInt(t.preloadImg.width)) * t.preloadImg.height; + f.height.value = tp.toFixed(0); + }, + + changeWidth : function() { + var f = document.forms[0], tp, t = this; + + if (!f.constrain.checked || !t.preloadImg) { + return; + } + + if (f.width.value == "" || f.height.value == "") + return; + + tp = (parseInt(f.height.value) / parseInt(t.preloadImg.height)) * t.preloadImg.width; + f.width.value = tp.toFixed(0); + }, + + updateStyle : function(ty) { + var dom = tinyMCEPopup.dom, st, v, f = document.forms[0], img = dom.create('img', {style : dom.get('style').value}); + + if (tinyMCEPopup.editor.settings.inline_styles) { + // Handle align + if (ty == 'align') { + dom.setStyle(img, 'float', ''); + dom.setStyle(img, 'vertical-align', ''); + + v = getSelectValue(f, 'align'); + if (v) { + if (v == 'left' || v == 'right') + dom.setStyle(img, 'float', v); + else + img.style.verticalAlign = v; + } + } + + // Handle border + if (ty == 'border') { + 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'; + } + } + + // Handle hspace + if (ty == 'hspace') { + dom.setStyle(img, 'marginLeft', ''); + dom.setStyle(img, 'marginRight', ''); + + v = f.hspace.value; + if (v) { + img.style.marginLeft = v + 'px'; + img.style.marginRight = v + 'px'; + } + } + + // Handle vspace + if (ty == 'vspace') { + dom.setStyle(img, 'marginTop', ''); + dom.setStyle(img, 'marginBottom', ''); + + v = f.vspace.value; + if (v) { + img.style.marginTop = v + 'px'; + img.style.marginBottom = v + 'px'; + } + } + + // Merge + dom.get('style').value = dom.serializeStyle(dom.parseStyle(img.style.cssText), 'img'); + } + }, + + changeMouseMove : function() { + }, + + showPreviewImage : function(u, st) { + if (!u) { + tinyMCEPopup.dom.setHTML('prev', ''); + return; + } + + if (!st && tinyMCEPopup.getParam("advimage_update_dimensions_onchange", true)) + this.resetImageData(); + + u = tinyMCEPopup.editor.documentBaseURI.toAbsolute(u); + + if (!st) + tinyMCEPopup.dom.setHTML('prev', ''); + else + tinyMCEPopup.dom.setHTML('prev', ''); + } +}; + +ImageDialog.preInit(); +tinyMCEPopup.onInit.add(ImageDialog.init, ImageDialog); diff --git a/plugins/TinyMCE/js/plugins/advimage/langs/en_dlg.js b/plugins/TinyMCE/js/plugins/advimage/langs/en_dlg.js new file mode 100644 index 0000000000..f493d196fa --- /dev/null +++ b/plugins/TinyMCE/js/plugins/advimage/langs/en_dlg.js @@ -0,0 +1,43 @@ +tinyMCE.addI18n('en.advimage_dlg',{ +tab_general:"General", +tab_appearance:"Appearance", +tab_advanced:"Advanced", +general:"General", +title:"Title", +preview:"Preview", +constrain_proportions:"Constrain proportions", +langdir:"Language direction", +langcode:"Language code", +long_desc:"Long description link", +style:"Style", +classes:"Classes", +ltr:"Left to right", +rtl:"Right to left", +id:"Id", +map:"Image map", +swap_image:"Swap image", +alt_image:"Alternative image", +mouseover:"for mouse over", +mouseout:"for mouse out", +misc:"Miscellaneous", +example_img:"Appearance preview image", +missing_alt:"Are you sure you want to continue without including an Image Description? Without it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.", +dialog_title:"Insert/edit image", +src:"Image URL", +alt:"Image description", +list:"Image list", +border:"Border", +dimensions:"Dimensions", +vspace:"Vertical space", +hspace:"Horizontal space", +align:"Alignment", +align_baseline:"Baseline", +align_top:"Top", +align_middle:"Middle", +align_bottom:"Bottom", +align_texttop:"Text top", +align_textbottom:"Text bottom", +align_left:"Left", +align_right:"Right", +image_list:"Image list" +}); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/advlink/css/advlink.css b/plugins/TinyMCE/js/plugins/advlink/css/advlink.css new file mode 100644 index 0000000000..14364316a1 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/advlink/css/advlink.css @@ -0,0 +1,8 @@ +.mceLinkList, .mceAnchorList, #targetlist {width:280px;} +.mceActionPanel {margin-top:7px;} +.panel_wrapper div.current {height:320px;} +#classlist, #title, #href {width:280px;} +#popupurl, #popupname {width:200px;} +#popupwidth, #popupheight, #popupleft, #popuptop {width:30px;vertical-align:middle;text-align:center;} +#id, #style, #classes, #target, #dir, #hreflang, #lang, #charset, #type, #rel, #rev, #tabindex, #accesskey {width:200px;} +#events_panel input {width:200px;} diff --git a/plugins/TinyMCE/js/plugins/advlink/editor_plugin.js b/plugins/TinyMCE/js/plugins/advlink/editor_plugin.js new file mode 100644 index 0000000000..983fe5a9ca --- /dev/null +++ b/plugins/TinyMCE/js/plugins/advlink/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.AdvancedLinkPlugin",{init:function(a,b){this.editor=a;a.addCommand("mceAdvLink",function(){var c=a.selection;if(c.isCollapsed()&&!a.dom.getParent(c.getNode(),"A")){return}a.windowManager.open({file:b+"/link.htm",width:480+parseInt(a.getLang("advlink.delta_width",0)),height:400+parseInt(a.getLang("advlink.delta_height",0)),inline:1},{plugin_url:b})});a.addButton("link",{title:"advlink.link_desc",cmd:"mceAdvLink"});a.addShortcut("ctrl+k","advlink.advlink_desc","mceAdvLink");a.onNodeChange.add(function(d,c,f,e){c.setDisabled("link",e&&f.nodeName!="A");c.setActive("link",f.nodeName=="A"&&!f.name)})},getInfo:function(){return{longname:"Advanced link",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlink",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advlink",tinymce.plugins.AdvancedLinkPlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/advlink/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/advlink/editor_plugin_src.js new file mode 100644 index 0000000000..14e46a7629 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/advlink/editor_plugin_src.js @@ -0,0 +1,61 @@ +/** + * 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.AdvancedLinkPlugin', { + init : function(ed, url) { + this.editor = ed; + + // Register commands + ed.addCommand('mceAdvLink', function() { + var se = ed.selection; + + // No selection and not in link + if (se.isCollapsed() && !ed.dom.getParent(se.getNode(), 'A')) + return; + + ed.windowManager.open({ + file : url + '/link.htm', + width : 480 + parseInt(ed.getLang('advlink.delta_width', 0)), + height : 400 + parseInt(ed.getLang('advlink.delta_height', 0)), + inline : 1 + }, { + plugin_url : url + }); + }); + + // Register buttons + ed.addButton('link', { + title : 'advlink.link_desc', + cmd : 'mceAdvLink' + }); + + ed.addShortcut('ctrl+k', 'advlink.advlink_desc', 'mceAdvLink'); + + ed.onNodeChange.add(function(ed, cm, n, co) { + cm.setDisabled('link', co && n.nodeName != 'A'); + cm.setActive('link', n.nodeName == 'A' && !n.name); + }); + }, + + getInfo : function() { + return { + longname : 'Advanced link', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlink', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('advlink', tinymce.plugins.AdvancedLinkPlugin); +})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/advlink/js/advlink.js b/plugins/TinyMCE/js/plugins/advlink/js/advlink.js new file mode 100644 index 0000000000..b78e82f76b --- /dev/null +++ b/plugins/TinyMCE/js/plugins/advlink/js/advlink.js @@ -0,0 +1,528 @@ +/* Functions for the advlink plugin popup */ + +tinyMCEPopup.requireLangPack(); + +var templates = { + "window.open" : "window.open('${url}','${target}','${options}')" +}; + +function preinit() { + var url; + + if (url = tinyMCEPopup.getParam("external_link_list_url")) + document.write(''); +} + +function changeClass() { + var f = document.forms[0]; + + f.classes.value = getSelectValue(f, 'classlist'); +} + +function init() { + tinyMCEPopup.resizeToInnerSize(); + + var formObj = document.forms[0]; + var inst = tinyMCEPopup.editor; + var elm = inst.selection.getNode(); + var action = "insert"; + var html; + + 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 + html = getLinkListHTML('linklisthref','href'); + if (html == "") + document.getElementById("linklisthrefrow").style.display = 'none'; + else + document.getElementById("linklisthrefcontainer").innerHTML = html; + + // Resize some elements + if (isVisible('hrefbrowser')) + document.getElementById('href').style.width = '260px'; + + if (isVisible('popupurlbrowser')) + document.getElementById('popupurl').style.width = '180px'; + + elm = inst.dom.getParent(elm, "A"); + if (elm != null && elm.nodeName == "A") + action = "update"; + + formObj.insert.value = tinyMCEPopup.getLang(action, 'Insert', true); + + setPopupControlsDisabled(true); + + if (action == "update") { + var href = inst.dom.getAttrib(elm, 'href'); + var onclick = inst.dom.getAttrib(elm, 'onclick'); + + // Setup form data + setFormValue('href', href); + setFormValue('title', inst.dom.getAttrib(elm, 'title')); + setFormValue('id', inst.dom.getAttrib(elm, 'id')); + setFormValue('style', inst.dom.getAttrib(elm, "style")); + setFormValue('rel', inst.dom.getAttrib(elm, 'rel')); + setFormValue('rev', inst.dom.getAttrib(elm, 'rev')); + setFormValue('charset', inst.dom.getAttrib(elm, 'charset')); + setFormValue('hreflang', inst.dom.getAttrib(elm, 'hreflang')); + setFormValue('dir', inst.dom.getAttrib(elm, 'dir')); + setFormValue('lang', inst.dom.getAttrib(elm, 'lang')); + setFormValue('tabindex', inst.dom.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : "")); + setFormValue('accesskey', inst.dom.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : "")); + setFormValue('type', inst.dom.getAttrib(elm, 'type')); + setFormValue('onfocus', inst.dom.getAttrib(elm, 'onfocus')); + setFormValue('onblur', inst.dom.getAttrib(elm, 'onblur')); + setFormValue('onclick', onclick); + setFormValue('ondblclick', inst.dom.getAttrib(elm, 'ondblclick')); + setFormValue('onmousedown', inst.dom.getAttrib(elm, 'onmousedown')); + setFormValue('onmouseup', inst.dom.getAttrib(elm, 'onmouseup')); + setFormValue('onmouseover', inst.dom.getAttrib(elm, 'onmouseover')); + setFormValue('onmousemove', inst.dom.getAttrib(elm, 'onmousemove')); + setFormValue('onmouseout', inst.dom.getAttrib(elm, 'onmouseout')); + setFormValue('onkeypress', inst.dom.getAttrib(elm, 'onkeypress')); + setFormValue('onkeydown', inst.dom.getAttrib(elm, 'onkeydown')); + setFormValue('onkeyup', inst.dom.getAttrib(elm, 'onkeyup')); + setFormValue('target', inst.dom.getAttrib(elm, 'target')); + setFormValue('classes', inst.dom.getAttrib(elm, 'class')); + + // Parse onclick data + if (onclick != null && onclick.indexOf('window.open') != -1) + parseWindowOpen(onclick); + else + parseFunction(onclick); + + // Select by the values + selectByValue(formObj, 'dir', inst.dom.getAttrib(elm, 'dir')); + selectByValue(formObj, 'rel', inst.dom.getAttrib(elm, 'rel')); + selectByValue(formObj, 'rev', inst.dom.getAttrib(elm, 'rev')); + selectByValue(formObj, 'linklisthref', href); + + if (href.charAt(0) == '#') + selectByValue(formObj, 'anchorlist', href); + + addClassesToList('classlist', 'advlink_styles'); + + selectByValue(formObj, 'classlist', inst.dom.getAttrib(elm, 'class'), true); + selectByValue(formObj, 'targetlist', inst.dom.getAttrib(elm, 'target'), true); + } else + addClassesToList('classlist', 'advlink_styles'); +} + +function checkPrefix(n) { + if (n.value && Validator.isEmail(n) && !/^\s*mailto:/i.test(n.value) && confirm(tinyMCEPopup.getLang('advlink_dlg.is_email'))) + n.value = 'mailto:' + n.value; + + if (/^\s*www\./i.test(n.value) && confirm(tinyMCEPopup.getLang('advlink_dlg.is_external'))) + n.value = 'http://' + n.value; +} + +function setFormValue(name, value) { + document.forms[0].elements[name].value = value; +} + +function parseWindowOpen(onclick) { + var formObj = document.forms[0]; + + // Preprocess center code + if (onclick.indexOf('return false;') != -1) { + formObj.popupreturn.checked = true; + onclick = onclick.replace('return false;', ''); + } else + formObj.popupreturn.checked = false; + + var onClickData = parseLink(onclick); + + if (onClickData != null) { + formObj.ispopup.checked = true; + setPopupControlsDisabled(false); + + var onClickWindowOptions = parseOptions(onClickData['options']); + var url = onClickData['url']; + + formObj.popupname.value = onClickData['target']; + formObj.popupurl.value = url; + formObj.popupwidth.value = getOption(onClickWindowOptions, 'width'); + formObj.popupheight.value = getOption(onClickWindowOptions, 'height'); + + formObj.popupleft.value = getOption(onClickWindowOptions, 'left'); + formObj.popuptop.value = getOption(onClickWindowOptions, 'top'); + + if (formObj.popupleft.value.indexOf('screen') != -1) + formObj.popupleft.value = "c"; + + if (formObj.popuptop.value.indexOf('screen') != -1) + formObj.popuptop.value = "c"; + + formObj.popuplocation.checked = getOption(onClickWindowOptions, 'location') == "yes"; + formObj.popupscrollbars.checked = getOption(onClickWindowOptions, 'scrollbars') == "yes"; + formObj.popupmenubar.checked = getOption(onClickWindowOptions, 'menubar') == "yes"; + formObj.popupresizable.checked = getOption(onClickWindowOptions, 'resizable') == "yes"; + formObj.popuptoolbar.checked = getOption(onClickWindowOptions, 'toolbar') == "yes"; + formObj.popupstatus.checked = getOption(onClickWindowOptions, 'status') == "yes"; + formObj.popupdependent.checked = getOption(onClickWindowOptions, 'dependent') == "yes"; + + buildOnClick(); + } +} + +function parseFunction(onclick) { + var formObj = document.forms[0]; + var onClickData = parseLink(onclick); + + // TODO: Add stuff here +} + +function getOption(opts, name) { + return typeof(opts[name]) == "undefined" ? "" : opts[name]; +} + +function setPopupControlsDisabled(state) { + var formObj = document.forms[0]; + + formObj.popupname.disabled = state; + formObj.popupurl.disabled = state; + formObj.popupwidth.disabled = state; + formObj.popupheight.disabled = state; + formObj.popupleft.disabled = state; + formObj.popuptop.disabled = state; + formObj.popuplocation.disabled = state; + formObj.popupscrollbars.disabled = state; + formObj.popupmenubar.disabled = state; + formObj.popupresizable.disabled = state; + formObj.popuptoolbar.disabled = state; + formObj.popupstatus.disabled = state; + formObj.popupreturn.disabled = state; + formObj.popupdependent.disabled = state; + + setBrowserDisabled('popupurlbrowser', state); +} + +function parseLink(link) { + link = link.replace(new RegExp(''', 'g'), "'"); + + var fnName = link.replace(new RegExp("\\s*([A-Za-z0-9\.]*)\\s*\\(.*", "gi"), "$1"); + + // Is function name a template function + var template = templates[fnName]; + if (template) { + // Build regexp + var variableNames = template.match(new RegExp("'?\\$\\{[A-Za-z0-9\.]*\\}'?", "gi")); + var regExp = "\\s*[A-Za-z0-9\.]*\\s*\\("; + var replaceStr = ""; + for (var i=0; i'); + for (var i=0; i'; + html += ''; + + for (i=0; i' + name + ''; + } + + html += ''; + + return html; +} + +function insertAction() { + var inst = tinyMCEPopup.editor; + var elm, elementArray, i; + + elm = inst.selection.getNode(); + checkPrefix(document.forms[0].href); + + elm = inst.dom.getParent(elm, "A"); + + // 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); + tinyMCEPopup.execCommand("mceEndUndoLevel"); + tinyMCEPopup.close(); + 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}); + + elementArray = tinymce.grep(inst.dom.select("a"), function(n) {return inst.dom.getAttrib(n, 'href') == '#mce_temp_url#';}); + for (i=0; i' + tinyMCELinkList[i][0] + ''; + + html += ''; + + return html; + + // tinyMCE.debug('-- image list start --', html, '-- image list end --'); +} + +function getTargetListHTML(elm_id, target_form_element) { + var targets = tinyMCEPopup.getParam('theme_advanced_link_targets', '').split(';'); + var html = ''; + + html += ''; + + return html; +} + +// While loading +preinit(); +tinyMCEPopup.onInit.add(init); diff --git a/plugins/TinyMCE/js/plugins/advlink/langs/en_dlg.js b/plugins/TinyMCE/js/plugins/advlink/langs/en_dlg.js new file mode 100644 index 0000000000..c71ffbd0f1 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/advlink/langs/en_dlg.js @@ -0,0 +1,52 @@ +tinyMCE.addI18n('en.advlink_dlg',{ +title:"Insert/edit link", +url:"Link URL", +target:"Target", +titlefield:"Title", +is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?", +is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?", +list:"Link list", +general_tab:"General", +popup_tab:"Popup", +events_tab:"Events", +advanced_tab:"Advanced", +general_props:"General properties", +popup_props:"Popup properties", +event_props:"Events", +advanced_props:"Advanced properties", +popup_opts:"Options", +anchor_names:"Anchors", +target_same:"Open in this window / frame", +target_parent:"Open in parent window / frame", +target_top:"Open in top frame (replaces all frames)", +target_blank:"Open in new window", +popup:"Javascript popup", +popup_url:"Popup URL", +popup_name:"Window name", +popup_return:"Insert 'return false'", +popup_scrollbars:"Show scrollbars", +popup_statusbar:"Show status bar", +popup_toolbar:"Show toolbars", +popup_menubar:"Show menu bar", +popup_location:"Show location bar", +popup_resizable:"Make window resizable", +popup_dependent:"Dependent (Mozilla/Firefox only)", +popup_size:"Size", +popup_position:"Position (X/Y)", +id:"Id", +style:"Style", +classes:"Classes", +target_name:"Target name", +langdir:"Language direction", +target_langcode:"Target language", +langcode:"Language code", +encoding:"Target character encoding", +mime:"Target MIME type", +rel:"Relationship page to target", +rev:"Relationship target to page", +tabindex:"Tabindex", +accesskey:"Accesskey", +ltr:"Left to right", +rtl:"Right to left", +link_list:"Link list" +}); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/advlink/link.htm b/plugins/TinyMCE/js/plugins/advlink/link.htm new file mode 100644 index 0000000000..876669c6b3 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/advlink/link.htm @@ -0,0 +1,333 @@ + + + + {#advlink_dlg.title} + + + + + + + + +
+ + +
+
+
+ {#advlink_dlg.general_props} + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
 
+ +
+
+
+ + + +
+
+ {#advlink_dlg.advanced_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
+ +
+
+ {#advlink_dlg.event_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+ + +
+
+ + diff --git a/plugins/TinyMCE/js/plugins/advlist/editor_plugin.js b/plugins/TinyMCE/js/plugins/advlist/editor_plugin.js new file mode 100644 index 0000000000..02d16971a1 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/advlist/editor_plugin.js @@ -0,0 +1 @@ +(function(){var a=tinymce.each;tinymce.create("tinymce.plugins.AdvListPlugin",{init:function(b,c){var d=this;d.editor=b;function e(g){var f=[];a(g.split(/,/),function(h){f.push({title:"advlist."+(h=="default"?"def":h.replace(/-/g,"_")),styles:{listStyleType:h=="default"?"":h}})});return f}d.numlist=b.getParam("advlist_number_styles")||e("default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman");d.bullist=b.getParam("advlist_bullet_styles")||e("default,circle,disc,square")},createControl:function(d,b){var f=this,e,h;if(d=="numlist"||d=="bullist"){if(f[d][0].title=="advlist.def"){h=f[d][0]}function c(i,k){var j=true;a(k.styles,function(m,l){if(f.editor.dom.getStyle(i,l)!=m){j=false;return false}});return j}function g(){var k,i=f.editor,l=i.dom,j=i.selection;k=l.getParent(j.getNode(),"ol,ul");if(!k||k.nodeName==(d=="bullist"?"OL":"UL")||c(k,h)){i.execCommand(d=="bullist"?"InsertUnorderedList":"InsertOrderedList")}if(h){k=l.getParent(j.getNode(),"ol,ul");if(k){l.setStyles(k,h.styles);k.removeAttribute("_mce_style")}}}e=b.createSplitButton(d,{title:"advanced."+d+"_desc","class":"mce_"+d,onclick:function(){g()}});e.onRenderMenu.add(function(i,j){j.onShowMenu.add(function(){var m=f.editor.dom,l=m.getParent(f.editor.selection.getNode(),"ol,ul"),k;if(l||h){k=f[d];a(j.items,function(n){var o=true;n.setSelected(0);if(l&&!n.isDisabled()){a(k,function(p){if(p.id==n.id){if(!c(l,p)){o=false;return false}}});if(o){n.setSelected(1)}}});if(!l){j.items[h.id].setSelected(1)}}});j.add({id:f.editor.dom.uniqueId(),title:"advlist.types","class":"mceMenuItemTitle"}).setDisabled(1);a(f[d],function(k){k.id=f.editor.dom.uniqueId();j.add({id:k.id,title:k.title,onclick:function(){h=k;g()}})})});return e}},getInfo:function(){return{longname:"Advanced lists",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlist",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advlist",tinymce.plugins.AdvListPlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/advlist/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/advlist/editor_plugin_src.js new file mode 100644 index 0000000000..a61887a922 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/advlist/editor_plugin_src.js @@ -0,0 +1,154 @@ +/** + * 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() { + var each = tinymce.each; + + tinymce.create('tinymce.plugins.AdvListPlugin', { + init : function(ed, url) { + var t = this; + + t.editor = ed; + + function buildFormats(str) { + var formats = []; + + each(str.split(/,/), function(type) { + formats.push({ + title : 'advlist.' + (type == 'default' ? 'def' : type.replace(/-/g, '_')), + styles : { + listStyleType : type == 'default' ? '' : type + } + }); + }); + + return formats; + }; + + // Setup number formats from config or default + t.numlist = ed.getParam("advlist_number_styles") || buildFormats("default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman"); + t.bullist = ed.getParam("advlist_bullet_styles") || buildFormats("default,circle,disc,square"); + }, + + createControl: function(name, cm) { + var t = this, btn, format; + + if (name == 'numlist' || name == 'bullist') { + // Default to first item if it's a default item + if (t[name][0].title == 'advlist.def') + format = t[name][0]; + + function hasFormat(node, format) { + var state = true; + + each(format.styles, function(value, name) { + // Format doesn't match + if (t.editor.dom.getStyle(node, name) != value) { + state = false; + return false; + } + }); + + return state; + }; + + function applyListFormat() { + var list, ed = t.editor, dom = ed.dom, sel = ed.selection; + + // Check for existing list element + list = dom.getParent(sel.getNode(), 'ol,ul'); + + // Switch/add list type if needed + if (!list || list.nodeName == (name == 'bullist' ? 'OL' : 'UL') || hasFormat(list, format)) + ed.execCommand(name == 'bullist' ? 'InsertUnorderedList' : 'InsertOrderedList'); + + // Append styles to new list element + if (format) { + list = dom.getParent(sel.getNode(), 'ol,ul'); + + if (list) { + dom.setStyles(list, format.styles); + list.removeAttribute('_mce_style'); + } + } + }; + + btn = cm.createSplitButton(name, { + title : 'advanced.' + name + '_desc', + 'class' : 'mce_' + name, + onclick : function() { + applyListFormat(); + } + }); + + btn.onRenderMenu.add(function(btn, menu) { + menu.onShowMenu.add(function() { + var dom = t.editor.dom, list = dom.getParent(t.editor.selection.getNode(), 'ol,ul'), fmtList; + + if (list || format) { + fmtList = t[name]; + + // Unselect existing items + each(menu.items, function(item) { + var state = true; + + item.setSelected(0); + + if (list && !item.isDisabled()) { + each(fmtList, function(fmt) { + if (fmt.id == item.id) { + if (!hasFormat(list, fmt)) { + state = false; + return false; + } + } + }); + + if (state) + item.setSelected(1); + } + }); + + // Select the current format + if (!list) + menu.items[format.id].setSelected(1); + } + }); + + menu.add({id : t.editor.dom.uniqueId(), title : 'advlist.types', 'class' : 'mceMenuItemTitle'}).setDisabled(1); + + each(t[name], function(item) { + item.id = t.editor.dom.uniqueId(); + + menu.add({id : item.id, title : item.title, onclick : function() { + format = item; + applyListFormat(); + }}); + }); + }); + + return btn; + } + }, + + getInfo : function() { + return { + longname : 'Advanced lists', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlist', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('advlist', tinymce.plugins.AdvListPlugin); +})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/autoresize/editor_plugin.js b/plugins/TinyMCE/js/plugins/autoresize/editor_plugin.js new file mode 100644 index 0000000000..1676b154a8 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/autoresize/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.AutoResizePlugin",{init:function(a,c){var d=this;if(a.getParam("fullscreen_is_enabled")){return}function b(){var h=a.getDoc(),e=h.body,j=h.documentElement,g=tinymce.DOM,i=d.autoresize_min_height,f;f=tinymce.isIE?e.scrollHeight:j.offsetHeight;if(f>d.autoresize_min_height){i=f}g.setStyle(g.get(a.id+"_ifr"),"height",i+"px");if(d.throbbing){a.setProgressState(false);a.setProgressState(true)}}d.editor=a;d.autoresize_min_height=a.getElement().offsetHeight;a.onChange.add(b);a.onSetContent.add(b);a.onPaste.add(b);a.onKeyUp.add(b);a.onPostRender.add(b);if(a.getParam("autoresize_on_init",true)){a.onInit.add(function(f,e){f.setProgressState(true);d.throbbing=true;f.getBody().style.overflowY="hidden"});a.onLoadContent.add(function(f,e){b();setTimeout(function(){b();f.setProgressState(false);d.throbbing=false},1250)})}a.addCommand("mceAutoResize",b)},getInfo:function(){return{longname:"Auto Resize",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autoresize",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("autoresize",tinymce.plugins.AutoResizePlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/autoresize/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/autoresize/editor_plugin_src.js new file mode 100644 index 0000000000..c260b7a24f --- /dev/null +++ b/plugins/TinyMCE/js/plugins/autoresize/editor_plugin_src.js @@ -0,0 +1,119 @@ +/** + * 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() { + /** + * Auto Resize + * + * This plugin automatically resizes the content area to fit its content height. + * It will retain a minimum height, which is the height of the content area when + * it's initialized. + */ + tinymce.create('tinymce.plugins.AutoResizePlugin', { + /** + * 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) { + var t = this; + + if (ed.getParam('fullscreen_is_enabled')) + return; + + /** + * This method gets executed each time the editor needs to resize. + */ + function resize() { + var d = ed.getDoc(), b = d.body, de = d.documentElement, DOM = tinymce.DOM, resizeHeight = t.autoresize_min_height, myHeight; + + // Get height differently depending on the browser used + myHeight = tinymce.isIE ? b.scrollHeight : de.offsetHeight; + + // Don't make it smaller than the minimum height + if (myHeight > t.autoresize_min_height) + resizeHeight = myHeight; + + // Resize content element + DOM.setStyle(DOM.get(ed.id + '_ifr'), 'height', resizeHeight + 'px'); + + // if we're throbbing, we'll re-throb to match the new size + if (t.throbbing) { + ed.setProgressState(false); + ed.setProgressState(true); + } + }; + + t.editor = ed; + + // Define minimum height + t.autoresize_min_height = ed.getElement().offsetHeight; + + // Add appropriate listeners for resizing content area + ed.onChange.add(resize); + ed.onSetContent.add(resize); + ed.onPaste.add(resize); + ed.onKeyUp.add(resize); + ed.onPostRender.add(resize); + + if (ed.getParam('autoresize_on_init', true)) { + // Things to do when the editor is ready + ed.onInit.add(function(ed, l) { + // Show throbber until content area is resized properly + ed.setProgressState(true); + t.throbbing = true; + + // Hide scrollbars + ed.getBody().style.overflowY = "hidden"; + }); + + ed.onLoadContent.add(function(ed, l) { + resize(); + + // Because the content area resizes when its content CSS loads, + // and we can't easily add a listener to its onload event, + // we'll just trigger a resize after a short loading period + setTimeout(function() { + resize(); + + // Disable throbber + ed.setProgressState(false); + t.throbbing = false; + }, 1250); + }); + } + + // Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('mceExample'); + ed.addCommand('mceAutoResize', resize); + }, + + /** + * 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 : 'Auto Resize', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autoresize', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('autoresize', tinymce.plugins.AutoResizePlugin); +})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/autosave/editor_plugin.js b/plugins/TinyMCE/js/plugins/autosave/editor_plugin.js new file mode 100644 index 0000000000..6e485400b3 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/autosave/editor_plugin.js @@ -0,0 +1 @@ +(function(e){var c="autosave",g="restoredraft",b=true,f,d,a=e.util.Dispatcher;e.create("tinymce.plugins.AutoSave",{init:function(i,j){var h=this,l=i.settings;h.editor=i;function k(n){var m={s:1000,m:60000};n=/^(\d+)([ms]?)$/.exec(""+n);return(n[2]?m[n[2]]:1)*parseInt(n)}e.each({ask_before_unload:b,interval:"30s",retention:"20m",minlength:50},function(n,m){m=c+"_"+m;if(l[m]===f){l[m]=n}});l.autosave_interval=k(l.autosave_interval);l.autosave_retention=k(l.autosave_retention);i.addButton(g,{title:c+".restore_content",onclick:function(){if(i.getContent({draft:true}).replace(/\s| |<\/?p[^>]*>|]*>/gi,"").length>0){i.windowManager.confirm(c+".warning_message",function(m){if(m){h.restoreDraft()}})}else{h.restoreDraft()}}});i.onNodeChange.add(function(){var m=i.controlManager;if(m.get(g)){m.setDisabled(g,!h.hasDraft())}});i.onInit.add(function(){if(i.controlManager.get(g)){h.setupStorage(i);setInterval(function(){h.storeDraft();i.nodeChanged()},l.autosave_interval)}});h.onStoreDraft=new a(h);h.onRestoreDraft=new a(h);h.onRemoveDraft=new a(h);if(!d){window.onbeforeunload=e.plugins.AutoSave._beforeUnloadHandler;d=b}},getInfo:function(){return{longname:"Auto save",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autosave",version:e.majorVersion+"."+e.minorVersion}},getExpDate:function(){return new Date(new Date().getTime()+this.editor.settings.autosave_retention).toUTCString()},setupStorage:function(i){var h=this,k=c+"_test",j="OK";h.key=c+i.id;e.each([function(){if(localStorage){localStorage.setItem(k,j);if(localStorage.getItem(k)===j){localStorage.removeItem(k);return localStorage}}},function(){if(sessionStorage){sessionStorage.setItem(k,j);if(sessionStorage.getItem(k)===j){sessionStorage.removeItem(k);return sessionStorage}}},function(){if(e.isIE){i.getElement().style.behavior="url('#default#userData')";return{autoExpires:b,setItem:function(l,n){var m=i.getElement();m.setAttribute(l,n);m.expires=h.getExpDate();m.save("TinyMCE")},getItem:function(l){var m=i.getElement();m.load("TinyMCE");return m.getAttribute(l)},removeItem:function(l){i.getElement().removeAttribute(l)}}}},],function(l){try{h.storage=l();if(h.storage){return false}}catch(m){}})},storeDraft:function(){var i=this,l=i.storage,j=i.editor,h,k;if(l){if(!l.getItem(i.key)&&!j.isDirty()){return}k=j.getContent({draft:true});if(k.length>j.settings.autosave_minlength){h=i.getExpDate();if(!i.storage.autoExpires){i.storage.setItem(i.key+"_expires",h)}i.storage.setItem(i.key,k);i.onStoreDraft.dispatch(i,{expires:h,content:k})}}},restoreDraft:function(){var h=this,i=h.storage;if(i){content=i.getItem(h.key);if(content){h.editor.setContent(content);h.onRestoreDraft.dispatch(h,{content:content})}}},hasDraft:function(){var h=this,k=h.storage,i,j;if(k){j=!!k.getItem(h.key);if(j){if(!h.storage.autoExpires){i=new Date(k.getItem(h.key+"_expires"));if(new Date().getTime()]*>|]*>/gi, "").length > 0) { + // Show confirm dialog if the editor isn't empty + ed.windowManager.confirm( + PLUGIN_NAME + ".warning_message", + function(ok) { + if (ok) + self.restoreDraft(); + } + ); + } else + self.restoreDraft(); + } + }); + + // Enable/disable restoredraft button depending on if there is a draft stored or not + ed.onNodeChange.add(function() { + var controlManager = ed.controlManager; + + if (controlManager.get(RESTORE_DRAFT)) + controlManager.setDisabled(RESTORE_DRAFT, !self.hasDraft()); + }); + + ed.onInit.add(function() { + // Check if the user added the restore button, then setup auto storage logic + if (ed.controlManager.get(RESTORE_DRAFT)) { + // Setup storage engine + self.setupStorage(ed); + + // Auto save contents each interval time + setInterval(function() { + self.storeDraft(); + ed.nodeChanged(); + }, settings.autosave_interval); + } + }); + + /** + * This event gets fired when a draft is stored to local storage. + * + * @event onStoreDraft + * @param {tinymce.plugins.AutoSave} sender Plugin instance sending the event. + * @param {Object} draft Draft object containing the HTML contents of the editor. + */ + self.onStoreDraft = new Dispatcher(self); + + /** + * This event gets fired when a draft is restored from local storage. + * + * @event onStoreDraft + * @param {tinymce.plugins.AutoSave} sender Plugin instance sending the event. + * @param {Object} draft Draft object containing the HTML contents of the editor. + */ + self.onRestoreDraft = new Dispatcher(self); + + /** + * This event gets fired when a draft removed/expired. + * + * @event onRemoveDraft + * @param {tinymce.plugins.AutoSave} sender Plugin instance sending the event. + * @param {Object} draft Draft object containing the HTML contents of the editor. + */ + self.onRemoveDraft = new Dispatcher(self); + + // Add ask before unload dialog only add one unload handler + if (!unloadHandlerAdded) { + window.onbeforeunload = tinymce.plugins.AutoSave._beforeUnloadHandler; + unloadHandlerAdded = TRUE; + } + }, + + /** + * Returns information about the plugin as a name/value array. + * The current keys are longname, author, authorurl, infourl and version. + * + * @method getInfo + * @return {Object} Name/value array containing information about the plugin. + */ + getInfo : function() { + return { + longname : 'Auto save', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autosave', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + }, + + /** + * Returns an expiration date UTC string. + * + * @method getExpDate + * @return {String} Expiration date UTC string. + */ + getExpDate : function() { + return new Date( + new Date().getTime() + this.editor.settings.autosave_retention + ).toUTCString(); + }, + + /** + * This method will setup the storage engine. If the browser has support for it. + * + * @method setupStorage + */ + setupStorage : function(ed) { + var self = this, testKey = PLUGIN_NAME + '_test', testVal = "OK"; + + self.key = PLUGIN_NAME + ed.id; + + // Loop though each storage engine type until we find one that works + tinymce.each([ + function() { + // Try HTML5 Local Storage + if (localStorage) { + localStorage.setItem(testKey, testVal); + + if (localStorage.getItem(testKey) === testVal) { + localStorage.removeItem(testKey); + + return localStorage; + } + } + }, + + function() { + // Try HTML5 Session Storage + if (sessionStorage) { + sessionStorage.setItem(testKey, testVal); + + if (sessionStorage.getItem(testKey) === testVal) { + sessionStorage.removeItem(testKey); + + return sessionStorage; + } + } + }, + + function() { + // Try IE userData + if (tinymce.isIE) { + ed.getElement().style.behavior = "url('#default#userData')"; + + // Fake localStorage on old IE + return { + autoExpires : TRUE, + + setItem : function(key, value) { + var userDataElement = ed.getElement(); + + userDataElement.setAttribute(key, value); + userDataElement.expires = self.getExpDate(); + userDataElement.save("TinyMCE"); + }, + + getItem : function(key) { + var userDataElement = ed.getElement(); + + userDataElement.load("TinyMCE"); + + return userDataElement.getAttribute(key); + }, + + removeItem : function(key) { + ed.getElement().removeAttribute(key); + } + }; + } + }, + ], function(setup) { + // Try executing each function to find a suitable storage engine + try { + self.storage = setup(); + + if (self.storage) + return false; + } catch (e) { + // Ignore + } + }); + }, + + /** + * This method will store the current contents in the the storage engine. + * + * @method storeDraft + */ + storeDraft : function() { + var self = this, storage = self.storage, editor = self.editor, expires, content; + + // Is the contents dirty + if (storage) { + // If there is no existing key and the contents hasn't been changed since + // it's original value then there is no point in saving a draft + if (!storage.getItem(self.key) && !editor.isDirty()) + return; + + // Store contents if the contents if longer than the minlength of characters + content = editor.getContent({draft: true}); + if (content.length > editor.settings.autosave_minlength) { + expires = self.getExpDate(); + + // Store expiration date if needed IE userData has auto expire built in + if (!self.storage.autoExpires) + self.storage.setItem(self.key + "_expires", expires); + + self.storage.setItem(self.key, content); + self.onStoreDraft.dispatch(self, { + expires : expires, + content : content + }); + } + } + }, + + /** + * This method will restore the contents from the storage engine back to the editor. + * + * @method restoreDraft + */ + restoreDraft : function() { + var self = this, storage = self.storage; + + if (storage) { + content = storage.getItem(self.key); + + if (content) { + self.editor.setContent(content); + self.onRestoreDraft.dispatch(self, { + content : content + }); + } + } + }, + + /** + * This method will return true/false if there is a local storage draft available. + * + * @method hasDraft + * @return {boolean} true/false state if there is a local draft. + */ + hasDraft : function() { + var self = this, storage = self.storage, expDate, exists; + + if (storage) { + // Does the item exist at all + exists = !!storage.getItem(self.key); + if (exists) { + // Storage needs autoexpire + if (!self.storage.autoExpires) { + expDate = new Date(storage.getItem(self.key + "_expires")); + + // Contents hasn't expired + if (new Date().getTime() < expDate.getTime()) + return TRUE; + + // Remove it if it has + self.removeDraft(); + } else + return TRUE; + } + } + + return false; + }, + + /** + * Removes the currently stored draft. + * + * @method removeDraft + */ + removeDraft : function() { + var self = this, storage = self.storage, key = self.key, content; + + if (storage) { + // Get current contents and remove the existing draft + content = storage.getItem(key); + storage.removeItem(key); + storage.removeItem(key + "_expires"); + + // Dispatch remove event if we had any contents + if (content) { + self.onRemoveDraft.dispatch(self, { + content : content + }); + } + } + }, + + "static" : { + // Internal unload handler will be called before the page is unloaded + _beforeUnloadHandler : function(e) { + var msg; + + tinymce.each(tinyMCE.editors, function(ed) { + // Store a draft for each editor instance + if (ed.plugins.autosave) + ed.plugins.autosave.storeDraft(); + + // Never ask in fullscreen mode + if (ed.getParam("fullscreen_is_enabled")) + return; + + // Setup a return message if the editor is dirty + if (!msg && ed.isDirty() && ed.getParam("autosave_ask_before_unload")) + msg = ed.getLang("autosave.unload_msg"); + }); + + return msg; + } + } + }); + + tinymce.PluginManager.add('autosave', tinymce.plugins.AutoSave); +})(tinymce); diff --git a/plugins/TinyMCE/js/plugins/autosave/langs/en.js b/plugins/TinyMCE/js/plugins/autosave/langs/en.js new file mode 100644 index 0000000000..fce6bd3e1f --- /dev/null +++ b/plugins/TinyMCE/js/plugins/autosave/langs/en.js @@ -0,0 +1,4 @@ +tinyMCE.addI18n('en.autosave',{ +restore_content: "Restore auto-saved content", +warning_message: "If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?" +}); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/bbcode/editor_plugin.js b/plugins/TinyMCE/js/plugins/bbcode/editor_plugin.js new file mode 100644 index 0000000000..930fdff0af --- /dev/null +++ b/plugins/TinyMCE/js/plugins/bbcode/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.BBCodePlugin",{init:function(a,b){var d=this,c=a.getParam("bbcode_dialect","punbb").toLowerCase();a.onBeforeSetContent.add(function(e,f){f.content=d["_"+c+"_bbcode2html"](f.content)});a.onPostProcess.add(function(e,f){if(f.set){f.content=d["_"+c+"_bbcode2html"](f.content)}if(f.get){f.content=d["_"+c+"_html2bbcode"](f.content)}})},getInfo:function(){return{longname:"BBCode Plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/bbcode",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_punbb_html2bbcode:function(a){a=tinymce.trim(a);function b(c,d){a=a.replace(c,d)}b(/(.*?)<\/a>/gi,"[url=$1]$2[/url]");b(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");b(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");b(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");b(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");b(/(.*?)<\/span>/gi,"[color=$1]$2[/color]");b(/(.*?)<\/font>/gi,"[color=$1]$2[/color]");b(/(.*?)<\/span>/gi,"[size=$1]$2[/size]");b(/(.*?)<\/font>/gi,"$1");b(//gi,"[img]$1[/img]");b(/(.*?)<\/span>/gi,"[code]$1[/code]");b(/(.*?)<\/span>/gi,"[quote]$1[/quote]");b(/(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]");b(/(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]");b(/(.*?)<\/em>/gi,"[code][i]$1[/i][/code]");b(/(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]");b(/(.*?)<\/u>/gi,"[code][u]$1[/u][/code]");b(/(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]");b(/<\/(strong|b)>/gi,"[/b]");b(/<(strong|b)>/gi,"[b]");b(/<\/(em|i)>/gi,"[/i]");b(/<(em|i)>/gi,"[i]");b(/<\/u>/gi,"[/u]");b(/(.*?)<\/span>/gi,"[u]$1[/u]");b(//gi,"[u]");b(/]*>/gi,"[quote]");b(/<\/blockquote>/gi,"[/quote]");b(/
/gi,"\n");b(//gi,"\n");b(/
/gi,"\n");b(/

/gi,"");b(/<\/p>/gi,"\n");b(/ /gi," ");b(/"/gi,'"');b(/</gi,"<");b(/>/gi,">");b(/&/gi,"&");return a},_punbb_bbcode2html:function(a){a=tinymce.trim(a);function b(c,d){a=a.replace(c,d)}b(/\n/gi,"
");b(/\[b\]/gi,"");b(/\[\/b\]/gi,"");b(/\[i\]/gi,"");b(/\[\/i\]/gi,"");b(/\[u\]/gi,"");b(/\[\/u\]/gi,"");b(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'$2');b(/\[url\](.*?)\[\/url\]/gi,'$1');b(/\[img\](.*?)\[\/img\]/gi,'');b(/\[color=(.*?)\](.*?)\[\/color\]/gi,'$2');b(/\[code\](.*?)\[\/code\]/gi,'$1 ');b(/\[quote.*?\](.*?)\[\/quote\]/gi,'$1 ');return a}});tinymce.PluginManager.add("bbcode",tinymce.plugins.BBCodePlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/bbcode/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/bbcode/editor_plugin_src.js new file mode 100644 index 0000000000..5586637f33 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/bbcode/editor_plugin_src.js @@ -0,0 +1,120 @@ +/** + * 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.BBCodePlugin', { + init : function(ed, url) { + var t = this, dialect = ed.getParam('bbcode_dialect', 'punbb').toLowerCase(); + + ed.onBeforeSetContent.add(function(ed, o) { + o.content = t['_' + dialect + '_bbcode2html'](o.content); + }); + + ed.onPostProcess.add(function(ed, o) { + if (o.set) + o.content = t['_' + dialect + '_bbcode2html'](o.content); + + if (o.get) + o.content = t['_' + dialect + '_html2bbcode'](o.content); + }); + }, + + getInfo : function() { + return { + longname : 'BBCode Plugin', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/bbcode', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + }, + + // Private methods + + // HTML -> BBCode in PunBB dialect + _punbb_html2bbcode : function(s) { + s = tinymce.trim(s); + + function rep(re, str) { + s = s.replace(re, str); + }; + + // example: to [b] + rep(/(.*?)<\/a>/gi,"[url=$1]$2[/url]"); + rep(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"); + rep(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"); + rep(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"); + rep(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"); + rep(/(.*?)<\/span>/gi,"[color=$1]$2[/color]"); + rep(/(.*?)<\/font>/gi,"[color=$1]$2[/color]"); + rep(/(.*?)<\/span>/gi,"[size=$1]$2[/size]"); + rep(/(.*?)<\/font>/gi,"$1"); + rep(//gi,"[img]$1[/img]"); + rep(/(.*?)<\/span>/gi,"[code]$1[/code]"); + rep(/(.*?)<\/span>/gi,"[quote]$1[/quote]"); + rep(/(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]"); + rep(/(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]"); + rep(/(.*?)<\/em>/gi,"[code][i]$1[/i][/code]"); + rep(/(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]"); + rep(/(.*?)<\/u>/gi,"[code][u]$1[/u][/code]"); + rep(/(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]"); + rep(/<\/(strong|b)>/gi,"[/b]"); + rep(/<(strong|b)>/gi,"[b]"); + rep(/<\/(em|i)>/gi,"[/i]"); + rep(/<(em|i)>/gi,"[i]"); + rep(/<\/u>/gi,"[/u]"); + rep(/(.*?)<\/span>/gi,"[u]$1[/u]"); + rep(//gi,"[u]"); + rep(/]*>/gi,"[quote]"); + rep(/<\/blockquote>/gi,"[/quote]"); + rep(/
/gi,"\n"); + rep(//gi,"\n"); + rep(/
/gi,"\n"); + rep(/

/gi,""); + rep(/<\/p>/gi,"\n"); + rep(/ /gi," "); + rep(/"/gi,"\""); + rep(/</gi,"<"); + rep(/>/gi,">"); + rep(/&/gi,"&"); + + return s; + }, + + // BBCode -> HTML from PunBB dialect + _punbb_bbcode2html : function(s) { + s = tinymce.trim(s); + + function rep(re, str) { + s = s.replace(re, str); + }; + + // example: [b] to + rep(/\n/gi,"
"); + rep(/\[b\]/gi,""); + rep(/\[\/b\]/gi,""); + rep(/\[i\]/gi,""); + rep(/\[\/i\]/gi,""); + rep(/\[u\]/gi,""); + rep(/\[\/u\]/gi,""); + rep(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,"$2"); + rep(/\[url\](.*?)\[\/url\]/gi,"$1"); + rep(/\[img\](.*?)\[\/img\]/gi,""); + rep(/\[color=(.*?)\](.*?)\[\/color\]/gi,"$2"); + rep(/\[code\](.*?)\[\/code\]/gi,"$1 "); + rep(/\[quote.*?\](.*?)\[\/quote\]/gi,"$1 "); + + return s; + } + }); + + // Register plugin + tinymce.PluginManager.add('bbcode', tinymce.plugins.BBCodePlugin); +})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/contextmenu/editor_plugin.js b/plugins/TinyMCE/js/plugins/contextmenu/editor_plugin.js new file mode 100644 index 0000000000..9749e5164c --- /dev/null +++ b/plugins/TinyMCE/js/plugins/contextmenu/editor_plugin.js @@ -0,0 +1 @@ +(function(){var a=tinymce.dom.Event,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.ContextMenu",{init:function(d){var f=this,g;f.editor=d;f.onContextMenu=new tinymce.util.Dispatcher(this);d.onContextMenu.add(function(h,i){if(!i.ctrlKey){if(g){h.selection.setRng(g)}f._getMenu(h).showMenu(i.clientX,i.clientY);a.add(h.getDoc(),"click",function(j){e(h,j)});a.cancel(i)}});d.onRemove.add(function(){if(f._menu){f._menu.removeAll()}});function e(h,i){g=null;if(i&&i.button==2){g=h.selection.getRng();return}if(f._menu){f._menu.removeAll();f._menu.destroy();a.remove(h.getDoc(),"click",e)}}d.onMouseDown.add(e);d.onKeyDown.add(e)},getInfo:function(){return{longname:"Contextmenu",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/contextmenu",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_getMenu:function(h){var l=this,f=l._menu,i=h.selection,e=i.isCollapsed(),d=i.getNode()||h.getBody(),g,k,j;if(f){f.removeAll();f.destroy()}k=b.getPos(h.getContentAreaContainer());j=b.getPos(h.getContainer());f=h.controlManager.createDropMenu("contextmenu",{offset_x:k.x+h.getParam("contextmenu_offset_x",0),offset_y:k.y+h.getParam("contextmenu_offset_y",0),constrain:1});l._menu=f;f.add({title:"advanced.cut_desc",icon:"cut",cmd:"Cut"}).setDisabled(e);f.add({title:"advanced.copy_desc",icon:"copy",cmd:"Copy"}).setDisabled(e);f.add({title:"advanced.paste_desc",icon:"paste",cmd:"Paste"});if((d.nodeName=="A"&&!h.dom.getAttrib(d,"name"))||!e){f.addSeparator();f.add({title:"advanced.link_desc",icon:"link",cmd:h.plugins.advlink?"mceAdvLink":"mceLink",ui:true});f.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"})}f.addSeparator();f.add({title:"advanced.image_desc",icon:"image",cmd:h.plugins.advimage?"mceAdvImage":"mceImage",ui:true});f.addSeparator();g=f.addMenu({title:"contextmenu.align"});g.add({title:"contextmenu.left",icon:"justifyleft",cmd:"JustifyLeft"});g.add({title:"contextmenu.center",icon:"justifycenter",cmd:"JustifyCenter"});g.add({title:"contextmenu.right",icon:"justifyright",cmd:"JustifyRight"});g.add({title:"contextmenu.full",icon:"justifyfull",cmd:"JustifyFull"});l.onContextMenu.dispatch(l,f,d,e);return f}});tinymce.PluginManager.add("contextmenu",tinymce.plugins.ContextMenu)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/contextmenu/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/contextmenu/editor_plugin_src.js new file mode 100644 index 0000000000..13813a64e4 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/contextmenu/editor_plugin_src.js @@ -0,0 +1,147 @@ +/** + * 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() { + var Event = tinymce.dom.Event, each = tinymce.each, DOM = tinymce.DOM; + + /** + * This plugin a context menu to TinyMCE editor instances. + * + * @class tinymce.plugins.ContextMenu + */ + tinymce.create('tinymce.plugins.ContextMenu', { + /** + * 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. + * + * @method init + * @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) { + var t = this, lastRng; + + t.editor = ed; + + /** + * This event gets fired when the context menu is shown. + * + * @event onContextMenu + * @param {tinymce.plugins.ContextMenu} sender Plugin instance sending the event. + * @param {tinymce.ui.DropMenu} menu Drop down menu to fill with more items if needed. + */ + t.onContextMenu = new tinymce.util.Dispatcher(this); + + ed.onContextMenu.add(function(ed, e) { + if (!e.ctrlKey) { + // Restore the last selection since it was removed + if (lastRng) + ed.selection.setRng(lastRng); + + t._getMenu(ed).showMenu(e.clientX, e.clientY); + Event.add(ed.getDoc(), 'click', function(e) { + hide(ed, e); + }); + Event.cancel(e); + } + }); + + ed.onRemove.add(function() { + if (t._menu) + t._menu.removeAll(); + }); + + function hide(ed, e) { + lastRng = null; + + // Since the contextmenu event moves + // the selection we need to store it away + if (e && e.button == 2) { + lastRng = ed.selection.getRng(); + return; + } + + if (t._menu) { + t._menu.removeAll(); + t._menu.destroy(); + Event.remove(ed.getDoc(), 'click', hide); + } + }; + + ed.onMouseDown.add(hide); + ed.onKeyDown.add(hide); + }, + + /** + * Returns information about the plugin as a name/value array. + * The current keys are longname, author, authorurl, infourl and version. + * + * @method getInfo + * @return {Object} Name/value array containing information about the plugin. + */ + getInfo : function() { + return { + longname : 'Contextmenu', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/contextmenu', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + }, + + _getMenu : function(ed) { + var t = this, m = t._menu, se = ed.selection, col = se.isCollapsed(), el = se.getNode() || ed.getBody(), am, p1, p2; + + if (m) { + m.removeAll(); + m.destroy(); + } + + p1 = DOM.getPos(ed.getContentAreaContainer()); + p2 = DOM.getPos(ed.getContainer()); + + m = ed.controlManager.createDropMenu('contextmenu', { + offset_x : p1.x + ed.getParam('contextmenu_offset_x', 0), + offset_y : p1.y + ed.getParam('contextmenu_offset_y', 0), + constrain : 1 + }); + + t._menu = m; + + m.add({title : 'advanced.cut_desc', icon : 'cut', cmd : 'Cut'}).setDisabled(col); + m.add({title : 'advanced.copy_desc', icon : 'copy', cmd : 'Copy'}).setDisabled(col); + m.add({title : 'advanced.paste_desc', icon : 'paste', cmd : 'Paste'}); + + if ((el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) || !col) { + m.addSeparator(); + m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true}); + m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'}); + } + + m.addSeparator(); + m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true}); + + m.addSeparator(); + am = m.addMenu({title : 'contextmenu.align'}); + am.add({title : 'contextmenu.left', icon : 'justifyleft', cmd : 'JustifyLeft'}); + am.add({title : 'contextmenu.center', icon : 'justifycenter', cmd : 'JustifyCenter'}); + am.add({title : 'contextmenu.right', icon : 'justifyright', cmd : 'JustifyRight'}); + am.add({title : 'contextmenu.full', icon : 'justifyfull', cmd : 'JustifyFull'}); + + t.onContextMenu.dispatch(t, m, el, col); + + return m; + } + }); + + // Register plugin + tinymce.PluginManager.add('contextmenu', tinymce.plugins.ContextMenu); +})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/directionality/editor_plugin.js b/plugins/TinyMCE/js/plugins/directionality/editor_plugin.js new file mode 100644 index 0000000000..bce8e73995 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/directionality/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.Directionality",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceDirectionLTR",function(){var d=a.dom.getParent(a.selection.getNode(),a.dom.isBlock);if(d){if(a.dom.getAttrib(d,"dir")!="ltr"){a.dom.setAttrib(d,"dir","ltr")}else{a.dom.setAttrib(d,"dir","")}}a.nodeChanged()});a.addCommand("mceDirectionRTL",function(){var d=a.dom.getParent(a.selection.getNode(),a.dom.isBlock);if(d){if(a.dom.getAttrib(d,"dir")!="rtl"){a.dom.setAttrib(d,"dir","rtl")}else{a.dom.setAttrib(d,"dir","")}}a.nodeChanged()});a.addButton("ltr",{title:"directionality.ltr_desc",cmd:"mceDirectionLTR"});a.addButton("rtl",{title:"directionality.rtl_desc",cmd:"mceDirectionRTL"});a.onNodeChange.add(c._nodeChange,c)},getInfo:function(){return{longname:"Directionality",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/directionality",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_nodeChange:function(b,a,e){var d=b.dom,c;e=d.getParent(e,d.isBlock);if(!e){a.setDisabled("ltr",1);a.setDisabled("rtl",1);return}c=d.getAttrib(e,"dir");a.setActive("ltr",c=="ltr");a.setDisabled("ltr",0);a.setActive("rtl",c=="rtl");a.setDisabled("rtl",0)}});tinymce.PluginManager.add("directionality",tinymce.plugins.Directionality)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/directionality/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/directionality/editor_plugin_src.js new file mode 100644 index 0000000000..4444959bf3 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/directionality/editor_plugin_src.js @@ -0,0 +1,82 @@ +/** + * 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.Directionality', { + init : function(ed, url) { + var t = this; + + t.editor = ed; + + ed.addCommand('mceDirectionLTR', function() { + var e = ed.dom.getParent(ed.selection.getNode(), ed.dom.isBlock); + + if (e) { + if (ed.dom.getAttrib(e, "dir") != "ltr") + ed.dom.setAttrib(e, "dir", "ltr"); + else + ed.dom.setAttrib(e, "dir", ""); + } + + ed.nodeChanged(); + }); + + ed.addCommand('mceDirectionRTL', function() { + var e = ed.dom.getParent(ed.selection.getNode(), ed.dom.isBlock); + + if (e) { + if (ed.dom.getAttrib(e, "dir") != "rtl") + ed.dom.setAttrib(e, "dir", "rtl"); + else + ed.dom.setAttrib(e, "dir", ""); + } + + ed.nodeChanged(); + }); + + ed.addButton('ltr', {title : 'directionality.ltr_desc', cmd : 'mceDirectionLTR'}); + ed.addButton('rtl', {title : 'directionality.rtl_desc', cmd : 'mceDirectionRTL'}); + + ed.onNodeChange.add(t._nodeChange, t); + }, + + getInfo : function() { + return { + longname : 'Directionality', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/directionality', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + }, + + // Private methods + + _nodeChange : function(ed, cm, n) { + var dom = ed.dom, dir; + + n = dom.getParent(n, dom.isBlock); + if (!n) { + cm.setDisabled('ltr', 1); + cm.setDisabled('rtl', 1); + return; + } + + dir = dom.getAttrib(n, 'dir'); + cm.setActive('ltr', dir == "ltr"); + cm.setDisabled('ltr', 0); + cm.setActive('rtl', dir == "rtl"); + cm.setDisabled('rtl', 0); + } + }); + + // Register plugin + tinymce.PluginManager.add('directionality', tinymce.plugins.Directionality); +})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/emotions/editor_plugin.js b/plugins/TinyMCE/js/plugins/emotions/editor_plugin.js new file mode 100644 index 0000000000..dbdd8ffb58 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/emotions/editor_plugin.js @@ -0,0 +1 @@ +(function(a){a.create("tinymce.plugins.EmotionsPlugin",{init:function(b,c){b.addCommand("mceEmotion",function(){b.windowManager.open({file:c+"/emotions.htm",width:250+parseInt(b.getLang("emotions.delta_width",0)),height:160+parseInt(b.getLang("emotions.delta_height",0)),inline:1},{plugin_url:c})});b.addButton("emotions",{title:"emotions.emotions_desc",cmd:"mceEmotion"})},getInfo:function(){return{longname:"Emotions",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/emotions",version:a.majorVersion+"."+a.minorVersion}}});a.PluginManager.add("emotions",a.plugins.EmotionsPlugin)})(tinymce); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/emotions/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/emotions/editor_plugin_src.js new file mode 100644 index 0000000000..71d5416972 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/emotions/editor_plugin_src.js @@ -0,0 +1,43 @@ +/** + * 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) { + tinymce.create('tinymce.plugins.EmotionsPlugin', { + init : function(ed, url) { + // Register commands + ed.addCommand('mceEmotion', function() { + ed.windowManager.open({ + file : url + '/emotions.htm', + width : 250 + parseInt(ed.getLang('emotions.delta_width', 0)), + height : 160 + parseInt(ed.getLang('emotions.delta_height', 0)), + inline : 1 + }, { + plugin_url : url + }); + }); + + // Register buttons + ed.addButton('emotions', {title : 'emotions.emotions_desc', cmd : 'mceEmotion'}); + }, + + getInfo : function() { + return { + longname : 'Emotions', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/emotions', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('emotions', tinymce.plugins.EmotionsPlugin); +})(tinymce); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/emotions/emotions.htm b/plugins/TinyMCE/js/plugins/emotions/emotions.htm new file mode 100644 index 0000000000..55a1d72fa7 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/emotions/emotions.htm @@ -0,0 +1,40 @@ + + + + {#emotions_dlg.title} + + + + +

+
{#emotions_dlg.title}:

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
{#emotions_dlg.cool}{#emotions_dlg.cry}{#emotions_dlg.embarassed}{#emotions_dlg.foot_in_mouth}
{#emotions_dlg.frown}{#emotions_dlg.innocent}{#emotions_dlg.kiss}{#emotions_dlg.laughing}
{#emotions_dlg.money_mouth}{#emotions_dlg.sealed}{#emotions_dlg.smile}{#emotions_dlg.surprised}
{#emotions_dlg.tongue-out}{#emotions_dlg.undecided}{#emotions_dlg.wink}{#emotions_dlg.yell}
+
+ + diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-cool.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-cool.gif new file mode 100644 index 0000000000..ba90cc36fb Binary files /dev/null and b/plugins/TinyMCE/js/plugins/emotions/img/smiley-cool.gif differ diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-cry.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-cry.gif new file mode 100644 index 0000000000..74d897a4f6 Binary files /dev/null and b/plugins/TinyMCE/js/plugins/emotions/img/smiley-cry.gif differ diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-embarassed.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-embarassed.gif new file mode 100644 index 0000000000..963a96b8a7 Binary files /dev/null and b/plugins/TinyMCE/js/plugins/emotions/img/smiley-embarassed.gif differ 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 new file mode 100644 index 0000000000..16f68cc1e9 Binary files /dev/null and b/plugins/TinyMCE/js/plugins/emotions/img/smiley-foot-in-mouth.gif differ diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-frown.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-frown.gif new file mode 100644 index 0000000000..716f55e161 Binary files /dev/null and b/plugins/TinyMCE/js/plugins/emotions/img/smiley-frown.gif differ diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-innocent.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-innocent.gif new file mode 100644 index 0000000000..334d49e0e6 Binary files /dev/null and b/plugins/TinyMCE/js/plugins/emotions/img/smiley-innocent.gif differ diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-kiss.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-kiss.gif new file mode 100644 index 0000000000..4efd549ed3 Binary files /dev/null and b/plugins/TinyMCE/js/plugins/emotions/img/smiley-kiss.gif differ diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-laughing.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-laughing.gif new file mode 100644 index 0000000000..1606c119e7 Binary files /dev/null and b/plugins/TinyMCE/js/plugins/emotions/img/smiley-laughing.gif differ diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-money-mouth.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-money-mouth.gif new file mode 100644 index 0000000000..ca2451e102 Binary files /dev/null and b/plugins/TinyMCE/js/plugins/emotions/img/smiley-money-mouth.gif differ diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-sealed.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-sealed.gif new file mode 100644 index 0000000000..b33d3cca1e Binary files /dev/null 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 new file mode 100644 index 0000000000..e6a9e60d5d Binary files /dev/null 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 new file mode 100644 index 0000000000..cb99cdd913 Binary files /dev/null and b/plugins/TinyMCE/js/plugins/emotions/img/smiley-surprised.gif differ diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-tongue-out.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-tongue-out.gif new file mode 100644 index 0000000000..2075dc1605 Binary files /dev/null and b/plugins/TinyMCE/js/plugins/emotions/img/smiley-tongue-out.gif differ diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-undecided.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-undecided.gif new file mode 100644 index 0000000000..bef7e25730 Binary files /dev/null and b/plugins/TinyMCE/js/plugins/emotions/img/smiley-undecided.gif differ diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-wink.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-wink.gif new file mode 100644 index 0000000000..9faf1aff8f Binary files /dev/null and b/plugins/TinyMCE/js/plugins/emotions/img/smiley-wink.gif differ diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-yell.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-yell.gif new file mode 100644 index 0000000000..648e6e8791 Binary files /dev/null and b/plugins/TinyMCE/js/plugins/emotions/img/smiley-yell.gif differ diff --git a/plugins/TinyMCE/js/plugins/emotions/js/emotions.js b/plugins/TinyMCE/js/plugins/emotions/js/emotions.js new file mode 100644 index 0000000000..c549367096 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/emotions/js/emotions.js @@ -0,0 +1,22 @@ +tinyMCEPopup.requireLangPack(); + +var EmotionsDialog = { + init : function(ed) { + tinyMCEPopup.resizeToInnerSize(); + }, + + insert : function(file, title) { + var ed = tinyMCEPopup.editor, dom = ed.dom; + + tinyMCEPopup.execCommand('mceInsertContent', false, dom.createHTML('img', { + src : tinyMCEPopup.getWindowArg('plugin_url') + '/img/' + file, + alt : ed.getLang(title), + title : ed.getLang(title), + border : 0 + })); + + tinyMCEPopup.close(); + } +}; + +tinyMCEPopup.onInit.add(EmotionsDialog.init, EmotionsDialog); diff --git a/plugins/TinyMCE/js/plugins/emotions/langs/en_dlg.js b/plugins/TinyMCE/js/plugins/emotions/langs/en_dlg.js new file mode 100644 index 0000000000..3b57ad9e3c --- /dev/null +++ b/plugins/TinyMCE/js/plugins/emotions/langs/en_dlg.js @@ -0,0 +1,20 @@ +tinyMCE.addI18n('en.emotions_dlg',{ +title:"Insert emotion", +desc:"Emotions", +cool:"Cool", +cry:"Cry", +embarassed:"Embarassed", +foot_in_mouth:"Foot in mouth", +frown:"Frown", +innocent:"Innocent", +kiss:"Kiss", +laughing:"Laughing", +money_mouth:"Money mouth", +sealed:"Sealed", +smile:"Smile", +surprised:"Surprised", +tongue_out:"Tongue out", +undecided:"Undecided", +wink:"Wink", +yell:"Yell" +}); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/example/dialog.htm b/plugins/TinyMCE/js/plugins/example/dialog.htm new file mode 100644 index 0000000000..50b2b34451 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/example/dialog.htm @@ -0,0 +1,22 @@ + + + + {#example_dlg.title} + + + + + +
+

Here is a example dialog.

+

Selected text:

+

Custom arg:

+ +
+ + +
+
+ + + diff --git a/plugins/TinyMCE/js/plugins/example/editor_plugin.js b/plugins/TinyMCE/js/plugins/example/editor_plugin.js new file mode 100644 index 0000000000..ec1f81ea40 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/example/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.PluginManager.requireLangPack("example");tinymce.create("tinymce.plugins.ExamplePlugin",{init:function(a,b){a.addCommand("mceExample",function(){a.windowManager.open({file:b+"/dialog.htm",width:320+parseInt(a.getLang("example.delta_width",0)),height:120+parseInt(a.getLang("example.delta_height",0)),inline:1},{plugin_url:b,some_custom_arg:"custom arg"})});a.addButton("example",{title:"example.desc",cmd:"mceExample",image:b+"/img/example.gif"});a.onNodeChange.add(function(d,c,e){c.setActive("example",e.nodeName=="IMG")})},createControl:function(b,a){return null},getInfo:function(){return{longname:"Example plugin",author:"Some author",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example",version:"1.0"}}});tinymce.PluginManager.add("example",tinymce.plugins.ExamplePlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/example/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/example/editor_plugin_src.js new file mode 100644 index 0000000000..9a0e7da15d --- /dev/null +++ b/plugins/TinyMCE/js/plugins/example/editor_plugin_src.js @@ -0,0 +1,84 @@ +/** + * 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() { + // Load plugin specific language pack + tinymce.PluginManager.requireLangPack('example'); + + tinymce.create('tinymce.plugins.ExamplePlugin', { + /** + * 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) { + // Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('mceExample'); + ed.addCommand('mceExample', function() { + ed.windowManager.open({ + file : url + '/dialog.htm', + width : 320 + parseInt(ed.getLang('example.delta_width', 0)), + height : 120 + parseInt(ed.getLang('example.delta_height', 0)), + inline : 1 + }, { + plugin_url : url, // Plugin absolute URL + some_custom_arg : 'custom arg' // Custom argument + }); + }); + + // Register example button + ed.addButton('example', { + title : 'example.desc', + cmd : 'mceExample', + image : url + '/img/example.gif' + }); + + // Add a node change handler, selects the button in the UI when a image is selected + ed.onNodeChange.add(function(ed, cm, n) { + cm.setActive('example', n.nodeName == 'IMG'); + }); + }, + + /** + * Creates control instances based in the incomming name. This method is normally not + * needed since the addButton method of the tinymce.Editor class is a more easy way of adding buttons + * but you sometimes need to create more complex controls like listboxes, split buttons etc then this + * method can be used to create those. + * + * @param {String} n Name of the control to create. + * @param {tinymce.ControlManager} cm Control manager to use inorder to create new control. + * @return {tinymce.ui.Control} New control instance or null if no control was created. + */ + createControl : function(n, cm) { + return null; + }, + + /** + * 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 plugin', + author : 'Some author', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example', + version : "1.0" + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('example', tinymce.plugins.ExamplePlugin); +})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/example/img/example.gif b/plugins/TinyMCE/js/plugins/example/img/example.gif new file mode 100644 index 0000000000..1ab5da4461 Binary files /dev/null and b/plugins/TinyMCE/js/plugins/example/img/example.gif differ diff --git a/plugins/TinyMCE/js/plugins/example/js/dialog.js b/plugins/TinyMCE/js/plugins/example/js/dialog.js new file mode 100644 index 0000000000..fa8341132f --- /dev/null +++ b/plugins/TinyMCE/js/plugins/example/js/dialog.js @@ -0,0 +1,19 @@ +tinyMCEPopup.requireLangPack(); + +var ExampleDialog = { + init : function() { + var f = document.forms[0]; + + // Get the selected contents as text and place it in the input + f.someval.value = tinyMCEPopup.editor.selection.getContent({format : 'text'}); + f.somearg.value = tinyMCEPopup.getWindowArg('some_custom_arg'); + }, + + insert : function() { + // Insert the contents from the input into the document + tinyMCEPopup.editor.execCommand('mceInsertContent', false, document.forms[0].someval.value); + tinyMCEPopup.close(); + } +}; + +tinyMCEPopup.onInit.add(ExampleDialog.init, ExampleDialog); diff --git a/plugins/TinyMCE/js/plugins/example/langs/en.js b/plugins/TinyMCE/js/plugins/example/langs/en.js new file mode 100644 index 0000000000..e0784f80f4 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/example/langs/en.js @@ -0,0 +1,3 @@ +tinyMCE.addI18n('en.example',{ + desc : 'This is just a template button' +}); diff --git a/plugins/TinyMCE/js/plugins/example/langs/en_dlg.js b/plugins/TinyMCE/js/plugins/example/langs/en_dlg.js new file mode 100644 index 0000000000..ebcf948dac --- /dev/null +++ b/plugins/TinyMCE/js/plugins/example/langs/en_dlg.js @@ -0,0 +1,3 @@ +tinyMCE.addI18n('en.example_dlg',{ + title : 'This is just a example title' +}); diff --git a/plugins/TinyMCE/js/plugins/fullpage/css/fullpage.css b/plugins/TinyMCE/js/plugins/fullpage/css/fullpage.css new file mode 100644 index 0000000000..7a3334f08d --- /dev/null +++ b/plugins/TinyMCE/js/plugins/fullpage/css/fullpage.css @@ -0,0 +1,182 @@ +/* Hide the advanced tab */ +#advanced_tab { + display: none; +} + +#metatitle, #metakeywords, #metadescription, #metaauthor, #metacopyright { + width: 280px; +} + +#doctype, #docencoding { + width: 200px; +} + +#langcode { + width: 30px; +} + +#bgimage { + width: 220px; +} + +#fontface { + width: 240px; +} + +#leftmargin, #rightmargin, #topmargin, #bottommargin { + width: 50px; +} + +.panel_wrapper div.current { + height: 400px; +} + +#stylesheet, #style { + 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; +} + +.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; +} + +.selected { + border: 1px solid #0A246A; + background-color: #B6BDD2; +} + +.toolbar { + width: 100%; +} + +#headlist { + width: 100%; + margin-top: 3px; + font-size: 11px; +} + +#info, #title_element, #meta_element, #script_element, #style_element, #base_element, #link_element, #comment_element, #unknown_element { + display: none; +} + +#addmenu { + position: absolute; + border: 1px solid gray; + display: none; + z-index: 100; + background-color: white; +} + +#addmenu a { + display: block; + width: 100%; + line-height: 20px; + text-decoration: none; + background-color: white; +} + +#addmenu a:hover { + background-color: #B6BDD2; + color: black; +} + +#addmenu span { + padding-left: 10px; + padding-right: 10px; +} + +#updateElementPanel { + display: none; +} + +#script_element .panel_wrapper div.current { + height: 108px; +} + +#style_element .panel_wrapper div.current { + height: 108px; +} + +#link_element .panel_wrapper div.current { + height: 140px; +} + +#element_script_value { + width: 100%; + height: 100px; +} + +#element_comment_value { + width: 100%; + height: 120px; +} + +#element_style_value { + width: 100%; + height: 100px; +} + +#element_title, #element_script_src, #element_meta_name, #element_meta_content, #element_base_href, #element_link_href, #element_link_title { + width: 250px; +} + +.updateElementButton { + margin-top: 3px; +} + +/* MSIE specific styles */ + +* html .addbutton, * html .removebutton, * html .moveupbutton, * html .movedownbutton { + width: 22px; + height: 22px; +} + +textarea { + height: 55px; +} + +.panel_wrapper div.current {height:420px;} \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/fullpage/editor_plugin.js b/plugins/TinyMCE/js/plugins/fullpage/editor_plugin.js new file mode 100644 index 0000000000..aeaa669794 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/fullpage/editor_plugin.js @@ -0,0 +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 diff --git a/plugins/TinyMCE/js/plugins/fullpage/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/fullpage/editor_plugin_src.js new file mode 100644 index 0000000000..a2c9df8987 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/fullpage/editor_plugin_src.js @@ -0,0 +1,153 @@ +/** + * 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.FullPagePlugin', { + init : function(ed, url) { + var t = this; + + t.editor = ed; + + // Register commands + ed.addCommand('mceFullPageProperties', function() { + ed.windowManager.open({ + file : url + '/fullpage.htm', + width : 430 + parseInt(ed.getLang('fullpage.delta_width', 0)), + height : 495 + parseInt(ed.getLang('fullpage.delta_height', 0)), + inline : 1 + }, { + plugin_url : url, + head_html : t.head + }); + }); + + // Register buttons + 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); + }, + + 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 + }; + }, + + // Private plugin internal methods + + _setBodyAttribs : function(ed, o) { + var bdattr, i, len, kv, k, v, t, attr = this.head.match(/body(.*?)>/i); + + if (attr && attr[1]) { + bdattr = attr[1].match(/\s*(\w+\s*=\s*".*?"|\w+\s*=\s*'.*?'|\w+\s*=\s*\w+|\w+)\s*/g); + + if (bdattr) { + for(i = 0, len = bdattr.length; i < len; i++) { + kv = bdattr[i].split('='); + k = kv[0].replace(/\s/,''); + v = kv[1]; + + if (v) { + v = v.replace(/^\s+/,'').replace(/\s+$/,''); + t = v.match(/^["'](.*)["']$/); + + if (t) + v = t[1]; + } else + v = k; + + ed.dom.setAttrib(ed.getBody(), 'style', v); + } + } + } + }, + + _createSerializer : function() { + return new tinymce.dom.Serializer({ + dom : this.editor.dom, + apply_source_formatting : true + }); + }, + + _setContent : function(ed, o) { + var t = this, sp, ep, c = o.content, v, st = ''; + + // 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) + 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); + + 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'; + } + }, + + _getContent : function(ed, o) { + var t = 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); + } + }); + + // 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 new file mode 100644 index 0000000000..c32afaf2d9 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/fullpage/fullpage.htm @@ -0,0 +1,571 @@ + + + + {#fullpage_dlg.title} + + + + + + + +
+ + +
+
+
+ {#fullpage_dlg.meta_props} + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
 
 
 
 
  + +
+
+ +
+ {#fullpage_dlg.langprops} + + + + + + + + + + + + + + + + + + + + + + +
+ +
  + +
 
+ +
 
+
+
+ +
+
+ {#fullpage_dlg.appearance_textprops} + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + + + +
 
+
+
+ +
+ {#fullpage_dlg.appearance_bgprops} + + + + + + + + + + +
+ + + + + +
 
+
+ + + + + +
 
+
+
+ +
+ {#fullpage_dlg.appearance_marginprops} + + + + + + + + + + + + + + +
+
+ +
+ {#fullpage_dlg.appearance_linkprops} + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+
+ + + + + +
 
+
+ + + + + +
 
+
  
+
+ +
+ {#fullpage_dlg.appearance_style} + + + + + + + + + + +
+ + + + +
 
+
+
+ +
+ + +
+ {#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 new file mode 100644 index 0000000000..a1bb719a38 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/fullpage/js/fullpage.js @@ -0,0 +1,471 @@ +/** + * fullpage.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +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 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 defaultMediaTypes = + 'all=all,' + + 'screen=screen,' + + 'print=print,' + + 'tty=tty,' + + 'tv=tv,' + + 'projection=projection,' + + 'handheld=handheld,' + + 'braille=braille,' + + 'aural=aural'; + +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'; + +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(/ + + + +
+ +
+ + + + + diff --git a/plugins/TinyMCE/js/plugins/iespell/editor_plugin.js b/plugins/TinyMCE/js/plugins/iespell/editor_plugin.js new file mode 100644 index 0000000000..e9cba106c6 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/iespell/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.IESpell",{init:function(a,b){var c=this,d;if(!tinymce.isIE){return}c.editor=a;a.addCommand("mceIESpell",function(){try{d=new ActiveXObject("ieSpell.ieSpellExtension");d.CheckDocumentNode(a.getDoc().documentElement)}catch(f){if(f.number==-2146827859){a.windowManager.confirm(a.getLang("iespell.download"),function(e){if(e){window.open("http://www.iespell.com/download.php","ieSpellDownload","")}})}else{a.windowManager.alert("Error Loading ieSpell: Exception "+f.number)}}});a.addButton("iespell",{title:"iespell.iespell_desc",cmd:"mceIESpell"})},getInfo:function(){return{longname:"IESpell (IE Only)",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/iespell",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("iespell",tinymce.plugins.IESpell)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/iespell/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/iespell/editor_plugin_src.js new file mode 100644 index 0000000000..1b2bb98460 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/iespell/editor_plugin_src.js @@ -0,0 +1,54 @@ +/** + * 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.IESpell', { + init : function(ed, url) { + var t = this, sp; + + if (!tinymce.isIE) + return; + + t.editor = ed; + + // Register commands + ed.addCommand('mceIESpell', function() { + try { + sp = new ActiveXObject("ieSpell.ieSpellExtension"); + sp.CheckDocumentNode(ed.getDoc().documentElement); + } catch (e) { + if (e.number == -2146827859) { + ed.windowManager.confirm(ed.getLang("iespell.download"), function(s) { + if (s) + window.open('http://www.iespell.com/download.php', 'ieSpellDownload', ''); + }); + } else + ed.windowManager.alert("Error Loading ieSpell: Exception " + e.number); + } + }); + + // Register buttons + ed.addButton('iespell', {title : 'iespell.iespell_desc', cmd : 'mceIESpell'}); + }, + + getInfo : function() { + return { + longname : 'IESpell (IE Only)', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/iespell', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('iespell', tinymce.plugins.IESpell); +})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/inlinepopups/editor_plugin.js b/plugins/TinyMCE/js/plugins/inlinepopups/editor_plugin.js new file mode 100644 index 0000000000..07ea477b7c --- /dev/null +++ b/plugins/TinyMCE/js/plugins/inlinepopups/editor_plugin.js @@ -0,0 +1 @@ +(function(){var d=tinymce.DOM,b=tinymce.dom.Element,a=tinymce.dom.Event,e=tinymce.each,c=tinymce.is;tinymce.create("tinymce.plugins.InlinePopups",{init:function(f,g){f.onBeforeRenderUI.add(function(){f.windowManager=new tinymce.InlineWindowManager(f);d.loadCSS(g+"/skins/"+(f.settings.inlinepopups_skin||"clearlooks2")+"/window.css")})},getInfo:function(){return{longname:"InlinePopups",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/inlinepopups",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.create("tinymce.InlineWindowManager:tinymce.WindowManager",{InlineWindowManager:function(f){var g=this;g.parent(f);g.zIndex=300000;g.count=0;g.windows={}},open:function(r,j){var y=this,i,k="",q=y.editor,g=0,s=0,h,m,n,o,l,v,x;r=r||{};j=j||{};if(!r.inline){return y.parent(r,j)}if(!r.type){y.bookmark=q.selection.getBookmark(1)}i=d.uniqueId();h=d.getViewPort();r.width=parseInt(r.width||320);r.height=parseInt(r.height||240)+(tinymce.isIE?8:0);r.min_width=parseInt(r.min_width||150);r.min_height=parseInt(r.min_height||100);r.max_width=parseInt(r.max_width||2000);r.max_height=parseInt(r.max_height||2000);r.left=r.left||Math.round(Math.max(h.x,h.x+(h.w/2)-(r.width/2)));r.top=r.top||Math.round(Math.max(h.y,h.y+(h.h/2)-(r.height/2)));r.movable=r.resizable=true;j.mce_width=r.width;j.mce_height=r.height;j.mce_inline=true;j.mce_window_id=i;j.mce_auto_focus=r.auto_focus;y.features=r;y.params=j;y.onOpen.dispatch(y,r,j);if(r.type){k+=" mceModal";if(r.type){k+=" mce"+r.type.substring(0,1).toUpperCase()+r.type.substring(1)}r.resizable=false}if(r.statusbar){k+=" mceStatusbar"}if(r.resizable){k+=" mceResizable"}if(r.minimizable){k+=" mceMinimizable"}if(r.maximizable){k+=" mceMaximizable"}if(r.movable){k+=" mceMovable"}y._addAll(d.doc.body,["div",{id:i,"class":q.settings.inlinepopups_skin||"clearlooks2",style:"width:100px;height:100px"},["div",{id:i+"_wrapper","class":"mceWrapper"+k},["div",{id:i+"_top","class":"mceTop"},["div",{"class":"mceLeft"}],["div",{"class":"mceCenter"}],["div",{"class":"mceRight"}],["span",{id:i+"_title"},r.title||""]],["div",{id:i+"_middle","class":"mceMiddle"},["div",{id:i+"_left","class":"mceLeft"}],["span",{id:i+"_content"}],["div",{id:i+"_right","class":"mceRight"}]],["div",{id:i+"_bottom","class":"mceBottom"},["div",{"class":"mceLeft"}],["div",{"class":"mceCenter"}],["div",{"class":"mceRight"}],["span",{id:i+"_status"},"Content"]],["a",{"class":"mceMove",tabindex:"-1",href:"javascript:;"}],["a",{"class":"mceMin",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{"class":"mceMax",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{"class":"mceMed",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{"class":"mceClose",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{id:i+"_resize_n","class":"mceResize mceResizeN",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_s","class":"mceResize mceResizeS",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_w","class":"mceResize mceResizeW",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_e","class":"mceResize mceResizeE",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_nw","class":"mceResize mceResizeNW",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_ne","class":"mceResize mceResizeNE",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_sw","class":"mceResize mceResizeSW",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_se","class":"mceResize mceResizeSE",tabindex:"-1",href:"javascript:;"}]]]);d.setStyles(i,{top:-10000,left:-10000});if(tinymce.isGecko){d.setStyle(i,"overflow","auto")}if(!r.type){g+=d.get(i+"_left").clientWidth;g+=d.get(i+"_right").clientWidth;s+=d.get(i+"_top").clientHeight;s+=d.get(i+"_bottom").clientHeight}d.setStyles(i,{top:r.top,left:r.left,width:r.width+g,height:r.height+s});x=r.url||r.file;if(x){if(tinymce.relaxedDomain){x+=(x.indexOf("?")==-1?"?":"&")+"mce_rdomain="+tinymce.relaxedDomain}x=tinymce._addVer(x)}if(!r.type){d.add(i+"_content","iframe",{id:i+"_ifr",src:'javascript:""',frameBorder:0,style:"border:0;width:10px;height:10px"});d.setStyles(i+"_ifr",{width:r.width,height:r.height});d.setAttrib(i+"_ifr","src",x)}else{d.add(i+"_wrapper","a",{id:i+"_ok","class":"mceButton mceOk",href:"javascript:;",onmousedown:"return false;"},"Ok");if(r.type=="confirm"){d.add(i+"_wrapper","a",{"class":"mceButton mceCancel",href:"javascript:;",onmousedown:"return false;"},"Cancel")}d.add(i+"_middle","div",{"class":"mceIcon"});d.setHTML(i+"_content",r.content.replace("\n","
"))}n=a.add(i,"mousedown",function(t){var u=t.target,f,p;f=y.windows[i];y.focus(i);if(u.nodeName=="A"||u.nodeName=="a"){if(u.className=="mceMax"){f.oldPos=f.element.getXY();f.oldSize=f.element.getSize();p=d.getViewPort();p.w-=2;p.h-=2;f.element.moveTo(p.x,p.y);f.element.resizeTo(p.w,p.h);d.setStyles(i+"_ifr",{width:p.w-f.deltaWidth,height:p.h-f.deltaHeight});d.addClass(i+"_wrapper","mceMaximized")}else{if(u.className=="mceMed"){f.element.moveTo(f.oldPos.x,f.oldPos.y);f.element.resizeTo(f.oldSize.w,f.oldSize.h);f.iframeElement.resizeTo(f.oldSize.w-f.deltaWidth,f.oldSize.h-f.deltaHeight);d.removeClass(i+"_wrapper","mceMaximized")}else{if(u.className=="mceMove"){return y._startDrag(i,t,u.className)}else{if(d.hasClass(u,"mceResize")){return y._startDrag(i,t,u.className.substring(13))}}}}}});o=a.add(i,"click",function(f){var p=f.target;y.focus(i);if(p.nodeName=="A"||p.nodeName=="a"){switch(p.className){case"mceClose":y.close(null,i);return a.cancel(f);case"mceButton mceOk":case"mceButton mceCancel":r.button_func(p.className=="mceButton mceOk");return a.cancel(f)}}});v=y.windows[i]={id:i,mousedown_func:n,click_func:o,element:new b(i,{blocker:1,container:q.getContainer()}),iframeElement:new b(i+"_ifr"),features:r,deltaWidth:g,deltaHeight:s};v.iframeElement.on("focus",function(){y.focus(i)});if(y.count==0&&y.editor.getParam("dialog_type","modal")=="modal"){d.add(d.doc.body,"div",{id:"mceModalBlocker","class":(y.editor.settings.inlinepopups_skin||"clearlooks2")+"_modalBlocker",style:{zIndex:y.zIndex-1}});d.show("mceModalBlocker")}else{d.setStyle("mceModalBlocker","z-index",y.zIndex-1)}if(tinymce.isIE6||/Firefox\/2\./.test(navigator.userAgent)||(tinymce.isIE&&!d.boxModel)){d.setStyles("mceModalBlocker",{position:"absolute",left:h.x,top:h.y,width:h.w-2,height:h.h-2})}y.focus(i);y._fixIELayout(i,1);if(d.get(i+"_ok")){d.get(i+"_ok").focus()}y.count++;return v},focus:function(h){var g=this,f;if(f=g.windows[h]){f.zIndex=this.zIndex++;f.element.setStyle("zIndex",f.zIndex);f.element.update();h=h+"_wrapper";d.removeClass(g.lastId,"mceFocus");d.addClass(h,"mceFocus");g.lastId=h}},_addAll:function(k,h){var g,l,f=this,j=tinymce.DOM;if(c(h,"string")){k.appendChild(j.doc.createTextNode(h))}else{if(h.length){k=k.appendChild(j.create(h[0],h[1]));for(g=2;gf){i=m;f=m.zIndex}});if(i){h.focus(i.id)}}},setTitle:function(f,g){var h;f=this._findId(f);if(h=d.get(f+"_title")){h.innerHTML=d.encode(g)}},alert:function(g,f,j){var i=this,h;h=i.open({title:i,type:"alert",button_func:function(k){if(f){f.call(k||i,k)}i.close(null,h.id)},content:d.encode(i.editor.getLang(g,g)),inline:1,width:400,height:130})},confirm:function(g,f,j){var i=this,h;h=i.open({title:i,type:"confirm",button_func:function(k){if(f){f.call(k||i,k)}i.close(null,h.id)},content:d.encode(i.editor.getLang(g,g)),inline:1,width:400,height:130})},_findId:function(f){var g=this;if(typeof(f)=="string"){return f}e(g.windows,function(h){var i=d.get(h.id+"_ifr");if(i&&f==i.contentWindow){f=h.id;return false}});return f},_fixIELayout:function(i,h){var f,g;if(!tinymce.isIE6){return}e(["n","s","w","e","nw","ne","sw","se"],function(j){var k=d.get(i+"_resize_"+j);d.setStyles(k,{width:h?k.clientWidth:"",height:h?k.clientHeight:"",cursor:d.getStyle(k,"cursor",1)});d.setStyle(i+"_bottom","bottom","-1px");k=0});if(f=this.windows[i]){f.element.hide();f.element.show();e(d.select("div,a",i),function(k,j){if(k.currentStyle.backgroundImage!="none"){g=new Image();g.src=k.currentStyle.backgroundImage.replace(/url\(\"(.+)\"\)/,"$1")}});d.get(i).style.filter=""}}});tinymce.PluginManager.add("inlinepopups",tinymce.plugins.InlinePopups)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/inlinepopups/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/inlinepopups/editor_plugin_src.js new file mode 100644 index 0000000000..e991683de4 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/inlinepopups/editor_plugin_src.js @@ -0,0 +1,635 @@ +/** + * 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() { + var DOM = tinymce.DOM, Element = tinymce.dom.Element, Event = tinymce.dom.Event, each = tinymce.each, is = tinymce.is; + + tinymce.create('tinymce.plugins.InlinePopups', { + init : function(ed, url) { + // Replace window manager + ed.onBeforeRenderUI.add(function() { + ed.windowManager = new tinymce.InlineWindowManager(ed); + DOM.loadCSS(url + '/skins/' + (ed.settings.inlinepopups_skin || 'clearlooks2') + "/window.css"); + }); + }, + + getInfo : function() { + return { + longname : 'InlinePopups', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/inlinepopups', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + tinymce.create('tinymce.InlineWindowManager:tinymce.WindowManager', { + InlineWindowManager : function(ed) { + var t = this; + + t.parent(ed); + t.zIndex = 300000; + t.count = 0; + t.windows = {}; + }, + + open : function(f, p) { + var t = this, id, opt = '', ed = t.editor, dw = 0, dh = 0, vp, po, mdf, clf, we, w, u; + + f = f || {}; + p = p || {}; + + // Run native windows + if (!f.inline) + return t.parent(f, p); + + // Only store selection if the type is a normal window + if (!f.type) + t.bookmark = ed.selection.getBookmark(1); + + id = DOM.uniqueId(); + vp = DOM.getViewPort(); + f.width = parseInt(f.width || 320); + f.height = parseInt(f.height || 240) + (tinymce.isIE ? 8 : 0); + f.min_width = parseInt(f.min_width || 150); + f.min_height = parseInt(f.min_height || 100); + f.max_width = parseInt(f.max_width || 2000); + f.max_height = parseInt(f.max_height || 2000); + f.left = f.left || Math.round(Math.max(vp.x, vp.x + (vp.w / 2.0) - (f.width / 2.0))); + f.top = f.top || Math.round(Math.max(vp.y, vp.y + (vp.h / 2.0) - (f.height / 2.0))); + f.movable = f.resizable = true; + p.mce_width = f.width; + p.mce_height = f.height; + p.mce_inline = true; + p.mce_window_id = id; + p.mce_auto_focus = f.auto_focus; + + // Transpose +// po = DOM.getPos(ed.getContainer()); +// f.left -= po.x; +// f.top -= po.y; + + t.features = f; + t.params = p; + t.onOpen.dispatch(t, f, p); + + if (f.type) { + opt += ' mceModal'; + + if (f.type) + opt += ' mce' + f.type.substring(0, 1).toUpperCase() + f.type.substring(1); + + f.resizable = false; + } + + if (f.statusbar) + opt += ' mceStatusbar'; + + if (f.resizable) + opt += ' mceResizable'; + + if (f.minimizable) + opt += ' mceMinimizable'; + + if (f.maximizable) + opt += ' mceMaximizable'; + + if (f.movable) + opt += ' mceMovable'; + + // Create DOM objects + t._addAll(DOM.doc.body, + ['div', {id : id, 'class' : ed.settings.inlinepopups_skin || 'clearlooks2', style : 'width:100px;height:100px'}, + ['div', {id : id + '_wrapper', 'class' : 'mceWrapper' + opt}, + ['div', {id : id + '_top', 'class' : 'mceTop'}, + ['div', {'class' : 'mceLeft'}], + ['div', {'class' : 'mceCenter'}], + ['div', {'class' : 'mceRight'}], + ['span', {id : id + '_title'}, f.title || ''] + ], + + ['div', {id : id + '_middle', 'class' : 'mceMiddle'}, + ['div', {id : id + '_left', 'class' : 'mceLeft'}], + ['span', {id : id + '_content'}], + ['div', {id : id + '_right', 'class' : 'mceRight'}] + ], + + ['div', {id : id + '_bottom', 'class' : 'mceBottom'}, + ['div', {'class' : 'mceLeft'}], + ['div', {'class' : 'mceCenter'}], + ['div', {'class' : 'mceRight'}], + ['span', {id : id + '_status'}, 'Content'] + ], + + ['a', {'class' : 'mceMove', tabindex : '-1', href : 'javascript:;'}], + ['a', {'class' : 'mceMin', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}], + ['a', {'class' : 'mceMax', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}], + ['a', {'class' : 'mceMed', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}], + ['a', {'class' : 'mceClose', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}], + ['a', {id : id + '_resize_n', 'class' : 'mceResize mceResizeN', tabindex : '-1', href : 'javascript:;'}], + ['a', {id : id + '_resize_s', 'class' : 'mceResize mceResizeS', tabindex : '-1', href : 'javascript:;'}], + ['a', {id : id + '_resize_w', 'class' : 'mceResize mceResizeW', tabindex : '-1', href : 'javascript:;'}], + ['a', {id : id + '_resize_e', 'class' : 'mceResize mceResizeE', tabindex : '-1', href : 'javascript:;'}], + ['a', {id : id + '_resize_nw', 'class' : 'mceResize mceResizeNW', tabindex : '-1', href : 'javascript:;'}], + ['a', {id : id + '_resize_ne', 'class' : 'mceResize mceResizeNE', tabindex : '-1', href : 'javascript:;'}], + ['a', {id : id + '_resize_sw', 'class' : 'mceResize mceResizeSW', tabindex : '-1', href : 'javascript:;'}], + ['a', {id : id + '_resize_se', 'class' : 'mceResize mceResizeSE', tabindex : '-1', href : 'javascript:;'}] + ] + ] + ); + + DOM.setStyles(id, {top : -10000, left : -10000}); + + // Fix gecko rendering bug, where the editors iframe messed with window contents + if (tinymce.isGecko) + DOM.setStyle(id, 'overflow', 'auto'); + + // Measure borders + if (!f.type) { + dw += DOM.get(id + '_left').clientWidth; + dw += DOM.get(id + '_right').clientWidth; + dh += DOM.get(id + '_top').clientHeight; + dh += DOM.get(id + '_bottom').clientHeight; + } + + // Resize window + DOM.setStyles(id, {top : f.top, left : f.left, width : f.width + dw, height : f.height + dh}); + + u = f.url || f.file; + if (u) { + if (tinymce.relaxedDomain) + u += (u.indexOf('?') == -1 ? '?' : '&') + 'mce_rdomain=' + tinymce.relaxedDomain; + + u = tinymce._addVer(u); + } + + if (!f.type) { + DOM.add(id + '_content', 'iframe', {id : id + '_ifr', src : 'javascript:""', frameBorder : 0, style : 'border:0;width:10px;height:10px'}); + DOM.setStyles(id + '_ifr', {width : f.width, height : f.height}); + DOM.setAttrib(id + '_ifr', 'src', u); + } else { + DOM.add(id + '_wrapper', 'a', {id : id + '_ok', 'class' : 'mceButton mceOk', href : 'javascript:;', onmousedown : 'return false;'}, 'Ok'); + + if (f.type == 'confirm') + DOM.add(id + '_wrapper', 'a', {'class' : 'mceButton mceCancel', href : 'javascript:;', onmousedown : 'return false;'}, 'Cancel'); + + DOM.add(id + '_middle', 'div', {'class' : 'mceIcon'}); + DOM.setHTML(id + '_content', f.content.replace('\n', '
')); + } + + // Register events + mdf = Event.add(id, 'mousedown', function(e) { + var n = e.target, w, vp; + + w = t.windows[id]; + t.focus(id); + + if (n.nodeName == 'A' || n.nodeName == 'a') { + if (n.className == 'mceMax') { + w.oldPos = w.element.getXY(); + w.oldSize = w.element.getSize(); + + vp = DOM.getViewPort(); + + // Reduce viewport size to avoid scrollbars + vp.w -= 2; + vp.h -= 2; + + w.element.moveTo(vp.x, vp.y); + w.element.resizeTo(vp.w, vp.h); + DOM.setStyles(id + '_ifr', {width : vp.w - w.deltaWidth, height : vp.h - w.deltaHeight}); + DOM.addClass(id + '_wrapper', 'mceMaximized'); + } else if (n.className == 'mceMed') { + // Reset to old size + w.element.moveTo(w.oldPos.x, w.oldPos.y); + w.element.resizeTo(w.oldSize.w, w.oldSize.h); + w.iframeElement.resizeTo(w.oldSize.w - w.deltaWidth, w.oldSize.h - w.deltaHeight); + + DOM.removeClass(id + '_wrapper', 'mceMaximized'); + } else if (n.className == 'mceMove') + return t._startDrag(id, e, n.className); + else if (DOM.hasClass(n, 'mceResize')) + return t._startDrag(id, e, n.className.substring(13)); + } + }); + + clf = Event.add(id, 'click', function(e) { + var n = e.target; + + t.focus(id); + + if (n.nodeName == 'A' || n.nodeName == 'a') { + switch (n.className) { + case 'mceClose': + t.close(null, id); + return Event.cancel(e); + + case 'mceButton mceOk': + case 'mceButton mceCancel': + f.button_func(n.className == 'mceButton mceOk'); + return Event.cancel(e); + } + } + }); + + // Add window + w = t.windows[id] = { + id : id, + mousedown_func : mdf, + click_func : clf, + element : new Element(id, {blocker : 1, container : ed.getContainer()}), + iframeElement : new Element(id + '_ifr'), + features : f, + deltaWidth : dw, + deltaHeight : dh + }; + + w.iframeElement.on('focus', function() { + t.focus(id); + }); + + // Setup blocker + if (t.count == 0 && t.editor.getParam('dialog_type', 'modal') == 'modal') { + DOM.add(DOM.doc.body, 'div', { + id : 'mceModalBlocker', + 'class' : (t.editor.settings.inlinepopups_skin || 'clearlooks2') + '_modalBlocker', + style : {zIndex : t.zIndex - 1} + }); + + DOM.show('mceModalBlocker'); // Reduces flicker in IE + } else + DOM.setStyle('mceModalBlocker', 'z-index', t.zIndex - 1); + + if (tinymce.isIE6 || /Firefox\/2\./.test(navigator.userAgent) || (tinymce.isIE && !DOM.boxModel)) + DOM.setStyles('mceModalBlocker', {position : 'absolute', left : vp.x, top : vp.y, width : vp.w - 2, height : vp.h - 2}); + + t.focus(id); + t._fixIELayout(id, 1); + + // Focus ok button + if (DOM.get(id + '_ok')) + DOM.get(id + '_ok').focus(); + + t.count++; + + return w; + }, + + focus : function(id) { + var t = this, w; + + if (w = t.windows[id]) { + w.zIndex = this.zIndex++; + w.element.setStyle('zIndex', w.zIndex); + w.element.update(); + + id = id + '_wrapper'; + DOM.removeClass(t.lastId, 'mceFocus'); + DOM.addClass(id, 'mceFocus'); + t.lastId = id; + } + }, + + _addAll : function(te, ne) { + var i, n, t = this, dom = tinymce.DOM; + + if (is(ne, 'string')) + te.appendChild(dom.doc.createTextNode(ne)); + else if (ne.length) { + te = te.appendChild(dom.create(ne[0], ne[1])); + + for (i=2; i ix) { + fw = w; + ix = w.zIndex; + } + }); + + if (fw) + t.focus(fw.id); + } + }, + + setTitle : function(w, ti) { + var e; + + w = this._findId(w); + + if (e = DOM.get(w + '_title')) + e.innerHTML = DOM.encode(ti); + }, + + alert : function(txt, cb, s) { + var t = this, w; + + w = t.open({ + title : t, + type : 'alert', + button_func : function(s) { + if (cb) + cb.call(s || t, s); + + t.close(null, w.id); + }, + content : DOM.encode(t.editor.getLang(txt, txt)), + inline : 1, + width : 400, + height : 130 + }); + }, + + confirm : function(txt, cb, s) { + var t = this, w; + + w = t.open({ + title : t, + type : 'confirm', + button_func : function(s) { + if (cb) + cb.call(s || t, s); + + t.close(null, w.id); + }, + content : DOM.encode(t.editor.getLang(txt, txt)), + inline : 1, + width : 400, + height : 130 + }); + }, + + // Internal functions + + _findId : function(w) { + var t = this; + + if (typeof(w) == 'string') + return w; + + each(t.windows, function(wo) { + var ifr = DOM.get(wo.id + '_ifr'); + + if (ifr && w == ifr.contentWindow) { + w = wo.id; + return false; + } + }); + + return w; + }, + + _fixIELayout : function(id, s) { + var w, img; + + if (!tinymce.isIE6) + return; + + // Fixes the bug where hover flickers and does odd things in IE6 + each(['n','s','w','e','nw','ne','sw','se'], function(v) { + var e = DOM.get(id + '_resize_' + v); + + DOM.setStyles(e, { + width : s ? e.clientWidth : '', + height : s ? e.clientHeight : '', + cursor : DOM.getStyle(e, 'cursor', 1) + }); + + DOM.setStyle(id + "_bottom", 'bottom', '-1px'); + + e = 0; + }); + + // Fixes graphics glitch + if (w = this.windows[id]) { + // Fixes rendering bug after resize + w.element.hide(); + w.element.show(); + + // Forced a repaint of the window + //DOM.get(id).style.filter = ''; + + // IE has a bug where images used in CSS won't get loaded + // sometimes when the cache in the browser is disabled + // This fix tries to solve it by loading the images using the image object + each(DOM.select('div,a', id), function(e, i) { + if (e.currentStyle.backgroundImage != 'none') { + img = new Image(); + img.src = e.currentStyle.backgroundImage.replace(/url\(\"(.+)\"\)/, '$1'); + } + }); + + DOM.get(id).style.filter = ''; + } + } + }); + + // Register plugin + tinymce.PluginManager.add('inlinepopups', tinymce.plugins.InlinePopups); +})(); + diff --git a/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/img/alert.gif b/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/img/alert.gif new file mode 100644 index 0000000000..94abd08763 Binary files /dev/null and b/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/img/alert.gif differ diff --git a/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/img/button.gif b/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/img/button.gif new file mode 100644 index 0000000000..e671094cb0 Binary files /dev/null and b/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/img/button.gif differ diff --git a/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif b/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif new file mode 100644 index 0000000000..6baf64ad32 Binary files /dev/null and b/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif differ diff --git a/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif b/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif new file mode 100644 index 0000000000..497307a85a Binary files /dev/null and b/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif differ diff --git a/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/img/corners.gif b/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/img/corners.gif new file mode 100644 index 0000000000..c894b2e835 Binary files /dev/null and b/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/img/corners.gif differ diff --git a/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif b/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif new file mode 100644 index 0000000000..c2a2ad454d Binary files /dev/null and b/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif differ diff --git a/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif b/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif new file mode 100644 index 0000000000..43a735f22c Binary files /dev/null and b/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif differ diff --git a/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/window.css b/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/window.css new file mode 100644 index 0000000000..5e6fd7d3cf --- /dev/null +++ b/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/window.css @@ -0,0 +1,90 @@ +/* Clearlooks 2 */ + +/* Reset */ +.clearlooks2, .clearlooks2 div, .clearlooks2 span, .clearlooks2 a {vertical-align:baseline; text-align:left; position:absolute; border:0; padding:0; margin:0; background:transparent; font-family:Arial,Verdana; font-size:11px; color:#000; text-decoration:none; font-weight:normal; width:auto; height:auto; overflow:hidden; display:block} + +/* General */ +.clearlooks2 {position:absolute; direction:ltr} +.clearlooks2 .mceWrapper {position:static} +.mceEventBlocker {position:fixed; left:0; top:0; background:url(img/horizontal.gif) no-repeat 0 -75px; width:100%; height:100%} +.clearlooks2 .mcePlaceHolder {border:1px solid #000; background:#888; top:0; left:0; opacity:0.5; -ms-filter:'alpha(opacity=50)'; filter:alpha(opacity=50)} +.clearlooks2_modalBlocker {position:fixed; left:0; top:0; width:100%; height:100%; background:#FFF; opacity:0.6; -ms-filter:'alpha(opacity=60)'; filter:alpha(opacity=60); display:none} + +/* Top */ +.clearlooks2 .mceTop, .clearlooks2 .mceTop div {top:0; width:100%; height:23px} +.clearlooks2 .mceTop .mceLeft {width:6px; background:url(img/corners.gif)} +.clearlooks2 .mceTop .mceCenter {right:6px; width:100%; height:23px; background:url(img/horizontal.gif) 12px 0; clip:rect(auto auto auto 12px)} +.clearlooks2 .mceTop .mceRight {right:0; width:6px; height:23px; background:url(img/corners.gif) -12px 0} +.clearlooks2 .mceTop span {width:100%; text-align:center; vertical-align:middle; line-height:23px; font-weight:bold} +.clearlooks2 .mceFocus .mceTop .mceLeft {background:url(img/corners.gif) -6px 0} +.clearlooks2 .mceFocus .mceTop .mceCenter {background:url(img/horizontal.gif) 0 -23px} +.clearlooks2 .mceFocus .mceTop .mceRight {background:url(img/corners.gif) -18px 0} +.clearlooks2 .mceFocus .mceTop span {color:#FFF} + +/* Middle */ +.clearlooks2 .mceMiddle, .clearlooks2 .mceMiddle div {top:0} +.clearlooks2 .mceMiddle {width:100%; height:100%; clip:rect(23px auto auto auto)} +.clearlooks2 .mceMiddle .mceLeft {left:0; width:5px; height:100%; background:url(img/vertical.gif) -5px 0} +.clearlooks2 .mceMiddle span {top:23px; left:5px; width:100%; height:100%; background:#FFF} +.clearlooks2 .mceMiddle .mceRight {right:0; width:5px; height:100%; background:url(img/vertical.gif)} + +/* Bottom */ +.clearlooks2 .mceBottom, .clearlooks2 .mceBottom div {height:6px} +.clearlooks2 .mceBottom {left:0; bottom:0; width:100%} +.clearlooks2 .mceBottom div {top:0} +.clearlooks2 .mceBottom .mceLeft {left:0; width:5px; background:url(img/corners.gif) -34px -6px} +.clearlooks2 .mceBottom .mceCenter {left:5px; width:100%; background:url(img/horizontal.gif) 0 -46px} +.clearlooks2 .mceBottom .mceRight {right:0; width:5px; background: url(img/corners.gif) -34px 0} +.clearlooks2 .mceBottom span {display:none} +.clearlooks2 .mceStatusbar .mceBottom, .clearlooks2 .mceStatusbar .mceBottom div {height:23px} +.clearlooks2 .mceStatusbar .mceBottom .mceLeft {background:url(img/corners.gif) -29px 0} +.clearlooks2 .mceStatusbar .mceBottom .mceCenter {background:url(img/horizontal.gif) 0 -52px} +.clearlooks2 .mceStatusbar .mceBottom .mceRight {background:url(img/corners.gif) -24px 0} +.clearlooks2 .mceStatusbar .mceBottom span {display:block; left:7px; font-family:Arial, Verdana; font-size:11px; line-height:23px} + +/* Actions */ +.clearlooks2 a {width:29px; height:16px; top:3px;} +.clearlooks2 .mceClose {right:6px; background:url(img/buttons.gif) -87px 0} +.clearlooks2 .mceMin {display:none; right:68px; background:url(img/buttons.gif) 0 0} +.clearlooks2 .mceMed {display:none; right:37px; background:url(img/buttons.gif) -29px 0} +.clearlooks2 .mceMax {display:none; right:37px; background:url(img/buttons.gif) -58px 0} +.clearlooks2 .mceMove {display:none;width:100%;cursor:move;background:url(img/corners.gif) no-repeat -100px -100px} +.clearlooks2 .mceMovable .mceMove {display:block} +.clearlooks2 .mceFocus .mceClose {right:6px; background:url(img/buttons.gif) -87px -16px} +.clearlooks2 .mceFocus .mceMin {right:68px; background:url(img/buttons.gif) 0 -16px} +.clearlooks2 .mceFocus .mceMed {right:37px; background:url(img/buttons.gif) -29px -16px} +.clearlooks2 .mceFocus .mceMax {right:37px; background:url(img/buttons.gif) -58px -16px} +.clearlooks2 .mceFocus .mceClose:hover {right:6px; background:url(img/buttons.gif) -87px -32px} +.clearlooks2 .mceFocus .mceClose:hover {right:6px; background:url(img/buttons.gif) -87px -32px} +.clearlooks2 .mceFocus .mceMin:hover {right:68px; background:url(img/buttons.gif) 0 -32px} +.clearlooks2 .mceFocus .mceMed:hover {right:37px; background:url(img/buttons.gif) -29px -32px} +.clearlooks2 .mceFocus .mceMax:hover {right:37px; background:url(img/buttons.gif) -58px -32px} + +/* Resize */ +.clearlooks2 .mceResize {top:auto; left:auto; display:none; width:5px; height:5px; background:url(img/horizontal.gif) no-repeat 0 -75px} +.clearlooks2 .mceResizable .mceResize {display:block} +.clearlooks2 .mceResizable .mceMin, .clearlooks2 .mceMax {display:none} +.clearlooks2 .mceMinimizable .mceMin {display:block} +.clearlooks2 .mceMaximizable .mceMax {display:block} +.clearlooks2 .mceMaximized .mceMed {display:block} +.clearlooks2 .mceMaximized .mceMax {display:none} +.clearlooks2 a.mceResizeN {top:0; left:0; width:100%; cursor:n-resize} +.clearlooks2 a.mceResizeNW {top:0; left:0; cursor:nw-resize} +.clearlooks2 a.mceResizeNE {top:0; right:0; cursor:ne-resize} +.clearlooks2 a.mceResizeW {top:0; left:0; height:100%; cursor:w-resize;} +.clearlooks2 a.mceResizeE {top:0; right:0; height:100%; cursor:e-resize} +.clearlooks2 a.mceResizeS {bottom:0; left:0; width:100%; cursor:s-resize} +.clearlooks2 a.mceResizeSW {bottom:0; left:0; cursor:sw-resize} +.clearlooks2 a.mceResizeSE {bottom:0; right:0; cursor:se-resize} + +/* Alert/Confirm */ +.clearlooks2 .mceButton {font-weight:bold; bottom:10px; width:80px; height:30px; background:url(img/button.gif); line-height:30px; vertical-align:middle; text-align:center; outline:0} +.clearlooks2 .mceMiddle .mceIcon {left:15px; top:35px; width:32px; height:32px} +.clearlooks2 .mceAlert .mceMiddle span, .clearlooks2 .mceConfirm .mceMiddle span {background:transparent;left:60px; top:35px; width:320px; height:50px; font-weight:bold; overflow:auto; white-space:normal} +.clearlooks2 a:hover {font-weight:bold;} +.clearlooks2 .mceAlert .mceMiddle, .clearlooks2 .mceConfirm .mceMiddle {background:#D6D7D5} +.clearlooks2 .mceAlert .mceOk {left:50%; top:auto; margin-left: -40px} +.clearlooks2 .mceAlert .mceIcon {background:url(img/alert.gif)} +.clearlooks2 .mceConfirm .mceOk {left:50%; top:auto; margin-left: -90px} +.clearlooks2 .mceConfirm .mceCancel {left:50%; top:auto} +.clearlooks2 .mceConfirm .mceIcon {background:url(img/confirm.gif)} \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/inlinepopups/template.htm b/plugins/TinyMCE/js/plugins/inlinepopups/template.htm new file mode 100644 index 0000000000..f9ec64219d --- /dev/null +++ b/plugins/TinyMCE/js/plugins/inlinepopups/template.htm @@ -0,0 +1,387 @@ + + + +Template for dialogs + + + + +
+
+
+
+
+
+
+ Blured +
+ +
+
+ Content +
+
+ +
+
+
+
+ Statusbar text. +
+ + + + + + + + + + + + + + +
+
+ +
+
+
+
+
+
+ Focused +
+ +
+
+ Content +
+
+ +
+
+
+
+ Statusbar text. +
+ + + + + + + + + + + + + + +
+
+ +
+
+
+
+
+
+ Statusbar +
+ +
+
+ Content +
+
+ +
+
+
+
+ Statusbar text. +
+ + + + + + + + + + + + + + +
+
+ +
+
+
+
+
+
+ Statusbar, Resizable +
+ +
+
+ Content +
+
+ +
+
+
+
+ Statusbar text. +
+ + + + + + + + + + + + + + +
+
+ +
+
+
+
+
+
+ Resizable, Maximizable +
+ +
+
+ Content +
+
+ +
+
+
+
+ Statusbar text. +
+ + + + + + + + + + + + + + +
+
+ +
+
+
+
+
+
+ Blurred, Maximizable, Statusbar, Resizable +
+ +
+
+ Content +
+
+ +
+
+
+
+ Statusbar text. +
+ + + + + + + + + + + + + + +
+
+ +
+
+
+
+
+
+ Maximized, Maximizable, Minimizable +
+ +
+
+ Content +
+
+ +
+
+
+
+ Statusbar text. +
+ + + + + + + + + + + + + + +
+
+ +
+
+
+
+
+
+ Blured +
+ +
+
+ Content +
+
+ +
+
+
+
+ Statusbar text. +
+ + + + + + + + + + + + + + +
+
+ +
+
+
+
+
+
+ Alert +
+ +
+
+ + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + +
+
+
+ +
+
+
+
+
+ + + Ok + +
+
+ +
+
+
+
+
+
+ Confirm +
+ +
+
+ + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + +
+
+
+ +
+
+
+
+
+ + + Ok + Cancel + +
+
+
+ + + diff --git a/plugins/TinyMCE/js/plugins/insertdatetime/editor_plugin.js b/plugins/TinyMCE/js/plugins/insertdatetime/editor_plugin.js new file mode 100644 index 0000000000..938ce6b17d --- /dev/null +++ b/plugins/TinyMCE/js/plugins/insertdatetime/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.InsertDateTime",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceInsertDate",function(){var d=c._getDateTime(new Date(),a.getParam("plugin_insertdate_dateFormat",a.getLang("insertdatetime.date_fmt")));a.execCommand("mceInsertContent",false,d)});a.addCommand("mceInsertTime",function(){var d=c._getDateTime(new Date(),a.getParam("plugin_insertdate_timeFormat",a.getLang("insertdatetime.time_fmt")));a.execCommand("mceInsertContent",false,d)});a.addButton("insertdate",{title:"insertdatetime.insertdate_desc",cmd:"mceInsertDate"});a.addButton("inserttime",{title:"insertdatetime.inserttime_desc",cmd:"mceInsertTime"})},getInfo:function(){return{longname:"Insert date/time",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/insertdatetime",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_getDateTime:function(e,a){var c=this.editor;function b(g,d){g=""+g;if(g.length-1){a[c].style.zIndex=g[j];a[j].style.zIndex=g[c]}else{if(g[c]>0){a[c].style.zIndex=g[c]-1}}}else{for(f=0;fg[c]){j=f;break}}if(j>-1){a[c].style.zIndex=g[j];a[j].style.zIndex=g[c]}else{a[c].style.zIndex=g[c]+1}}b.execCommand("mceRepaint")},_getParentLayer:function(a){return this.editor.dom.getParent(a,function(b){return b.nodeType==1&&/^(absolute|relative|static)$/i.test(b.style.position)})},_insertLayer:function(){var a=this.editor,b=a.dom.getPos(a.dom.getParent(a.selection.getNode(),"*"));a.dom.add(a.getBody(),"div",{style:{position:"absolute",left:b.x,top:(b.y>20?b.y:20),width:100,height:100},"class":"mceItemVisualAid"},a.selection.getContent()||a.getLang("layer.content"))},_toggleAbsolute:function(){var a=this.editor,b=this._getParentLayer(a.selection.getNode());if(!b){b=a.dom.getParent(a.selection.getNode(),"DIV,P,IMG")}if(b){if(b.style.position.toLowerCase()=="absolute"){a.dom.setStyles(b,{position:"",left:"",top:"",width:"",height:""});a.dom.removeClass(b,"mceItemVisualAid")}else{if(b.style.left==""){b.style.left=20+"px"}if(b.style.top==""){b.style.top=20+"px"}if(b.style.width==""){b.style.width=b.width?(b.width+"px"):"100px"}if(b.style.height==""){b.style.height=b.height?(b.height+"px"):"100px"}b.style.position="absolute";a.addVisual(a.getBody())}a.execCommand("mceRepaint");a.nodeChanged()}}});tinymce.PluginManager.add("layer",tinymce.plugins.Layer)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/layer/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/layer/editor_plugin_src.js new file mode 100644 index 0000000000..d5aa86548c --- /dev/null +++ b/plugins/TinyMCE/js/plugins/layer/editor_plugin_src.js @@ -0,0 +1,212 @@ +/** + * 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.Layer', { + init : function(ed, url) { + var t = this; + + t.editor = ed; + + // Register commands + ed.addCommand('mceInsertLayer', t._insertLayer, t); + + ed.addCommand('mceMoveForward', function() { + t._move(1); + }); + + ed.addCommand('mceMoveBackward', function() { + t._move(-1); + }); + + ed.addCommand('mceMakeAbsolute', function() { + t._toggleAbsolute(); + }); + + // Register buttons + ed.addButton('moveforward', {title : 'layer.forward_desc', cmd : 'mceMoveForward'}); + ed.addButton('movebackward', {title : 'layer.backward_desc', cmd : 'mceMoveBackward'}); + ed.addButton('absolute', {title : 'layer.absolute_desc', cmd : 'mceMakeAbsolute'}); + ed.addButton('insertlayer', {title : 'layer.insertlayer_desc', cmd : 'mceInsertLayer'}); + + ed.onInit.add(function() { + if (tinymce.isIE) + ed.getDoc().execCommand('2D-Position', false, true); + }); + + ed.onNodeChange.add(t._nodeChange, t); + ed.onVisualAid.add(t._visualAid, t); + }, + + getInfo : function() { + return { + longname : 'Layer', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/layer', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + }, + + // Private methods + + _nodeChange : function(ed, cm, n) { + var le, p; + + le = this._getParentLayer(n); + p = ed.dom.getParent(n, 'DIV,P,IMG'); + + if (!p) { + cm.setDisabled('absolute', 1); + cm.setDisabled('moveforward', 1); + cm.setDisabled('movebackward', 1); + } else { + cm.setDisabled('absolute', 0); + cm.setDisabled('moveforward', !le); + cm.setDisabled('movebackward', !le); + cm.setActive('absolute', le && le.style.position.toLowerCase() == "absolute"); + } + }, + + // Private methods + + _visualAid : function(ed, e, s) { + var dom = ed.dom; + + tinymce.each(dom.select('div,p', e), function(e) { + if (/^(absolute|relative|static)$/i.test(e.style.position)) { + if (s) + dom.addClass(e, 'mceItemVisualAid'); + else + dom.removeClass(e, 'mceItemVisualAid'); + } + }); + }, + + _move : function(d) { + var ed = this.editor, i, z = [], le = this._getParentLayer(ed.selection.getNode()), ci = -1, fi = -1, nl; + + nl = []; + tinymce.walk(ed.getBody(), function(n) { + if (n.nodeType == 1 && /^(absolute|relative|static)$/i.test(n.style.position)) + nl.push(n); + }, 'childNodes'); + + // Find z-indexes + for (i=0; i -1) { + nl[ci].style.zIndex = z[fi]; + nl[fi].style.zIndex = z[ci]; + } else { + if (z[ci] > 0) + nl[ci].style.zIndex = z[ci] - 1; + } + } else { + // Move forward + + // Try find a higher one + for (i=0; i z[ci]) { + fi = i; + break; + } + } + + if (fi > -1) { + nl[ci].style.zIndex = z[fi]; + nl[fi].style.zIndex = z[ci]; + } else + nl[ci].style.zIndex = z[ci] + 1; + } + + ed.execCommand('mceRepaint'); + }, + + _getParentLayer : function(n) { + return this.editor.dom.getParent(n, function(n) { + return n.nodeType == 1 && /^(absolute|relative|static)$/i.test(n.style.position); + }); + }, + + _insertLayer : function() { + var ed = this.editor, p = ed.dom.getPos(ed.dom.getParent(ed.selection.getNode(), '*')); + + ed.dom.add(ed.getBody(), 'div', { + style : { + position : 'absolute', + left : p.x, + top : (p.y > 20 ? p.y : 20), + width : 100, + height : 100 + }, + 'class' : 'mceItemVisualAid' + }, ed.selection.getContent() || ed.getLang('layer.content')); + }, + + _toggleAbsolute : function() { + var ed = this.editor, le = this._getParentLayer(ed.selection.getNode()); + + if (!le) + le = ed.dom.getParent(ed.selection.getNode(), 'DIV,P,IMG'); + + if (le) { + if (le.style.position.toLowerCase() == "absolute") { + ed.dom.setStyles(le, { + position : '', + left : '', + top : '', + width : '', + height : '' + }); + + ed.dom.removeClass(le, 'mceItemVisualAid'); + } else { + if (le.style.left == "") + le.style.left = 20 + 'px'; + + if (le.style.top == "") + le.style.top = 20 + 'px'; + + if (le.style.width == "") + le.style.width = le.width ? (le.width + 'px') : '100px'; + + if (le.style.height == "") + le.style.height = le.height ? (le.height + 'px') : '100px'; + + le.style.position = "absolute"; + ed.addVisual(ed.getBody()); + } + + ed.execCommand('mceRepaint'); + ed.nodeChanged(); + } + } + }); + + // Register plugin + tinymce.PluginManager.add('layer', tinymce.plugins.Layer); +})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/legacyoutput/editor_plugin.js b/plugins/TinyMCE/js/plugins/legacyoutput/editor_plugin.js new file mode 100644 index 0000000000..29d43c5244 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/legacyoutput/editor_plugin.js @@ -0,0 +1 @@ +(function(a){a.onAddEditor.addToTop(function(c,b){b.settings.inline_styles=false});a.create("tinymce.plugins.LegacyOutput",{init:function(b){b.onInit.add(function(){var c="p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img",e=a.explode(b.settings.font_size_style_values),d=b.serializer;b.formatter.register({alignleft:{selector:c,attributes:{align:"left"}},aligncenter:{selector:c,attributes:{align:"center"}},alignright:{selector:c,attributes:{align:"right"}},alignfull:{selector:c,attributes:{align:"full"}},bold:{inline:"b"},italic:{inline:"i"},underline:{inline:"u"},strikethrough:{inline:"strike"},fontname:{inline:"font",attributes:{face:"%value"}},fontsize:{inline:"font",attributes:{size:function(f){return a.inArray(e,f.value)+1}}},forecolor:{inline:"font",styles:{color:"%value"}},hilitecolor:{inline:"font",styles:{backgroundColor:"%value"}}});d._setup();a.each("b,i,u,strike".split(","),function(f){var g=d.rules[f];if(!g){d.addRules(f)}});if(!d.rules.font){d.addRules("font[face|size|color|style]")}a.each(c.split(","),function(f){var h=d.rules[f],g;if(h){a.each(h.attribs,function(j,i){if(i.name=="align"){g=true;return false}});if(!g){h.attribs.push({name:"align"})}}});b.onNodeChange.add(function(g,k){var j,f,h,i;f=g.dom.getParent(g.selection.getNode(),"font");if(f){h=f.face;i=f.size}if(j=k.get("fontselect")){j.select(function(l){return l==h})}if(j=k.get("fontsizeselect")){j.select(function(m){var l=a.inArray(e,m.fontSize);return l+1==i})}})})},getInfo:function(){return{longname:"LegacyOutput",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/legacyoutput",version:a.majorVersion+"."+a.minorVersion}}});a.PluginManager.add("legacyoutput",a.plugins.LegacyOutput)})(tinymce); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/legacyoutput/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/legacyoutput/editor_plugin_src.js new file mode 100644 index 0000000000..e852da15ea --- /dev/null +++ b/plugins/TinyMCE/js/plugins/legacyoutput/editor_plugin_src.js @@ -0,0 +1,136 @@ +/** + * 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 + * + * This plugin will force TinyMCE to produce deprecated legacy output such as font elements, u elements, align + * attributes and so forth. There are a few cases where these old items might be needed for example in email applications or with Flash + * + * However you should NOT use this plugin if you are building some system that produces web contents such as a CMS. All these elements are + * not apart of the newer specifications for HTML and XHTML. + */ + +(function(tinymce) { + // Override inline_styles setting to force TinyMCE to produce deprecated contents + tinymce.onAddEditor.addToTop(function(tinymce, editor) { + editor.settings.inline_styles = false; + }); + + // Create the legacy ouput plugin + tinymce.create('tinymce.plugins.LegacyOutput', { + init : function(editor) { + editor.onInit.add(function() { + var alignElements = 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', + fontSizes = tinymce.explode(editor.settings.font_size_style_values), + serializer = editor.serializer; + + // Override some internal formats to produce legacy elements and attributes + editor.formatter.register({ + // Change alignment formats to use the deprecated align attribute + alignleft : {selector : alignElements, attributes : {align : 'left'}}, + aligncenter : {selector : alignElements, attributes : {align : 'center'}}, + alignright : {selector : alignElements, attributes : {align : 'right'}}, + alignfull : {selector : alignElements, attributes : {align : 'full'}}, + + // Change the basic formatting elements to use deprecated element types + bold : {inline : 'b'}, + italic : {inline : 'i'}, + underline : {inline : 'u'}, + strikethrough : {inline : 'strike'}, + + // Change font size and font family to use the deprecated font element + fontname : {inline : 'font', attributes : {face : '%value'}}, + fontsize : { + inline : 'font', + attributes : { + size : function(vars) { + return tinymce.inArray(fontSizes, vars.value) + 1; + } + } + }, + + // Setup font elements for colors as well + forecolor : {inline : 'font', styles : {color : '%value'}}, + hilitecolor : {inline : 'font', styles : {backgroundColor : '%value'}} + }); + + // Force parsing of the serializer rules + serializer._setup(); + + // Check that deprecated elements are allowed if not add them + tinymce.each('b,i,u,strike'.split(','), function(name) { + var rule = serializer.rules[name]; + + if (!rule) + serializer.addRules(name); + }); + + // Add font element if it's missing + if (!serializer.rules["font"]) + serializer.addRules("font[face|size|color|style]"); + + // Add the missing and depreacted align attribute for the serialization engine + tinymce.each(alignElements.split(','), function(name) { + var rule = serializer.rules[name], found; + + if (rule) { + tinymce.each(rule.attribs, function(name, attr) { + if (attr.name == 'align') { + found = true; + return false; + } + }); + + if (!found) + rule.attribs.push({name : 'align'}); + } + }); + + // Listen for the onNodeChange event so that we can do special logic for the font size and font name drop boxes + editor.onNodeChange.add(function(editor, control_manager) { + var control, fontElm, fontName, fontSize; + + // Find font element get it's name and size + fontElm = editor.dom.getParent(editor.selection.getNode(), 'font'); + if (fontElm) { + fontName = fontElm.face; + fontSize = fontElm.size; + } + + // Select/unselect the font name in droplist + if (control = control_manager.get('fontselect')) { + control.select(function(value) { + return value == fontName; + }); + } + + // Select/unselect the font size in droplist + if (control = control_manager.get('fontsizeselect')) { + control.select(function(value) { + var index = tinymce.inArray(fontSizes, value.fontSize); + + return index + 1 == fontSize; + }); + } + }); + }); + }, + + getInfo : function() { + return { + longname : 'LegacyOutput', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/legacyoutput', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('legacyoutput', tinymce.plugins.LegacyOutput); +})(tinymce); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/linkautodetect/changelog.txt b/plugins/TinyMCE/js/plugins/linkautodetect/changelog.txt new file mode 100644 index 0000000000..ecab340ab2 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/linkautodetect/changelog.txt @@ -0,0 +1,9 @@ +0.1 2009-04-15 - initial version +0.11 2009-05-10 - Fix for email addresses with two periods in the domain + were incorrectly converted to http links. Fix submitted + by Ralph Slooten. + Fix for tinyMCE.isIE that needed to be tinymce.isIE. +0.12 2009-06-23 - Fix for URLs that have an HTML anchor identifier in them, such as + http://www.palmpre.org/forums/palm-pre/85-copy-and-paste.html#post457 + Previously, it would create a link to only + http://www.palmpre.org/forums/palm-pre/85-copy-and-paste.html \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/linkautodetect/editor_plugin.js b/plugins/TinyMCE/js/plugins/linkautodetect/editor_plugin.js new file mode 100644 index 0000000000..7e97a78e4a --- /dev/null +++ b/plugins/TinyMCE/js/plugins/linkautodetect/editor_plugin.js @@ -0,0 +1,7 @@ + +(function(){tinymce.create('tinymce.plugins.LinkAutoDetect',{init:function(ed,url){var t=this;t.RE_email=/^[a-z0-9_\-]+(\.[_a-z0-9\-]+)*@([_a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)$/i;t.RE_url=/^((https?|ftp|news):\/\/)?([a-z]([a-z0-9\-]*\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)|(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.%=&]*)?)?(#[a-z][a-z0-9_]*)?$/i;ed.onKeyPress.add(t.onKeyPress,t);ed.onKeyUp.add(t.onKeyUp,t);},getInfo:function(){return{longname:'Link Auto Detect',author:'Ubernote/Shane Tomlinson',authorurl:'http://www.ubernote.com',infourl:'http://www.ubernote.com',version:'0.2'};},onKeyPress:function(ed,ev,o){if(tinymce.isIE){return;} +var s=ed.selection.getSel();var textNode=s.anchorNode;var createLink=function(searchfor,hlink,midStart){var leftText=textNode;var rightText=leftText.splitText(s.anchorOffset);var midText=leftText.splitText(midStart);var midEnd=midText.data.search(searchfor);if(midEnd!=-1){rightText=midText.splitText(midEnd);} +var tag=ed.dom.create('a',{href:hlink},midText.data);var a=midText.parentNode.insertBefore(tag,rightText);s.collapse(rightText,0);ed.dom.remove(midText);};if((ev.which==13||ev.which==32)&&textNode.nodeType==3&&textNode.data.length>3&&textNode.data.indexOf('.')>=0&&!ed.dom.getParent(textNode,'a')){var midStart=textNode.data.substring(0,s.anchorOffset).search(/\S{4,}$/);if(midStart!=-1){var matchData=textNode.data.substring(0,s.anchorOffset).replace(/^.*?(\S*)$/,'$1');var matchURL=matchData.match(this.RE_url);var matchEmail=matchData.match(this.RE_email);if(matchEmail){createLink(/[^a-zA-Z0-9\.@_\-]/,'mailto:'+matchEmail[0],midStart);} +else if(matchURL){createLink(/[^a-zA-Z0-9\._\-\/\&\?#=:@]/,(matchURL[1]?'':'http://')+matchURL[0],midStart);}}}},onKeyUp:function(ed,ev,o){if(tinymce.isIE){return;} +var s=ed.selection.getSel();var textNode=s.anchorNode;var a=ed.dom.getParent(textNode,'a');if(!(ev.which&&(ev.which==13||ev.which==32))&&(ev.which||ev.keyCode==8||ev.keyCode==46)&&(textNode.nodeType==3)&&(a)){var matchEmail=s.anchorNode.data.match(this.RE_email);var matchURL=textNode.data.match(this.RE_url);if(matchEmail){ed.dom.setAttrib(a,'href','mailto:'+textNode.data);} +if(matchURL){ed.dom.setAttrib(a,'href',(matchURL[1]?'':'http://')+matchURL[0]);}}}});tinymce.PluginManager.add('linkautodetect',tinymce.plugins.LinkAutoDetect);})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/linkautodetect/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/linkautodetect/editor_plugin_src.js new file mode 100644 index 0000000000..d2693927c1 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/linkautodetect/editor_plugin_src.js @@ -0,0 +1,141 @@ +/** + * $Id: editor_plugin_src.js 2009-05-10 + * + * @author Ubernote/Shane Tomlinson + * http://www.ubernote.com + * set117@gmail.com + * + * Detect emails and urls as they are typed in Mozilla/Safari/Chrome and Opera + * Borrowed from both Typo3 http://typo3.org/ and Xinha http://xinha.gogo.co.nz/ + * Heavily modified and cleaned up. + * + * Original license info from Xinha at the bottom. + */ + +(function() { + tinymce.create('tinymce.plugins.LinkAutoDetect', { + init : function(ed, url) { + var t = this; + t.RE_email = /^[a-z0-9_\-]+(\.[_a-z0-9\-]+)*@([_a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)$/i; + t.RE_url = /^((https?|ftp|news):\/\/)?([a-z]([a-z0-9\-]*\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)|(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.%=&]*)?)?(#[a-z][a-z0-9_]*)?$/i; + ed.onKeyPress.add( t.onKeyPress, t ); + ed.onKeyUp.add( t.onKeyUp, t ); + }, + + getInfo : function() { + return { + longname : 'Link Auto Detect', + author : 'Ubernote/Shane Tomlinson', + authorurl : 'http://www.ubernote.com', + infourl : 'http://www.ubernote.com', + version : '0.2' + }; + }, + + onKeyPress : function(ed, ev, o) { + if(tinymce.isIE) { + // IE already does auto-detect, so no worries. + return; + } // end if + + var s = ed.selection.getSel(); + var textNode = s.anchorNode; + + var createLink = function (searchfor, hlink, midStart) { + var leftText = textNode; + var rightText = leftText.splitText(s.anchorOffset); + var midText = leftText.splitText(midStart); + var midEnd = midText.data.search(searchfor); + if (midEnd != -1) { + rightText = midText.splitText(midEnd); + } // end if + var tag = ed.dom.create('a', { href: hlink }, midText.data); + var a = midText.parentNode.insertBefore(tag, rightText); + + // We are going to put the cursor into the first position after + // the anchor and let the browser take care of inserting the space/enter. + s.collapse(rightText, 0); + ed.dom.remove(midText); + }; + + // Space or Enter, see if the text just typed looks like a URL, or email address and link it accordingly + if((ev.which == 13 || ev.which == 32) + && textNode.nodeType == 3 && textNode.data.length > 3 + && textNode.data.indexOf('.') >= 0 && !ed.dom.getParent(textNode, 'a')) { + var midStart = textNode.data.substring(0,s.anchorOffset).search(/\S{4,}$/); + if(midStart != -1) { + var matchData = textNode.data.substring(0,s.anchorOffset).replace(/^.*?(\S*)$/, '$1'); + var matchURL = matchData.match(this.RE_url); + var matchEmail = matchData.match(this.RE_email); + if(matchEmail) { + createLink(/[^a-zA-Z0-9\.@_\-]/, 'mailto:' + matchEmail[0], midStart); + } + else if(matchURL) { + createLink( /[^a-zA-Z0-9\._\-\/\&\?#=:@]/, (matchURL[1] ? '' : 'http://') + matchURL[0], midStart); + } + } // end if + } + }, + + onKeyUp : function(ed, ev, o) { + if(tinymce.isIE) { + // IE already does auto-detect, so no worries. + return; + } // end if + + var s = ed.selection.getSel(); + var textNode = s.anchorNode; + var a = ed.dom.getParent(textNode, 'a'); + + if( ! (ev.which && ( ev.which == 13 || ev.which == 32)) + && (ev.which || ev.keyCode == 8 || ev.keyCode == 46) + && (textNode.nodeType == 3) && (a)) { + // See if we might be changing a link + var matchEmail = s.anchorNode.data.match(this.RE_email); + var matchURL = textNode.data.match(this.RE_url); + if(matchEmail) { + ed.dom.setAttrib(a, 'href', 'mailto:' + textNode.data); + } // end if + if(matchURL) { + ed.dom.setAttrib(a, 'href', (matchURL[1] ? '' : 'http://') + matchURL[0]); + } // end if + } // end if + } + }); + + // Register plugin + tinymce.PluginManager.add('linkautodetect', tinymce.plugins.LinkAutoDetect); +})(); + +/* +htmlArea License (based on BSD license) +Copyright (c) 2002-2004, interactivetools.com, inc. +Copyright (c) 2003-2004 dynarch.com +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +2) 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. + +3) Neither the name of interactivetools.com, inc. nor the names of its + contributors may 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. +*/ \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/media/css/content.css b/plugins/TinyMCE/js/plugins/media/css/content.css new file mode 100644 index 0000000000..1bf6a75869 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/media/css/content.css @@ -0,0 +1,6 @@ +.mceItemFlash, .mceItemShockWave, .mceItemQuickTime, .mceItemWindowsMedia, .mceItemRealMedia {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);} diff --git a/plugins/TinyMCE/js/plugins/media/css/media.css b/plugins/TinyMCE/js/plugins/media/css/media.css new file mode 100644 index 0000000000..2d087944de --- /dev/null +++ b/plugins/TinyMCE/js/plugins/media/css/media.css @@ -0,0 +1,16 @@ +#id, #name, #hspace, #vspace, #class_name, #align { width: 100px } +#hspace, #vspace { width: 50px } +#flash_quality, #flash_align, #flash_scale, #flash_salign, #flash_wmode { width: 100px } +#flash_base, #flash_flashvars { width: 240px } +#width, #height { width: 40px } +#src, #media_type { width: 250px } +#class { width: 120px } +#prev { margin: 0; border: 1px solid black; width: 380px; height: 230px; overflow: auto } +.panel_wrapper div.current { height: 390px; overflow: auto } +#flash_options, #shockwave_options, #qt_options, #wmp_options, #rmp_options { display: none } +.mceAddSelectValue { background-color: #DDDDDD } +#qt_starttime, #qt_endtime, #qt_fov, #qt_href, #qt_moveid, #qt_moviename, #qt_node, #qt_pan, #qt_qtsrc, #qt_qtsrcchokespeed, #qt_target, #qt_tilt, #qt_urlsubstituten, #qt_volume { width: 70px } +#wmp_balance, #wmp_baseurl, #wmp_captioningid, #wmp_currentmarker, #wmp_currentposition, #wmp_defaultframe, #wmp_playcount, #wmp_rate, #wmp_uimode, #wmp_volume { width: 70px } +#rmp_console, #rmp_numloop, #rmp_controls, #rmp_scriptcallbacks { width: 70px } +#shockwave_swvolume, #shockwave_swframe, #shockwave_swurl, #shockwave_swstretchvalign, #shockwave_swstretchhalign, #shockwave_swstretchstyle { width: 90px } +#qt_qtsrc { width: 200px } diff --git a/plugins/TinyMCE/js/plugins/media/editor_plugin.js b/plugins/TinyMCE/js/plugins/media/editor_plugin.js new file mode 100644 index 0000000000..4bbe367e36 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/media/editor_plugin.js @@ -0,0 +1 @@ +(function(){var a=tinymce.each;tinymce.create("tinymce.plugins.MediaPlugin",{init:function(b,c){var e=this;e.editor=b;e.url=c;function f(g){return/^(mceItemFlash|mceItemShockWave|mceItemWindowsMedia|mceItemQuickTime|mceItemRealMedia)$/.test(g.className)}b.onPreInit.add(function(){b.serializer.addRules("param[name|value|_mce_value]")});b.addCommand("mceMedia",function(){b.windowManager.open({file:c+"/media.htm",width:430+parseInt(b.getLang("media.delta_width",0)),height:470+parseInt(b.getLang("media.delta_height",0)),inline:1},{plugin_url:c})});b.addButton("media",{title:"media.desc",cmd:"mceMedia"});b.onNodeChange.add(function(h,g,i){g.setActive("media",i.nodeName=="IMG"&&f(i))});b.onInit.add(function(){var g={mceItemFlash:"flash",mceItemShockWave:"shockwave",mceItemWindowsMedia:"windowsmedia",mceItemQuickTime:"quicktime",mceItemRealMedia:"realmedia"};b.selection.onSetContent.add(function(){e._spansToImgs(b.getBody())});b.selection.onBeforeSetContent.add(e._objectsToSpans,e);if(b.settings.content_css!==false){b.dom.loadCSS(c+"/css/content.css")}if(b.theme&&b.theme.onResolveName){b.theme.onResolveName.add(function(h,i){if(i.name=="img"){a(g,function(l,j){if(b.dom.hasClass(i.node,j)){i.name=l;i.title=b.dom.getAttrib(i.node,"title");return false}})}})}if(b&&b.plugins.contextmenu){b.plugins.contextmenu.onContextMenu.add(function(i,h,j){if(j.nodeName=="IMG"&&/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(j.className)){h.add({title:"media.edit",icon:"media",cmd:"mceMedia"})}})}});b.onBeforeSetContent.add(e._objectsToSpans,e);b.onSetContent.add(function(){e._spansToImgs(b.getBody())});b.onPreProcess.add(function(g,i){var h=g.dom;if(i.set){e._spansToImgs(i.node);a(h.select("IMG",i.node),function(k){var j;if(f(k)){j=e._parse(k.title);h.setAttrib(k,"width",h.getAttrib(k,"width",j.width||100));h.setAttrib(k,"height",h.getAttrib(k,"height",j.height||100))}})}if(i.get){a(h.select("IMG",i.node),function(m){var l,j,k;if(g.getParam("media_use_script")){if(f(m)){m.className=m.className.replace(/mceItem/g,"mceTemp")}return}switch(m.className){case"mceItemFlash":l="d27cdb6e-ae6d-11cf-96b8-444553540000";j="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0";k="application/x-shockwave-flash";break;case"mceItemShockWave":l="166b1bca-3f9c-11cf-8075-444553540000";j="http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0";k="application/x-director";break;case"mceItemWindowsMedia":l=g.getParam("media_wmp6_compatible")?"05589fa1-c356-11ce-bf01-00aa0055595a":"6bf52a52-394a-11d3-b153-00c04f79faa6";j="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701";k="application/x-mplayer2";break;case"mceItemQuickTime":l="02bf25d5-8c17-4b23-bc80-d3488abddc6b";j="http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0";k="video/quicktime";break;case"mceItemRealMedia":l="cfcdaa03-8be4-11cf-b84b-0020afbbccfa";j="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0";k="audio/x-pn-realaudio-plugin";break}if(l){h.replace(e._buildObj({classid:l,codebase:j,type:k},m),m)}})}});b.onPostProcess.add(function(g,h){h.content=h.content.replace(/_mce_value=/g,"value=")});function d(g,h){h=new RegExp(h+'="([^"]+)"',"g").exec(g);return h?b.dom.decode(h[1]):""}b.onPostProcess.add(function(g,h){if(g.getParam("media_use_script")){h.content=h.content.replace(/]+>/g,function(j){var i=d(j,"class");if(/^(mceTempFlash|mceTempShockWave|mceTempWindowsMedia|mceTempQuickTime|mceTempRealMedia)$/.test(i)){at=e._parse(d(j,"title"));at.width=d(j,"width");at.height=d(j,"height");j=''; + } + + return im; + }); + } + }); + }, + + getInfo : function() { + return { + longname : 'Media', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/media', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + }, + + // Private methods + _objectsToSpans : function(ed, o) { + var t = this, h = o.content; + + h = h.replace(/]*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi, function(a, b, c) { + var o = t._parse(c); + + return '' + }); + + 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">'); + + o.content = h; + }, + + _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'; + + p.width = o.width = dom.getAttrib(n, 'width') || 100; + p.height = o.height = dom.getAttrib(n, 'height') || 100; + + if (p.src) + p.src = ed.convertURL(p.src, 'src', n); + + 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 + }); + } + + 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; + }, + + _spansToImgs : function(p) { + var t = this, dom = t.editor.dom, im, ci; + + 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, ''); + + switch (ci) { + case 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000': + dom.replace(t._createImg('mceItemFlash', n), n); + break; + + case 'clsid:166b1bca-3f9c-11cf-8075-444553540000': + dom.replace(t._createImg('mceItemShockWave', n), n); + break; + + 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; + + case 'clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b': + dom.replace(t._createImg('mceItemQuickTime', n), n); + break; + + case 'clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa': + dom.replace(t._createImg('mceItemRealMedia', n), n); + break; + + default: + dom.replace(t._createImg('mceItemFlash', n), n); + } + + return; + } + + // 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; + + case 'application/x-director': + dom.replace(t._createImg('mceItemShockWave', n), n); + break; + + case 'application/x-mplayer2': + dom.replace(t._createImg('mceItemWindowsMedia', n), n); + break; + + case 'video/quicktime': + dom.replace(t._createImg('mceItemQuickTime', n), n); + break; + + case 'audio/x-pn-realaudio-plugin': + dom.replace(t._createImg('mceItemRealMedia', n), n); + break; + + default: + dom.replace(t._createImg('mceItemFlash', n), n); + } + } + }); + }, + + _createImg : function(cl, n) { + var im, dom = this.editor.dom, pa = {}, ti = '', args; + + args = ['id', 'name', 'width', 'height', 'bgcolor', 'align', 'flashvars', 'src', 'wmode', 'allowfullscreen', 'quality', '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 + }); + + // Setup base parameters + each(args, function(na) { + var v = dom.getAttrib(n, na); + + if (v) + pa[na] = v; + }); + + // 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'); + }); + + // Use src not movie + if (pa.movie) { + pa.src = pa.movie; + delete pa.movie; + } + + // No src try data + if (!pa.src) { + pa.src = pa.data; + delete pa.data; + } + + // Merge with embed args + n = dom.select('.mceItemEmbed', n)[0]; + if (n) { + each(args, function(na) { + var v = dom.getAttrib(n, na); + + if (v && !pa[na]) + pa[na] = v; + }); + } + + 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, ''); + } + }); + + // Register plugin + tinymce.PluginManager.add('media', tinymce.plugins.MediaPlugin); +})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/media/img/flash.gif b/plugins/TinyMCE/js/plugins/media/img/flash.gif new file mode 100644 index 0000000000..cb192e6ced Binary files /dev/null and b/plugins/TinyMCE/js/plugins/media/img/flash.gif differ diff --git a/plugins/TinyMCE/js/plugins/media/img/flv_player.swf b/plugins/TinyMCE/js/plugins/media/img/flv_player.swf new file mode 100644 index 0000000000..042c2ab969 Binary files /dev/null and b/plugins/TinyMCE/js/plugins/media/img/flv_player.swf differ diff --git a/plugins/TinyMCE/js/plugins/media/img/quicktime.gif b/plugins/TinyMCE/js/plugins/media/img/quicktime.gif new file mode 100644 index 0000000000..3b0499145b Binary files /dev/null and b/plugins/TinyMCE/js/plugins/media/img/quicktime.gif differ diff --git a/plugins/TinyMCE/js/plugins/media/img/realmedia.gif b/plugins/TinyMCE/js/plugins/media/img/realmedia.gif new file mode 100644 index 0000000000..fdfe0b9ac0 Binary files /dev/null and b/plugins/TinyMCE/js/plugins/media/img/realmedia.gif differ diff --git a/plugins/TinyMCE/js/plugins/media/img/shockwave.gif b/plugins/TinyMCE/js/plugins/media/img/shockwave.gif new file mode 100644 index 0000000000..5f235dfc73 Binary files /dev/null and b/plugins/TinyMCE/js/plugins/media/img/shockwave.gif differ diff --git a/plugins/TinyMCE/js/plugins/media/img/trans.gif b/plugins/TinyMCE/js/plugins/media/img/trans.gif new file mode 100644 index 0000000000..388486517f Binary files /dev/null and b/plugins/TinyMCE/js/plugins/media/img/trans.gif differ diff --git a/plugins/TinyMCE/js/plugins/media/img/windowsmedia.gif b/plugins/TinyMCE/js/plugins/media/img/windowsmedia.gif new file mode 100644 index 0000000000..ab50f2d887 Binary files /dev/null and b/plugins/TinyMCE/js/plugins/media/img/windowsmedia.gif differ diff --git a/plugins/TinyMCE/js/plugins/media/js/embed.js b/plugins/TinyMCE/js/plugins/media/js/embed.js new file mode 100644 index 0000000000..f8dc810527 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/media/js/embed.js @@ -0,0 +1,73 @@ +/** + * This script contains embed functions for common plugins. This scripts are complety free to use for any purpose. + */ + +function writeFlash(p) { + writeEmbed( + 'D27CDB6E-AE6D-11cf-96B8-444553540000', + 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0', + 'application/x-shockwave-flash', + p + ); +} + +function writeShockWave(p) { + writeEmbed( + '166B1BCA-3F9C-11CF-8075-444553540000', + 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0', + 'application/x-director', + p + ); +} + +function writeQuickTime(p) { + writeEmbed( + '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B', + 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0', + 'video/quicktime', + p + ); +} + +function writeRealMedia(p) { + writeEmbed( + 'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA', + 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0', + 'audio/x-pn-realaudio-plugin', + p + ); +} + +function writeWindowsMedia(p) { + p.url = p.src; + writeEmbed( + '6BF52A52-394A-11D3-B153-00C04F79FAA6', + 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701', + 'application/x-mplayer2', + p + ); +} + +function writeEmbed(cls, cb, mt, p) { + var h = '', n; + + h += ''; + + h += ''); + +function init() { + var pl = "", f, val; + var type = "flash", fe, i; + + ed = tinyMCEPopup.editor; + + tinyMCEPopup.resizeToInnerSize(); + f = document.forms[0] + + fe = ed.selection.getNode(); + if (/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(ed.dom.getAttrib(fe, 'class'))) { + pl = fe.title; + + switch (ed.dom.getAttrib(fe, 'class')) { + case 'mceItemFlash': + type = 'flash'; + break; + + 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; + } + + 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; + } + } + } + + 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 += ' + + + {#media_dlg.title} + + + + + + + + + +
+ + +
+
+
+ {#media_dlg.general} + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
 
+
+ + + + + + +
x   
+
+
+ +
+ {#media_dlg.preview} + +
+
+ +
+
+ {#media_dlg.advanced} + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
 
+
+
+ +
+ {#media_dlg.flash_options} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + + + + + + + +
+
+ +
+ {#media_dlg.flv_options} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+
+ +
+ {#media_dlg.qt_options} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+  
+ + + + + +
 
+
+
+ +
+ {#media_dlg.wmp_options} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+
+ +
+ {#media_dlg.rmp_options} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+   +
+
+ +
+ {#media_dlg.shockwave_options} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+
+
+
+ +
+ + +
+
+ + diff --git a/plugins/TinyMCE/js/plugins/nonbreaking/editor_plugin.js b/plugins/TinyMCE/js/plugins/nonbreaking/editor_plugin.js new file mode 100644 index 0000000000..eb40a6a39c --- /dev/null +++ b/plugins/TinyMCE/js/plugins/nonbreaking/editor_plugin.js @@ -0,0 +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 diff --git a/plugins/TinyMCE/js/plugins/nonbreaking/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/nonbreaking/editor_plugin_src.js new file mode 100644 index 0000000000..ca83ee26e5 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/nonbreaking/editor_plugin_src.js @@ -0,0 +1,53 @@ +/** + * 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.Nonbreaking', { + init : function(ed, url) { + var t = this; + + t.editor = ed; + + // Register commands + ed.addCommand('mceNonBreaking', function() { + ed.execCommand('mceInsertContent', false, (ed.plugins.visualchars && ed.plugins.visualchars.state) ? ' ' : ' '); + }); + + // Register buttons + ed.addButton('nonbreaking', {title : 'nonbreaking.nonbreaking_desc', cmd : 'mceNonBreaking'}); + + if (ed.getParam('nonbreaking_force_tab')) { + ed.onKeyDown.add(function(ed, e) { + if (tinymce.isIE && e.keyCode == 9) { + ed.execCommand('mceNonBreaking'); + ed.execCommand('mceNonBreaking'); + ed.execCommand('mceNonBreaking'); + tinymce.dom.Event.cancel(e); + } + }); + } + }, + + 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 + }; + } + + // Private methods + }); + + // Register plugin + tinymce.PluginManager.add('nonbreaking', tinymce.plugins.Nonbreaking); +})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/noneditable/editor_plugin.js b/plugins/TinyMCE/js/plugins/noneditable/editor_plugin.js new file mode 100644 index 0000000000..9945cd8580 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/noneditable/editor_plugin.js @@ -0,0 +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 diff --git a/plugins/TinyMCE/js/plugins/noneditable/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/noneditable/editor_plugin_src.js new file mode 100644 index 0000000000..656c971b8c --- /dev/null +++ b/plugins/TinyMCE/js/plugins/noneditable/editor_plugin_src.js @@ -0,0 +1,90 @@ +/** + * 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() { + var Event = tinymce.dom.Event; + + tinymce.create('tinymce.plugins.NonEditablePlugin', { + init : function(ed, url) { + var t = this, editClass, nonEditClass; + + t.editor = ed; + editClass = ed.getParam("noneditable_editable_class", "mceEditable"); + nonEditClass = ed.getParam("noneditable_noneditable_class", "mceNonEditable"); + + ed.onNodeChange.addToTop(function(ed, cm, n) { + var sc, ec; + + // Block if start or end is inside a non editable element + sc = ed.dom.getParent(ed.selection.getStart(), function(n) { + return ed.dom.hasClass(n, nonEditClass); + }); + + ec = ed.dom.getParent(ed.selection.getEnd(), function(n) { + return ed.dom.hasClass(n, nonEditClass); + }); + + // Block or unblock + if (sc || ec) { + t._setDisabled(1); + return false; + } else + t._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(ed, e) { + var k = e.keyCode; + + // Don't block arrow keys, pg up/down, and F1-F12 + if ((k > 32 && k < 41) || (k > 111 && k < 124)) + return; + + return Event.cancel(e); + }, + + _setDisabled : function(s) { + var t = this, ed = t.editor; + + tinymce.each(ed.controlManager.controls, function(c) { + c.setDisabled(s); + }); + + if (s !== t.disabled) { + if (s) { + ed.onKeyDown.addToTop(t._block); + ed.onKeyPress.addToTop(t._block); + ed.onKeyUp.addToTop(t._block); + ed.onPaste.addToTop(t._block); + } else { + ed.onKeyDown.remove(t._block); + ed.onKeyPress.remove(t._block); + ed.onKeyUp.remove(t._block); + ed.onPaste.remove(t._block); + } + + t.disabled = s; + } + } + }); + + // Register plugin + tinymce.PluginManager.add('noneditable', tinymce.plugins.NonEditablePlugin); +})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/pagebreak/css/content.css b/plugins/TinyMCE/js/plugins/pagebreak/css/content.css new file mode 100644 index 0000000000..c949d58cc4 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/pagebreak/css/content.css @@ -0,0 +1 @@ +.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 new file mode 100644 index 0000000000..a212f69633 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/pagebreak/editor_plugin.js @@ -0,0 +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 diff --git a/plugins/TinyMCE/js/plugins/pagebreak/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/pagebreak/editor_plugin_src.js new file mode 100644 index 0000000000..4e1eb0a7aa --- /dev/null +++ b/plugins/TinyMCE/js/plugins/pagebreak/editor_plugin_src.js @@ -0,0 +1,77 @@ +/** + * 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.PageBreakPlugin', { + init : function(ed, url) { + var pb = '', cls = 'mcePageBreak', sep = ed.getParam('pagebreak_separator', ''), pbRE; + + pbRE = new RegExp(sep.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g, function(a) {return '\\' + a;}), 'g'); + + // Register commands + ed.addCommand('mcePageBreak', function() { + ed.execCommand('mceInsertContent', 0, pb); + }); + + // Register buttons + 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)) + o.name = 'pagebreak'; + }); + } + }); + + ed.onClick.add(function(ed, e) { + e = e.target; + + if (e.nodeName === 'IMG' && ed.dom.hasClass(e, cls)) + ed.selection.select(e); + }); + + ed.onNodeChange.add(function(ed, cm, n) { + cm.setActive('pagebreak', n.nodeName === 'IMG' && ed.dom.hasClass(n, cls)); + }); + + ed.onBeforeSetContent.add(function(ed, o) { + o.content = o.content.replace(pbRE, pb); + }); + + ed.onPostProcess.add(function(ed, o) { + if (o.get) + o.content = o.content.replace(/]+>/g, function(im) { + if (im.indexOf('class="mcePageBreak') !== -1) + im = sep; + + return im; + }); + }); + }, + + 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 + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('pagebreak', tinymce.plugins.PageBreakPlugin); +})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/pagebreak/img/pagebreak.gif b/plugins/TinyMCE/js/plugins/pagebreak/img/pagebreak.gif new file mode 100644 index 0000000000..acdf4085f3 Binary files /dev/null and b/plugins/TinyMCE/js/plugins/pagebreak/img/pagebreak.gif differ diff --git a/plugins/TinyMCE/js/plugins/pagebreak/img/trans.gif b/plugins/TinyMCE/js/plugins/pagebreak/img/trans.gif new file mode 100644 index 0000000000..388486517f Binary files /dev/null and b/plugins/TinyMCE/js/plugins/pagebreak/img/trans.gif differ diff --git a/plugins/TinyMCE/js/plugins/paste/editor_plugin.js b/plugins/TinyMCE/js/plugins/paste/editor_plugin.js new file mode 100644 index 0000000000..3785ab2d09 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/paste/editor_plugin.js @@ -0,0 +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

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

$1

"); + } + + 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 + ]); + } + + process([ + // Word comments like conditional comments etc + //gi, + + // Remove comments, scripts (e.g., msoShowComment), XML tag, VML content, MS Office namespaced tags, and a few other tags + /<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi, + + // Convert into for line-though + [/<(\/?)s>/gi, "<$1strike>"], + + // Replace nsbp entites to char since it's easier to handle + [/ /gi, "\u00a0"] + ]); + + // Remove bad attributes, with or without quotes, ensuring that attribute text is really inside a tag. + // If JavaScript had a RegExp look-behind, we could have integrated this with the last process() array and got rid of the loop. But alas, it does not, so we cannot. + do { + len = h.length; + h = h.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi, "$1"); + } while (len != h.length); + + // Remove all spans if no styles is to be retained + if (getParam(ed, "paste_retain_style_properties").replace(/^none$/i, "").length == 0) { + h = h.replace(/<\/?span[^>]*>/gi, ""); + } else { + // We're keeping styles, so at least clean them up. + // CSS Reference: http://msdn.microsoft.com/en-us/library/aa155477.aspx + + process([ + // Convert ___ to string of alternating breaking/non-breaking spaces of same length + [/([\s\u00a0]*)<\/span>/gi, + function(str, spaces) { + return (spaces.length > 0)? spaces.replace(/./, " ").slice(Math.floor(spaces.length/2)).split("").join("\u00a0") : ""; + } + ], + + // Examine all styles: delete junk, transform some, and keep the rest + [/(<[a-z][^>]*)\sstyle="([^"]*)"/gi, + function(str, tag, style) { + var n = [], + i = 0, + s = explode(trim(style).replace(/"/gi, "'"), ";"); + + // Examine each style definition within the tag's style attribute + each(s, function(v) { + var name, value, + parts = explode(v, ":"); + + function ensureUnits(v) { + return v + ((v !== "0") && (/\d$/.test(v)))? "px" : ""; + } + + if (parts.length == 2) { + name = parts[0].toLowerCase(); + value = parts[1].toLowerCase(); + + // Translate certain MS Office styles into their CSS equivalents + switch (name) { + 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": + n[i++] = name.replace(/^mso-|-alt$/g, "") + ":" + ensureUnits(value); + return; + + case "horiz-align": + n[i++] = "text-align:" + value; + return; + + case "vert-align": + n[i++] = "vertical-align:" + value; + return; + + case "font-color": + case "mso-foreground": + n[i++] = "color:" + value; + return; + + case "mso-background": + case "mso-highlight": + n[i++] = "background:" + value; + return; + + case "mso-default-height": + n[i++] = "min-height:" + ensureUnits(value); + return; + + case "mso-default-width": + n[i++] = "min-width:" + ensureUnits(value); + return; + + case "mso-padding-between-alt": + n[i++] = "border-collapse:separate;border-spacing:" + ensureUnits(value); + return; + + case "text-line-through": + if ((value == "single") || (value == "double")) { + n[i++] = "text-decoration:line-through"; + } + return; + + case "mso-zero-height": + if (value == "yes") { + n[i++] = "display:none"; + } + return; + } + + // Eliminate all MS Office style definitions that have no CSS equivalent by examining the first characters in the name + 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(name)) { + return; + } + + // If it reached this point, it must be a valid CSS style + n[i++] = name + ":" + parts[1]; // Lower-case name, but keep value case + } + }); + + // If style attribute contained any valid styles the re-write it; otherwise delete style attribute. + if (i > 0) { + return tag + ' style="' + n.join(';') + '"'; + } else { + return tag; + } + } + ] + ]); + } + } + + // Replace headers with + if (getParam(ed, "paste_convert_headers_to_strong")) { + process([ + [/]*>/gi, "

"], + [/<\/h[1-6][^>]*>/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"); + + if (stripClass !== "none") { + function removeClasses(match, g1) { + if (stripClass === "all") + return ''; + + var cls = grep(explode(g1.replace(/^(["'])(.*)\1$/, "$2"), " "), + function(v) { + return (/^(?!mso)/i.test(v)); + } + ); + + return cls.length ? ' class="' + cls.join(" ") + '"' : ''; + }; + + h = h.replace(/ class="([^"]+)"/gi, removeClasses); + h = h.replace(/ class=(\w+)/gi, removeClasses); + } + + // Remove spans option + if (getParam(ed, "paste_remove_spans")) { + h = h.replace(/<\/?span[^>]*>/gi, ""); + } + + //console.log('After preprocess:' + h); + + o.content = h; + }, + + /** + * Various post process items. + */ + _postProcess : function(pl, o) { + var t = this, ed = t.editor, dom = ed.dom, styleProps; + + if (o.wordContent) { + // Remove named anchors or TOC links + each(dom.select('a', o.node), function(a) { + if (!a.href || a.href.indexOf('#_Toc') != -1) + dom.remove(a, 1); + }); + + if (getParam(ed, "paste_convert_middot_lists")) { + t._convertLists(pl, o); + } + + // Process styles + styleProps = getParam(ed, "paste_retain_style_properties"); // retained properties + + // Process only if a string was specified and not equal to "all" or "*" + if ((tinymce.is(styleProps, "string")) && (styleProps !== "all") && (styleProps !== "*")) { + styleProps = tinymce.explode(styleProps.replace(/^none$/i, "")); + + // Retains some style properties + each(dom.select('*', o.node), function(el) { + var newStyle = {}, npc = 0, i, sp, sv; + + // Store a subset of the existing styles + if (styleProps) { + for (i = 0; i < styleProps.length; i++) { + sp = styleProps[i]; + sv = dom.getStyle(el, sp); + + if (sv) { + newStyle[sp] = sv; + npc++; + } + } + } + + // Remove all of the existing styles + dom.setAttrib(el, 'style', ''); + + if (styleProps && npc > 0) + dom.setStyles(el, newStyle); // Add back the stored subset of styles + else // Remove empty span tags that do not have class attributes + if (el.nodeName == 'SPAN' && !el.className) + dom.remove(el, true); + }); + } + } + + // Remove all style information or only specifically on WebKit to avoid the style bug on that browser + 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'); + }); + } 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'); + }); + } + } + }, + + /** + * Converts the most common bullet and number formats in Office into a real semantic UL/LI list. + */ + _convertLists : function(pl, o) { + var dom = pl.editor.dom, listElm, li, lastMargin = -1, margin, levels = [], lastType, html; + + // Convert middot lists into real semantic lists + each(dom.select('p', o.node), function(p) { + var sib, val = '', type, html, idx, parents; + + // Get text node value at beginning of paragraph + for (sib = p.firstChild; sib && sib.nodeType == 3; sib = sib.nextSibling) + val += sib.nodeValue; + + 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)) + type = 'ul'; + + // Detect ordered lists 1., a. or ixv. + if (/^__MCE_ITEM__\s*\w+\.\s*\u00a0{2,}/.test(val)) + type = 'ol'; + + // Check if node value matches the list pattern: o   + if (type) { + margin = parseFloat(p.style.marginLeft || 0); + + if (margin > lastMargin) + levels.push(margin); + + if (!listElm || type != lastType) { + listElm = dom.create(type); + dom.insertAfter(listElm, p); + } else { + // Nested list element + if (margin > lastMargin) { + listElm = li.appendChild(dom.create(type)); + } else if (margin < lastMargin) { + // Find parent level based on margin value + idx = tinymce.inArray(levels, margin); + parents = dom.getParents(listElm.parentNode, type); + listElm = parents[parents.length - 1 - idx] || listElm; + } + } + + // Remove middot or number spans if they exists + each(dom.select('span', p), function(span) { + var html = span.innerHTML.replace(/<\/?\w+[^>]*>/gi, ''); + + // Remove span with the middot or the number + if (type == 'ul' && /^[\u2022\u00b7\u00a7\u00d8o]/.test(html)) + dom.remove(span); + else if (/^[\s\S]*\w+\.( |\u00a0)*\s*/.test(html)) + dom.remove(span); + }); + + html = p.innerHTML; + + // Remove middot/list items + if (type == 'ul') + html = p.innerHTML.replace(/__MCE_ITEM__/g, '').replace(/^[\u2022\u00b7\u00a7\u00d8o]\s*( |\u00a0)+\s*/, ''); + else + html = p.innerHTML.replace(/__MCE_ITEM__/g, '').replace(/^\s*\w+\.( |\u00a0)+\s*/, ''); + + // Create li and add paragraph data into the new li + li = listElm.appendChild(dom.create('li', 0, html)); + dom.remove(p); + + lastMargin = margin; + lastType = type; + } else + listElm = lastMargin = 0; // End list element + }); + + // Remove any left over makers + html = o.node.innerHTML; + if (html.indexOf('__MCE_ITEM__') != -1) + 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. + */ + _insert : function(h, skip_undo) { + var ed = this.editor, r = ed.selection.getRng(); + + // First delete the contents seems to work better on WebKit when the selection spans multiple list items or multiple table cells. + 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}); + }, + + /** + * Instead of the old plain text method which tried to re-create a paste operation, the + * new approach adds a plain text mode toggle switch that changes the behavior of paste. + * This function is passed the same input that the regular paste plugin produces. + * It performs additional scrubbing and produces (and inserts) the plain text. + * This approach leverages all of the great existing functionality in the paste + * plugin, and requires minimal changes to add the new functionality. + * Speednet - June 2009 + */ + _insertPlainText : function(ed, dom, h) { + var i, len, pos, rpos, node, breakElms, before, after, + w = ed.getWin(), + d = ed.getDoc(), + sel = ed.selection, + is = tinymce.is, + inArray = tinymce.inArray, + linebr = getParam(ed, "paste_text_linebreaktype"), + rl = getParam(ed, "paste_text_replacements"); + + function process(items) { + each(items, function(v) { + if (v.constructor == RegExp) + h = h.replace(v, ""); + else + h = h.replace(v[0], v[1]); + }); + }; + + 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([ + /[\n\r]+/g + ]); + } else { + // Otherwise just get rid of carriage returns (only need linefeeds) + process([ + /\r+/g + ]); + } + + process([ + [/<\/(?:p|h[1-6]|ul|ol|dl|table|div|blockquote|fieldset|pre|address|center)>/gi, "\n\n"], // Block tags get a blank line after them + [/]*>|<\/tr>/gi, "\n"], // Single linebreak for
tags and table rows + [/<\/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); + + // Delete any highlighted text before pasting + if (!sel.isCollapsed()) { + d.execCommand("Delete", false, null); + } + + // Perform default or custom replacements + if (is(rl, "array") || (is(rl, "array"))) { + process(rl); + } + else if (is(rl, "string")) { + process(new RegExp(rl, "gi")); + } + + // Treat paragraphs as specified in the config + if (linebr == "none") { + process([ + [/\n+/g, " "] + ]); + } + else if (linebr == "br") { + process([ + [/\n/g, "
"] + ]); + } + else { + process([ + /^\s+|\s+$/g, + [/\n\n/g, "

"], + [/\n/g, "
"] + ]); + } + + // This next piece of code handles the situation where we're pasting more than one paragraph of plain + // text, and we are pasting the content into the middle of a block node in the editor. The block + // node gets split at the selection point into "Para A" and "Para B" (for the purposes of explaining). + // The first paragraph of the pasted text is appended to "Para A", and the last paragraph of the + // pasted text is prepended to "Para B". Any other paragraphs of pasted text are placed between + // "Para A" and "Para B". This code solves a host of problems with the original plain text plugin and + // now handles styles correctly. (Pasting plain text into a styled paragraph is supposed to make the + // plain text take the same style as the existing paragraph.) + if ((pos = h.indexOf("

")) != -1) { + rpos = h.lastIndexOf("

"); + node = sel.getNode(); + breakElms = []; // Get list of elements to break + + do { + if (node.nodeType == 1) { + // Don't break tables and break at body + if (node.nodeName == "TD" || node.nodeName == "BODY") { + break; + } + + breakElms[breakElms.length] = node; + } + } while (node = node.parentNode); + + // Are we in the middle of a block node? + if (breakElms.length > 0) { + before = h.substring(0, pos); + after = ""; + + for (i=0, len=breakElms.length; i"; + after += "<" + breakElms[breakElms.length-i-1].nodeName.toLowerCase() + ">"; + } + + if (pos == rpos) { + h = before + after + h.substring(pos+7); + } + else { + h = before + h.substring(pos+4, rpos+4) + after + h.substring(rpos+7); + } + } + } + + // Insert content at the caret, plus add a marker for repositioning the caret + ed.execCommand("mceInsertRawHTML", false, h + ' '); + + // Reposition the caret to the marker, which was placed immediately after the inserted content. + // Needs to be done asynchronously (in window.setTimeout) or else it doesn't work in all browsers. + // The second part of the code scrolls the content up if the caret is positioned off-screen. + // This is only necessary for WebKit browsers, but it doesn't hurt to use for all. + window.setTimeout(function() { + var marker = dom.get('_plain_text_marker'), + elm, vp, y, elmHeight; + + sel.select(marker, false); + d.execCommand("Delete", false, null); + marker = null; + + // Get element, position and height + elm = sel.getStart(); + vp = dom.getViewPort(w); + y = 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)) { + d.body.scrollTop = y < vp.y ? y : y - vp.h + 25; + } + }, 0); + } + }, + + /** + * This method will open the old style paste dialogs. Some users might want the old behavior but still use the new cleanup engine. + */ + _legacySupport : function() { + var t = this, ed = t.editor; + + // Register command(s) for backwards compatibility + ed.addCommand("mcePasteWord", function() { + ed.windowManager.open({ + file: t.url + "/pasteword.htm", + width: parseInt(getParam(ed, "paste_dialog_width")), + height: parseInt(getParam(ed, "paste_dialog_height")), + inline: 1 + }); + }); + + if (getParam(ed, "paste_text_use_dialog")) { + ed.addCommand("mcePasteText", function() { + ed.windowManager.open({ + file : t.url + "/pastetext.htm", + width: parseInt(getParam(ed, "paste_dialog_width")), + height: parseInt(getParam(ed, "paste_dialog_height")), + inline : 1 + }); + }); + } + + // Register button for backwards compatibility + ed.addButton("pasteword", {title : "paste.paste_word_desc", cmd : "mcePasteWord"}); + } + }); + + // Register plugin + tinymce.PluginManager.add("paste", tinymce.plugins.PastePlugin); +})(); diff --git a/plugins/TinyMCE/js/plugins/paste/js/pastetext.js b/plugins/TinyMCE/js/plugins/paste/js/pastetext.js new file mode 100644 index 0000000000..c524f9eb03 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/paste/js/pastetext.js @@ -0,0 +1,36 @@ +tinyMCEPopup.requireLangPack(); + +var PasteTextDialog = { + init : function() { + this.resize(); + }, + + insert : function() { + var h = tinyMCEPopup.dom.encode(document.getElementById('content').value), lines; + + // Convert linebreaks into paragraphs + if (document.getElementById('linebreaks').checked) { + lines = h.split(/\r?\n/); + if (lines.length > 1) { + h = ''; + tinymce.each(lines, function(row) { + h += '

' + row + '

'; + }); + } + } + + tinyMCEPopup.editor.execCommand('mceInsertClipboardContent', false, {content : h}); + tinyMCEPopup.close(); + }, + + resize : function() { + var vp = tinyMCEPopup.dom.getViewPort(window), el; + + el = document.getElementById('content'); + + el.style.width = (vp.w - 20) + 'px'; + el.style.height = (vp.h - 90) + 'px'; + } +}; + +tinyMCEPopup.onInit.add(PasteTextDialog.init, PasteTextDialog); diff --git a/plugins/TinyMCE/js/plugins/paste/js/pasteword.js b/plugins/TinyMCE/js/plugins/paste/js/pasteword.js new file mode 100644 index 0000000000..a52731c368 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/paste/js/pasteword.js @@ -0,0 +1,51 @@ +tinyMCEPopup.requireLangPack(); + +var PasteWordDialog = { + init : function() { + var ed = tinyMCEPopup.editor, el = document.getElementById('iframecontainer'), ifr, doc, css, cssHTML = ''; + + // Create iframe + el.innerHTML = ''; + ifr = document.getElementById('iframe'); + doc = ifr.contentWindow.document; + + // Force absolute CSS urls + css = [ed.baseURI.toAbsolute("themes/" + ed.settings.theme + "/skins/" + ed.settings.skin + "/content.css")]; + css = css.concat(tinymce.explode(ed.settings.content_css) || []); + tinymce.each(css, function(u) { + cssHTML += ''; + }); + + // Write content into iframe + doc.open(); + doc.write('' + cssHTML + ''); + doc.close(); + + doc.designMode = 'on'; + this.resize(); + + window.setTimeout(function() { + ifr.contentWindow.focus(); + }, 10); + }, + + insert : function() { + var h = document.getElementById('iframe').contentWindow.document.body.innerHTML; + + tinyMCEPopup.editor.execCommand('mceInsertClipboardContent', false, {content : h, wordContent : true}); + tinyMCEPopup.close(); + }, + + resize : function() { + var vp = tinyMCEPopup.dom.getViewPort(window), el; + + el = document.getElementById('iframe'); + + if (el) { + el.style.width = (vp.w - 20) + 'px'; + el.style.height = (vp.h - 90) + 'px'; + } + } +}; + +tinyMCEPopup.onInit.add(PasteWordDialog.init, PasteWordDialog); diff --git a/plugins/TinyMCE/js/plugins/paste/langs/en_dlg.js b/plugins/TinyMCE/js/plugins/paste/langs/en_dlg.js new file mode 100644 index 0000000000..eeac778960 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/paste/langs/en_dlg.js @@ -0,0 +1,5 @@ +tinyMCE.addI18n('en.paste_dlg',{ +text_title:"Use CTRL+V on your keyboard to paste the text into the window.", +text_linebreaks:"Keep linebreaks", +word_title:"Use CTRL+V on your keyboard to paste the text into the window." +}); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/paste/pastetext.htm b/plugins/TinyMCE/js/plugins/paste/pastetext.htm new file mode 100644 index 0000000000..b655945476 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/paste/pastetext.htm @@ -0,0 +1,27 @@ + + + {#paste.paste_text_desc} + + + + +
+
{#paste.paste_text_desc}
+ +
+ +
+ +
+ +
{#paste_dlg.text_title}
+ + + +
+ + +
+
+ + \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/paste/pasteword.htm b/plugins/TinyMCE/js/plugins/paste/pasteword.htm new file mode 100644 index 0000000000..0f6bb41210 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/paste/pasteword.htm @@ -0,0 +1,21 @@ + + + {#paste.paste_word_desc} + + + + +
+
{#paste.paste_word_desc}
+ +
{#paste_dlg.word_title}
+ +
+ +
+ + +
+
+ + diff --git a/plugins/TinyMCE/js/plugins/preview/editor_plugin.js b/plugins/TinyMCE/js/plugins/preview/editor_plugin.js new file mode 100644 index 0000000000..507909c5f0 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/preview/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.Preview",{init:function(a,b){var d=this,c=tinymce.explode(a.settings.content_css);d.editor=a;tinymce.each(c,function(f,e){c[e]=a.documentBaseURI.toAbsolute(f)});a.addCommand("mcePreview",function(){a.windowManager.open({file:a.getParam("plugin_preview_pageurl",b+"/preview.html"),width:parseInt(a.getParam("plugin_preview_width","550")),height:parseInt(a.getParam("plugin_preview_height","600")),resizable:"yes",scrollbars:"yes",popup_css:c?c.join(","):a.baseURI.toAbsolute("themes/"+a.settings.theme+"/skins/"+a.settings.skin+"/content.css"),inline:a.getParam("plugin_preview_inline",1)},{base:a.documentBaseURI.getURI()})});a.addButton("preview",{title:"preview.preview_desc",cmd:"mcePreview"})},getInfo:function(){return{longname:"Preview",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/preview",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("preview",tinymce.plugins.Preview)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/preview/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/preview/editor_plugin_src.js new file mode 100644 index 0000000000..80f00f0d9f --- /dev/null +++ b/plugins/TinyMCE/js/plugins/preview/editor_plugin_src.js @@ -0,0 +1,53 @@ +/** + * 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.Preview', { + init : function(ed, url) { + var t = this, css = tinymce.explode(ed.settings.content_css); + + t.editor = ed; + + // Force absolute CSS urls + tinymce.each(css, function(u, k) { + css[k] = ed.documentBaseURI.toAbsolute(u); + }); + + ed.addCommand('mcePreview', function() { + ed.windowManager.open({ + file : ed.getParam("plugin_preview_pageurl", url + "/preview.html"), + width : parseInt(ed.getParam("plugin_preview_width", "550")), + height : parseInt(ed.getParam("plugin_preview_height", "600")), + resizable : "yes", + scrollbars : "yes", + popup_css : css ? css.join(',') : ed.baseURI.toAbsolute("themes/" + ed.settings.theme + "/skins/" + ed.settings.skin + "/content.css"), + inline : ed.getParam("plugin_preview_inline", 1) + }, { + base : ed.documentBaseURI.getURI() + }); + }); + + ed.addButton('preview', {title : 'preview.preview_desc', cmd : 'mcePreview'}); + }, + + getInfo : function() { + return { + longname : 'Preview', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/preview', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('preview', tinymce.plugins.Preview); +})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/preview/example.html b/plugins/TinyMCE/js/plugins/preview/example.html new file mode 100644 index 0000000000..b2c3d90ce0 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/preview/example.html @@ -0,0 +1,28 @@ + + + + + +Example of a custom preview page + + + +Editor contents:
+
+ +
+ + + diff --git a/plugins/TinyMCE/js/plugins/preview/jscripts/embed.js b/plugins/TinyMCE/js/plugins/preview/jscripts/embed.js new file mode 100644 index 0000000000..f8dc810527 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/preview/jscripts/embed.js @@ -0,0 +1,73 @@ +/** + * This script contains embed functions for common plugins. This scripts are complety free to use for any purpose. + */ + +function writeFlash(p) { + writeEmbed( + 'D27CDB6E-AE6D-11cf-96B8-444553540000', + 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0', + 'application/x-shockwave-flash', + p + ); +} + +function writeShockWave(p) { + writeEmbed( + '166B1BCA-3F9C-11CF-8075-444553540000', + 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0', + 'application/x-director', + p + ); +} + +function writeQuickTime(p) { + writeEmbed( + '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B', + 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0', + 'video/quicktime', + p + ); +} + +function writeRealMedia(p) { + writeEmbed( + 'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA', + 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0', + 'audio/x-pn-realaudio-plugin', + p + ); +} + +function writeWindowsMedia(p) { + p.url = p.src; + writeEmbed( + '6BF52A52-394A-11D3-B153-00C04F79FAA6', + 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701', + 'application/x-mplayer2', + p + ); +} + +function writeEmbed(cls, cb, mt, p) { + var h = '', n; + + h += ''; + + h += ' + + + + + +{#preview.preview_desc} + + + + + diff --git a/plugins/TinyMCE/js/plugins/print/editor_plugin.js b/plugins/TinyMCE/js/plugins/print/editor_plugin.js new file mode 100644 index 0000000000..b5b3a55edf --- /dev/null +++ b/plugins/TinyMCE/js/plugins/print/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.Print",{init:function(a,b){a.addCommand("mcePrint",function(){a.getWin().print()});a.addButton("print",{title:"print.print_desc",cmd:"mcePrint"})},getInfo:function(){return{longname:"Print",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/print",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("print",tinymce.plugins.Print)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/print/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/print/editor_plugin_src.js new file mode 100644 index 0000000000..3933fe656c --- /dev/null +++ b/plugins/TinyMCE/js/plugins/print/editor_plugin_src.js @@ -0,0 +1,34 @@ +/** + * 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.Print', { + init : function(ed, url) { + ed.addCommand('mcePrint', function() { + ed.getWin().print(); + }); + + ed.addButton('print', {title : 'print.print_desc', cmd : 'mcePrint'}); + }, + + getInfo : function() { + return { + longname : 'Print', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/print', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('print', tinymce.plugins.Print); +})(); diff --git a/plugins/TinyMCE/js/plugins/save/editor_plugin.js b/plugins/TinyMCE/js/plugins/save/editor_plugin.js new file mode 100644 index 0000000000..8e93996671 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/save/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.Save",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceSave",c._save,c);a.addCommand("mceCancel",c._cancel,c);a.addButton("save",{title:"save.save_desc",cmd:"mceSave"});a.addButton("cancel",{title:"save.cancel_desc",cmd:"mceCancel"});a.onNodeChange.add(c._nodeChange,c);a.addShortcut("ctrl+s",a.getLang("save.save_desc"),"mceSave")},getInfo:function(){return{longname:"Save",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/save",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_nodeChange:function(b,a,c){var b=this.editor;if(b.getParam("save_enablewhendirty")){a.setDisabled("save",!b.isDirty());a.setDisabled("cancel",!b.isDirty())}},_save:function(){var c=this.editor,a,e,d,b;a=tinymce.DOM.get(c.id).form||tinymce.DOM.getParent(c.id,"form");if(c.getParam("save_enablewhendirty")&&!c.isDirty()){return}tinyMCE.triggerSave();if(e=c.getParam("save_onsavecallback")){if(c.execCallback("save_onsavecallback",c)){c.startContent=tinymce.trim(c.getContent({format:"raw"}));c.nodeChanged()}return}if(a){c.isNotDirty=true;if(a.onsubmit==null||a.onsubmit()!=false){a.submit()}c.nodeChanged()}else{c.windowManager.alert("Error: No form element found.")}},_cancel:function(){var a=this.editor,c,b=tinymce.trim(a.startContent);if(c=a.getParam("save_oncancelcallback")){a.execCallback("save_oncancelcallback",a);return}a.setContent(b);a.undoManager.clear();a.nodeChanged()}});tinymce.PluginManager.add("save",tinymce.plugins.Save)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/save/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/save/editor_plugin_src.js new file mode 100644 index 0000000000..f5a3de8f5f --- /dev/null +++ b/plugins/TinyMCE/js/plugins/save/editor_plugin_src.js @@ -0,0 +1,101 @@ +/** + * 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.Save', { + init : function(ed, url) { + var t = this; + + t.editor = ed; + + // Register commands + ed.addCommand('mceSave', t._save, t); + ed.addCommand('mceCancel', t._cancel, t); + + // Register buttons + ed.addButton('save', {title : 'save.save_desc', cmd : 'mceSave'}); + ed.addButton('cancel', {title : 'save.cancel_desc', cmd : 'mceCancel'}); + + ed.onNodeChange.add(t._nodeChange, t); + ed.addShortcut('ctrl+s', ed.getLang('save.save_desc'), 'mceSave'); + }, + + getInfo : function() { + return { + longname : 'Save', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/save', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + }, + + // Private methods + + _nodeChange : function(ed, cm, n) { + var ed = this.editor; + + if (ed.getParam('save_enablewhendirty')) { + cm.setDisabled('save', !ed.isDirty()); + cm.setDisabled('cancel', !ed.isDirty()); + } + }, + + // Private methods + + _save : function() { + var ed = this.editor, formObj, os, i, elementId; + + formObj = tinymce.DOM.get(ed.id).form || tinymce.DOM.getParent(ed.id, 'form'); + + if (ed.getParam("save_enablewhendirty") && !ed.isDirty()) + return; + + tinyMCE.triggerSave(); + + // Use callback instead + if (os = ed.getParam("save_onsavecallback")) { + if (ed.execCallback('save_onsavecallback', ed)) { + ed.startContent = tinymce.trim(ed.getContent({format : 'raw'})); + ed.nodeChanged(); + } + + return; + } + + if (formObj) { + ed.isNotDirty = true; + + if (formObj.onsubmit == null || formObj.onsubmit() != false) + formObj.submit(); + + ed.nodeChanged(); + } else + ed.windowManager.alert("Error: No form element found."); + }, + + _cancel : function() { + var ed = this.editor, os, h = tinymce.trim(ed.startContent); + + // Use callback instead + if (os = ed.getParam("save_oncancelcallback")) { + ed.execCallback('save_oncancelcallback', ed); + return; + } + + ed.setContent(h); + ed.undoManager.clear(); + ed.nodeChanged(); + } + }); + + // Register plugin + tinymce.PluginManager.add('save', tinymce.plugins.Save); +})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/searchreplace/css/searchreplace.css b/plugins/TinyMCE/js/plugins/searchreplace/css/searchreplace.css new file mode 100644 index 0000000000..ecdf58c7b5 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/searchreplace/css/searchreplace.css @@ -0,0 +1,6 @@ +.panel_wrapper {height:85px;} +.panel_wrapper div.current {height:85px;} + +/* IE */ +* html .panel_wrapper {height:100px;} +* html .panel_wrapper div.current {height:100px;} diff --git a/plugins/TinyMCE/js/plugins/searchreplace/editor_plugin.js b/plugins/TinyMCE/js/plugins/searchreplace/editor_plugin.js new file mode 100644 index 0000000000..cd9c985b7a --- /dev/null +++ b/plugins/TinyMCE/js/plugins/searchreplace/editor_plugin.js @@ -0,0 +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 diff --git a/plugins/TinyMCE/js/plugins/searchreplace/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/searchreplace/editor_plugin_src.js new file mode 100644 index 0000000000..1433a06a4a --- /dev/null +++ b/plugins/TinyMCE/js/plugins/searchreplace/editor_plugin_src.js @@ -0,0 +1,57 @@ +/** + * 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.SearchReplacePlugin', { + init : function(ed, url) { + function open(m) { + ed.windowManager.open({ + file : url + '/searchreplace.htm', + width : 420 + parseInt(ed.getLang('searchreplace.delta_width', 0)), + height : 170 + parseInt(ed.getLang('searchreplace.delta_height', 0)), + inline : 1, + auto_focus : 0 + }, { + mode : m, + search_string : ed.selection.getContent({format : 'text'}), + plugin_url : url + }); + }; + + // Register commands + ed.addCommand('mceSearch', function() { + open('search'); + }); + + ed.addCommand('mceReplace', function() { + open('replace'); + }); + + // Register buttons + ed.addButton('search', {title : 'searchreplace.search_desc', cmd : 'mceSearch'}); + ed.addButton('replace', {title : 'searchreplace.replace_desc', cmd : 'mceReplace'}); + + ed.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 + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('searchreplace', tinymce.plugins.SearchReplacePlugin); +})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/searchreplace/js/searchreplace.js b/plugins/TinyMCE/js/plugins/searchreplace/js/searchreplace.js new file mode 100644 index 0000000000..c0a6243297 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/searchreplace/js/searchreplace.js @@ -0,0 +1,130 @@ +tinyMCEPopup.requireLangPack(); + +var SearchReplaceDialog = { + init : function(ed) { + var f = document.forms[0], m = tinyMCEPopup.getWindowArg("mode"); + + this.switchMode(m); + + f[m + '_panel_searchstring'].value = tinyMCEPopup.getWindowArg("search_string"); + + // Focus input field + f[m + '_panel_searchstring'].focus(); + }, + + switchMode : function(m) { + var f, lm = this.lastMode; + + if (lm != m) { + f = document.forms[0]; + + if (lm) { + f[m + '_panel_searchstring'].value = f[lm + '_panel_searchstring'].value; + f[m + '_panel_backwardsu'].checked = f[lm + '_panel_backwardsu'].checked; + f[m + '_panel_backwardsd'].checked = f[lm + '_panel_backwardsd'].checked; + f[m + '_panel_casesensitivebox'].checked = f[lm + '_panel_casesensitivebox'].checked; + } + + mcTabs.displayTab(m + '_tab', m + '_panel'); + document.getElementById("replaceBtn").style.display = (m == "replace") ? "inline" : "none"; + document.getElementById("replaceAllBtn").style.display = (m == "replace") ? "inline" : "none"; + this.lastMode = m; + } + }, + + searchNext : function(a) { + var ed = tinyMCEPopup.editor, se = ed.selection, r = se.getRng(), f, m = this.lastMode, s, b, fl = 0, w = ed.getWin(), wm = ed.windowManager, fo = 0; + + // Get input + f = document.forms[0]; + s = f[m + '_panel_searchstring'].value; + b = f[m + '_panel_backwardsu'].checked; + ca = f[m + '_panel_casesensitivebox'].checked; + rs = f['replace_panel_replacestring'].value; + + if (s == '') + return; + + function fix() { + // Correct Firefox graphics glitches + 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); + }; + + // IE flags + if (ca) + fl = fl | 4; + + switch (a) { + case 'all': + // Move caret to beginning of text + ed.execCommand('SelectAll'); + ed.selection.collapse(true); + + if (tinymce.isIE) { + while (r.findText(s, b ? -1 : 1, fl)) { + r.scrollIntoView(); + r.select(); + replace(); + fo = 1; + + if (b) { + r.moveEnd("character", -(rs.length)); // Otherwise will loop forever + } + } + + tinyMCEPopup.storeSelection(); + } else { + while (w.find(s, ca, b, false, false, false, false)) { + replace(); + fo = 1; + } + } + + if (fo) + tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.allreplaced')); + else + tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.notfound')); + + return; + + case 'current': + if (!ed.selection.isCollapsed()) + replace(); + + break; + } + + se.collapse(b); + r = se.getRng(); + + // Whats the point + if (!s) + return; + + if (tinymce.isIE) { + if (r.findText(s, b ? -1 : 1, fl)) { + r.scrollIntoView(); + r.select(); + } else + tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.notfound')); + + tinyMCEPopup.storeSelection(); + } else { + if (!w.find(s, ca, b, false, false, false, false)) + tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.notfound')); + else + fix(); + } + } +}; + +tinyMCEPopup.onInit.add(SearchReplaceDialog.init, SearchReplaceDialog); diff --git a/plugins/TinyMCE/js/plugins/searchreplace/langs/en_dlg.js b/plugins/TinyMCE/js/plugins/searchreplace/langs/en_dlg.js new file mode 100644 index 0000000000..370959afa3 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/searchreplace/langs/en_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('en.searchreplace_dlg',{ +searchnext_desc:"Find again", +notfound:"The search has been completed. The search string could not be found.", +search_title:"Find", +replace_title:"Find/Replace", +allreplaced:"All occurrences of the search string were replaced.", +findwhat:"Find what", +replacewith:"Replace with", +direction:"Direction", +up:"Up", +down:"Down", +mcase:"Match case", +findnext:"Find next", +replace:"Replace", +replaceall:"Replace all" +}); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/searchreplace/searchreplace.htm b/plugins/TinyMCE/js/plugins/searchreplace/searchreplace.htm new file mode 100644 index 0000000000..d0424cfc9b --- /dev/null +++ b/plugins/TinyMCE/js/plugins/searchreplace/searchreplace.htm @@ -0,0 +1,99 @@ + + + + {#searchreplace_dlg.replace_title} + + + + + + + +
+ + +
+
+ + + + + + + + + + + +
+ + + + + + + + +
+
+ + + + + +
+
+
+ +
+ + + + + + + + + + + + + + + +
+ + + + + + + + +
+
+ + + + + +
+
+
+ +
+ +
+ + + + +
+
+ + diff --git a/plugins/TinyMCE/js/plugins/spellchecker/css/content.css b/plugins/TinyMCE/js/plugins/spellchecker/css/content.css new file mode 100644 index 0000000000..24efa02170 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/spellchecker/css/content.css @@ -0,0 +1 @@ +.mceItemHiddenSpellWord {background:url(../img/wline.gif) repeat-x bottom left; cursor:default;} diff --git a/plugins/TinyMCE/js/plugins/spellchecker/editor_plugin.js b/plugins/TinyMCE/js/plugins/spellchecker/editor_plugin.js new file mode 100644 index 0000000000..a9ec3b9cf0 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/spellchecker/editor_plugin.js @@ -0,0 +1 @@ +(function(){var a=tinymce.util.JSONRequest,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.SpellcheckerPlugin",{getInfo:function(){return{longname:"Spellchecker",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker",version:tinymce.majorVersion+"."+tinymce.minorVersion}},init:function(e,f){var g=this,d;g.url=f;g.editor=e;g.rpcUrl=e.getParam("spellchecker_rpc_url","{backend}");if(g.rpcUrl=="{backend}"){if(tinymce.isIE){return}g.hasSupport=true;e.onContextMenu.addToTop(function(h,i){if(g.active){return false}})}e.addCommand("mceSpellCheck",function(){if(g.rpcUrl=="{backend}"){g.editor.getBody().spellcheck=g.active=!g.active;return}if(!g.active){e.setProgressState(1);g._sendRPC("checkWords",[g.selectedLang,g._getWords()],function(h){if(h.length>0){g.active=1;g._markWords(h);e.setProgressState(0);e.nodeChanged()}else{e.setProgressState(0);if(e.getParam("spellchecker_report_no_misspellings",true)){e.windowManager.alert("spellchecker.no_mpell")}}})}else{g._done()}});e.onInit.add(function(){if(e.settings.content_css!==false){e.dom.loadCSS(f+"/css/content.css")}});e.onClick.add(g._showMenu,g);e.onContextMenu.add(g._showMenu,g);e.onBeforeGetContent.add(function(){if(g.active){g._removeWords()}});e.onNodeChange.add(function(i,h){h.setActive("spellchecker",g.active)});e.onSetContent.add(function(){g._done()});e.onBeforeGetContent.add(function(){g._done()});e.onBeforeExecCommand.add(function(h,i){if(i=="mceFullScreen"){g._done()}});g.languages={};c(e.getParam("spellchecker_languages","+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv","hash"),function(i,h){if(h.indexOf("+")===0){h=h.substring(1);g.selectedLang=i}g.languages[h]=i})},createControl:function(h,d){var f=this,g,e=f.editor;if(h=="spellchecker"){if(f.rpcUrl=="{backend}"){if(f.hasSupport){g=d.createButton(h,{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f})}return g}g=d.createSplitButton(h,{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f});g.onRenderMenu.add(function(j,i){i.add({title:"spellchecker.langs","class":"mceMenuItemTitle"}).setDisabled(1);c(f.languages,function(n,m){var p={icon:1},l;p.onclick=function(){l.setSelected(1);f.selectedItem.setSelected(0);f.selectedItem=l;f.selectedLang=n};p.title=m;l=i.add(p);l.setSelected(n==f.selectedLang);if(n==f.selectedLang){f.selectedItem=l}})});return g}},_walk:function(i,g){var h=this.editor.getDoc(),e;if(h.createTreeWalker){e=h.createTreeWalker(i,NodeFilter.SHOW_TEXT,null,false);while((i=e.nextNode())!=null){g.call(this,i)}}else{tinymce.walk(i,g,"childNodes")}},_getSeparators:function(){var e="",d,f=this.editor.getParam("spellchecker_word_separator_chars",'\\s!"#$%&()*+,-./:;<=>?@[]^_{|}\u201d\u201c');for(d=0;d$1$2');q=q.replace(g,'$1$2');j.replace(j.create("span",{"class":"mceItemHidden"},q),r)}}});l.moveToBookmark(m)},_showMenu:function(h,j){var i=this,h=i.editor,d=i._menu,l,k=h.dom,g=k.getViewPort(h.getWin()),f=j.target;j=0;if(!d){l=b.getPos(h.getContentAreaContainer());d=h.controlManager.createDropMenu("spellcheckermenu",{offset_x:l.x,offset_y:l.y,"class":"mceNoIcons"});i._menu=d}if(k.hasClass(f,"mceItemHiddenSpellWord")){d.removeAll();d.add({title:"spellchecker.wait","class":"mceMenuItemTitle"}).setDisabled(1);i._sendRPC("getSuggestions",[i.selectedLang,k.decode(f.innerHTML)],function(m){var e;d.removeAll();if(m.length>0){d.add({title:"spellchecker.sug","class":"mceMenuItemTitle"}).setDisabled(1);c(m,function(n){d.add({title:n,onclick:function(){k.replace(h.getDoc().createTextNode(n),f);i._checkDone()}})});d.addSeparator()}else{d.add({title:"spellchecker.no_sug","class":"mceMenuItemTitle"}).setDisabled(1)}e=i.editor.getParam("spellchecker_enable_ignore_rpc","");d.add({title:"spellchecker.ignore_word",onclick:function(){var n=f.innerHTML;k.remove(f,1);i._checkDone();if(e){h.setProgressState(1);i._sendRPC("ignoreWord",[i.selectedLang,n],function(o){h.setProgressState(0)})}}});d.add({title:"spellchecker.ignore_words",onclick:function(){var n=f.innerHTML;i._removeWords(k.decode(n));i._checkDone();if(e){h.setProgressState(1);i._sendRPC("ignoreWords",[i.selectedLang,n],function(o){h.setProgressState(0)})}}});if(i.editor.getParam("spellchecker_enable_learn_rpc")){d.add({title:"spellchecker.learn_word",onclick:function(){var n=f.innerHTML;k.remove(f,1);i._checkDone();h.setProgressState(1);i._sendRPC("learnWord",[i.selectedLang,n],function(o){h.setProgressState(0)})}})}d.update()});h.selection.select(f);l=k.getPos(f);d.showMenu(l.x,l.y+f.offsetHeight-g.y);return tinymce.dom.Event.cancel(j)}else{d.hideMenu()}},_checkDone:function(){var e=this,d=e.editor,g=d.dom,f;c(g.select("span"),function(h){if(h&&g.hasClass(h,"mceItemHiddenSpellWord")){f=true;return false}});if(!f){e._done()}},_done:function(){var d=this,e=d.active;if(d.active){d.active=0;d._removeWords();if(d._menu){d._menu.hideMenu()}if(e){d.editor.nodeChanged()}}},_sendRPC:function(e,g,d){var f=this;a.sendRPC({url:f.rpcUrl,method:e,params:g,success:d,error:function(i,h){f.editor.setProgressState(0);f.editor.windowManager.alert(i.errstr||("Error response: "+h.responseText))}})}});tinymce.PluginManager.add("spellchecker",tinymce.plugins.SpellcheckerPlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/spellchecker/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/spellchecker/editor_plugin_src.js new file mode 100644 index 0000000000..d8680baf2c --- /dev/null +++ b/plugins/TinyMCE/js/plugins/spellchecker/editor_plugin_src.js @@ -0,0 +1,417 @@ +/** + * 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() { + var JSONRequest = tinymce.util.JSONRequest, each = tinymce.each, DOM = tinymce.DOM; + + tinymce.create('tinymce.plugins.SpellcheckerPlugin', { + getInfo : function() { + return { + longname : 'Spellchecker', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + }, + + init : function(ed, url) { + var t = this, cm; + + t.url = url; + t.editor = ed; + t.rpcUrl = ed.getParam("spellchecker_rpc_url", "{backend}"); + + if (t.rpcUrl == '{backend}') { + // Sniff if the browser supports native spellchecking (Don't know of a better way) + if (tinymce.isIE) + return; + + t.hasSupport = true; + + // Disable the context menu when spellchecking is active + ed.onContextMenu.addToTop(function(ed, e) { + if (t.active) + return false; + }); + } + + // Register commands + ed.addCommand('mceSpellCheck', function() { + if (t.rpcUrl == '{backend}') { + // Enable/disable native spellchecker + t.editor.getBody().spellcheck = t.active = !t.active; + return; + } + + if (!t.active) { + ed.setProgressState(1); + t._sendRPC('checkWords', [t.selectedLang, t._getWords()], function(r) { + if (r.length > 0) { + t.active = 1; + t._markWords(r); + ed.setProgressState(0); + ed.nodeChanged(); + } else { + ed.setProgressState(0); + + if (ed.getParam('spellchecker_report_no_misspellings', true)) + ed.windowManager.alert('spellchecker.no_mpell'); + } + }); + } else + t._done(); + }); + + ed.onInit.add(function() { + if (ed.settings.content_css !== false) + ed.dom.loadCSS(url + '/css/content.css'); + }); + + ed.onClick.add(t._showMenu, t); + ed.onContextMenu.add(t._showMenu, t); + ed.onBeforeGetContent.add(function() { + if (t.active) + t._removeWords(); + }); + + ed.onNodeChange.add(function(ed, cm) { + cm.setActive('spellchecker', t.active); + }); + + ed.onSetContent.add(function() { + t._done(); + }); + + ed.onBeforeGetContent.add(function() { + t._done(); + }); + + ed.onBeforeExecCommand.add(function(ed, cmd) { + if (cmd == 'mceFullScreen') + t._done(); + }); + + // Find selected language + t.languages = {}; + each(ed.getParam('spellchecker_languages', '+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv', 'hash'), function(v, k) { + if (k.indexOf('+') === 0) { + k = k.substring(1); + t.selectedLang = v; + } + + t.languages[k] = v; + }); + }, + + createControl : function(n, cm) { + var t = this, c, ed = t.editor; + + if (n == 'spellchecker') { + // Use basic button if we use the native spellchecker + if (t.rpcUrl == '{backend}') { + // Create simple toggle button if we have native support + if (t.hasSupport) + c = cm.createButton(n, {title : 'spellchecker.desc', cmd : 'mceSpellCheck', scope : t}); + + return c; + } + + c = cm.createSplitButton(n, {title : 'spellchecker.desc', cmd : 'mceSpellCheck', scope : t}); + + c.onRenderMenu.add(function(c, m) { + m.add({title : 'spellchecker.langs', 'class' : 'mceMenuItemTitle'}).setDisabled(1); + each(t.languages, function(v, k) { + var o = {icon : 1}, mi; + + o.onclick = function() { + mi.setSelected(1); + t.selectedItem.setSelected(0); + t.selectedItem = mi; + t.selectedLang = v; + }; + + o.title = k; + mi = m.add(o); + mi.setSelected(v == t.selectedLang); + + if (v == t.selectedLang) + t.selectedItem = mi; + }) + }); + + return c; + } + }, + + // Internal functions + + _walk : function(n, f) { + var d = this.editor.getDoc(), w; + + if (d.createTreeWalker) { + w = d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false); + + while ((n = w.nextNode()) != null) + f.call(this, n); + } else + tinymce.walk(n, f, 'childNodes'); + }, + + _getSeparators : function() { + var re = '', i, str = this.editor.getParam('spellchecker_word_separator_chars', '\\s!"#$%&()*+,-./:;<=>?@[\]^_{|}\u201d\u201c'); + + // Build word separator regexp + for (i=0; i$1$2'); + v = v.replace(r3, '$1$2'); + + dom.replace(dom.create('span', {'class' : 'mceItemHidden'}, v), n); + } + } + }); + + se.moveToBookmark(b); + }, + + _showMenu : function(ed, e) { + var t = this, ed = t.editor, m = t._menu, p1, dom = ed.dom, vp = dom.getViewPort(ed.getWin()), wordSpan = e.target; + + e = 0; // Fixes IE memory leak + + if (!m) { + p1 = DOM.getPos(ed.getContentAreaContainer()); + //p2 = DOM.getPos(ed.getContainer()); + + m = ed.controlManager.createDropMenu('spellcheckermenu', { + offset_x : p1.x, + offset_y : p1.y, + 'class' : 'mceNoIcons' + }); + + t._menu = m; + } + + if (dom.hasClass(wordSpan, 'mceItemHiddenSpellWord')) { + m.removeAll(); + m.add({title : 'spellchecker.wait', 'class' : 'mceMenuItemTitle'}).setDisabled(1); + + t._sendRPC('getSuggestions', [t.selectedLang, dom.decode(wordSpan.innerHTML)], function(r) { + var ignoreRpc; + + m.removeAll(); + + if (r.length > 0) { + m.add({title : 'spellchecker.sug', 'class' : 'mceMenuItemTitle'}).setDisabled(1); + each(r, function(v) { + m.add({title : v, onclick : function() { + dom.replace(ed.getDoc().createTextNode(v), wordSpan); + t._checkDone(); + }}); + }); + + m.addSeparator(); + } else + m.add({title : 'spellchecker.no_sug', 'class' : 'mceMenuItemTitle'}).setDisabled(1); + + ignoreRpc = t.editor.getParam("spellchecker_enable_ignore_rpc", ''); + m.add({ + title : 'spellchecker.ignore_word', + onclick : function() { + var word = wordSpan.innerHTML; + + dom.remove(wordSpan, 1); + t._checkDone(); + + // tell the server if we need to + if (ignoreRpc) { + ed.setProgressState(1); + t._sendRPC('ignoreWord', [t.selectedLang, word], function(r) { + ed.setProgressState(0); + }); + } + } + }); + + m.add({ + title : 'spellchecker.ignore_words', + onclick : function() { + var word = wordSpan.innerHTML; + + t._removeWords(dom.decode(word)); + t._checkDone(); + + // tell the server if we need to + if (ignoreRpc) { + ed.setProgressState(1); + t._sendRPC('ignoreWords', [t.selectedLang, word], function(r) { + ed.setProgressState(0); + }); + } + } + }); + + + if (t.editor.getParam("spellchecker_enable_learn_rpc")) { + m.add({ + title : 'spellchecker.learn_word', + onclick : function() { + var word = wordSpan.innerHTML; + + dom.remove(wordSpan, 1); + t._checkDone(); + + ed.setProgressState(1); + t._sendRPC('learnWord', [t.selectedLang, word], function(r) { + ed.setProgressState(0); + }); + } + }); + } + + m.update(); + }); + + ed.selection.select(wordSpan); + p1 = dom.getPos(wordSpan); + m.showMenu(p1.x, p1.y + wordSpan.offsetHeight - vp.y); + + return tinymce.dom.Event.cancel(e); + } else + m.hideMenu(); + }, + + _checkDone : function() { + var t = this, ed = t.editor, dom = ed.dom, o; + + each(dom.select('span'), function(n) { + if (n && dom.hasClass(n, 'mceItemHiddenSpellWord')) { + o = true; + return false; + } + }); + + if (!o) + t._done(); + }, + + _done : function() { + var t = this, la = t.active; + + if (t.active) { + t.active = 0; + t._removeWords(); + + if (t._menu) + t._menu.hideMenu(); + + if (la) + t.editor.nodeChanged(); + } + }, + + _sendRPC : function(m, p, cb) { + var t = this; + + JSONRequest.sendRPC({ + url : t.rpcUrl, + method : m, + params : p, + success : cb, + error : function(e, x) { + t.editor.setProgressState(0); + t.editor.windowManager.alert(e.errstr || ('Error response: ' + x.responseText)); + } + }); + } + }); + + // Register plugin + tinymce.PluginManager.add('spellchecker', tinymce.plugins.SpellcheckerPlugin); +})(); diff --git a/plugins/TinyMCE/js/plugins/spellchecker/img/wline.gif b/plugins/TinyMCE/js/plugins/spellchecker/img/wline.gif new file mode 100644 index 0000000000..7d0a4dbca0 Binary files /dev/null and b/plugins/TinyMCE/js/plugins/spellchecker/img/wline.gif differ diff --git a/plugins/TinyMCE/js/plugins/style/css/props.css b/plugins/TinyMCE/js/plugins/style/css/props.css new file mode 100644 index 0000000000..eb1f264960 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/style/css/props.css @@ -0,0 +1,13 @@ +#text_font {width:250px;} +#text_size {width:70px;} +.mceAddSelectValue {background:#DDD;} +select, #block_text_indent, #box_width, #box_height, #box_padding_top, #box_padding_right, #box_padding_bottom, #box_padding_left {width:70px;} +#box_margin_top, #box_margin_right, #box_margin_bottom, #box_margin_left, #positioning_width, #positioning_height, #positioning_zindex {width:70px;} +#positioning_placement_top, #positioning_placement_right, #positioning_placement_bottom, #positioning_placement_left {width:70px;} +#positioning_clip_top, #positioning_clip_right, #positioning_clip_bottom, #positioning_clip_left {width:70px;} +.panel_wrapper div.current {padding-top:10px;height:230px;} +.delim {border-left:1px solid gray;} +.tdelim {border-bottom:1px solid gray;} +#block_display {width:145px;} +#list_type {width:115px;} +.disabled {background:#EEE;} diff --git a/plugins/TinyMCE/js/plugins/style/editor_plugin.js b/plugins/TinyMCE/js/plugins/style/editor_plugin.js new file mode 100644 index 0000000000..cab2153c40 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/style/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.StylePlugin",{init:function(a,b){a.addCommand("mceStyleProps",function(){a.windowManager.open({file:b+"/props.htm",width:480+parseInt(a.getLang("style.delta_width",0)),height:320+parseInt(a.getLang("style.delta_height",0)),inline:1},{plugin_url:b,style_text:a.selection.getNode().style.cssText})});a.addCommand("mceSetElementStyle",function(d,c){if(e=a.selection.getNode()){a.dom.setAttrib(e,"style",c);a.execCommand("mceRepaint")}});a.onNodeChange.add(function(d,c,f){c.setDisabled("styleprops",f.nodeName==="BODY")});a.addButton("styleprops",{title:"style.desc",cmd:"mceStyleProps"})},getInfo:function(){return{longname:"Style",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/style",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("style",tinymce.plugins.StylePlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/style/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/style/editor_plugin_src.js new file mode 100644 index 0000000000..5f7755f184 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/style/editor_plugin_src.js @@ -0,0 +1,55 @@ +/** + * 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.StylePlugin', { + init : function(ed, url) { + // Register commands + ed.addCommand('mceStyleProps', function() { + ed.windowManager.open({ + file : url + '/props.htm', + width : 480 + parseInt(ed.getLang('style.delta_width', 0)), + height : 320 + parseInt(ed.getLang('style.delta_height', 0)), + inline : 1 + }, { + plugin_url : url, + style_text : ed.selection.getNode().style.cssText + }); + }); + + ed.addCommand('mceSetElementStyle', function(ui, v) { + if (e = ed.selection.getNode()) { + ed.dom.setAttrib(e, 'style', v); + ed.execCommand('mceRepaint'); + } + }); + + ed.onNodeChange.add(function(ed, cm, n) { + cm.setDisabled('styleprops', n.nodeName === 'BODY'); + }); + + // Register buttons + ed.addButton('styleprops', {title : 'style.desc', cmd : 'mceStyleProps'}); + }, + + getInfo : function() { + return { + longname : 'Style', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/style', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('style', tinymce.plugins.StylePlugin); +})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/style/js/props.js b/plugins/TinyMCE/js/plugins/style/js/props.js new file mode 100644 index 0000000000..a8dd93dec5 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/style/js/props.js @@ -0,0 +1,641 @@ +tinyMCEPopup.requireLangPack(); + +var defaultFonts = "" + + "Arial, Helvetica, sans-serif=Arial, Helvetica, sans-serif;" + + "Times New Roman, Times, serif=Times New Roman, Times, serif;" + + "Courier New, Courier, mono=Courier New, Courier, mono;" + + "Times New Roman, Times, serif=Times New Roman, Times, serif;" + + "Georgia, Times New Roman, Times, serif=Georgia, Times New Roman, Times, serif;" + + "Verdana, Arial, Helvetica, sans-serif=Verdana, Arial, Helvetica, sans-serif;" + + "Geneva, Arial, Helvetica, sans-serif=Geneva, Arial, Helvetica, sans-serif"; + +var defaultSizes = "9;10;12;14;16;18;24;xx-small;x-small;small;medium;large;x-large;xx-large;smaller;larger"; +var defaultMeasurement = "+pixels=px;points=pt;inches=in;centimetres=cm;millimetres=mm;picas=pc;ems=em;exs=ex;%"; +var defaultSpacingMeasurement = "pixels=px;points=pt;inches=in;centimetres=cm;millimetres=mm;picas=pc;+ems=em;exs=ex;%"; +var defaultIndentMeasurement = "pixels=px;+points=pt;inches=in;centimetres=cm;millimetres=mm;picas=pc;ems=em;exs=ex;%"; +var defaultWeight = "normal;bold;bolder;lighter;100;200;300;400;500;600;700;800;900"; +var defaultTextStyle = "normal;italic;oblique"; +var defaultVariant = "normal;small-caps"; +var defaultLineHeight = "normal"; +var defaultAttachment = "fixed;scroll"; +var defaultRepeat = "no-repeat;repeat;repeat-x;repeat-y"; +var defaultPosH = "left;center;right"; +var defaultPosV = "top;center;bottom"; +var defaultVAlign = "baseline;sub;super;top;text-top;middle;bottom;text-bottom"; +var defaultDisplay = "inline;block;list-item;run-in;compact;marker;table;inline-table;table-row-group;table-header-group;table-footer-group;table-row;table-column-group;table-column;table-cell;table-caption;none"; +var defaultBorderStyle = "none;solid;dashed;dotted;double;groove;ridge;inset;outset"; +var defaultBorderWidth = "thin;medium;thick"; +var defaultListType = "disc;circle;square;decimal;lower-roman;upper-roman;lower-alpha;upper-alpha;none"; + +function init() { + var ce = document.getElementById('container'), h; + + ce.style.cssText = tinyMCEPopup.getWindowArg('style_text'); + + h = getBrowserHTML('background_image_browser','background_image','image','advimage'); + document.getElementById("background_image_browser").innerHTML = h; + + document.getElementById('text_color_pickcontainer').innerHTML = getColorPickerHTML('text_color_pick','text_color'); + document.getElementById('background_color_pickcontainer').innerHTML = getColorPickerHTML('background_color_pick','background_color'); + document.getElementById('border_color_top_pickcontainer').innerHTML = getColorPickerHTML('border_color_top_pick','border_color_top'); + document.getElementById('border_color_right_pickcontainer').innerHTML = getColorPickerHTML('border_color_right_pick','border_color_right'); + document.getElementById('border_color_bottom_pickcontainer').innerHTML = getColorPickerHTML('border_color_bottom_pick','border_color_bottom'); + document.getElementById('border_color_left_pickcontainer').innerHTML = getColorPickerHTML('border_color_left_pick','border_color_left'); + + fillSelect(0, 'text_font', 'style_font', defaultFonts, ';', true); + fillSelect(0, 'text_size', 'style_font_size', defaultSizes, ';', true); + fillSelect(0, 'text_size_measurement', 'style_font_size_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'text_case', 'style_text_case', "capitalize;uppercase;lowercase", ';', true); + fillSelect(0, 'text_weight', 'style_font_weight', defaultWeight, ';', true); + fillSelect(0, 'text_style', 'style_font_style', defaultTextStyle, ';', true); + fillSelect(0, 'text_variant', 'style_font_variant', defaultVariant, ';', true); + fillSelect(0, 'text_lineheight', 'style_font_line_height', defaultLineHeight, ';', true); + fillSelect(0, 'text_lineheight_measurement', 'style_font_line_height_measurement', defaultMeasurement, ';', true); + + fillSelect(0, 'background_attachment', 'style_background_attachment', defaultAttachment, ';', true); + fillSelect(0, 'background_repeat', 'style_background_repeat', defaultRepeat, ';', true); + + fillSelect(0, 'background_hpos_measurement', 'style_background_hpos_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'background_vpos_measurement', 'style_background_vpos_measurement', defaultMeasurement, ';', true); + + fillSelect(0, 'background_hpos', 'style_background_hpos', defaultPosH, ';', true); + fillSelect(0, 'background_vpos', 'style_background_vpos', defaultPosV, ';', true); + + fillSelect(0, 'block_wordspacing', 'style_wordspacing', 'normal', ';', true); + fillSelect(0, 'block_wordspacing_measurement', 'style_wordspacing_measurement', defaultSpacingMeasurement, ';', true); + fillSelect(0, 'block_letterspacing', 'style_letterspacing', 'normal', ';', true); + fillSelect(0, 'block_letterspacing_measurement', 'style_letterspacing_measurement', defaultSpacingMeasurement, ';', true); + fillSelect(0, 'block_vertical_alignment', 'style_vertical_alignment', defaultVAlign, ';', true); + fillSelect(0, 'block_text_align', 'style_text_align', "left;right;center;justify", ';', true); + fillSelect(0, 'block_whitespace', 'style_whitespace', "normal;pre;nowrap", ';', true); + fillSelect(0, 'block_display', 'style_display', defaultDisplay, ';', true); + fillSelect(0, 'block_text_indent_measurement', 'style_text_indent_measurement', defaultIndentMeasurement, ';', true); + + fillSelect(0, 'box_width_measurement', 'style_box_width_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'box_height_measurement', 'style_box_height_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'box_float', 'style_float', 'left;right;none', ';', true); + fillSelect(0, 'box_clear', 'style_clear', 'left;right;both;none', ';', true); + fillSelect(0, 'box_padding_left_measurement', 'style_padding_left_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'box_padding_top_measurement', 'style_padding_top_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'box_padding_bottom_measurement', 'style_padding_bottom_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'box_padding_right_measurement', 'style_padding_right_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'box_margin_left_measurement', 'style_margin_left_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'box_margin_top_measurement', 'style_margin_top_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'box_margin_bottom_measurement', 'style_margin_bottom_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'box_margin_right_measurement', 'style_margin_right_measurement', defaultMeasurement, ';', true); + + fillSelect(0, 'border_style_top', 'style_border_style_top', defaultBorderStyle, ';', true); + fillSelect(0, 'border_style_right', 'style_border_style_right', defaultBorderStyle, ';', true); + fillSelect(0, 'border_style_bottom', 'style_border_style_bottom', defaultBorderStyle, ';', true); + fillSelect(0, 'border_style_left', 'style_border_style_left', defaultBorderStyle, ';', true); + + fillSelect(0, 'border_width_top', 'style_border_width_top', defaultBorderWidth, ';', true); + fillSelect(0, 'border_width_right', 'style_border_width_right', defaultBorderWidth, ';', true); + fillSelect(0, 'border_width_bottom', 'style_border_width_bottom', defaultBorderWidth, ';', true); + fillSelect(0, 'border_width_left', 'style_border_width_left', defaultBorderWidth, ';', true); + + fillSelect(0, 'border_width_top_measurement', 'style_border_width_top_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'border_width_right_measurement', 'style_border_width_right_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'border_width_bottom_measurement', 'style_border_width_bottom_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'border_width_left_measurement', 'style_border_width_left_measurement', defaultMeasurement, ';', true); + + fillSelect(0, 'list_type', 'style_list_type', defaultListType, ';', true); + fillSelect(0, 'list_position', 'style_list_position', "inside;outside", ';', true); + + fillSelect(0, 'positioning_type', 'style_positioning_type', "absolute;relative;static", ';', true); + fillSelect(0, 'positioning_visibility', 'style_positioning_visibility', "inherit;visible;hidden", ';', true); + + fillSelect(0, 'positioning_width_measurement', 'style_positioning_width_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'positioning_height_measurement', 'style_positioning_height_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'positioning_overflow', 'style_positioning_overflow', "visible;hidden;scroll;auto", ';', true); + + fillSelect(0, 'positioning_placement_top_measurement', 'style_positioning_placement_top_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'positioning_placement_right_measurement', 'style_positioning_placement_right_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'positioning_placement_bottom_measurement', 'style_positioning_placement_bottom_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'positioning_placement_left_measurement', 'style_positioning_placement_left_measurement', defaultMeasurement, ';', true); + + fillSelect(0, 'positioning_clip_top_measurement', 'style_positioning_clip_top_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'positioning_clip_right_measurement', 'style_positioning_clip_right_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'positioning_clip_bottom_measurement', 'style_positioning_clip_bottom_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'positioning_clip_left_measurement', 'style_positioning_clip_left_measurement', defaultMeasurement, ';', true); + + TinyMCE_EditableSelects.init(); + setupFormData(); + showDisabledControls(); +} + +function setupFormData() { + var ce = document.getElementById('container'), f = document.forms[0], s, b, i; + + // Setup text fields + + selectByValue(f, 'text_font', ce.style.fontFamily, true, true); + selectByValue(f, 'text_size', getNum(ce.style.fontSize), true, true); + selectByValue(f, 'text_size_measurement', getMeasurement(ce.style.fontSize)); + selectByValue(f, 'text_weight', ce.style.fontWeight, true, true); + selectByValue(f, 'text_style', ce.style.fontStyle, true, true); + selectByValue(f, 'text_lineheight', getNum(ce.style.lineHeight), true, true); + selectByValue(f, 'text_lineheight_measurement', getMeasurement(ce.style.lineHeight)); + selectByValue(f, 'text_case', ce.style.textTransform, true, true); + selectByValue(f, 'text_variant', ce.style.fontVariant, true, true); + f.text_color.value = tinyMCEPopup.editor.dom.toHex(ce.style.color); + updateColor('text_color_pick', 'text_color'); + f.text_underline.checked = inStr(ce.style.textDecoration, 'underline'); + f.text_overline.checked = inStr(ce.style.textDecoration, 'overline'); + f.text_linethrough.checked = inStr(ce.style.textDecoration, 'line-through'); + f.text_blink.checked = inStr(ce.style.textDecoration, 'blink'); + + // Setup background fields + + f.background_color.value = tinyMCEPopup.editor.dom.toHex(ce.style.backgroundColor); + updateColor('background_color_pick', 'background_color'); + f.background_image.value = ce.style.backgroundImage.replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1"); + selectByValue(f, 'background_repeat', ce.style.backgroundRepeat, true, true); + selectByValue(f, 'background_attachment', ce.style.backgroundAttachment, true, true); + selectByValue(f, 'background_hpos', getNum(getVal(ce.style.backgroundPosition, 0)), true, true); + selectByValue(f, 'background_hpos_measurement', getMeasurement(getVal(ce.style.backgroundPosition, 0))); + selectByValue(f, 'background_vpos', getNum(getVal(ce.style.backgroundPosition, 1)), true, true); + selectByValue(f, 'background_vpos_measurement', getMeasurement(getVal(ce.style.backgroundPosition, 1))); + + // Setup block fields + + selectByValue(f, 'block_wordspacing', getNum(ce.style.wordSpacing), true, true); + selectByValue(f, 'block_wordspacing_measurement', getMeasurement(ce.style.wordSpacing)); + selectByValue(f, 'block_letterspacing', getNum(ce.style.letterSpacing), true, true); + selectByValue(f, 'block_letterspacing_measurement', getMeasurement(ce.style.letterSpacing)); + selectByValue(f, 'block_vertical_alignment', ce.style.verticalAlign, true, true); + selectByValue(f, 'block_text_align', ce.style.textAlign, true, true); + f.block_text_indent.value = getNum(ce.style.textIndent); + selectByValue(f, 'block_text_indent_measurement', getMeasurement(ce.style.textIndent)); + selectByValue(f, 'block_whitespace', ce.style.whiteSpace, true, true); + selectByValue(f, 'block_display', ce.style.display, true, true); + + // Setup box fields + + f.box_width.value = getNum(ce.style.width); + selectByValue(f, 'box_width_measurement', getMeasurement(ce.style.width)); + + f.box_height.value = getNum(ce.style.height); + selectByValue(f, 'box_height_measurement', getMeasurement(ce.style.height)); + + if (tinymce.isGecko) + selectByValue(f, 'box_float', ce.style.cssFloat, true, true); + else + selectByValue(f, 'box_float', ce.style.styleFloat, true, true); + + selectByValue(f, 'box_clear', ce.style.clear, true, true); + + setupBox(f, ce, 'box_padding', 'padding', ''); + setupBox(f, ce, 'box_margin', 'margin', ''); + + // Setup border fields + + setupBox(f, ce, 'border_style', 'border', 'Style'); + setupBox(f, ce, 'border_width', 'border', 'Width'); + setupBox(f, ce, 'border_color', 'border', 'Color'); + + updateColor('border_color_top_pick', 'border_color_top'); + updateColor('border_color_right_pick', 'border_color_right'); + updateColor('border_color_bottom_pick', 'border_color_bottom'); + updateColor('border_color_left_pick', 'border_color_left'); + + f.elements.border_color_top.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_top.value); + f.elements.border_color_right.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_right.value); + f.elements.border_color_bottom.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_bottom.value); + f.elements.border_color_left.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_left.value); + + // Setup list fields + + selectByValue(f, 'list_type', ce.style.listStyleType, true, true); + selectByValue(f, 'list_position', ce.style.listStylePosition, true, true); + f.list_bullet_image.value = ce.style.listStyleImage.replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1"); + + // Setup box fields + + selectByValue(f, 'positioning_type', ce.style.position, true, true); + selectByValue(f, 'positioning_visibility', ce.style.visibility, true, true); + selectByValue(f, 'positioning_overflow', ce.style.overflow, true, true); + f.positioning_zindex.value = ce.style.zIndex ? ce.style.zIndex : ""; + + f.positioning_width.value = getNum(ce.style.width); + selectByValue(f, 'positioning_width_measurement', getMeasurement(ce.style.width)); + + f.positioning_height.value = getNum(ce.style.height); + selectByValue(f, 'positioning_height_measurement', getMeasurement(ce.style.height)); + + setupBox(f, ce, 'positioning_placement', '', '', ['top', 'right', 'bottom', 'left']); + + s = ce.style.clip.replace(new RegExp("rect\\('?([^']*)'?\\)", 'gi'), "$1"); + s = s.replace(/,/g, ' '); + + if (!hasEqualValues([getVal(s, 0), getVal(s, 1), getVal(s, 2), getVal(s, 3)])) { + f.positioning_clip_top.value = getNum(getVal(s, 0)); + selectByValue(f, 'positioning_clip_top_measurement', getMeasurement(getVal(s, 0))); + f.positioning_clip_right.value = getNum(getVal(s, 1)); + selectByValue(f, 'positioning_clip_right_measurement', getMeasurement(getVal(s, 1))); + f.positioning_clip_bottom.value = getNum(getVal(s, 2)); + selectByValue(f, 'positioning_clip_bottom_measurement', getMeasurement(getVal(s, 2))); + f.positioning_clip_left.value = getNum(getVal(s, 3)); + selectByValue(f, 'positioning_clip_left_measurement', getMeasurement(getVal(s, 3))); + } else { + f.positioning_clip_top.value = getNum(getVal(s, 0)); + selectByValue(f, 'positioning_clip_top_measurement', getMeasurement(getVal(s, 0))); + f.positioning_clip_right.value = f.positioning_clip_bottom.value = f.positioning_clip_left.value; + } + +// setupBox(f, ce, '', 'border', 'Color'); +} + +function getMeasurement(s) { + return s.replace(/^([0-9.]+)(.*)$/, "$2"); +} + +function getNum(s) { + if (new RegExp('^(?:[0-9.]+)(?:[a-z%]+)$', 'gi').test(s)) + return s.replace(/[^0-9.]/g, ''); + + return s; +} + +function inStr(s, n) { + return new RegExp(n, 'gi').test(s); +} + +function getVal(s, i) { + var a = s.split(' '); + + if (a.length > 1) + return a[i]; + + return ""; +} + +function setValue(f, n, v) { + if (f.elements[n].type == "text") + f.elements[n].value = v; + else + selectByValue(f, n, v, true, true); +} + +function setupBox(f, ce, fp, pr, sf, b) { + if (typeof(b) == "undefined") + b = ['Top', 'Right', 'Bottom', 'Left']; + + if (isSame(ce, pr, sf, b)) { + f.elements[fp + "_same"].checked = true; + + setValue(f, fp + "_top", getNum(ce.style[pr + b[0] + sf])); + f.elements[fp + "_top"].disabled = false; + + f.elements[fp + "_right"].value = ""; + f.elements[fp + "_right"].disabled = true; + f.elements[fp + "_bottom"].value = ""; + f.elements[fp + "_bottom"].disabled = true; + f.elements[fp + "_left"].value = ""; + f.elements[fp + "_left"].disabled = true; + + if (f.elements[fp + "_top_measurement"]) { + selectByValue(f, fp + '_top_measurement', getMeasurement(ce.style[pr + b[0] + sf])); + f.elements[fp + "_left_measurement"].disabled = true; + f.elements[fp + "_bottom_measurement"].disabled = true; + f.elements[fp + "_right_measurement"].disabled = true; + } + } else { + f.elements[fp + "_same"].checked = false; + + setValue(f, fp + "_top", getNum(ce.style[pr + b[0] + sf])); + f.elements[fp + "_top"].disabled = false; + + setValue(f, fp + "_right", getNum(ce.style[pr + b[1] + sf])); + f.elements[fp + "_right"].disabled = false; + + setValue(f, fp + "_bottom", getNum(ce.style[pr + b[2] + sf])); + f.elements[fp + "_bottom"].disabled = false; + + setValue(f, fp + "_left", getNum(ce.style[pr + b[3] + sf])); + f.elements[fp + "_left"].disabled = false; + + if (f.elements[fp + "_top_measurement"]) { + selectByValue(f, fp + '_top_measurement', getMeasurement(ce.style[pr + b[0] + sf])); + selectByValue(f, fp + '_right_measurement', getMeasurement(ce.style[pr + b[1] + sf])); + selectByValue(f, fp + '_bottom_measurement', getMeasurement(ce.style[pr + b[2] + sf])); + selectByValue(f, fp + '_left_measurement', getMeasurement(ce.style[pr + b[3] + sf])); + f.elements[fp + "_left_measurement"].disabled = false; + f.elements[fp + "_bottom_measurement"].disabled = false; + f.elements[fp + "_right_measurement"].disabled = false; + } + } +} + +function isSame(e, pr, sf, b) { + var a = [], i, x; + + if (typeof(b) == "undefined") + b = ['Top', 'Right', 'Bottom', 'Left']; + + if (typeof(sf) == "undefined" || sf == null) + sf = ""; + + a[0] = e.style[pr + b[0] + sf]; + a[1] = e.style[pr + b[1] + sf]; + a[2] = e.style[pr + b[2] + sf]; + a[3] = e.style[pr + b[3] + sf]; + + for (i=0; i 0 ? s.substring(1) : s; + + if (f.text_none.checked) + s = "none"; + + ce.style.textDecoration = s; + + // Build background styles + + ce.style.backgroundColor = f.background_color.value; + ce.style.backgroundImage = f.background_image.value != "" ? "url(" + f.background_image.value + ")" : ""; + ce.style.backgroundRepeat = f.background_repeat.value; + ce.style.backgroundAttachment = f.background_attachment.value; + + if (f.background_hpos.value != "") { + s = ""; + s += f.background_hpos.value + (isNum(f.background_hpos.value) ? f.background_hpos_measurement.value : "") + " "; + s += f.background_vpos.value + (isNum(f.background_vpos.value) ? f.background_vpos_measurement.value : ""); + ce.style.backgroundPosition = s; + } + + // Build block styles + + ce.style.wordSpacing = f.block_wordspacing.value + (isNum(f.block_wordspacing.value) ? f.block_wordspacing_measurement.value : ""); + ce.style.letterSpacing = f.block_letterspacing.value + (isNum(f.block_letterspacing.value) ? f.block_letterspacing_measurement.value : ""); + ce.style.verticalAlign = f.block_vertical_alignment.value; + ce.style.textAlign = f.block_text_align.value; + ce.style.textIndent = f.block_text_indent.value + (isNum(f.block_text_indent.value) ? f.block_text_indent_measurement.value : ""); + ce.style.whiteSpace = f.block_whitespace.value; + ce.style.display = f.block_display.value; + + // Build box styles + + ce.style.width = f.box_width.value + (isNum(f.box_width.value) ? f.box_width_measurement.value : ""); + ce.style.height = f.box_height.value + (isNum(f.box_height.value) ? f.box_height_measurement.value : ""); + ce.style.styleFloat = f.box_float.value; + + if (tinymce.isGecko) + ce.style.cssFloat = f.box_float.value; + + ce.style.clear = f.box_clear.value; + + if (!f.box_padding_same.checked) { + ce.style.paddingTop = f.box_padding_top.value + (isNum(f.box_padding_top.value) ? f.box_padding_top_measurement.value : ""); + ce.style.paddingRight = f.box_padding_right.value + (isNum(f.box_padding_right.value) ? f.box_padding_right_measurement.value : ""); + ce.style.paddingBottom = f.box_padding_bottom.value + (isNum(f.box_padding_bottom.value) ? f.box_padding_bottom_measurement.value : ""); + ce.style.paddingLeft = f.box_padding_left.value + (isNum(f.box_padding_left.value) ? f.box_padding_left_measurement.value : ""); + } else + ce.style.padding = f.box_padding_top.value + (isNum(f.box_padding_top.value) ? f.box_padding_top_measurement.value : ""); + + if (!f.box_margin_same.checked) { + ce.style.marginTop = f.box_margin_top.value + (isNum(f.box_margin_top.value) ? f.box_margin_top_measurement.value : ""); + ce.style.marginRight = f.box_margin_right.value + (isNum(f.box_margin_right.value) ? f.box_margin_right_measurement.value : ""); + ce.style.marginBottom = f.box_margin_bottom.value + (isNum(f.box_margin_bottom.value) ? f.box_margin_bottom_measurement.value : ""); + ce.style.marginLeft = f.box_margin_left.value + (isNum(f.box_margin_left.value) ? f.box_margin_left_measurement.value : ""); + } else + ce.style.margin = f.box_margin_top.value + (isNum(f.box_margin_top.value) ? f.box_margin_top_measurement.value : ""); + + // Build border styles + + if (!f.border_style_same.checked) { + ce.style.borderTopStyle = f.border_style_top.value; + ce.style.borderRightStyle = f.border_style_right.value; + ce.style.borderBottomStyle = f.border_style_bottom.value; + ce.style.borderLeftStyle = f.border_style_left.value; + } else + ce.style.borderStyle = f.border_style_top.value; + + if (!f.border_width_same.checked) { + ce.style.borderTopWidth = f.border_width_top.value + (isNum(f.border_width_top.value) ? f.border_width_top_measurement.value : ""); + ce.style.borderRightWidth = f.border_width_right.value + (isNum(f.border_width_right.value) ? f.border_width_right_measurement.value : ""); + ce.style.borderBottomWidth = f.border_width_bottom.value + (isNum(f.border_width_bottom.value) ? f.border_width_bottom_measurement.value : ""); + ce.style.borderLeftWidth = f.border_width_left.value + (isNum(f.border_width_left.value) ? f.border_width_left_measurement.value : ""); + } else + ce.style.borderWidth = f.border_width_top.value + (isNum(f.border_width_top.value) ? f.border_width_top_measurement.value : ""); + + if (!f.border_color_same.checked) { + ce.style.borderTopColor = f.border_color_top.value; + ce.style.borderRightColor = f.border_color_right.value; + ce.style.borderBottomColor = f.border_color_bottom.value; + ce.style.borderLeftColor = f.border_color_left.value; + } else + ce.style.borderColor = f.border_color_top.value; + + // Build list styles + + ce.style.listStyleType = f.list_type.value; + ce.style.listStylePosition = f.list_position.value; + ce.style.listStyleImage = f.list_bullet_image.value != "" ? "url(" + f.list_bullet_image.value + ")" : ""; + + // Build positioning styles + + ce.style.position = f.positioning_type.value; + ce.style.visibility = f.positioning_visibility.value; + + if (ce.style.width == "") + ce.style.width = f.positioning_width.value + (isNum(f.positioning_width.value) ? f.positioning_width_measurement.value : ""); + + if (ce.style.height == "") + ce.style.height = f.positioning_height.value + (isNum(f.positioning_height.value) ? f.positioning_height_measurement.value : ""); + + ce.style.zIndex = f.positioning_zindex.value; + ce.style.overflow = f.positioning_overflow.value; + + if (!f.positioning_placement_same.checked) { + ce.style.top = f.positioning_placement_top.value + (isNum(f.positioning_placement_top.value) ? f.positioning_placement_top_measurement.value : ""); + ce.style.right = f.positioning_placement_right.value + (isNum(f.positioning_placement_right.value) ? f.positioning_placement_right_measurement.value : ""); + ce.style.bottom = f.positioning_placement_bottom.value + (isNum(f.positioning_placement_bottom.value) ? f.positioning_placement_bottom_measurement.value : ""); + ce.style.left = f.positioning_placement_left.value + (isNum(f.positioning_placement_left.value) ? f.positioning_placement_left_measurement.value : ""); + } else { + s = f.positioning_placement_top.value + (isNum(f.positioning_placement_top.value) ? f.positioning_placement_top_measurement.value : ""); + ce.style.top = s; + ce.style.right = s; + ce.style.bottom = s; + ce.style.left = s; + } + + if (!f.positioning_clip_same.checked) { + s = "rect("; + s += (isNum(f.positioning_clip_top.value) ? f.positioning_clip_top.value + f.positioning_clip_top_measurement.value : "auto") + " "; + s += (isNum(f.positioning_clip_right.value) ? f.positioning_clip_right.value + f.positioning_clip_right_measurement.value : "auto") + " "; + s += (isNum(f.positioning_clip_bottom.value) ? f.positioning_clip_bottom.value + f.positioning_clip_bottom_measurement.value : "auto") + " "; + s += (isNum(f.positioning_clip_left.value) ? f.positioning_clip_left.value + f.positioning_clip_left_measurement.value : "auto"); + s += ")"; + + if (s != "rect(auto auto auto auto)") + ce.style.clip = s; + } else { + s = "rect("; + t = isNum(f.positioning_clip_top.value) ? f.positioning_clip_top.value + f.positioning_clip_top_measurement.value : "auto"; + s += t + " "; + s += t + " "; + s += t + " "; + s += t + ")"; + + if (s != "rect(auto auto auto auto)") + ce.style.clip = s; + } + + ce.style.cssText = ce.style.cssText; +} + +function isNum(s) { + return new RegExp('[0-9]+', 'g').test(s); +} + +function showDisabledControls() { + var f = document.forms, i, a; + + for (i=0; i 1) { + addSelectValue(f, s, p[0], p[1]); + + if (se) + selectByValue(f, s, p[1]); + } else { + addSelectValue(f, s, p[0], p[0]); + + if (se) + selectByValue(f, s, p[0]); + } + } +} + +function toggleSame(ce, pre) { + var el = document.forms[0].elements, i; + + if (ce.checked) { + el[pre + "_top"].disabled = false; + el[pre + "_right"].disabled = true; + el[pre + "_bottom"].disabled = true; + el[pre + "_left"].disabled = true; + + if (el[pre + "_top_measurement"]) { + el[pre + "_top_measurement"].disabled = false; + el[pre + "_right_measurement"].disabled = true; + el[pre + "_bottom_measurement"].disabled = true; + el[pre + "_left_measurement"].disabled = true; + } + } else { + el[pre + "_top"].disabled = false; + el[pre + "_right"].disabled = false; + el[pre + "_bottom"].disabled = false; + el[pre + "_left"].disabled = false; + + if (el[pre + "_top_measurement"]) { + el[pre + "_top_measurement"].disabled = false; + el[pre + "_right_measurement"].disabled = false; + el[pre + "_bottom_measurement"].disabled = false; + el[pre + "_left_measurement"].disabled = false; + } + } + + showDisabledControls(); +} + +function synch(fr, to) { + var f = document.forms[0]; + + f.elements[to].value = f.elements[fr].value; + + if (f.elements[fr + "_measurement"]) + selectByValue(f, to + "_measurement", f.elements[fr + "_measurement"].value); +} + +tinyMCEPopup.onInit.add(init); diff --git a/plugins/TinyMCE/js/plugins/style/langs/en_dlg.js b/plugins/TinyMCE/js/plugins/style/langs/en_dlg.js new file mode 100644 index 0000000000..5026313e2e --- /dev/null +++ b/plugins/TinyMCE/js/plugins/style/langs/en_dlg.js @@ -0,0 +1,63 @@ +tinyMCE.addI18n('en.style_dlg',{ +title:"Edit CSS Style", +apply:"Apply", +text_tab:"Text", +background_tab:"Background", +block_tab:"Block", +box_tab:"Box", +border_tab:"Border", +list_tab:"List", +positioning_tab:"Positioning", +text_props:"Text", +text_font:"Font", +text_size:"Size", +text_weight:"Weight", +text_style:"Style", +text_variant:"Variant", +text_lineheight:"Line height", +text_case:"Case", +text_color:"Color", +text_decoration:"Decoration", +text_overline:"overline", +text_underline:"underline", +text_striketrough:"strikethrough", +text_blink:"blink", +text_none:"none", +background_color:"Background color", +background_image:"Background image", +background_repeat:"Repeat", +background_attachment:"Attachment", +background_hpos:"Horizontal position", +background_vpos:"Vertical position", +block_wordspacing:"Word spacing", +block_letterspacing:"Letter spacing", +block_vertical_alignment:"Vertical alignment", +block_text_align:"Text align", +block_text_indent:"Text indent", +block_whitespace:"Whitespace", +block_display:"Display", +box_width:"Width", +box_height:"Height", +box_float:"Float", +box_clear:"Clear", +padding:"Padding", +same:"Same for all", +top:"Top", +right:"Right", +bottom:"Bottom", +left:"Left", +margin:"Margin", +style:"Style", +width:"Width", +height:"Height", +color:"Color", +list_type:"Type", +bullet_image:"Bullet image", +position:"Position", +positioning_type:"Type", +visibility:"Visibility", +zindex:"Z-index", +overflow:"Overflow", +placement:"Placement", +clip:"Clip" +}); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/style/props.htm b/plugins/TinyMCE/js/plugins/style/props.htm new file mode 100644 index 0000000000..549ed0408e --- /dev/null +++ b/plugins/TinyMCE/js/plugins/style/props.htm @@ -0,0 +1,723 @@ + + + + {#style_dlg.title} + + + + + + + + + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
 
+
+ +
+ + + +
+ + + + + + +
+ +  
+
+ +
+ + + + + +
 
+
{#style_dlg.text_decoration} + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
 
+
+ + + + +
 
+
+ + + + + + +
 
+
+ + + + + + +
 
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
 
+
+ + + + + + +
 
+
+ + + + + + +
 
+
+
+ +
+ + + + + + + + + + + + + + +
+ + + + + + +
 
+
   
+ + + + + + +
 
+
   
+
+
+ {#style_dlg.padding} + + + + + + + + + + + + + + + + + + + + + + +
 
+ + + + + + +
 
+
+ + + + + + +
 
+
+ + + + + + +
 
+
+ + + + + + +
 
+
+
+
+ +
+
+ {#style_dlg.margin} + + + + + + + + + + + + + + + + + + + + + + +
 
+ + + + + + +
 
+
+ + + + + + +
 
+
+ + + + + + +
 
+
+ + + + + + +
 
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  {#style_dlg.style} {#style_dlg.width} {#style_dlg.color}
      
{#style_dlg.top}   + + + + + + +
 
+
  + + + + + +
 
+
{#style_dlg.right}   + + + + + + +
 
+
  + + + + + +
 
+
{#style_dlg.bottom}   + + + + + + +
 
+
  + + + + + +
 
+
{#style_dlg.left}   + + + + + + +
 
+
  + + + + + +
 
+
+
+ +
+ + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
   
+ + + + + + +
 
+
   
+ + + + + + +
 
+
   
+ +
+
+ {#style_dlg.placement} + + + + + + + + + + + + + + + + + + + + + + +
 
{#style_dlg.top} + + + + + + +
 
+
{#style_dlg.right} + + + + + + +
 
+
{#style_dlg.bottom} + + + + + + +
 
+
{#style_dlg.left} + + + + + + +
 
+
+
+
+ +
+
+ {#style_dlg.clip} + + + + + + + + + + + + + + + + + + + + + + +
 
{#style_dlg.top} + + + + + + +
 
+
{#style_dlg.right} + + + + + + +
 
+
{#style_dlg.bottom} + + + + + + +
 
+
{#style_dlg.left} + + + + + + +
 
+
+
+
+
+
+
+ +
+ + + +
+
+ +
+
+
+ + + diff --git a/plugins/TinyMCE/js/plugins/tabfocus/editor_plugin.js b/plugins/TinyMCE/js/plugins/tabfocus/editor_plugin.js new file mode 100644 index 0000000000..27d2440222 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/tabfocus/editor_plugin.js @@ -0,0 +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 diff --git a/plugins/TinyMCE/js/plugins/tabfocus/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/tabfocus/editor_plugin_src.js new file mode 100644 index 0000000000..c2be2f40a6 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/tabfocus/editor_plugin_src.js @@ -0,0 +1,112 @@ +/** + * 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() { + var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, explode = tinymce.explode; + + tinymce.create('tinymce.plugins.TabFocusPlugin', { + init : function(ed, url) { + function tabCancel(ed, e) { + if (e.keyCode === 9) + return Event.cancel(e); + }; + + function tabHandler(ed, e) { + var x, i, f, el, v; + + function find(d) { + f = DOM.getParent(ed.id, 'form'); + el = f.elements; + + if (f) { + 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]; + } + } + } + + return null; + }; + + if (e.keyCode === 9) { + v = explode(ed.getParam('tab_focus', ed.getParam('tabfocus_elements', ':prev,:next'))); + + if (v.length == 1) { + v[1] = v[0]; + v[0] = ':prev'; + } + + // Find element to focus + if (e.shiftKey) { + if (v[0] == ':prev') + el = find(-1); + else + el = DOM.get(v[0]); + } else { + if (v[1] == ':next') + el = find(1); + else + el = DOM.get(v[1]); + } + + if (el) { + if (ed = tinymce.get(el.id || el.name)) + ed.focus(); + else + window.setTimeout(function() {window.focus();el.focus();}, 10); + + return Event.cancel(e); + } + } + }; + + ed.onKeyUp.add(tabCancel); + + if (tinymce.isGecko) { + ed.onKeyPress.add(tabHandler); + ed.onKeyDown.add(tabCancel); + } 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() { + 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 + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('tabfocus', tinymce.plugins.TabFocusPlugin); +})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/table/cell.htm b/plugins/TinyMCE/js/plugins/table/cell.htm new file mode 100644 index 0000000000..d243e1d833 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/table/cell.htm @@ -0,0 +1,178 @@ + + + + {#table_dlg.cell_title} + + + + + + + + +
+ + +
+
+
+ {#table_dlg.general_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ +
+
+
+ +
+
+ {#table_dlg.advanced_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + + + +
 
+
+ + + + + +
 
+
+ + + + + +
 
+
+
+
+
+ +
+
+ +
+ + + +
+
+ + diff --git a/plugins/TinyMCE/js/plugins/table/css/cell.css b/plugins/TinyMCE/js/plugins/table/css/cell.css new file mode 100644 index 0000000000..a067ecdfed --- /dev/null +++ b/plugins/TinyMCE/js/plugins/table/css/cell.css @@ -0,0 +1,17 @@ +/* CSS file for cell dialog in the table plugin */ + +.panel_wrapper div.current { + height: 200px; +} + +.advfield { + width: 200px; +} + +#action { + margin-bottom: 3px; +} + +#class { + width: 150px; +} \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/table/css/row.css b/plugins/TinyMCE/js/plugins/table/css/row.css new file mode 100644 index 0000000000..1f7755dafa --- /dev/null +++ b/plugins/TinyMCE/js/plugins/table/css/row.css @@ -0,0 +1,25 @@ +/* CSS file for row dialog in the table plugin */ + +.panel_wrapper div.current { + height: 200px; +} + +.advfield { + width: 200px; +} + +#action { + margin-bottom: 3px; +} + +#rowtype,#align,#valign,#class,#height { + width: 150px; +} + +#height { + width: 50px; +} + +.col2 { + padding-left: 20px; +} diff --git a/plugins/TinyMCE/js/plugins/table/css/table.css b/plugins/TinyMCE/js/plugins/table/css/table.css new file mode 100644 index 0000000000..d11c3f69cb --- /dev/null +++ b/plugins/TinyMCE/js/plugins/table/css/table.css @@ -0,0 +1,13 @@ +/* CSS file for table dialog in the table plugin */ + +.panel_wrapper div.current { + height: 245px; +} + +.advfield { + width: 200px; +} + +#class { + width: 150px; +} diff --git a/plugins/TinyMCE/js/plugins/table/editor_plugin.js b/plugins/TinyMCE/js/plugins/table/editor_plugin.js new file mode 100644 index 0000000000..266d7d5371 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/table/editor_plugin.js @@ -0,0 +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 diff --git a/plugins/TinyMCE/js/plugins/table/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/table/editor_plugin_src.js new file mode 100644 index 0000000000..c2f307f045 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/table/editor_plugin_src.js @@ -0,0 +1,1125 @@ +/** + * 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) { + var each = tinymce.each; + + /** + * Table Grid class. + */ + function TableGrid(table, dom, selection) { + var grid, startPos, endPos, selectedCell; + + buildGrid(); + selectedCell = dom.getParent(selection.getStart(), 'th,td'); + if (selectedCell) { + startPos = getPos(selectedCell); + endPos = findEndPos(); + selectedCell = getCell(startPos.x, startPos.y); + } + + function cloneNode(node, children) { + node = node.cloneNode(children); + node.removeAttribute('id'); + + return node; + } + + function buildGrid() { + var startY = 0; + + grid = []; + + each(['thead', 'tbody', 'tfoot'], function(part) { + var rows = dom.select(part + ' tr', table); + + each(rows, function(tr, y) { + y += startY; + + each(dom.select('td,th', tr), function(td, x) { + var x2, y2, rowspan, colspan; + + // Skip over existing cells produced by rowspan + if (grid[y]) { + while (grid[y][x]) + x++; + } + + // Get col/rowspan from cell + rowspan = getSpanVal(td, 'rowspan'); + colspan = getSpanVal(td, 'colspan'); + + // Fill out rowspan/colspan right and down + for (y2 = y; y2 < y + rowspan; y2++) { + if (!grid[y2]) + grid[y2] = []; + + for (x2 = x; x2 < x + colspan; x2++) { + grid[y2][x2] = { + part : part, + real : y2 == y && x2 == x, + elm : td, + rowspan : rowspan, + colspan : colspan + }; + } + } + }); + }); + + startY += rows.length; + }); + }; + + function getCell(x, y) { + var row; + + row = grid[y]; + if (row) + return row[x]; + }; + + function getSpanVal(td, name) { + return parseInt(td.getAttribute(name) || 1); + }; + + function isCellSelected(cell) { + return dom.hasClass(cell.elm, 'mceSelected') || cell == selectedCell; + }; + + function getSelectedRows() { + var rows = []; + + each(table.rows, function(row) { + each(row.cells, function(cell) { + if (dom.hasClass(cell, 'mceSelected') || cell == selectedCell.elm) { + rows.push(row); + return false; + } + }); + }); + + return rows; + }; + + function deleteTable() { + var rng = dom.createRng(); + + rng.setStartAfter(table); + rng.setEndAfter(table); + + selection.setRng(rng); + + dom.remove(table); + }; + + function cloneCell(cell) { + var formatNode; + + // Clone formats + tinymce.walk(cell, function(node) { + var curNode; + + if (node.nodeType == 3) { + each(dom.getParents(node.parentNode, null, cell).reverse(), function(node) { + node = cloneNode(node, false); + + if (!formatNode) + formatNode = curNode = node; + else if (curNode) + curNode.appendChild(node); + + curNode = node; + }); + + // Add something to the inner node + if (curNode) + curNode.innerHTML = tinymce.isIE ? ' ' : '
'; + + return false; + } + }, 'childNodes'); + + cell = cloneNode(cell, false); + cell.rowSpan = cell.colSpan = 1; + + if (formatNode) { + cell.appendChild(formatNode); + } else { + if (!tinymce.isIE) + cell.innerHTML = '
'; + } + + return cell; + }; + + function cleanup() { + var rng = dom.createRng(); + + // Empty rows + each(dom.select('tr', table), function(tr) { + if (tr.cells.length == 0) + dom.remove(tr); + }); + + // Empty table + if (dom.select('tr', table).length == 0) { + rng.setStartAfter(table); + rng.setEndAfter(table); + selection.setRng(rng); + dom.remove(table); + return; + } + + // Empty header/body/footer + each(dom.select('thead,tbody,tfoot', table), function(part) { + if (part.rows.length == 0) + dom.remove(part); + }); + + // Restore selection to start position if it still exists + buildGrid(); + + // Restore the selection to the closest table position + row = grid[Math.min(grid.length - 1, startPos.y)]; + if (row) { + selection.select(row[Math.min(row.length - 1, startPos.x)].elm, true); + selection.collapse(true); + } + }; + + function fillLeftDown(x, y, rows, cols) { + var tr, x2, r, c, cell; + + tr = grid[y][x].elm.parentNode; + for (r = 1; r <= rows; r++) { + tr = dom.getNext(tr, 'tr'); + + if (tr) { + // Loop left to find real cell + for (x2 = x; x2 >= 0; x2--) { + cell = grid[y + r][x2].elm; + + if (cell.parentNode == tr) { + // Append clones after + for (c = 1; c <= cols; c++) + dom.insertAfter(cloneCell(cell), cell); + + break; + } + } + + if (x2 == -1) { + // Insert nodes before first cell + for (c = 1; c <= cols; c++) + tr.insertBefore(cloneCell(tr.cells[0]), tr.cells[0]); + } + } + } + }; + + function split() { + each(grid, function(row, y) { + each(row, function(cell, x) { + var colSpan, rowSpan, newCell, i; + + if (isCellSelected(cell)) { + cell = cell.elm; + colSpan = getSpanVal(cell, 'colspan'); + rowSpan = getSpanVal(cell, 'rowspan'); + + if (colSpan > 1 || rowSpan > 1) { + cell.colSpan = cell.rowSpan = 1; + + // Insert cells right + for (i = 0; i < colSpan - 1; i++) + dom.insertAfter(cloneCell(cell), cell); + + fillLeftDown(x, y, rowSpan - 1, colSpan); + } + } + }); + }); + }; + + function merge(cell, cols, rows) { + var startX, startY, endX, endY, x, y, startCell, endCell, cell, children; + + // Use specified cell and cols/rows + if (cell) { + pos = getPos(cell); + startX = pos.x; + startY = pos.y; + endX = startX + (cols - 1); + endY = startY + (rows - 1); + } else { + // Use selection + startX = startPos.x; + startY = startPos.y; + endX = endPos.x; + endY = endPos.y; + } + + // Find start/end cells + startCell = getCell(startX, startY); + endCell = getCell(endX, endY); + + // Check if the cells exists and if they are of the same part for example tbody = tbody + if (startCell && endCell && startCell.part == endCell.part) { + // Split and rebuild grid + split(); + buildGrid(); + + // Set row/col span to start cell + startCell = getCell(startX, startY).elm; + startCell.colSpan = (endX - startX) + 1; + 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++) { + 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); + }); + + // Remove cell + dom.remove(cell); + } + } + } + + // Remove empty rows etc and restore caret location + cleanup(); + } + }; + + function insertRow(before) { + var posY, cell, lastCell, x, rowElm, newRow, newCell, otherCell; + + // Find first/last row + each(grid, function(row, y) { + each(row, function(cell, x) { + if (isCellSelected(cell)) { + cell = cell.elm; + rowElm = cell.parentNode; + newRow = cloneNode(rowElm, false); + posY = y; + + if (before) + return false; + } + }); + + if (before) + return !posY; + }); + + for (x = 0; x < grid[0].length; x++) { + cell = grid[posY][x].elm; + + if (cell != lastCell) { + if (!before) { + rowSpan = getSpanVal(cell, 'rowspan'); + if (rowSpan > 1) { + 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'); + if (rowSpan > 1) { + otherCell.rowSpan = rowSpan + 1; + continue; + } + } + } + + // Insert new cell into new row + newCell = cloneCell(cell) + newCell.colSpan = cell.colSpan; + newRow.appendChild(newCell); + + lastCell = cell; + } + } + + if (newRow.hasChildNodes()) { + if (!before) + dom.insertAfter(newRow, rowElm); + else + rowElm.parentNode.insertBefore(newRow, rowElm); + } + }; + + function insertCol(before) { + var posX, lastCell; + + // Find first/last column + each(grid, function(row, y) { + each(row, function(cell, x) { + if (isCellSelected(cell)) { + posX = x; + + if (before) + return false; + } + }); + + if (before) + return !posX; + }); + + each(grid, function(row, y) { + var cell = row[posX].elm, rowSpan, colSpan; + + if (cell != lastCell) { + colSpan = getSpanVal(cell, 'colspan'); + rowSpan = getSpanVal(cell, 'rowspan'); + + if (colSpan == 1) { + if (!before) { + dom.insertAfter(cloneCell(cell), cell); + fillLeftDown(posX, y, rowSpan - 1, colSpan); + } else { + cell.parentNode.insertBefore(cloneCell(cell), cell); + fillLeftDown(posX, y, rowSpan - 1, colSpan); + } + } else + cell.colSpan++; + + lastCell = cell; + } + }); + }; + + function deleteCols() { + var cols = []; + + // Get selected column indexes + each(grid, function(row, y) { + each(row, function(cell, x) { + if (isCellSelected(cell) && tinymce.inArray(cols, x) === -1) { + each(grid, function(row) { + var cell = row[x].elm, colSpan; + + colSpan = getSpanVal(cell, 'colspan'); + + if (colSpan > 1) + cell.colSpan = colSpan - 1; + else + dom.remove(cell); + }); + + cols.push(x); + } + }); + }); + + cleanup(); + }; + + function deleteRows() { + var rows; + + function deleteRow(tr) { + var nextTr, pos, lastCell; + + nextTr = dom.getNext(tr, 'tr'); + + // Move down row spanned cells + each(tr.cells, function(cell) { + var rowSpan = getSpanVal(cell, 'rowspan'); + + if (rowSpan > 1) { + cell.rowSpan = rowSpan - 1; + pos = getPos(cell); + fillLeftDown(pos.x, pos.y, 1, 1); + } + }); + + // Delete cells + pos = getPos(tr.cells[0]); + each(grid[pos.y], function(cell) { + var rowSpan; + + cell = cell.elm; + + if (cell != lastCell) { + rowSpan = getSpanVal(cell, 'rowspan'); + + if (rowSpan <= 1) + dom.remove(cell); + else + cell.rowSpan = rowSpan - 1; + + lastCell = cell; + } + }); + }; + + // Get selected rows and move selection out of scope + rows = getSelectedRows(); + + // Delete all selected rows + each(rows.reverse(), function(tr) { + deleteRow(tr); + }); + + cleanup(); + }; + + function cutRows() { + var rows = getSelectedRows(); + + dom.remove(rows); + cleanup(); + + return rows; + }; + + function copyRows() { + var rows = getSelectedRows(); + + each(rows, function(row, i) { + rows[i] = cloneNode(row, true); + }); + + return rows; + }; + + function pasteRows(rows, before) { + var selectedRows = getSelectedRows(), + targetRow = selectedRows[before ? 0 : selectedRows.length - 1], + targetCellCount = targetRow.cells.length; + + // Calc target cell count + each(grid, function(row) { + var match; + + targetCellCount = 0; + each(row, function(cell, x) { + if (cell.real) + targetCellCount += cell.colspan; + + if (cell.elm.parentNode == targetRow) + match = 1; + }); + + if (match) + return false; + }); + + if (!before) + rows.reverse(); + + each(rows, function(row) { + var cellCount = row.cells.length, cell; + + // Remove col/rowspans + for (i = 0; i < cellCount; i++) { + cell = row.cells[i]; + cell.colSpan = cell.rowSpan = 1; + } + + // Needs more cells + for (i = cellCount; i < targetCellCount; i++) + row.appendChild(cloneCell(row.cells[cellCount - 1])); + + // Needs less cells + for (i = targetCellCount; i < cellCount; i++) + dom.remove(row.cells[i]); + + // Add before/after + if (before) + targetRow.parentNode.insertBefore(row, targetRow); + else + dom.insertAfter(row, targetRow); + }); + }; + + function getPos(target) { + var pos; + + each(grid, function(row, y) { + each(row, function(cell, x) { + if (cell.elm == target) { + pos = {x : x, y : y}; + return false; + } + }); + + return !pos; + }); + + return pos; + }; + + function setStartCell(cell) { + startPos = getPos(cell); + }; + + function findEndPos() { + var pos, maxX, maxY; + + maxX = maxY = 0; + + each(grid, function(row, y) { + each(row, function(cell, x) { + var colSpan, rowSpan; + + if (isCellSelected(cell)) { + cell = grid[y][x]; + + if (x > maxX) + maxX = x; + + if (y > maxY) + maxY = y; + + if (cell.real) { + colSpan = cell.colspan - 1; + rowSpan = cell.rowspan - 1; + + if (colSpan) { + if (x + colSpan > maxX) + maxX = x + colSpan; + } + + if (rowSpan) { + if (y + rowSpan > maxY) + maxY = y + rowSpan; + } + } + } + }); + }); + + return {x : maxX, y : maxY}; + }; + + function setEndCell(cell) { + var startX, startY, endX, endY, maxX, maxY, colSpan, rowSpan; + + endPos = getPos(cell); + + if (startPos && endPos) { + // Get start/end positions + startX = Math.min(startPos.x, endPos.x); + startY = Math.min(startPos.y, endPos.y); + endX = Math.max(startPos.x, endPos.x); + endY = Math.max(startPos.y, endPos.y); + + // Expand end positon to include spans + maxX = endX; + maxY = endY; + + // Expand startX + for (y = startY; y <= maxY; y++) { + cell = grid[y][startX]; + + if (!cell.real) { + if (startX - (cell.colspan - 1) < startX) + startX -= cell.colspan - 1; + } + } + + // Expand startY + for (x = startX; x <= maxX; x++) { + cell = grid[startY][x]; + + if (!cell.real) { + if (startY - (cell.rowspan - 1) < startY) + startY -= cell.rowspan - 1; + } + } + + // Find max X, Y + for (y = startY; y <= endY; y++) { + for (x = startX; x <= endX; x++) { + cell = grid[y][x]; + + if (cell.real) { + colSpan = cell.colspan - 1; + rowSpan = cell.rowspan - 1; + + if (colSpan) { + if (x + colSpan > maxX) + maxX = x + colSpan; + } + + if (rowSpan) { + if (y + rowSpan > maxY) + maxY = y + rowSpan; + } + } + } + } + + // Remove current selection + dom.removeClass(dom.select('td.mceSelected,th.mceSelected'), 'mceSelected'); + + // Add new selection + for (y = startY; y <= maxY; y++) { + for (x = startX; x <= maxX; x++) + dom.addClass(grid[y][x].elm, 'mceSelected'); + } + } + }; + + // Expose to public + tinymce.extend(this, { + deleteTable : deleteTable, + split : split, + merge : merge, + insertRow : insertRow, + insertCol : insertCol, + deleteCols : deleteCols, + deleteRows : deleteRows, + cutRows : cutRows, + copyRows : copyRows, + pasteRows : pasteRows, + getPos : getPos, + setStartCell : setStartCell, + setEndCell : setEndCell + }); + }; + + tinymce.create('tinymce.plugins.TablePlugin', { + init : function(ed, url) { + var winMan, clipboardRows; + + function createTableGrid(node) { + var selection = ed.selection, tblElm = ed.dom.getParent(node || selection.getNode(), 'table'); + + if (tblElm) + return new TableGrid(tblElm, ed.dom, selection); + }; + + function cleanup() { + // Restore selection possibilities + ed.getBody().style.webkitUserSelect = ''; + ed.dom.removeClass(ed.dom.select('td.mceSelected,th.mceSelected'), 'mceSelected'); + }; + + // Register buttons + each([ + ['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(c) { + ed.addButton(c[0], {title : c[1], cmd : c[2], ui : c[3]}); + }); + + // Select whole table is a table border is clicked + if (!tinymce.isIE) { + ed.onClick.add(function(ed, e) { + e = e.target; + + if (e.nodeName === 'TABLE') + ed.selection.select(e); + }); + } + + // Handle node change updates + ed.onNodeChange.add(function(ed, cm, n) { + var p; + + n = ed.selection.getStart(); + p = ed.dom.getParent(n, 'td,th,caption'); + cm.setActive('table', n.nodeName === 'TABLE' || !!p); + + // Disable table tools if we are in caption + if (p && p.nodeName === 'CAPTION') + p = 0; + + cm.setDisabled('delete_table', !p); + cm.setDisabled('delete_col', !p); + cm.setDisabled('delete_table', !p); + cm.setDisabled('delete_row', !p); + cm.setDisabled('col_after', !p); + cm.setDisabled('col_before', !p); + cm.setDisabled('row_after', !p); + cm.setDisabled('row_before', !p); + cm.setDisabled('row_props', !p); + cm.setDisabled('cell_props', !p); + cm.setDisabled('split_cells', !p); + cm.setDisabled('merge_cells', !p); + }); + + ed.onInit.add(function(ed) { + var startTable, startCell, dom = ed.dom, tableGrid; + + winMan = ed.windowManager; + + // Add cell selection logic + ed.onMouseDown.add(function(ed, e) { + if (e.button != 2) { + cleanup(); + + startCell = dom.getParent(e.target, 'td,th'); + startTable = dom.getParent(startCell, 'table'); + } + }); + + dom.bind(ed.getDoc(), 'mouseover', function(e) { + var sel, table, target = e.target; + + if (startCell && (tableGrid || target != startCell) && (target.nodeName == 'TD' || target.nodeName == 'TH')) { + table = dom.getParent(target, 'table'); + if (table == startTable) { + if (!tableGrid) { + tableGrid = createTableGrid(table); + tableGrid.setStartCell(startCell); + + ed.getBody().style.webkitUserSelect = 'none'; + } + + tableGrid.setEndCell(target); + } + + // Remove current selection + sel = ed.selection.getSel(); + + if (sel.removeAllRanges) + sel.removeAllRanges(); + else + sel.empty(); + + e.preventDefault(); + } + }); + + ed.onMouseUp.add(function(ed, e) { + var rng, sel = ed.selection, selectedCells, nativeSel = sel.getSel(), walker, node, lastNode, endNode; + + // Move selection to startCell + if (startCell) { + if (tableGrid) + ed.getBody().style.webkitUserSelect = ''; + + function setPoint(node, start) { + var walker = new tinymce.dom.TreeWalker(node, node); + + do { + // Text node + if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length != 0) { + if (start) + rng.setStart(node, 0); + else + rng.setEnd(node, node.nodeValue.length); + + return; + } + + // BR element + if (node.nodeName == 'BR') { + if (start) + rng.setStartBefore(node); + else + rng.setEndBefore(node); + + return; + } + } while (node = (start ? walker.next() : walker.prev())); + }; + + // Try to expand text selection as much as we can only Gecko supports cell selection + selectedCells = dom.select('td.mceSelected,th.mceSelected'); + if (selectedCells.length > 0) { + rng = dom.createRng(); + node = selectedCells[0]; + endNode = selectedCells[selectedCells.length - 1]; + + setPoint(node, 1); + walker = new tinymce.dom.TreeWalker(node, dom.getParent(selectedCells[0], 'table')); + + do { + if (node.nodeName == 'TD' || node.nodeName == 'TH') { + if (!dom.hasClass(node, 'mceSelected')) + break; + + lastNode = node; + } + } while (node = walker.next()); + + setPoint(lastNode); + + sel.setRng(rng); + } + + ed.nodeChanged(); + startCell = tableGrid = startTable = null; + } + }); + + ed.onKeyUp.add(function(ed, e) { + cleanup(); + }); + + // Add context menu + if (ed && ed.plugins.contextmenu) { + ed.plugins.contextmenu.onContextMenu.add(function(th, m, e) { + var sm, se = ed.selection, el = se.getNode() || ed.getBody(); + + if (ed.dom.getParent(e, 'td') || ed.dom.getParent(e, 'th') || ed.dom.select('td.mceSelected,th.mceSelected').length) { + m.removeAll(); + + if (el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) { + m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true}); + m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'}); + m.addSeparator(); + } + + if (el.nodeName == 'IMG' && el.className.indexOf('mceItem') == -1) { + m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true}); + m.addSeparator(); + } + + m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable', value : {action : 'insert'}}); + m.add({title : 'table.props_desc', icon : 'table_props', cmd : 'mceInsertTable'}); + m.add({title : 'table.del', icon : 'delete_table', cmd : 'mceTableDelete'}); + m.addSeparator(); + + // Cell menu + sm = m.addMenu({title : 'table.cell'}); + sm.add({title : 'table.cell_desc', icon : 'cell_props', cmd : 'mceTableCellProps'}); + sm.add({title : 'table.split_cells_desc', icon : 'split_cells', cmd : 'mceTableSplitCells'}); + sm.add({title : 'table.merge_cells_desc', icon : 'merge_cells', cmd : 'mceTableMergeCells'}); + + // Row menu + sm = m.addMenu({title : 'table.row'}); + sm.add({title : 'table.row_desc', icon : 'row_props', cmd : 'mceTableRowProps'}); + sm.add({title : 'table.row_before_desc', icon : 'row_before', cmd : 'mceTableInsertRowBefore'}); + sm.add({title : 'table.row_after_desc', icon : 'row_after', cmd : 'mceTableInsertRowAfter'}); + sm.add({title : 'table.delete_row_desc', icon : 'delete_row', cmd : 'mceTableDeleteRow'}); + sm.addSeparator(); + sm.add({title : 'table.cut_row_desc', icon : 'cut', cmd : 'mceTableCutRow'}); + sm.add({title : 'table.copy_row_desc', icon : 'copy', cmd : 'mceTableCopyRow'}); + sm.add({title : 'table.paste_row_before_desc', icon : 'paste', cmd : 'mceTablePasteRowBefore'}).setDisabled(!clipboardRows); + sm.add({title : 'table.paste_row_after_desc', icon : 'paste', cmd : 'mceTablePasteRowAfter'}).setDisabled(!clipboardRows); + + // Column menu + sm = m.addMenu({title : 'table.col'}); + sm.add({title : 'table.col_before_desc', icon : 'col_before', cmd : 'mceTableInsertColBefore'}); + sm.add({title : 'table.col_after_desc', icon : 'col_after', cmd : 'mceTableInsertColAfter'}); + sm.add({title : 'table.delete_col_desc', icon : 'delete_col', cmd : 'mceTableDeleteCol'}); + } else + m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable'}); + }); + } + + // Fixes an issue on Gecko where it's impossible to place the caret behind a table + // This fix will force a paragraph element after the table but only when the forced_root_block setting is enabled + if (!tinymce.isIE) { + function fixTableCaretPos() { + var last; + + // Skip empty text nodes form the end + for (last = ed.getBody().lastChild; last && last.nodeType == 3 && !last.nodeValue.length; last = last.previousSibling) ; + + if (last && last.nodeName == 'TABLE') + ed.dom.add(ed.getBody(), 'p', null, '
'); + }; + + // Fixes an bug where it's impossible to place the caret before a table in Gecko + // this fix solves it by detecting when the caret is at the beginning of such a table + // and then manually moves the caret infront of the table + if (tinymce.isGecko) { + ed.onKeyDown.add(function(ed, e) { + var rng, table, dom = ed.dom; + + // On gecko it's not possible to place the caret before a table + if (e.keyCode == 37 || e.keyCode == 38) { + rng = ed.selection.getRng(); + table = dom.getParent(rng.startContainer, 'table'); + + if (table && ed.getBody().firstChild == table) { + if (isAtStart(rng, table)) { + rng = dom.createRng(); + + rng.setStartBefore(table); + rng.setEndBefore(table); + + ed.selection.setRng(rng); + + e.preventDefault(); + } + } + } + }); + } + + ed.onKeyUp.add(fixTableCaretPos); + ed.onSetContent.add(fixTableCaretPos); + ed.onVisualAid.add(fixTableCaretPos); + + ed.onPreProcess.add(function(ed, o) { + var last = o.node.lastChild; + + if (last && last.childNodes.length == 1 && last.firstChild.nodeName == 'BR') + ed.dom.remove(last); + }); + + fixTableCaretPos(); + } + }); + + // Register action commands + each({ + mceTableSplitCells : function(grid) { + grid.split(); + }, + + mceTableMergeCells : function(grid) { + var rowSpan, colSpan, cell; + + cell = ed.dom.getParent(ed.selection.getNode(), 'th,td'); + if (cell) { + rowSpan = cell.rowSpan; + colSpan = cell.colSpan; + } + + if (!ed.dom.select('td.mceSelected,th.mceSelected').length) { + winMan.open({ + url : url + '/merge_cells.htm', + width : 240 + parseInt(ed.getLang('table.merge_cells_delta_width', 0)), + height : 110 + parseInt(ed.getLang('table.merge_cells_delta_height', 0)), + inline : 1 + }, { + rows : rowSpan, + cols : colSpan, + onaction : function(data) { + grid.merge(cell, data.cols, data.rows); + }, + plugin_url : url + }); + } else + grid.merge(); + }, + + mceTableInsertRowBefore : function(grid) { + grid.insertRow(true); + }, + + mceTableInsertRowAfter : function(grid) { + grid.insertRow(); + }, + + mceTableInsertColBefore : function(grid) { + grid.insertCol(true); + }, + + mceTableInsertColAfter : function(grid) { + grid.insertCol(); + }, + + mceTableDeleteCol : function(grid) { + grid.deleteCols(); + }, + + mceTableDeleteRow : function(grid) { + grid.deleteRows(); + }, + + mceTableCutRow : function(grid) { + clipboardRows = grid.cutRows(); + }, + + mceTableCopyRow : function(grid) { + clipboardRows = grid.copyRows(); + }, + + mceTablePasteRowBefore : function(grid) { + grid.pasteRows(clipboardRows, true); + }, + + mceTablePasteRowAfter : function(grid) { + grid.pasteRows(clipboardRows); + }, + + mceTableDelete : function(grid) { + grid.deleteTable(); + } + }, function(func, name) { + ed.addCommand(name, function() { + var grid = createTableGrid(); + + if (grid) { + func(grid); + ed.execCommand('mceRepaint'); + cleanup(); + } + }); + }); + + // Register dialog commands + each({ + mceInsertTable : function(val) { + winMan.open({ + url : url + '/table.htm', + width : 400 + parseInt(ed.getLang('table.table_delta_width', 0)), + height : 320 + parseInt(ed.getLang('table.table_delta_height', 0)), + inline : 1 + }, { + plugin_url : url, + action : val ? val.action : 0 + }); + }, + + mceTableRowProps : function() { + winMan.open({ + url : url + '/row.htm', + width : 400 + parseInt(ed.getLang('table.rowprops_delta_width', 0)), + height : 295 + parseInt(ed.getLang('table.rowprops_delta_height', 0)), + inline : 1 + }, { + plugin_url : url + }); + }, + + mceTableCellProps : function() { + winMan.open({ + url : url + '/cell.htm', + width : 400 + parseInt(ed.getLang('table.cellprops_delta_width', 0)), + height : 295 + parseInt(ed.getLang('table.cellprops_delta_height', 0)), + inline : 1 + }, { + plugin_url : url + }); + } + }, function(func, name) { + ed.addCommand(name, function(ui, val) { + func(val); + }); + }); + } + }); + + // Register plugin + tinymce.PluginManager.add('table', tinymce.plugins.TablePlugin); +})(tinymce); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/table/js/cell.js b/plugins/TinyMCE/js/plugins/table/js/cell.js new file mode 100644 index 0000000000..b5fc1fda3d --- /dev/null +++ b/plugins/TinyMCE/js/plugins/table/js/cell.js @@ -0,0 +1,286 @@ +tinyMCEPopup.requireLangPack(); + +var ed; + +function init() { + ed = tinyMCEPopup.editor; + tinyMCEPopup.resizeToInnerSize(); + + document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table'); + document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor'); + document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor') + + var inst = ed; + var tdElm = ed.dom.getParent(ed.selection.getStart(), "td,th"); + var formObj = document.forms[0]; + var st = ed.dom.parseStyle(ed.dom.getAttrib(tdElm, "style")); + + // Get table cell data + var celltype = tdElm.nodeName.toLowerCase(); + var align = ed.dom.getAttrib(tdElm, 'align'); + var valign = ed.dom.getAttrib(tdElm, 'valign'); + var width = trimSize(getStyle(tdElm, 'width', 'width')); + var height = trimSize(getStyle(tdElm, 'height', 'height')); + var bordercolor = convertRGBToHex(getStyle(tdElm, 'bordercolor', 'borderLeftColor')); + var bgcolor = convertRGBToHex(getStyle(tdElm, 'bgcolor', 'backgroundColor')); + var className = ed.dom.getAttrib(tdElm, 'class'); + var backgroundimage = getStyle(tdElm, 'background', 'backgroundImage').replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1"); + var id = ed.dom.getAttrib(tdElm, 'id'); + var lang = ed.dom.getAttrib(tdElm, 'lang'); + var dir = ed.dom.getAttrib(tdElm, 'dir'); + var scope = ed.dom.getAttrib(tdElm, 'scope'); + + // Setup form + addClassesToList('class', 'table_cell_styles'); + TinyMCE_EditableSelects.init(); + + if (!ed.dom.hasClass(tdElm, 'mceSelected')) { + formObj.bordercolor.value = bordercolor; + formObj.bgcolor.value = bgcolor; + formObj.backgroundimage.value = backgroundimage; + formObj.width.value = width; + formObj.height.value = height; + formObj.id.value = id; + formObj.lang.value = lang; + formObj.style.value = ed.dom.serializeStyle(st); + selectByValue(formObj, 'align', align); + selectByValue(formObj, 'valign', valign); + selectByValue(formObj, 'class', className, true, true); + selectByValue(formObj, 'celltype', celltype); + selectByValue(formObj, 'dir', dir); + selectByValue(formObj, 'scope', scope); + + // Resize some elements + if (isVisible('backgroundimagebrowser')) + document.getElementById('backgroundimage').style.width = '180px'; + + updateColor('bordercolor_pick', 'bordercolor'); + updateColor('bgcolor_pick', 'bgcolor'); + } else + tinyMCEPopup.dom.hide('action'); +} + +function updateAction() { + var el, inst = ed, tdElm, trElm, tableElm, formObj = document.forms[0]; + + tinyMCEPopup.restoreSelection(); + el = ed.selection.getStart(); + tdElm = ed.dom.getParent(el, "td,th"); + trElm = ed.dom.getParent(el, "tr"); + tableElm = ed.dom.getParent(el, "table"); + + // Cell is selected + if (ed.dom.hasClass(tdElm, 'mceSelected')) { + // Update all selected sells + tinymce.each(ed.dom.select('td.mceSelected,th.mceSelected'), function(td) { + updateCell(td); + }); + + ed.addVisual(); + ed.nodeChanged(); + inst.execCommand('mceEndUndoLevel'); + tinyMCEPopup.close(); + return; + } + + ed.execCommand('mceBeginUndoLevel'); + + switch (getSelectValue(formObj, 'action')) { + case "cell": + var celltype = getSelectValue(formObj, 'celltype'); + var scope = getSelectValue(formObj, 'scope'); + + function doUpdate(s) { + if (s) { + updateCell(tdElm); + + ed.addVisual(); + ed.nodeChanged(); + inst.execCommand('mceEndUndoLevel'); + tinyMCEPopup.close(); + } + }; + + if (ed.getParam("accessibility_warnings", 1)) { + if (celltype == "th" && scope == "") + tinyMCEPopup.confirm(ed.getLang('table_dlg.missing_scope', '', true), doUpdate); + else + doUpdate(1); + + return; + } + + updateCell(tdElm); + break; + + case "row": + var cell = trElm.firstChild; + + if (cell.nodeName != "TD" && cell.nodeName != "TH") + cell = nextCell(cell); + + do { + cell = updateCell(cell, true); + } while ((cell = nextCell(cell)) != null); + + break; + + case "all": + var rows = tableElm.getElementsByTagName("tr"); + + for (var i=0; i 0) { + tinymce.each(tableElm.rows, function(tr) { + var i; + + for (i = 0; i < tr.cells.length; i++) { + if (dom.hasClass(tr.cells[i], 'mceSelected')) { + updateRow(tr, true); + return; + } + } + }); + + inst.addVisual(); + inst.nodeChanged(); + inst.execCommand('mceEndUndoLevel'); + tinyMCEPopup.close(); + return; + } + + inst.execCommand('mceBeginUndoLevel'); + + switch (action) { + case "row": + updateRow(trElm); + break; + + case "all": + var rows = tableElm.getElementsByTagName("tr"); + + for (var i=0; i colLimit) { + tinyMCEPopup.alert(inst.getLang('table_dlg.col_limit').replace(/\{\$cols\}/g, colLimit)); + return false; + } else if (rowLimit && rows > rowLimit) { + tinyMCEPopup.alert(inst.getLang('table_dlg.row_limit').replace(/\{\$rows\}/g, rowLimit)); + return false; + } else if (cellLimit && cols * rows > cellLimit) { + tinyMCEPopup.alert(inst.getLang('table_dlg.cell_limit').replace(/\{\$cells\}/g, cellLimit)); + return false; + } + + // Update table + if (action == "update") { + inst.execCommand('mceBeginUndoLevel'); + + dom.setAttrib(elm, 'cellPadding', cellpadding, true); + dom.setAttrib(elm, 'cellSpacing', cellspacing, true); + dom.setAttrib(elm, 'border', border); + dom.setAttrib(elm, 'align', align); + dom.setAttrib(elm, 'frame', frame); + dom.setAttrib(elm, 'rules', rules); + dom.setAttrib(elm, 'class', className); + dom.setAttrib(elm, 'style', style); + dom.setAttrib(elm, 'id', id); + dom.setAttrib(elm, 'summary', summary); + dom.setAttrib(elm, 'dir', dir); + dom.setAttrib(elm, 'lang', lang); + + capEl = inst.dom.select('caption', elm)[0]; + + if (capEl && !caption) + capEl.parentNode.removeChild(capEl); + + if (!capEl && caption) { + capEl = elm.ownerDocument.createElement('caption'); + + if (!tinymce.isIE) + capEl.innerHTML = '
'; + + elm.insertBefore(capEl, elm.firstChild); + } + + if (width && inst.settings.inline_styles) { + dom.setStyle(elm, 'width', width); + dom.setAttrib(elm, 'width', ''); + } else { + dom.setAttrib(elm, 'width', width, true); + dom.setStyle(elm, 'width', ''); + } + + // Remove these since they are not valid XHTML + dom.setAttrib(elm, 'borderColor', ''); + dom.setAttrib(elm, 'bgColor', ''); + dom.setAttrib(elm, 'background', ''); + + if (height && inst.settings.inline_styles) { + dom.setStyle(elm, 'height', height); + dom.setAttrib(elm, 'height', ''); + } else { + dom.setAttrib(elm, 'height', height, true); + dom.setStyle(elm, 'height', ''); + } + + if (background != '') + elm.style.backgroundImage = "url('" + background + "')"; + else + elm.style.backgroundImage = ''; + +/* if (tinyMCEPopup.getParam("inline_styles")) { + if (width != '') + elm.style.width = getCSSSize(width); + }*/ + + if (bordercolor != "") { + elm.style.borderColor = bordercolor; + elm.style.borderStyle = elm.style.borderStyle == "" ? "solid" : elm.style.borderStyle; + elm.style.borderWidth = border == "" ? "1px" : border; + } else + elm.style.borderColor = ''; + + elm.style.backgroundColor = bgcolor; + elm.style.height = getCSSSize(height); + + inst.addVisual(); + + // Fix for stange MSIE align bug + //elm.outerHTML = elm.outerHTML; + + inst.nodeChanged(); + inst.execCommand('mceEndUndoLevel'); + + // Repaint if dimensions changed + if (formObj.width.value != orgTableWidth || formObj.height.value != orgTableHeight) + inst.execCommand('mceRepaint'); + + tinyMCEPopup.close(); + return true; + } + + // Create new table + html += ''); + + tinymce.each('h1,h2,h3,h4,h5,h6,p'.split(','), function(n) { + if (patt) + patt += ','; + + patt += n + ' ._mce_marker'; + }); + + tinymce.each(inst.dom.select(patt), function(n) { + inst.dom.split(inst.dom.getParent(n, 'h1,h2,h3,h4,h5,h6,p'), n); + }); + + dom.setOuterHTML(dom.select('br._mce_marker')[0], html); + } else + inst.execCommand('mceInsertContent', false, html); + + tinymce.each(dom.select('table[_mce_new]'), function(node) { + var td = dom.select('td', node); + + inst.selection.select(td[0], true); + inst.selection.collapse(); + + dom.setAttrib(node, '_mce_new', ''); + }); + + inst.addVisual(); + inst.execCommand('mceEndUndoLevel'); + + tinyMCEPopup.close(); +} + +function makeAttrib(attrib, value) { + var formObj = document.forms[0]; + var valueElm = formObj.elements[attrib]; + + if (typeof(value) == "undefined" || value == null) { + value = ""; + + if (valueElm) + value = valueElm.value; + } + + if (value == "") + return ""; + + // XML encode it + value = value.replace(/&/g, '&'); + value = value.replace(/\"/g, '"'); + value = value.replace(//g, '>'); + + return ' ' + attrib + '="' + value + '"'; +} + +function init() { + tinyMCEPopup.resizeToInnerSize(); + + document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table'); + document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table'); + document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor'); + document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); + + var cols = 2, rows = 2, border = tinyMCEPopup.getParam('table_default_border', '0'), cellpadding = tinyMCEPopup.getParam('table_default_cellpadding', ''), cellspacing = tinyMCEPopup.getParam('table_default_cellspacing', ''); + var align = "", width = "", height = "", bordercolor = "", bgcolor = "", className = ""; + var id = "", summary = "", style = "", dir = "", lang = "", background = "", bgcolor = "", bordercolor = "", rules, frame; + var inst = tinyMCEPopup.editor, dom = inst.dom; + var formObj = document.forms[0]; + var elm = dom.getParent(inst.selection.getNode(), "table"); + + action = tinyMCEPopup.getWindowArg('action'); + + if (!action) + action = elm ? "update" : "insert"; + + if (elm && action != "insert") { + var rowsAr = elm.rows; + var cols = 0; + for (var i=0; i cols) + cols = rowsAr[i].cells.length; + + cols = cols; + rows = rowsAr.length; + + st = dom.parseStyle(dom.getAttrib(elm, "style")); + border = trimSize(getStyle(elm, 'border', 'borderWidth')); + cellpadding = dom.getAttrib(elm, 'cellpadding', ""); + cellspacing = dom.getAttrib(elm, 'cellspacing', ""); + width = trimSize(getStyle(elm, 'width', 'width')); + height = trimSize(getStyle(elm, 'height', 'height')); + bordercolor = convertRGBToHex(getStyle(elm, 'bordercolor', 'borderLeftColor')); + bgcolor = convertRGBToHex(getStyle(elm, 'bgcolor', 'backgroundColor')); + align = dom.getAttrib(elm, 'align', align); + frame = dom.getAttrib(elm, 'frame'); + rules = dom.getAttrib(elm, 'rules'); + className = tinymce.trim(dom.getAttrib(elm, 'class').replace(/mceItem.+/g, '')); + id = dom.getAttrib(elm, 'id'); + summary = dom.getAttrib(elm, 'summary'); + style = dom.serializeStyle(st); + dir = dom.getAttrib(elm, 'dir'); + lang = dom.getAttrib(elm, 'lang'); + background = getStyle(elm, 'background', 'backgroundImage').replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1"); + formObj.caption.checked = elm.getElementsByTagName('caption').length > 0; + + orgTableWidth = width; + orgTableHeight = height; + + action = "update"; + formObj.insert.value = inst.getLang('update'); + } + + addClassesToList('class', "table_styles"); + TinyMCE_EditableSelects.init(); + + // Update form + selectByValue(formObj, 'align', align); + selectByValue(formObj, 'tframe', frame); + selectByValue(formObj, 'rules', rules); + selectByValue(formObj, 'class', className, true, true); + formObj.cols.value = cols; + formObj.rows.value = rows; + formObj.border.value = border; + formObj.cellpadding.value = cellpadding; + formObj.cellspacing.value = cellspacing; + formObj.width.value = width; + formObj.height.value = height; + formObj.bordercolor.value = bordercolor; + formObj.bgcolor.value = bgcolor; + formObj.id.value = id; + formObj.summary.value = summary; + formObj.style.value = style; + formObj.dir.value = dir; + formObj.lang.value = lang; + formObj.backgroundimage.value = background; + + updateColor('bordercolor_pick', 'bordercolor'); + updateColor('bgcolor_pick', 'bgcolor'); + + // Resize some elements + if (isVisible('backgroundimagebrowser')) + document.getElementById('backgroundimage').style.width = '180px'; + + // Disable some fields in update mode + if (action == "update") { + formObj.cols.disabled = true; + formObj.rows.disabled = true; + } +} + +function changedSize() { + var formObj = document.forms[0]; + var st = dom.parseStyle(formObj.style.value); + +/* var width = formObj.width.value; + if (width != "") + st['width'] = tinyMCEPopup.getParam("inline_styles") ? getCSSSize(width) : ""; + else + st['width'] = "";*/ + + var height = formObj.height.value; + if (height != "") + st['height'] = getCSSSize(height); + else + st['height'] = ""; + + formObj.style.value = dom.serializeStyle(st); +} + +function changedBackgroundImage() { + var formObj = document.forms[0]; + var st = dom.parseStyle(formObj.style.value); + + st['background-image'] = "url('" + formObj.backgroundimage.value + "')"; + + formObj.style.value = dom.serializeStyle(st); +} + +function changedBorder() { + var formObj = document.forms[0]; + var st = dom.parseStyle(formObj.style.value); + + // Update border width if the element has a color + if (formObj.border.value != "" && formObj.bordercolor.value != "") + st['border-width'] = formObj.border.value + "px"; + + formObj.style.value = dom.serializeStyle(st); +} + +function changedColor() { + var formObj = document.forms[0]; + var st = dom.parseStyle(formObj.style.value); + + st['background-color'] = formObj.bgcolor.value; + + if (formObj.bordercolor.value != "") { + st['border-color'] = formObj.bordercolor.value; + + // Add border-width if it's missing + if (!st['border-width']) + st['border-width'] = formObj.border.value == "" ? "1px" : formObj.border.value + "px"; + } + + formObj.style.value = dom.serializeStyle(st); +} + +function changedStyle() { + var formObj = document.forms[0]; + var st = dom.parseStyle(formObj.style.value); + + if (st['background-image']) + formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1"); + else + formObj.backgroundimage.value = ''; + + if (st['width']) + formObj.width.value = trimSize(st['width']); + + if (st['height']) + formObj.height.value = trimSize(st['height']); + + if (st['background-color']) { + formObj.bgcolor.value = st['background-color']; + updateColor('bgcolor_pick','bgcolor'); + } + + if (st['border-color']) { + formObj.bordercolor.value = st['border-color']; + updateColor('bordercolor_pick','bordercolor'); + } +} + +tinyMCEPopup.onInit.add(init); diff --git a/plugins/TinyMCE/js/plugins/table/langs/en_dlg.js b/plugins/TinyMCE/js/plugins/table/langs/en_dlg.js new file mode 100644 index 0000000000..000332a35d --- /dev/null +++ b/plugins/TinyMCE/js/plugins/table/langs/en_dlg.js @@ -0,0 +1,74 @@ +tinyMCE.addI18n('en.table_dlg',{ +general_tab:"General", +advanced_tab:"Advanced", +general_props:"General properties", +advanced_props:"Advanced properties", +rowtype:"Row in table part", +title:"Insert/Modify table", +width:"Width", +height:"Height", +cols:"Cols", +rows:"Rows", +cellspacing:"Cellspacing", +cellpadding:"Cellpadding", +border:"Border", +align:"Alignment", +align_default:"Default", +align_left:"Left", +align_right:"Right", +align_middle:"Center", +row_title:"Table row properties", +cell_title:"Table cell properties", +cell_type:"Cell type", +valign:"Vertical alignment", +align_top:"Top", +align_bottom:"Bottom", +bordercolor:"Border color", +bgcolor:"Background color", +merge_cells_title:"Merge table cells", +id:"Id", +style:"Style", +langdir:"Language direction", +langcode:"Language code", +mime:"Target MIME type", +ltr:"Left to right", +rtl:"Right to left", +bgimage:"Background image", +summary:"Summary", +td:"Data", +th:"Header", +cell_cell:"Update current cell", +cell_row:"Update all cells in row", +cell_all:"Update all cells in table", +row_row:"Update current row", +row_odd:"Update odd rows in table", +row_even:"Update even rows in table", +row_all:"Update all rows in table", +thead:"Table Head", +tbody:"Table Body", +tfoot:"Table Foot", +scope:"Scope", +rowgroup:"Row Group", +colgroup:"Col Group", +col_limit:"You've exceeded the maximum number of columns of {$cols}.", +row_limit:"You've exceeded the maximum number of rows of {$rows}.", +cell_limit:"You've exceeded the maximum number of cells of {$cells}.", +missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.", +caption:"Table caption", +frame:"Frame", +frame_none:"none", +frame_groups:"groups", +frame_rows:"rows", +frame_cols:"cols", +frame_all:"all", +rules:"Rules", +rules_void:"void", +rules_above:"above", +rules_below:"below", +rules_hsides:"hsides", +rules_lhs:"lhs", +rules_rhs:"rhs", +rules_vsides:"vsides", +rules_box:"box", +rules_border:"border" +}); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/table/merge_cells.htm b/plugins/TinyMCE/js/plugins/table/merge_cells.htm new file mode 100644 index 0000000000..9736ed8c03 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/table/merge_cells.htm @@ -0,0 +1,32 @@ + + + + {#table_dlg.merge_cells_title} + + + + + + +
+
+ {#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 new file mode 100644 index 0000000000..092e6c8270 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/table/row.htm @@ -0,0 +1,155 @@ + + + + {#table_dlg.row_title} + + + + + + + + +
+ + +
+
+
+ {#table_dlg.general_props} + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +
+ +
+
+
+ +
+
+ {#table_dlg.advanced_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + + + +
 
+
+ + + + + +
 
+
+
+
+
+ +
+
+ +
+ + + +
+
+ + diff --git a/plugins/TinyMCE/js/plugins/table/table.htm b/plugins/TinyMCE/js/plugins/table/table.htm new file mode 100644 index 0000000000..f269039228 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/table/table.htm @@ -0,0 +1,187 @@ + + + + {#table_dlg.title} + + + + + + + + + +
+ + +
+
+
+ {#table_dlg.general_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+
+ {#table_dlg.advanced_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
 
+
+ +
+ +
+ +
+ + + + + +
 
+
+ + + + + +
 
+
+
+
+
+ +
+ + +
+
+ + diff --git a/plugins/TinyMCE/js/plugins/template/blank.htm b/plugins/TinyMCE/js/plugins/template/blank.htm new file mode 100644 index 0000000000..ecde53fae7 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/template/blank.htm @@ -0,0 +1,12 @@ + + + blank_page + + + + + + + diff --git a/plugins/TinyMCE/js/plugins/template/css/template.css b/plugins/TinyMCE/js/plugins/template/css/template.css new file mode 100644 index 0000000000..2d23a4938c --- /dev/null +++ b/plugins/TinyMCE/js/plugins/template/css/template.css @@ -0,0 +1,23 @@ +#frmbody { + padding: 10px; + background-color: #FFF; + border: 1px solid #CCC; +} + +.frmRow { + margin-bottom: 10px; +} + +#templatesrc { + border: none; + width: 320px; + height: 240px; +} + +.title { + padding-bottom: 5px; +} + +.mceActionPanel { + padding-top: 5px; +} diff --git a/plugins/TinyMCE/js/plugins/template/editor_plugin.js b/plugins/TinyMCE/js/plugins/template/editor_plugin.js new file mode 100644 index 0000000000..ebe3c27d78 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/template/editor_plugin.js @@ -0,0 +1 @@ +(function(){var a=tinymce.each;tinymce.create("tinymce.plugins.TemplatePlugin",{init:function(b,c){var d=this;d.editor=b;b.addCommand("mceTemplate",function(e){b.windowManager.open({file:c+"/template.htm",width:b.getParam("template_popup_width",750),height:b.getParam("template_popup_height",600),inline:1},{plugin_url:c})});b.addCommand("mceInsertTemplate",d._insertTemplate,d);b.addButton("template",{title:"template.desc",cmd:"mceTemplate"});b.onPreProcess.add(function(e,g){var f=e.dom;a(f.select("div",g.node),function(h){if(f.hasClass(h,"mceTmpl")){a(f.select("*",h),function(i){if(f.hasClass(i,e.getParam("template_mdate_classes","mdate").replace(/\s+/g,"|"))){i.innerHTML=d._getDateTime(new Date(),e.getParam("template_mdate_format",e.getLang("template.mdate_format")))}});d._replaceVals(h)}})})},getInfo:function(){return{longname:"Template plugin",author:"Moxiecode Systems AB",authorurl:"http://www.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/template",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_insertTemplate:function(i,j){var k=this,g=k.editor,f,c,d=g.dom,b=g.selection.getContent();f=j.content;a(k.editor.getParam("template_replace_values"),function(l,h){if(typeof(l)!="function"){f=f.replace(new RegExp("\\{\\$"+h+"\\}","g"),l)}});c=d.create("div",null,f);n=d.select(".mceTmpl",c);if(n&&n.length>0){c=d.create("div",null);c.appendChild(n[0].cloneNode(true))}function e(l,h){return new RegExp("\\b"+h+"\\b","g").test(l.className)}a(d.select("*",c),function(h){if(e(h,g.getParam("template_cdate_classes","cdate").replace(/\s+/g,"|"))){h.innerHTML=k._getDateTime(new Date(),g.getParam("template_cdate_format",g.getLang("template.cdate_format")))}if(e(h,g.getParam("template_mdate_classes","mdate").replace(/\s+/g,"|"))){h.innerHTML=k._getDateTime(new Date(),g.getParam("template_mdate_format",g.getLang("template.mdate_format")))}if(e(h,g.getParam("template_selected_content_classes","selcontent").replace(/\s+/g,"|"))){h.innerHTML=b}});k._replaceVals(c);g.execCommand("mceInsertContent",false,c.innerHTML);g.addVisual()},_replaceVals:function(c){var d=this.editor.dom,b=this.editor.getParam("template_replace_values");a(d.select("*",c),function(f){a(b,function(g,e){if(d.hasClass(f,e)){if(typeof(b[e])=="function"){b[e](f)}}})})},_getDateTime:function(e,b){if(!b){return""}function c(g,d){var f;g=""+g;if(g.length 0) { + el = dom.create('div', null); + el.appendChild(n[0].cloneNode(true)); + } + + function hasClass(n, c) { + return new RegExp('\\b' + c + '\\b', 'g').test(n.className); + }; + + each(dom.select('*', el), function(n) { + // Replace cdate + if (hasClass(n, ed.getParam('template_cdate_classes', 'cdate').replace(/\s+/g, '|'))) + n.innerHTML = t._getDateTime(new Date(), ed.getParam("template_cdate_format", ed.getLang("template.cdate_format"))); + + // Replace mdate + if (hasClass(n, ed.getParam('template_mdate_classes', 'mdate').replace(/\s+/g, '|'))) + n.innerHTML = t._getDateTime(new Date(), ed.getParam("template_mdate_format", ed.getLang("template.mdate_format"))); + + // Replace selection + if (hasClass(n, ed.getParam('template_selected_content_classes', 'selcontent').replace(/\s+/g, '|'))) + n.innerHTML = sel; + }); + + t._replaceVals(el); + + ed.execCommand('mceInsertContent', false, el.innerHTML); + ed.addVisual(); + }, + + _replaceVals : function(e) { + var dom = this.editor.dom, vl = this.editor.getParam('template_replace_values'); + + each(dom.select('*', e), function(e) { + each(vl, function(v, k) { + if (dom.hasClass(e, k)) { + if (typeof(vl[k]) == 'function') + vl[k](e); + } + }); + }); + }, + + _getDateTime : function(d, fmt) { + if (!fmt) + return ""; + + function addZeros(value, len) { + var i; + + value = "" + value; + + if (value.length < len) { + for (i=0; i<(len-value.length); i++) + value = "0" + value; + } + + return value; + } + + fmt = fmt.replace("%D", "%m/%d/%y"); + fmt = fmt.replace("%r", "%I:%M:%S %p"); + fmt = fmt.replace("%Y", "" + d.getFullYear()); + fmt = fmt.replace("%y", "" + d.getYear()); + fmt = fmt.replace("%m", addZeros(d.getMonth()+1, 2)); + fmt = fmt.replace("%d", addZeros(d.getDate(), 2)); + fmt = fmt.replace("%H", "" + addZeros(d.getHours(), 2)); + fmt = fmt.replace("%M", "" + addZeros(d.getMinutes(), 2)); + fmt = fmt.replace("%S", "" + addZeros(d.getSeconds(), 2)); + fmt = fmt.replace("%I", "" + ((d.getHours() + 11) % 12 + 1)); + fmt = fmt.replace("%p", "" + (d.getHours() < 12 ? "AM" : "PM")); + fmt = fmt.replace("%B", "" + this.editor.getLang("template_months_long").split(',')[d.getMonth()]); + fmt = fmt.replace("%b", "" + this.editor.getLang("template_months_short").split(',')[d.getMonth()]); + fmt = fmt.replace("%A", "" + this.editor.getLang("template_day_long").split(',')[d.getDay()]); + fmt = fmt.replace("%a", "" + this.editor.getLang("template_day_short").split(',')[d.getDay()]); + fmt = fmt.replace("%%", "%"); + + return fmt; + } + }); + + // Register plugin + tinymce.PluginManager.add('template', tinymce.plugins.TemplatePlugin); +})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/template/js/template.js b/plugins/TinyMCE/js/plugins/template/js/template.js new file mode 100644 index 0000000000..24045d7311 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/template/js/template.js @@ -0,0 +1,106 @@ +tinyMCEPopup.requireLangPack(); + +var TemplateDialog = { + preInit : function() { + var url = tinyMCEPopup.getParam("template_external_list_url"); + + if (url != null) + document.write(''); + }, + + init : function() { + var ed = tinyMCEPopup.editor, tsrc, sel, x, u; + + tsrc = ed.getParam("template_templates", false); + sel = document.getElementById('tpath'); + + // Setup external template list + if (!tsrc && typeof(tinyMCETemplateList) != 'undefined') { + for (x=0, tsrc = []; x'); + }); + }, + + selectTemplate : function(u, ti) { + var d = window.frames['templatesrc'].document, x, tsrc = this.tsrc; + + if (!u) + return; + + d.body.innerHTML = this.templateHTML = this.getFileContents(u); + + for (x=0; x + + {#template_dlg.title} + + + + + +
+
+
{#template_dlg.desc}
+
+ +
+
+
+
+ {#template_dlg.preview} + +
+
+ +
+ + +
+
+ + diff --git a/plugins/TinyMCE/js/plugins/visualchars/editor_plugin.js b/plugins/TinyMCE/js/plugins/visualchars/editor_plugin.js new file mode 100644 index 0000000000..94719f93a1 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/visualchars/editor_plugin.js @@ -0,0 +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 diff --git a/plugins/TinyMCE/js/plugins/visualchars/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/visualchars/editor_plugin_src.js new file mode 100644 index 0000000000..35856e26a0 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/visualchars/editor_plugin_src.js @@ -0,0 +1,83 @@ +/** + * 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.VisualChars', { + init : function(ed, url) { + var t = this; + + t.editor = ed; + + // Register commands + ed.addCommand('mceVisualChars', t._toggleVisualChars, t); + + // Register buttons + ed.addButton('visualchars', {title : 'visualchars.desc', cmd : 'mceVisualChars'}); + + ed.onBeforeGetContent.add(function(ed, o) { + if (t.state && o.format != 'raw' && !o.draft) { + t.state = true; + t._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 + }; + }, + + // Private methods + + _toggleVisualChars : function(bookmark) { + var t = this, ed = t.editor, nl, i, h, d = ed.getDoc(), b = ed.getBody(), nv, s = ed.selection, bo, div, bm; + + t.state = !t.state; + ed.controlManager.setActive('visualchars', t.state); + + if (bookmark) + bm = s.getBookmark(); + + if (t.state) { + nl = []; + tinymce.walk(b, function(n) { + if (n.nodeType == 3 && n.nodeValue && n.nodeValue.indexOf('\u00a0') != -1) + nl.push(n); + }, 'childNodes'); + + for (i = 0; i < nl.length; i++) { + nv = nl[i].nodeValue; + nv = nv.replace(/(\u00a0)/g, '$1'); + + div = ed.dom.create('div', null, nv); + while (node = div.lastChild) + ed.dom.insertAfter(node, nl[i]); + + ed.dom.remove(nl[i]); + } + } else { + nl = ed.dom.select('span.mceItemNbsp', b); + + for (i = nl.length - 1; i >= 0; i--) + ed.dom.remove(nl[i], 1); + } + + s.moveToBookmark(bm); + } + }); + + // Register plugin + tinymce.PluginManager.add('visualchars', tinymce.plugins.VisualChars); +})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/wordcount/editor_plugin.js b/plugins/TinyMCE/js/plugins/wordcount/editor_plugin.js new file mode 100644 index 0000000000..a099e6a8c5 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/wordcount/editor_plugin.js @@ -0,0 +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 diff --git a/plugins/TinyMCE/js/plugins/wordcount/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/wordcount/editor_plugin_src.js new file mode 100644 index 0000000000..5cb92fa0f0 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/wordcount/editor_plugin_src.js @@ -0,0 +1,98 @@ +/** + * 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.WordCount', { + block : 0, + id : null, + countre : null, + cleanre : null, + + 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.id = ed.id + '-word-count'; + + ed.onPostRender.add(function(ed, cm) { + var row, id; + + // Add it to the specified id or the theme advanced path + id = ed.getParam('wordcount_target_id'); + if (!id) { + row = tinymce.DOM.get(ed.id + '_path_row'); + + if (row) + tinymce.DOM.add(row.parentNode, 'div', {'style': 'float: right'}, ed.getLang('wordcount.words', 'Words: ') + '0'); + } else + tinymce.DOM.add(id, 'span', {}, '0'); + }); + + ed.onInit.add(function(ed) { + ed.selection.onSetContent.add(function() { + t._count(ed); + }); + + t._count(ed); + }); + + ed.onSetContent.add(function(ed) { + t._count(ed); + }); + + ed.onKeyUp.add(function(ed, e) { + if (e.keyCode == last) + return; + + if (13 == e.keyCode || 8 == last || 46 == last) + t._count(ed); + + last = e.keyCode; + }); + }, + + _count : function(ed) { + var t = this, tc = 0; + + // Keep multiple calls from happening at the same time + if (t.block) + return; + + t.block = 1; + + setTimeout(function() { + var tx = ed.getContent({format : 'raw'}); + + 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()); + + setTimeout(function() {t.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); +})(); diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/abbr.htm b/plugins/TinyMCE/js/plugins/xhtmlxtras/abbr.htm new file mode 100644 index 0000000000..3aeac0deba --- /dev/null +++ b/plugins/TinyMCE/js/plugins/xhtmlxtras/abbr.htm @@ -0,0 +1,141 @@ + + + + {#xhtmlxtras_dlg.title_abbr_element} + + + + + + + + + +
+ + +
+
+
+ {#xhtmlxtras_dlg.fieldset_attrib_tab} + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
: + +
:
: + +
: + +
+
+
+
+
+ {#xhtmlxtras_dlg.fieldset_events_tab} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
:
:
:
:
:
:
:
:
:
:
+
+
+
+
+ + + +
+
+ + diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/acronym.htm b/plugins/TinyMCE/js/plugins/xhtmlxtras/acronym.htm new file mode 100644 index 0000000000..31ee7b70f3 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/xhtmlxtras/acronym.htm @@ -0,0 +1,141 @@ + + + + {#xhtmlxtras_dlg.title_acronym_element} + + + + + + + + + +
+ + +
+
+
+ {#xhtmlxtras_dlg.fieldset_attrib_tab} + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
: + +
:
: + +
: + +
+
+
+
+
+ {#xhtmlxtras_dlg.fieldset_events_tab} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
:
:
:
:
:
:
:
:
:
:
+
+
+
+
+ + + +
+
+ + diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/attributes.htm b/plugins/TinyMCE/js/plugins/xhtmlxtras/attributes.htm new file mode 100644 index 0000000000..17054da3ed --- /dev/null +++ b/plugins/TinyMCE/js/plugins/xhtmlxtras/attributes.htm @@ -0,0 +1,148 @@ + + + + {#xhtmlxtras_dlg.attribs_title} + + + + + + + + +
+ + +
+
+
+ {#xhtmlxtras_dlg.attribute_attrib_tab} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
+ +
:
: + +
: + +
+
+
+
+
+ {#xhtmlxtras_dlg.attribute_events_tab} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
:
:
:
:
:
:
:
:
:
:
+
+
+
+
+ + +
+
+ + diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/cite.htm b/plugins/TinyMCE/js/plugins/xhtmlxtras/cite.htm new file mode 100644 index 0000000000..d0a3e3a8e5 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/xhtmlxtras/cite.htm @@ -0,0 +1,141 @@ + + + + {#xhtmlxtras_dlg.title_cite_element} + + + + + + + + + +
+ + +
+
+
+ {#xhtmlxtras_dlg.fieldset_attrib_tab} + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
: + +
:
: + +
: + +
+
+
+
+
+ {#xhtmlxtras_dlg.fieldset_events_tab} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
:
:
:
:
:
:
:
:
:
:
+
+
+
+
+ + + +
+
+ + diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/css/attributes.css b/plugins/TinyMCE/js/plugins/xhtmlxtras/css/attributes.css new file mode 100644 index 0000000000..9a6a235c35 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/xhtmlxtras/css/attributes.css @@ -0,0 +1,11 @@ +.panel_wrapper div.current { + height: 290px; +} + +#id, #style, #title, #dir, #hreflang, #lang, #classlist, #tabindex, #accesskey { + width: 200px; +} + +#events_panel input { + width: 200px; +} diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/css/popup.css b/plugins/TinyMCE/js/plugins/xhtmlxtras/css/popup.css new file mode 100644 index 0000000000..e67114dbaa --- /dev/null +++ b/plugins/TinyMCE/js/plugins/xhtmlxtras/css/popup.css @@ -0,0 +1,9 @@ +input.field, select.field {width:200px;} +input.picker {width:179px; margin-left: 5px;} +input.disabled {border-color:#F2F2F2;} +img.picker {vertical-align:text-bottom; cursor:pointer;} +h1 {padding: 0 0 5px 0;} +.panel_wrapper div.current {height:160px;} +#xhtmlxtrasdel .panel_wrapper div.current, #xhtmlxtrasins .panel_wrapper div.current {height: 230px;} +a.browse span {display:block; width:20px; height:20px; background:url('../../../themes/advanced/img/icons.gif') -140px -20px;} +#datetime {width:180px;} diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/del.htm b/plugins/TinyMCE/js/plugins/xhtmlxtras/del.htm new file mode 100644 index 0000000000..8b07fa8429 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/xhtmlxtras/del.htm @@ -0,0 +1,161 @@ + + + + {#xhtmlxtras_dlg.title_del_element} + + + + + + + + + +
+ + +
+
+
+ {#xhtmlxtras_dlg.fieldset_general_tab} + + + + + + + + + +
: + + + + + +
+
:
+
+
+ {#xhtmlxtras_dlg.fieldset_attrib_tab} + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
: + +
:
: + +
: + +
+
+
+
+
+ {#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 new file mode 100644 index 0000000000..a9393ad6db --- /dev/null +++ b/plugins/TinyMCE/js/plugins/xhtmlxtras/editor_plugin.js @@ -0,0 +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 diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/xhtmlxtras/editor_plugin_src.js new file mode 100644 index 0000000000..5f9d9bd50b --- /dev/null +++ b/plugins/TinyMCE/js/plugins/xhtmlxtras/editor_plugin_src.js @@ -0,0 +1,132 @@ +/** + * 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.XHTMLXtrasPlugin', { + init : function(ed, url) { + // Register commands + ed.addCommand('mceCite', function() { + ed.windowManager.open({ + file : url + '/cite.htm', + width : 350 + parseInt(ed.getLang('xhtmlxtras.cite_delta_width', 0)), + height : 250 + parseInt(ed.getLang('xhtmlxtras.cite_delta_height', 0)), + inline : 1 + }, { + plugin_url : url + }); + }); + + ed.addCommand('mceAcronym', function() { + 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)), + inline : 1 + }, { + plugin_url : url + }); + }); + + ed.addCommand('mceAbbr', function() { + 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)), + inline : 1 + }, { + plugin_url : url + }); + }); + + ed.addCommand('mceDel', function() { + 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)), + inline : 1 + }, { + plugin_url : url + }); + }); + + ed.addCommand('mceIns', function() { + 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)), + inline : 1 + }, { + plugin_url : url + }); + }); + + ed.addCommand('mceAttributes', function() { + ed.windowManager.open({ + file : url + '/attributes.htm', + width : 380, + height : 370, + inline : 1 + }, { + plugin_url : url + }); + }); + + // Register buttons + ed.addButton('cite', {title : 'xhtmlxtras.cite_desc', cmd : 'mceCite'}); + ed.addButton('acronym', {title : 'xhtmlxtras.acronym_desc', cmd : 'mceAcronym'}); + ed.addButton('abbr', {title : 'xhtmlxtras.abbr_desc', cmd : 'mceAbbr'}); + ed.addButton('del', {title : 'xhtmlxtras.del_desc', cmd : 'mceDel'}); + ed.addButton('ins', {title : 'xhtmlxtras.ins_desc', cmd : 'mceIns'}); + ed.addButton('attribs', {title : 'xhtmlxtras.attribs_desc', cmd : 'mceAttributes'}); + + ed.onNodeChange.add(function(ed, cm, n, co) { + n = ed.dom.getParent(n, 'CITE,ACRONYM,ABBR,DEL,INS'); + + cm.setDisabled('cite', co); + cm.setDisabled('acronym', co); + cm.setDisabled('abbr', co); + cm.setDisabled('del', co); + cm.setDisabled('ins', co); + cm.setDisabled('attribs', n && n.nodeName == 'BODY'); + cm.setActive('cite', 0); + cm.setActive('acronym', 0); + cm.setActive('abbr', 0); + cm.setActive('del', 0); + cm.setActive('ins', 0); + + // Activate all + if (n) { + do { + cm.setDisabled(n.nodeName.toLowerCase(), 0); + cm.setActive(n.nodeName.toLowerCase(), 1); + } while (n = n.parentNode); + } + }); + + ed.onPreInit.add(function() { + // Fixed IE issue where it can't handle these elements correctly + ed.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 + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('xhtmlxtras', tinymce.plugins.XHTMLXtrasPlugin); +})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/ins.htm b/plugins/TinyMCE/js/plugins/xhtmlxtras/ins.htm new file mode 100644 index 0000000000..6c5470cfcc --- /dev/null +++ b/plugins/TinyMCE/js/plugins/xhtmlxtras/ins.htm @@ -0,0 +1,161 @@ + + + + {#xhtmlxtras_dlg.title_ins_element} + + + + + + + + + +
+ + +
+
+
+ {#xhtmlxtras_dlg.fieldset_general_tab} + + + + + + + + + +
: + + + + + +
+
:
+
+
+ {#xhtmlxtras_dlg.fieldset_attrib_tab} + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
: + +
:
: + +
: + +
+
+
+
+
+ {#xhtmlxtras_dlg.fieldset_events_tab} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
:
:
:
:
:
:
:
:
:
:
+
+
+
+
+ + + +
+
+ + diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/js/abbr.js b/plugins/TinyMCE/js/plugins/xhtmlxtras/js/abbr.js new file mode 100644 index 0000000000..4b51a25721 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/xhtmlxtras/js/abbr.js @@ -0,0 +1,28 @@ +/** + * abbr.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +function init() { + SXE.initElementDialog('abbr'); + if (SXE.currentAction == "update") { + SXE.showRemoveButton(); + } +} + +function insertAbbr() { + SXE.insertElement('abbr'); + tinyMCEPopup.close(); +} + +function removeAbbr() { + SXE.removeElement('abbr'); + tinyMCEPopup.close(); +} + +tinyMCEPopup.onInit.add(init); diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/js/acronym.js b/plugins/TinyMCE/js/plugins/xhtmlxtras/js/acronym.js new file mode 100644 index 0000000000..6ec2f88716 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/xhtmlxtras/js/acronym.js @@ -0,0 +1,28 @@ +/** + * acronym.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +function init() { + SXE.initElementDialog('acronym'); + if (SXE.currentAction == "update") { + SXE.showRemoveButton(); + } +} + +function insertAcronym() { + SXE.insertElement('acronym'); + tinyMCEPopup.close(); +} + +function removeAcronym() { + SXE.removeElement('acronym'); + tinyMCEPopup.close(); +} + +tinyMCEPopup.onInit.add(init); diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/js/attributes.js b/plugins/TinyMCE/js/plugins/xhtmlxtras/js/attributes.js new file mode 100644 index 0000000000..d62a219e6b --- /dev/null +++ b/plugins/TinyMCE/js/plugins/xhtmlxtras/js/attributes.js @@ -0,0 +1,126 @@ +/** + * attributes.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +function init() { + tinyMCEPopup.resizeToInnerSize(); + var inst = tinyMCEPopup.editor; + var dom = inst.dom; + var elm = inst.selection.getNode(); + var f = document.forms[0]; + var onclick = dom.getAttrib(elm, 'onclick'); + + setFormValue('title', dom.getAttrib(elm, 'title')); + setFormValue('id', dom.getAttrib(elm, 'id')); + setFormValue('style', dom.getAttrib(elm, "style")); + setFormValue('dir', dom.getAttrib(elm, 'dir')); + setFormValue('lang', dom.getAttrib(elm, 'lang')); + setFormValue('tabindex', dom.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : "")); + setFormValue('accesskey', dom.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : "")); + setFormValue('onfocus', dom.getAttrib(elm, 'onfocus')); + setFormValue('onblur', dom.getAttrib(elm, 'onblur')); + setFormValue('onclick', onclick); + setFormValue('ondblclick', dom.getAttrib(elm, 'ondblclick')); + setFormValue('onmousedown', dom.getAttrib(elm, 'onmousedown')); + setFormValue('onmouseup', dom.getAttrib(elm, 'onmouseup')); + setFormValue('onmouseover', dom.getAttrib(elm, 'onmouseover')); + setFormValue('onmousemove', dom.getAttrib(elm, 'onmousemove')); + setFormValue('onmouseout', dom.getAttrib(elm, 'onmouseout')); + setFormValue('onkeypress', dom.getAttrib(elm, 'onkeypress')); + setFormValue('onkeydown', dom.getAttrib(elm, 'onkeydown')); + setFormValue('onkeyup', dom.getAttrib(elm, 'onkeyup')); + className = dom.getAttrib(elm, 'class'); + + addClassesToList('classlist', 'advlink_styles'); + selectByValue(f, 'classlist', className, true); + + TinyMCE_EditableSelects.init(); +} + +function setFormValue(name, value) { + if(value && document.forms[0].elements[name]){ + document.forms[0].elements[name].value = value; + } +} + +function insertAction() { + var inst = tinyMCEPopup.editor; + var elm = inst.selection.getNode(); + + tinyMCEPopup.execCommand("mceBeginUndoLevel"); + setAllAttribs(elm); + tinyMCEPopup.execCommand("mceEndUndoLevel"); + tinyMCEPopup.close(); +} + +function setAttrib(elm, attrib, value) { + var formObj = document.forms[0]; + var valueElm = formObj.elements[attrib.toLowerCase()]; + var inst = tinyMCEPopup.editor; + var dom = inst.dom; + + if (typeof(value) == "undefined" || value == null) { + value = ""; + + if (valueElm) + 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); +} + +function setAllAttribs(elm) { + var f = document.forms[0]; + + setAttrib(elm, 'title'); + setAttrib(elm, 'id'); + setAttrib(elm, 'style'); + setAttrib(elm, 'class', getSelectValue(f, 'classlist')); + setAttrib(elm, 'dir'); + setAttrib(elm, 'lang'); + setAttrib(elm, 'tabindex'); + setAttrib(elm, 'accesskey'); + setAttrib(elm, 'onfocus'); + setAttrib(elm, 'onblur'); + setAttrib(elm, 'onclick'); + setAttrib(elm, 'ondblclick'); + setAttrib(elm, 'onmousedown'); + setAttrib(elm, 'onmouseup'); + setAttrib(elm, 'onmouseover'); + setAttrib(elm, 'onmousemove'); + setAttrib(elm, 'onmouseout'); + setAttrib(elm, 'onkeypress'); + setAttrib(elm, 'onkeydown'); + setAttrib(elm, 'onkeyup'); + + // Refresh in old MSIE +// if (tinyMCE.isMSIE5) +// elm.outerHTML = elm.outerHTML; +} + +function insertAttribute() { + tinyMCEPopup.close(); +} + +tinyMCEPopup.onInit.add(init); +tinyMCEPopup.requireLangPack(); diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/js/cite.js b/plugins/TinyMCE/js/plugins/xhtmlxtras/js/cite.js new file mode 100644 index 0000000000..009b71546a --- /dev/null +++ b/plugins/TinyMCE/js/plugins/xhtmlxtras/js/cite.js @@ -0,0 +1,28 @@ +/** + * cite.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +function init() { + SXE.initElementDialog('cite'); + if (SXE.currentAction == "update") { + SXE.showRemoveButton(); + } +} + +function insertCite() { + SXE.insertElement('cite'); + tinyMCEPopup.close(); +} + +function removeCite() { + SXE.removeElement('cite'); + tinyMCEPopup.close(); +} + +tinyMCEPopup.onInit.add(init); diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/js/del.js b/plugins/TinyMCE/js/plugins/xhtmlxtras/js/del.js new file mode 100644 index 0000000000..9e5d8c5717 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/xhtmlxtras/js/del.js @@ -0,0 +1,63 @@ +/** + * del.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +function init() { + SXE.initElementDialog('del'); + if (SXE.currentAction == "update") { + setFormValue('datetime', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'datetime')); + setFormValue('cite', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'cite')); + SXE.showRemoveButton(); + } +} + +function setElementAttribs(elm) { + setAllCommonAttribs(elm); + setAttrib(elm, 'datetime'); + setAttrib(elm, 'cite'); +} + +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#';}); + for (var i=0; i 0) { + tagName = element_name; + + insertInlineElement(element_name); + var elementArray = tinymce.grep(SXE.inst.dom.select(element_name)); + for (var i=0; i -1) ? true : false; +} + +SXE.removeClass = function(elm,cl) { + if(elm.className == null || elm.className == "" || !SXE.containsClass(elm,cl)) { + return true; + } + var classNames = elm.className.split(" "); + var newClassNames = ""; + for (var x = 0, cnl = classNames.length; x < cnl; x++) { + if (classNames[x] != cl) { + newClassNames += (classNames[x] + " "); + } + } + elm.className = newClassNames.substring(0,newClassNames.length-1); //removes extra space at the end +} + +SXE.addClass = function(elm,cl) { + if(!SXE.containsClass(elm,cl)) elm.className ? elm.className += " " + cl : elm.className = cl; + return true; +} + +function insertInlineElement(en) { + var ed = tinyMCEPopup.editor, dom = ed.dom; + + ed.getDoc().execCommand('FontName', false, 'mceinline'); + tinymce.each(dom.select('span,font'), function(n) { + if (n.style.fontFamily == 'mceinline' || n.face == 'mceinline') + dom.replace(dom.create(en, {_mce_new : 1}), n, 1); + }); +} diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/js/ins.js b/plugins/TinyMCE/js/plugins/xhtmlxtras/js/ins.js new file mode 100644 index 0000000000..3774f0a184 --- /dev/null +++ b/plugins/TinyMCE/js/plugins/xhtmlxtras/js/ins.js @@ -0,0 +1,62 @@ +/** + * ins.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +function init() { + SXE.initElementDialog('ins'); + if (SXE.currentAction == "update") { + setFormValue('datetime', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'datetime')); + setFormValue('cite', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'cite')); + SXE.showRemoveButton(); + } +} + +function setElementAttribs(elm) { + setAllCommonAttribs(elm); + setAttrib(elm, 'datetime'); + setAttrib(elm, 'cite'); +} + +function insertIns() { + var elm = tinyMCEPopup.editor.dom.getParent(SXE.focusElement, 'INS'); + tinyMCEPopup.execCommand('mceBeginUndoLevel'); + if (elm == null) { + var s = SXE.inst.selection.getContent(); + if(s.length > 0) { + insertInlineElement('INS'); + var elementArray = tinymce.grep(SXE.inst.dom.select('ins'), function(n) {return n.id == '#sxe_temp_ins#';}); + for (var i=0; i + + + {#advanced_dlg.about_title} + + + + + + + +
+
+

{#advanced_dlg.about_title}

+

Version: ()

+

TinyMCE is a platform independent web based Javascript HTML WYSIWYG editor control released as Open Source under LGPL + by Moxiecode Systems AB. It has the ability to convert HTML TEXTAREA fields or other HTML elements to editor instances.

+

Copyright © 2003-2008, Moxiecode Systems AB, All rights reserved.

+

For more information about this software visit the TinyMCE website.

+ +
+ Got Moxie? + Hosted By Sourceforge + Also on freshmeat +
+
+ +
+
+

{#advanced_dlg.about_loaded}

+ +
+
+ +

 

+
+
+ +
+
+
+
+ +
+ +
+ + diff --git a/plugins/TinyMCE/js/themes/advanced/anchor.htm b/plugins/TinyMCE/js/themes/advanced/anchor.htm new file mode 100644 index 0000000000..2bc63fcfdc --- /dev/null +++ b/plugins/TinyMCE/js/themes/advanced/anchor.htm @@ -0,0 +1,26 @@ + + + + {#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 new file mode 100644 index 0000000000..3991b8141b --- /dev/null +++ b/plugins/TinyMCE/js/themes/advanced/charmap.htm @@ -0,0 +1,52 @@ + + + + {#advanced_dlg.charmap_title} + + + + + + + + + + + + + + + +
{#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 new file mode 100644 index 0000000000..096e7550c3 --- /dev/null +++ b/plugins/TinyMCE/js/themes/advanced/color_picker.htm @@ -0,0 +1,73 @@ + + + + {#advanced_dlg.colorpicker_title} + + + + + +
+ + +
+
+
+ {#advanced_dlg.colorpicker_picker_title} +
+ + +
+ +
+ +
+
+
+
+ +
+
+ {#advanced_dlg.colorpicker_palette_title} +
+ +
+ +
+
+
+ +
+
+ {#advanced_dlg.colorpicker_named_title} +
+ +
+ +
+ +
+ {#advanced_dlg.colorpicker_name} +
+
+
+
+ +
+ + +
+ +
+ +
+
+
+ + diff --git a/plugins/TinyMCE/js/themes/advanced/editor_template.js b/plugins/TinyMCE/js/themes/advanced/editor_template.js new file mode 100644 index 0000000000..4c433127f9 --- /dev/null +++ b/plugins/TinyMCE/js/themes/advanced/editor_template.js @@ -0,0 +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 && v <= 7) { + k = v + ' (' + t.sizes[v - 1] + 'pt)'; + cl = s.font_size_classes[v - 1]; + v = s.font_size_style_values[v - 1] || (t.sizes[v - 1] + 'pt'); + } + + if (/^\s*\./.test(v)) + cl = v.replace(/\./g, ''); + + o[k] = cl ? {'class' : cl} : {fontSize : v}; + }); + + s.theme_advanced_font_sizes = o; + } + + if ((v = s.theme_advanced_path_location) && v != 'none') + s.theme_advanced_statusbar_location = s.theme_advanced_path_location; + + if (s.theme_advanced_statusbar_location == 'none') + s.theme_advanced_statusbar_location = 0; + + // Init editor + ed.onInit.add(function() { + 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.onSetProgressState.add(function(ed, b, ti) { + var co, id = ed.id, tb; + + if (b) { + t.progressTimer = setTimeout(function() { + co = ed.getContainer(); + co = co.insertBefore(DOM.create('DIV', {style : 'position:relative'}), co.firstChild); + tb = DOM.get(ed.id + '_tbl'); + + DOM.add(co, 'div', {id : id + '_blocker', 'class' : 'mceBlocker', style : {width : tb.clientWidth + 2, height : tb.clientHeight + 2}}); + DOM.add(co, 'div', {id : id + '_progress', 'class' : 'mceProgress', style : {left : tb.clientWidth / 2, top : tb.clientHeight / 2}}); + }, ti || 0); + } else { + DOM.remove(id + '_blocker'); + DOM.remove(id + '_progress'); + clearTimeout(t.progressTimer); + } + }); + + DOM.loadCSS(s.editor_css ? ed.documentBaseURI.toAbsolute(s.editor_css) : url + "/skins/" + ed.settings.skin + "/ui.css"); + + if (s.skin_variant) + DOM.loadCSS(url + "/skins/" + ed.settings.skin + "/ui_" + s.skin_variant + ".css"); + }, + + createControl : function(n, cf) { + var cd, c; + + if (c = cf.createControl(n)) + return c; + + switch (n) { + 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 ((cd = this.controls[n])) + return cf.createButton(n, {title : "advanced." + cd[0], cmd : cd[1], ui : cd[2], value : cd[3]}); + }, + + execCommand : function(cmd, ui, val) { + var f = this['_' + cmd]; + + if (f) { + f.call(this, ui, val); + return true; + } + + return false; + }, + + _importClasses : function(e) { + var ed = this.editor, ctrl = ed.controlManager.get('styleselect'); + + if (ctrl.getLength() == 0) { + each(ed.dom.getClasses(), function(o, idx) { + var name = 'style_' + idx; + + ed.formatter.register(name, { + inline : 'span', + attributes : {'class' : o['class']}, + selector : '*' + }); + + ctrl.add(o['class'], name); + }); + } + }, + + _createStyleSelect : function(n) { + var t = this, ed = t.editor, ctrlMan = ed.controlManager, ctrl; + + // Setup style select box + ctrl = ctrlMan.createListBox('styleselect', { + title : 'advanced.style_select', + onselect : function(name) { + var matches, formatNames = []; + + each(ctrl.items, function(item) { + formatNames.push(item.value); + }); + + ed.focus(); + ed.undoManager.add(); + + // Toggle off the current format + matches = ed.formatter.matchAll(formatNames); + if (!name || matches[0] == name) + ed.formatter.remove(matches[0]); + else + ed.formatter.apply(name); + + ed.undoManager.add(); + ed.nodeChanged(); + + return false; // No auto select + } + }); + + // Handle specified format + ed.onInit.add(function() { + var counter = 0, formats = ed.getParam('style_formats'); + + if (formats) { + each(formats, function(fmt) { + var name, keys = 0; + + each(fmt, function() {keys++;}); + + if (keys > 1) { + name = fmt.name = fmt.name || 'style_' + (counter++); + ed.formatter.register(name, fmt); + ctrl.add(fmt.title, name); + } else + ctrl.add(fmt.title); + }); + } else { + each(ed.getParam('theme_advanced_styles', '', 'hash'), function(val, key) { + var name; + + if (val) { + name = 'style_' + (counter++); + + ed.formatter.register(name, { + inline : 'span', + classes : val, + selector : '*' + }); + + ctrl.add(t.editor.translate(key), name); + } + }); + } + }); + + // Auto import classes if the ctrl box is empty + if (ctrl.getLength() == 0) { + ctrl.onPostRender.add(function(ed, n) { + if (!ctrl.NativeListBox) { + Event.add(n.id + '_text', 'focus', t._importClasses, t); + Event.add(n.id + '_text', 'mousedown', t._importClasses, t); + Event.add(n.id + '_open', 'focus', t._importClasses, t); + Event.add(n.id + '_open', 'mousedown', t._importClasses, t); + } else + Event.add(n.id, 'focus', t._importClasses, t); + }); + } + + return ctrl; + }, + + _createFontSelect : function() { + var c, t = this, ed = t.editor; + + c = ed.controlManager.createListBox('fontselect', { + title : 'advanced.fontdefault', + onselect : function(v) { + var cur = c.items[c.selectedIndex]; + + if (!v && cur) { + ed.execCommand('FontName', false, cur.value); + return; + } + + ed.execCommand('FontName', false, v); + + // Fake selection, execCommand will fire a nodeChange and update the selection + c.select(function(sv) { + return v == sv; + }); + + return false; // No auto select + } + }); + + if (c) { + each(ed.getParam('theme_advanced_fonts', t.settings.theme_advanced_fonts, 'hash'), function(v, k) { + c.add(ed.translate(k), v, {style : v.indexOf('dings') == -1 ? 'font-family:' + v : ''}); + }); + } + + return c; + }, + + _createFontSizeSelect : function() { + var t = this, ed = t.editor, c, i = 0, cl = []; + + c = ed.controlManager.createListBox('fontsizeselect', {title : 'advanced.font_size', onselect : function(v) { + var cur = c.items[c.selectedIndex]; + + if (!v && cur) { + cur = cur.value; + + if (cur['class']) { + ed.formatter.toggle('fontsize_class', {value : cur['class']}); + ed.undoManager.add(); + ed.nodeChanged(); + } else { + ed.execCommand('FontSize', false, cur.fontSize); + } + + return; + } + + if (v['class']) { + ed.focus(); + ed.undoManager.add(); + ed.formatter.toggle('fontsize_class', {value : v['class']}); + ed.undoManager.add(); + ed.nodeChanged(); + } else + ed.execCommand('FontSize', false, v.fontSize); + + // Fake selection, execCommand will fire a nodeChange and update the selection + c.select(function(sv) { + return v == sv; + }); + + return false; // No auto select + }}); + + if (c) { + each(t.settings.theme_advanced_font_sizes, function(v, k) { + var fz = v.fontSize; + + if (fz >= 1 && fz <= 7) + fz = t.sizes[parseInt(fz) - 1] + 'pt'; + + c.add(k, v, {'style' : 'font-size:' + fz, 'class' : 'mceFontSize' + (i++) + (' ' + (v['class'] || ''))}); + }); + } + + return c; + }, + + _createBlockFormats : function() { + var c, fmts = { + 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' + }, t = this; + + c = t.editor.controlManager.createListBox('formatselect', {title : 'advanced.block', cmd : 'FormatBlock'}); + 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}); + }); + } + + return c; + }, + + _createForeColorMenu : function() { + var c, t = this, s = t.settings, o = {}, v; + + if (s.theme_advanced_more_colors) { + o.more_colors_func = function() { + t._mceColorPicker(0, { + color : c.value, + func : function(co) { + c.setColor(co); + } + }); + }; + } + + if (v = s.theme_advanced_text_colors) + o.colors = v; + + if (s.theme_advanced_default_foreground_color) + o.default_color = s.theme_advanced_default_foreground_color; + + o.title = 'advanced.forecolor_desc'; + o.cmd = 'ForeColor'; + o.scope = this; + + c = t.editor.controlManager.createColorSplitButton('forecolor', o); + + return c; + }, + + _createBackColorMenu : function() { + var c, t = this, s = t.settings, o = {}, v; + + if (s.theme_advanced_more_colors) { + o.more_colors_func = function() { + t._mceColorPicker(0, { + color : c.value, + func : function(co) { + c.setColor(co); + } + }); + }; + } + + if (v = s.theme_advanced_background_colors) + o.colors = v; + + if (s.theme_advanced_default_background_color) + o.default_color = s.theme_advanced_default_background_color; + + o.title = 'advanced.backcolor_desc'; + o.cmd = 'HiliteColor'; + o.scope = this; + + c = t.editor.controlManager.createColorSplitButton('backcolor', o); + + return c; + }, + + 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 (!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 = tb = DOM.add(n, 'tbody'); + + switch ((s.theme_advanced_layout_manager || '').toLowerCase()) { + case "rowlayout": + ic = t._rowLayout(s, tb, o); + break; + + case "customlayout": + ic = ed.execCallback("theme_advanced_custom_layout", s, tb, o, p); + break; + + default: + ic = t._simpleLayout(s, tb, o, p); + } + + n = o.targetNode; + + // Add classes to first and last TRs + nl = DOM.stdMode ? sc.getElementsByTagName('tr') : sc.rows; // Quick fix for IE 8 + DOM.addClass(nl[0], 'mceFirst'); + DOM.addClass(nl[nl.length - 1], 'mceLast'); + + // Add classes to first and last TDs + each(DOM.select('tr', tb), function(n) { + DOM.addClass(n.firstChild, 'mceFirst'); + DOM.addClass(n.childNodes[n.childNodes.length - 1], 'mceLast'); + }); + + if (DOM.get(s.theme_advanced_toolbar_container)) + DOM.get(s.theme_advanced_toolbar_container).appendChild(p); + else + DOM.insertAfter(p, n); + + Event.add(ed.id + '_path_row', 'click', function(e) { + e = e.target; + + if (e.nodeName == 'A') { + t._sel(e.className.replace(/^.*mcePath_([0-9]+).*$/, '$1')); + + return Event.cancel(e); + } + }); +/* + if (DOM.get(ed.id + '_path_row')) { + Event.add(ed.id + '_tbl', 'mouseover', function(e) { + var re; + + e = e.target; + + if (e.nodeName == 'SPAN' && DOM.hasClass(e.parentNode, 'mceButton')) { + re = DOM.get(ed.id + '_path_row'); + t.lastPath = re.innerHTML; + DOM.setHTML(re, e.parentNode.title); + } + }); + + Event.add(ed.id + '_tbl', 'mouseout', function(e) { + if (t.lastPath) { + DOM.setHTML(ed.id + '_path_row', t.lastPath); + t.lastPath = 0; + } + }); + } +*/ + + if (!ed.getParam('accessibility_focus')) + Event.add(DOM.add(p, 'a', {href : '#'}, ''), 'focus', function() {tinyMCE.get(ed.id).focus();}); + + if (s.theme_advanced_toolbar_location == 'external') + o.deltaHeight = 0; + + t.deltaHeight = o.deltaHeight; + o.targetNode = null; + + return { + iframeContainer : ic, + editorContainer : ed.id + '_parent', + sizeContainer : sc, + deltaHeight : o.deltaHeight + }; + }, + + getInfo : function() { + return { + longname : 'Advanced theme', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + version : tinymce.majorVersion + "." + tinymce.minorVersion + } + }, + + resizeBy : function(dw, dh) { + var e = DOM.get(this.editor.id + '_tbl'); + + this.resizeTo(e.clientWidth + dw, e.clientHeight + dh); + }, + + resizeTo : function(w, h) { + var ed = this.editor, s = this.settings, e = DOM.get(ed.id + '_tbl'), ifr = DOM.get(ed.id + '_ifr'); + + // Boundery fix box + w = Math.max(s.theme_advanced_resizing_min_width || 100, w); + h = Math.max(s.theme_advanced_resizing_min_height || 100, h); + w = Math.min(s.theme_advanced_resizing_max_width || 0xFFFF, w); + h = Math.min(s.theme_advanced_resizing_max_height || 0xFFFF, h); + + // Resize iframe and container + DOM.setStyle(e, 'height', ''); + DOM.setStyle(ifr, 'height', h); + + if (s.theme_advanced_resize_horizontal) { + DOM.setStyle(e, 'width', ''); + DOM.setStyle(ifr, 'width', w); + + // Make sure that the size is never smaller than the over all ui + if (w < e.clientWidth) + DOM.setStyle(ifr, 'width', e.clientWidth); + } + }, + + destroy : function() { + var id = this.editor.id; + + Event.clear(id + '_resize'); + Event.clear(id + '_path_row'); + Event.clear(id + '_external_close'); + }, + + // Internal functions + + _simpleLayout : function(s, tb, o, p) { + var t = this, ed = t.editor, lo = s.theme_advanced_toolbar_location, sl = s.theme_advanced_statusbar_location, n, ic, etb, c; + + if (s.readonly) { + n = DOM.add(tb, 'tr'); + n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'}); + return ic; + } + + // Create toolbar container at top + if (lo == 'top') + t._addToolbars(tb, o); + + // Create external toolbar + if (lo == 'external') { + n = c = DOM.create('div', {style : 'position:relative'}); + n = DOM.add(n, 'div', {id : ed.id + '_external', 'class' : 'mceExternalToolbar'}); + DOM.add(n, 'a', {id : ed.id + '_external_close', href : 'javascript:;', 'class' : 'mceExternalClose'}); + n = DOM.add(n, 'table', {id : ed.id + '_tblext', cellSpacing : 0, cellPadding : 0}); + etb = DOM.add(n, 'tbody'); + + if (p.firstChild.className == 'mceOldBoxModel') + p.firstChild.appendChild(c); + else + p.insertBefore(c, p.firstChild); + + t._addToolbars(etb, o); + + ed.onMouseUp.add(function() { + var e = DOM.get(ed.id + '_external'); + DOM.show(e); + + DOM.hide(lastExtID); + + var f = Event.add(ed.id + '_external_close', 'click', function() { + DOM.hide(ed.id + '_external'); + Event.remove(ed.id + '_external_close', 'click', f); + }); + + DOM.show(e); + DOM.setStyle(e, 'top', 0 - DOM.getRect(ed.id + '_tblext').h - 1); + + // Fixes IE rendering bug + DOM.hide(e); + DOM.show(e); + e.style.filter = ''; + + lastExtID = ed.id + '_external'; + + e = null; + }); + } + + if (sl == 'top') + t._addStatusBar(tb, o); + + // Create iframe container + if (!s.theme_advanced_toolbar_container) { + n = DOM.add(tb, 'tr'); + n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'}); + } + + // Create toolbar container at bottom + if (lo == 'bottom') + t._addToolbars(tb, o); + + if (sl == 'bottom') + t._addStatusBar(tb, o); + + return ic; + }, + + _rowLayout : function(s, tb, o) { + var t = this, ed = t.editor, dc, da, cf = ed.controlManager, n, ic, to, a; + + dc = s.theme_advanced_containers_default_class || ''; + da = s.theme_advanced_containers_default_align || 'center'; + + each(explode(s.theme_advanced_containers || ''), function(c, i) { + var v = s['theme_advanced_container_' + c] || ''; + + switch (v.toLowerCase()) { + case 'mceeditor': + n = DOM.add(tb, 'tr'); + n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'}); + break; + + case 'mceelementpath': + t._addStatusBar(tb, o); + break; + + default: + a = (s['theme_advanced_container_' + c + '_align'] || da).toLowerCase(); + a = 'mce' + t._ufirst(a); + + n = DOM.add(DOM.add(tb, 'tr'), 'td', { + 'class' : 'mceToolbar ' + (s['theme_advanced_container_' + c + '_class'] || dc) + ' ' + a || da + }); + + to = cf.createToolbar("toolbar" + i); + t._addControls(v, to); + DOM.setHTML(n, to.renderHTML()); + o.deltaHeight -= s.theme_advanced_row_height; + } + }); + + return ic; + }, + + _addControls : function(v, tb) { + var t = this, s = t.settings, di, cf = t.editor.controlManager; + + if (s.theme_advanced_disable && !t._disabled) { + di = {}; + + each(explode(s.theme_advanced_disable), function(v) { + di[v] = 1; + }); + + t._disabled = di; + } else + di = t._disabled; + + each(explode(v), function(n) { + var c; + + if (di && di[n]) + return; + + // Compatiblity with 2.x + if (n == 'tablecontrols') { + each(["table","|","row_props","cell_props","|","row_before","row_after","delete_row","|","col_before","col_after","delete_col","|","split_cells","merge_cells"], function(n) { + n = t.createControl(n, cf); + + if (n) + tb.add(n); + }); + + return; + } + + c = t.createControl(n, cf); + + if (c) + tb.add(c); + }); + }, + + _addToolbars : function(c, o) { + var t = this, i, tb, ed = t.editor, s = t.settings, v, cf = ed.controlManager, di, n, h = [], a; + + 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")}, '')); + + // Create toolbar and add the controls + for (i=1; (v = s['theme_advanced_buttons' + i]); i++) { + tb = cf.createToolbar("toolbar" + i, {'class' : 'mceToolbarRow' + i}); + + if (s['theme_advanced_buttons' + i + '_add']) + v += ',' + s['theme_advanced_buttons' + i + '_add']; + + if (s['theme_advanced_buttons' + i + '_add_before']) + v = s['theme_advanced_buttons' + i + '_add_before'] + ',' + v; + + t._addControls(v, tb); + + //n.appendChild(n = tb.render()); + h.push(tb.renderHTML()); + + o.deltaHeight -= s.theme_advanced_row_height; + } + + 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('')); + }, + + _addStatusBar : function(tb, o) { + 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'}); + + if (s.theme_advanced_resizing) { + DOM.add(td, 'a', {id : ed.id + '_resize', href : 'javascript:;', onclick : "return false;", 'class' : 'mceResize'}); + + if (s.theme_advanced_resizing_use_cookie) { + ed.onPostRender.add(function() { + var o = Cookie.getHash("TinyMCE_" + ed.id + "_size"), c = DOM.get(ed.id + '_tbl'); + + if (!o) + return; + + t.resizeTo(o.cw, o.ch); + }); + } + + ed.onPostRender.add(function() { + Event.add(ed.id + '_resize', 'mousedown', function(e) { + var mouseMoveHandler1, mouseMoveHandler2, + mouseUpHandler1, mouseUpHandler2, + startX, startY, startWidth, startHeight, width, height, ifrElm; + + function resizeOnMove(e) { + width = startWidth + (e.screenX - startX); + height = startHeight + (e.screenY - startY); + + t.resizeTo(width, height); + }; + + function endResize(e) { + // Stop listening + Event.remove(DOM.doc, 'mousemove', mouseMoveHandler1); + Event.remove(ed.getDoc(), 'mousemove', mouseMoveHandler2); + 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 + }); + } + }; + + e.preventDefault(); + + // Get the current rect size + startX = e.screenX; + startY = e.screenY; + ifrElm = DOM.get(t.editor.id + '_ifr'); + startWidth = width = ifrElm.clientWidth; + startHeight = height = ifrElm.clientHeight; + + // Register envent handlers + mouseMoveHandler1 = Event.add(DOM.doc, 'mousemove', resizeOnMove); + mouseMoveHandler2 = Event.add(ed.getDoc(), 'mousemove', resizeOnMove); + mouseUpHandler1 = Event.add(DOM.doc, 'mouseup', endResize); + mouseUpHandler2 = Event.add(ed.getDoc(), 'mouseup', endResize); + }); + }); + } + + o.deltaHeight -= 21; + n = tb = null; + }, + + _nodeChanged : function(ed, cm, n, co, ob) { + var t = this, p, de = 0, v, c, s = t.settings, cl, fz, fn, formatNames, matches; + + tinymce.each(t.stateControls, function(c) { + cm.setActive(c, ed.queryCommandState(t.controls[c][1])); + }); + + function getParent(name) { + var i, parents = ob.parents, func = name; + + if (typeof(name) == 'string') { + func = function(node) { + return node.nodeName == name; + }; + } + + for (i = 0; i < parents.length; i++) { + if (func(parents[i])) + return parents[i]; + } + }; + + cm.setActive('visualaid', ed.hasVisual); + cm.setDisabled('undo', !ed.undoManager.hasUndo() && !ed.typing); + cm.setDisabled('redo', !ed.undoManager.hasRedo()); + cm.setDisabled('outdent', !ed.queryCommandState('Outdent')); + + p = getParent('A'); + if (c = cm.get('link')) { + if (!p || !p.name) { + c.setDisabled(!p && co); + c.setActive(!!p); + } + } + + if (c = cm.get('unlink')) { + c.setDisabled(!p && co); + c.setActive(!!p && !p.name); + } + + if (c = cm.get('anchor')) { + c.setActive(!!p && p.name); + } + + p = getParent('IMG'); + if (c = cm.get('image')) + c.setActive(!!p && n.className.indexOf('mceItem') == -1); + + if (c = cm.get('styleselect')) { + t._importClasses(); + + formatNames = []; + each(c.items, function(item) { + formatNames.push(item.value); + }); + + matches = ed.formatter.matchAll(formatNames); + c.select(matches[0]); + } + + if (c = cm.get('formatselect')) { + p = getParent(DOM.isBlock); + + if (p) + c.select(p.nodeName.toLowerCase()); + } + + // Find out current fontSize, fontFamily and fontClass + getParent(function(n) { + if (n.nodeName === 'SPAN') { + if (!cl && n.className) + cl = n.className; + + if (!fz && n.style.fontSize) + fz = n.style.fontSize; + + if (!fn && n.style.fontFamily) + fn = n.style.fontFamily.replace(/[\"\']+/g, '').replace(/^([^,]+).*/, '$1').toLowerCase(); + } + + return false; + }); + + if (c = cm.get('fontselect')) { + c.select(function(v) { + return v.replace(/^([^,]+).*/, '$1').toLowerCase() == fn; + }); + } + + // Select font size + if (c = cm.get('fontsizeselect')) { + // Use computed style + if (s.theme_advanced_runtime_fontsize && !fz && !cl) + fz = ed.dom.getStyle(n, 'fontSize', true); + + c.select(function(v) { + if (v.fontSize && v.fontSize === fz) + return true; + + if (v['class'] && v['class'] === cl) + return true; + }); + } + + 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'}); + DOM.setHTML(p, ''); + + getParent(function(n) { + var na = n.nodeName.toLowerCase(), u, pi, ti = ''; + + /*if (n.getAttribute('_mce_bogus')) + 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') + na = n.scopeName + ':' + na; + + // Remove internal prefix + na = na.replace(/mce\:/g, ''); + + // Handle node name + switch (na) { + case 'b': + na = 'strong'; + break; + + case 'i': + na = 'em'; + break; + + case 'img': + if (v = DOM.getAttrib(n, 'src')) + ti += 'src: ' + v + ' '; + + break; + + case 'a': + if (v = DOM.getAttrib(n, 'name')) { + ti += 'name: ' + v + ' '; + na += '#' + v; + } + + if (v = DOM.getAttrib(n, 'href')) + ti += 'href: ' + v + ' '; + + break; + + case 'font': + if (v = DOM.getAttrib(n, 'face')) + ti += 'font: ' + v + ' '; + + if (v = DOM.getAttrib(n, 'size')) + ti += 'size: ' + v + ' '; + + if (v = DOM.getAttrib(n, 'color')) + ti += 'color: ' + v + ' '; + + break; + + case 'span': + if (v = DOM.getAttrib(n, 'style')) + ti += 'style: ' + v + ' '; + + break; + } + + if (v = DOM.getAttrib(n, 'id')) + ti += 'id: ' + v + ' '; + + if (v = n.className) { + v = v.replace(/\b\s*(webkit|mce|Apple-)\w+\s*\b/g, '') + + if (v) { + ti += 'class: ' + v + ' '; + + if (DOM.isBlock(n) || na == 'img' || na == 'span') + na += '.' + v; + } + } + + na = na.replace(/(html:)/g, ''); + na = {name : na, node : n, title : ti}; + t.onResolveName.dispatch(t, na); + ti = na.title; + 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); + + if (p.hasChildNodes()) { + p.insertBefore(DOM.doc.createTextNode(' \u00bb '), p.firstChild); + p.insertBefore(pi, p.firstChild); + } else + p.appendChild(pi); + }, ed.getBody()); + } + }, + + // Commands gets called by execCommand + + _sel : function(v) { + this.editor.execCommand('mceSelectNodeDepth', false, v); + }, + + _mceInsertAnchor : function(ui, v) { + var ed = this.editor; + + ed.windowManager.open({ + url : tinymce.baseURL + '/themes/advanced/anchor.htm', + width : 320 + parseInt(ed.getLang('advanced.anchor_delta_width', 0)), + height : 90 + parseInt(ed.getLang('advanced.anchor_delta_height', 0)), + inline : true + }, { + theme_url : this.url + }); + }, + + _mceCharMap : function() { + var ed = this.editor; + + ed.windowManager.open({ + url : tinymce.baseURL + '/themes/advanced/charmap.htm', + width : 550 + parseInt(ed.getLang('advanced.charmap_delta_width', 0)), + height : 250 + parseInt(ed.getLang('advanced.charmap_delta_height', 0)), + inline : true + }, { + theme_url : this.url + }); + }, + + _mceHelp : function() { + var ed = this.editor; + + ed.windowManager.open({ + url : tinymce.baseURL + '/themes/advanced/about.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', + width : 375 + parseInt(ed.getLang('advanced.colorpicker_delta_width', 0)), + height : 250 + parseInt(ed.getLang('advanced.colorpicker_delta_height', 0)), + close_previous : false, + inline : true + }, { + input_color : v.color, + func : v.func, + theme_url : this.url + }); + }, + + _mceCodeEditor : function(ui, val) { + var ed = this.editor; + + ed.windowManager.open({ + url : tinymce.baseURL + '/themes/advanced/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, + resizable : true, + maximizable : true + }, { + theme_url : this.url + }); + }, + + _mceImage : function(ui, val) { + var ed = this.editor; + + // Internal image object like a flash placeholder + if (ed.dom.getAttrib(ed.selection.getNode(), 'class').indexOf('mceItem') != -1) + return; + + ed.windowManager.open({ + url : tinymce.baseURL + '/themes/advanced/image.htm', + width : 355 + parseInt(ed.getLang('advanced.image_delta_width', 0)), + height : 275 + parseInt(ed.getLang('advanced.image_delta_height', 0)), + inline : true + }, { + theme_url : this.url + }); + }, + + _mceLink : function(ui, val) { + var ed = this.editor; + + ed.windowManager.open({ + url : tinymce.baseURL + '/themes/advanced/link.htm', + width : 310 + parseInt(ed.getLang('advanced.link_delta_width', 0)), + height : 200 + parseInt(ed.getLang('advanced.link_delta_height', 0)), + inline : true + }, { + theme_url : this.url + }); + }, + + _mceNewDocument : function() { + var ed = this.editor; + + ed.windowManager.confirm('advanced.newdocument', function(s) { + if (s) + ed.execCommand('mceSetContent', false, ''); + }); + }, + + _mceForeColor : function() { + var t = this; + + this._mceColorPicker(0, { + color: t.fgColor, + func : function(co) { + t.fgColor = co; + t.editor.execCommand('ForeColor', false, co); + } + }); + }, + + _mceBackColor : function() { + var t = this; + + this._mceColorPicker(0, { + color: t.bgColor, + func : function(co) { + t.bgColor = co; + t.editor.execCommand('HiliteColor', false, co); + } + }); + }, + + _ufirst : function(s) { + return s.substring(0, 1).toUpperCase() + s.substring(1); + } + }); + + tinymce.ThemeManager.add('advanced', tinymce.themes.AdvancedTheme); +}(tinymce)); \ No newline at end of file diff --git a/plugins/TinyMCE/js/themes/advanced/image.htm b/plugins/TinyMCE/js/themes/advanced/image.htm new file mode 100644 index 0000000000..f30d670641 --- /dev/null +++ b/plugins/TinyMCE/js/themes/advanced/image.htm @@ -0,0 +1,80 @@ + + + + {#advanced_dlg.image_title} + + + + + + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
 
+ x +
+
+
+ +
+ + +
+
+ + diff --git a/plugins/TinyMCE/js/themes/advanced/img/colorpicker.jpg b/plugins/TinyMCE/js/themes/advanced/img/colorpicker.jpg new file mode 100644 index 0000000000..b4c542d107 Binary files /dev/null and b/plugins/TinyMCE/js/themes/advanced/img/colorpicker.jpg differ diff --git a/plugins/TinyMCE/js/themes/advanced/img/icons.gif b/plugins/TinyMCE/js/themes/advanced/img/icons.gif new file mode 100644 index 0000000000..e46de53330 Binary files /dev/null and b/plugins/TinyMCE/js/themes/advanced/img/icons.gif differ diff --git a/plugins/TinyMCE/js/themes/advanced/js/about.js b/plugins/TinyMCE/js/themes/advanced/js/about.js new file mode 100644 index 0000000000..5cee9ed863 --- /dev/null +++ b/plugins/TinyMCE/js/themes/advanced/js/about.js @@ -0,0 +1,72 @@ +tinyMCEPopup.requireLangPack(); + +function init() { + var ed, tcont; + + tinyMCEPopup.resizeToInnerSize(); + ed = tinyMCEPopup.editor; + + // Give FF some time + window.setTimeout(insertHelpIFrame, 10); + + tcont = document.getElementById('plugintablecontainer'); + document.getElementById('plugins_tab').style.display = 'none'; + + var html = ""; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + + tinymce.each(ed.plugins, function(p, n) { + var info; + + if (!p.getInfo) + return; + + html += ''; + + info = p.getInfo(); + + if (info.infourl != null && info.infourl != '') + html += ''; + else + html += ''; + + if (info.authorurl != null && info.authorurl != '') + html += ''; + else + html += ''; + + html += ''; + html += ''; + + document.getElementById('plugins_tab').style.display = ''; + + }); + + html += ''; + html += '
' + ed.getLang('advanced_dlg.about_plugin') + '' + ed.getLang('advanced_dlg.about_author') + '' + ed.getLang('advanced_dlg.about_version') + '
' + info.longname + '' + info.longname + '' + info.author + '' + info.author + '' + info.version + '
'; + + tcont.innerHTML = html; + + tinyMCEPopup.dom.get('version').innerHTML = tinymce.majorVersion + "." + tinymce.minorVersion; + tinyMCEPopup.dom.get('date').innerHTML = tinymce.releaseDate; +} + +function insertHelpIFrame() { + var html; + + if (tinyMCEPopup.getParam('docs_url')) { + html = ''; + document.getElementById('iframecontainer').innerHTML = html; + document.getElementById('help_tab').style.display = 'block'; + } +} + +tinyMCEPopup.onInit.add(init); diff --git a/plugins/TinyMCE/js/themes/advanced/js/anchor.js b/plugins/TinyMCE/js/themes/advanced/js/anchor.js new file mode 100644 index 0000000000..7fe7810558 --- /dev/null +++ b/plugins/TinyMCE/js/themes/advanced/js/anchor.js @@ -0,0 +1,37 @@ +tinyMCEPopup.requireLangPack(); + +var AnchorDialog = { + init : function(ed) { + var action, elm, f = document.forms[0]; + + this.editor = ed; + elm = ed.dom.getParent(ed.selection.getNode(), 'A'); + v = ed.dom.getAttrib(elm, 'name'); + + if (v) { + this.action = 'update'; + f.anchorName.value = v; + } + + f.insert.value = ed.getLang(elm ? 'update' : 'insert'); + }, + + update : function() { + var ed = this.editor, elm, name = document.forms[0].anchorName.value; + + tinyMCEPopup.restoreSelection(); + + if (this.action != 'update') + ed.selection.collapse(1); + + elm = ed.dom.getParent(ed.selection.getNode(), 'A'); + if (elm) + elm.name = name; + else + ed.execCommand('mceInsertContent', 0, ed.dom.createHTML('a', {name : name, 'class' : 'mceItemAnchor'}, '')); + + tinyMCEPopup.close(); + } +}; + +tinyMCEPopup.onInit.add(AnchorDialog.init, AnchorDialog); diff --git a/plugins/TinyMCE/js/themes/advanced/js/charmap.js b/plugins/TinyMCE/js/themes/advanced/js/charmap.js new file mode 100644 index 0000000000..8c5aea1721 --- /dev/null +++ b/plugins/TinyMCE/js/themes/advanced/js/charmap.js @@ -0,0 +1,335 @@ +/** + * charmap.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +tinyMCEPopup.requireLangPack(); + +var charmap = [ + [' ', ' ', true, 'no-break space'], + ['&', '&', true, 'ampersand'], + ['"', '"', true, 'quotation mark'], +// finance + ['¢', '¢', true, 'cent sign'], + ['€', '€', true, 'euro sign'], + ['£', '£', true, 'pound sign'], + ['¥', '¥', true, 'yen sign'], +// signs + ['©', '©', true, 'copyright sign'], + ['®', '®', true, 'registered sign'], + ['™', '™', true, 'trade mark sign'], + ['‰', '‰', true, 'per mille sign'], + ['µ', 'µ', true, 'micro sign'], + ['·', '·', true, 'middle dot'], + ['•', '•', true, 'bullet'], + ['…', '…', true, 'three dot leader'], + ['′', '′', true, 'minutes / feet'], + ['″', '″', true, 'seconds / inches'], + ['§', '§', true, 'section sign'], + ['¶', '¶', true, 'paragraph sign'], + ['ß', 'ß', true, 'sharp s / ess-zed'], +// quotations + ['‹', '‹', true, 'single left-pointing angle quotation mark'], + ['›', '›', true, 'single right-pointing angle quotation mark'], + ['«', '«', true, 'left pointing guillemet'], + ['»', '»', true, 'right pointing guillemet'], + ['‘', '‘', true, 'left single quotation mark'], + ['’', '’', true, 'right single quotation mark'], + ['“', '“', true, 'left double quotation mark'], + ['”', '”', true, 'right double quotation mark'], + ['‚', '‚', true, 'single low-9 quotation mark'], + ['„', '„', true, 'double low-9 quotation mark'], + ['<', '<', true, 'less-than sign'], + ['>', '>', true, 'greater-than sign'], + ['≤', '≤', true, 'less-than or equal to'], + ['≥', '≥', true, 'greater-than or equal to'], + ['–', '–', true, 'en dash'], + ['—', '—', true, 'em dash'], + ['¯', '¯', true, 'macron'], + ['‾', '‾', true, 'overline'], + ['¤', '¤', true, 'currency sign'], + ['¦', '¦', true, 'broken bar'], + ['¨', '¨', true, 'diaeresis'], + ['¡', '¡', true, 'inverted exclamation mark'], + ['¿', '¿', true, 'turned question mark'], + ['ˆ', 'ˆ', true, 'circumflex accent'], + ['˜', '˜', true, 'small tilde'], + ['°', '°', true, 'degree sign'], + ['−', '−', true, 'minus sign'], + ['±', '±', true, 'plus-minus sign'], + ['÷', '÷', true, 'division sign'], + ['⁄', '⁄', true, 'fraction slash'], + ['×', '×', true, 'multiplication sign'], + ['¹', '¹', true, 'superscript one'], + ['²', '²', true, 'superscript two'], + ['³', '³', true, 'superscript three'], + ['¼', '¼', true, 'fraction one quarter'], + ['½', '½', true, 'fraction one half'], + ['¾', '¾', true, 'fraction three quarters'], +// math / logical + ['ƒ', 'ƒ', true, 'function / florin'], + ['∫', '∫', true, 'integral'], + ['∑', '∑', true, 'n-ary sumation'], + ['∞', '∞', true, 'infinity'], + ['√', '√', true, 'square root'], + ['∼', '∼', false,'similar to'], + ['≅', '≅', false,'approximately equal to'], + ['≈', '≈', true, 'almost equal to'], + ['≠', '≠', true, 'not equal to'], + ['≡', '≡', true, 'identical to'], + ['∈', '∈', false,'element of'], + ['∉', '∉', false,'not an element of'], + ['∋', '∋', false,'contains as member'], + ['∏', '∏', true, 'n-ary product'], + ['∧', '∧', false,'logical and'], + ['∨', '∨', false,'logical or'], + ['¬', '¬', true, 'not sign'], + ['∩', '∩', true, 'intersection'], + ['∪', '∪', false,'union'], + ['∂', '∂', true, 'partial differential'], + ['∀', '∀', false,'for all'], + ['∃', '∃', false,'there exists'], + ['∅', '∅', false,'diameter'], + ['∇', '∇', false,'backward difference'], + ['∗', '∗', false,'asterisk operator'], + ['∝', '∝', false,'proportional to'], + ['∠', '∠', false,'angle'], +// undefined + ['´', '´', true, 'acute accent'], + ['¸', '¸', true, 'cedilla'], + ['ª', 'ª', true, 'feminine ordinal indicator'], + ['º', 'º', true, 'masculine ordinal indicator'], + ['†', '†', true, 'dagger'], + ['‡', '‡', true, 'double dagger'], +// alphabetical special chars + ['À', 'À', true, 'A - grave'], + ['Á', 'Á', true, 'A - acute'], + ['Â', 'Â', true, 'A - circumflex'], + ['Ã', 'Ã', true, 'A - tilde'], + ['Ä', 'Ä', true, 'A - diaeresis'], + ['Å', 'Å', true, 'A - ring above'], + ['Æ', 'Æ', true, 'ligature AE'], + ['Ç', 'Ç', true, 'C - cedilla'], + ['È', 'È', true, 'E - grave'], + ['É', 'É', true, 'E - acute'], + ['Ê', 'Ê', true, 'E - circumflex'], + ['Ë', 'Ë', true, 'E - diaeresis'], + ['Ì', 'Ì', true, 'I - grave'], + ['Í', 'Í', true, 'I - acute'], + ['Î', 'Î', true, 'I - circumflex'], + ['Ï', 'Ï', true, 'I - diaeresis'], + ['Ð', 'Ð', true, 'ETH'], + ['Ñ', 'Ñ', true, 'N - tilde'], + ['Ò', 'Ò', true, 'O - grave'], + ['Ó', 'Ó', true, 'O - acute'], + ['Ô', 'Ô', true, 'O - circumflex'], + ['Õ', 'Õ', true, 'O - tilde'], + ['Ö', 'Ö', true, 'O - diaeresis'], + ['Ø', 'Ø', true, 'O - slash'], + ['Œ', 'Œ', true, 'ligature OE'], + ['Š', 'Š', true, 'S - caron'], + ['Ù', 'Ù', true, 'U - grave'], + ['Ú', 'Ú', true, 'U - acute'], + ['Û', 'Û', true, 'U - circumflex'], + ['Ü', 'Ü', true, 'U - diaeresis'], + ['Ý', 'Ý', true, 'Y - acute'], + ['Ÿ', 'Ÿ', true, 'Y - diaeresis'], + ['Þ', 'Þ', true, 'THORN'], + ['à', 'à', true, 'a - grave'], + ['á', 'á', true, 'a - acute'], + ['â', 'â', true, 'a - circumflex'], + ['ã', 'ã', true, 'a - tilde'], + ['ä', 'ä', true, 'a - diaeresis'], + ['å', 'å', true, 'a - ring above'], + ['æ', 'æ', true, 'ligature ae'], + ['ç', 'ç', true, 'c - cedilla'], + ['è', 'è', true, 'e - grave'], + ['é', 'é', true, 'e - acute'], + ['ê', 'ê', true, 'e - circumflex'], + ['ë', 'ë', true, 'e - diaeresis'], + ['ì', 'ì', true, 'i - grave'], + ['í', 'í', true, 'i - acute'], + ['î', 'î', true, 'i - circumflex'], + ['ï', 'ï', true, 'i - diaeresis'], + ['ð', 'ð', true, 'eth'], + ['ñ', 'ñ', true, 'n - tilde'], + ['ò', 'ò', true, 'o - grave'], + ['ó', 'ó', true, 'o - acute'], + ['ô', 'ô', true, 'o - circumflex'], + ['õ', 'õ', true, 'o - tilde'], + ['ö', 'ö', true, 'o - diaeresis'], + ['ø', 'ø', true, 'o slash'], + ['œ', 'œ', true, 'ligature oe'], + ['š', 'š', true, 's - caron'], + ['ù', 'ù', true, 'u - grave'], + ['ú', 'ú', true, 'u - acute'], + ['û', 'û', true, 'u - circumflex'], + ['ü', 'ü', true, 'u - diaeresis'], + ['ý', 'ý', true, 'y - acute'], + ['þ', 'þ', true, 'thorn'], + ['ÿ', 'ÿ', true, 'y - diaeresis'], + ['Α', 'Α', true, 'Alpha'], + ['Β', 'Β', true, 'Beta'], + ['Γ', 'Γ', true, 'Gamma'], + ['Δ', 'Δ', true, 'Delta'], + ['Ε', 'Ε', true, 'Epsilon'], + ['Ζ', 'Ζ', true, 'Zeta'], + ['Η', 'Η', true, 'Eta'], + ['Θ', 'Θ', true, 'Theta'], + ['Ι', 'Ι', true, 'Iota'], + ['Κ', 'Κ', true, 'Kappa'], + ['Λ', 'Λ', true, 'Lambda'], + ['Μ', 'Μ', true, 'Mu'], + ['Ν', 'Ν', true, 'Nu'], + ['Ξ', 'Ξ', true, 'Xi'], + ['Ο', 'Ο', true, 'Omicron'], + ['Π', 'Π', true, 'Pi'], + ['Ρ', 'Ρ', true, 'Rho'], + ['Σ', 'Σ', true, 'Sigma'], + ['Τ', 'Τ', true, 'Tau'], + ['Υ', 'Υ', true, 'Upsilon'], + ['Φ', 'Φ', true, 'Phi'], + ['Χ', 'Χ', true, 'Chi'], + ['Ψ', 'Ψ', true, 'Psi'], + ['Ω', 'Ω', true, 'Omega'], + ['α', 'α', true, 'alpha'], + ['β', 'β', true, 'beta'], + ['γ', 'γ', true, 'gamma'], + ['δ', 'δ', true, 'delta'], + ['ε', 'ε', true, 'epsilon'], + ['ζ', 'ζ', true, 'zeta'], + ['η', 'η', true, 'eta'], + ['θ', 'θ', true, 'theta'], + ['ι', 'ι', true, 'iota'], + ['κ', 'κ', true, 'kappa'], + ['λ', 'λ', true, 'lambda'], + ['μ', 'μ', true, 'mu'], + ['ν', 'ν', true, 'nu'], + ['ξ', 'ξ', true, 'xi'], + ['ο', 'ο', true, 'omicron'], + ['π', 'π', true, 'pi'], + ['ρ', 'ρ', true, 'rho'], + ['ς', 'ς', true, 'final sigma'], + ['σ', 'σ', true, 'sigma'], + ['τ', 'τ', true, 'tau'], + ['υ', 'υ', true, 'upsilon'], + ['φ', 'φ', true, 'phi'], + ['χ', 'χ', true, 'chi'], + ['ψ', 'ψ', true, 'psi'], + ['ω', 'ω', true, 'omega'], +// symbols + ['ℵ', 'ℵ', false,'alef symbol'], + ['ϖ', 'ϖ', false,'pi symbol'], + ['ℜ', 'ℜ', false,'real part symbol'], + ['ϑ','ϑ', false,'theta symbol'], + ['ϒ', 'ϒ', false,'upsilon - hook symbol'], + ['℘', '℘', false,'Weierstrass p'], + ['ℑ', 'ℑ', false,'imaginary part'], +// arrows + ['←', '←', true, 'leftwards arrow'], + ['↑', '↑', true, 'upwards arrow'], + ['→', '→', true, 'rightwards arrow'], + ['↓', '↓', true, 'downwards arrow'], + ['↔', '↔', true, 'left right arrow'], + ['↵', '↵', false,'carriage return'], + ['⇐', '⇐', false,'leftwards double arrow'], + ['⇑', '⇑', false,'upwards double arrow'], + ['⇒', '⇒', false,'rightwards double arrow'], + ['⇓', '⇓', false,'downwards double arrow'], + ['⇔', '⇔', false,'left right double arrow'], + ['∴', '∴', false,'therefore'], + ['⊂', '⊂', false,'subset of'], + ['⊃', '⊃', false,'superset of'], + ['⊄', '⊄', false,'not a subset of'], + ['⊆', '⊆', false,'subset of or equal to'], + ['⊇', '⊇', false,'superset of or equal to'], + ['⊕', '⊕', false,'circled plus'], + ['⊗', '⊗', false,'circled times'], + ['⊥', '⊥', false,'perpendicular'], + ['⋅', '⋅', false,'dot operator'], + ['⌈', '⌈', false,'left ceiling'], + ['⌉', '⌉', false,'right ceiling'], + ['⌊', '⌊', false,'left floor'], + ['⌋', '⌋', false,'right floor'], + ['⟨', '〈', false,'left-pointing angle bracket'], + ['⟩', '〉', false,'right-pointing angle bracket'], + ['◊', '◊', true,'lozenge'], + ['♠', '♠', false,'black spade suit'], + ['♣', '♣', true, 'black club suit'], + ['♥', '♥', true, 'black heart suit'], + ['♦', '♦', true, 'black diamond suit'], + [' ', ' ', false,'en space'], + [' ', ' ', false,'em space'], + [' ', ' ', false,'thin space'], + ['‌', '‌', false,'zero width non-joiner'], + ['‍', '‍', false,'zero width joiner'], + ['‎', '‎', false,'left-to-right mark'], + ['‏', '‏', false,'right-to-left mark'], + ['­', '­', false,'soft hyphen'] +]; + +tinyMCEPopup.onInit.add(function() { + tinyMCEPopup.dom.setHTML('charmapView', renderCharMapHTML()); +}); + +function renderCharMapHTML() { + var charsPerRow = 20, tdWidth=20, tdHeight=20, i; + var html = ''; + var cols=-1; + + for (i=0; i' + + '' + + charmap[i][1] + + ''; + if ((cols+1) % charsPerRow == 0) + html += ''; + } + } + + if (cols % charsPerRow > 0) { + var padd = charsPerRow - (cols % charsPerRow); + for (var i=0; i '; + } + + html += '
'; + + return html; +} + +function insertChar(chr) { + tinyMCEPopup.execCommand('mceInsertContent', false, '&#' + chr + ';'); + + // Refocus in window + if (tinyMCEPopup.isWindow) + window.focus(); + + tinyMCEPopup.editor.focus(); + tinyMCEPopup.close(); +} + +function previewChar(codeA, codeB, codeN) { + var elmA = document.getElementById('codeA'); + var elmB = document.getElementById('codeB'); + var elmV = document.getElementById('codeV'); + var elmN = document.getElementById('codeN'); + + if (codeA=='#160;') { + elmV.innerHTML = '__'; + } else { + elmV.innerHTML = '&' + codeA; + } + + elmB.innerHTML = '&' + codeA; + elmA.innerHTML = '&' + codeB; + elmN.innerHTML = codeN; +} diff --git a/plugins/TinyMCE/js/themes/advanced/js/color_picker.js b/plugins/TinyMCE/js/themes/advanced/js/color_picker.js new file mode 100644 index 0000000000..fd9700f222 --- /dev/null +++ b/plugins/TinyMCE/js/themes/advanced/js/color_picker.js @@ -0,0 +1,253 @@ +tinyMCEPopup.requireLangPack(); + +var detail = 50, strhex = "0123456789abcdef", i, isMouseDown = false, isMouseOver = false; + +var colors = [ + "#000000","#000033","#000066","#000099","#0000cc","#0000ff","#330000","#330033", + "#330066","#330099","#3300cc","#3300ff","#660000","#660033","#660066","#660099", + "#6600cc","#6600ff","#990000","#990033","#990066","#990099","#9900cc","#9900ff", + "#cc0000","#cc0033","#cc0066","#cc0099","#cc00cc","#cc00ff","#ff0000","#ff0033", + "#ff0066","#ff0099","#ff00cc","#ff00ff","#003300","#003333","#003366","#003399", + "#0033cc","#0033ff","#333300","#333333","#333366","#333399","#3333cc","#3333ff", + "#663300","#663333","#663366","#663399","#6633cc","#6633ff","#993300","#993333", + "#993366","#993399","#9933cc","#9933ff","#cc3300","#cc3333","#cc3366","#cc3399", + "#cc33cc","#cc33ff","#ff3300","#ff3333","#ff3366","#ff3399","#ff33cc","#ff33ff", + "#006600","#006633","#006666","#006699","#0066cc","#0066ff","#336600","#336633", + "#336666","#336699","#3366cc","#3366ff","#666600","#666633","#666666","#666699", + "#6666cc","#6666ff","#996600","#996633","#996666","#996699","#9966cc","#9966ff", + "#cc6600","#cc6633","#cc6666","#cc6699","#cc66cc","#cc66ff","#ff6600","#ff6633", + "#ff6666","#ff6699","#ff66cc","#ff66ff","#009900","#009933","#009966","#009999", + "#0099cc","#0099ff","#339900","#339933","#339966","#339999","#3399cc","#3399ff", + "#669900","#669933","#669966","#669999","#6699cc","#6699ff","#999900","#999933", + "#999966","#999999","#9999cc","#9999ff","#cc9900","#cc9933","#cc9966","#cc9999", + "#cc99cc","#cc99ff","#ff9900","#ff9933","#ff9966","#ff9999","#ff99cc","#ff99ff", + "#00cc00","#00cc33","#00cc66","#00cc99","#00cccc","#00ccff","#33cc00","#33cc33", + "#33cc66","#33cc99","#33cccc","#33ccff","#66cc00","#66cc33","#66cc66","#66cc99", + "#66cccc","#66ccff","#99cc00","#99cc33","#99cc66","#99cc99","#99cccc","#99ccff", + "#cccc00","#cccc33","#cccc66","#cccc99","#cccccc","#ccccff","#ffcc00","#ffcc33", + "#ffcc66","#ffcc99","#ffcccc","#ffccff","#00ff00","#00ff33","#00ff66","#00ff99", + "#00ffcc","#00ffff","#33ff00","#33ff33","#33ff66","#33ff99","#33ffcc","#33ffff", + "#66ff00","#66ff33","#66ff66","#66ff99","#66ffcc","#66ffff","#99ff00","#99ff33", + "#99ff66","#99ff99","#99ffcc","#99ffff","#ccff00","#ccff33","#ccff66","#ccff99", + "#ccffcc","#ccffff","#ffff00","#ffff33","#ffff66","#ffff99","#ffffcc","#ffffff" +]; + +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' +}; + +function init() { + var inputColor = convertRGBToHex(tinyMCEPopup.getWindowArg('input_color')); + + tinyMCEPopup.resizeToInnerSize(); + + generatePicker(); + + if (inputColor) { + changeFinalColor(inputColor); + + col = convertHexToRGB(inputColor); + + if (col) + updateLight(col.r, col.g, col.b); + } +} + +function insertAction() { + var color = document.getElementById("color").value, f = tinyMCEPopup.getWindowArg('func'); + + tinyMCEPopup.restoreSelection(); + + if (f) + f(color); + + tinyMCEPopup.close(); +} + +function showColor(color, name) { + if (name) + document.getElementById("colorname").innerHTML = name; + + document.getElementById("preview").style.backgroundColor = color; + document.getElementById("color").value = color.toLowerCase(); +} + +function convertRGBToHex(col) { + var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi"); + + if (!col) + return col; + + var rgb = col.replace(re, "$1,$2,$3").split(','); + if (rgb.length == 3) { + r = parseInt(rgb[0]).toString(16); + g = parseInt(rgb[1]).toString(16); + b = parseInt(rgb[2]).toString(16); + + r = r.length == 1 ? '0' + r : r; + g = g.length == 1 ? '0' + g : g; + b = b.length == 1 ? '0' + b : b; + + return "#" + r + g + b; + } + + return col; +} + +function convertHexToRGB(col) { + if (col.indexOf('#') != -1) { + col = col.replace(new RegExp('[^0-9A-F]', 'gi'), ''); + + r = parseInt(col.substring(0, 2), 16); + g = parseInt(col.substring(2, 4), 16); + b = parseInt(col.substring(4, 6), 16); + + return {r : r, g : g, b : b}; + } + + return null; +} + +function generatePicker() { + var el = document.getElementById('light'), h = '', i; + + for (i = 0; i < detail; i++){ + h += '
'; + } + + el.innerHTML = h; +} + +function generateWebColors() { + var el = document.getElementById('webcolors'), h = '', i; + + if (el.className == 'generated') + return; + + h += '' + + ''; + + for (i=0; i' + + '' + + ''; + if ((i+1) % 18 == 0) + h += ''; + } + + h += '
'; + + el.innerHTML = h; + el.className = 'generated'; +} + +function generateNamedColors() { + var el = document.getElementById('namedcolors'), h = '', n, v, i = 0; + + if (el.className == 'generated') + return; + + for (n in named) { + v = named[n]; + h += '' + } + + el.innerHTML = h; + el.className = 'generated'; +} + +function dechex(n) { + return strhex.charAt(Math.floor(n / 16)) + strhex.charAt(n % 16); +} + +function computeColor(e) { + var x, y, partWidth, partDetail, imHeight, r, g, b, coef, i, finalCoef, finalR, finalG, finalB; + + x = e.offsetX ? e.offsetX : (e.target ? e.clientX - e.target.x : 0); + y = e.offsetY ? e.offsetY : (e.target ? e.clientY - e.target.y : 0); + + partWidth = document.getElementById('colors').width / 6; + partDetail = detail / 2; + imHeight = document.getElementById('colors').height; + + r = (x >= 0)*(x < partWidth)*255 + (x >= partWidth)*(x < 2*partWidth)*(2*255 - x * 255 / partWidth) + (x >= 4*partWidth)*(x < 5*partWidth)*(-4*255 + x * 255 / partWidth) + (x >= 5*partWidth)*(x < 6*partWidth)*255; + g = (x >= 0)*(x < partWidth)*(x * 255 / partWidth) + (x >= partWidth)*(x < 3*partWidth)*255 + (x >= 3*partWidth)*(x < 4*partWidth)*(4*255 - x * 255 / partWidth); + b = (x >= 2*partWidth)*(x < 3*partWidth)*(-2*255 + x * 255 / partWidth) + (x >= 3*partWidth)*(x < 5*partWidth)*255 + (x >= 5*partWidth)*(x < 6*partWidth)*(6*255 - x * 255 / partWidth); + + coef = (imHeight - y) / imHeight; + r = 128 + (r - 128) * coef; + g = 128 + (g - 128) * coef; + b = 128 + (b - 128) * coef; + + changeFinalColor('#' + dechex(r) + dechex(g) + dechex(b)); + updateLight(r, g, b); +} + +function updateLight(r, g, b) { + var i, partDetail = detail / 2, finalCoef, finalR, finalG, finalB, color; + + for (i=0; i=0) && (i'); + }, + + init : function() { + var f = document.forms[0], ed = tinyMCEPopup.editor; + + // Setup browse button + document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image'); + if (isVisible('srcbrowser')) + document.getElementById('src').style.width = '180px'; + + e = ed.selection.getNode(); + + this.fillFileList('image_list', 'tinyMCEImageList'); + + if (e.nodeName == 'IMG') { + f.src.value = ed.dom.getAttrib(e, 'src'); + f.alt.value = ed.dom.getAttrib(e, 'alt'); + f.border.value = this.getAttrib(e, 'border'); + f.vspace.value = this.getAttrib(e, 'vspace'); + f.hspace.value = this.getAttrib(e, 'hspace'); + f.width.value = ed.dom.getAttrib(e, 'width'); + f.height.value = ed.dom.getAttrib(e, 'height'); + f.insert.value = ed.getLang('update'); + this.styleVal = ed.dom.getAttrib(e, 'style'); + selectByValue(f, 'image_list', f.src.value); + selectByValue(f, 'align', this.getAttrib(e, 'align')); + this.updateStyle(); + } + }, + + fillFileList : function(id, l) { + var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; + + l = window[l]; + + if (l && l.length > 0) { + lst.options[lst.options.length] = new Option('', ''); + + tinymce.each(l, function(o) { + lst.options[lst.options.length] = new Option(o[0], o[1]); + }); + } else + dom.remove(dom.getParent(id, 'tr')); + }, + + update : function() { + var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, args = {}, el; + + tinyMCEPopup.restoreSelection(); + + if (f.src.value === '') { + if (ed.selection.getNode().nodeName == 'IMG') { + ed.dom.remove(ed.selection.getNode()); + ed.execCommand('mceRepaint'); + } + + tinyMCEPopup.close(); + return; + } + + if (!ed.settings.inline_styles) { + args = tinymce.extend(args, { + vspace : nl.vspace.value, + hspace : nl.hspace.value, + border : nl.border.value, + align : getSelectValue(f, 'align') + }); + } else + args.style = this.styleVal; + + tinymce.extend(args, { + src : f.src.value, + alt : f.alt.value, + width : f.width.value, + height : f.height.value + }); + + el = ed.selection.getNode(); + + if (el && el.nodeName == 'IMG') { + ed.dom.setAttribs(el, args); + } else { + ed.execCommand('mceInsertContent', false, '', {skip_undo : 1}); + ed.dom.setAttribs('__mce_tmp', args); + ed.dom.setAttrib('__mce_tmp', 'id', ''); + ed.undoManager.add(); + } + + tinyMCEPopup.close(); + }, + + updateStyle : function() { + var dom = tinyMCEPopup.dom, st, v, f = document.forms[0]; + + if (tinyMCEPopup.editor.settings.inline_styles) { + st = tinyMCEPopup.dom.parseStyle(this.styleVal); + + // Handle align + v = getSelectValue(f, 'align'); + if (v) { + if (v == 'left' || v == 'right') { + st['float'] = v; + delete st['vertical-align']; + } else { + st['vertical-align'] = v; + delete st['float']; + } + } else { + delete st['float']; + delete st['vertical-align']; + } + + // Handle border + v = f.border.value; + if (v || v == '0') { + if (v == '0') + st['border'] = '0'; + else + st['border'] = v + 'px solid black'; + } else + delete st['border']; + + // Handle hspace + v = f.hspace.value; + if (v) { + delete st['margin']; + st['margin-left'] = v + 'px'; + st['margin-right'] = v + 'px'; + } else { + delete st['margin-left']; + delete st['margin-right']; + } + + // Handle vspace + v = f.vspace.value; + if (v) { + delete st['margin']; + st['margin-top'] = v + 'px'; + st['margin-bottom'] = v + 'px'; + } else { + delete st['margin-top']; + delete st['margin-bottom']; + } + + // Merge + st = tinyMCEPopup.dom.parseStyle(dom.serializeStyle(st), 'img'); + this.styleVal = dom.serializeStyle(st, 'img'); + } + }, + + getAttrib : function(e, at) { + var ed = tinyMCEPopup.editor, dom = ed.dom, v, v2; + + if (ed.settings.inline_styles) { + switch (at) { + case 'align': + if (v = dom.getStyle(e, 'float')) + return v; + + if (v = dom.getStyle(e, 'vertical-align')) + return v; + + break; + + case 'hspace': + v = dom.getStyle(e, 'margin-left') + v2 = dom.getStyle(e, 'margin-right'); + if (v && v == v2) + return parseInt(v.replace(/[^0-9]/g, '')); + + break; + + case 'vspace': + v = dom.getStyle(e, 'margin-top') + v2 = dom.getStyle(e, 'margin-bottom'); + if (v && v == v2) + return parseInt(v.replace(/[^0-9]/g, '')); + + break; + + case 'border': + v = 0; + + tinymce.each(['top', 'right', 'bottom', 'left'], function(sv) { + sv = dom.getStyle(e, 'border-' + sv + '-width'); + + // False or not the same as prev + if (!sv || (sv != v && v !== 0)) { + v = 0; + return false; + } + + if (sv) + v = sv; + }); + + if (v) + return parseInt(v.replace(/[^0-9]/g, '')); + + break; + } + } + + if (v = dom.getAttrib(e, at)) + return v; + + return ''; + }, + + resetImageData : function() { + var f = document.forms[0]; + + f.width.value = f.height.value = ""; + }, + + updateImageData : function() { + var f = document.forms[0], t = ImageDialog; + + if (f.width.value == "") + f.width.value = t.preloadImg.width; + + if (f.height.value == "") + f.height.value = t.preloadImg.height; + }, + + getImageData : function() { + var f = document.forms[0]; + + this.preloadImg = new Image(); + this.preloadImg.onload = this.updateImageData; + this.preloadImg.onerror = this.resetImageData; + this.preloadImg.src = tinyMCEPopup.editor.documentBaseURI.toAbsolute(f.src.value); + } +}; + +ImageDialog.preInit(); +tinyMCEPopup.onInit.add(ImageDialog.init, ImageDialog); diff --git a/plugins/TinyMCE/js/themes/advanced/js/link.js b/plugins/TinyMCE/js/themes/advanced/js/link.js new file mode 100644 index 0000000000..f67a5bc828 --- /dev/null +++ b/plugins/TinyMCE/js/themes/advanced/js/link.js @@ -0,0 +1,156 @@ +tinyMCEPopup.requireLangPack(); + +var LinkDialog = { + preInit : function() { + var url; + + if (url = tinyMCEPopup.getParam("external_link_list_url")) + document.write(''); + }, + + init : function() { + var f = document.forms[0], ed = tinyMCEPopup.editor; + + // Setup browse button + document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser', 'href', 'file', 'theme_advanced_link'); + if (isVisible('hrefbrowser')) + document.getElementById('href').style.width = '180px'; + + this.fillClassList('class_list'); + this.fillFileList('link_list', 'tinyMCELinkList'); + this.fillTargetList('target_list'); + + if (e = ed.dom.getParent(ed.selection.getNode(), 'A')) { + f.href.value = ed.dom.getAttrib(e, 'href'); + f.linktitle.value = ed.dom.getAttrib(e, 'title'); + f.insert.value = ed.getLang('update'); + selectByValue(f, 'link_list', f.href.value); + selectByValue(f, 'target_list', ed.dom.getAttrib(e, 'target')); + selectByValue(f, 'class_list', ed.dom.getAttrib(e, 'class')); + } + }, + + update : function() { + var f = document.forms[0], ed = tinyMCEPopup.editor, e, b; + + tinyMCEPopup.restoreSelection(); + e = ed.dom.getParent(ed.selection.getNode(), 'A'); + + // 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); + tinyMCEPopup.execCommand("mceEndUndoLevel"); + tinyMCEPopup.close(); + return; + } + } + + 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}); + + 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, + title : f.linktitle.value, + target : f.target_list ? getSelectValue(f, "target_list") : null, + 'class' : f.class_list ? getSelectValue(f, "class_list") : null + }); + } + }); + } else { + ed.dom.setAttribs(e, { + href : f.href.value, + title : f.linktitle.value, + target : f.target_list ? getSelectValue(f, "target_list") : null, + 'class' : f.class_list ? getSelectValue(f, "class_list") : null + }); + } + + // Don't move caret if selection was image + if (e.childNodes.length != 1 || e.firstChild.nodeName != 'IMG') { + ed.focus(); + ed.selection.select(e); + ed.selection.collapse(0); + tinyMCEPopup.storeSelection(); + } + + tinyMCEPopup.execCommand("mceEndUndoLevel"); + tinyMCEPopup.close(); + }, + + checkPrefix : function(n) { + if (n.value && Validator.isEmail(n) && !/^\s*mailto:/i.test(n.value) && confirm(tinyMCEPopup.getLang('advanced_dlg.link_is_email'))) + n.value = 'mailto:' + n.value; + + if (/^\s*www\./i.test(n.value) && confirm(tinyMCEPopup.getLang('advanced_dlg.link_is_external'))) + n.value = 'http://' + n.value; + }, + + fillFileList : function(id, l) { + var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; + + l = window[l]; + + if (l && l.length > 0) { + lst.options[lst.options.length] = new Option('', ''); + + tinymce.each(l, function(o) { + lst.options[lst.options.length] = new Option(o[0], o[1]); + }); + } else + dom.remove(dom.getParent(id, 'tr')); + }, + + fillClassList : function(id) { + var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; + + if (v = tinyMCEPopup.getParam('theme_advanced_styles')) { + cl = []; + + tinymce.each(v.split(';'), function(v) { + var p = v.split('='); + + cl.push({'title' : p[0], 'class' : p[1]}); + }); + } else + cl = tinyMCEPopup.editor.dom.getClasses(); + + if (cl.length > 0) { + lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), ''); + + tinymce.each(cl, function(o) { + lst.options[lst.options.length] = new Option(o.title || o['class'], o['class']); + }); + } else + dom.remove(dom.getParent(id, 'tr')); + }, + + fillTargetList : function(id) { + var dom = tinyMCEPopup.dom, lst = dom.get(id), v; + + lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), ''); + lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_same'), '_self'); + lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_blank'), '_blank'); + + if (v = tinyMCEPopup.getParam('theme_advanced_link_targets')) { + tinymce.each(v.split(','), function(v) { + v = v.split('='); + lst.options[lst.options.length] = new Option(v[0], v[1]); + }); + } + } +}; + +LinkDialog.preInit(); +tinyMCEPopup.onInit.add(LinkDialog.init, LinkDialog); diff --git a/plugins/TinyMCE/js/themes/advanced/js/source_editor.js b/plugins/TinyMCE/js/themes/advanced/js/source_editor.js new file mode 100644 index 0000000000..279328614c --- /dev/null +++ b/plugins/TinyMCE/js/themes/advanced/js/source_editor.js @@ -0,0 +1,62 @@ +tinyMCEPopup.requireLangPack(); +tinyMCEPopup.onInit.add(onLoadInit); + +function saveContent() { + tinyMCEPopup.editor.setContent(document.getElementById('htmlSource').value, {source_view : true}); + tinyMCEPopup.close(); +} + +function onLoadInit() { + tinyMCEPopup.resizeToInnerSize(); + + // Remove Gecko spellchecking + if (tinymce.isGecko) + document.body.spellcheck = tinyMCEPopup.editor.getParam("gecko_spellcheck"); + + document.getElementById('htmlSource').value = tinyMCEPopup.editor.getContent({source_view : true}); + + if (tinyMCEPopup.editor.getParam("theme_advanced_source_editor_wrap", true)) { + setWrap('soft'); + document.getElementById('wraped').checked = true; + } + + resizeInputs(); +} + +function setWrap(val) { + var v, n, s = document.getElementById('htmlSource'); + + s.wrap = val; + + if (!tinymce.isIE) { + v = s.value; + n = s.cloneNode(false); + n.setAttribute("wrap", val); + s.parentNode.replaceChild(n, s); + n.value = v; + } +} + +function toggleWordWrap(elm) { + if (elm.checked) + setWrap('soft'); + else + setWrap('off'); +} + +var wHeight=0, wWidth=0, owHeight=0, owWidth=0; + +function resizeInputs() { + var el = document.getElementById('htmlSource'); + + if (!tinymce.isIE) { + wHeight = self.innerHeight - 65; + wWidth = self.innerWidth - 16; + } else { + wHeight = document.body.clientHeight - 70; + wWidth = document.body.clientWidth - 16; + } + + 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 new file mode 100644 index 0000000000..69694b1f9f --- /dev/null +++ b/plugins/TinyMCE/js/themes/advanced/langs/en.js @@ -0,0 +1,62 @@ +tinyMCE.addI18n('en.advanced',{ +style_select:"Styles", +font_size:"Font size", +fontdefault:"Font family", +block:"Format", +paragraph:"Paragraph", +div:"Div", +address:"Address", +pre:"Preformatted", +h1:"Heading 1", +h2:"Heading 2", +h3:"Heading 3", +h4:"Heading 4", +h5:"Heading 5", +h6:"Heading 6", +blockquote:"Blockquote", +code:"Code", +samp:"Code sample", +dt:"Definition term ", +dd:"Definition description", +bold_desc:"Bold (Ctrl+B)", +italic_desc:"Italic (Ctrl+I)", +underline_desc:"Underline (Ctrl+U)", +striketrough_desc:"Strikethrough", +justifyleft_desc:"Align left", +justifycenter_desc:"Align center", +justifyright_desc:"Align right", +justifyfull_desc:"Align full", +bullist_desc:"Unordered list", +numlist_desc:"Ordered list", +outdent_desc:"Outdent", +indent_desc:"Indent", +undo_desc:"Undo (Ctrl+Z)", +redo_desc:"Redo (Ctrl+Y)", +link_desc:"Insert/edit link", +unlink_desc:"Unlink", +image_desc:"Insert/edit image", +cleanup_desc:"Cleanup messy code", +code_desc:"Edit HTML Source", +sub_desc:"Subscript", +sup_desc:"Superscript", +hr_desc:"Insert horizontal ruler", +removeformat_desc:"Remove formatting", +custom1_desc:"Your custom description here", +forecolor_desc:"Select text color", +backcolor_desc:"Select background color", +charmap_desc:"Insert custom character", +visualaid_desc:"Toggle guidelines/invisible elements", +anchor_desc:"Insert/edit anchor", +cut_desc:"Cut", +copy_desc:"Copy", +paste_desc:"Paste", +image_props_desc:"Image properties", +newdocument_desc:"New document", +help_desc:"Help", +blockquote_desc:"Blockquote", +clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\r\nDo you want more information about this issue?", +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 diff --git a/plugins/TinyMCE/js/themes/advanced/langs/en_dlg.js b/plugins/TinyMCE/js/themes/advanced/langs/en_dlg.js new file mode 100644 index 0000000000..9d124d7db6 --- /dev/null +++ b/plugins/TinyMCE/js/themes/advanced/langs/en_dlg.js @@ -0,0 +1,51 @@ +tinyMCE.addI18n('en.advanced_dlg',{ +about_title:"About TinyMCE", +about_general:"About", +about_help:"Help", +about_license:"License", +about_plugins:"Plugins", +about_plugin:"Plugin", +about_author:"Author", +about_version:"Version", +about_loaded:"Loaded plugins", +anchor_title:"Insert/edit anchor", +anchor_name:"Anchor name", +code_title:"HTML Source Editor", +code_wordwrap:"Word wrap", +colorpicker_title:"Select a color", +colorpicker_picker_tab:"Picker", +colorpicker_picker_title:"Color picker", +colorpicker_palette_tab:"Palette", +colorpicker_palette_title:"Palette colors", +colorpicker_named_tab:"Named", +colorpicker_named_title:"Named colors", +colorpicker_color:"Color:", +colorpicker_name:"Name:", +charmap_title:"Select custom character", +image_title:"Insert/edit image", +image_src:"Image URL", +image_alt:"Image description", +image_list:"Image list", +image_border:"Border", +image_dimensions:"Dimensions", +image_vspace:"Vertical space", +image_hspace:"Horizontal space", +image_align:"Alignment", +image_align_baseline:"Baseline", +image_align_top:"Top", +image_align_middle:"Middle", +image_align_bottom:"Bottom", +image_align_texttop:"Text top", +image_align_textbottom:"Text bottom", +image_align_left:"Left", +image_align_right:"Right", +link_title:"Insert/edit link", +link_url:"Link URL", +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" +}); \ No newline at end of file diff --git a/plugins/TinyMCE/js/themes/advanced/link.htm b/plugins/TinyMCE/js/themes/advanced/link.htm new file mode 100644 index 0000000000..7565b9ae8b --- /dev/null +++ b/plugins/TinyMCE/js/themes/advanced/link.htm @@ -0,0 +1,58 @@ + + + + {#advanced_dlg.link_title} + + + + + + + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
 
+
+
+ +
+ + +
+
+ + diff --git a/plugins/TinyMCE/js/themes/advanced/skins/default/content.css b/plugins/TinyMCE/js/themes/advanced/skins/default/content.css new file mode 100644 index 0000000000..9fba0431da --- /dev/null +++ b/plugins/TinyMCE/js/themes/advanced/skins/default/content.css @@ -0,0 +1,36 @@ +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;} +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(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} + +/* IE */ +* html body { +scrollbar-3dlight-color:#F0F0EE; +scrollbar-arrow-color:#676662; +scrollbar-base-color:#F0F0EE; +scrollbar-darkshadow-color:#DDD; +scrollbar-face-color:#E0E0DD; +scrollbar-highlight-color:#F0F0EE; +scrollbar-shadow-color:#F0F0EE; +scrollbar-track-color:#F5F5F5; +} + +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/default/dialog.css b/plugins/TinyMCE/js/themes/advanced/skins/default/dialog.css new file mode 100644 index 0000000000..f01222650e --- /dev/null +++ b/plugins/TinyMCE/js/themes/advanced/skins/default/dialog.css @@ -0,0 +1,117 @@ +/* Generic */ +body { +font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px; +scrollbar-3dlight-color:#F0F0EE; +scrollbar-arrow-color:#676662; +scrollbar-base-color:#F0F0EE; +scrollbar-darkshadow-color:#DDDDDD; +scrollbar-face-color:#E0E0DD; +scrollbar-highlight-color:#F0F0EE; +scrollbar-shadow-color:#F0F0EE; +scrollbar-track-color:#F5F5F5; +background:#F0F0EE; +padding:0; +margin:8px 8px 0 8px; +} + +html {background:#F0F0EE;} +td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} +textarea {resize:none;outline:none;} +a:link, a:visited {color:black;} +a:hover {color:#2B6FB6;} +.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;} +input.invalid {border:1px solid #EE0000;} +input {background:#FFF; border:1px solid #CCC;} +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 { +border:0; margin:0; padding:0; +font-weight:bold; +width:94px; height:26px; +background:url(img/buttons.png) 0 -26px; +cursor:pointer; +padding-bottom:2px; +float:left; +} + +#insert {background:url(img/buttons.png) 0 -52px} +#cancel {background:url(img/buttons.png) 0 0; 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; background:url(img/tabs.gif) repeat-x 0 -72px;} +.tabs ul {margin:0; padding:0; list-style:none;} +.tabs li {float:left; background:url(img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;} +.tabs li.current {background:url(img/tabs.gif) no-repeat 0 -18px; margin-right:2px;} +.tabs span {float:left; display:block; background:url(img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;} +.tabs .current span {background:url(img/tabs.gif) no-repeat right -54px;} +.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; border-top:0px; 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;} +#colorpicker #picker_panel fieldset {margin:auto;width:325px;} diff --git a/plugins/TinyMCE/js/themes/advanced/skins/default/img/buttons.png b/plugins/TinyMCE/js/themes/advanced/skins/default/img/buttons.png new file mode 100644 index 0000000000..7dd58418ba Binary files /dev/null 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 new file mode 100644 index 0000000000..2eafd7954e Binary files /dev/null and b/plugins/TinyMCE/js/themes/advanced/skins/default/img/items.gif differ diff --git a/plugins/TinyMCE/js/themes/advanced/skins/default/img/menu_arrow.gif b/plugins/TinyMCE/js/themes/advanced/skins/default/img/menu_arrow.gif new file mode 100644 index 0000000000..85e31dfb2d Binary files /dev/null and b/plugins/TinyMCE/js/themes/advanced/skins/default/img/menu_arrow.gif differ diff --git a/plugins/TinyMCE/js/themes/advanced/skins/default/img/menu_check.gif b/plugins/TinyMCE/js/themes/advanced/skins/default/img/menu_check.gif new file mode 100644 index 0000000000..adfdddccd7 Binary files /dev/null and b/plugins/TinyMCE/js/themes/advanced/skins/default/img/menu_check.gif differ diff --git a/plugins/TinyMCE/js/themes/advanced/skins/default/img/progress.gif b/plugins/TinyMCE/js/themes/advanced/skins/default/img/progress.gif new file mode 100644 index 0000000000..5bb90fd6a4 Binary files /dev/null and b/plugins/TinyMCE/js/themes/advanced/skins/default/img/progress.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 new file mode 100644 index 0000000000..ce4be63558 Binary files /dev/null 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 new file mode 100644 index 0000000000..0049c7b3d0 --- /dev/null +++ b/plugins/TinyMCE/js/themes/advanced/skins/default/ui.css @@ -0,0 +1,213 @@ +/* Reset */ +.defaultSkin table, .defaultSkin tbody, .defaultSkin a, .defaultSkin img, .defaultSkin tr, .defaultSkin div, .defaultSkin td, .defaultSkin iframe, .defaultSkin span, .defaultSkin *, .defaultSkin .mceText {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000; vertical-align:baseline; width:auto; border-collapse:separate; text-align:left} +.defaultSkin a:hover, .defaultSkin a:link, .defaultSkin a:visited, .defaultSkin a:active {text-decoration:none; font-weight:normal; cursor:default; color:#000} +.defaultSkin table td {vertical-align:middle} + +/* Containers */ +.defaultSkin table {direction:ltr; background:#F0F0EE} +.defaultSkin iframe {display:block; background:#FFF} +.defaultSkin .mceToolbar {height:26px} +.defaultSkin .mceLeft {text-align:left} +.defaultSkin .mceRight {text-align:right} + +/* External */ +.defaultSkin .mceExternalToolbar {position:absolute; border:1px solid #CCC; border-bottom:0; display:none;} +.defaultSkin .mceExternalToolbar td.mceToolbar {padding-right:13px;} +.defaultSkin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px; background:url(../../img/icons.gif) -820px 0} + +/* Layout */ +.defaultSkin table.mceLayout {border:0; border-left:1px solid #CCC; border-right:1px solid #CCC} +.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 .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 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} +.defaultSkin table.mceToolbar {margin-left:3px} +.defaultSkin span.mceIcon, .defaultSkin img.mceIcon {display:block; width:20px; height:20px} +.defaultSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px} +.defaultSkin td.mceCenter {text-align:center;} +.defaultSkin td.mceCenter table {margin:0 auto; text-align:left;} +.defaultSkin td.mceRight table {margin:0 0 0 auto;} + +/* Button */ +.defaultSkin .mceButton {display:block; border:1px solid #F0F0EE; width:20px; height:20px; margin-right:1px} +.defaultSkin a.mceButtonEnabled:hover {border:1px solid #0A246A; background-color:#B2BBD0} +.defaultSkin a.mceButtonActive, .defaultSkin a.mceButtonSelected {border:1px solid #0A246A; background-color:#C2CBE0} +.defaultSkin .mceButtonDisabled .mceIcon {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} +.defaultSkin .mceButtonLabeled {width:auto} +.defaultSkin .mceButtonLabeled span.mceIcon {float:left} +.defaultSkin span.mceButtonLabel {display:block; font-size:10px; padding:4px 6px 0 22px; font-family:Tahoma,Verdana,Arial,Helvetica} +.defaultSkin .mceButtonDisabled .mceButtonLabel {color:#888} + +/* Separator */ +.defaultSkin .mceSeparator {display:block; background:url(../../img/icons.gif) -180px 0; width:2px; height:20px; margin:2px 2px 0 4px} + +/* ListBox */ +.defaultSkin .mceListBox, .defaultSkin .mceListBox a {display:block} +.defaultSkin .mceListBox .mceText {padding-left:4px; width:70px; text-align:left; border:1px solid #CCC; border-right:0; background:#FFF; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; height:20px; line-height:20px; overflow:hidden} +.defaultSkin .mceListBox .mceOpen {width:9px; height:20px; background:url(../../img/icons.gif) -741px 0; margin-right:2px; border:1px solid #CCC;} +.defaultSkin table.mceListBoxEnabled:hover .mceText, .defaultSkin .mceListBoxHover .mceText, .defaultSkin .mceListBoxSelected .mceText {border:1px solid #A2ABC0; border-right:0; background:#FFF} +.defaultSkin table.mceListBoxEnabled:hover .mceOpen, .defaultSkin .mceListBoxHover .mceOpen, .defaultSkin .mceListBoxSelected .mceOpen {background-color:#FFF; border:1px solid #A2ABC0} +.defaultSkin .mceListBoxDisabled a.mceText {color:gray; background-color:transparent;} +.defaultSkin .mceListBoxMenu {overflow:auto; overflow-x:hidden} +.defaultSkin .mceOldBoxModel .mceListBox .mceText {height:22px} +.defaultSkin .mceOldBoxModel .mceListBox .mceOpen {width:11px; height:22px;} +.defaultSkin select.mceNativeListBox {font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:7pt; background:#F0F0EE; border:1px solid gray; margin-right:2px;} + +/* SplitButton */ +.defaultSkin .mceSplitButton {width:32px; height:20px; direction:ltr} +.defaultSkin .mceSplitButton a, .defaultSkin .mceSplitButton span {height:20px; display:block} +.defaultSkin .mceSplitButton a.mceAction {width:20px; border:1px solid #F0F0EE; border-right:0;} +.defaultSkin .mceSplitButton span.mceAction {width:20px; background-image:url(../../img/icons.gif);} +.defaultSkin .mceSplitButton a.mceOpen {width:9px; background:url(../../img/icons.gif) -741px 0; border:1px solid #F0F0EE;} +.defaultSkin .mceSplitButton span.mceOpen {display:none} +.defaultSkin table.mceSplitButtonEnabled:hover a.mceAction, .defaultSkin .mceSplitButtonHover a.mceAction, .defaultSkin .mceSplitButtonSelected a.mceAction {border:1px solid #0A246A; border-right:0; background-color:#B2BBD0} +.defaultSkin table.mceSplitButtonEnabled:hover a.mceOpen, .defaultSkin .mceSplitButtonHover a.mceOpen, .defaultSkin .mceSplitButtonSelected a.mceOpen {background-color:#B2BBD0; border:1px solid #0A246A;} +.defaultSkin .mceSplitButtonDisabled .mceAction, .defaultSkin .mceSplitButtonDisabled a.mceOpen {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} +.defaultSkin .mceSplitButtonActive a.mceAction {border:1px solid #0A246A; background-color:#C2CBE0} +.defaultSkin .mceSplitButtonActive a.mceOpen {border-left:0;} + +/* ColorSplitButton */ +.defaultSkin div.mceColorSplitMenu table {background:#FFF; border:1px solid gray} +.defaultSkin .mceColorSplitMenu td {padding:2px} +.defaultSkin .mceColorSplitMenu a {display:block; width:9px; height:9px; overflow:hidden; border:1px solid #808080} +.defaultSkin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px} +.defaultSkin .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} +.defaultSkin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid #0A246A; background-color:#B6BDD2} +.defaultSkin a.mceMoreColors:hover {border:1px solid #0A246A} +.defaultSkin .mceColorPreview {margin-left:2px; width:16px; height:4px; overflow:hidden; background:#9a9b9a} +.defaultSkin .mce_forecolor span.mceAction, .defaultSkin .mce_backcolor span.mceAction {overflow:hidden; height:16px} + +/* Menu */ +.defaultSkin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid #D4D0C8} +.defaultSkin .mceNoIcons span.mceIcon {width:0;} +.defaultSkin .mceNoIcons a .mceText {padding-left:10px} +.defaultSkin .mceMenu table {background:#FFF} +.defaultSkin .mceMenu a, .defaultSkin .mceMenu span, .defaultSkin .mceMenu {display:block} +.defaultSkin .mceMenu td {height:20px} +.defaultSkin .mceMenu a {position:relative;padding:3px 0 4px 0} +.defaultSkin .mceMenu .mceText {position:relative; display:block; font-family:Tahoma,Verdana,Arial,Helvetica; color:#000; cursor:default; margin:0; padding:0 25px 0 25px; display:block} +.defaultSkin .mceMenu span.mceText, .defaultSkin .mceMenu .mcePreview {font-size:11px} +.defaultSkin .mceMenu pre.mceText {font-family:Monospace} +.defaultSkin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:22px;} +.defaultSkin .mceMenu .mceMenuItemEnabled a:hover, .defaultSkin .mceMenu .mceMenuItemActive {background-color:#dbecf3} +.defaultSkin td.mceMenuItemSeparator {background:#DDD; height:1px} +.defaultSkin .mceMenuItemTitle a {border:0; background:#EEE; border-bottom:1px solid #DDD} +.defaultSkin .mceMenuItemTitle span.mceText {color:#000; font-weight:bold; padding-left:4px} +.defaultSkin .mceMenuItemDisabled .mceText {color:#888} +.defaultSkin .mceMenuItemSelected .mceIcon {background:url(img/menu_check.gif)} +.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;} + +/* 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} +.defaultSkin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px} + +/* Formats */ +.defaultSkin .mce_formatPreview a {font-size:10px} +.defaultSkin .mce_p span.mceText {} +.defaultSkin .mce_address span.mceText {font-style:italic} +.defaultSkin .mce_pre span.mceText {font-family:monospace} +.defaultSkin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em} +.defaultSkin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em} +.defaultSkin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em} +.defaultSkin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em} +.defaultSkin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em} +.defaultSkin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em} + +/* Theme */ +.defaultSkin span.mce_bold {background-position:0 0} +.defaultSkin span.mce_italic {background-position:-60px 0} +.defaultSkin span.mce_underline {background-position:-140px 0} +.defaultSkin span.mce_strikethrough {background-position:-120px 0} +.defaultSkin span.mce_undo {background-position:-160px 0} +.defaultSkin span.mce_redo {background-position:-100px 0} +.defaultSkin span.mce_cleanup {background-position:-40px 0} +.defaultSkin span.mce_bullist {background-position:-20px 0} +.defaultSkin span.mce_numlist {background-position:-80px 0} +.defaultSkin span.mce_justifyleft {background-position:-460px 0} +.defaultSkin span.mce_justifyright {background-position:-480px 0} +.defaultSkin span.mce_justifycenter {background-position:-420px 0} +.defaultSkin span.mce_justifyfull {background-position:-440px 0} +.defaultSkin span.mce_anchor {background-position:-200px 0} +.defaultSkin span.mce_indent {background-position:-400px 0} +.defaultSkin span.mce_outdent {background-position:-540px 0} +.defaultSkin span.mce_link {background-position:-500px 0} +.defaultSkin span.mce_unlink {background-position:-640px 0} +.defaultSkin span.mce_sub {background-position:-600px 0} +.defaultSkin span.mce_sup {background-position:-620px 0} +.defaultSkin span.mce_removeformat {background-position:-580px 0} +.defaultSkin span.mce_newdocument {background-position:-520px 0} +.defaultSkin span.mce_image {background-position:-380px 0} +.defaultSkin span.mce_help {background-position:-340px 0} +.defaultSkin span.mce_code {background-position:-260px 0} +.defaultSkin span.mce_hr {background-position:-360px 0} +.defaultSkin span.mce_visualaid {background-position:-660px 0} +.defaultSkin span.mce_charmap {background-position:-240px 0} +.defaultSkin span.mce_paste {background-position:-560px 0} +.defaultSkin span.mce_copy {background-position:-700px 0} +.defaultSkin span.mce_cut {background-position:-680px 0} +.defaultSkin span.mce_blockquote {background-position:-220px 0} +.defaultSkin .mce_forecolor span.mceAction {background-position:-720px 0} +.defaultSkin .mce_backcolor span.mceAction {background-position:-760px 0} +.defaultSkin span.mce_forecolorpicker {background-position:-720px 0} +.defaultSkin span.mce_backcolorpicker {background-position:-760px 0} + +/* Plugins */ +.defaultSkin span.mce_advhr {background-position:-0px -20px} +.defaultSkin span.mce_ltr {background-position:-20px -20px} +.defaultSkin span.mce_rtl {background-position:-40px -20px} +.defaultSkin span.mce_emotions {background-position:-60px -20px} +.defaultSkin span.mce_fullpage {background-position:-80px -20px} +.defaultSkin span.mce_fullscreen {background-position:-100px -20px} +.defaultSkin span.mce_iespell {background-position:-120px -20px} +.defaultSkin span.mce_insertdate {background-position:-140px -20px} +.defaultSkin span.mce_inserttime {background-position:-160px -20px} +.defaultSkin span.mce_absolute {background-position:-180px -20px} +.defaultSkin span.mce_backward {background-position:-200px -20px} +.defaultSkin span.mce_forward {background-position:-220px -20px} +.defaultSkin span.mce_insert_layer {background-position:-240px -20px} +.defaultSkin span.mce_insertlayer {background-position:-260px -20px} +.defaultSkin span.mce_movebackward {background-position:-280px -20px} +.defaultSkin span.mce_moveforward {background-position:-300px -20px} +.defaultSkin span.mce_media {background-position:-320px -20px} +.defaultSkin span.mce_nonbreaking {background-position:-340px -20px} +.defaultSkin span.mce_pastetext {background-position:-360px -20px} +.defaultSkin span.mce_pasteword {background-position:-380px -20px} +.defaultSkin span.mce_selectall {background-position:-400px -20px} +.defaultSkin span.mce_preview {background-position:-420px -20px} +.defaultSkin span.mce_print {background-position:-440px -20px} +.defaultSkin span.mce_cancel {background-position:-460px -20px} +.defaultSkin span.mce_save {background-position:-480px -20px} +.defaultSkin span.mce_replace {background-position:-500px -20px} +.defaultSkin span.mce_search {background-position:-520px -20px} +.defaultSkin span.mce_styleprops {background-position:-560px -20px} +.defaultSkin span.mce_table {background-position:-580px -20px} +.defaultSkin span.mce_cell_props {background-position:-600px -20px} +.defaultSkin span.mce_delete_table {background-position:-620px -20px} +.defaultSkin span.mce_delete_col {background-position:-640px -20px} +.defaultSkin span.mce_delete_row {background-position:-660px -20px} +.defaultSkin span.mce_col_after {background-position:-680px -20px} +.defaultSkin span.mce_col_before {background-position:-700px -20px} +.defaultSkin span.mce_row_after {background-position:-720px -20px} +.defaultSkin span.mce_row_before {background-position:-740px -20px} +.defaultSkin span.mce_merge_cells {background-position:-760px -20px} +.defaultSkin span.mce_table_props {background-position:-980px -20px} +.defaultSkin span.mce_row_props {background-position:-780px -20px} +.defaultSkin span.mce_split_cells {background-position:-800px -20px} +.defaultSkin span.mce_template {background-position:-820px -20px} +.defaultSkin span.mce_visualchars {background-position:-840px -20px} +.defaultSkin span.mce_abbr {background-position:-860px -20px} +.defaultSkin span.mce_acronym {background-position:-880px -20px} +.defaultSkin span.mce_attribs {background-position:-900px -20px} +.defaultSkin span.mce_cite {background-position:-920px -20px} +.defaultSkin span.mce_del {background-position:-940px -20px} +.defaultSkin span.mce_ins {background-position:-960px -20px} +.defaultSkin span.mce_pagebreak {background-position:0 -40px} +.defaultSkin span.mce_restoredraft {background-position:-20px -40px} +.defaultSkin span.mce_spellchecker {background-position:-540px -20px} diff --git a/plugins/TinyMCE/js/themes/advanced/skins/o2k7/content.css b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/content.css new file mode 100644 index 0000000000..3b833d9451 --- /dev/null +++ b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/content.css @@ -0,0 +1,36 @@ +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;} +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} + +/* IE */ +* html body { +scrollbar-3dlight-color:#F0F0EE; +scrollbar-arrow-color:#676662; +scrollbar-base-color:#F0F0EE; +scrollbar-darkshadow-color:#DDD; +scrollbar-face-color:#E0E0DD; +scrollbar-highlight-color:#F0F0EE; +scrollbar-shadow-color:#F0F0EE; +scrollbar-track-color:#F5F5F5; +} + +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/o2k7/dialog.css b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/dialog.css new file mode 100644 index 0000000000..e3af1396e4 --- /dev/null +++ b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/dialog.css @@ -0,0 +1,116 @@ +/* Generic */ +body { +font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px; +scrollbar-3dlight-color:#F0F0EE; +scrollbar-arrow-color:#676662; +scrollbar-base-color:#F0F0EE; +scrollbar-darkshadow-color:#DDDDDD; +scrollbar-face-color:#E0E0DD; +scrollbar-highlight-color:#F0F0EE; +scrollbar-shadow-color:#F0F0EE; +scrollbar-track-color:#F5F5F5; +background:#F0F0EE; +padding:0; +margin:8px 8px 0 8px; +} + +html {background:#F0F0EE;} +td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} +textarea {resize:none;outline:none;} +a:link, a:visited {color:black;} +a:hover {color:#2B6FB6;} +.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;} +input.invalid {border:1px solid #EE0000;} +input {background:#FFF; border:1px solid #CCC;} +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 { +border:0; margin:0; padding:0; +font-weight:bold; +width:94px; height:26px; +background:url(../default/img/buttons.png) 0 -26px; +cursor:pointer; +padding-bottom:2px; +float:left; +} + +#insert {background:url(../default/img/buttons.png) 0 -52px} +#cancel {background:url(../default/img/buttons.png) 0 0; 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; background:url(../default/img/tabs.gif) repeat-x 0 -72px;} +.tabs ul {margin:0; padding:0; list-style:none;} +.tabs li {float:left; background:url(../default/img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;} +.tabs li.current {background:url(../default/img/tabs.gif) no-repeat 0 -18px; margin-right:2px;} +.tabs span {float:left; display:block; background:url(../default/img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;} +.tabs .current span {background:url(../default/img/tabs.gif) no-repeat right -54px;} +.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; border-top:0px; 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/o2k7/img/button_bg.png b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/img/button_bg.png new file mode 100644 index 0000000000..12cfb419bb Binary files /dev/null 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 new file mode 100644 index 0000000000..8996c7493e Binary files /dev/null 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 new file mode 100644 index 0000000000..bd5d2550c0 Binary files /dev/null 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 new file mode 100644 index 0000000000..a6253976af --- /dev/null +++ b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/ui.css @@ -0,0 +1,215 @@ +/* Reset */ +.o2k7Skin table, .o2k7Skin tbody, .o2k7Skin a, .o2k7Skin img, .o2k7Skin tr, .o2k7Skin div, .o2k7Skin td, .o2k7Skin iframe, .o2k7Skin span, .o2k7Skin *, .o2k7Skin .mceText {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000; vertical-align:baseline; width:auto; border-collapse:separate; text-align:left} +.o2k7Skin a:hover, .o2k7Skin a:link, .o2k7Skin a:visited, .o2k7Skin a:active {text-decoration:none; font-weight:normal; cursor:default; color:#000} +.o2k7Skin table td {vertical-align:middle} + +/* Containers */ +.o2k7Skin table {background:#E5EFFD} +.o2k7Skin iframe {display:block; background:#FFF} +.o2k7Skin .mceToolbar {height:26px} + +/* External */ +.o2k7Skin .mceExternalToolbar {position:absolute; border:1px solid #ABC6DD; border-bottom:0; display:none} +.o2k7Skin .mceExternalToolbar td.mceToolbar {padding-right:13px;} +.o2k7Skin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px; background:url(../../img/icons.gif) -820px 0} + +/* Layout */ +.o2k7Skin table.mceLayout {border:0; border-left:1px solid #ABC6DD; border-right:1px solid #ABC6DD} +.o2k7Skin table.mceLayout tr.mceFirst td {border-top:1px solid #ABC6DD} +.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 .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} +.o2k7Skin table.mceToolbar {margin-left:3px} +.o2k7Skin .mceToolbar .mceToolbarStart span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px; margin-left:3px;} +.o2k7Skin .mceToolbar td.mceFirst span {margin:0} +.o2k7Skin .mceToolbar .mceToolbarEnd span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px} +.o2k7Skin .mceToolbar .mceToolbarEndListBox span, .o2k7Skin .mceToolbar .mceToolbarStartListBox span {display:none} +.o2k7Skin span.mceIcon, .o2k7Skin img.mceIcon {display:block; width:20px; height:20px} +.o2k7Skin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px} +.o2k7Skin td.mceCenter {text-align:center;} +.o2k7Skin td.mceCenter table {margin:0 auto; text-align:left;} +.o2k7Skin td.mceRight table {margin:0 0 0 auto;} + +/* Button */ +.o2k7Skin .mceButton {display:block; background:url(img/button_bg.png); width:22px; height:22px} +.o2k7Skin a.mceButton span, .o2k7Skin a.mceButton img {margin-left:1px} +.o2k7Skin .mceOldBoxModel a.mceButton span, .o2k7Skin .mceOldBoxModel a.mceButton img {margin:0 0 0 1px} +.o2k7Skin a.mceButtonEnabled:hover {background-color:#B2BBD0; background-position:0 -22px} +.o2k7Skin a.mceButtonActive, .o2k7Skin a.mceButtonSelected {background-position:0 -44px} +.o2k7Skin .mceButtonDisabled .mceIcon {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} +.o2k7Skin .mceButtonLabeled {width:auto} +.o2k7Skin .mceButtonLabeled span.mceIcon {float:left} +.o2k7Skin span.mceButtonLabel {display:block; font-size:10px; padding:4px 6px 0 22px; font-family:Tahoma,Verdana,Arial,Helvetica} +.o2k7Skin .mceButtonDisabled .mceButtonLabel {color:#888} + +/* Separator */ +.o2k7Skin .mceSeparator {display:block; background:url(img/button_bg.png) -22px 0; width:5px; height:22px} + +/* ListBox */ +.o2k7Skin .mceListBox {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} +.o2k7Skin table.mceListBoxEnabled:hover .mceText, .o2k7Skin .mceListBoxHover .mceText, .o2k7Skin .mceListBoxSelected .mceText {background:#FFF} +.o2k7Skin table.mceListBoxEnabled:hover .mceOpen, .o2k7Skin .mceListBoxHover .mceOpen, .o2k7Skin .mceListBoxSelected .mceOpen {background-position:-66px -22px} +.o2k7Skin .mceListBoxDisabled .mceText {color:gray} +.o2k7Skin .mceListBoxMenu {overflow:auto; overflow-x:hidden} +.o2k7Skin .mceOldBoxModel .mceListBox .mceText {height:22px} +.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 {background:url(img/button_bg.png)} +.o2k7Skin .mceSplitButton a.mceAction {width:22px} +.o2k7Skin .mceSplitButton span.mceAction {width:22px; background-image:url(../../img/icons.gif)} +.o2k7Skin .mceSplitButton a.mceOpen {width:10px; background:url(img/button_bg.png) -44px 0} +.o2k7Skin .mceSplitButton span.mceOpen {display:none} +.o2k7Skin table.mceSplitButtonEnabled:hover a.mceAction, .o2k7Skin .mceSplitButtonHover a.mceAction, .o2k7Skin .mceSplitButtonSelected {background:url(img/button_bg.png) 0 -22px} +.o2k7Skin table.mceSplitButtonEnabled:hover a.mceOpen, .o2k7Skin .mceSplitButtonHover a.mceOpen, .o2k7Skin .mceSplitButtonSelected a.mceOpen {background-position:-44px -44px} +.o2k7Skin .mceSplitButtonDisabled .mceAction {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} +.o2k7Skin .mceSplitButtonActive {background-position:0 -44px} + +/* ColorSplitButton */ +.o2k7Skin div.mceColorSplitMenu table {background:#FFF; border:1px solid gray} +.o2k7Skin .mceColorSplitMenu td {padding:2px} +.o2k7Skin .mceColorSplitMenu a {display:block; width:9px; height:9px; overflow:hidden; border:1px solid #808080} +.o2k7Skin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px} +.o2k7Skin .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} +.o2k7Skin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid #0A246A; background-color:#B6BDD2} +.o2k7Skin a.mceMoreColors:hover {border:1px solid #0A246A} +.o2k7Skin .mceColorPreview {margin-left:2px; width:16px; height:4px; overflow:hidden; background:#9a9b9a;overflow:hidden} +.o2k7Skin .mce_forecolor span.mceAction, .o2k7Skin .mce_backcolor span.mceAction {height:15px;overflow:hidden} + +/* Menu */ +.o2k7Skin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid #ABC6DD} +.o2k7Skin .mceNoIcons span.mceIcon {width:0;} +.o2k7Skin .mceNoIcons a .mceText {padding-left:10px} +.o2k7Skin .mceMenu table {background:#FFF} +.o2k7Skin .mceMenu a, .o2k7Skin .mceMenu span, .o2k7Skin .mceMenu {display:block} +.o2k7Skin .mceMenu td {height:20px} +.o2k7Skin .mceMenu a {position:relative;padding:3px 0 4px 0} +.o2k7Skin .mceMenu .mceText {position:relative; display:block; font-family:Tahoma,Verdana,Arial,Helvetica; color:#000; cursor:default; margin:0; padding:0 25px 0 25px; display:block} +.o2k7Skin .mceMenu span.mceText, .o2k7Skin .mceMenu .mcePreview {font-size:11px} +.o2k7Skin .mceMenu pre.mceText {font-family:Monospace} +.o2k7Skin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:22px;} +.o2k7Skin .mceMenu .mceMenuItemEnabled a:hover, .o2k7Skin .mceMenu .mceMenuItemActive {background-color:#dbecf3} +.o2k7Skin td.mceMenuItemSeparator {background:#DDD; height:1px} +.o2k7Skin .mceMenuItemTitle a {border:0; background:#E5EFFD; border-bottom:1px solid #ABC6DD} +.o2k7Skin .mceMenuItemTitle span.mceText {color:#000; font-weight:bold; padding-left:4px} +.o2k7Skin .mceMenuItemDisabled .mceText {color:#888} +.o2k7Skin .mceMenuItemSelected .mceIcon {background:url(../default/img/menu_check.gif)} +.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;} + +/* 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} +.o2k7Skin .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 */ +.o2k7Skin .mce_formatPreview a {font-size:10px} +.o2k7Skin .mce_p span.mceText {} +.o2k7Skin .mce_address span.mceText {font-style:italic} +.o2k7Skin .mce_pre span.mceText {font-family:monospace} +.o2k7Skin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em} +.o2k7Skin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em} +.o2k7Skin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em} +.o2k7Skin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em} +.o2k7Skin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em} +.o2k7Skin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em} + +/* Theme */ +.o2k7Skin span.mce_bold {background-position:0 0} +.o2k7Skin span.mce_italic {background-position:-60px 0} +.o2k7Skin span.mce_underline {background-position:-140px 0} +.o2k7Skin span.mce_strikethrough {background-position:-120px 0} +.o2k7Skin span.mce_undo {background-position:-160px 0} +.o2k7Skin span.mce_redo {background-position:-100px 0} +.o2k7Skin span.mce_cleanup {background-position:-40px 0} +.o2k7Skin span.mce_bullist {background-position:-20px 0} +.o2k7Skin span.mce_numlist {background-position:-80px 0} +.o2k7Skin span.mce_justifyleft {background-position:-460px 0} +.o2k7Skin span.mce_justifyright {background-position:-480px 0} +.o2k7Skin span.mce_justifycenter {background-position:-420px 0} +.o2k7Skin span.mce_justifyfull {background-position:-440px 0} +.o2k7Skin span.mce_anchor {background-position:-200px 0} +.o2k7Skin span.mce_indent {background-position:-400px 0} +.o2k7Skin span.mce_outdent {background-position:-540px 0} +.o2k7Skin span.mce_link {background-position:-500px 0} +.o2k7Skin span.mce_unlink {background-position:-640px 0} +.o2k7Skin span.mce_sub {background-position:-600px 0} +.o2k7Skin span.mce_sup {background-position:-620px 0} +.o2k7Skin span.mce_removeformat {background-position:-580px 0} +.o2k7Skin span.mce_newdocument {background-position:-520px 0} +.o2k7Skin span.mce_image {background-position:-380px 0} +.o2k7Skin span.mce_help {background-position:-340px 0} +.o2k7Skin span.mce_code {background-position:-260px 0} +.o2k7Skin span.mce_hr {background-position:-360px 0} +.o2k7Skin span.mce_visualaid {background-position:-660px 0} +.o2k7Skin span.mce_charmap {background-position:-240px 0} +.o2k7Skin span.mce_paste {background-position:-560px 0} +.o2k7Skin span.mce_copy {background-position:-700px 0} +.o2k7Skin span.mce_cut {background-position:-680px 0} +.o2k7Skin span.mce_blockquote {background-position:-220px 0} +.o2k7Skin .mce_forecolor span.mceAction {background-position:-720px 0} +.o2k7Skin .mce_backcolor span.mceAction {background-position:-760px 0} +.o2k7Skin span.mce_forecolorpicker {background-position:-720px 0} +.o2k7Skin span.mce_backcolorpicker {background-position:-760px 0} + +/* Plugins */ +.o2k7Skin span.mce_advhr {background-position:-0px -20px} +.o2k7Skin span.mce_ltr {background-position:-20px -20px} +.o2k7Skin span.mce_rtl {background-position:-40px -20px} +.o2k7Skin span.mce_emotions {background-position:-60px -20px} +.o2k7Skin span.mce_fullpage {background-position:-80px -20px} +.o2k7Skin span.mce_fullscreen {background-position:-100px -20px} +.o2k7Skin span.mce_iespell {background-position:-120px -20px} +.o2k7Skin span.mce_insertdate {background-position:-140px -20px} +.o2k7Skin span.mce_inserttime {background-position:-160px -20px} +.o2k7Skin span.mce_absolute {background-position:-180px -20px} +.o2k7Skin span.mce_backward {background-position:-200px -20px} +.o2k7Skin span.mce_forward {background-position:-220px -20px} +.o2k7Skin span.mce_insert_layer {background-position:-240px -20px} +.o2k7Skin span.mce_insertlayer {background-position:-260px -20px} +.o2k7Skin span.mce_movebackward {background-position:-280px -20px} +.o2k7Skin span.mce_moveforward {background-position:-300px -20px} +.o2k7Skin span.mce_media {background-position:-320px -20px} +.o2k7Skin span.mce_nonbreaking {background-position:-340px -20px} +.o2k7Skin span.mce_pastetext {background-position:-360px -20px} +.o2k7Skin span.mce_pasteword {background-position:-380px -20px} +.o2k7Skin span.mce_selectall {background-position:-400px -20px} +.o2k7Skin span.mce_preview {background-position:-420px -20px} +.o2k7Skin span.mce_print {background-position:-440px -20px} +.o2k7Skin span.mce_cancel {background-position:-460px -20px} +.o2k7Skin span.mce_save {background-position:-480px -20px} +.o2k7Skin span.mce_replace {background-position:-500px -20px} +.o2k7Skin span.mce_search {background-position:-520px -20px} +.o2k7Skin span.mce_styleprops {background-position:-560px -20px} +.o2k7Skin span.mce_table {background-position:-580px -20px} +.o2k7Skin span.mce_cell_props {background-position:-600px -20px} +.o2k7Skin span.mce_delete_table {background-position:-620px -20px} +.o2k7Skin span.mce_delete_col {background-position:-640px -20px} +.o2k7Skin span.mce_delete_row {background-position:-660px -20px} +.o2k7Skin span.mce_col_after {background-position:-680px -20px} +.o2k7Skin span.mce_col_before {background-position:-700px -20px} +.o2k7Skin span.mce_row_after {background-position:-720px -20px} +.o2k7Skin span.mce_row_before {background-position:-740px -20px} +.o2k7Skin span.mce_merge_cells {background-position:-760px -20px} +.o2k7Skin span.mce_table_props {background-position:-980px -20px} +.o2k7Skin span.mce_row_props {background-position:-780px -20px} +.o2k7Skin span.mce_split_cells {background-position:-800px -20px} +.o2k7Skin span.mce_template {background-position:-820px -20px} +.o2k7Skin span.mce_visualchars {background-position:-840px -20px} +.o2k7Skin span.mce_abbr {background-position:-860px -20px} +.o2k7Skin span.mce_acronym {background-position:-880px -20px} +.o2k7Skin span.mce_attribs {background-position:-900px -20px} +.o2k7Skin span.mce_cite {background-position:-920px -20px} +.o2k7Skin span.mce_del {background-position:-940px -20px} +.o2k7Skin span.mce_ins {background-position:-960px -20px} +.o2k7Skin span.mce_pagebreak {background-position:0 -40px} +.o2k7Skin span.mce_restoredraft {background-position:-20px -40px} +.o2k7Skin span.mce_spellchecker {background-position:-540px -20px} diff --git a/plugins/TinyMCE/js/themes/advanced/skins/o2k7/ui_black.css b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/ui_black.css new file mode 100644 index 0000000000..153f0c38a6 --- /dev/null +++ b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/ui_black.css @@ -0,0 +1,8 @@ +/* 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 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;} +.o2k7SkinBlack table.mceSplitButtonEnabled:hover a.mceAction, .o2k7SkinBlack .mceSplitButtonHover a.mceAction, .o2k7SkinBlack .mceSplitButtonSelected {background-image:url(img/button_bg_black.png)} +.o2k7SkinBlack .mceMenu .mceMenuItemEnabled a:hover, .o2k7SkinBlack .mceMenu .mceMenuItemActive {background-color:#FFE7A1} \ No newline at end of file diff --git a/plugins/TinyMCE/js/themes/advanced/skins/o2k7/ui_silver.css b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/ui_silver.css new file mode 100644 index 0000000000..7fe3b45e12 --- /dev/null +++ b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/ui_silver.css @@ -0,0 +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 .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 new file mode 100644 index 0000000000..5957bbd178 --- /dev/null +++ b/plugins/TinyMCE/js/themes/advanced/source_editor.htm @@ -0,0 +1,25 @@ + + + {#advanced_dlg.code_title} + + + + +
+
{#advanced_dlg.code_title}
+ +
+ +
+ +
+ + + +
+ + +
+
+ + diff --git a/plugins/TinyMCE/js/themes/simple/editor_template.js b/plugins/TinyMCE/js/themes/simple/editor_template.js new file mode 100644 index 0000000000..ed89abc067 --- /dev/null +++ b/plugins/TinyMCE/js/themes/simple/editor_template.js @@ -0,0 +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 diff --git a/plugins/TinyMCE/js/themes/simple/editor_template_src.js b/plugins/TinyMCE/js/themes/simple/editor_template_src.js new file mode 100644 index 0000000000..4b862d49d6 --- /dev/null +++ b/plugins/TinyMCE/js/themes/simple/editor_template_src.js @@ -0,0 +1,85 @@ +/** + * editor_template_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function() { + var DOM = tinymce.DOM; + + // Tell it to load theme specific language pack(s) + tinymce.ThemeManager.requireLangPack('simple'); + + tinymce.create('tinymce.themes.SimpleTheme', { + init : function(ed, url) { + var t = this, states = ['Bold', 'Italic', 'Underline', 'Strikethrough', 'InsertUnorderedList', 'InsertOrderedList'], s = ed.settings; + + t.editor = ed; + + ed.onInit.add(function() { + ed.onNodeChange.add(function(ed, cm) { + tinymce.each(states, function(c) { + 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"); + }, + + renderUI : function(o) { + var t = this, n = o.targetNode, ic, tb, ed = t.editor, cf = ed.controlManager, sc; + + n = DOM.insertAfter(DOM.create('span', {id : ed.id + '_container', 'class' : 'mceEditor ' + ed.settings.skin + 'SimpleSkin'}), n); + n = sc = DOM.add(n, 'table', {cellPadding : 0, cellSpacing : 0, 'class' : 'mceLayout'}); + n = tb = DOM.add(n, 'tbody'); + + // Create iframe container + n = DOM.add(tb, 'tr'); + n = ic = DOM.add(DOM.add(n, 'td'), 'div', {'class' : 'mceIframeContainer'}); + + // Create toolbar container + n = DOM.add(DOM.add(tb, 'tr', {'class' : 'last'}), 'td', {'class' : 'mceToolbar mceLast', align : 'center'}); + + // Create toolbar + tb = t.toolbar = cf.createToolbar("tools1"); + tb.add(cf.createButton('bold', {title : 'simple.bold_desc', cmd : 'Bold'})); + tb.add(cf.createButton('italic', {title : 'simple.italic_desc', cmd : 'Italic'})); + tb.add(cf.createButton('underline', {title : 'simple.underline_desc', cmd : 'Underline'})); + tb.add(cf.createButton('strikethrough', {title : 'simple.striketrough_desc', cmd : 'Strikethrough'})); + tb.add(cf.createSeparator()); + tb.add(cf.createButton('undo', {title : 'simple.undo_desc', cmd : 'Undo'})); + tb.add(cf.createButton('redo', {title : 'simple.redo_desc', cmd : 'Redo'})); + tb.add(cf.createSeparator()); + tb.add(cf.createButton('cleanup', {title : 'simple.cleanup_desc', cmd : 'mceCleanup'})); + tb.add(cf.createSeparator()); + tb.add(cf.createButton('insertunorderedlist', {title : 'simple.bullist_desc', cmd : 'InsertUnorderedList'})); + tb.add(cf.createButton('insertorderedlist', {title : 'simple.numlist_desc', cmd : 'InsertOrderedList'})); + tb.renderTo(n); + + return { + iframeContainer : ic, + editorContainer : ed.id + '_container', + sizeContainer : sc, + 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/img/icons.gif b/plugins/TinyMCE/js/themes/simple/img/icons.gif new file mode 100644 index 0000000000..16af141ff0 Binary files /dev/null and b/plugins/TinyMCE/js/themes/simple/img/icons.gif differ diff --git a/plugins/TinyMCE/js/themes/simple/langs/en.js b/plugins/TinyMCE/js/themes/simple/langs/en.js new file mode 100644 index 0000000000..9f08f102fb --- /dev/null +++ b/plugins/TinyMCE/js/themes/simple/langs/en.js @@ -0,0 +1,11 @@ +tinyMCE.addI18n('en.simple',{ +bold_desc:"Bold (Ctrl+B)", +italic_desc:"Italic (Ctrl+I)", +underline_desc:"Underline (Ctrl+U)", +striketrough_desc:"Strikethrough", +bullist_desc:"Unordered list", +numlist_desc:"Ordered list", +undo_desc:"Undo (Ctrl+Z)", +redo_desc:"Redo (Ctrl+Y)", +cleanup_desc:"Cleanup messy code" +}); \ No newline at end of file diff --git a/plugins/TinyMCE/js/themes/simple/skins/default/content.css b/plugins/TinyMCE/js/themes/simple/skins/default/content.css new file mode 100644 index 0000000000..2506c807ca --- /dev/null +++ b/plugins/TinyMCE/js/themes/simple/skins/default/content.css @@ -0,0 +1,25 @@ +body, td, pre { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; +} + +body { + background-color: #FFFFFF; +} + +.mceVisualAid { + border: 1px dashed #BBBBBB; +} + +/* MSIE specific */ + +* html body { + scrollbar-3dlight-color: #F0F0EE; + scrollbar-arrow-color: #676662; + scrollbar-base-color: #F0F0EE; + scrollbar-darkshadow-color: #DDDDDD; + scrollbar-face-color: #E0E0DD; + scrollbar-highlight-color: #F0F0EE; + scrollbar-shadow-color: #F0F0EE; + scrollbar-track-color: #F5F5F5; +} diff --git a/plugins/TinyMCE/js/themes/simple/skins/default/ui.css b/plugins/TinyMCE/js/themes/simple/skins/default/ui.css new file mode 100644 index 0000000000..076fe84e34 --- /dev/null +++ b/plugins/TinyMCE/js/themes/simple/skins/default/ui.css @@ -0,0 +1,32 @@ +/* Reset */ +.defaultSimpleSkin table, .defaultSimpleSkin tbody, .defaultSimpleSkin a, .defaultSimpleSkin img, .defaultSimpleSkin tr, .defaultSimpleSkin div, .defaultSimpleSkin td, .defaultSimpleSkin iframe, .defaultSimpleSkin span, .defaultSimpleSkin * {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000} + +/* Containers */ +.defaultSimpleSkin {position:relative} +.defaultSimpleSkin table.mceLayout {background:#F0F0EE; border:1px solid #CCC;} +.defaultSimpleSkin iframe {display:block; background:#FFF; border-bottom:1px solid #CCC;} +.defaultSimpleSkin .mceToolbar {height:24px;} + +/* Layout */ +.defaultSimpleSkin span.mceIcon, .defaultSimpleSkin img.mceIcon {display:block; width:20px; height:20px} +.defaultSimpleSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px} + +/* Button */ +.defaultSimpleSkin .mceButton {display:block; border:1px solid #F0F0EE; width:20px; height:20px} +.defaultSimpleSkin a.mceButtonEnabled:hover {border:1px solid #0A246A; background-color:#B2BBD0} +.defaultSimpleSkin a.mceButtonActive {border:1px solid #0A246A; background-color:#C2CBE0} +.defaultSimpleSkin .mceButtonDisabled span {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} + +/* Separator */ +.defaultSimpleSkin .mceSeparator {display:block; background:url(../../img/icons.gif) -180px 0; width:2px; height:20px; margin:0 2px 0 4px} + +/* Theme */ +.defaultSimpleSkin span.mce_bold {background-position:0 0} +.defaultSimpleSkin span.mce_italic {background-position:-60px 0} +.defaultSimpleSkin span.mce_underline {background-position:-140px 0} +.defaultSimpleSkin span.mce_strikethrough {background-position:-120px 0} +.defaultSimpleSkin span.mce_undo {background-position:-160px 0} +.defaultSimpleSkin span.mce_redo {background-position:-100px 0} +.defaultSimpleSkin span.mce_cleanup {background-position:-40px 0} +.defaultSimpleSkin span.mce_insertunorderedlist {background-position:-20px 0} +.defaultSimpleSkin span.mce_insertorderedlist {background-position:-80px 0} diff --git a/plugins/TinyMCE/js/themes/simple/skins/o2k7/content.css b/plugins/TinyMCE/js/themes/simple/skins/o2k7/content.css new file mode 100644 index 0000000000..595809fa61 --- /dev/null +++ b/plugins/TinyMCE/js/themes/simple/skins/o2k7/content.css @@ -0,0 +1,17 @@ +body, td, pre {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} + +body {background: #FFF;} +.mceVisualAid {border: 1px dashed #BBB;} + +/* IE */ + +* html body { +scrollbar-3dlight-color: #F0F0EE; +scrollbar-arrow-color: #676662; +scrollbar-base-color: #F0F0EE; +scrollbar-darkshadow-color: #DDDDDD; +scrollbar-face-color: #E0E0DD; +scrollbar-highlight-color: #F0F0EE; +scrollbar-shadow-color: #F0F0EE; +scrollbar-track-color: #F5F5F5; +} diff --git a/plugins/TinyMCE/js/themes/simple/skins/o2k7/img/button_bg.png b/plugins/TinyMCE/js/themes/simple/skins/o2k7/img/button_bg.png new file mode 100644 index 0000000000..527e3495a6 Binary files /dev/null and b/plugins/TinyMCE/js/themes/simple/skins/o2k7/img/button_bg.png differ diff --git a/plugins/TinyMCE/js/themes/simple/skins/o2k7/ui.css b/plugins/TinyMCE/js/themes/simple/skins/o2k7/ui.css new file mode 100644 index 0000000000..cf6c35d109 --- /dev/null +++ b/plugins/TinyMCE/js/themes/simple/skins/o2k7/ui.css @@ -0,0 +1,35 @@ +/* Reset */ +.o2k7SimpleSkin table, .o2k7SimpleSkin tbody, .o2k7SimpleSkin a, .o2k7SimpleSkin img, .o2k7SimpleSkin tr, .o2k7SimpleSkin div, .o2k7SimpleSkin td, .o2k7SimpleSkin iframe, .o2k7SimpleSkin span, .o2k7SimpleSkin * {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000} + +/* Containers */ +.o2k7SimpleSkin {position:relative} +.o2k7SimpleSkin table.mceLayout {background:#E5EFFD; border:1px solid #ABC6DD;} +.o2k7SimpleSkin iframe {display:block; background:#FFF; border-bottom:1px solid #ABC6DD;} +.o2k7SimpleSkin .mceToolbar {height:26px;} + +/* Layout */ +.o2k7SimpleSkin .mceToolbar .mceToolbarStart span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px; } +.o2k7SimpleSkin .mceToolbar .mceToolbarEnd span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px} +.o2k7SimpleSkin span.mceIcon, .o2k7SimpleSkin img.mceIcon {display:block; width:20px; height:20px} +.o2k7SimpleSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px} + +/* Button */ +.o2k7SimpleSkin .mceButton {display:block; background:url(img/button_bg.png); width:22px; height:22px} +.o2k7SimpleSkin a.mceButton span, .o2k7SimpleSkin a.mceButton img {margin:1px 0 0 1px} +.o2k7SimpleSkin a.mceButtonEnabled:hover {background-color:#B2BBD0; background-position:0 -22px} +.o2k7SimpleSkin a.mceButtonActive {background-position:0 -44px} +.o2k7SimpleSkin .mceButtonDisabled span {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} + +/* Separator */ +.o2k7SimpleSkin .mceSeparator {display:block; background:url(img/button_bg.png) -22px 0; width:5px; height:22px} + +/* Theme */ +.o2k7SimpleSkin span.mce_bold {background-position:0 0} +.o2k7SimpleSkin span.mce_italic {background-position:-60px 0} +.o2k7SimpleSkin span.mce_underline {background-position:-140px 0} +.o2k7SimpleSkin span.mce_strikethrough {background-position:-120px 0} +.o2k7SimpleSkin span.mce_undo {background-position:-160px 0} +.o2k7SimpleSkin span.mce_redo {background-position:-100px 0} +.o2k7SimpleSkin span.mce_cleanup {background-position:-40px 0} +.o2k7SimpleSkin span.mce_insertunorderedlist {background-position:-20px 0} +.o2k7SimpleSkin span.mce_insertorderedlist {background-position:-80px 0} diff --git a/plugins/TinyMCE/js/tiny_mce.js b/plugins/TinyMCE/js/tiny_mce.js new file mode 100644 index 0000000000..782f7f40ba --- /dev/null +++ b/plugins/TinyMCE/js/tiny_mce.js @@ -0,0 +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()+""}else{e+=""+j.renderHTML()+""}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+=''; + + bi = s.body_id || 'tinymce'; + if (bi.indexOf('=') != -1) { + bi = t.getParam('body_id', '', 'hash'); + bi = bi[t.id] || bi; + } + + bc = s.body_class || ''; + if (bc.indexOf('=') != -1) { + bc = t.getParam('body_class', '', 'hash'); + bc = bc[t.id] || ''; + } + + t.iframeHTML += ''; + + // Domain relaxing enabled, then set document domain + if (tinymce.relaxedDomain) { + // 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();})()'; + } + + // Create iframe + n = DOM.add(o.iframeContainer, 'iframe', { + id : t.id + "_ifr", + src : u || 'javascript:""', // Workaround for HTTPS warning in IE6/7 + frameBorder : '0', + style : { + width : '100%', + height : h + } + }); + + t.contentAreaContainer = o.iframeContainer; + DOM.get(o.editorContainer).style.display = t.orgDisplay; + DOM.get(t.id).style.display = 'none'; + + if (!isIE || !tinymce.relaxedDomain) + t.setupIframe(); + + e = n = o = null; // Cleanup + }, + + setupIframe : function() { + var t = this, s = t.settings, e = DOM.get(t.id), d = t.getDoc(), h, b; + + // Setup iframe body + if (!isIE || !tinymce.relaxedDomain) { + d.open(); + d.write(t.iframeHTML); + d.close(); + } + + // 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 + } + } + + // 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 (!s.readonly) + b.contentEditable = true; + + DOM.show(b); + } + + t.dom = new tinymce.dom.DOMUtils(t.getDoc(), { + keep_values : true, + url_converter : t.convertURL, + url_converter_scope : t, + hex_colors : s.force_hex_style_colors, + class_filter : s.class_filter, + update_styles : 1, + fix_ie_paragraphs : 1, + valid_styles : s.valid_styles + }); + + t.schema = new tinymce.dom.Schema(); + + t.serializer = new tinymce.dom.Serializer(extend(s, { + valid_elements : s.verify_html === false ? '*[*]' : s.valid_elements, + dom : t.dom, + schema : t.schema + })); + + t.selection = new tinymce.dom.Selection(t.dom, t.getWin(), t.serializer); + + t.formatter = new tinymce.Formatter(this); + + // Register default formats + 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'}} + ], + + 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'}} + ], + + alignright : [ + {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'right'}}, + {selector : 'img,table', styles : {'float' : 'right'}} + ], + + alignfull : [ + {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'justify'}} + ], + + bold : [ + {inline : 'strong'}, + {inline : 'span', styles : {fontWeight : 'bold'}}, + {inline : 'b'} + ], + + italic : [ + {inline : 'em'}, + {inline : 'span', styles : {fontStyle : 'italic'}}, + {inline : 'i'} + ], + + underline : [ + {inline : 'span', styles : {textDecoration : 'underline'}, exact : true}, + {inline : 'u'} + ], + + strikethrough : [ + {inline : 'span', styles : {textDecoration : 'line-through'}, exact : true}, + {inline : 'u'} + ], + + forecolor : {inline : 'span', styles : {color : '%value'}}, + hilitecolor : {inline : 'span', styles : {backgroundColor : '%value'}}, + 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'}, + + removeformat : [ + {selector : 'b,strong,em,i,font,u,strike', remove : 'all', split : true, expand : false, block_expand : true, deep : true}, + {selector : 'span', attributes : ['style', 'class'], remove : 'empty', split : true, expand : false, deep : true}, + {selector : '*', attributes : ['style', 'class'], split : false, expand : false, deep : true} + ] + }); + + // Register default block formats + each('p h1 h2 h3 h4 h5 h6 div address pre div code dt dd samp'.split(/\s/), function(name) { + t.formatter.register(name, {block : name, remove : 'all'}); + }); + + // Register user defined formats + t.formatter.register(t.settings.formats); + + t.undoManager = new tinymce.UndoManager(t); + + // Pass through + t.undoManager.onAdd.add(function(um, l) { + if (!l.initial) + return t.onChange.dispatch(t, l, um); + }); + + t.undoManager.onUndo.add(function(um, l) { + return t.onUndo.dispatch(t, l, um); + }); + + t.undoManager.onRedo.add(function(um, l) { + return t.onRedo.dispatch(t, l, um); + }); + + t.forceBlocks = new tinymce.ForceBlocks(t, { + forced_root_block : s.forced_root_block + }); + + t.editorCommands = new tinymce.EditorCommands(t); + + // Pass through + t.serializer.onPreProcess.add(function(se, o) { + return t.onPreProcess.dispatch(t, o, se); + }); + + t.serializer.onPostProcess.add(function(se, o) { + return t.onPostProcess.dispatch(t, o, se); + }); + + t.onPreInit.dispatch(t); + + if (!s.gecko_spellcheck) + t.getBody().spellcheck = 0; + + if (!s.readonly) + t._addEvents(); + + t.controlManager.onPostRender.dispatch(t, t.controlManager); + t.onPostRender.dispatch(t); + + if (s.directionality) + t.getBody().dir = s.directionality; + + 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()); + }); + } + + if (s.save_callback) { + t.onSaveContent.add(function(ed, o) { + var h = t.execCallback('save_callback', t.id, o.content, t.getBody()); + + if (h) + o.content = h; + }); + } + + if (s.onchange_callback) { + t.onChange.add(function(ed, l) { + t.execCallback('onchange_callback', t, l); + }); + } + + if (s.convert_newlines_to_brs) { + t.onBeforeSetContent.add(function(ed, o) { + if (o.initial) + o.content = o.content.replace(/\r?\n/g, '
'); + }); + } + + 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*/, ''); + o.content = o.content.replace(/<\/pre>\s*$/, ''); + + if (o.set) + o.content = '
' + o.content + '
'; + }); + } + + if (s.verify_css_classes) { + t.serializer.attribValueFilter = function(n, v) { + var s, cl; + + if (n == 'class') { + // Build regexp for classes + if (!t.classesRE) { + cl = t.dom.getClasses(); + + if (cl.length > 0) { + s = ''; + + each (cl, function(o) { + s += (s ? '|' : '') + o['class']; + }); + + t.classesRE = new RegExp('(' + s + ')', 'gi'); + } + } + + return !t.classesRE || /(\bmceItem\w+\b|\bmceTemp\w+\b)/g.test(v) || t.classesRE.test(v) ? v : ''; + } + + return v; + }; + } + + if (s.cleanup_callback) { + t.onBeforeSetContent.add(function(ed, o) { + o.content = t.execCallback('cleanup_callback', 'insert_to_editor', o.content, o); + }); + + t.onPreProcess.add(function(ed, o) { + if (o.set) + t.execCallback('cleanup_callback', 'insert_to_editor_dom', o.node, o); + + if (o.get) + t.execCallback('cleanup_callback', 'get_from_editor_dom', o.node, o); + }); + + t.onPostProcess.add(function(ed, o) { + if (o.set) + o.content = t.execCallback('cleanup_callback', 'insert_to_editor', o.content, o); + + if (o.get) + o.content = t.execCallback('cleanup_callback', 'get_from_editor', o.content, o); + }); + } + + if (s.save_callback) { + t.onGetContent.add(function(ed, o) { + if (o.save) + o.content = t.execCallback('save_callback', t.id, o.content, t.getBody()); + }); + } + + if (s.handle_event_callback) { + t.onEvent.add(function(ed, e, o) { + if (t.execCallback('handle_event_callback', e, ed, o) === false) + Event.cancel(e); + }); + } + + // Add visual aids when new contents is added + t.onSetContent.add(function() { + t.addVisual(t.getBody()); + }); + + // Remove empty contents + if (s.padd_empty_editor) { + t.onPostProcess.add(function(ed, o) { + o.content = o.content.replace(/^(]*>( | |\s|\u00a0|)<\/p>[\r\n]*|
[\r\n]*)$/, ''); + }); + } + + if (isGecko) { + // Fix gecko link bug, when a link is placed at the end of block elements there is + // no way to move the caret behind the link. This fix adds a bogus br element after the link + function fixLinks(ed, o) { + each(ed.dom.select('a'), function(n) { + var pn = n.parentNode; + + if (ed.dom.isBlock(pn) && pn.lastChild === n) + ed.dom.add(pn, 'br', {'_mce_bogus' : 1}); + }); + }; + + t.onExecCommand.add(function(ed, cmd) { + if (cmd === 'CreateLink') + fixLinks(ed); + }); + + 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 : (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}); + + // 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); + + ed.selection.select(ed.getBody(), 1); + ed.selection.collapse(1); + ed.getWin().focus(); + }, 100); + } + }, 1); + + e = null; + }, + + + focus : function(sf) { + var oed, t = this, ce = t.settings.content_editable, ieRng, controlElm, doc = t.getDoc(); + + if (!sf) { + // Get selected control element + ieRng = t.selection.getRng(); + if (ieRng.item) { + controlElm = ieRng.item(0); + } + + // Is not content editable + if (!ce) + t.getWin().focus(); + + // Restore selected control element + // This is needed when for example an image is selected within a + // layer a call to focus will then remove the control selection + if (controlElm && controlElm.ownerDocument == doc) { + ieRng = doc.body.createControlRange(); + ieRng.addElement(controlElm); + ieRng.select(); + } + + } + + if (tinymce.activeEditor != t) { + if ((oed = tinymce.activeEditor) != null) + oed.onDeactivate.dispatch(oed, t); + + t.onActivate.dispatch(t, oed); + } + + tinymce._setActive(t); + }, + + execCallback : function(n) { + var t = this, f = t.settings[n], s; + + if (!f) + return; + + // Look through lookup + if (t.callbackLookup && (s = t.callbackLookup[n])) { + f = s.func; + s = s.scope; + } + + if (is(f, 'string')) { + s = f.replace(/\.\w+$/, ''); + s = s ? tinymce.resolve(s) : 0; + f = tinymce.resolve(f); + t.callbackLookup = t.callbackLookup || {}; + t.callbackLookup[n] = {func : f, scope : s}; + } + + return f.apply(s || t, Array.prototype.slice.call(arguments, 1)); + }, + + translate : function(s) { + var c = this.settings.language || 'en', i18n = tinymce.i18n; + + if (!s) + return ''; + + return i18n[c + '.' + s] || s.replace(/{\#([^}]+)\}/g, function(a, b) { + return i18n[c + '.' + b] || '{#' + b + '}'; + }); + }, + + getLang : function(n, dv) { + return tinymce.i18n[(this.settings.language || 'en') + '.' + n] || (is(dv) ? dv : '{#' + n + '}'); + }, + + getParam : function(n, dv, ty) { + var tr = tinymce.trim, v = is(this.settings[n]) ? this.settings[n] : dv, o; + + if (ty === 'hash') { + o = {}; + + if (is(v, 'string')) { + each(v.indexOf('=') > 0 ? v.split(/[;,](?![^=;,]*(?:[;,]|$))/) : v.split(','), function(v) { + v = v.split('='); + + if (v.length > 1) + o[tr(v[0])] = tr(v[1]); + else + o[tr(v[0])] = tr(v); + }); + } else + o = v; + + return o; + } + + return v; + }, + + nodeChanged : function(o) { + var t = this, s = t.selection, n = (isIE ? s.getNode() : s.getStart()) || t.getBody(); + + // Fix for bug #1896577 it seems that this can not be fired while the editor is loading + if (t.initialized) { + o = o || {}; + n = isIE && n.ownerDocument != t.getDoc() ? t.getBody() : n; // Fix for IE initial state + + // Get parents and add them to object + o.parents = []; + t.dom.getParent(n, function(node) { + if (node.nodeName == 'BODY') + return true; + + o.parents.push(node); + }); + + t.onNodeChange.dispatch( + t, + o ? o.controlManager || t.controlManager : t.controlManager, + n, + s.isCollapsed(), + o + ); + } + }, + + addButton : function(n, s) { + var t = this; + + t.buttons = t.buttons || {}; + t.buttons[n] = s; + }, + + addCommand : function(n, f, s) { + this.execCommands[n] = {func : f, scope : s || this}; + }, + + addQueryStateHandler : function(n, f, s) { + this.queryStateCommands[n] = {func : f, scope : s || this}; + }, + + addQueryValueHandler : function(n, f, s) { + this.queryValueCommands[n] = {func : f, scope : s || this}; + }, + + addShortcut : function(pa, desc, cmd_func, sc) { + var t = this, c; + + if (!t.settings.custom_shortcuts) + return false; + + t.shortcuts = t.shortcuts || {}; + + if (is(cmd_func, 'string')) { + c = cmd_func; + + cmd_func = function() { + t.execCommand(c, false, null); + }; + } + + if (is(cmd_func, 'object')) { + c = cmd_func; + + cmd_func = function() { + t.execCommand(c[0], c[1], c[2]); + }; + } + + each(explode(pa), function(pa) { + var o = { + func : cmd_func, + scope : sc || this, + desc : desc, + alt : false, + ctrl : false, + shift : false + }; + + each(explode(pa, '+'), function(v) { + switch (v) { + case 'alt': + case 'ctrl': + case 'shift': + o[v] = true; + break; + + default: + o.charCode = v.charCodeAt(0); + o.keyCode = v.toUpperCase().charCodeAt(0); + } + }); + + t.shortcuts[(o.ctrl ? 'ctrl' : '') + ',' + (o.alt ? 'alt' : '') + ',' + (o.shift ? 'shift' : '') + ',' + o.keyCode] = o; + }); + + return true; + }, + + execCommand : function(cmd, ui, val, a) { + var t = this, s = 0, o, st; + + if (!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(cmd) && (!a || !a.skip_focus)) + t.focus(); + + o = {}; + t.onBeforeExecCommand.dispatch(t, cmd, ui, val, o); + if (o.terminate) + return false; + + // Command callback + if (t.execCallback('execcommand_callback', t.id, t.selection.getNode(), cmd, ui, val)) { + t.onExecCommand.dispatch(t, cmd, ui, val, a); + return true; + } + + // Registred commands + if (o = t.execCommands[cmd]) { + st = o.func.call(o.scope, ui, val); + + // Fall through on true + if (st !== true) { + t.onExecCommand.dispatch(t, cmd, ui, val, a); + return st; + } + } + + // Plugin commands + each(t.plugins, function(p) { + if (p.execCommand && p.execCommand(cmd, ui, val)) { + t.onExecCommand.dispatch(t, cmd, ui, val, a); + s = 1; + return false; + } + }); + + if (s) + return true; + + // Theme commands + if (t.theme && t.theme.execCommand && t.theme.execCommand(cmd, ui, val)) { + t.onExecCommand.dispatch(t, cmd, ui, val, a); + 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); + return true; + } + + // Browser commands + t.getDoc().execCommand(cmd, ui, val); + t.onExecCommand.dispatch(t, cmd, ui, val, a); + }, + + queryCommandState : function(cmd) { + var t = this, o, s; + + // Is hidden then return undefined + if (t._isHidden()) + return; + + // Registred commands + if (o = t.queryStateCommands[cmd]) { + s = o.func.call(o.scope); + + // Fall though on true + if (s !== true) + return s; + } + + // Registred commands + o = t.editorCommands.queryCommandState(cmd); + if (o !== -1) + return o; + + // Browser commands + try { + return this.getDoc().queryCommandState(cmd); + } catch (ex) { + // Fails sometimes see bug: 1896577 + } + }, + + queryCommandValue : function(c) { + var t = this, o, s; + + // Is hidden then return undefined + if (t._isHidden()) + return; + + // Registred commands + if (o = t.queryValueCommands[c]) { + s = o.func.call(o.scope); + + // Fall though on true + if (s !== true) + return s; + } + + // Registred commands + o = t.editorCommands.queryCommandValue(c); + if (is(o)) + return o; + + // Browser commands + try { + return this.getDoc().queryCommandValue(c); + } catch (ex) { + // Fails sometimes see bug: 1896577 + } + }, + + show : function() { + var t = this; + + DOM.show(t.getContainer()); + DOM.hide(t.id); + t.load(); + }, + + hide : function() { + var t = this, d = t.getDoc(); + + // Fixed bug where IE has a blinking cursor left from the editor + if (isIE && d) + d.execCommand('SelectAll'); + + // We must save before we hide so Safari doesn't crash + t.save(); + DOM.hide(t.getContainer()); + DOM.setStyle(t.id, 'display', t.orgDisplay); + }, + + isHidden : function() { + return !DOM.isHidden(this.id); + }, + + setProgressState : function(b, ti, o) { + this.onSetProgressState.dispatch(this, b, ti, o); + + return b; + }, + + load : function(o) { + var t = this, e = t.getElement(), h; + + if (e) { + o = o || {}; + o.load = true; + + // Double encode existing entities in the value + h = t.setContent(is(e.value) ? e.value : e.innerHTML, o); + o.element = e; + + if (!o.no_events) + t.onLoadContent.dispatch(t, o); + + o.element = e = null; + + return h; + } + }, + + save : function(o) { + var t = this, e = t.getElement(), h, f; + + if (!e || !t.initialized) + return; + + o = o || {}; + o.save = true; + + // Add undo level will trigger onchange event + if (!o.no_events) { + t.undoManager.typing = 0; + t.undoManager.add(); + } + + o.element = e; + h = o.content = t.getContent(o); + + if (!o.no_events) + t.onSaveContent.dispatch(t, o); + + h = o.content; + + if (!/TEXTAREA|INPUT/i.test(e.nodeName)) { + e.innerHTML = h; + + // Update hidden form element + if (f = DOM.getParent(t.id, 'form')) { + each(f.elements, function(e) { + if (e.name == t.id) { + e.value = h; + return false; + } + }); + } + } else + e.value = h; + + o.element = e = null; + + return h; + }, + + setContent : function(h, o) { + var t = this; + + o = o || {}; + o.format = o.format || 'html'; + o.set = true; + o.content = h; + + if (!o.no_events) + t.onBeforeSetContent.dispatch(t, o); + + // 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'; + } + + 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)); + } + + if (!o.no_events) + t.onSetContent.dispatch(t, o); + + return o.content; + }, + + getContent : function(o) { + var t = this, h; + + o = o || {}; + o.format = o.format || 'html'; + o.get = true; + + if (!o.no_events) + t.onBeforeGetContent.dispatch(t, o); + + if (o.format != 'raw' && t.settings.cleanup) { + o.getInner = true; + h = t.serializer.serialize(t.getBody(), o); + } else + h = t.getBody().innerHTML; + + h = h.replace(/^\s*|\s*$/g, ''); + o.content = h; + + if (!o.no_events) + t.onGetContent.dispatch(t, o); + + return o.content; + }, + + isDirty : function() { + var t = this; + + return tinymce.trim(t.startContent) != tinymce.trim(t.getContent({format : 'raw', no_events : 1})) && !t.isNotDirty; + }, + + getContainer : function() { + var t = this; + + if (!t.container) + t.container = DOM.get(t.editorContainer || t.id + '_parent'); + + return t.container; + }, + + getContentAreaContainer : function() { + return this.contentAreaContainer; + }, + + getElement : function() { + return DOM.get(this.settings.content_element || this.id); + }, + + getWin : function() { + var t = this, e; + + if (!t.contentWindow) { + e = DOM.get(t.id + "_ifr"); + + if (e) + t.contentWindow = e.contentWindow; + } + + return t.contentWindow; + }, + + getDoc : function() { + var t = this, w; + + if (!t.contentDocument) { + w = t.getWin(); + + if (w) + t.contentDocument = w.document; + } + + return t.contentDocument; + }, + + getBody : function() { + return this.bodyElement || this.getDoc().body; + }, + + convertURL : function(u, n, e) { + var t = this, s = t.settings; + + // Use callback instead + if (s.urlconverter_callback) + return t.execCallback('urlconverter_callback', u, e, true, n); + + // Don't convert link href since thats the CSS files that gets loaded into the editor also skip local file URLs + if (!s.convert_urls || (e && e.nodeName == 'LINK') || u.indexOf('file:') === 0) + return u; + + // Convert to relative + if (s.relative_urls) + return t.documentBaseURI.toRelative(u); + + // Convert to absolute + u = t.documentBaseURI.toAbsolute(u, s.remove_script_host); + + return u; + }, + + addVisual : function(e) { + var t = this, s = t.settings; + + e = e || t.getBody(); + + if (!is(t.hasVisual)) + t.hasVisual = s.visual; + + each(t.dom.select('table,a', e), function(e) { + var v; + + switch (e.nodeName) { + case 'TABLE': + v = t.dom.getAttrib(e, 'border'); + + if (!v || v == '0') { + if (t.hasVisual) + t.dom.addClass(e, s.visual_table_class); + else + t.dom.removeClass(e, s.visual_table_class); + } + + return; + + case 'A': + v = t.dom.getAttrib(e, 'name'); + + if (v) { + if (t.hasVisual) + t.dom.addClass(e, 'mceItemAnchor'); + else + t.dom.removeClass(e, 'mceItemAnchor'); + } + + return; + } + }); + + t.onVisualAid.dispatch(t, e, t.hasVisual); + }, + + remove : function() { + var t = this, e = t.getContainer(); + + t.removed = 1; // Cancels post remove event execution + t.hide(); + + t.execCallback('remove_instance_callback', t); + t.onRemove.dispatch(t); + + // Clear all execCommand listeners this is required to avoid errors if the editor was removed inside another command + t.onExecCommand.listeners = []; + + tinymce.remove(t); + DOM.remove(e); + }, + + destroy : function(s) { + var t = this; + + // One time is enough + if (t.destroyed) + return; + + if (!s) { + tinymce.removeUnload(t.destroy); + tinyMCE.onBeforeUnload.remove(t._beforeUnload); + + // Manual destroy + if (t.theme && t.theme.destroy) + t.theme.destroy(); + + // Destroy controls, selection and dom + t.controlManager.destroy(); + t.selection.destroy(); + t.dom.destroy(); + + // Remove all events + + // Don't clear the window or document if content editable + // is enabled since other instances might still be present + if (!t.settings.content_editable) { + Event.clear(t.getWin()); + Event.clear(t.getDoc()); + } + + Event.clear(t.getBody()); + Event.clear(t.formElement); + } + + if (t.formElement) { + t.formElement.submit = t.formElement._mceOldSubmit; + t.formElement._mceOldSubmit = null; + } + + t.contentAreaContainer = t.formElement = t.container = t.settings.content_element = t.bodyElement = t.contentDocument = t.contentWindow = null; + + if (t.selection) + t.selection = t.selection.win = t.selection.dom = t.selection.dom.doc = null; + + t.destroyed = 1; + }, + + // Internal functions + + _addEvents : function() { + // 'focus', 'blur', 'dblclick', 'beforedeactivate', submit, reset + var t = this, i, s = t.settings, lo = { + mouseup : 'onMouseUp', + mousedown : 'onMouseDown', + click : 'onClick', + keyup : 'onKeyUp', + keydown : 'onKeyDown', + keypress : 'onKeyPress', + submit : 'onSubmit', + reset : 'onReset', + contextmenu : 'onContextMenu', + dblclick : 'onDblClick', + paste : 'onPaste' // Doesn't work in all browsers yet + }; + + function eventHandler(e, o) { + var ty = e.type; + + // Don't fire events when it's removed + if (t.removed) + return; + + // Generic event handler + if (t.onEvent.dispatch(t, e, o) !== false) { + // Specific event handler + t[lo[e.fakeType || e.type]].dispatch(t, e, o); + } + }; + + // Add DOM events + 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); + break; + + case 'paste': + t.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); + break; + + default: + t.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) { + t.focus(true); + }); + + + // 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) { + var v; + + e = e.target; + + if (e.nodeType === 1 && e.nodeName === 'IMG' && (v = e.getAttribute('_mce_src'))) + e.src = t.documentBaseURI.toAbsolute(v); + }); + } + + // Set various midas options in Gecko + if (isGecko) { + function setOpts() { + var t = this, d = t.getDoc(), s = t.settings; + + if (isGecko && !s.readonly) { + if (t._isHidden()) { + try { + if (!s.content_editable) + d.designMode = 'On'; + } catch (ex) { + // Fails if it's hidden + } + } + + try { + // Try new Gecko method + d.execCommand("styleWithCSS", 0, false); + } catch (ex) { + // Use old method + if (!t._isHidden()) + try {d.execCommand("useCSS", 0, true);} catch (ex) {} + } + + if (!s.table_inline_editing) + try {d.execCommand('enableInlineTableEditing', false, false);} catch (ex) {} + + if (!s.object_resizing) + try {d.execCommand('enableObjectResizing', false, false);} catch (ex) {} + } + }; + + t.onBeforeExecCommand.add(setOpts); + 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; + + // 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); + }); + } + + // Add node change handlers + t.onMouseUp.add(t.nodeChanged); + //t.onClick.add(t.nodeChanged); + t.onKeyUp.add(function(ed, e) { + var c = e.keyCode; + + if ((c >= 33 && c <= 36) || (c >= 37 && c <= 40) || c == 13 || c == 45 || c == 46 || c == 8 || (tinymce.isMac && (c == 91 || c == 93)) || e.ctrlKey) + t.nodeChanged(); + }); + + // Add reset handler + t.onReset.add(function() { + t.setContent(t.startContent, {format : 'raw'}); + }); + + // Add shortcuts + if (s.custom_shortcuts) { + if (s.custom_undo_redo_keyboard_shortcuts) { + t.addShortcut('ctrl+z', t.getLang('undo_desc'), 'Undo'); + t.addShortcut('ctrl+y', t.getLang('redo_desc'), 'Redo'); + } + + // Add default shortcuts for gecko + t.addShortcut('ctrl+b', t.getLang('bold_desc'), 'Bold'); + t.addShortcut('ctrl+i', t.getLang('italic_desc'), 'Italic'); + t.addShortcut('ctrl+u', t.getLang('underline_desc'), 'Underline'); + + // BlockFormat shortcuts keys + for (i=1; i<=6; i++) + t.addShortcut('ctrl+' + i, '', ['FormatBlock', false, 'h' + i]); + + t.addShortcut('ctrl+7', '', ['FormatBlock', false, '

']); + t.addShortcut('ctrl+8', '', ['FormatBlock', false, '

']); + t.addShortcut('ctrl+9', '', ['FormatBlock', false, '
']); + + function find(e) { + var v = null; + + if (!e.altKey && !e.ctrlKey && !e.metaKey) + return v; + + each(t.shortcuts, function(o) { + if (tinymce.isMac && o.ctrl != e.metaKey) + return; + else if (!tinymce.isMac && o.ctrl != e.ctrlKey) + return; + + if (o.alt != e.altKey) + return; + + if (o.shift != e.shiftKey) + return; + + if (e.keyCode == o.keyCode || (e.charCode && e.charCode == o.charCode)) { + v = o; + return false; + } + }); + + return v; + }; + + t.onKeyUp.add(function(ed, e) { + var o = find(e); + + if (o) + return Event.cancel(e); + }); + + t.onKeyPress.add(function(ed, e) { + var o = find(e); + + if (o) + return Event.cancel(e); + }); + + t.onKeyDown.add(function(ed, e) { + var o = find(e); + + if (o) { + o.func.call(o.scope); + return Event.cancel(e); + } + }); + } + + 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) { + var re = t.resizeInfo, cb; + + e = e.target; + + // Don't do this action for non image elements + if (e.nodeName !== 'IMG') + return; + + if (re) + t.dom.unbind(re.node, re.ev, re.cb); + + if (!t.dom.hasClass(e, 'mceItemNoResize')) { + ev = 'resizeend'; + cb = t.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 = t.dom.getStyle(e, 'height')) { + t.dom.setAttrib(e, 'height', v.replace(/[^0-9%]+/g, '')); + t.dom.setStyle(e, 'height', ''); + } + }); + } else { + ev = 'resizestart'; + cb = t.dom.bind(e, 'resizestart', Event.cancel, Event); + } + + re = t.resizeInfo = { + node : e, + ev : ev, + 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) { + t.onClick.add(function(ed, e) { + Event.prevent(e); + }); + } + + // Add custom undo/redo handlers + if (s.custom_undo_redo) { + function addUndo() { + t.undoManager.typing = 0; + t.undoManager.add(); + }; + + t.dom.bind(t.getDoc(), 'focusout', function(e) { + if (!t.removed && t.undoManager.typing) + 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) + addUndo(); + }); + + t.onKeyDown.add(function(ed, e) { + var rng, parent, bookmark; + + // 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 (rng.parentElement) { + parent = rng.parentElement(); + + // 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; + } + } + + // Is caracter positon keys + if ((e.keyCode >= 33 && e.keyCode <= 36) || (e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 13 || e.keyCode == 45) { + if (t.undoManager.typing) + addUndo(); + + return; + } + + if (!t.undoManager.typing) { + t.undoManager.add(); + t.undoManager.typing = 1; + } + }); + + t.onMouseDown.add(function() { + if (t.undoManager.typing) + addUndo(); + }); + } + }, + + _isHidden : function() { + var s; + + if (!isGecko) + return 0; + + // 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); + +(function(tinymce) { + // Added for compression purposes + var each = tinymce.each, undefined, TRUE = true, FALSE = false; + + tinymce.EditorCommands = function(editor) { + var dom = editor.dom, + selection = editor.selection, + commands = {state: {}, exec : {}, value : {}}, + settings = editor.settings, + bookmark; + + function execCommand(command, ui, value) { + var func; + + command = command.toLowerCase(); + if (func = commands.exec[command]) { + func(command, ui, value); + return TRUE; + } + + return FALSE; + }; + + function queryCommandState(command) { + var func; + + command = command.toLowerCase(); + if (func = commands.state[command]) + return func(command); + + return -1; + }; + + function queryCommandValue(command) { + var func; + + command = command.toLowerCase(); + if (func = commands.value[command]) + return func(command); + + return FALSE; + }; + + function addCommands(command_list, type) { + type = type || 'exec'; + + each(command_list, function(callback, command) { + each(command.toLowerCase().split(','), function(command) { + commands[type][command] = callback; + }); + }); + }; + + // Expose public methods + tinymce.extend(this, { + execCommand : execCommand, + queryCommandState : queryCommandState, + queryCommandValue : queryCommandValue, + addCommands : addCommands + }); + + // Private methods + + function execNativeCommand(command, ui, value) { + if (ui === undefined) + ui = FALSE; + + if (value === undefined) + value = null; + + return editor.getDoc().execCommand(command, ui, value); + }; + + function isFormatMatch(name) { + return editor.formatter.match(name); + }; + + function toggleFormat(name, value) { + editor.formatter.toggle(name, value ? {value : value} : undefined); + }; + + function storeSelection(type) { + bookmark = selection.getBookmark(type); + }; + + function restoreSelection() { + selection.moveToBookmark(bookmark); + }; + + // Add execCommand overrides + addCommands({ + // Ignore these, added for compatibility + 'mceResetDesignMode,mceBeginUndoLevel' : function() {}, + + // Add undo manager logic + 'mceEndUndoLevel,mceAddUndoLevel' : function() { + editor.undoManager.add(); + }, + + 'Cut,Copy,Paste' : function(command) { + var doc = editor.getDoc(), failed; + + // Try executing the native command + try { + execNativeCommand(command); + } catch (ex) { + // Command failed + failed = TRUE; + } + + // Present alert message about clipboard access not being available + if (failed || !doc.queryCommandSupported(command)) { + if (tinymce.isGecko) { + editor.windowManager.confirm(editor.getLang('clipboard_msg'), function(state) { + if (state) + open('http://www.mozilla.org/editor/midasdemo/securityprefs.html', '_blank'); + }); + } else + editor.windowManager.alert(editor.getLang('clipboard_no_support')); + } + }, + + // Override unlink command + unlink : function(command) { + if (selection.isCollapsed()) + selection.select(selection.getNode()); + + execNativeCommand(command); + selection.collapse(FALSE); + }, + + // Override justify commands to use the text formatter engine + 'JustifyLeft,JustifyCenter,JustifyRight,JustifyFull' : function(command) { + var align = command.substring(7); + + // Remove all other alignments first + each('left,center,right,full'.split(','), function(name) { + if (align != name) + editor.formatter.remove('align' + name); + }); + + toggleFormat('align' + align); + }, + + // Override list commands to fix WebKit bug + 'InsertUnorderedList,InsertOrderedList' : function(command) { + var listElm, listParent; + + execNativeCommand(command); + + // WebKit produces lists within block elements so we need to split them + // we will replace the native list creation logic to custom logic later on + // TODO: Remove this when the list creation logic is removed + listElm = dom.getParent(selection.getNode(), 'ol,ul'); + if (listElm) { + listParent = listElm.parentNode; + + // If list is within a text block then split that block + if (/^(H[1-6]|P|ADDRESS|PRE)$/.test(listParent.nodeName)) { + storeSelection(); + dom.split(listParent, listElm); + restoreSelection(); + } + } + }, + + // Override commands to use the text formatter engine + 'Bold,Italic,Underline,Strikethrough' : function(command) { + toggleFormat(command); + }, + + // Override commands to use the text formatter engine + 'ForeColor,HiliteColor,FontName' : function(command, ui, value) { + toggleFormat(command, value); + }, + + FontSize : function(command, ui, value) { + var fontClasses, fontSizes; + + // Convert font size 1-7 to styles + if (value >= 1 && value <= 7) { + fontSizes = tinymce.explode(settings.font_size_style_values); + fontClasses = tinymce.explode(settings.font_size_classes); + + if (fontClasses) + value = fontClasses[value - 1] || value; + else + value = fontSizes[value - 1] || value; + } + + toggleFormat(command, value); + }, + + RemoveFormat : function(command) { + editor.formatter.remove(command); + }, + + mceBlockQuote : function(command) { + toggleFormat('blockquote'); + }, + + FormatBlock : function(command, ui, value) { + return toggleFormat(value || 'p'); + }, + + mceCleanup : function() { + var bookmark = selection.getBookmark(); + + editor.setContent(editor.getContent({cleanup : TRUE}), {cleanup : TRUE}); + + selection.moveToBookmark(bookmark); + }, + + mceRemoveNode : function(command, ui, value) { + var node = value || selection.getNode(); + + // Make sure that the body node isn't removed + if (node != editor.getBody()) { + storeSelection(); + editor.dom.remove(node, TRUE); + restoreSelection(); + } + }, + + mceSelectNodeDepth : function(command, ui, value) { + var counter = 0; + + dom.getParent(selection.getNode(), function(node) { + if (node.nodeType == 1 && counter++ == value) { + selection.select(node); + return FALSE; + } + }, editor.getBody()); + }, + + mceSelectNode : function(command, ui, value) { + selection.select(value); + }, + + mceInsertContent : function(command, ui, value) { + selection.setContent(value); + }, + + mceInsertRawHTML : function(command, ui, value) { + selection.setContent('tiny_mce_marker'); + editor.setContent(editor.getContent().replace(/tiny_mce_marker/g, value)); + }, + + mceSetContent : function(command, ui, value) { + editor.setContent(value); + }, + + 'Indent,Outdent' : function(command) { + var intentValue, indentUnit, value; + + // Setup indent level + intentValue = settings.indentation; + indentUnit = /[a-z%]+$/i.exec(intentValue); + intentValue = parseInt(intentValue); + + if (!queryCommandState('InsertUnorderedList') && !queryCommandState('InsertOrderedList')) { + each(selection.getSelectedBlocks(), function(element) { + if (command == 'outdent') { + value = Math.max(0, parseInt(element.style.paddingLeft || 0) - intentValue); + dom.setStyle(element, 'paddingLeft', value ? value + indentUnit : ''); + } else + dom.setStyle(element, 'paddingLeft', (parseInt(element.style.paddingLeft || 0) + intentValue) + indentUnit); + }); + } else + execNativeCommand(command); + }, + + mceRepaint : function() { + var bookmark; + + if (tinymce.isGecko) { + try { + storeSelection(TRUE); + + if (selection.getSel()) + selection.getSel().selectAllChildren(editor.getBody()); + + selection.collapse(TRUE); + restoreSelection(); + } catch (ex) { + // Ignore + } + } + }, + + mceToggleFormat : function(command, ui, value) { + editor.formatter.toggle(value); + }, + + InsertHorizontalRule : function() { + selection.setContent('
'); + }, + + mceToggleVisualAid : function() { + editor.hasVisual = !editor.hasVisual; + editor.addVisual(); + }, + + mceReplaceContent : function(command, ui, value) { + selection.setContent(value.replace(/\{\$selection\}/g, selection.getContent({format : 'text'}))); + }, + + mceInsertLink : function(command, ui, value) { + var link = dom.getParent(selection.getNode(), 'a'); + + if (tinymce.is(value, 'string')) + value = {href : value}; + + if (!link) { + execNativeCommand('CreateLink', FALSE, 'javascript:mctmp(0);'); + each(dom.select('a[href=javascript:mctmp(0);]'), function(link) { + dom.setAttribs(link, value); + }); + } else { + if (value.href) + dom.setAttribs(link, value); + else + editor.dom.remove(link, TRUE); + } + }, + + selectAll : function() { + var root = dom.getRoot(), rng = dom.createRng(); + + rng.setStart(root, 0); + rng.setEnd(root, root.childNodes.length); + + editor.selection.setRng(rng); + } + }); + + // Add queryCommandState overrides + addCommands({ + // Override justify commands + 'JustifyLeft,JustifyCenter,JustifyRight,JustifyFull' : function(command) { + return isFormatMatch('align' + command.substring(7)); + }, + + 'Bold,Italic,Underline,Strikethrough' : function(command) { + return isFormatMatch(command); + }, + + mceBlockQuote : function() { + return isFormatMatch('blockquote'); + }, + + Outdent : function() { + var node; + + if (settings.inline_styles) { + if ((node = dom.getParent(selection.getStart(), dom.isBlock)) && parseInt(node.style.paddingLeft) > 0) + return TRUE; + + if ((node = dom.getParent(selection.getEnd(), dom.isBlock)) && parseInt(node.style.paddingLeft) > 0) + return TRUE; + } + + return queryCommandState('InsertUnorderedList') || queryCommandState('InsertOrderedList') || (!settings.inline_styles && !!dom.getParent(selection.getNode(), 'BLOCKQUOTE')); + }, + + 'InsertUnorderedList,InsertOrderedList' : function(command) { + return dom.getParent(selection.getNode(), command == 'insertunorderedlist' ? 'UL' : 'OL'); + } + }, 'state'); + + // Add queryCommandValue overrides + addCommands({ + 'FontSize,FontName' : function(command) { + var value = 0, parent; + + if (parent = dom.getParent(selection.getNode(), 'span')) { + if (command == 'fontsize') + value = parent.style.fontSize; + else + value = parent.style.fontFamily.replace(/, /g, ',').replace(/[\'\"]/g, '').toLowerCase(); + } + + return value; + } + }, 'value'); + + // Add undo manager logic + if (settings.custom_undo_redo) { + addCommands({ + Undo : function() { + editor.undoManager.undo(); + }, + + Redo : function() { + editor.undoManager.redo(); + } + }); + } + }; +})(tinymce); +(function(tinymce) { + var Dispatcher = tinymce.util.Dispatcher; + + tinymce.UndoManager = function(editor) { + var self, index = 0, data = []; + + function getContent() { + return tinymce.trim(editor.getContent({format : 'raw', no_events : 1})); + }; + + return self = { + typing : 0, + + onAdd : new Dispatcher(self), + onUndo : new Dispatcher(self), + onRedo : new Dispatcher(self), + + add : function(level) { + var i, settings = editor.settings, lastLevel; + + level = level || {}; + level.content = getContent(); + + // Add undo level if needed + lastLevel = data[index]; + if (lastLevel && lastLevel.content == level.content) { + if (index > 0 || data.length == 1) + return null; + } + + // Time to compress + if (settings.custom_undo_redo_levels) { + if (data.length > settings.custom_undo_redo_levels) { + for (i = 0; i < data.length - 1; i++) + data[i] = data[i + 1]; + + data.length--; + index = data.length; + } + } + + // Get a non intrusive normalized bookmark + 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; + } + + data.push(level); + index = data.length - 1; + + self.onAdd.dispatch(self, level); + editor.isNotDirty = 0; + + return level; + }, + + undo : function() { + var level, i; + + if (self.typing) { + self.add(); + self.typing = 0; + } + + if (index > 0) { + level = data[--index]; + + editor.setContent(level.content, {format : 'raw'}); + editor.selection.moveToBookmark(level.bookmark); + + self.onUndo.dispatch(self, level); + } + + return level; + }, + + redo : function() { + var level; + + if (index < data.length - 1) { + level = data[++index]; + + editor.setContent(level.content, {format : 'raw'}); + editor.selection.moveToBookmark(level.bookmark); + + self.onRedo.dispatch(self, level); + } + + return level; + }, + + clear : function() { + data = []; + index = self.typing = 0; + }, + + hasUndo : function() { + return index > 0 || self.typing; + }, + + hasRedo : function() { + return index < data.length - 1; + } + }; + }; +})(tinymce); + +(function(tinymce) { + // Shorten names + var Event = tinymce.dom.Event, + isIE = tinymce.isIE, + isGecko = tinymce.isGecko, + isOpera = tinymce.isOpera, + each = tinymce.each, + extend = tinymce.extend, + TRUE = true, + FALSE = false; + + function cloneFormats(node) { + var clone, temp, inner; + + do { + if (/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(node.nodeName)) { + if (clone) { + temp = node.cloneNode(false); + temp.appendChild(clone); + clone = temp; + } else { + clone = inner = node.cloneNode(false); + } + + clone.removeAttribute('id'); + } + } while (node = node.parentNode); + + if (clone) + return {wrapper : clone, inner : inner}; + }; + + // Checks if the selection/caret is at the end of the specified block element + function isAtEnd(rng, par) { + var rng2 = par.ownerDocument.createRange(); + + rng2.setStart(rng.endContainer, rng.endOffset); + rng2.setEndAfter(par); + + // Get number of characters to the right of the cursor if it's zero then we are at the end and need to merge the next block element + 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)) { + listBlock = dom.getParent(li, 'ul,ol'); + + if (!dom.getParent(listBlock.parentNode, 'ul,ol')) { + dom.split(listBlock, li); + block = dom.create('p', 0, '
'); + dom.replace(block, li); + selection.select(block, 1); + } + + return FALSE; + } + + return TRUE; + }; + + tinymce.create('tinymce.ForceBlocks', { + ForceBlocks : function(ed) { + var t = this, s = ed.settings, elm; + + t.editor = ed; + t.dom = ed.dom; + elm = (s.forced_root_block || 'p').toLowerCase(); + 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; + + // Force root blocks when typing and when getting output + if (s.forced_root_block) { + ed.onBeforeExecCommand.add(t.forceRoots, t); + ed.onKeyUp.add(t.forceRoots, t); + ed.onPreProcess.add(t.forceRoots, t); + } + + if (s.force_br_newlines) { + // Force IE to produce BRs on enter + if (isIE) { + ed.onKeyPress.add(function(ed, e) { + var n; + + if (e.keyCode == 13 && selection.getNode().nodeName != 'LI') { + selection.setContent('
', {format : 'raw'}); + n = dom.get('__'); + n.removeAttribute('id'); + selection.select(n); + selection.collapse(); + return Event.cancel(e); + } + }); + } + } + + if (s.force_p_newlines) { + if (!isIE) { + ed.onKeyPress.add(function(ed, e) { + if (e.keyCode == 13 && !e.shiftKey && !t.insertPara(e)) + Event.cancel(e); + }); + } else { + // Ungly hack to for IE to preserve the formatting when you press + // enter at the end of a block element with formatted contents + // This logic overrides the browsers default logic with + // custom logic that enables us to control the output + tinymce.addUnload(function() { + t._previousFormats = 0; // Fix IE leak + }); + + ed.onKeyPress.add(function(ed, e) { + t._previousFormats = 0; + + // Clone the current formats, this will later be applied to the new block contents + if (e.keyCode == 13 && !e.shiftKey && ed.selection.isCollapsed() && s.keep_styles) + t._previousFormats = cloneFormats(ed.selection.getStart()); + }); + + ed.onKeyUp.add(function(ed, e) { + // Let IE break the element and the wrap the new caret location in the previous formats + if (e.keyCode == 13 && !e.shiftKey) { + var parent = ed.selection.getStart(), fmt = t._previousFormats; + + // Parent is an empty block + if (!parent.hasChildNodes()) { + parent = dom.getParent(parent, dom.isBlock); + + if (parent) { + parent.innerHTML = ''; + + if (t._previousFormats) { + parent.appendChild(fmt.wrapper); + fmt.inner.innerHTML = '\uFEFF'; + } else + parent.innerHTML = '\uFEFF'; + + selection.select(parent, 1); + ed.getDoc().execCommand('Delete', false, null); + } + } + } + }); + } + + if (isGecko) { + ed.onKeyDown.add(function(ed, e) { + if ((e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) + t.backspaceDelete(e, e.keyCode == 8); + }); + } + } + + // Workaround for missing shift+enter support, http://bugs.webkit.org/show_bug.cgi?id=16973 + if (tinymce.isWebKit) { + function insertBr(ed) { + var rng = selection.getRng(), br, div = dom.create('div', null, ' '), divYPos, vpHeight = dom.getViewPort(ed.getWin()).h; + + // Insert BR element + rng.insertNode(br = dom.create('br')); + + // Place caret after BR + rng.setStartAfter(br); + rng.setEndAfter(br); + selection.setRng(rng); + + // Could not place caret after BR then insert an nbsp entity and move the caret + if (selection.getSel().focusNode == br.previousSibling) { + selection.select(dom.insertAfter(dom.doc.createTextNode('\u00a0'), br)); + selection.collapse(TRUE); + } + + // Create a temporary DIV after the BR and get the position as it + // seems like getPos() returns 0 for text nodes and BR elements. + dom.insertAfter(div, br); + divYPos = dom.getPos(div).y; + dom.remove(div); + + // Scroll to new position, scrollIntoView can't be used due to bug: http://bugs.webkit.org/show_bug.cgi?id=16117 + if (divYPos > vpHeight) // It is not necessary to scroll if the DIV is inside the view port. + ed.getWin().scrollTo(0, divYPos); + }; + + ed.onKeyPress.add(function(ed, e) { + if (e.keyCode == 13 && (e.shiftKey || (s.force_br_newlines && !dom.getParent(selection.getNode(), 'h1,h2,h3,h4,h5,h6,ol,ul')))) { + insertBr(ed); + Event.cancel(e); + } + }); + } + + // 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 + if (s.element != 'P') { + ed.onKeyPress.add(function(ed, e) { + t.lastElm = selection.getNode().nodeName; + }); + + ed.onKeyUp.add(function(ed, e) { + var bl, n = selection.getNode(), b = ed.getBody(); + + if (b.childNodes.length === 1 && n.nodeName == 'P') { + n = dom.rename(n, s.element); + selection.select(n); + selection.collapse(); + ed.nodeChanged(); + } else if (e.keyCode == 13 && !e.shiftKey && t.lastElm != 'P') { + bl = dom.getParent(n, 'p'); + + if (bl) { + dom.rename(bl, s.element); + ed.nodeChanged(); + } + } + }); + } + } + }, + + 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; + + return d.getParent(n, d.isBlock); + }, + + insertPara : function(e) { + 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; + + // 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) +// return TRUE; + + // Setup before range + rb = d.createRange(); + + // If is before the first block element and in body, then move it into first block element + rb.setStart(s.anchorNode, s.anchorOffset); + rb.collapse(TRUE); + + // Setup after range + ra = d.createRange(); + + // If is before the first block element and in body, then move it into first block element + ra.setStart(s.focusNode, s.focusOffset); + ra.collapse(TRUE); + + // Setup start/end points + dir = rb.compareBoundaryPoints(rb.START_TO_END, ra) < 0; + sn = dir ? s.anchorNode : s.focusNode; + so = dir ? s.anchorOffset : s.focusOffset; + en = dir ? s.focusNode : s.anchorNode; + eo = dir ? s.focusOffset : s.anchorOffset; + + // If selection is in empty table cell + if (sn === en && /^(TD|TH)$/.test(sn.nodeName)) { + if (sn.firstChild.nodeName == 'BR') + dom.remove(sn.firstChild); // Remove BR + + // Create two new block elements + if (sn.childNodes.length == 0) { + ed.dom.add(sn, se.element, null, '
'); + aft = ed.dom.add(sn, se.element, null, '
'); + } else { + n = sn.innerHTML; + sn.innerHTML = ''; + ed.dom.add(sn, se.element, null, n); + aft = ed.dom.add(sn, se.element, null, '
'); + } + + // Move caret into the last one + r = d.createRange(); + r.selectNodeContents(aft); + r.collapse(1); + ed.selection.setRng(r); + + return FALSE; + } + + // If the caret is in an invalid location in FF we need to move it into the first block + if (sn == b && en == b && b.firstChild && ed.dom.isBlock(b.firstChild)) { + sn = en = sn.firstChild; + so = eo = 0; + rb = d.createRange(); + rb.setStart(sn, 0); + ra = d.createRange(); + ra.setStart(en, 0); + } + + // Never use body as start or end node + sn = sn.nodeName == "HTML" ? d.body : sn; // Fix for Opera bug: https://bugs.opera.com/show_bug.cgi?id=273224&comments=yes + sn = sn.nodeName == "BODY" ? sn.firstChild : sn; + en = en.nodeName == "HTML" ? d.body : en; // Fix for Opera bug: https://bugs.opera.com/show_bug.cgi?id=273224&comments=yes + en = en.nodeName == "BODY" ? en.firstChild : en; + + // Get start and end blocks + sb = t.getParentBlock(sn); + eb = t.getParentBlock(en); + bn = sb ? sb.nodeName : se.element; // Get block name to create + + // Return inside list use default browser behavior + if (n = t.dom.getParent(sb, 'li,pre')) { + if (n.nodeName == 'LI') + return splitList(ed.selection, t.dom, n); + + return TRUE; + } + + // If caption or absolute layers then always generate new blocks within + if (sb && (sb.nodeName == 'CAPTION' || /absolute|relative|fixed/gi.test(dom.getStyle(sb, 'position', 1)))) { + bn = se.element; + sb = null; + } + + // If caption or absolute layers then always generate new blocks within + if (eb && (eb.nodeName == 'CAPTION' || /absolute|relative|fixed/gi.test(dom.getStyle(sb, 'position', 1)))) { + bn = se.element; + eb = null; + } + + // Use P instead + if (/(TD|TABLE|TH|CAPTION)/.test(bn) || (sb && bn == "DIV" && /left|right/gi.test(dom.getStyle(sb, 'float', 1)))) { + bn = se.element; + sb = eb = null; + } + + // Setup new before and after blocks + bef = (sb && sb.nodeName == bn) ? sb.cloneNode(0) : ed.dom.create(bn); + aft = (eb && eb.nodeName == bn) ? eb.cloneNode(0) : ed.dom.create(bn); + + // Remove id from after clone + aft.removeAttribute('id'); + + // Is header and cursor is at the end, then force paragraph under + if (/^(H[1-6])$/.test(bn) && isAtEnd(r, sb)) + aft = ed.dom.create(se.element); + + // Find start chop node + n = sc = sn; + do { + if (n == b || n.nodeType == 9 || t.dom.isBlock(n) || /(TD|TABLE|TH|CAPTION)/.test(n.nodeName)) + break; + + sc = n; + } while ((n = n.previousSibling ? n.previousSibling : n.parentNode)); + + // Find end chop node + n = ec = en; + do { + if (n == b || n.nodeType == 9 || t.dom.isBlock(n) || /(TD|TABLE|TH|CAPTION)/.test(n.nodeName)) + break; + + ec = n; + } while ((n = n.nextSibling ? n.nextSibling : n.parentNode)); + + // Place first chop part into before block element + if (sc.nodeName == bn) + rb.setStart(sc, 0); + else + rb.setStartBefore(sc); + + rb.setEnd(sn, so); + bef.appendChild(rb.cloneContents() || d.createTextNode('')); // Empty text node needed for Safari + + // Place secnd chop part within new block element + try { + ra.setEndAfter(ec); + } catch(ex) { + //console.debug(s.focusNode, s.focusOffset); + } + + ra.setStart(en, eo); + aft.appendChild(ra.cloneContents() || d.createTextNode('')); // Empty text node needed for Safari + + // Create range around everything + r = d.createRange(); + if (!sc.previousSibling && sc.parentNode.nodeName == bn) { + r.setStartBefore(sc.parentNode); + } else { + if (rb.startContainer.nodeName == bn && rb.startOffset == 0) + r.setStartBefore(rb.startContainer); + else + r.setStart(rb.startContainer, rb.startOffset); + } + + if (!ec.nextSibling && ec.parentNode.nodeName == bn) + r.setEndAfter(ec.parentNode); + else + r.setEnd(ra.endContainer, ra.endOffset); + + // Delete and replace it with new block elements + r.deleteContents(); + + if (isOpera) + ed.getWin().scrollTo(0, vp.y); + + // Never wrap blocks in blocks + if (bef.firstChild && bef.firstChild.nodeName == bn) + bef.innerHTML = bef.firstChild.innerHTML; + + 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; + + e.innerHTML = ''; + + // Make clones of style elements + if (se.keep_styles) { + n = en; + do { + // We only want style specific elements + if (/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(n.nodeName)) { + nn = n.cloneNode(FALSE); + dom.setAttrib(nn, 'id', ''); // Remove ID since it needs to be unique + nl.push(nn); + } + } while (n = n.parentNode); + } + + // Append style elements to aft + if (nl.length > 0) { + for (i = nl.length - 1, nn = e; i >= 0; i--) + 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 + return nl[0]; // Move caret to most inner element + } else + e.innerHTML = isOpera ? ' ' : '
'; // Extra space for Opera so that the caret can move there + }; + + // Fill empty afterblook with current style + if (isEmpty(aft)) + car = appendStyles(aft, en); + + // Opera needs this one backwards for older versions + if (isOpera && parseFloat(opera.version()) < 9.5) { + r.insertNode(bef); + r.insertNode(aft); + } else { + r.insertNode(aft); + r.insertNode(bef); + } + + // Normalize + 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); + + // 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; + + // Is element within viewport + if (y < vp.y || y + ch > 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)); + } + + return FALSE; + }, + + backspaceDelete : function(e, bs) { + var t = this, ed = t.editor, b = ed.getBody(), dom = ed.dom, n, se = ed.selection, r = se.getRng(), sc = r.startContainer, n, w, tn, walker; + + // Delete when caret is behind a element doesn't work correctly on Gecko see #3011651 + if (!bs && r.collapsed && sc.nodeType == 1 && r.startOffset == sc.childNodes.length) { + walker = new tinymce.dom.TreeWalker(sc.lastChild, sc); + + // Walk the dom backwards until we find a text node + for (n = sc.lastChild; n; n = walker.prev()) { + if (n.nodeType == 3) { + r.setStart(n, n.nodeValue.length); + r.collapse(true); + se.setRng(r); + return; + } + } + } + + // The caret sometimes gets stuck in Gecko if you delete empty paragraphs + // This workaround removes the element by hand and moves the caret to the previous element + if (sc && ed.dom.isBlock(sc) && !/^(TD|TH)$/.test(sc.nodeName) && bs) { + if (sc.childNodes.length == 0 || (sc.childNodes.length == 1 && sc.firstChild.nodeName == 'BR')) { + // Find previous block element + n = sc; + while ((n = n.previousSibling) && !ed.dom.isBlock(n)) ; + + if (n) { + if (sc != b.firstChild) { + // Find last text node + w = ed.dom.doc.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, FALSE); + while (tn = w.nextNode()) + n = tn; + + // Place caret at the end of last text node + r = ed.getDoc().createRange(); + r.setStart(n, n.nodeValue ? n.nodeValue.length : 0); + r.setEnd(n, n.nodeValue ? n.nodeValue.length : 0); + se.setRng(r); + + // Remove the target container + ed.dom.remove(sc); + } + + return Event.cancel(e); + } + } + } + } + }); +})(tinymce); + +(function(tinymce) { + // Shorten names + var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, extend = tinymce.extend; + + tinymce.create('tinymce.ControlManager', { + ControlManager : function(ed, s) { + var t = this, i; + + s = s || {}; + t.editor = ed; + t.controls = {}; + t.onAdd = new tinymce.util.Dispatcher(t); + t.onPostRender = new tinymce.util.Dispatcher(t); + t.prefix = s.prefix || ed.id + '_'; + t._cls = {}; + + t.onPostRender.add(function() { + each(t.controls, function(c) { + c.postRender(); + }); + }); + }, + + get : function(id) { + return this.controls[this.prefix + id] || this.controls[id]; + }, + + setActive : function(id, s) { + var c = null; + + if (c = this.get(id)) + c.setActive(s); + + return c; + }, + + setDisabled : function(id, s) { + var c = null; + + if (c = this.get(id)) + c.setDisabled(s); + + return c; + }, + + add : function(c) { + var t = this; + + if (c) { + t.controls[c.id] = c; + t.onAdd.dispatch(c, t); + } + + return c; + }, + + createControl : function(n) { + var c, t = this, ed = t.editor; + + each(ed.plugins, function(p) { + if (p.createControl) { + c = p.createControl(n, t); + + if (c) + return false; + } + }); + + switch (n) { + case "|": + case "separator": + return t.createSeparator(); + } + + if (!c && ed.buttons && (c = ed.buttons[n])) + return t.createButton(n, c); + + return t.add(c); + }, + + createDropMenu : function(id, s, cc) { + var t = this, ed = t.editor, c, bm, v, cls; + + s = extend({ + 'class' : 'mceDropDown', + constrain : ed.settings.constrain_menus + }, s); + + s['class'] = s['class'] + ' ' + ed.getParam('skin') + 'Skin'; + if (v = ed.getParam('skin_variant')) + s['class'] += ' ' + ed.getParam('skin') + 'Skin' + v.substring(0, 1).toUpperCase() + v.substring(1); + + id = t.prefix + id; + cls = cc || t._cls.dropmenu || tinymce.ui.DropMenu; + c = t.controls[id] = new cls(id, s); + c.onAddItem.add(function(c, o) { + var s = o.settings; + + s.title = ed.getLang(s.title, s.title); + + if (!s.onclick) { + s.onclick = function(v) { + if (s.cmd) + ed.execCommand(s.cmd, s.ui || false, s.value); + }; + } + }); + + ed.onRemove.add(function() { + c.destroy(); + }); + + // Fix for bug #1897785, #1898007 + if (tinymce.isIE) { + c.onShowMenu.add(function() { + // IE 8 needs focus in order to store away a range with the current collapsed caret location + ed.focus(); + + bm = ed.selection.getBookmark(1); + }); + + c.onHideMenu.add(function() { + if (bm) { + ed.selection.moveToBookmark(bm); + bm = 0; + } + }); + } + + return t.add(c); + }, + + createListBox : function(id, s, cc) { + var t = this, ed = t.editor, cmd, c, cls; + + if (t.get(id)) + return null; + + s.title = ed.translate(s.title); + s.scope = s.scope || ed; + + if (!s.onselect) { + s.onselect = function(v) { + ed.execCommand(s.cmd, s.ui || false, v || s.value); + }; + } + + s = extend({ + title : s.title, + 'class' : 'mce_' + id, + scope : s.scope, + control_manager : t + }, s); + + id = t.prefix + id; + + if (ed.settings.use_native_selects) + c = new tinymce.ui.NativeListBox(id, s); + else { + cls = cc || t._cls.listbox || tinymce.ui.ListBox; + c = new cls(id, s); + } + + t.controls[id] = c; + + // Fix focus problem in Safari + if (tinymce.isWebKit) { + c.onPostRender.add(function(c, n) { + // Store bookmark on mousedown + Event.add(n, 'mousedown', function() { + ed.bookmark = ed.selection.getBookmark(1); + }); + + // Restore on focus, since it might be lost + Event.add(n, 'focus', function() { + ed.selection.moveToBookmark(ed.bookmark); + ed.bookmark = null; + }); + }); + } + + if (c.hideMenu) + ed.onMouseDown.add(c.hideMenu, c); + + return t.add(c); + }, + + createButton : function(id, s, cc) { + var t = this, ed = t.editor, o, c, cls; + + if (t.get(id)) + return null; + + s.title = ed.translate(s.title); + s.label = ed.translate(s.label); + s.scope = s.scope || ed; + + if (!s.onclick && !s.menu_button) { + s.onclick = function() { + ed.execCommand(s.cmd, s.ui || false, s.value); + }; + } + + s = extend({ + title : s.title, + 'class' : 'mce_' + id, + unavailable_prefix : ed.getLang('unavailable', ''), + scope : s.scope, + control_manager : t + }, s); + + id = t.prefix + id; + + if (s.menu_button) { + cls = cc || t._cls.menubutton || tinymce.ui.MenuButton; + c = new cls(id, s); + ed.onMouseDown.add(c.hideMenu, c); + } else { + cls = t._cls.button || tinymce.ui.Button; + c = new cls(id, s); + } + + return t.add(c); + }, + + createMenuButton : function(id, s, cc) { + s = s || {}; + s.menu_button = 1; + + return this.createButton(id, s, cc); + }, + + createSplitButton : function(id, s, cc) { + var t = this, ed = t.editor, cmd, c, cls; + + if (t.get(id)) + return null; + + s.title = ed.translate(s.title); + s.scope = s.scope || ed; + + if (!s.onclick) { + s.onclick = function(v) { + ed.execCommand(s.cmd, s.ui || false, v || s.value); + }; + } + + if (!s.onselect) { + s.onselect = function(v) { + ed.execCommand(s.cmd, s.ui || false, v || s.value); + }; + } + + s = extend({ + title : s.title, + 'class' : 'mce_' + id, + scope : s.scope, + control_manager : t + }, s); + + id = t.prefix + id; + cls = cc || t._cls.splitbutton || tinymce.ui.SplitButton; + c = t.add(new cls(id, s)); + ed.onMouseDown.add(c.hideMenu, c); + + return c; + }, + + createColorSplitButton : function(id, s, cc) { + var t = this, ed = t.editor, cmd, c, cls, bm; + + if (t.get(id)) + return null; + + s.title = ed.translate(s.title); + s.scope = s.scope || ed; + + if (!s.onclick) { + s.onclick = function(v) { + if (tinymce.isIE) + bm = ed.selection.getBookmark(1); + + ed.execCommand(s.cmd, s.ui || false, v || s.value); + }; + } + + if (!s.onselect) { + s.onselect = function(v) { + ed.execCommand(s.cmd, s.ui || false, v || s.value); + }; + } + + s = extend({ + title : s.title, + 'class' : 'mce_' + id, + 'menu_class' : ed.getParam('skin') + 'Skin', + scope : s.scope, + more_colors_title : ed.getLang('more_colors') + }, s); + + id = t.prefix + id; + cls = cc || t._cls.colorsplitbutton || tinymce.ui.ColorSplitButton; + c = new cls(id, s); + ed.onMouseDown.add(c.hideMenu, c); + + // Remove the menu element when the editor is removed + ed.onRemove.add(function() { + c.destroy(); + }); + + // Fix for bug #1897785, #1898007 + if (tinymce.isIE) { + c.onShowMenu.add(function() { + // IE 8 needs focus in order to store away a range with the current collapsed caret location + ed.focus(); + bm = ed.selection.getBookmark(1); + }); + + c.onHideMenu.add(function() { + if (bm) { + ed.selection.moveToBookmark(bm); + bm = 0; + } + }); + } + + return t.add(c); + }, + + createToolbar : function(id, s, cc) { + var c, t = this, cls; + + id = t.prefix + id; + cls = cc || t._cls.toolbar || tinymce.ui.Toolbar; + c = new cls(id, s); + + if (t.get(id)) + return null; + + return t.add(c); + }, + + createSeparator : function(cc) { + var cls = cc || this._cls.separator || tinymce.ui.Separator; + + return new cls(); + }, + + setControlType : function(n, c) { + return this._cls[n.toLowerCase()] = c; + }, + + destroy : function() { + each(this.controls, function(c) { + c.destroy(); + }); + + this.controls = null; + } + }); +})(tinymce); + +(function(tinymce) { + var Dispatcher = tinymce.util.Dispatcher, each = tinymce.each, isIE = tinymce.isIE, isOpera = tinymce.isOpera; + + tinymce.create('tinymce.WindowManager', { + WindowManager : function(ed) { + var t = this; + + t.editor = ed; + t.onOpen = new Dispatcher(t); + t.onClose = new Dispatcher(t); + t.params = {}; + t.features = {}; + }, + + open : function(s, p) { + var t = this, f = '', x, y, mo = t.editor.settings.dialog_type == 'modal', w, sw, sh, vp = tinymce.DOM.getViewPort(), u; + + // Default some options + s = s || {}; + p = p || {}; + sw = isOpera ? vp.w : screen.width; // Opera uses windows inside the Opera window + sh = isOpera ? vp.h : screen.height; + s.name = s.name || 'mc_' + new Date().getTime(); + s.width = parseInt(s.width || 320); + s.height = parseInt(s.height || 240); + s.resizable = true; + s.left = s.left || parseInt(sw / 2.0) - (s.width / 2.0); + s.top = s.top || parseInt(sh / 2.0) - (s.height / 2.0); + p.inline = false; + p.mce_width = s.width; + p.mce_height = s.height; + p.mce_auto_focus = s.auto_focus; + + if (mo) { + if (isIE) { + s.center = true; + s.help = false; + s.dialogWidth = s.width + 'px'; + s.dialogHeight = s.height + 'px'; + s.scroll = s.scrollbars || false; + } + } + + // Build features string + each(s, function(v, k) { + if (tinymce.is(v, 'boolean')) + v = v ? 'yes' : 'no'; + + if (!/^(name|url)$/.test(k)) { + if (isIE && mo) + f += (f ? ';' : '') + k + ':' + v; + else + f += (f ? ',' : '') + k + '=' + v; + } + }); + + t.features = s; + t.params = p; + t.onOpen.dispatch(t, s, p); + + u = s.url || s.file; + u = tinymce._addVer(u); + + try { + if (isIE && mo) { + w = 1; + window.showModalDialog(u, window, f); + } else + w = window.open(u, s.name, f); + } catch (ex) { + // Ignore + } + + if (!w) + alert(t.editor.getLang('popup_blocked')); + }, + + close : function(w) { + w.close(); + this.onClose.dispatch(this); + }, + + createInstance : function(cl, a, b, c, d, e) { + var f = tinymce.resolve(cl); + + return new f(a, b, c, d, e); + }, + + confirm : function(t, cb, s, w) { + w = w || window; + + cb.call(s || this, w.confirm(this._decode(this.editor.getLang(t, t)))); + }, + + alert : function(tx, cb, s, w) { + var t = this; + + w = w || window; + w.alert(t._decode(t.editor.getLang(tx, tx))); + + if (cb) + cb.call(s || t); + }, + + resizeBy : function(dw, dh, win) { + win.resizeBy(dw, dh); + }, + + // Internal functions + + _decode : function(s) { + return tinymce.DOM.decode(s).replace(/\\n/g, '\n'); + } + }); +}(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 = {}, + each = tinymce.each, + dom = ed.dom, + selection = ed.selection, + TreeWalker = tinymce.dom.TreeWalker, + rangeUtils = new tinymce.dom.RangeUtils(dom), + isValid = ed.schema.isValid, + isBlock = dom.isBlock, + forcedRootBlock = ed.settings.forced_root_block, + nodeIndex = dom.nodeIndex, + INVISIBLE_CHAR = '\uFEFF', + MCE_ATTR_RE = /^(src|href|style)$/, + FALSE = false, + TRUE = true, + undefined, + pendingFormats = {apply : [], remove : []}; + + function isArray(obj) { + return obj instanceof Array; + }; + + function getParents(node, selector) { + return dom.getParents(node, selector, dom.getRoot()); + }; + + function isCaretNode(node) { + return node.nodeType === 1 && (node.face === 'mceinline' || node.style.fontFamily === 'mceinline'); + }; + + // Public functions + + function get(name) { + return name ? formats[name] : formats; + }; + + function register(name, format) { + if (name) { + if (typeof(name) !== 'string') { + each(name, function(format, name) { + register(name, format); + }); + } else { + // Force format into array and add it to internal collection + format = format.length ? format : [format]; + + each(format, function(format) { + // Set deep to false by default on selector formats this to avoid removing + // alignment on images inside paragraphs when alignment is changed on paragraphs + if (format.deep === undefined) + format.deep = !format.selector; + + // Default to true + if (format.split === undefined) + format.split = !format.selector || format.inline; + + // Default to true + if (format.remove === undefined && format.selector && !format.inline) + format.remove = 'none'; + + // Mark format as a mixed format inline + block level + if (format.selector && format.inline) { + format.mixed = true; + format.block_expand = true; + } + + // Split classes if needed + if (typeof(format.classes) === 'string') + format.classes = format.classes.split(/\s+/); + }); + + formats[name] = format; + } + } + }; + + function apply(name, vars, node) { + var formatList = get(name), format = formatList[0], bookmark, rng, i; + + function moveStart(rng) { + var container = rng.startContainer, + offset = rng.startOffset, + walker, node; + + // Move startContainer/startOffset in to a suitable node + if (container.nodeType == 1 || container.nodeValue === "") { + container = container.nodeType == 1 ? container.childNodes[offset] : container; + + // Might fail if the offset is behind the last element in it's container + if (container) { + walker = new TreeWalker(container, container.parentNode); + for (node = walker.current(); node; node = walker.next()) { + if (node.nodeType == 3 && !isWhiteSpaceNode(node)) { + rng.setStart(node, 0); + break; + } + } + } + } + + return rng; + }; + + function setElementFormat(elm, fmt) { + fmt = fmt || format; + + if (elm) { + each(fmt.styles, function(value, name) { + dom.setStyle(elm, name, replaceVars(value, vars)); + }); + + each(fmt.attributes, function(value, name) { + dom.setAttrib(elm, name, replaceVars(value, vars)); + }); + + each(fmt.classes, function(value) { + value = replaceVars(value, vars); + + if (!dom.hasClass(elm, value)) + dom.addClass(elm, value); + }); + } + }; + + function applyRngStyle(rng) { + var newWrappers = [], wrapName, wrapElm; + + // Setup wrapper element + wrapName = format.inline || format.block; + wrapElm = dom.create(wrapName); + setElementFormat(wrapElm); + + rangeUtils.walk(rng, function(nodes) { + var currentWrapElm; + + function process(node) { + var nodeName = node.nodeName.toLowerCase(), parentName = node.parentNode.nodeName.toLowerCase(), found; + + // Stop wrapping on br elements + if (isEq(nodeName, 'br')) { + currentWrapElm = 0; + + // Remove any br elements when we wrap things + if (format.block) + dom.remove(node); + + return; + } + + // If node is wrapper type + if (format.wrapper && matchNode(node, name, vars)) { + currentWrapElm = 0; + return; + } + + // Can we rename the block + if (format.block && !format.wrapper && isTextBlock(nodeName)) { + node = dom.rename(node, wrapName); + setElementFormat(node); + newWrappers.push(node); + currentWrapElm = 0; + return; + } + + // Handle selector patterns + if (format.selector) { + // Look for matching formats + each(formatList, function(format) { + if (dom.is(node, format.selector) && !isCaretNode(node)) { + setElementFormat(node, format); + found = true; + } + }); + + // Continue processing if a selector match wasn't found and a inline element is defined + if (!format.inline || found) { + currentWrapElm = 0; + return; + } + } + + // Is it valid to wrap this item + if (isValid(wrapName, nodeName) && isValid(parentName, wrapName)) { + // Start wrapping + if (!currentWrapElm) { + // Wrap the node + currentWrapElm = wrapElm.cloneNode(FALSE); + node.parentNode.insertBefore(currentWrapElm, node); + newWrappers.push(currentWrapElm); + } + + currentWrapElm.appendChild(node); + } else { + // Start a new wrapper for possible children + currentWrapElm = 0; + + each(tinymce.grep(node.childNodes), process); + + // End the last wrapper + currentWrapElm = 0; + } + }; + + // Process siblings from range + each(nodes, process); + }); + + // Cleanup + each(newWrappers, function(node) { + var childCount; + + function getChildCount(node) { + var count = 0; + + each(node.childNodes, function(node) { + if (!isWhiteSpaceNode(node) && !isBookmarkNode(node)) + count++; + }); + + return count; + }; + + function mergeStyles(node) { + var child, clone; + + each(node.childNodes, function(node) { + if (node.nodeType == 1 && !isBookmarkNode(node) && !isCaretNode(node)) { + child = node; + return FALSE; // break loop + } + }); + + // If child was found and of the same type as the current node + if (child && matchName(child, format)) { + clone = child.cloneNode(FALSE); + setElementFormat(clone); + + dom.replace(clone, node, TRUE); + dom.remove(child, 1); + } + + return clone || node; + }; + + childCount = getChildCount(node); + + // Remove empty nodes + if (childCount === 0) { + dom.remove(node, 1); + return; + } + + if (format.inline || format.wrapper) { + // Merges the current node with it's children of similar type to reduce the number of elements + if (!format.exact && childCount === 1) + node = mergeStyles(node); + + // Remove/merge children + each(formatList, function(format) { + // Merge all children of similar type will move styles from child to parent + // this: text + // will become: text + each(dom.select(format.inline, node), function(child) { + removeFormat(format, vars, child, format.exact ? child : null); + }); + }); + + // Remove child if direct parent is of same type + if (matchNode(node.parentNode, name, vars)) { + dom.remove(node, 1); + node = 0; + return TRUE; + } + + // Look for parent with similar style format + if (format.merge_with_parents) { + dom.getParent(node.parentNode, function(parent) { + if (matchNode(parent, name, vars)) { + dom.remove(node, 1); + node = 0; + return TRUE; + } + }); + } + + // Merge next and previous siblings if they are similar texttext becomes texttext + if (node) { + node = mergeSiblings(getNonWhiteSpaceSibling(node), node); + node = mergeSiblings(node, getNonWhiteSpaceSibling(node, TRUE)); + } + } + }); + }; + + if (format) { + if (node) { + rng = dom.createRng(); + + rng.setStartBefore(node); + rng.setEndAfter(node); + + applyRngStyle(expandRng(rng, formatList)); + } else { + if (!selection.isCollapsed() || !format.inline) { + // Apply formatting to selection + bookmark = selection.getBookmark(); + applyRngStyle(expandRng(selection.getRng(TRUE), formatList)); + + selection.moveToBookmark(bookmark); + selection.setRng(moveStart(selection.getRng(TRUE))); + ed.nodeChanged(); + } else + performCaretAction('apply', name, vars); + } + } + }; + + function remove(name, vars, node) { + var formatList = get(name), format = formatList[0], bookmark, i, rng; + + function moveStart(rng) { + var container = rng.startContainer, + offset = rng.startOffset, + walker, node, nodes, tmpNode; + + // Convert text node into index if possible + if (container.nodeType == 3 && offset >= container.nodeValue.length - 1) { + container = container.parentNode; + offset = nodeIndex(container) + 1; + } + + // Move startContainer/startOffset in to a suitable node + if (container.nodeType == 1) { + nodes = container.childNodes; + container = nodes[Math.min(offset, nodes.length - 1)]; + walker = new TreeWalker(container); + + // If offset is at end of the parent node walk to the next one + if (offset > nodes.length - 1) + walker.next(); + + for (node = walker.current(); node; node = walker.next()) { + if (node.nodeType == 3 && !isWhiteSpaceNode(node)) { + // IE has a "neat" feature where it moves the start node into the closest element + // we can avoid this by inserting an element before it and then remove it after we set the selection + tmpNode = dom.create('a', null, INVISIBLE_CHAR); + node.parentNode.insertBefore(tmpNode, node); + + // Set selection and remove tmpNode + rng.setStart(node, 0); + selection.setRng(rng); + dom.remove(tmpNode); + + return; + } + } + } + }; + + // Merges the styles for each node + function process(node) { + var children, i, l; + + // Grab the children first since the nodelist might be changed + children = tinymce.grep(node.childNodes); + + // Process current node + for (i = 0, l = formatList.length; i < l; i++) { + if (removeFormat(formatList[i], vars, node, node)) + break; + } + + // Process the children + if (format.deep) { + for (i = 0, l = children.length; i < l; i++) + process(children[i]); + } + }; + + function findFormatRoot(container) { + var formatRoot; + + // Find format root + each(getParents(container.parentNode).reverse(), function(parent) { + var format; + + // Find format root element + if (!formatRoot && parent.id != '_start' && parent.id != '_end') { + // Is the node matching the format we are looking for + format = matchNode(parent, name, vars); + if (format && format.split !== false) + formatRoot = parent; + } + }); + + return formatRoot; + }; + + function wrapAndSplit(format_root, container, target, split) { + var parent, clone, lastClone, firstClone, i, formatRootParent; + + // Format root found then clone formats and split it + if (format_root) { + formatRootParent = format_root.parentNode; + + for (parent = container.parentNode; parent && parent != formatRootParent; parent = parent.parentNode) { + clone = parent.cloneNode(FALSE); + + for (i = 0; i < formatList.length; i++) { + if (removeFormat(formatList[i], vars, clone, clone)) { + clone = 0; + break; + } + } + + // Build wrapper node + if (clone) { + if (lastClone) + clone.appendChild(lastClone); + + if (!firstClone) + firstClone = clone; + + lastClone = clone; + } + } + + // Never split block elements if the format is mixed + if (split && (!format.mixed || !isBlock(format_root))) + container = dom.split(format_root, container); + + // Wrap container in cloned formats + if (lastClone) { + target.parentNode.insertBefore(lastClone, target); + firstClone.appendChild(target); + } + } + + return container; + }; + + function splitToFormatRoot(container) { + return wrapAndSplit(findFormatRoot(container), container, container, true); + }; + + function unwrap(start) { + var node = dom.get(start ? '_start' : '_end'), + out = node[start ? 'firstChild' : 'lastChild']; + + // If the end is placed within the start the result will be removed + // So this checks if the out node is a bookmark node if it is it + // checks for another more suitable node + if (isBookmarkNode(out)) + out = out[start ? 'firstChild' : 'lastChild']; + + dom.remove(node, true); + + return out; + }; + + function removeRngStyle(rng) { + var startContainer, endContainer; + + rng = expandRng(rng, formatList, TRUE); + + if (format.split) { + startContainer = getContainer(rng, TRUE); + endContainer = getContainer(rng); + + 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'}); + + // Split start/end + splitToFormatRoot(startContainer); + splitToFormatRoot(endContainer); + + // Unwrap start/end to get real elements again + startContainer = unwrap(TRUE); + endContainer = unwrap(); + } else + startContainer = endContainer = splitToFormatRoot(startContainer); + + // Update range positions since they might have changed after the split operations + rng.startContainer = startContainer.parentNode; + rng.startOffset = nodeIndex(startContainer); + rng.endContainer = endContainer.parentNode; + rng.endOffset = nodeIndex(endContainer) + 1; + } + + // Remove items between start/end + rangeUtils.walk(rng, function(nodes) { + each(nodes, function(node) { + process(node); + }); + }); + }; + + // Handle node + if (node) { + rng = dom.createRng(); + rng.setStartBefore(node); + rng.setEndAfter(node); + removeRngStyle(rng); + return; + } + + if (!selection.isCollapsed() || !format.inline) { + bookmark = selection.getBookmark(); + removeRngStyle(selection.getRng(TRUE)); + selection.moveToBookmark(bookmark); + + // Check if start element still has formatting then we are at: "text|text" and need to move the start into the next text node + if (match(name, vars, selection.getStart())) { + moveStart(selection.getRng(true)); + } + + ed.nodeChanged(); + } else + performCaretAction('remove', name, vars); + }; + + function toggle(name, vars, node) { + if (match(name, vars, node)) + remove(name, vars, node); + else + apply(name, vars, node); + }; + + function matchNode(node, name, vars, similar) { + var formatList = get(name), format, i, classes; + + function matchItems(node, format, item_name) { + var key, value, items = format[item_name], i; + + // Check all items + if (items) { + // Non indexed object + if (items.length === undefined) { + for (key in items) { + if (items.hasOwnProperty(key)) { + if (item_name === 'attributes') + value = dom.getAttrib(node, key); + else + value = getStyle(node, key); + + if (similar && !value && !format.exact) + return; + + if ((!similar || format.exact) && !isEq(value, replaceVars(items[key], vars))) + return; + } + } + } else { + // Only one match needed for indexed arrays + for (i = 0; i < items.length; i++) { + if (item_name === 'attributes' ? dom.getAttrib(node, items[i]) : getStyle(node, items[i])) + return format; + } + } + } + + return format; + }; + + if (formatList && node) { + // Check each format in list + for (i = 0; i < formatList.length; i++) { + format = formatList[i]; + + // Name name, attributes, styles and classes + if (matchName(node, format) && matchItems(node, format, 'attributes') && matchItems(node, format, 'styles')) { + // Match classes + if (classes = format.classes) { + for (i = 0; i < classes.length; i++) { + if (!dom.hasClass(node, classes[i])) + return; + } + } + + return format; + } + } + } + }; + + function match(name, vars, node) { + var startNode, i; + + function matchParents(node) { + // Find first node with similar format settings + node = dom.getParent(node, function(node) { + return !!matchNode(node, name, vars, true); + }); + + // Do an exact check on the similar format element + return matchNode(node, name, vars); + }; + + // Check specified node + if (node) + return matchParents(node); + + // Check pending formats + if (selection.isCollapsed()) { + for (i = pendingFormats.apply.length - 1; i >= 0; i--) { + if (pendingFormats.apply[i].name == name) + return true; + } + + for (i = pendingFormats.remove.length - 1; i >= 0; i--) { + if (pendingFormats.remove[i].name == name) + return false; + } + + return matchParents(selection.getNode()); + } + + // Check selected node + node = selection.getNode(); + if (matchParents(node)) + return TRUE; + + // Check start node if it's different + startNode = selection.getStart(); + if (startNode != node) { + if (matchParents(startNode)) + return TRUE; + } + + return FALSE; + }; + + function matchAll(names, vars) { + var startElement, matchedFormatNames = [], checkedMap = {}, i, ni, name; + + // If the selection is collapsed then check pending formats + if (selection.isCollapsed()) { + for (ni = 0; ni < names.length; ni++) { + // If the name is to be removed, then stop it from being added + for (i = pendingFormats.remove.length - 1; i >= 0; i--) { + name = names[ni]; + + if (pendingFormats.remove[i].name == name) { + checkedMap[name] = true; + break; + } + } + } + + // If the format is to be applied + for (i = pendingFormats.apply.length - 1; i >= 0; i--) { + for (ni = 0; ni < names.length; ni++) { + name = names[ni]; + + if (!checkedMap[name] && pendingFormats.apply[i].name == name) { + checkedMap[name] = true; + matchedFormatNames.push(name); + } + } + } + } + + // Check start of selection for formats + startElement = selection.getStart(); + dom.getParent(startElement, function(node) { + var i, name; + + for (i = 0; i < names.length; i++) { + name = names[i]; + + if (!checkedMap[name] && matchNode(node, name, vars)) { + checkedMap[name] = true; + matchedFormatNames.push(name); + } + } + }); + + return matchedFormatNames; + }; + + function canApply(name) { + var formatList = get(name), startNode, parents, i, x, selector; + + if (formatList) { + startNode = selection.getStart(); + parents = getParents(startNode); + + for (x = formatList.length - 1; x >= 0; x--) { + selector = formatList[x].selector; + + // Format is not selector based, then always return TRUE + if (!selector) + return TRUE; + + for (i = parents.length - 1; i >= 0; i--) { + if (dom.is(parents[i], selector)) + return TRUE; + } + } + } + + return FALSE; + }; + + // Expose to public + tinymce.extend(this, { + get : get, + register : register, + apply : apply, + remove : remove, + toggle : toggle, + match : match, + matchAll : matchAll, + matchNode : matchNode, + canApply : canApply + }); + + // Private functions + + function matchName(node, format) { + // Check for inline match + if (isEq(node, format.inline)) + return TRUE; + + // Check for block match + if (isEq(node, format.block)) + return TRUE; + + // Check for selector match + if (format.selector) + return dom.is(node, format.selector); + }; + + function isEq(str1, str2) { + str1 = str1 || ''; + str2 = str2 || ''; + + str1 = '' + (str1.nodeName || str1); + str2 = '' + (str2.nodeName || str2); + + return str1.toLowerCase() == str2.toLowerCase(); + }; + + function getStyle(node, name) { + var styleVal = dom.getStyle(node, name); + + // Force the format to hex + if (name == 'color' || name == 'backgroundColor') + styleVal = dom.toHex(styleVal); + + // Opera will return bold as 700 + if (name == 'fontWeight' && styleVal == 700) + styleVal = 'bold'; + + return '' + styleVal; + }; + + function replaceVars(value, vars) { + if (typeof(value) != "string") + value = value(vars); + else if (vars) { + value = value.replace(/%(\w+)/g, function(str, name) { + return vars[name] || str; + }); + } + + return value; + }; + + function isWhiteSpaceNode(node) { + return node && node.nodeType === 3 && /^([\s\r\n]+|)$/.test(node.nodeValue); + }; + + function wrap(node, name, attrs) { + var wrapper = dom.create(name, attrs); + + node.parentNode.insertBefore(wrapper, node); + wrapper.appendChild(node); + + return wrapper; + }; + + function expandRng(rng, format, remove) { + var startContainer = rng.startContainer, + startOffset = rng.startOffset, + endContainer = rng.endContainer, + endOffset = rng.endOffset, sibling, lastIdx; + + // This function walks up the tree if there is no siblings before/after the node + function findParentContainer(container, child_name, sibling_name, root) { + var parent, child; + + root = root || dom.getRoot(); + + for (;;) { + // Check if we can move up are we at root level or body level + parent = container.parentNode; + + // Stop expanding on block elements or root depending on format + if (parent == root || (!format[0].block_expand && isBlock(parent))) + return container; + + for (sibling = parent[child_name]; sibling && sibling != container; sibling = sibling[sibling_name]) { + if (sibling.nodeType == 1 && !isBookmarkNode(sibling)) + return container; + + if (sibling.nodeType == 3 && !isWhiteSpaceNode(sibling)) + return container; + } + + container = container.parentNode; + } + + return container; + }; + + // If index based start position then resolve it + if (startContainer.nodeType == 1 && startContainer.hasChildNodes()) { + lastIdx = startContainer.childNodes.length - 1; + startContainer = startContainer.childNodes[startOffset > lastIdx ? lastIdx : startOffset]; + + if (startContainer.nodeType == 3) + startOffset = 0; + } + + // If index based end position then resolve it + if (endContainer.nodeType == 1 && endContainer.hasChildNodes()) { + lastIdx = endContainer.childNodes.length - 1; + endContainer = endContainer.childNodes[endOffset > lastIdx ? lastIdx : endOffset - 1]; + + if (endContainer.nodeType == 3) + endOffset = endContainer.nodeValue.length; + } + + // Exclude bookmark nodes if possible + if (isBookmarkNode(startContainer.parentNode)) + startContainer = startContainer.parentNode; + + if (isBookmarkNode(startContainer)) + startContainer = startContainer.nextSibling || startContainer; + + if (isBookmarkNode(endContainer.parentNode)) + endContainer = endContainer.parentNode; + + if (isBookmarkNode(endContainer)) + endContainer = endContainer.previousSibling || endContainer; + + // 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 + // Move start point up the tree + if (format[0].inline || format[0].block_expand) { + startContainer = findParentContainer(startContainer, 'firstChild', 'nextSibling'); + endContainer = findParentContainer(endContainer, 'lastChild', 'previousSibling'); + } + + // 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; + + if (container.nodeType == 3 && container.nodeValue.length == 0 && container[sibling_name]) + container = container[sibling_name]; + + 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)) + return parents[i]; + } + } + + return container; + }; + + // Find new startContainer/endContainer if there is better one + startContainer = findSelectorEndPoint(startContainer, 'previousSibling'); + endContainer = findSelectorEndPoint(endContainer, 'nextSibling'); + } + + // Expand start/end container to matching block element or text node + if (format[0].block || format[0].selector) { + function findBlockEndPoint(container, sibling_name, sibling_name2) { + var node; + + // Expand to block of similar type + if (!format[0].wrapper) + node = dom.getParent(container, format[0].block); + + // Expand to first wrappable block element or any block element + if (!node) + node = dom.getParent(container.nodeType == 3 ? container.parentNode : container, isBlock); + + // Exclude inner lists from wrapping + if (node && format[0].wrapper) + node = getParents(node, 'ul,ol').reverse()[0] || node; + + // Didn't find a block element look for first/last wrappable element + if (!node) { + node = container; + + while (node[sibling_name] && !isBlock(node[sibling_name])) { + node = node[sibling_name]; + + // Break on BR but include it will be removed later on + // we can't remove it now since we need to check if it can be wrapped + if (isEq(node, 'br')) + break; + } + } + + return node || container; + }; + + // Find new startContainer/endContainer if there is better one + startContainer = findBlockEndPoint(startContainer, 'previousSibling'); + endContainer = findBlockEndPoint(endContainer, 'nextSibling'); + + // Non block element then try to expand up the leaf + if (format[0].block) { + if (!isBlock(startContainer)) + startContainer = findParentContainer(startContainer, 'firstChild', 'nextSibling'); + + if (!isBlock(endContainer)) + endContainer = findParentContainer(endContainer, 'lastChild', 'previousSibling'); + } + } + + // Setup index for startContainer + if (startContainer.nodeType == 1) { + startOffset = nodeIndex(startContainer); + startContainer = startContainer.parentNode; + } + + // Setup index for endContainer + if (endContainer.nodeType == 1) { + endOffset = nodeIndex(endContainer) + 1; + endContainer = endContainer.parentNode; + } + + // Return new range like object + return { + startContainer : startContainer, + startOffset : startOffset, + endContainer : endContainer, + endOffset : endOffset + }; + } + + function removeFormat(format, vars, node, compare_node) { + var i, attrs, stylesModified; + + // Check if node matches format + if (!matchName(node, format)) + return FALSE; + + // Should we compare with format attribs and styles + if (format.remove != 'all') { + // Remove styles + each(format.styles, function(value, name) { + value = replaceVars(value, vars); + + // Indexed array + if (typeof(name) === 'number') { + name = value; + compare_node = 0; + } + + if (!compare_node || isEq(getStyle(compare_node, name), value)) + dom.setStyle(node, name, ''); + + stylesModified = 1; + }); + + // Remove style attribute if it's empty + if (stylesModified && dom.getAttrib(node, 'style') == '') { + node.removeAttribute('style'); + node.removeAttribute('_mce_style'); + } + + // Remove attributes + each(format.attributes, function(value, name) { + var valueOut; + + value = replaceVars(value, vars); + + // Indexed array + if (typeof(name) === 'number') { + name = value; + compare_node = 0; + } + + if (!compare_node || isEq(dom.getAttrib(compare_node, name), value)) { + // Keep internal classes + if (name == 'class') { + value = dom.getAttrib(node, name); + if (value) { + // Build new class value where everything is removed except the internal prefixed classes + valueOut = ''; + each(value.split(/\s+/), function(cls) { + if (/mce\w+/.test(cls)) + valueOut += (valueOut ? ' ' : '') + cls; + }); + + // We got some internal classes left + if (valueOut) { + dom.setAttrib(node, name, valueOut); + return; + } + } + } + + // IE6 has a bug where the attribute doesn't get removed correctly + if (name == "class") + node.removeAttribute('className'); + + // Remove mce prefixed attributes + if (MCE_ATTR_RE.test(name)) + node.removeAttribute('_mce_' + name); + + node.removeAttribute(name); + } + }); + + // Remove classes + each(format.classes, function(value) { + value = replaceVars(value, vars); + + if (!compare_node || dom.hasClass(compare_node, value)) + dom.removeClass(node, value); + }); + + // Check for non internal attributes + attrs = dom.getAttribs(node); + for (i = 0; i < attrs.length; i++) { + if (attrs[i].nodeName.indexOf('_') !== 0) + return FALSE; + } + } + + // Remove the inline child if it's empty for example or + if (format.remove != 'none') { + removeNode(node, format); + return TRUE; + } + }; + + function removeNode(node, format) { + var parentNode = node.parentNode, rootBlockElm; + + if (format.block) { + if (!forcedRootBlock) { + function find(node, next, inc) { + node = getNonWhiteSpaceSibling(node, next, inc); + + return !node || (node.nodeName == 'BR' || isBlock(node)); + }; + + // Append BR elements if needed before we remove the block + if (isBlock(node) && !isBlock(parentNode)) { + if (!find(node, FALSE) && !find(node.firstChild, TRUE, 1)) + node.insertBefore(dom.create('br'), node.firstChild); + + if (!find(node, TRUE) && !find(node.lastChild, FALSE, 1)) + node.appendChild(dom.create('br')); + } + } else { + // Wrap the block in a forcedRootBlock if we are at the root of document + if (parentNode == dom.getRoot()) { + if (!format.list_block || !isEq(node, format.list_block)) { + each(tinymce.grep(node.childNodes), function(node) { + if (isValid(forcedRootBlock, node.nodeName.toLowerCase())) { + if (!rootBlockElm) + rootBlockElm = wrap(node, forcedRootBlock); + else + rootBlockElm.appendChild(node); + } else + rootBlockElm = 0; + }); + } + } + } + } + + // Never remove nodes that isn't the specified inline element if a selector is specified too + if (format.selector && format.inline && !isEq(format.inline, node)) + return; + + dom.remove(node, 1); + }; + + function getNonWhiteSpaceSibling(node, next, inc) { + if (node) { + next = next ? 'nextSibling' : 'previousSibling'; + + for (node = inc ? node : node[next]; node; node = node[next]) { + if (node.nodeType == 1 || !isWhiteSpaceNode(node)) + return node; + } + } + }; + + function isBookmarkNode(node) { + return node && node.nodeType == 1 && node.getAttribute('_mce_type') == 'bookmark'; + }; + + function mergeSiblings(prev, next) { + var marker, sibling, tmpSibling; + + function compareElements(node1, node2) { + // Not the same name + if (node1.nodeName != node2.nodeName) + return FALSE; + + function getAttribs(node) { + var attribs = {}; + + each(dom.getAttribs(node), function(attr) { + var name = attr.nodeName.toLowerCase(); + + // Don't compare internal attributes or style + if (name.indexOf('_') !== 0 && name !== 'style') + attribs[name] = dom.getAttrib(node, name); + }); + + return attribs; + }; + + function compareObjects(obj1, obj2) { + var value, name; + + for (name in obj1) { + // Obj1 has item obj2 doesn't have + if (obj1.hasOwnProperty(name)) { + value = obj2[name]; + + // Obj2 doesn't have obj1 item + if (value === undefined) + return FALSE; + + // Obj2 item has a different value + if (obj1[name] != value) + return FALSE; + + // Delete similar value + delete obj2[name]; + } + } + + // Check if obj 2 has something obj 1 doesn't have + for (name in obj2) { + // Obj2 has item obj1 doesn't have + if (obj2.hasOwnProperty(name)) + return FALSE; + } + + return TRUE; + }; + + // Attribs are not the same + if (!compareObjects(getAttribs(node1), getAttribs(node2))) + return FALSE; + + // Styles are not the same + if (!compareObjects(dom.parseStyle(dom.getAttrib(node1, 'style')), dom.parseStyle(dom.getAttrib(node2, 'style')))) + return FALSE; + + return TRUE; + }; + + // Check if next/prev exists and that they are elements + if (prev && next) { + function findElementSibling(node, sibling_name) { + for (sibling = node; sibling; sibling = sibling[sibling_name]) { + if (sibling.nodeType == 3 && !isWhiteSpaceNode(sibling)) + return node; + + if (sibling.nodeType == 1 && !isBookmarkNode(sibling)) + return sibling; + } + + return node; + }; + + // If previous sibling is empty then jump over it + prev = findElementSibling(prev, 'previousSibling'); + next = findElementSibling(next, 'nextSibling'); + + // Compare next and previous nodes + if (compareElements(prev, next)) { + // Append nodes between + for (sibling = prev.nextSibling; sibling && sibling != next;) { + tmpSibling = sibling; + sibling = sibling.nextSibling; + prev.appendChild(tmpSibling); + } + + // Remove next node + dom.remove(next); + + // Move children into prev node + each(tinymce.grep(next.childNodes), function(node) { + prev.appendChild(node); + }); + + return prev; + } + } + + return next; + }; + + function isTextBlock(name) { + return /^(h[1-6]|p|div|pre|address|dl|dt|dd)$/.test(name); + }; + + function getContainer(rng, start) { + var container, offset, lastIdx; + + container = rng[start ? 'startContainer' : 'endContainer']; + offset = rng[start ? 'startOffset' : 'endOffset']; + + if (container.nodeType == 1) { + lastIdx = container.childNodes.length - 1; + + if (!start && offset) + offset--; + + container = container.childNodes[offset > lastIdx ? lastIdx : offset]; + } + + return container; + }; + + function performCaretAction(type, name, vars) { + var i, currentPendingFormats = pendingFormats[type], + otherPendingFormats = pendingFormats[type == 'apply' ? 'remove' : 'apply']; + + function hasPending() { + return pendingFormats.apply.length || pendingFormats.remove.length; + }; + + function resetPending() { + pendingFormats.apply = []; + pendingFormats.remove = []; + }; + + function perform(caret_node) { + // Apply pending formats + each(pendingFormats.apply.reverse(), function(item) { + apply(item.name, item.vars, caret_node); + }); + + // Remove pending formats + each(pendingFormats.remove.reverse(), function(item) { + remove(item.name, item.vars, caret_node); + }); + + dom.remove(caret_node, 1); + resetPending(); + }; + + // Check if it already exists then ignore it + for (i = currentPendingFormats.length - 1; i >= 0; i--) { + if (currentPendingFormats[i].name == name) + return; + } + + currentPendingFormats.push({name : name, vars : vars}); + + // Check if it's in the other type, then remove it + for (i = otherPendingFormats.length - 1; i >= 0; i--) { + if (otherPendingFormats[i].name == name) + otherPendingFormats.splice(i, 1); + } + + // Pending apply or remove formats + if (hasPending()) { + ed.getDoc().execCommand('FontName', false, 'mceinline'); + pendingFormats.lastRng = selection.getRng(); + + // IE will convert the current word + each(dom.select('font,span'), function(node) { + var bookmark; + + if (isCaretNode(node)) { + bookmark = selection.getBookmark(); + perform(node); + selection.moveToBookmark(bookmark); + ed.nodeChanged(); + } + }); + + // Only register listeners once if we need to + if (!pendingFormats.isListening && hasPending()) { + pendingFormats.isListening = true; + + each('onKeyDown,onKeyUp,onKeyPress,onMouseUp'.split(','), function(event) { + ed[event].addToTop(function(ed, e) { + // Do we have pending formats and is the selection moved has moved + if (hasPending() && !tinymce.dom.RangeUtils.compareRanges(pendingFormats.lastRng, selection.getRng())) { + each(dom.select('font,span'), function(node) { + var textNode, rng; + + // Look for marker + if (isCaretNode(node)) { + textNode = node.firstChild; + + if (textNode) { + perform(node); + + rng = dom.createRng(); + rng.setStart(textNode, textNode.nodeValue.length); + rng.setEnd(textNode, textNode.nodeValue.length); + selection.setRng(rng); + ed.nodeChanged(); + } else + dom.remove(node); + } + }); + + // Always unbind and clear pending styles on keyup + if (e.type == 'keyup' || e.type == 'mouseup') + resetPending(); + } + }); + }); + } + } + }; + }; +})(tinymce); + +tinymce.onAddEditor.add(function(tinymce, ed) { + var filters, fontSizes, dom, settings = ed.settings; + + if (settings.inline_styles) { + fontSizes = tinymce.explode(settings.font_size_style_values); + + function replaceWithSpan(node, styles) { + dom.replace(dom.create('span', { + style : styles + }), node, 1); + }; + + filters = { + font : function(dom, node) { + replaceWithSpan(node, { + backgroundColor : node.style.backgroundColor, + color : node.color, + fontFamily : node.face, + fontSize : fontSizes[parseInt(node.size) - 1] + }); + }, + + u : function(dom, node) { + replaceWithSpan(node, { + textDecoration : 'underline' + }); + }, + + strike : function(dom, node) { + replaceWithSpan(node, { + textDecoration : 'line-through' + }); + } + }; + + function convert(editor, params) { + dom = editor.dom; + + if (settings.convert_fonts_to_spans) { + tinymce.each(dom.select('font,u,strike', params.node), function(node) { + filters[node.nodeName.toLowerCase()](ed.dom, node); + }); + } + }; + + ed.onPreProcess.add(convert); + + ed.onInit.add(function() { + ed.selection.onSetContent.add(convert); + }); + } +}); + diff --git a/plugins/TinyMCE/js/utils/editable_selects.js b/plugins/TinyMCE/js/utils/editable_selects.js new file mode 100644 index 0000000000..fd943c0f87 --- /dev/null +++ b/plugins/TinyMCE/js/utils/editable_selects.js @@ -0,0 +1,70 @@ +/** + * editable_selects.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +var TinyMCE_EditableSelects = { + editSelectElm : null, + + init : function() { + var nl = document.getElementsByTagName("select"), i, d = document, o; + + for (i=0; i'; + h += ' '; + + return h; +} + +function updateColor(img_id, form_element_id) { + document.getElementById(img_id).style.backgroundColor = document.forms[0].elements[form_element_id].value; +} + +function setBrowserDisabled(id, state) { + var img = document.getElementById(id); + var lnk = document.getElementById(id + "_link"); + + if (lnk) { + if (state) { + lnk.setAttribute("realhref", lnk.getAttribute("href")); + lnk.removeAttribute("href"); + tinyMCEPopup.dom.addClass(img, 'disabled'); + } else { + if (lnk.getAttribute("realhref")) + lnk.setAttribute("href", lnk.getAttribute("realhref")); + + tinyMCEPopup.dom.removeClass(img, 'disabled'); + } + } +} + +function getBrowserHTML(id, target_form_element, type, prefix) { + var option = prefix + "_" + type + "_browser_callback", cb, html; + + cb = tinyMCEPopup.getParam(option, tinyMCEPopup.getParam("file_browser_callback")); + + if (!cb) + return ""; + + html = ""; + html += ''; + html += ' '; + + return html; +} + +function openBrowser(img_id, target_form_element, type, option) { + var img = document.getElementById(img_id); + + if (img.className != "mceButtonDisabled") + tinyMCEPopup.openBrowser(target_form_element, type, option); +} + +function selectByValue(form_obj, field_name, value, add_custom, ignore_case) { + if (!form_obj || !form_obj.elements[field_name]) + return; + + var sel = form_obj.elements[field_name]; + + var found = false; + for (var i=0; i parseInt(v)) + st = this.mark(f, n); + } + } + + return st; + }, + + hasClass : function(n, c, d) { + return new RegExp('\\b' + c + (d ? '[0-9]+' : '') + '\\b', 'g').test(n.className); + }, + + getNum : function(n, c) { + c = n.className.match(new RegExp('\\b' + c + '([0-9]+)\\b', 'g'))[0]; + c = c.replace(/[^0-9]/g, ''); + + return c; + }, + + addClass : function(n, c, b) { + var o = this.removeClass(n, c); + n.className = b ? c + (o != '' ? (' ' + o) : '') : (o != '' ? (o + ' ') : '') + c; + }, + + removeClass : function(n, c) { + c = n.className.replace(new RegExp("(^|\\s+)" + c + "(\\s+|$)"), ' '); + return n.className = c != ' ' ? c : ''; + }, + + tags : function(f, s) { + return f.getElementsByTagName(s); + }, + + mark : function(f, n) { + var s = this.settings; + + this.addClass(n, s.invalid_cls); + this.markLabels(f, n, s.invalid_cls); + + return false; + }, + + markLabels : function(f, n, ic) { + var nl, i; + + nl = this.tags(f, "label"); + for (i=0; i, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-01 14:58-0800\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" + +#: hello.php:115 SamplePlugin.php:266 +msgid "Hello" +msgstr "" + +#: hello.php:117 hello.php:141 +#, php-format +msgid "Hello, %s" +msgstr "" + +#: hello.php:138 +msgid "Hello, stranger!" +msgstr "" + +#: hello.php:143 +#, php-format +msgid "I have greeted you %d time." +msgid_plural "I have greeted you %d times." +msgstr[0] "" +msgstr[1] "" + +#: SamplePlugin.php:266 +msgid "A warm greeting" +msgstr "" + +#: SamplePlugin.php:277 +msgid "A sample plugin to show basics of development for new hackers." +msgstr "" + +#: User_greeting_count.php:163 +#, php-format +msgid "Could not save new greeting count for %d" +msgstr "" + +#: User_greeting_count.php:176 +#, php-format +msgid "Could not increment greeting count for %d" +msgstr ""