From d80e67854208b7bc13b1002103a7104c4d83c7c5 Mon Sep 17 00:00:00 2001 From: Ben Klang Date: Mon, 3 May 2010 19:38:45 -0400 Subject: [PATCH] Import Jonah from Horde 3 (CVS) --- jonah/.htaccess | 6 + jonah/LICENSE | 49 + jonah/README | 39 + jonah/channels/aggregate.php | 146 +++ jonah/channels/delete.php | 88 ++ jonah/channels/edit.php | 91 ++ jonah/channels/index.php | 99 ++ jonah/config/.cvsignore | 5 + jonah/config/.htaccess | 1 + jonah/config/conf.xml | 54 + jonah/config/templates.php.dist | 59 + jonah/delivery/.htaccess | 6 + jonah/delivery/html.php | 70 ++ jonah/delivery/index.php | 68 ++ jonah/delivery/rss.php | 98 ++ jonah/dispatcher.php | 150 +++ jonah/docs/CHANGES | 102 ++ jonah/docs/CREDITS | 39 + jonah/docs/INSTALL | 234 ++++ jonah/docs/TODO | 9 + jonah/feed.php | 60 + jonah/index.php | 24 + jonah/lib/.htaccess | 1 + jonah/lib/Api.php | 256 ++++ jonah/lib/Application.php | 69 ++ jonah/lib/Block/cloud.php | 59 + jonah/lib/Block/delivery.php | 72 ++ jonah/lib/Block/latest.php | 121 ++ jonah/lib/Block/news.php | 110 ++ jonah/lib/Block/news_popular.php | 107 ++ jonah/lib/Block/story.php | 127 ++ jonah/lib/Block/tree_menu.php | 46 + jonah/lib/Driver.php | 597 ++++++++++ jonah/lib/Driver/sql.php | 1062 +++++++++++++++++ jonah/lib/FeedParser.php | 504 ++++++++ jonah/lib/Forms/Feed.php | 130 +++ jonah/lib/Forms/Story.php | 112 ++ jonah/lib/Jonah.php | 265 +++++ jonah/lib/News.php | 839 ++++++++++++++ jonah/lib/News/sql.php | 900 ++++++++++++++ jonah/lib/base.php | 59 + jonah/lib/version.php | 1 + jonah/locale/.htaccess | 1 + jonah/locale/de_DE/LC_MESSAGES/jonah.mo | Bin 0 -> 169927 bytes jonah/locale/en_US/help.xml | 37 + jonah/locale/es_ES/LC_MESSAGES/jonah.mo | Bin 0 -> 165244 bytes jonah/locale/es_ES/help.xml | 25 + jonah/locale/fi_FI/LC_MESSAGES/jonah.mo | Bin 0 -> 161027 bytes jonah/locale/fi_FI/help.xml | 33 + jonah/locale/fr_FR/LC_MESSAGES/jonah.mo | Bin 0 -> 152621 bytes jonah/locale/nl_NL/LC_MESSAGES/jonah.mo | Bin 0 -> 157583 bytes jonah/locale/ro_RO/LC_MESSAGES/jonah.mo | Bin 0 -> 30297 bytes jonah/locale/tr_TR/LC_MESSAGES/jonah.mo | Bin 0 -> 155661 bytes jonah/locale/zh_TW/LC_MESSAGES/jonah.mo | Bin 0 -> 141399 bytes jonah/po/.htaccess | 1 + jonah/po/README | 1 + jonah/po/de_DE.po | 864 ++++++++++++++ jonah/po/es_ES.po | 1038 +++++++++++++++++ jonah/po/fi_FI.po | 1047 +++++++++++++++++ jonah/po/fr_FR.po | 258 ++++ jonah/po/jonah.pot | 820 +++++++++++++ jonah/po/nl_NL.po | 1051 +++++++++++++++++ jonah/po/ro_RO.po | 970 ++++++++++++++++ jonah/po/tr_TR.po | 1027 ++++++++++++++++ jonah/po/zh_TW.po | 1226 ++++++++++++++++++++ jonah/scripts/.htaccess | 1 + jonah/scripts/feed_tester.php | 61 + jonah/scripts/sql/jonah.mssql.sql | 56 + jonah/scripts/sql/jonah.sql | 56 + jonah/scripts/upgrades/2005-03-13_release_date.sql | 4 + jonah/scripts/upgrades/2006-01-01_release_date.sql | 3 + jonah/scripts/upgrades/2006-02-22_dates.sql | 8 + jonah/scripts/upgrades/2006-05-11_channel_page.sql | 3 + jonah/scripts/upgrades/2006-05-12_permalink.sql | 3 + jonah/scripts/upgrades/2007-06-07_tags.sql | 16 + .../upgrades/2008-08-22_add_channel_slugs.sql | 6 + .../upgrades/2008-08-22_add_story_authors.sql | 6 + .../scripts/upgrades/2008-12-17_add_full_feed.sql | 6 + jonah/stories/delete.php | 96 ++ jonah/stories/edit.php | 79 ++ jonah/stories/index.php | 134 +++ jonah/stories/pdf.php | 83 ++ jonah/stories/results.php | 125 ++ jonah/stories/share.php | 133 +++ jonah/stories/view.php | 113 ++ jonah/templates/.htaccess | 1 + jonah/templates/channels/index.html | 58 + jonah/templates/common-header.inc | 36 + jonah/templates/delivery/html.html | 27 + jonah/templates/delivery/rss.xml | 19 + jonah/templates/delivery/rss2.xml | 21 + jonah/templates/delivery/rss2_full.xml | 23 + jonah/templates/delivery/rss_full.xml | 21 + jonah/templates/main/main.html | 7 + jonah/templates/stories/index.html | 58 + jonah/templates/stories/share.html | 2 + jonah/templates/stories/story.html | 15 + jonah/templates/stories/view.html | 25 + jonah/test.php | 74 ++ jonah/themes/feed-rss.xsl | 83 ++ jonah/themes/graphics/atom.png | Bin 0 -> 254 bytes jonah/themes/graphics/az.png | Bin 0 -> 117 bytes jonah/themes/graphics/blog.png | Bin 0 -> 109 bytes jonah/themes/graphics/editstory.png | Bin 0 -> 308 bytes jonah/themes/graphics/favicon.ico | Bin 0 -> 1150 bytes jonah/themes/graphics/feed.png | Bin 0 -> 714 bytes jonah/themes/graphics/jonah.png | Bin 0 -> 308 bytes jonah/themes/graphics/lists.png | Bin 0 -> 223 bytes jonah/themes/graphics/new.png | Bin 0 -> 288 bytes jonah/themes/graphics/search.png | Bin 0 -> 794 bytes jonah/themes/graphics/story_marker.png | Bin 0 -> 89 bytes jonah/themes/graphics/za.png | Bin 0 -> 119 bytes jonah/themes/screen.css | 110 ++ 113 files changed, 16905 insertions(+) create mode 100644 jonah/.htaccess create mode 100644 jonah/LICENSE create mode 100644 jonah/README create mode 100644 jonah/channels/aggregate.php create mode 100644 jonah/channels/delete.php create mode 100644 jonah/channels/edit.php create mode 100644 jonah/channels/index.php create mode 100644 jonah/config/.cvsignore create mode 100644 jonah/config/.htaccess create mode 100644 jonah/config/conf.xml create mode 100644 jonah/config/templates.php.dist create mode 100644 jonah/delivery/.htaccess create mode 100644 jonah/delivery/html.php create mode 100644 jonah/delivery/index.php create mode 100644 jonah/delivery/rss.php create mode 100644 jonah/dispatcher.php create mode 100644 jonah/docs/CHANGES create mode 100644 jonah/docs/CREDITS create mode 100644 jonah/docs/INSTALL create mode 100644 jonah/docs/TODO create mode 100644 jonah/feed.php create mode 100644 jonah/index.php create mode 100644 jonah/lib/.htaccess create mode 100644 jonah/lib/Api.php create mode 100644 jonah/lib/Application.php create mode 100644 jonah/lib/Block/cloud.php create mode 100644 jonah/lib/Block/delivery.php create mode 100644 jonah/lib/Block/latest.php create mode 100644 jonah/lib/Block/news.php create mode 100644 jonah/lib/Block/news_popular.php create mode 100644 jonah/lib/Block/story.php create mode 100644 jonah/lib/Block/tree_menu.php create mode 100644 jonah/lib/Driver.php create mode 100644 jonah/lib/Driver/sql.php create mode 100644 jonah/lib/FeedParser.php create mode 100644 jonah/lib/Forms/Feed.php create mode 100644 jonah/lib/Forms/Story.php create mode 100644 jonah/lib/Jonah.php create mode 100644 jonah/lib/News.php create mode 100644 jonah/lib/News/sql.php create mode 100644 jonah/lib/base.php create mode 100644 jonah/lib/version.php create mode 100644 jonah/locale/.htaccess create mode 100644 jonah/locale/de_DE/LC_MESSAGES/jonah.mo create mode 100644 jonah/locale/en_US/help.xml create mode 100644 jonah/locale/es_ES/LC_MESSAGES/jonah.mo create mode 100644 jonah/locale/es_ES/help.xml create mode 100644 jonah/locale/fi_FI/LC_MESSAGES/jonah.mo create mode 100644 jonah/locale/fi_FI/help.xml create mode 100644 jonah/locale/fr_FR/LC_MESSAGES/jonah.mo create mode 100644 jonah/locale/nl_NL/LC_MESSAGES/jonah.mo create mode 100644 jonah/locale/ro_RO/LC_MESSAGES/jonah.mo create mode 100644 jonah/locale/tr_TR/LC_MESSAGES/jonah.mo create mode 100644 jonah/locale/zh_TW/LC_MESSAGES/jonah.mo create mode 100644 jonah/po/.htaccess create mode 100644 jonah/po/README create mode 100644 jonah/po/de_DE.po create mode 100644 jonah/po/es_ES.po create mode 100644 jonah/po/fi_FI.po create mode 100644 jonah/po/fr_FR.po create mode 100644 jonah/po/jonah.pot create mode 100644 jonah/po/nl_NL.po create mode 100644 jonah/po/ro_RO.po create mode 100644 jonah/po/tr_TR.po create mode 100644 jonah/po/zh_TW.po create mode 100644 jonah/scripts/.htaccess create mode 100755 jonah/scripts/feed_tester.php create mode 100644 jonah/scripts/sql/jonah.mssql.sql create mode 100644 jonah/scripts/sql/jonah.sql create mode 100644 jonah/scripts/upgrades/2005-03-13_release_date.sql create mode 100644 jonah/scripts/upgrades/2006-01-01_release_date.sql create mode 100644 jonah/scripts/upgrades/2006-02-22_dates.sql create mode 100644 jonah/scripts/upgrades/2006-05-11_channel_page.sql create mode 100644 jonah/scripts/upgrades/2006-05-12_permalink.sql create mode 100644 jonah/scripts/upgrades/2007-06-07_tags.sql create mode 100644 jonah/scripts/upgrades/2008-08-22_add_channel_slugs.sql create mode 100644 jonah/scripts/upgrades/2008-08-22_add_story_authors.sql create mode 100644 jonah/scripts/upgrades/2008-12-17_add_full_feed.sql create mode 100644 jonah/stories/delete.php create mode 100644 jonah/stories/edit.php create mode 100644 jonah/stories/index.php create mode 100644 jonah/stories/pdf.php create mode 100644 jonah/stories/results.php create mode 100644 jonah/stories/share.php create mode 100644 jonah/stories/view.php create mode 100644 jonah/templates/.htaccess create mode 100644 jonah/templates/channels/index.html create mode 100644 jonah/templates/common-header.inc create mode 100644 jonah/templates/delivery/html.html create mode 100644 jonah/templates/delivery/rss.xml create mode 100644 jonah/templates/delivery/rss2.xml create mode 100644 jonah/templates/delivery/rss2_full.xml create mode 100644 jonah/templates/delivery/rss_full.xml create mode 100644 jonah/templates/main/main.html create mode 100644 jonah/templates/stories/index.html create mode 100644 jonah/templates/stories/share.html create mode 100644 jonah/templates/stories/story.html create mode 100644 jonah/templates/stories/view.html create mode 100644 jonah/test.php create mode 100644 jonah/themes/feed-rss.xsl create mode 100644 jonah/themes/graphics/atom.png create mode 100644 jonah/themes/graphics/az.png create mode 100644 jonah/themes/graphics/blog.png create mode 100644 jonah/themes/graphics/editstory.png create mode 100644 jonah/themes/graphics/favicon.ico create mode 100644 jonah/themes/graphics/feed.png create mode 100644 jonah/themes/graphics/jonah.png create mode 100644 jonah/themes/graphics/lists.png create mode 100644 jonah/themes/graphics/new.png create mode 100644 jonah/themes/graphics/search.png create mode 100644 jonah/themes/graphics/story_marker.png create mode 100644 jonah/themes/graphics/za.png create mode 100644 jonah/themes/screen.css diff --git a/jonah/.htaccess b/jonah/.htaccess new file mode 100644 index 000000000..b37ff1e1b --- /dev/null +++ b/jonah/.htaccess @@ -0,0 +1,6 @@ + + RewriteEngine On + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^(.*)$ dispatcher.php/$1 [QSA,L] + diff --git a/jonah/LICENSE b/jonah/LICENSE new file mode 100644 index 000000000..bbcf72cad --- /dev/null +++ b/jonah/LICENSE @@ -0,0 +1,49 @@ +Version 1.0 + +Copyright 2001-2009 The Horde Project (http://www.horde.org/) +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. The end-user documentation included with the redistribution, if +any, must include the following acknowledgment: + + "This product includes software developed by the Horde Project + (http://www.horde.org/)." + +Alternately, this acknowledgment may appear in the software itself, if +and wherever such third-party acknowledgments normally appear. + +4. The names "Horde", "The Horde Project", and "Jonah" must not be +used to endorse or promote products derived from this software without +prior written permission. For written permission, please contact +core@horde.org. + +5. Products derived from this software may not be called "Horde" or +"Jonah", nor may "Horde" or "Jonah" appear in their name, without +prior written permission of the Horde Project. + +THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED 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 HORDE PROJECT OR ITS 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. + +This software consists of voluntary contributions made by many +individuals on behalf of the Horde Project. For more information on +the Horde Project, please see . diff --git a/jonah/README b/jonah/README new file mode 100644 index 000000000..9e815e25d --- /dev/null +++ b/jonah/README @@ -0,0 +1,39 @@ +Jonah +Version 0.1 + +What is Jonah? +-------------- + +Jonah is a portal system for displaying news and other data from +various sources, written in PHP and utilizing the Horde Application +Framework. + +This software is OSI Certified Open Source Software. +OSI Certified is a certification mark of the Open Source Initiative. + + +Jonah Documentation +------------------- + +LICENSE - Jonah's license +README - This file +docs/CHANGES - A list of changes by release +docs/CREDITS - Who developed this +docs/HELP - How you can help +docs/INSTALL - Installation instructions and notes + + +Now what? +--------- + +All installation documentation is located in the docs/ subdirectory + +You MUST have the Horde framework installed on your system before you +install Jonah. + +Read the docs/INSTALL file. It contains everything you need to know in +order to install Jonah on your system. (if it doesn't, it should, so yell at +us!) + +Enjoy, +The Jonah Team diff --git a/jonah/channels/aggregate.php b/jonah/channels/aggregate.php new file mode 100644 index 000000000..5baa99fe1 --- /dev/null +++ b/jonah/channels/aggregate.php @@ -0,0 +1,146 @@ + + */ + +@define('JONAH_BASE', dirname(__FILE__) . '/..'); +require_once JONAH_BASE . '/lib/base.php'; +require_once JONAH_BASE . '/lib/News.php'; +require_once 'Horde/Form.php'; +require_once 'Horde/Form/Renderer.php'; + +function _getLinks($id, $subid, $name, $title) +{ + $url = Horde::applicationUrl('channels/aggregate.php'); + $url = Horde_Util::addParameter($url, 'channel_id', $id); + $url = Horde_Util::addParameter($url, 'subchannel_id', $subid); + $edit = array('url' => Horde_Util::addParameter($url,'action', 'edit'), 'text' => sprintf(_("Edit channel \"%s\""), $name), 'title' => $title); + $delete = array('url' => Horde_Util::addParameter($url, 'action', 'delete'), 'text' => sprintf(_("Remove channel \"%s\""), $name), 'title' => $title); + return array($edit, $delete); +} + +$news = Jonah_News::factory(); +$renderer = new Horde_Form_Renderer(); +$vars = Horde_Variables::getDefaultVariables(); + +/* Set up some variables. */ +$channel_id = $vars->get('channel_id'); +$channel = $news->getChannel($channel_id); +if (is_a($channel, 'PEAR_Error')) { + Horde::fatal($channel, __FILE__, __LINE__); +} +$channel_name = $channel['channel_name']; +$ids = preg_split('/:/', $channel['channel_url'], -1, PREG_SPLIT_NO_EMPTY); + +/* Get the vars for channel type. */ +$channel_type = $channel['channel_type']; +if ($channel_type != JONAH_AGGREGATED_CHANNEL) { + $notification->push(_("This is no aggregated channel."), 'horde.error'); + header('Location: ' . Horde_Util::addParameter(Horde::applicationUrl('channels/edit.php', true), 'channel_id', $channel_id)); + exit; +} + +/* Check permissions and deny if not allowed. */ +if (!Jonah::checkPermissions(Jonah::typeToPermName($channel_type), Horde_Perms::EDIT, $channel_id)) { + $notification->push(_("You are not authorised for this action."), 'horde.warning'); + Horde::authenticationFailureRedirect(); +} + +/* Set up the form. */ +$form = new Horde_Form($vars, sprintf(_("Aggregated channels for channel \"%s\""), $channel_name), 'channel_aggregate'); +$form->setButtons(_("Add")); +$form->addHidden('', 'channel_id', 'int', false); +$form->addVariable(_("Channel Name"), 'channel_name', 'text', true); +$form->addVariable(_("Source URL"), 'channel_url', 'text', true, false, _("The url to use to fetch the stories, for example 'http://www.example.com/stories.rss'")); +$form->addVariable(_("Link"), 'channel_link', 'text', false); +$form->addVariable(_("Image"), 'channel_img', 'text', false); + +if ($form->validate($vars)) { + $subchannel = array('channel_url' => $vars->get('channel_url'), + 'channel_name' => $vars->get('channel_name'), + 'channel_link' => $vars->get('channel_link'), + 'channel_img' => $vars->get('channel_img'), + 'channel_type' => JONAH_EXTERNAL_CHANNEL); + if ($vars->get('subchannel_id')) { + $subchannel['channel_id'] = $vars->get('subchannel_id'); + } + $save = $news->saveChannel($subchannel); + if (is_a($save, 'PEAR_Error')) { + $notification->push(sprintf(_("There was an error saving the channel: %s"), $save->getMessage()), 'horde.error'); + } else { + $notification->push(sprintf(_("The channel \"%s\" has been saved."), $vars->get('channel_name')), 'horde.success'); + if (!$vars->get('subchannel_id')) { + $ids[] = $save; + $channel['channel_url'] = implode(':', $ids); + $save = $news->saveChannel($channel); + if (is_a($save, 'PEAR_Error')) { + $notification->push(sprintf(_("There was an error updating the channel: %s"), $save->getMessage()), 'horde.error'); + } else { + $notification->push(sprintf(_("The channel \"%s\" has been updated."), $channel['channel_name']), 'horde.success'); + } + } + + header('Location: ' . Horde_Util::addParameter(Horde::applicationUrl('channels/aggregate.php', true), 'channel_id', $channel_id)); + exit; + } +} elseif ($vars->get('action') == 'delete') { + $subchannel = $news->getChannel($vars->get('subchannel_id')); + $result = $news->deleteChannel($vars->get('subchannel_id')); + if (is_a($result, 'PEAR_Error')) { + $notification->push(sprintf(_("There was an error removing the channel: %s"), $result->getMessage()), 'horde.error'); + } else { + $notification->push(sprintf(_("The channel \"%s\" has been removed."), $subchannel['channel_name']), 'horde.success'); + array_splice($ids, array_search($subchannel['channel_id'], $ids), 1); + $channel['channel_url'] = implode(':', $ids); + $save = $news->saveChannel($channel); + if (is_a($save, 'PEAR_Error')) { + $notification->push(sprintf(_("There was an error updating the channel: %s"), $save->getMessage()), 'horde.error'); + } else { + $notification->push(sprintf(_("The channel \"%s\" has been updated."), $channel['channel_name']), 'horde.success'); + } + } + + header('Location: ' . Horde_Util::addParameter(Horde::applicationUrl('channels/aggregate.php', true), 'channel_id', $channel_id)); + exit; +} elseif ($vars->get('action') == 'edit') { + $form->addHidden('', 'subchannel_id', 'int', false); + $form->setButtons(_("Update")); + $subchannel = $news->getChannel($vars->get('subchannel_id')); + $vars->set('channel_name', $subchannel['channel_name']); + $vars->set('channel_url', $subchannel['channel_url']); + $vars->set('channel_link', $subchannel['channel_link']); + $vars->set('channel_img', $subchannel['channel_img']); +} + +foreach ($ids as $id) { + $subchannel = $news->getChannel($id); + if (is_a($subchannel, 'PEAR_Error')) { + $name = $subchannel->getMessage(); + $url = ''; + } elseif (empty($subchannel['channel_name'])) { + $name = $subchannel['channel_url']; + $url = $subchannel['channel_url']; + } else { + $name = $subchannel['channel_name']; + $url = $subchannel['channel_url']; + } + $form->insertVariableBefore('channel_name', '', 'subchannel' . $id, 'link', false, false, null, array(_getLinks($channel_id, $id, $name, $url))); +} + +$main = Horde_Util::bufferOutput(array($form, 'renderActive'), $renderer, $vars, 'aggregate.php', 'post'); + +$template = new Horde_Template(); +$template->set('main', $main); +$template->set('menu', Jonah::getMenu('string')); +$template->set('notify', Horde_Util::bufferOutput(array($notification, 'notify'), array('listeners' => 'status'))); + +require JONAH_TEMPLATES . '/common-header.inc'; +echo $template->fetch(JONAH_TEMPLATES . '/main/main.html'); +require $registry->get('templates', 'horde') . '/common-footer.inc'; diff --git a/jonah/channels/delete.php b/jonah/channels/delete.php new file mode 100644 index 000000000..ad55441a1 --- /dev/null +++ b/jonah/channels/delete.php @@ -0,0 +1,88 @@ + + * @author Marko Djukic + */ + +define('JONAH_BASE', dirname(__FILE__) . '/..'); +require_once JONAH_BASE . '/lib/base.php'; +require_once JONAH_BASE . '/lib/News.php'; +require_once 'Horde/Form.php'; +require_once 'Horde/Form/Renderer.php'; + +$news = Jonah_News::factory(); + +/* Set up the form variables and the form. */ +$vars = Horde_Variables::getDefaultVariables(); +$form_submit = $vars->get('submitbutton'); +$channel_id = $vars->get('channel_id'); + +$channel = $news->getChannel($channel_id); +if (is_a($channel, 'PEAR_Error')) { + $notification->push(_("Invalid channel specified for deletion."), 'horde.message'); + $url = Horde::applicationUrl('channels/index.php', true); + header('Location: ' . $url); + exit; +} + +/* Check permissions and deny if not allowed. */ +if (!Jonah::checkPermissions(Jonah::typeToPermName($channel['channel_type']), Horde_Perms::DELETE, $channel_id)) { + $notification->push(_("You are not authorised for this action."), 'horde.warning'); + Horde::authenticationFailureRedirect(); +} + +/* If not yet submitted set up the form vars from the fetched + * channel. */ +if (empty($form_submit)) { + $vars = new Horde_Variables($channel); +} + +$title = sprintf(_("Delete News Channel \"%s\"?"), $vars->get('channel_name')); +$form = new Horde_Form($vars, $title); + +$form->setButtons(array(_("Delete"), _("Do not delete"))); +$form->addHidden('', 'channel_id', 'int', true, true); + +$msg = _("Really delete this News Channel?"); +if ($vars->get('channel_type') == JONAH_INTERNAL_CHANNEL) { + $msg .= ' ' . _("All stories created in this channel will be lost!"); +} else { + $msg .= ' ' . _("Any cached stories for this channel will be lost!"); +} +$form->addVariable($msg, 'confirm', 'description', false); + +if ($form_submit == _("Delete")) { + if ($form->validate($vars)) { + $form->getInfo($vars, $info); + $delete = $news->deleteChannel($info); + if (is_a($delete, 'PEAR_Error')) { + $notification->push(sprintf(_("There was an error deleting the channel: %s"), $delete->getMessage()), 'horde.error'); + } else { + $notification->push(_("The channel has been deleted."), 'horde.success'); + $url = Horde::applicationUrl('channels/index.php', true); + header('Location: ' . $url); + exit; + } + } +} elseif (!empty($form_submit)) { + $notification->push(_("Channel has not been deleted."), 'horde.message'); + $url = Horde::applicationUrl('channels/index.php', true); + header('Location: ' . $url); + exit; +} + +$template = new Horde_Template(); +$template->set('main', Horde_Util::bufferOutput(array($form, 'renderActive'), new Horde_Form_Renderer(), $vars, 'delete.php', 'post')); +$template->set('menu', Jonah::getMenu('string')); +$template->set('notify', Horde_Util::bufferOutput(array($notification, 'notify'), array('listeners' => 'status'))); + +require JONAH_TEMPLATES . '/common-header.inc'; +echo $template->fetch(JONAH_TEMPLATES . '/main/main.html'); +require $registry->get('templates', 'horde') . '/common-footer.inc'; diff --git a/jonah/channels/edit.php b/jonah/channels/edit.php new file mode 100644 index 000000000..98e6b2549 --- /dev/null +++ b/jonah/channels/edit.php @@ -0,0 +1,91 @@ + + * @author Marko Djukic + */ + +@define('JONAH_BASE', dirname(__FILE__) . '/..'); +require_once JONAH_BASE . '/lib/base.php'; +require_once JONAH_BASE . '/lib/News.php'; +require_once JONAH_BASE . '/lib/Forms/Feed.php'; +require_once 'Horde/Form/Renderer.php'; + +$news = Jonah_News::factory(); + +/* Set up the form variables and the form. */ +$vars = Horde_Variables::getDefaultVariables(); +$form = new FeedForm($vars); + +/* Set up some variables. */ +$formname = $vars->get('formname'); +$channel_id = $vars->get('channel_id'); + +/* Form not yet submitted and is being edited. */ +if (!$formname && $channel_id) { + $vars = new Horde_Variables($news->getChannel($channel_id)); +} + +/* Get the vars for channel type. */ +$channel_type = $vars->get('channel_type'); +$old_channel_type = $vars->get('old_channel_type'); +$changed_type = false; + +/* Check permissions and deny if not allowed. */ +if (!Jonah::checkPermissions(Jonah::typeToPermName($channel_type), Horde_Perms::EDIT, $channel_id)) { + $notification->push(_("You are not authorised for this action."), 'horde.warning'); + Horde::authenticationFailureRedirect(); +} + +/* If this is null then new form, so set both to default. */ +if (is_null($channel_type)) { + $channel_type = Jonah_News::getDefaultType(); + $old_channel_type = $channel_type; +} + +/* Check if channel type has been changed and notify. */ +if ($channel_type != $old_channel_type && $formname) { + $changed_type = true; + $notification->push(_("Feed type changed."), 'horde.message'); +} +$vars->set('old_channel_type', $channel_type); + +/* Output the extra fields required for this channel type. */ +$form->setExtraFields($channel_type, $channel_id); + +if ($formname && !$changed_type) { + if ($form->validate($vars)) { + $form->getInfo($vars, $info); + $save = $news->saveChannel($info); + if (is_a($save, 'PEAR_Error')) { + $notification->push(sprintf(_("There was an error saving the feed: %s"), $save->getMessage()), 'horde.error'); + } else { + $notification->push(sprintf(_("The feed \"%s\" has been saved."), $info['channel_name']), 'horde.success'); + if ($channel_type == JONAH_AGGREGATED_CHANNEL) { + $notification->push(_("You can now edit the sub-feeds."), 'horde.message'); + } else { + header('Location: ' . Horde::applicationUrl('channels/index.php', true)); + exit; + } + } + } +} + +$renderer = new Horde_Form_Renderer(); +$main = Horde_Util::bufferOutput(array($form, 'renderActive'), $renderer, $vars, 'edit.php', 'post'); + +$template = new Horde_Template(); +$template->set('main', $main); +$template->set('menu', Jonah::getMenu('string')); +$template->set('notify', Horde_Util::bufferOutput(array($notification, 'notify'), array('listeners' => 'status'))); + +$title = $form->getTitle(); +require JONAH_TEMPLATES . '/common-header.inc'; +echo $template->fetch(JONAH_TEMPLATES . '/main/main.html'); +require $registry->get('templates', 'horde') . '/common-footer.inc'; diff --git a/jonah/channels/index.php b/jonah/channels/index.php new file mode 100644 index 000000000..7d6dde326 --- /dev/null +++ b/jonah/channels/index.php @@ -0,0 +1,99 @@ + + * @author Marko Djukic + */ + +@define('JONAH_BASE', dirname(__FILE__) . '/..'); +require_once JONAH_BASE . '/lib/base.php'; +require_once JONAH_BASE . '/lib/News.php'; + +if (!Jonah::checkPermissions('jonah:news', Horde_Perms::EDIT)) { + $notification->push(_("You are not authorised for this action."), 'horde.warning'); + Horde_Auth::authenticateFailure(); +} + +$have_news = Jonah_News::getAvailableTypes(); +if (empty($have_news)) { + $notification->push(_("News is not enabled."), 'horde.warning'); + $url = Horde::applicationUrl('index.php', true); + header('Location: ' . $url); + exit; +} + +$news = Jonah_News::factory(); + +$channels = $news->getChannels(array_keys($have_news)); +if (is_a($channels, 'PEAR_Error')) { + $notification->push(sprintf(_("An error occurred fetching channels: %s"), $channels->getMessage()), 'horde.error'); + $channels = false; +} elseif ($channels) { + $channels = Jonah::checkPermissions('channels', Horde_Perms::SHOW, $channels); + /* Build channel specific fields. */ + foreach ($channels as $key => $channel) { + /* Edit channel link. */ + $url = Horde::applicationUrl('channels/edit.php'); + $url = Horde_Util::addParameter($url, 'channel_id', $channel['channel_id']); + $channels[$key]['edit_link'] = Horde::link($url, _("Edit channel"), '', '', '', _("Edit channel")) . Horde::img('edit.png', _("Edit channel"), '', $registry->getImageDir('horde')) . ''; + + /* Delete channel link. */ + $url = Horde::applicationUrl('channels/delete.php'); + $url = Horde_Util::addParameter($url, 'channel_id', $channel['channel_id']); + $channels[$key]['delete_link'] = Horde::link($url, _("Delete channel"), '', '', '', _("Delete channel")) . Horde::img('delete.png', _("Delete channel"), null, $registry->getImageDir('horde')) . ''; + + /* View stories link. */ + $url = Horde::applicationUrl('stories/index.php'); + $url = Horde_Util::addParameter($url, 'channel_id', $channel['channel_id']); + $channels[$key]['stories_url'] = $url; + + /* Channel type specific links. */ + $channels[$key]['addstory_link'] = ''; + $channels[$key]['refresh_link'] = ''; + + switch ($channel['channel_type']) { + case JONAH_INTERNAL_CHANNEL: + /* Add story link. */ + $url = Horde::applicationUrl('stories/edit.php'); + $url = Horde_Util::addParameter($url, 'channel_id', $channel['channel_id']); + $channels[$key]['addstory_link'] = Horde::link($url, _("Add story"), '', '', '', _("Add story")) . Horde::img('new.png', _("Add story")) . ''; + break; + + case JONAH_EXTERNAL_CHANNEL: + case JONAH_AGGREGATED_CHANNEL: + /* Refresh cache link. */ + $url = Horde::applicationUrl('stories/index.php'); + $url = Horde_Util::addParameter($url, array('channel_id' => $channel['channel_id'], 'refresh' => '1', 'url' => Horde::selfUrl())); + $channels[$key]['refresh_link'] = Horde::link($url, _("Refresh channel"), '', '', '', _("Refresh channel")) . Horde::img('reload.png', _("Refresh channel"), '', $registry->getImageDir('horde')) . ''; + break; + } + + $channels[$key]['channel_type'] = Jonah::getChannelTypeLabel($channel['channel_type']); + /* TODO: pref setting for date display. */ + $channels[$key]['channel_updated'] = ($channel['channel_updated'] ? date('M d, Y H:i', (int)$channel['channel_updated']) : '-'); + } +} + +$template = new Horde_Template(); +$template->set('header', _("Manage Feeds")); +$template->set('listheaders', array(array('attrs' => ' class="sortdown"', 'label' => _("Name")), + array('attrs' => '', 'label' => _("Type")), + array('attrs' => '', 'label' => _("Last Update")))); +$template->set('channels', $channels, true); +$template->set('menu', Jonah::getMenu('string')); +$template->set('search_img', Horde::img('search.png', _("Search"), '', $registry->getImageDir('horde'))); +$template->set('notify', Horde_Util::bufferOutput(array($notification, 'notify'), array('listeners' => 'status'))); + +$title = _("Feeds"); +Horde::addScriptFile('prototype.js', 'horde', true); +Horde::addScriptFile('tables.js', 'horde', true); +Horde::addScriptFile('QuickFinder.js', 'horde', true); +require JONAH_TEMPLATES . '/common-header.inc'; +echo $template->fetch(JONAH_TEMPLATES . '/channels/index.html'); +require $registry->get('templates', 'horde') . '/common-footer.inc'; diff --git a/jonah/config/.cvsignore b/jonah/config/.cvsignore new file mode 100644 index 000000000..1f9749f8d --- /dev/null +++ b/jonah/config/.cvsignore @@ -0,0 +1,5 @@ +conf.php +conf.bak.php +prefs.php +routes.local.php +templates.php diff --git a/jonah/config/.htaccess b/jonah/config/.htaccess new file mode 100644 index 000000000..3a4288278 --- /dev/null +++ b/jonah/config/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/jonah/config/conf.xml b/jonah/config/conf.xml new file mode 100644 index 000000000..329213653 --- /dev/null +++ b/jonah/config/conf.xml @@ -0,0 +1,54 @@ + + + + + + Feed Settings + external + + external + internal + aggregated + composite + + + + + sql + + + + + + + + + + + text + richtext + links + + + + + + Story Sharing + true + + + + Story Comments + true + + + + Menu Settings + + + + + + + + diff --git a/jonah/config/templates.php.dist b/jonah/config/templates.php.dist new file mode 100644 index 000000000..044376f74 --- /dev/null +++ b/jonah/config/templates.php.dist @@ -0,0 +1,59 @@ + _("Standard"), + 'template' => ' + + + + + + + +
'); + +$templates['media'] = array('name' => _("Media"), + 'template' => ' + + + + + + + +
'); + +$templates['internal'] = array('name' => _("Internal"), + 'template' => ' + + + + + + + +
'); + +$templates['compact'] = array('name' => _("Compact"), + 'template' => ' + + + + + + + +
'); + +$templates['ultracompact'] = array('name' => _("Ultracompact"), + 'template' => ' + + +:: + +'); diff --git a/jonah/delivery/.htaccess b/jonah/delivery/.htaccess new file mode 100644 index 000000000..786838299 --- /dev/null +++ b/jonah/delivery/.htaccess @@ -0,0 +1,6 @@ + + RewriteEngine On + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^(.*)$ index.php/$1 [QSA,L] + diff --git a/jonah/delivery/html.php b/jonah/delivery/html.php new file mode 100644 index 000000000..f7ca0486b --- /dev/null +++ b/jonah/delivery/html.php @@ -0,0 +1,70 @@ + + */ + +$session_control = 'readonly'; +@define('AUTH_HANDLER', true); +@define('JONAH_BASE', dirname(__FILE__) . '/..'); +require_once JONAH_BASE . '/lib/base.php'; +require_once JONAH_BASE . '/lib/News.php'; +require JONAH_BASE . '/config/templates.php'; + +// TODO - check if a user, have button to add channel to their +// personal aggregated channel. + +$news = Jonah_News::factory(); + +/* Get the id and format of the channel to display. */ +$criteria = Horde_Util::nonInputVar('criteria'); +if (!$criteria) { + $criteria['channel_id'] = Horde_Util::getFormData('channel_id'); + $criteria['channel_format'] = Horde_Util::getFormData('format'); +} + +if (empty($criteria['channel_format'])) { + // Select the default channel format + $criteria['channel_format'] = key($templates); +} + +/* Get requested channel. */ +$channel = $news->getChannel($criteria['channel_id']); +if (is_a($channel, 'PEAR_Error')) { + Horde::logMessage($channel, __FILE__, __LINE__, PEAR_LOG_ERR); + $notification->push(_("Invalid channel."), 'horde.error'); + $url = Horde::applicationUrl('delivery/index.php', true); + header('Location: ' . $url); + exit; +} + +$title = sprintf(_("HTML Delivery for \"%s\""), $channel['channel_name']); + +$options = array(); +foreach ($templates as $key => $info) { + $options[] = ''; +} + +$template = new Horde_Template(); +$template->setOption('gettext', 'true'); +$template->set('url', Horde::selfUrl()); +$template->set('session', Horde_Util::formInput()); +$template->set('channel_id', $criteria['channel_id']); +$template->set('channel_name', $channel['channel_name']); +$template->set('format', $criteria['channel_format']); +$template->set('options', $options); +$template->set('stories', $news->renderChannel($criteria['channel_id'], $criteria['channel_format'])); +$template->set('menu', Jonah::getMenu('string')); +$template->set('notify', Horde_Util::bufferOutput(array($notification, 'notify'), array('listeners' => 'status'))); + +require JONAH_TEMPLATES . '/common-header.inc'; +echo $template->fetch(JONAH_TEMPLATES . '/delivery/html.html'); +require $registry->get('templates', 'horde') . '/common-footer.inc'; diff --git a/jonah/delivery/index.php b/jonah/delivery/index.php new file mode 100644 index 000000000..d0013a054 --- /dev/null +++ b/jonah/delivery/index.php @@ -0,0 +1,68 @@ + + */ + +$parts = explode('/', Horde_Util::getPathInfo()); +$lastpart = null; +$deliverytype = null; +$criteria = array(); +foreach ($parts as $part) { + if (empty($part)) { + // Double slash in the URL path. Ignore this empty part. + continue; + } + + switch($part) { + case 'html': + case 'rss': + $deliveryType = $part; + break; + + case 'type': + // Feed type is specially mangled + $lastpart = 'feed_type'; + break; + + case 'format': + // Format is specially mangled + $lastpart = 'channel_format'; + break; + + case 'author': + case 'channel_format': + case 'tag': + case 'tag_id': + case 'story': + case 'story_id': + case 'channel': + case 'channel_id': + $lastpart = $part; + break; + + default: + if (!empty($lastpart)) { + $criteria[$lastpart] = $part; + $lastpart = null; + } else { + // An unknown directive + Horde::logMessage("Malformed request URL: " . Horde_Util::getPathInfo(), + __FILE__, __LINE__, PEAR_LOG_WARNING); + exit; + } + break; + } +} + +if (empty($deliveryType)) { + $deliveryType = 'html'; +} + +include dirname(__FILE__) . '/' . basename($deliveryType) . '.php'; diff --git a/jonah/delivery/rss.php b/jonah/delivery/rss.php new file mode 100644 index 000000000..7d2f37fe6 --- /dev/null +++ b/jonah/delivery/rss.php @@ -0,0 +1,98 @@ + + */ + +$session_control = 'readonly'; +@define('AUTH_HANDLER', true); +@define('JONAH_BASE', dirname(__FILE__) . '/..'); +require_once JONAH_BASE . '/lib/base.php'; +require_once JONAH_BASE . '/lib/News.php'; +require_once JONAH_BASE . '/lib/version.php'; + +$news = Jonah_News::factory(); + +// See if the criteria has already been loaded by the index page +$criteria = Horde_Util::nonInputVar('criteria'); +if (!$criteria) { + $criteria = array(); + $criteria['channel_id'] = Horde_Util::getFormData('channel_id'); + $criteria['tag_id'] = Horde_Util::getFormData('tag_id'); + $criteria['feed_type'] = basename(Horde_Util::getFormData('type')); +} + +if (empty($criteria['feed_type'])) { + // If not specified, default to RSS2 + $criteria['feed_type'] = 'rss2'; +} + +/* Fetch the channel info and the story list and check they are both valid. + * Do a simple exit in case of errors. */ + + +$channel = $news->getChannel($criteria['channel_id']); +if (is_a($channel, 'PEAR_Error')) { + Horde::logMessage($channel, __FILE__, __LINE__, PEAR_LOG_ERR); + header('HTTP/1.0 404 Not Found'); + echo ' + +404 Not Found + +

Not Found

+

The requested feed (' . htmlspecialchars($criteria['channel_id']) . ') was not found on this server.

+'; + exit; +} + +/* Check for a tag search. */ +if (!empty($criteria['tag_id'])) { + $tag_name = array_shift($news->getTagNames(array($criteria['tag_id']))); + $stories = $news->searchTagsById(array($criteria['tag_id']), 10, 0, array($criteria['channel_id'])); +} else { + $stories = $news->getStories($criteria['channel_id'], 10, 0, false, time()); +} +if (is_a($stories, 'PEAR_Error')) { + Horde::logMessage($stories, __FILE__, __LINE__, PEAR_LOG_ERR); + $stories = array(); +} + + +$template = new Horde_Template(); +$template->set('charset', Horde_Nls::getCharset()); +$template->set('jonah', 'Jonah ' . JONAH_VERSION . ' (http://www.horde.org/jonah/)'); +$template->set('xsl', $registry->get('themesuri') . '/feed-rss.xsl'); +if (!empty($criteria['tag_id'])) { + $template->set('channel_name', sprintf(_("Stories tagged with %s in %s"), $tag_name, @htmlspecialchars($channel['channel_name'], ENT_COMPAT, Horde_Nls::getCharset()))); +} else { + $template->set('channel_name', @htmlspecialchars($channel['channel_name'], ENT_COMPAT, Horde_Nls::getCharset())); +} +$template->set('channel_desc', @htmlspecialchars($channel['channel_desc'], ENT_COMPAT, Horde_Nls::getCharset())); +$template->set('channel_updated', htmlspecialchars(date('r', $channel['channel_updated']))); +$template->set('channel_official', htmlspecialchars($channel['channel_official'])); +$template->set('channel_rss', htmlspecialchars(Horde_Util::addParameter(Horde::applicationUrl('delivery/rss.php', true, -1), array('type' => 'rss', 'channel_id' => $channel['channel_id'])))); +$template->set('channel_rss2', htmlspecialchars(Horde_Util::addParameter(Horde::applicationUrl('delivery/rss.php', true, -1), array('type' => 'rss2', 'channel_id' => $channel['channel_id'])))); +foreach ($stories as &$story) { + $story['story_title'] = @htmlspecialchars($story['story_title'], ENT_COMPAT, Horde_Nls::getCharset()); + $story['story_desc'] = @htmlspecialchars($story['story_desc'], ENT_COMPAT, Horde_Nls::getCharset()); + $story['story_link'] = htmlspecialchars($story['story_link']); + $story['story_permalink'] = (isset($story['story_permalink']) ? htmlspecialchars($story['story_permalink']) : ''); + $story['story_published'] = htmlspecialchars(date('r', $story['story_published'])); + if (!empty($story['story_body_type']) && $story['story_body_type'] == 'text') { + $story['story_body'] = Horde_Text_Filter::filter($story['story_body'], 'text2html', array('parselevel' => Horde_Text_Filter_Text2html::MICRO, 'class' => null)); + } +} +$template->set('stories', $stories); + +$browser->downloadHeaders($channel['channel_name'] . '.rss', 'text/xml', true); +$tpl = JONAH_TEMPLATES . '/delivery/' . $criteria['feed_type']; +if (!empty($channel['channel_full_feed'])) { + $tpl .= '_full'; +} +echo $template->fetch($tpl . '.xml'); diff --git a/jonah/dispatcher.php b/jonah/dispatcher.php new file mode 100644 index 000000000..428c5090b --- /dev/null +++ b/jonah/dispatcher.php @@ -0,0 +1,150 @@ + + */ +$session_control = 'readonly'; +@define('AUTH_HANDLER', true); +@define('JONAH_BASE', dirname(__FILE__)); +require_once JONAH_BASE . '/lib/base.php'; +require_once JONAH_BASE . '/lib/News.php'; +require JONAH_BASE . '/config/templates.php'; + +// Grab, and hopefully match, the URL +$url = Horde_Util::getPathInfo(); +parse_str($_SERVER['QUERY_STRING'], $args); +Horde_Util::dispelMagicQuotes($args); + +$criteria = array(); +$result = $m->match($url); +if (isset($result['controller']) && $result['controller'] == 'admin') { + // Insert admin controllers here. +} elseif (isset($result['feed'])) { + // Default settings + $defaults = array( + 'format' => 'html', + 'feed' => $result['feed'], + ); + + // Check for the format specification + if ($pos = strrpos($result['feed'], '.')) { + $criteria['feed'] = substr($result['feed'], 0, $pos); + $criteria['format'] = substr($result['feed'], $pos + 1); + } + + if (!empty($result['filter'])) { + switch ($result['filter']) { + case 'author': + $criteria['author'] = $result['value']; + break; + + case 'date': + if (preg_match('/\d{4}-\d{1,2}/', $result['value'])) { + list($year, $month) = explode('-', $result['value']); + $criteria['updated-min'] = new Horde_Date(array( + 'month' => $month, + 'year' => $year)); + // Set the end date to the end of the requested month + $criteria['updated-max'] = new Horde_Date(array( + 'month' => ++$month, + 'year' => $year)); + $criteria['updated-max']->sec--; + $criteria['updated-max']->correct(); + break; + } + + case 'tag': + $criteria['tags'] = array($result['value']); + break; + } + } + + if (isset($args['tags'])) { + if (strpos($args['tags'], '|') !== false) { + // We have an OR list of tags + $criteria['tags'] = explode('|', $args['tags']); + } elseif (strpos($args['tags'], ',') !== false) { + // We have an AND list of tags + $criteria['alltags'] = explode(',', $args['tags']); + } else { + // Just a single tag + $criteria['tags'] = array($args['tags']); + } + } + unset($args['tags']); + + // These dates are expected to be in RFC 3339 format + if (isset($args['updated-min'])) { + $criteria['updated-min'] = new Horde_Date($args['updated-min']); + unset($args['updated-min']); + } + if (isset($args['updated-max'])) { + $criteria['updated-max'] = new Horde_Date($args['updated-max']); + unset($args['updated-max']); + } + if (isset($args['published-min'])) { + $criteria['published-min'] = new Horde_Date($args['published-min']); + unset($args['published-min']); + } + if (isset($args['published-max'])) { + $criteria['published-max'] = new Horde_Date($args['published-max']); + unset($args['published-max']); + } + + // Parse keyword search arguments + $keywords = array(); + $notkeywords = array(); + if (isset($args['q'])) { + $query = $args['q']; + + // Look for quoted strings + while (($quotepos = strpos($query, '"')) !== false) { + if ($quotepos !== 0) { + $keywords = array_merge(explode(' ', substr($query, 0, $quotepos)), $keywords); + $query = substr($query, $quotepos); + } + + $keywords[] = substr($query, 1, strpos($query, '"', 1) - 1); + $query = substr($query, 1); + $query = substr($query, strpos($query, '"', 1) + 1); + } + + // Split up any remaining text into keywords + $keywords = array_merge(explode(' ', $query), $keywords); + + // Remove duplicates and empty values + $keywords = array_flip($keywords); + unset ($keywords['']); + $keywords = array_flip($keywords); + + // We're done with 'q'. Unset it to prevent it being copied into + // $criteria below. + unset($args['q']); + + foreach ($keywords as $index => $keyword) { + if (substr($keyword, 0, 1) == '-') { + $notkeywords[] = substr($keyword, 1); + unset($keywords[$index]); + } + } + + // Save the criteria + if (!empty($keywords)) { + $criteria['keywords'] = $keywords; + } + if (!empty($notkeywords)) { + $criteria['notkeywords'] = $notkeywords; + } + } + + // Preserve remaining args + $criteria = array_merge($defaults, $args, $criteria); + + require dirname(__FILE__) . '/feed.php'; +} diff --git a/jonah/docs/CHANGES b/jonah/docs/CHANGES new file mode 100644 index 000000000..52874d1a8 --- /dev/null +++ b/jonah/docs/CHANGES @@ -0,0 +1,102 @@ +---- +v0.1 +---- + +[jan] Enable output compression. +[cjh] Remove the Jonah-specific portal (Bug #7584). +[cjh] Add support for full-content feeds (Request #6400). +[cjh] Remove delivery lists. +[jan] Add Turkish translation (METU ). +[mjr] Add a media block for displaying feeds containing media namespace nodes. +[mjr] Add support for parsing the media namespace extensions to RSS 2.0 feeds. +[mjr] Add searchTag api support to allow other applications to list tags and + perform tag searches of Jonah resources. +[mjr] Add tagging support for internal channels. +[cjh] Allow the story and latest blocks to count story reads. +[cjh] Add PDF generation of stories. +[cjh] Detect charset information from XML prologue as well as the + Content-Type header (s_gatterbauer@idlm.net, Bug #4340). +[jan] Add RSS 2.0 feed generator. +[jan] Add permalink field for stories. +[jan] Add URL field to channel configuration for paged story lists. +[cjh] Deliver RSS feeds in a way that supports USM + (http://www.kbcafe.com/rss/usm.html, Request #2593). +[cjh] Standardize the date fields for stories with an updated field that is + always the timestamp that the story was last modified, and a published + field which is controlled by the author and determines the release date. +[ben] Better support for MS-SQL. +[cjh] Use Horde_Block_Layout_View for the My News page. +[cjh] Add jonah:admin permission (tevans@tachometry.com, Bug #2571). +[cjh] Add internal template type for internal stories (tevans@tachometry.com, + Bug #2571). +[cjh] Add a block for showing the latest story from an internal channel + (Roel Gloudemans ). +[cjh] Initial feeds script now uses Jonah objects to do feed + creation to avoid sequence problems. +[jan] Add Dutch translation (Resan Sa-Ardnuam ). +[cjh] Initial Atom feed support (Bug #1581). +[jan] Add support for release dates. +[jan] Show links to internal channels in sidebar menu. +[jan] Allow comments on stories. +[jan] Add support for composite channels. +[jan] Allow to specify an alternative story URL. +[jan] Track how many times a story was read. +[jan] Add support for aggregating channels. +[jon] Add the ability to share stories with friends via email. +[mdj] newsfeed.php is no longer used, now there is a /delivery/ directory + offering for now the RSS feed as before and an email delivery. +[mdj] Added option for HTML composition of stories. +[cjh] Stocks code has been moved to Juno. +[cjh] Remove the last weather code from Jonah. +[cjh] Remove METAR code in favor of the Horde-level METAR block. +[jan] Add Romanian translation (Eugen Hoanca ). +[jan] Add Finnish translation (Leena Heino ). +[cjh] Clean up Jonah_Headlines:: to require fewer special cases. +[cjh] Move all channel HTML generation over to Horde_Template:: +[cjh] Add an RSS generation class. +[cjh] Start adding news-authoring capabilities. +[jan] Add German translation. +[cjh] Add option of using a DB to store weather stations + (Ben Scott ). +[cjh] Add the option to update a channel by executing a script + (Mario Andres Yepes C ). +[jan] Add Traditional Chinese translation (Chih-Wei Yeh + ). +[cjh] Add a preference for using metric units + (Tim Gorter ). +[cjh] Revamp headline management and subscriptions; add multiple sizes + for each channel, add weather and stock support, and many more + channels (Eric Rechlin ). +[cjh] Add a Block system and an experimental portal-like interface. +[cjh] Add menu to all pages. +[cjh] Add user preference for which channels to display. +[cjh] License is the Horde BSD license. +[cjh] Close a potential problem with register_globals On and $js_onLoad. +[cjh] Don't redirect from backend.php to any login screen; either + authentication is there, or we exit(). +[cjh] Use JONAH_TEMPLATES constant for all template paths. +[cjh] Use $registry->get() for all Registry information. +[cjh] Update cli-backend.php so that it can actually be useful. +[cjh] Use Horde admin settings. +[max] Greatly modernize and update. +[avsm] Replace $conf['paths'] with the $registry equivalents. +[cjh] Get rid of package.HTMLDocument.php use. + + +------ +v0.0.2 +------ + +[cjh] Everything now works with call-time pass-by-reference disabled, and + with the current state of XML in php4. +[cjh] Added a simple update.sh script that can be run from cron. +[cjh] The backend can now be restricted with username/password or by IP. +[cjh] Updated test.php to recognize php4 stable releases. + + +------ +v0.0.1 +------ + +[cjh] More or less complete documentation. +[cjh] Supports RSS and My.Userland site summary files. diff --git a/jonah/docs/CREDITS b/jonah/docs/CREDITS new file mode 100644 index 000000000..639034801 --- /dev/null +++ b/jonah/docs/CREDITS @@ -0,0 +1,39 @@ +======================== + Jonah Development Team +======================== + + +Core Developers +=============== + +Chuck Hagenbuch + +- original concept +- original code + +Jan Schneider + +- composite channels +- aggregator +- comments + +Jon Parise + +- documentation +- testing + + +Localization +============ + +===================== ====================================================== +Chinese Traditional Chih-Wei Yeh +Dutch Resan Sa-Ardnuam +Finnish Leena Heino +French Eric Rostetter +German Jan Schneider +Romanian Eugen Hoanca +Spanish Mario Andrés Yepes C + Manuel Perez Ayala +Turkish Middle East Technical University +===================== ====================================================== diff --git a/jonah/docs/INSTALL b/jonah/docs/INSTALL new file mode 100644 index 000000000..9f699d0ca --- /dev/null +++ b/jonah/docs/INSTALL @@ -0,0 +1,234 @@ +========================== +|| INSTALLING Jonah 0.1 || +========================== + +This document contains instructions for installing the Jonah software +on your system. + +For information on the capabilities and features of Jonah, see +the file README in the top-level directory of the distribution. + + +Obtaining Jonah +~~~~~~~~~~~~~~~ + +Jonah can be obtained from the Horde website and FTP server, at + + http://www.horde.org/jonah/ + ftp://ftp.horde.org/pub/jonah/ + +Bleeding-edge development versions of Jonah are available via CVS; see +the file docs/HACKING in the Horde distribution for information on +accessing the Horde CVS repository. + + +PREREQUISITES +~~~~~~~~~~~~~ + +To function properly, Jonah REQUIRES the following: + + 1. A working Horde installation. + + Jonah runs within the Horde Application Framework, a set of + common tools for Web applications written in PHP. You must + install Horde before installing Jonah. + + The Horde Framework can be obtained from the Horde website and + FTP server, at + + http://www.horde.org/horde/ + ftp://ftp.horde.org/pub/horde/ + + Many of Jonah's prerequisites are also Horde prerequisites. + Be sure to have completed all of the steps in the INSTALL + file for the Horde Framework before installing Jonah. + + 2. The following PHP capabilities: + + For the released tarball versions, you will require + a working php 3 or 4 install with working XML support + and fopen-wrappers enabled. + + For the CVS version, you will require a working php version + 4.2.0 or better, with XML and fopen-wrappers enabled. + + +Installing Jonah +~~~~~~~~~~~~~~~~ + +Jonah is written in PHP, and must be installed in a web-accessible +directory. The precise location of this directory will differ from +system to system. Conventionally, Jonah is installed directly underneath +Horde in the web server's document tree. + +Since Jonah is written in PHP, there is no compilation necessary; +simply expand the distribution where you want it to reside and rename +the root directory of the distribution to whatever you wish to appear +in the URL. For example, with the Apache web server's default document +root of '/usr/local/apache/htdocs', you would type: + + cd /usr/local/apache/htdocs/horde + tar zxvf /path/to/jonah-0.0.2.tar.gz + mv jonah-0.0.2 jonah + +and would then find Jonah at the URL + + http://your-server/horde/jonah/ + +At this point, you should probably point your browser at your Jonah's test +page at http://your.server/horde/jonah/test.php. It will run some checks +on the version of php you're running, whether or not you have XML support, +miscellaneous php settings, and whether or not the config files are in the +right places. + +Unless you've skipped ahead, it'll complain about not finding the config +files. If no other problems are reported, continue on to the next section +on configuring Jonah. If it finds other problems on the test page, you +should correct them first before proceeding. + + +CONFIGURING Jonah +~~~~~~~~~~~~~~~~~ + +1. Configuring Horde for Jonah + + a. Register the application + + You will first need to add a jonah stanza to your version of the + horde/config/registry.php file. Edit this file, and add the + following stanza where appropriate (after the other entries like it + or between existing stanzas to position it in the menu where you + like): + +$this->applications['jonah'] = array( + 'fileroot' => dirname(__FILE__) . '/../jonah', + 'webroot' => $this->applications['horde']['webroot'] . '/jonah', + 'icon' => $this->applications['horde']['webroot'] . '/jonah/graphics/jonah.png', + 'name' => _("Jonah"), + 'status' => 'active' +); + + If you have changed the location of Jonah relative to Horde, + either in the URL or in the file system or both, you must + update the 'fileroot' and/or 'webroot' settings to their correct + values. + +2. Configuring Jonah + + To configure Jonah, change to the config/ directory of the + installed distribution, and make copies of all of the configuration + "dist" files without the "dist" suffix. An example of how to copy + the files on a unix based system is: + + cd config/ + for foo in *.dist; do cp $foo `basename $foo .dist`; done + + Documentation on the format and purpose of those files can be found in + each file. You may edit these files if you wish to customize Jonah's + appearance and behavior. The default values, while reasonable, may not + be appropriate for your site, so it is best to check them and make any + desired changes before proceeding. Some important files and their + contents are: + + You must then login to Horde as a Horde Administrator to finish the + configuration of Jonah. Use the Horde "Administration" menu item to get + the the Administration page, and then on the click on the "Configuration" + icon to get the Configuration page. Select "Headlines" from the selection + list of applications, and click on the "Configure" button. Fill in or + change any configuration values as needed. When done click on "Generate + Headlines Configuration" to generate the conf.php file. If your web server + doesn't have write permissions to the Jonah configuration directory or + file, it will not be able to write the file. In this case, cut and + paste the returned configuration information into the file + jonah/config/conf.php. + + Note for international users: Jonah uses GNU gettext to provide local + translations of text displayed by applications; the translations are + found in the po/ directory. If a translation is not yet available + for your locale (and you wish to create one), or if you're having + trouble using a provided translation, please see the + horde/docs/TRANSLATIONS file for instructions. + + (a). prefs.php + + This file contains all the preferences and their default values. + Reasons you might edit this are to change default values or to + lock preferences so the user can't change them. + + (b). templates.php + + This file defines the formatting templates used to display the + channels for various layout styles. You will probably not want + to modify this file. + + (c). conf.php or conf.xml + This file contains the general configuration for Jonah, such as + sql settings, expiration settings, etc. + + For CVS HEAD, You must login to Horde as a Horde Administrator to + finish the configuration of Jonah. Use the Horde "Administration" + menu item to get to the Administration page, and then click on the + "Configuration" icon to get the Configuration page. Select Jonah + from the selection list of applications, and click on the + "Configure" button. Fill in or change any configuration values as + needed. When done click on "Generate Jonah Configuration" to + generate the conf.php file. If your web server doesn't have write + permissions to the jonah configuration directory or file, it will + not be able to write the file. In this case, cut and paste the + returned configuration information in the file jonah/config/conf.php. + + +OBTAINING SUPPORT +----------------- + +If you encounter problems with Jonah, help is available! + +The Horde Frequently Asked Questions List (FAQ), available on the Web +at + + http://www.horde.org/faq/ + +The Horde Project runs a number of mailing lists, for individual +applications and for issues relating to the project as a whole. +Information, archives, and subscription information can be found at + + http://www.horde.org/mail/ + +Lastly, Horde developers, contributors and users may also be found on IRC, +on the channel #horde on the Freenode Network (irc.freenode.net). + +Please keep in mind that Jonah is free software written by volunteers. +For information on reasonable support expectations, please read + + http://www.horde.org/support.php + +Thanks for using Jonah! + +The Jonah team + +QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQU$QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ +QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ2.)UQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ +QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQXt -QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ +QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQt )$WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ +QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ- -. ]QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ +QQQQQQQQQQWQQQQWQQQQWQQQQWQQQQWQQQQW@( y.._wZQ#Kvv>*-??YY*?TYT$QQWQQQQWQQQQWQQ +QQQQQQQWQQQQQWQQQQWQQQQWQQQQWQQQQ@?CmWIliimw;vI==n.::+W7?T#WWWmwg:+-~"T9QQWQQQQ +QQQQQQQQQQWQQQQQQQQQQQQQQQQQ@TZ}^+==;==+|??+i=nt +:::::- _._.XI---v +o$QQQQQ +QQQQQQWQQQQQQQQQWQQQWQQWQ@?n`W =ii:--:-+|:.==---==:::wawyWWWWWWWmW##agggvI=+:-:::::::::::::::::::::-n]WWWWW##ZZXnliisaxgQQQQQQ +QQQQQQQWQQQQQQQQQQQWP\?|__X-:::::::::::::::::::::::::=]###XXS1xliiQxwqmQQQQQQQQ +QQQQQQWQQQQQQQWQQQDmxw#ZZZmWp i::::::::::::: __ggggggaZXX11Ili>iiioqQQQQWQQQQQQ +QQQQQQQQQQQWQQQQD(xZS1vuXZ#Zbc|yy#XXy=_awZmmm####Z#UXSvvvIMMiInqgQQQQQQQQQQQQQQ +QQQQQQQQQQQQQQQUd3Sv+"oZZZXXXoSSnXSeS12n1on1onnvvlM""Qgap ::: ]dQQQQQQQWQQQQWQQ +QQQQQQWQQWQQQWE^W _xXS11vIvnvM!MvgsgaaawawwyQQQQQQQQF` -::.]mQQQQQQQQQQWQQQQ +QQQQQQQQQQQQW[': .jnvxnNY + */ + +$session_control = 'readonly'; +@define('AUTH_HANDLER', true); +require_once dirname(__FILE__) . '/lib/base.php'; +require JONAH_BASE . '/config/templates.php'; + +/* Get the id and format of the feed to display. */ +$criteria = Horde_Util::nonInputVar('criteria'); +if (empty($criteria['channel_format'])) { + // Select the default channel format + $criteria['channel_format'] = key($templates); +} + +$options = array(); +foreach ($templates as $key => $info) { + $options[] = ''; +} + +if (empty($criteria['channel_id']) && !empty($criteria['feed'])) { + $criteria['channel_id'] = $jonah_driver->getChannelId($criteria['feed']); +} + +if (empty($criteria['channel_id'])) { + $notification->push(_("No valid feed name or ID requested."), 'horde.error'); +} else { + $stories = $jonah_driver->getStories($criteria); +} + +if (!empty($stories)) { + die(print_r($stories, true)); +} + +$template = new Horde_Template(); +$template->setOption('gettext', 'true'); +$template->set('url', Horde::selfUrl()); +$template->set('session', Horde_Util::formInput()); +$template->set('channel_id', $criteria['channel_id']); +$template->set('channel_name', $channel['channel_name']); +$template->set('format', $criteria['channel_format']); +$template->set('options', $options); +$template->set('stories', $news->renderChannel($criteria['channel_id'], $criteria['channel_format'])); +$template->set('menu', Jonah::getMenu('string')); +$template->set('notify', Horde_Util::bufferOutput(array($notification, 'notify'), array('listeners' => 'status'))); + +require JONAH_TEMPLATES . '/common-header.inc'; +echo $template->fetch(JONAH_TEMPLATES . '/delivery/html.html'); +require $registry->get('templates', 'horde') . '/common-footer.inc'; diff --git a/jonah/index.php b/jonah/index.php new file mode 100644 index 000000000..47fe5643a --- /dev/null +++ b/jonah/index.php @@ -0,0 +1,24 @@ + + */ + +@define('JONAH_BASE', dirname(__FILE__)); +$jonah_configured = (is_readable(JONAH_BASE . '/config/conf.php') && + is_readable(JONAH_BASE . '/config/templates.php')); + +if (!$jonah_configured) { + require JONAH_BASE . '/../lib/Test.php'; + Horde_Test::configFilesMissing('Jonah', JONAH_BASE, + array('conf.php'), + array('templates.php' => 'This file defines the HTML (or other) templates that are used to generate different views of the news channels that Jonah provides.')); +} + +require JONAH_BASE . '/channels/index.php'; diff --git a/jonah/lib/.htaccess b/jonah/lib/.htaccess new file mode 100644 index 000000000..3a4288278 --- /dev/null +++ b/jonah/lib/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/jonah/lib/Api.php b/jonah/lib/Api.php new file mode 100644 index 000000000..09016112e --- /dev/null +++ b/jonah/lib/Api.php @@ -0,0 +1,256 @@ +getChannels($type); + + return $channels; + } + + /** + * Return the requested stories + * + * @param int $channel_id The channel to get the stories from. + * @param int $max_stories The maximum number of stories to get. + * @param int $start_at The story number to start retrieving. + * @param int $order How to order the results. + * + * @return An array of story information | PEAR_Error + */ + public function stories($channel_id, $max_stories = 10, $start_at = 0, + $order = 0) + { + require_once dirname(__FILE__) . '/base.php'; + require_once JONAH_BASE . '/lib/News.php'; + $news = Jonah_News::factory(); + $stories = $news->getStories($channel_id, $max_stories, $start_at, false, + time(), false, $order); + + foreach (array_keys($stories) as $s) { + if (empty($stories[$s]['story_body_type']) || $stories[$s]['story_body_type'] == 'text') { + $stories[$s]['story_body_html'] = Horde_Text_Filter::filter($stories[$s]['story_body'], 'text2html', array('parselevel' => Horde_Text_Filter_Text2html::MICRO, 'class' => null)); + } else { + $stories[$s]['story_body_html'] = $stories[$s]['story_body']; + } + } + + return $stories; + } + + /** + * Fetches a story from a requested channel. + * + * @param integer $channel_id The channel id to fetch. + * @param integer $story_id The story id to fetch. + * @param boolean $read Whether to update the read count. + * + * @return mixed An array of story data | PEAR_Error + */ + public function story($channel_id, $story_id, $read = true) + { + require_once dirname(__FILE__) . '/base.php'; + require_once JONAH_BASE . '/lib/News.php'; + + $news = Jonah_News::factory(); + $story = $news->getStory($channel_id, $story_id, $read); + if (is_a($story, 'PEAR_Error')) { + Horde::logMessage($story, __FILE__, __LINE__, PEAR_LOG_ERR); + return false; + } + if (empty($story['story_body_type']) || $story['story_body_type'] == 'text') { + $story['story_body_html'] = Horde_Text_Filter::filter($story['story_body'], 'text2html', array('parselevel' => Horde_Text_Filter_Text2html::MICRO, 'class' => null)); + } else { + $story['story_body_html'] = $story['story_body']; + } + + return $story; + } + + /** + * Callback for comment API + * + * @param integer $id Internal data identifier + * + * @return mixed Name of object on success | false on failure + */ + public function commentCallback($story_id) + { + if (!$GLOBALS['conf']['comments']['allow']) { + return false; + } + + require_once dirname(__FILE__) . '/base.php'; + require_once JONAH_BASE . '/lib/News.php'; + + $news = Jonah_News::factory(); + $story = $news->getStory(null, $story_id); + if (is_a($story, 'PEAR_Error')) { + return false; + } + + return $story['story_title']; + } + + /** + * Check if comments are allowed. + * + * @return boolean + */ + public function hasComments() + { + return $GLOBALS['conf']['comments']['allow']; + } + + /** + * Retrieve the list of used tag_names, tag_ids and the total number + * of resources that are linked to that tag. + * + * @param array $tags An optional array of tag_ids. If omitted, all tags + * will be included. + * + * @param array $channel_id An optional array of channel_ids. + * + * @return mixed An array containing tag_name, and total | PEAR_Error + */ + public function listTagInfo($tags = array(), $channel_id = null) + { + require_once dirname(__FILE__) . '/base.php'; + require_once JONAH_BASE . '/lib/News.php'; + + $news = Jonah_News::factory(); + return $news->listTagInfo($tags, $channel_id); + } + + /** + * Return a set of tag_ids, given the tag name + * + * @param array $names An array of names to search for + * + * @return mixed An array of tag_name => tag_ids | PEAR_Error + */ + public function getTagIds($names) + { + require_once dirname(__FILE__) . '/base.php'; + require_once JONAH_BASE . '/lib/News.php'; + + $news = Jonah_News::factory(); + return $news->getTagIds($names); + } + + /** + * Searches internal channels for stories tagged with all requested tags. + * Returns an application-agnostic array (useful for when doing a tag search + * across multiple applications) containing the following keys: + *
+     *  'title'    - The title for this resource.
+     *  'desc'     - A terse description of this resource.
+     *  'view_url' - The URL to view this resource.
+     *  'app'      - The Horde application this resource belongs to.
+     * 
+ * + * The 'raw' story array can be returned instead by setting $raw = true. + * + * @param array $names An array of tag_names to search for (AND'd together). + * @param integer $max The maximum number of stories to return. + * @param integer $from The number of the story to start with. + * @param array $channel_id An array of channel_ids to limit the search to. + * @param integer $order How to order the results (a JONAH_ORDER_* constant) + * @param boolean $raw Return the raw story data? + * + * @return mixed An array of results | PEAR_Error + */ + public function searchTags($names, $max = 10, $from = 0, $channel_id = array(), + $order = 0, $raw = false) + { + global $registry; + + require_once dirname(__FILE__) . '/base.php'; + require_once JONAH_BASE . '/lib/News.php'; + + $news = Jonah_News::factory(); + $results = $news->searchTags($names, $max, $from, $channel_id, $order); + if (is_a($results, 'PEAR_Error')) { + return $results; + } + $return = array(); + if ($raw) { + // Requesting the raw story information as returned from searchTags, + // but add some additional information that external apps might + // find useful. + $comments = $GLOBALS['conf']['comments']['allow'] && $registry->hasMethod('forums/numMessages'); + foreach ($results as $story) { + if (empty($story['story_body_type']) || $story['story_body_type'] == 'text') { + $story['story_body_html'] = Horde_Text_Filter::filter($story['story_body'], 'text2html', array('parselevel' => Horde_Text_Filter_Text2html::MICRO, 'class' => null)); + } else { + $story['story_body_html'] = $story['story_body']; + } + + if ($comments) { + $story['num_comments'] = $registry->call('forums/numMessages', + array($story['story_id'], + $registry->getApp())); + } + + $return[$story['story_id']] = $story; + } + } else { + foreach($results as $story) { + if (!empty($story)) { + $return[] = array('title' => $story['story_title'], + 'desc' => $story['story_desc'], + 'view_url' => $story['story_link'], + 'app' => 'jonah'); + } + } + } + + return $return; + } + + /** + * Get the count of stories in the specified channel + * + * @param int $channel_id + * @return mixed The story count + */ + public function storyCount($channel_id) + { + global $registry; + + require_once dirname(__FILE__) . '/base.php'; + + $results = $GLOBALS['jonah_driver']->getStoryCount($channel_id); + if (is_a($results, 'PEAR_Error')) { + return 0; + } + + return $results; + } + +} \ No newline at end of file diff --git a/jonah/lib/Application.php b/jonah/lib/Application.php new file mode 100644 index 000000000..d02ae0d46 --- /dev/null +++ b/jonah/lib/Application.php @@ -0,0 +1,69 @@ +getChannels(JONAH_INTERNAL_CHANNEL); + + /* Loop through internal channels and add their ids to the + * perms. */ + $perms = array(); + foreach ($channels as $channel) { + $perms['tree']['jonah']['news']['internal_channels'][$channel['channel_id']] = false; + } + + /* Human names and default permissions. */ + $perms['title']['jonah:admin'] = _("Administrator"); + $perms['tree']['jonah']['admin'] = false; + $perms['title']['jonah:news'] = _("News"); + $perms['tree']['jonah']['news'] = false; + $perms['title']['jonah:news:internal_channels'] = _("Internal Channels"); + $perms['tree']['jonah']['news']['internal_channels'] = false; + $perms['title']['jonah:news:external_channels'] = _("External Channels"); + $perms['tree']['jonah']['news']['external_channels'] = false; + + /* Loop through internal channels and add them to the perms + * titles. */ + foreach ($channels as $channel) { + $perms['title']['jonah:news:internal_channels:' . $channel['channel_id']] = $channel['channel_name']; + $perms['tree']['jonah']['news']['internal_channels'][$channel['channel_id']] = false; + } + + $channels = $news->getChannels(JONAH_EXTERNAL_CHANNEL); + + /* Loop through external channels and add their ids to the + * perms. */ + foreach ($channels as $channel) { + $perms['title']['jonah:news:external_channels:' . $channel['channel_id']] = $channel['channel_name']; + $perms['tree']['jonah']['news']['external_channels'][$channel['channel_id']] = false; + } + + return $perms; + } + + /** + * Generate the menu to use on the prefs page. + * + * @return Horde_Menu A Horde_Menu object. + */ + public function prefsMenu() + { + return Jonah::getMenu(); + } + +} \ No newline at end of file diff --git a/jonah/lib/Block/cloud.php b/jonah/lib/Block/cloud.php new file mode 100644 index 000000000..68319cbb5 --- /dev/null +++ b/jonah/lib/Block/cloud.php @@ -0,0 +1,59 @@ + + * @package Horde_Block + */ +class Horde_Block_jonah_cloud extends Horde_Block { + + var $_app = 'jonah'; + + /** + */ + function _params() + { + return array( + 'results_url' => array( + 'name' => _("Results URL"), + 'type' => 'text', + 'default' => Horde::applicationUrl('stories/results.php?tag_id=@id@'))); + } + + function _title() + { + return _("Tag Cloud"); + } + + function _content() + { + require_once dirname(__FILE__) . '/../base.php'; + require_once JONAH_BASE . '/lib/News.php'; + + $news = Jonah_News::factory(); + + /* Get the tags */ + $tags = $news->listTagInfo(); + if (count($tags)) { + $cloud = new Horde_Ui_TagCloud(); + foreach ($tags as $id => $tag) { + $cloud->addElement($tag['tag_name'], str_replace(array('@id@', '@tag@'), array($id, $tag['tag_name']), $this->_params['results_url']), $tag['total']); + } + $html = $cloud->buildHTML(); + } else { + $html = ''; + } + return $html; + } + +} diff --git a/jonah/lib/Block/delivery.php b/jonah/lib/Block/delivery.php new file mode 100644 index 000000000..6b5c97720 --- /dev/null +++ b/jonah/lib/Block/delivery.php @@ -0,0 +1,72 @@ + + * @package Horde_Block + */ +class Horde_Block_Jonah_delivery extends Horde_Block { + + var $_app = 'jonah'; + + function _title() + { + return _("Feeds"); + } + + function _content() + { + require_once dirname(__FILE__) . '/../base.php'; + require_once JONAH_BASE . '/lib/Jonah.php'; + require_once JONAH_BASE . '/lib/News.php'; + + $news = Jonah_News::factory(); + + $channels = array(); + $channels = $news->getChannels(JONAH_INTERNAL_CHANNEL); + if (is_a($channels, 'PEAR_Error')) { + $channels = array(); + } + + $html = ''; + + foreach ($channels as $key => $channel) { + /* Link for HTML delivery. */ + $url = Horde::applicationUrl('delivery/html.php'); + $url = Horde_Util::addParameter($url, 'channel_id', $channel['channel_id']); + $label = sprintf(_("\"%s\" stories in HTML"), $channel['channel_name']); + $html .= '' . + Horde::img('story_marker.png') . ' ' . + Horde::link($url, $label, '', '', '', $label) . + htmlspecialchars($channel['channel_name']) . ''; + + $html .= '' . ($channel['channel_updated'] ? date('M d, Y H:i', (int)$channel['channel_updated']) : '-') . ''; + + /* Link for feed delivery. */ + $url = Horde::applicationUrl('delivery/rss.php', true, -1); + $url = Horde_Util::addParameter($url, 'channel_id', $channel['channel_id']); + $label = sprintf(_("RSS Feed of \"%s\""), $channel['channel_name']); + $html .= '' . + Horde::link($url, $label) . + Horde::img('feed.png') . ' '; + } + + if ($html) { + return '' . $html . '
'; + } else { + return '

' . _("No feeds are available.") . '

'; + } + } + +} diff --git a/jonah/lib/Block/latest.php b/jonah/lib/Block/latest.php new file mode 100644 index 000000000..5032805c9 --- /dev/null +++ b/jonah/lib/Block/latest.php @@ -0,0 +1,121 @@ + + * + * See the enclosed file LICENSE for license information (BSD). If you + * did not receive this file, see http://cvs.horde.org/co.php/jonah/LICENSE. + * + * @author Roel Gloudemans + * @package Horde_Block + */ +class Horde_Block_Jonah_latest extends Horde_Block { + + var $_app = 'jonah'; + + var $_story = null; + + /** + */ + function _params() + { + require_once dirname(__FILE__) . '/../base.php'; + require_once JONAH_BASE . '/lib/Jonah.php'; + require_once JONAH_BASE . '/lib/News.php'; + + $params['source'] = array('name' => _("News Source"), + 'type' => 'enum', + 'values' => array()); + + $news = Jonah_News::factory(); + $channels = $news->getChannels(JONAH_INTERNAL_CHANNEL); + foreach ($channels as $channel) { + $params['source']['values'][$channel['channel_id']] = $channel['channel_name']; + } + natcasesort($params['source']['values']); + + // Get first news source. + $channel = reset($channels); + $params['source']['default'] = $channel['channel_id']; + + $params['countReads'] = array( + 'name' => _("Count reads of the latest story when this block is displayed"), + 'type' => 'boolean', + 'default' => false); + + return $params; + } + + /** + */ + function _title() + { + require_once dirname(__FILE__) . '/../base.php'; + require_once JONAH_BASE . '/lib/Jonah.php'; + require_once JONAH_BASE . '/lib/News.php'; + + if (empty($this->_params['source'])) { + return _("Latest News"); + } + + $story = $this->_fetch(); + return is_a($story, 'PEAR_Error') + ? @htmlspecialchars($story->getMessage(), ENT_COMPAT, Horde_Nls::getCharset()) + : ' ' + . @htmlspecialchars($story['story_title'], ENT_COMPAT, Horde_Nls::getCharset()); + } + + /** + */ + function _content() + { + require_once dirname(__FILE__) . '/../base.php'; + require_once JONAH_BASE . '/lib/Jonah.php'; + require_once JONAH_BASE . '/lib/News.php'; + + if (empty($this->_params['source'])) { + return _("No channel specified."); + } + + $story = $this->_fetch(); + if (is_a($story, 'PEAR_Error')) { + return sprintf(_("Error fetching story: %s"), $story->getMessage()); + } + + if (empty($story['story_body_type']) || $story['story_body_type'] == 'text') { + $story['story_body'] = Horde_Text_Filter::filter($story['story_body'], 'text2html', array('parselevel' => Horde_Text_Filter_Text2html::MICRO, 'class' => null)); + } + + return '

' . htmlspecialchars($story['story_desc']) . + '

' . $story['story_body'] . '
'; + } + + /** + * Get the latest story. + */ + function _fetch() + { + if (empty($this->_params['source'])) { + return; + } + + if (is_null($this->_story)) { + $news = Jonah_News::factory(); + $this->_story = $news->getStory($this->_params['source'], + $news->getLatestStoryId($this->_params['source']), + !empty($this->_params['countReads'])); + } + + return $this->_story; + } + +} diff --git a/jonah/lib/Block/news.php b/jonah/lib/Block/news.php new file mode 100644 index 000000000..415122131 --- /dev/null +++ b/jonah/lib/Block/news.php @@ -0,0 +1,110 @@ + + * @package Horde_Block + */ +class Horde_Block_Jonah_news extends Horde_Block { + + var $_app = 'jonah'; + + function _params() + { + require_once dirname(__FILE__) . '/../base.php'; + require_once JONAH_BASE . '/lib/Jonah.php'; + require_once JONAH_BASE . '/lib/News.php'; + require JONAH_BASE . '/config/templates.php'; + + $params['source'] = array('name' => _("Feed"), + 'type' => 'enum', + 'values' => array()); + + $news = Jonah_News::factory(); + $channels = $news->getChannels(); + foreach ($channels as $channel) { + $params['source']['values'][$channel['channel_id']] = $channel['channel_name']; + } + natcasesort($params['source']['values']); + + $params['view'] = array('name' => _("View"), + 'type' => 'enum', + 'values' => array(), + ); + foreach ($templates as $key => $template) { + $params['view']['values'][$key] = $template['name']; + } + + $params['max'] = array('name' => _("Maximum Stories"), + 'type' => 'int', + 'default' => 10, + 'required' => false); + + $params['from'] = array('name' => _("First Story"), + 'type' => 'int', + 'default' => 0, + 'required' => false); + + return $params; + } + + function _title() + { + require_once dirname(__FILE__) . '/../base.php'; + require_once JONAH_BASE . '/lib/Jonah.php'; + require_once JONAH_BASE . '/lib/News.php'; + + $news = Jonah_News::factory(); + $channel = $news->getChannel($this->_params['source']); + if (is_a($channel, 'PEAR_Error')) { + return @htmlspecialchars($channel->getMessage(), ENT_COMPAT, Horde_Nls::getCharset()); + } + + if (!empty($channel['channel_link'])) { + $title = Horde::link(htmlspecialchars($channel['channel_link']), '', '', '_blank') + . @htmlspecialchars($channel['channel_name'], ENT_COMPAT, Horde_Nls::getCharset()) + . ''; + } else { + $title = @htmlspecialchars($channel['channel_name'], ENT_COMPAT, Horde_Nls::getCharset()); + } + + return $title; + } + + function _content() + { + require_once dirname(__FILE__) . '/../base.php'; + require_once JONAH_BASE . '/lib/Jonah.php'; + require_once JONAH_BASE . '/lib/News.php'; + + if (empty($this->_params['source'])) { + return _("No feed specified."); + } + + require_once 'Horde/Template.php'; + $news = Jonah_News::factory(); + $params = $this->_params(); + + $view = isset($this->_params['view']) ? $this->_params['view'] : 'standard'; + if (!isset($this->_params['max'])) { + $this->_params['max'] = $params['max']['default']; + } + if (!isset($this->_params['from'])) { + $this->_params['from'] = $params['from']['default']; + } + + return $news->renderChannel($this->_params['source'], $view, $this->_params['max'], $this->_params['from']); + } + +} diff --git a/jonah/lib/Block/news_popular.php b/jonah/lib/Block/news_popular.php new file mode 100644 index 000000000..06b2db832 --- /dev/null +++ b/jonah/lib/Block/news_popular.php @@ -0,0 +1,107 @@ + + * @author Michael Rubinsky + * + * @package Horde_Block + */ +class Horde_Block_Jonah_news_popular extends Horde_Block { + + var $_app = 'jonah'; + + function _params() + { + require_once dirname(__FILE__) . '/../base.php'; + require_once JONAH_BASE . '/lib/Jonah.php'; + require_once JONAH_BASE . '/lib/News.php'; + require JONAH_BASE . '/config/templates.php'; + + $params['source'] = array('name' => _("Feed"), + 'type' => 'enum', + 'values' => array()); + + $news = Jonah_News::factory(); + $channels = $news->getChannels(); + foreach ($channels as $channel) { + if ($channel['channel_type'] == JONAH_INTERNAL_CHANNEL) { + $params['source']['values'][$channel['channel_id']] = $channel['channel_name']; + } + } + natcasesort($params['source']['values']); + + $params['view'] = array('name' => _("View"), + 'type' => 'enum', + 'values' => array()); + foreach ($templates as $key => $template) { + $params['view']['values'][$key] = $template['name']; + } + + $params['max'] = array('name' => _("Maximum Stories"), + 'type' => 'int', + 'default' => 10, + 'required' => false); + + return $params; + } + + function _title() + { + require_once dirname(__FILE__) . '/../base.php'; + require_once JONAH_BASE . '/lib/Jonah.php'; + require_once JONAH_BASE . '/lib/News.php'; + + $news = Jonah_News::factory(); + $channel = $news->getChannel($this->_params['source']); + if (is_a($channel, 'PEAR_Error')) { + return @htmlspecialchars($channel->getMessage(), ENT_COMPAT, Horde_Nls::getCharset()); + } + + if (!empty($channel['channel_link'])) { + $title = Horde::link(htmlspecialchars($channel['channel_link']), '', '', '_blank') + . @htmlspecialchars($channel['channel_name'], ENT_COMPAT, Horde_Nls::getCharset()) + . _(" - Most read stories") . ''; + } else { + $title = @htmlspecialchars($channel['channel_name'], ENT_COMPAT, Horde_Nls::getCharset()) + . _(" - Most read stories"); + } + + return $title; + } + + function _content() + { + require_once dirname(__FILE__) . '/../base.php'; + require_once JONAH_BASE . '/lib/Jonah.php'; + require_once JONAH_BASE . '/lib/News.php'; + + if (empty($this->_params['source'])) { + return _("No feed specified."); + } + + require_once 'Horde/Template.php'; + $news = Jonah_News::factory(); + $params = $this->_params(); + + $view = isset($this->_params['view']) ? $this->_params['view'] : 'standard'; + if (!isset($this->_params['max'])) { + $this->_params['max'] = $params['max']['default']; + } + + + return $news->renderChannel($this->_params['source'], $view, $this->_params['max'], 0, JONAH_ORDER_READ); + } + +} diff --git a/jonah/lib/Block/story.php b/jonah/lib/Block/story.php new file mode 100644 index 000000000..9c750ec9d --- /dev/null +++ b/jonah/lib/Block/story.php @@ -0,0 +1,127 @@ + + * + * See the enclosed file LICENSE for license information (BSD). If you + * did not receive this file, see http://cvs.horde.org/co.php/jonah/LICENSE. + * + * @author Roel Gloudemans + * @package Horde_Block + */ +class Horde_Block_Jonah_story extends Horde_Block { + + var $_app = 'jonah'; + + var $_story = null; + + /** + */ + function _params() + { + require_once dirname(__FILE__) . '/../base.php'; + require_once JONAH_BASE . '/lib/Jonah.php'; + require_once JONAH_BASE . '/lib/News.php'; + + $news = Jonah_News::factory(); + $channels = $news->getChannels(JONAH_INTERNAL_CHANNEL); + $channel_choices = array(); + foreach ($channels as $channel) { + $channel_choices[$channel['channel_id']] = $channel['channel_name']; + } + natcasesort($channel_choices); + + return array('source' => array( + 'name' => _("Feed"), + 'type' => 'enum', + 'values' => $channel_choices), + 'story' => array( + 'name' => _("Story"), + 'type' => 'int'), + 'countReads' => array( + 'name' => _("Count reads of this story when this block is displayed"), + 'type' => 'boolean', + 'default' => false), + ); + } + + /** + */ + function _title() + { + require_once dirname(__FILE__) . '/../base.php'; + require_once JONAH_BASE . '/lib/Jonah.php'; + require_once JONAH_BASE . '/lib/News.php'; + + if (empty($this->_params['source']) || + empty($this->_params['story'])) { + return _("Story"); + } + + $story = $this->_fetch(); + return is_a($story, 'PEAR_Error') + ? @htmlspecialchars($story->getMessage(), ENT_COMPAT, Horde_Nls::getCharset()) + : ' ' + . @htmlspecialchars($story['story_title'], ENT_COMPAT, Horde_Nls::getCharset()); + } + + /** + */ + function _content() + { + require_once dirname(__FILE__) . '/../base.php'; + require_once JONAH_BASE . '/lib/Jonah.php'; + require_once JONAH_BASE . '/lib/News.php'; + + if (empty($this->_params['source']) || empty($this->_params['story'])) { + return _("No story is selected."); + } + + $story = $this->_fetch(); + if (is_a($story, 'PEAR_Error')) { + return sprintf(_("Error fetching story: %s"), $story->getMessage()); + } + + if (empty($story['story_body_type']) || $story['story_body_type'] == 'text') { + $story['story_body'] = Horde_Text_Filter::filter($story['story_body'], 'text2html', array('parselevel' => Horde_Text_Filter_Text2html::MICRO, 'class' => null)); + } + + $tag_html = array(); + foreach ($story['story_tags'] as $id => $tag) { + $link = Horde_Util::addParameter('results.php', array('tag_id' => $id, 'channel_id' => $this->_params['source'])); + $tag_html[] = Horde::link($link) . $tag . ''; + } + + return '

' + . htmlspecialchars($story['story_desc']) + . '

' . $story['story_body'] + . '
'; + } + + /** + * Get the story the block is configured for. + */ + function _fetch() + { + if (is_null($this->_story)) { + $news = Jonah_News::factory(); + $this->_story = $news->getStory($this->_params['source'], + $this->_params['story'], + $this->_params['countReads']); + } + + return $this->_story; + } + +} diff --git a/jonah/lib/Block/tree_menu.php b/jonah/lib/Block/tree_menu.php new file mode 100644 index 000000000..aa3795904 --- /dev/null +++ b/jonah/lib/Block/tree_menu.php @@ -0,0 +1,46 @@ +getImageDir(); + $news = Jonah_News::factory(); + $channels = $news->getChannels('internal'); + if (is_a($channels, 'PEAR_Error')) { + return; + } + $channels = Jonah::checkPermissions('channels', Horde_Perms::SHOW, $channels); + + foreach ($channels as $channel) { + $tree->addNode($parent . $channel['channel_id'], + $parent, + $channel['channel_name'], + $indent + 1, + false, + array('icon' => 'editstory.png', + 'icondir' => $icondir, + 'url' => Horde_Util::addParameter($url, array('channel_id' => $channel['channel_id'])))); + } + } + +} diff --git a/jonah/lib/Driver.php b/jonah/lib/Driver.php new file mode 100644 index 000000000..bb017f58d --- /dev/null +++ b/jonah/lib/Driver.php @@ -0,0 +1,597 @@ + + * @author Marko Djukic + * @author Jan Schneider + * @author Ben Klang + * @package Jonah + */ +class Jonah_Driver { + + /** + * Hash containing connection parameters. + * + * @var array + */ + var $_params = array(); + + /** + * Constructs a new Driver storage object. + * + * @param array $params A hash containing connection parameters. + */ + function Jonah_Driver($params = array()) + { + $this->_params = $params; + } + + /** + */ + function deleteChannel(&$info) + { + return $this->_deleteChannel($info['channel_id']); + } + + /** + * Fetches the requested channel, while actually passing on the request to + * the backend _getChannel() function to do the real work. + * + * @param integer $channel_id The channel id to fetch. + * + * @return array|PEAR_Error The channel details as an array or a + * PEAR_Error if not valid or not found. + */ + function getChannel($channel_id) + { + static $channel = array(); + + /* We need a non empty channel id. */ + if (empty($channel_id)) { + return PEAR::raiseError(_("Missing channel id.")); + } + + /* Cache the fetching of channels. */ + if (!isset($channel[$channel_id])) { + $channel[$channel_id] = $this->_getChannel($channel_id); + if (!is_a($channel[$channel_id], 'PEAR_Error')) { + if (empty($channel[$channel_id]['channel_link'])) { + $channel[$channel_id]['channel_official'] = Horde_Util::addParameter(Horde::applicationUrl('delivery/html.php', true, -1), 'channel_id', $channel_id, false); + } else { + $channel[$channel_id]['channel_official'] = str_replace(array('%25c', '%c'), array('%c', $channel_id), $channel[$channel_id]['channel_link']); + } + } + } + + return $channel[$channel_id]; + } + + /** + * Returns the most recent or all stories from a channel. + * + * @param integer $criteria An associative array of attributes on which + * the resulting stories should be filtered. + * Examples: + * 'channel' => string Channel slug + * 'channel_id' => int Channel ID + * 'author' => string Story author + * 'updated-min' => Horde_Date Only return + * stories updated + * on or after this + * date + * 'updated-max' => Horde_Date Only return + * stories updated + * on or before this + * date + * 'published-min' => Horde_Date Only return + * stories + * published on or + * after this date + * 'published-max' => Horde_Date Only return + * stories + * published on or + * before date + * 'published-max' => Horde_Date Only return + * on or before this + * date + * 'tags' => array Array of tag names ANY of + * which may match the story to + * be included + * 'alltags' => array Array of tag names ALL of + * which must be associated + * with the story to be + * included + * 'keywords' => array Array of strings ALL of + * which matching must + * include + * 'published' => boolean Whether to return only + * published stories; + * null will return both + * published and + * unpublished + * 'startnumber' => int Story number to begin + * 'endnumber' => int Story number to end + * 'limit' => int Max number of stories + * + * @param integer $order How to order the results for internal + * channels. Possible values are the + * JONAH_ORDER_* constants. + * + * @return array The specified number (or less, if there are fewer) of + * stories from the given channel. + */ + function getStories($criteria) + { + // Convert a channel slug into a channel ID if necessary + if (isset($criteria['channel']) && !isset($criteria['channel_id'])) { + $criteria['channel_id'] = $this->getIdBySlug($criteria['channel']); + } + + + // Validate that we have proper Horde_Date objects + if (isset($criteria['updated-min'])) { + if (!is_a($criteria['updated-min'], 'Horde_Date')) { + throw new Exception("Invalid date object provided for update start date."); + } + } + if (isset($criteria['updated-max'])) { + if (!is_a($criteria['updated-max'], 'Horde_Date')) { + throw new Exception("Invalid date object provided for update end date."); + } + } + if (isset($criteria['published-min'])) { + if (!is_a($criteria['published-min'], 'Horde_Date')) { + throw new Exception("Invalid date object provided for published start date."); + } + } + if (isset($criteria['published-max'])) { + if (!is_a($criteria['published-max'], 'Horde_Date')) { + throw new Exception("Invalid date object provided for published end date."); + } + } + + // Collect the applicable tag IDs + $criteria['tagIDs'] = array(); + if (isset($criteria['tags'])) { + $criteria['tagIDs'] = array_merge($criteria['tagIDs'], $this->getTagIds($criteria['tags'])); + } + if (isset($criteria['alltags'])) { + $criteria['tagIDs'] = array_merge($criteria['tagIDs'], $this->getTagIds($criteria['alltags'])); + } + + return $this->_getStories($criteria); + } + + /** + * Returns the most recent or all stories from a channel. + * This method is deprecated. + * + * @param integer $channel_id The news channel to get stories from. + * @param integer $max The maximum number of stories to get. If + * null, all stories will be returned. + * @param integer $from The number of the story to start with. + * @param boolean $refresh Force a refresh of stories in case this is + * an external channel. + * @param integer $date The timestamp of the date to start with. + * @param boolean $unreleased Return stories that have not yet been + * published? + * Defaults to false - only published stories. + * @param integer $order How to order the results for internal + * channels. Possible values are the + * JONAH_ORDER_* constants. + * + * @return array The specified number (or less, if there are fewer) of + * stories from the given channel. + */ + function legacyGetStories($channel, $max = 10, $from = 0, $refresh = false, + $date = null, $unreleased = false, + $order = JONAH_ORDER_PUBLISHED) + { + global $conf, $registry; + + $channel['channel_link'] = Horde_Util::addParameter(Horde::applicationUrl('delivery/html.php', true, -1), 'channel_id', $channel['channel_id']); + $stories = $this->_legacyGetStories($channel['channel_id'], $max, $from, $date, $unreleased, $order); + if (is_a($stories, 'PEAR_Error')) { + return $stories; + } + $date_format = $GLOBALS['prefs']->getValue('date_format'); + $comments = $conf['comments']['allow'] && $registry->hasMethod('forums/numMessages'); + foreach ($stories as $key => $story) { + $stories[$key]['story_link'] = $this->getStoryLink($channel, $story); + $stories[$key]['story_updated'] = $story['story_updated']; + $stories[$key]['story_updated_date'] = strftime($date_format, $story['story_updated']); + if ($comments) { + $stories[$key]['num_comments'] = $registry->call('forums/numMessages', array($story['story_id'], $registry->getApp())); + if (is_a($stories[$key]['num_comments'], 'PEAR_Error')) { + $stories[$key]['num_comments'] = null; + } + } + $stories[$key] = array_merge($channel, $stories[$key]); + } + + return $stories; + } + + /** + */ + function _escapeExternalStories(&$story, $key, $channel) + { + $story = array_merge($channel, $story); + $story['story_link'] = Horde::externalUrl($story['story_url']); + } + + /** + */ + function saveStory(&$info) + { + /* Used for checking whether to send out delivery or not. */ + if (empty($info['story_published'])) { + /* Story is not being released. */ + $deliver = false; + } elseif (empty($info['story_id'])) { + /* Story is new. */ + $deliver = true; + } else { + /* Story is old, has it been released already? */ + $oldstory = $this->getStory(null, $info['story_id']); + if ((empty($oldstory['story_published']) || + $oldstory['story_published'] > $oldstory['story_updated']) && + $info['story_published'] <= time()) { + $deliver = true; + } else { + $deliver = false; + } + } + + /* First save to the backend. */ + $result = $this->_saveStory($info); + if (is_a($result, 'PEAR_Error') || !$deliver) { + /* Return here also if editing, do not bother doing deliveries for + * an edited story. */ + return $result; + } + } + + /** + */ + function getStory($channel_id, $story_id, $read = false) + { + $channel = null; + if ($channel_id) { + $channel = $this->getChannel($channel_id); + if (is_a($channel, 'PEAR_Error')) { + return $channel; + } + if ($channel['channel_type'] == JONAH_EXTERNAL_CHANNEL) { + return $this->_getExternalStory($channel, $story_id); + } + } + + $story = $this->_getStory($story_id, $read); + if (is_a($story, 'PEAR_Error')) { + return $story; + } + + /* Format story link. */ + $story['story_link'] = $this->getStoryLink($channel, $story); + + /* Format dates. */ + $date_format = $GLOBALS['prefs']->getValue('date_format'); + $story['story_updated_date'] = strftime($date_format, $story['story_updated']); + if (!empty($story['story_published'])) { + $story['story_published_date'] = strftime($date_format, $story['story_published']); + } + + return $story; + } + + /** + * Returns the official link to a story. + * + * @param array $channel A channel hash. + * @param array $story A story hash. + * + * @return string The story link. + */ + function getStoryLink($channel, $story) + { + if ((empty($story['story_url']) || !empty($story['story_body'])) && + !empty($channel['channel_story_url'])) { + $url = $channel['channel_story_url']; + } else { + $url = Horde_Util::addParameter(Horde::applicationUrl('stories/view.php', true, -1), array('channel_id' => '%c', 'story_id' => '%s'), null, false); + } + return str_replace(array('%25c', '%25s', '%c', '%s'), + array('%c', '%s', $channel['channel_id'], $story['story_id']), + $url); + } + + /** + */ + function getChecksum($story) + { + return md5($story['story_title'] . $story['story_desc']); + } + + /** + */ + function getIntervalLabel($seconds = null) + { + $interval = array(1 => _("none"), + 1800 => _("30 mins"), + 3600 => _("1 hour"), + 7200 => _("2 hours"), + 14400 => _("4 hours"), + 28800 => _("8 hours"), + 43200 => _("12 hours"), + 86400 => _("24 hours")); + + if ($seconds === null) { + return $interval; + } else { + return $interval[$seconds]; + } + } + + /** + * Returns the stories of a channel rendered with the specified template. + * + * @param integer $channel_id The news channel to get stories from. + * @param string $tpl The name of the template to use. + * @param integer $max The maximum number of stories to get. If + * null, all stories will be returned. + * @param integer $from The number of the story to start with. + * @param integer $order How to sort the results for internal channels + * Possible values are the JONAH_ORDER_* + * constants. + * + * @return string The rendered story listing. + */ + function renderChannel($channel_id, $tpl, $max = 10, $from = 0, $order = JONAH_ORDER_PUBLISHED) + { + $channel = $this->getChannel($channel_id); + if (is_a($channel, 'PEAR_Error')) { + return sprintf(_("Error fetching feed: %s"), $channel->getMessage()); + } + + include JONAH_BASE . '/config/templates.php'; + $escape = !isset($templates[$tpl]['escape']) || + !empty($templates[$tpl]['escape']); + $template = new Horde_Template(); + + if ($escape) { + $channel['channel_name'] = htmlspecialchars($channel['channel_name']); + $channel['channel_desc'] = htmlspecialchars($channel['channel_desc']); + } + $template->set('channel', $channel, true); + + /* Get one story more than requested to see if there are more + * stories. */ + if ($max !== null) { + $stories = $this->getStories($channel_id, $max + 1, $from, false, time(), false, $order); + if (is_a($stories, 'PEAR_Error')) { + return $stories->getMessage(); + } + } else { + $stories = $this->getStories($channel_id, null, 0, false, time(), false, $order); + if (is_a($stories, 'PEAR_Error')) { + return $stories->getMessage(); + } + $max = count($stories); + } + + if (!$stories) { + $template->set('error', _("No stories are currently available."), true); + $template->set('stories', false, true); + $template->set('image', false, true); + $template->set('form', false, true); + } else { + /* Escape. */ + if ($escape) { + array_walk($stories, array($this, '_escapeStories')); + } + + /* Process story summaries. */ + array_walk($stories, array($this, '_escapeStoryDescriptions')); + + $template->set('error', false, true); + $template->set('story_marker', Horde::img('story_marker.png')); + $template->set('image', false, true); + $template->set('form', false, true); + if ($from) { + $template->set('previous', max(0, $from - $max), true); + } else { + $template->set('previous', false, true); + } + if ($from && !empty($channel['channel_page_link'])) { + $template->set('previous_link', + str_replace( + array('%25c', '%25n', '%c', '%n'), + array('%c', '%n', $channel['channel_id'], max(0, $from - $max)), + $channel['channel_page_link']), + true); + } else { + $template->set('previous_link', false, true); + } + $more = count($stories) > $max; + if ($more) { + $template->set('next', $from + $max, true); + array_pop($stories); + } else { + $template->set('next', false, true); + } + if ($more && !empty($channel['channel_page_link'])) { + $template->set('next_link', + str_replace( + array('%25c', '%25n', '%c', '%n'), + array('%c', '%n', $channel['channel_id'], $from + $max), + $channel['channel_page_link']), + true); + } else { + $template->set('next_link', false, true); + } + + $template->set('stories', $stories, true); + } + + return $template->parse($templates[$tpl]['template']); + } + + /** + */ + function _escapeStories(&$value, $key) + { + $value['story_title'] = htmlspecialchars($value['story_title']); + $value['story_desc'] = htmlspecialchars($value['story_desc']); + if (isset($value['story_link'])) { + $value['story_link'] = htmlspecialchars($value['story_link']); + } + if (empty($value['story_body_type']) || $value['story_body_type'] != 'richtext') { + $value['story_body'] = htmlspecialchars($value['story_body']); + } + } + + /** + */ + function _escapeStoryDescriptions(&$value, $key) + { + $value['story_desc'] = nl2br($value['story_desc']); + } + + /** + * Returns the provided story as a MIME part. + * + * @param array $story A data array representing a story. + * + * @return MIME_Part The MIME message part containing the story parts. + */ + function &getStoryAsMessage(&$story) + { + require_once 'Horde/MIME/Part.php'; + + /* Add the story to the message based on the story's body type. */ + switch ($story['story_body_type']) { + case 'richtext': + /* Get a plain text version of a richtext story. */ + $body_html = $story['story_body']; + $body_text = Horde_Text_Filter::filter($body_html, 'html2text'); + + /* Add description. */ + $body_html = '

' . Horde_Text_Filter::filter($story['story_desc'], 'text2html', array('parselevel' => Horde_Text_Filter_Text2html::MICRO, 'charset' => Horde_Nls::getCharset(), 'class' => null, 'callback' => null)) . "

\n" . $body_html; + $body_text = Horde_String::wrap(' ' . $story['story_desc'], 70) . "\n\n" . $body_text; + + /* Add the text version of the story to the base message. */ + $message_text = new MIME_Part('text/plain'); + $message_text->setCharset(Horde_Nls::getCharset()); + $message_text->setContents($message_text->replaceEOL($body_text)); + $message_text->setDescription(_("Plaintext Version of Story")); + + /* Add an HTML version of the story to the base message. */ + $message_html = new MIME_Part('text/html', Horde_String::wrap($body_html), + Horde_Nls::getCharset(), 'inline'); + $message_html->setDescription(_("HTML Version of Story")); + + /* Add the two parts as multipart/alternative. */ + $basepart = new MIME_Part('multipart/alternative'); + $basepart->addPart($message_text); + $basepart->addPart($message_html); + + return $basepart; + + case 'text': + /* This is just a plain text story. */ + $message_text = new MIME_Part('text/plain'); + $message_text->setContents($message_text->replaceEOL($story['story_desc'] . "\n\n" . $story['story_body'])); + $message_text->setCharset(Horde_Nls::getCharset()); + + return $message_text; + } + } + + /** + * Attempts to return a concrete Jonah_Driver instance based on $driver. + * + * @param string $driver The type of concrete Jonah_Driver subclass to + * return. The is based on the storage driver + * ($driver). The code is dynamically included. + * + * @param array $params A hash containing any additional configuration or + * connection parameters a subclass might need. + * + * @return mixed The newly created concrete Jonah_Driver instance, or false + * on an error. + */ + function factory($driver = null, $params = null) + { + if ($driver === null) { + $driver = $GLOBALS['conf']['news']['storage']['driver']; + } + $driver = basename($driver); + + if ($params === null) { + $params = Horde::getDriverConfig(array('news', 'storage'), $driver); + } + + $class = 'Jonah_Driver_' . $driver; + if (!class_exists($class, false)) { + include dirname(__FILE__) . '/Driver/' . $driver . '.php'; + } + if (class_exists($class)) { + return new $class($params); + } else { + return PEAR::raiseError(sprintf(_("No such backend \"%s\" found"), $driver)); + } + } + + /** + * Stubs for the tag functions. If supported by the backend, these need + * to be implemented in the concrete Jonah_Driver_* class. + */ + function writeTags($resource_id, $channel_id, $tags) + { + return PEAR::raiseError(_("Tag support not enabled in backend.")); + } + + function readTags($resource_id) + { + return PEAR::raiseError(_("Tag support not enabled in backend.")); + } + + function listTagInfo($tags = array(), $channel_id = null) + { + return PEAR::raiseError(_("Tag support not enabled in backend.")); + } + + function searchTagsById($ids, $max = 10, $from = 0, $channel_id = array(), + $order = JONAH_ORDER_PUBLISHED) + { + return PEAR::raiseError(_("Tag support not enabled in backend.")); + } + + function getTagNames($ids) + { + return PEAR::raiseError(_("Tag support not enabled in backend.")); + } + + function getIdBySlug($channel) + { + return $this->_getIdBySlug($channel); + } + +} diff --git a/jonah/lib/Driver/sql.php b/jonah/lib/Driver/sql.php new file mode 100644 index 000000000..35c9b2263 --- /dev/null +++ b/jonah/lib/Driver/sql.php @@ -0,0 +1,1062 @@ + + * 'phptype' The database type (e.g. 'pgsql', 'mysql', etc.). + * 'charset' The database's internal charset. + * + * Required by some database implementations:
+ *      'hostspec'      The hostname of the database server.
+ *      'protocol'      The communication protocol ('tcp', 'unix', etc.).
+ *      'database'      The name of the database.
+ *      'username'      The username with which to connect to the database.
+ *      'password'      The password associated with 'username'.
+ *      'options'       Additional options to pass to the database.
+ *      'tty'           The TTY on which to connect to the database.
+ *      'port'          The port on which to connect to the database.
+ * + * The table structure can be created by the scripts/db/jonah_news.sql + * script. The needed tables are jonah_channels and jonah_stories. + * + * $Horde: jonah/lib/Driver/sql.php,v 1.10 2010/02/01 10:32:04 jan Exp $ + * + * Copyright 2002-2009 The Horde Project (http://www.horde.org/) + * + * See the enclosed file LICENSE for license information (BSD). If you did not + * did not receive this file, see http://cvs.horde.org/co.php/jonah/LICENSE. + * + * @author Marko Djukic + * @author Chuck Hagenbuch + * @author Jan Schneider + * @author Ben Klang + * @package Jonah + */ +class Jonah_Driver_sql extends Jonah_Driver { + + /** + * Handle for the current database connection. + * + * @var DB + */ + var $_db; + + /** + * Boolean indicating whether or not we're connected to the SQL server. + * + * @var boolean + */ + var $_connected = false; + + /** + * Saves a channel to the backend. + * + * @param array $info The channel to add. + * Must contain a combination of the following + * entries: + *
+     * 'channel_id'       If empty a new channel is being added, otherwise one
+     *                    is being edited.
+     * 'channel_name'     The headline.
+     * 'channel_desc'     A description of this channel.
+     * 'channel_type'     Whether internal or external.
+     * 'channel_interval' If external then interval at which to refresh.
+     * 'channel_link'     The link to the source.
+     * 'channel_url'      The url from where to fetch the story list.
+     * 'channel_image'    A channel image.
+     * 
+ * + * @return int|PEAR_Error The channel ID on success, PEAR_Error on + * failure. + */ + function saveChannel(&$info) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + if (empty($info['channel_id'])) { + $info['channel_id'] = $this->_db->nextId('jonah_channels'); + if (is_a($info['channel_id'], 'PEAR_Error')) { + Horde::logMessage($info['channel_id'], __FILE__, __LINE__, PEAR_LOG_ERR); + return $info['channel_id']; + } + $sql = 'INSERT INTO jonah_channels' . + ' (channel_id, channel_name, channel_type, channel_desc, channel_interval, channel_url, channel_link, channel_page_link, channel_story_url, channel_img)' . + ' VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'; + $values = array(); + } else { + $sql = 'UPDATE jonah_channels' . + ' SET channel_id = ?, channel_name = ?, channel_type = ?, channel_desc = ?, channel_interval = ?, channel_url = ?, channel_link = ?, channel_page_link = ?, channel_story_url = ?, channel_img = ?' . + ' WHERE channel_id = ?'; + $values = array((int)$info['channel_id']); + } + + array_unshift($values, + (int)$info['channel_id'], + Horde_String::convertCharset($info['channel_name'], Horde_Nls::getCharset(), $this->_params['charset']), + (int)$info['channel_type'], + isset($info['channel_desc']) ? $info['channel_desc'] : null, + isset($info['channel_interval']) ? (int)$info['channel_interval'] : null, + isset($info['channel_url']) ? $info['channel_url'] : null, + isset($info['channel_link']) ? $info['channel_link'] : null, + isset($info['channel_page_link']) ? $info['channel_page_link'] : null, + isset($info['channel_story_url']) ? $info['channel_story_url'] : null, + isset($info['channel_img']) ? $info['channel_img'] : null); + Horde::logMessage('SQL Query by Jonah_Driver_sql::saveChannel(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->query($sql, $values); + if (is_a($result, 'PEAR_Error')) { + Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR); + return $result; + } + + return $info['channel_id']; + } + + /** + * Get a list of stored channels. + * + * @param integer $type The type of channel to filter for. Possible + * values are either JONAH_INTERNAL_CHANNEL + * to fetch only a list of internal channels, + * or JONAH_EXTERNAL_CHANNEL for only external. + * If null both channel types are returned. + * + * @return mixed An array of channels or PEAR_Error on error. + */ + function getChannels($type = null) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + $wsql = ''; + if (!is_null($type)) { + if (!is_array($type)) { + $type = array($type); + } + for ($i = 0, $i_max = count($type); $i < $i_max; ++$i) { + $type[$i] = 'channel_type = ' . (int)$type[$i]; + } + $wsql = 'WHERE ' . implode(' OR ', $type); + } + + $sql = sprintf('SELECT channel_id, channel_name, channel_type, channel_updated FROM jonah_channels %s ORDER BY channel_name', $wsql); + + Horde::logMessage('SQL Query by Jonah_Driver_sql::getChannels(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->getAll($sql, DB_FETCHMODE_ASSOC); + if (is_a($result, 'PEAR_Error')) { + Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR); + return $result; + } + for ($i = 0; $i < count($result); $i++) { + $result[$i]['channel_name'] = Horde_String::convertCharset($result[$i]['channel_name'], $this->_params['charset']); + } + + return $result; + } + + /** + */ + function _getChannel($channel_id) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + $sql = 'SELECT * FROM jonah_channels WHERE channel_id = ' . (int)$channel_id; + + Horde::logMessage('SQL Query by Jonah_Driver_sql::_getChannel(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->getRow($sql, DB_FETCHMODE_ASSOC); + if (is_a($result, 'PEAR_Error')) { + Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR); + return $result; + } elseif (empty($result)) { + return PEAR::raiseError(sprintf(_("Channel id \"%s\" not found."), $channel_id)); + } + + $result['channel_name'] = Horde_String::convertCharset($result['channel_name'], $this->_params['charset']); + if ($result['channel_type'] == JONAH_COMPOSITE_CHANNEL) { + $channels = explode(':', $result['channel_url']); + if (count($channels)) { + $sql = 'SELECT MAX(channel_updated) FROM jonah_channels WHERE channel_id IN (' . implode(',', $channels) . ')'; + Horde::logMessage('SQL Query by Jonah_Driver_sql::_getChannel(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $updated = $this->_db->getOne($sql); + if (is_a($updated, 'PEAR_Error')) { + Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR); + } else { + $result['channel_updated'] = $updated; + $this->_timestampChannel($channel_id, $updated); + } + } + } + + return $result; + } + + /** + */ + function _timestampChannel($channel_id, $timestamp) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + $sql = sprintf('UPDATE jonah_channels SET channel_updated = %s WHERE channel_id = %s', + (int)$timestamp, + (int)$channel_id); + Horde::logMessage('SQL Query by Jonah_Driver_sql::_timestampChannel(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->query($sql); + if (is_a($result, 'PEAR_Error')) { + Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR); + } + return $result; + } + + /** + */ + function _readStory($story_id) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + $sql = 'UPDATE jonah_stories SET story_read = story_read + 1 WHERE story_id = ' . (int)$story_id; + Horde::logMessage('SQL Query by Jonah_Driver_sql::_readStory(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->query($sql); + if (is_a($result, 'PEAR_Error')) { + Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR); + } + return $result; + } + + /** + */ + function _deleteChannel($channel_id) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + $sql = 'DELETE FROM jonah_channels WHERE channel_id = ?'; + $values = array($channel_id); + + Horde::logMessage('SQL Query by Jonah_Driver_sql::deleteChannel(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->query($sql, $values); + if (is_a($result, 'PEAR_Error')) { + Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR); + } + + return $result; + } + + /** + * @param array &$info + */ + function _saveStory(&$info) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + if (empty($info['story_id'])) { + $info['story_id'] = $this->_db->nextId('jonah_stories'); + if (is_a($info['story_id'], 'PEAR_Error')) { + Horde::logMessage($info['story_id'], __FILE__, __LINE__, PEAR_LOG_ERR); + return $info['story_id']; + } + $channel = $this->getChannel($info['channel_id']); + $permalink = $this->getStoryLink($channel, $info); + $sql = 'INSERT INTO jonah_stories (story_id, channel_id, story_title, story_desc, story_body_type, story_body, story_url, story_published, story_updated, story_read, story_permalink) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'; + $values = array($permalink); + } else { + $sql = 'UPDATE jonah_stories SET story_id = ?, channel_id = ?, story_title = ?, story_desc = ?, story_body_type = ?, story_body = ?, story_url = ?, story_published = ?, story_updated = ?, story_read = ? WHERE story_id = ?'; + $values = array((int)$info['story_id']); + } + + if (empty($info['story_read'])) { + $info['story_read'] = 0; + } + + /* Deal with any tags */ + if (!empty($info['story_tags'])) { + $tags = explode(',', $info['story_tags']); + } else { + $tags = array(); + } + $this->writeTags($info['story_id'], $info['channel_id'], $tags); + + array_unshift($values, + (int)$info['story_id'], + (int)$info['channel_id'], + Horde_String::convertCharset($info['story_title'], Horde_Nls::getCharset(), $this->_params['charset']), + Horde_String::convertCharset($info['story_desc'], Horde_Nls::getCharset(), $this->_params['charset']), + $info['story_body_type'], + isset($info['story_body']) ? Horde_String::convertCharset($info['story_body'], Horde_Nls::getCharset(), $this->_params['charset']) : null, + isset($info['story_url']) ? $info['story_url'] : null, + isset($info['story_published']) ? (int)$info['story_published'] : null, + time(), + (int)$info['story_read']); + + Horde::logMessage('SQL Query by Jonah_Driver_sql::_saveStory(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->query($sql, $values); + if (is_a($result, 'PEAR_Error')) { + Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR); + return $result; + } + + $this->_timestampChannel($info['channel_id'], time()); + return true; + } + + /** + * Converts the text fields of a story from the backend charset to the + * output charset. + * + * @param array $story A story hash. + * + * @return array The converted hash. + */ + function _convertFromBackend($story) + { + $story['story_title'] = Horde_String::convertCharset($story['story_title'], $this->_params['charset'], Horde_Nls::getCharset()); + $story['story_desc'] = Horde_String::convertCharset($story['story_desc'], $this->_params['charset'], Horde_Nls::getCharset()); + if (isset($story['story_body'])) { + $story['story_body'] = Horde_String::convertCharset($story['story_body'], $this->_params['charset'], Horde_Nls::getCharset()); + } + if (isset($story['story_tags'])) { + $story['story_tags'] = Horde_String::convertCharset($story['story_tags'], $this->_params['charset'], Horde_Nls::getCharset()); + } + return $story; + } + + /** + * Look up a channel ID by its name + * + * @param string $channel + * + * @return int Channel ID + */ + function getChannelId($channel) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + $sql = 'SELECT channel_id FROM jonah_channels WHERE channel_slug = ?'; + $values = array($channel); + $result = $this->_db->getOne($sql, $values); + if (is_a($result, 'PEAR_Error')) { + return $result; + } + + return $result; + } + + /** + * Returns the total number of stories in the specified + * channel + * + * @param int $channel_id The Channel ID + * + * @return mixed The count || PEAR_Error + */ + function getStoryCount($channel_id) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + $sql = 'SELECT count(*) FROM jonah_stories WHERE channel_id = ?'; + $result = $this->_db->getOne($sql, $channel_id); + if (is_a($result, 'PEAR_Error')) { + return $result; + } + + return (int)$result; + } + + /** + * Returns a list of stories from the storage backend filtered by + * arbitrary criteria. + * NOTE: $criteria['channel_id'] MUST be set for this method to work. + * + * @param string $channel + * @param array $criteria + * + * @return array + * + * @see Jonah_Driver#getStories + */ + function _getStories($criteria) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + $sql = 'SELECT DISTINCT(tags.story_id) AS id, ' . + 'stories.story_author AS author, ' . + 'stories.story_title AS title, ' . + 'stories.story_desc AS description, ' . + 'stories.story_body_type AS body_type, ' . + 'stories.story_body AS body, ' . + 'stories.story_url AS url, ' . + 'stories.story_permalink AS permalink, ' . + 'stories.story_published AS published, ' . + 'stories.story_updated AS updated, ' . + 'stories.story_read AS readcount ' . + 'FROM jonah_stories_tags AS tags ' . + 'LEFT JOIN jonah_stories AS stories ON ' . + 'tags.story_id = stories.story_id ' . + 'WHERE stories.channel_id=?'; + $values = array($criteria['channel_id']); + + // Apply date filtering + if (isset($criteria['updated-min'])) { + $sql .= ' AND story_updated >= ?'; + $values[] = $criteria['updated-min']->timestamp(); + } + if (isset($criteria['updated-max'])) { + $sql .= ' AND story_updated <= ?'; + $values[] = $criteria['updated-max']->timestamp(); + } + if (isset($criteria['published-min'])) { + $sql .= ' AND story_published >= ?'; + $values[] = $criteria['published-min']->timestamp(); + } + if (isset($criteria['published-max'])) { + $sql .= ' AND story_published <= ?'; + $values[] = $criteria['published-max']->timestamp(); + } + + // Apply tag filtering + if (isset($criteria['tags'])) { + $sql .= ' AND ('; + $multiple = false; + foreach ($criteria['tags'] as $tag) { + if ($multiple) { + $sql .= ' OR '; + } + $sql .= 'tags.tag_id = ?'; + $values[] = $criteria['tagIDs'][$tag]; + $multiple = true; + } + $sql .= ')'; + } + + if (isset($criteria['alltags'])) { + $sql .= ' AND ('; + $multiple = false; + foreach ($criteria['alltags'] as $tag) { + if ($multiple) { + $sql .= ' AND '; + } + $sql .= 'tags.tag_id = ?'; + $values[] = $criteria['tagIDs'][$tag]; + $multiple = true; + } + $sql .= ')'; + } + + // Filter by story author + if (isset($criteria['author'])) { + $sql .= ' AND stories.story_author = ?'; + $values[] = $criteria['author']; + } + + // Filter stories by keyword + if (isset($criteria['keywords'])) { + foreach ($criteria['keywords'] as $keyword) { + $sql .= ' AND stories.story_body LIKE ?'; + $values[] = '%' . $keyword . '%'; + } + } + if (isset($criteria['notkeywords'])) { + foreach ($criteria['notkeywords'] as $keyword) { + $sql .= ' AND stories.story_body NOT LIKE ?'; + $values[] = '%' . $keyword . '%'; + } + } + + Horde::logMessage('SQL Query by Jonah_Driver_sql::_getStories(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $results = $this->_db->getAll($sql, $values, DB_FETCHMODE_ASSOC); + if (is_a($results, 'PEAR_Error')) { + return $results; + } + + return $results; + } + + function _getIdBySlug($slug) + { + return $slug; + } + + /** + * Returns the most recent or all stories from a channel. + * This method is deprecated. + * + * @param integer $channel_id The news channel to get stories from. + * @param integer $max The maximum number of stories to get. + * @param integer $from The number of the story to start with. + * @param integer $date The timestamp of the date to start with. + * @param boolean $unreleased Whether to return not yet released stories. + * @param integer $order How to order the results for internal + * channels. Possible values are the + * JONAH_ORDER_* constants. + * + * @return array The specified number (or less, if there are fewer) of + * stories from the given channel. + */ + function _legacyGetStories($channel_id, $max, $from = 0, $date = null, + $unreleased = false, $order = JONAH_ORDER_PUBLISHED) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + $sql = 'SELECT * FROM jonah_stories WHERE channel_id = ?'; + $values = array((int)$channel_id); + + if ($unreleased) { + if ($date !== null) { + $sql .= ' AND story_published <= ?'; + $values[] = $date; + } + } else { + if ($date === null) { + $date = time(); + } else { + $date = max($date, time()); + } + $sql .= ' AND story_published <= ?'; + $values[] = $date; + } + + switch ($order) { + case JONAH_ORDER_PUBLISHED: + $sql .= ' ORDER BY story_published DESC'; + break; + case JONAH_ORDER_READ: + $sql .= ' ORDER BY story_read DESC'; + break; + case JONAH_ORDER_COMMENTS: + //@TODO + break; + } + + if (!is_null($max)) { + $sql = $this->_db->modifyLimitQuery($sql, (int)$from, (int)$max, $values); + } + + Horde::logMessage('SQL Query by Jonah_Driver_sql::_legacyGetStories(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->getAll($sql, $values, DB_FETCHMODE_ASSOC); + if (is_a($result, 'PEAR_Error')) { + return $result; + } + for ($i = 0; $i < count($result); $i++) { + $result[$i] = $this->_convertFromBackend($result[$i]); + if (empty($result[$i]['story_permalink'])) { + $this->_addPermalink($result[$i]); + } + $tags = $this->readTags($result[$i]['story_id']); + if (is_a($tags, 'PEAR_Error')) { + return $tags; + } + $result[$i]['story_tags'] = $tags; + } + return $result; + } + + /** + */ + function _getStory($story_id, $read = false) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + $sql = 'SELECT * FROM jonah_stories WHERE story_id = ?'; + $values = array((int)$story_id); + + Horde::logMessage('SQL Query by Jonah_Driver_sql::_getStory(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->getRow($sql, $values, DB_FETCHMODE_ASSOC); + if (is_a($result, 'PEAR_Error')) { + Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR); + return $result; + } elseif (empty($result)) { + return PEAR::raiseError(sprintf(_("Story id \"%s\" not found."), $story_id)); + } + $result['story_tags'] = $this->readTags($story_id); + $result = $this->_convertFromBackend($result); + if (empty($result['story_permalink'])) { + $this->_addPermalink($result); + } + if ($read) { + $this->_readStory($story_id); + } + + return $result; + } + + /** + */ + function _getStoryByUrl($channel_id, $story_url) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + $sql = 'SELECT * FROM jonah_stories' . + ' WHERE channel_id = ? AND story_url = ?'; + $values = array((int)$channel_id, $story_url); + + Horde::logMessage('SQL Query by Jonah_Driver_sql::_getStoryByUrl(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->getRow($sql, $values, DB_FETCHMODE_ASSOC); + if (is_a($result, 'PEAR_Error')) { + Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR); + return $result; + } elseif (empty($result)) { + return PEAR::raiseError(sprintf(_("Story URL \"%s\" not found."), $story_url)); + } + $result = $this->_convertFromBackend($result); + if (empty($result['story_permalink'])) { + $this->_addPermalink($result); + } + + return $result; + } + + /** + * Adds a missing permalink to a story. + * + * @param array $story A story hash. + */ + function _addPermalink(&$story) + { + $channel = $this->getChannel($story['channel_id']); + if (is_a($channel, 'PEAR_Error')) { + return; + } + $sql = 'UPDATE jonah_stories SET story_permalink = ? WHERE story_id = ?'; + $values = array($this->getStoryLink($channel, $story), $story['story_id']); + Horde::logMessage('SQL Query by Jonah_Driver_sql::_addPermalink(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->query($sql, $values); + if (!is_a($result, 'PEAR_Error')) { + $story['story_permalink'] = $values[0]; + } + } + + /** + * Gets the latest released story from a given internal channel + * + * @param int $channel_id The channel id. + * + * @return int The story id. + */ + function getLatestStoryId($channel_id) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + $sql = 'SELECT story_id FROM jonah_stories' . + ' WHERE channel_id = ? AND story_published <= ?' . + ' ORDER BY story_updated DESC'; + $values = array((int)$channel_id, time()); + + Horde::logMessage('SQL Query by Jonah_Driver_sql::getLatestStoryId(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->getRow($sql, $values, DB_FETCHMODE_ASSOC); + if (is_a($result, 'PEAR_Error')) { + Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR); + return $result; + } elseif (empty($result)) { + return PEAR::raiseError(sprintf(_("Channel \"%s\" not found."), $channel_id)); + } + + return $result['story_id']; + } + + /** + */ + function deleteStory($channel_id, $story_id) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + $sql = 'DELETE FROM jonah_stories' . + ' WHERE channel_id = ? AND story_id = ?'; + $values = array((int)$channel_id, (int)$story_id); + + Horde::logMessage('SQL Query by Jonah_Driver_sql::deleteStory(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->query($sql, $values); + if (is_a($result, 'PEAR_Error')) { + Horde::logMessage($result->getMessage(), __FILE__, __LINE__, PEAR_LOG_ERR); + return $result; + } + + $sql = 'DELETE FROM jonah_stories_tags ' . + 'WHERE channel_id = ? AND story_id = ?'; + $result = $this->_db->query($sql, $values); + if (is_a($result, 'PEAR_Error')) { + Horde::logMessage($result->getMessage(), __FILE__, __LINE__, PEAR_LOG_ERR); + return $result; + } + + return true; + } + + /** + * Write out the tags for a specific resource. + * + * @param int $resource_id The story we are tagging. + * @param int $channel_id The channel id for the story we are tagging + * @param array $tags An array of tags. + * + * @return mixed True | PEAR_Error + */ + function writeTags($resource_id, $channel_id, $tags) + { + global $conf; + + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + // First, make sure all tag names exist in the DB. + $tagkeys = array(); + $insert = $this->_db->prepare('INSERT INTO jonah_tags (tag_id, tag_name) VALUES(?, ?)'); + $query = $this->_db->prepare('SELECT tag_id FROM jonah_tags WHERE tag_name = ?'); + foreach ($tags as $tag) { + $tag = Horde_String::lower(trim($tag)); + $results = $this->_db->execute($query, $this->_db->escapeSimple($tag)); + if (is_a($results, 'PEAR_Error')) { + return $results; + } elseif ($results->numRows() == 0) { + $id = $this->_db->nextId('jonah_tags'); + $result = $this->_db->execute($insert, array($id, $tag)); + $tagkeys[] = $id; + } else { + $row = $results->fetchRow(DB_FETCHMODE_ASSOC); + $tagkeys[] = $row['tag_id']; + } + } + + // Free our resources. + $this->_db->freePrepared($insert, true); + $this->_db->freePrepared($query, true); + + $sql = 'DELETE FROM jonah_stories_tags WHERE story_id = ' . (int)$resource_id; + $query = $this->_db->prepare('INSERT INTO jonah_stories_tags (story_id, channel_id, tag_id) VALUES(?, ?, ?)'); + + Horde::logMessage('SQL query by Jonah_Driver_sql::writeTags: ' . $sql, + __FILE__, __LINE__, PEAR_LOG_DEBUG); + + $this->_db->query($sql); + foreach ($tagkeys as $key) { + $this->_db->execute($query, array($resource_id, $channel_id, $key)); + } + $this->_db->freePrepared($query, true); + + /* @TODO We should clear at least any of our cached counts */ + return true; + } + + /** + * Retrieve the tags for a specified resource. + * + * @param int $resource_id The resource to get tags for. + * + * @return mixed An array of tags | PEAR_Error + */ + function readTags($resource_id) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + $sql = 'SELECT jonah_tags.tag_id, tag_name FROM jonah_tags INNER JOIN jonah_stories_tags ON jonah_stories_tags.tag_id = jonah_tags.tag_id WHERE jonah_stories_tags.story_id = ?'; + + Horde::logMessage('SQL query by Jonah_Driver_sql::readTags ' . $sql, + __FILE__, __LINE__, PEAR_LOG_DEBUG); + + $tags = $this->_db->getAssoc($sql, false, array($resource_id), false); + return $tags; + } + + /** + * Retrieve the list of used tag_names, tag_ids and the total number + * of resources that are linked to that tag. + * + * @param array $tags An optional array of tag_ids. If omitted, all tags + * will be included. + * + * @param array $channel_id An optional array of channel_ids. + * + * @return mixed An array containing tag_name, and total | PEAR_Error + */ + function listTagInfo($tags = array(), $channel_id = null) + { + require_once 'Horde/Cache.php'; + + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + if (!is_array($channel_id) && is_numeric($channel_id)) { + $channel_id = array($channel_id); + } + $cache = $GLOBALS['injector']->getInstance('Horde_Cache'); + $cache_key = 'jonah_tags_' . md5(serialize($tags) . md5(serialize($channel_id))); + $cache_value = $cache->get($cache_key, $GLOBALS['conf']['cache']['default_lifetime']); + if ($cache_value) { + return unserialize($cache_value); + } + + $haveWhere = false; + $sql = 'SELECT tn.tag_id, tag_name, COUNT(tag_name) total FROM jonah_tags as tn INNER JOIN jonah_stories_tags as t ON t.tag_id = tn.tag_id'; + if (count($tags)) { + $sql .= ' WHERE tn.tag_id IN (' . implode(',', $tags) . ')'; + $haveWhere = true; + } + if (!is_null($channel_id)) { + if (!$haveWhere) { + $sql .= ' WHERE'; + } else { + $sql .= ' AND'; + } + $channels = array(); + foreach ($channel_id as $cid) { + $c = $this->_getChannel($cid); + if ($c['channel_type'] == JONAH_COMPOSITE_CHANNEL) { + $channels = array_merge($channels, explode(':', $c['channel_url'])); + } + } + $channel_id = array_merge($channel_id, $channels); + $sql .= ' t.channel_id IN (' . implode(', ', $channel_id) . ')'; + } + $sql .= ' GROUP BY tn.tag_id, tag_name ORDER BY total DESC;'; + $results = $this->_db->getAssoc($sql,true, array(), DB_FETCHMODE_ASSOC, false); + $cache->set($cache_key, serialize($results)); + return $results; + } + + /** + * Search for resources matching the specified criteria + * + * @param array $ids An array of tag_ids to search for. Note that + * these are AND'd together. + * @param integer $max The maximum number of stories to get. If + * null, all stories will be returned. + * @param integer $from The number of the story to start with. + * @param array $channel Limit the result set to resources + * present in these channels + * @param integer $order How to order the results for internal + * channels. Possible values are the + * JONAH_ORDER_* constants. + * + * @return mixed Array of stories| PEAR_Error + */ + function searchTagsById($ids, $max = 10, $from = 0, $channel_id = array(), + $order = JONAH_ORDER_PUBLISHED) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + if (!is_array($ids) || !count($ids)) { + $stories[] = array(); + } else { + $stories = array(); + $sql = 'SELECT DISTINCT s.story_id, s.channel_id FROM jonah_stories' + . ' as s, jonah_stories_tags as t'; + for ($i = 0; $i < count($ids); $i++) { + $sql .= ', jonah_stories_tags as t' . $i; + } + $sql .= ' WHERE s.story_id = t.story_id'; + for ($i = 0 ; $i < count($ids); $i++) { + $sql .= ' AND t' . $i . '.tag_id = ' . $ids[$i] . ' AND t' + . $i . '.story_id = t.story_id'; + } + + /* Limit to particular channels if requested */ + if (count($channel_id) > 0) { + // Have to find out if we are a composite channel or not. + $channels = array(); + foreach ($channel_id as $cid) { + $c = $this->_getChannel($cid); + if ($c['channel_type'] == JONAH_COMPOSITE_CHANNEL) { + $temp = explode(':', $c['channel_url']); + // Save a map of channels that are from composites. + foreach ($temp as $t) { + $cchannels[$t] = $cid; + } + $channels = array_merge($channels, $temp); + } + } + $channels = array_merge($channel_id, $channels); + $timestamp = time(); + $sql .= ' AND t.channel_id IN (' . implode(', ', $channels) + . ') AND s.story_published IS NOT NULL AND ' + . 's.story_published < ' . $timestamp; + } + + switch ($order) { + case JONAH_ORDER_PUBLISHED: + $sql .= ' ORDER BY story_published DESC'; + break; + case JONAH_ORDER_READ: + $sql .= ' ORDER BY story_read DESC'; + break; + case JONAH_ORDER_COMMENTS: + //@TODO + break; + } + + /* Instantiate the channel object outside the loop if we + * are only limiting to one channel. */ + if (count($channel_id) == 1) { + $channel = $this->getChannel($channel_id[0]); + } + Horde::logMessage('SQL query by Jonah_Driver_sql::searchTags: ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $results = $this->_db->limitQuery($sql, $from, $max); + if (is_a($results, 'PEAR_Error')) { + return $results; + } + + for ($i = 0; $i < $results->numRows(); $i++) { + $row = $results->fetchRow(); + $story = $this->_getStory($row[0], false); + if (count($channel_id > 1)) { + // Make sure we get the correct channel info for composites + if (!empty($cchannels[$story['channel_id']])) { + $channel = $this->getChannel($cchannels[$story['channel_id']]); + } else { + $channel = $this->getChannel($story['channel_id']); + } + } + + /* Format story link. */ + $story['story_link'] = $this->getStoryLink($channel, $story); + $story = array_merge($story, $channel); + /* Format dates. */ + $date_format = $GLOBALS['prefs']->getValue('date_format'); + $story['story_updated_date'] = strftime($date_format, $story['story_updated']); + if (!empty($story['story_published'])) { + $story['story_published_date'] = strftime($date_format, $story['story_published']); + } + + $stories[] = $story; + } + } + + return $stories; + } + + /** + * Search for articles matching specific tag name(s). + * + * @see Jonah_Driver_sql::searchTagsById() + */ + function searchTags($names, $max = 10, $from = 0, $channel_id = array(), + $order = JONAH_ORDER_PUBLISHED) + { + $ids = $this->getTagIds($names); + if (is_a($ids, 'PEAR_Error')) { + return $ids; + } + return $this->searchTagsById(array_values($ids), $max, $from, $channel_id, $order); + } + + + /** + * Return a set of tag names given the tag_ids. + * + * @param array $ids An array of tag_ids to get names for. + * + * @return mixed An array of tag names | PEAR_Error. + */ + function getTagNames($ids) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + $sql = 'SELECT t.tag_name FROM jonah_tags as t WHERE t.tag_id IN('; + $needComma = false; + foreach ($ids as $id) { + $sql .= ($needComma ? ',' : '') . '\'' . $id . '\''; + $needComma = true; + } + $sql .= ')'; + $tags = $this->_db->getCol($sql); + return $tags; + } + + /** + * Return a set of tag_ids, given the tag name + * + * @param array $names An array of names to search for + * + * @return mixed An array of tag_name => tag_ids | PEAR_Error + */ + function getTagIds($names) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + $sql = 'SELECT t.tag_name, t.tag_id FROM jonah_tags as t WHERE t.tag_name IN('; + $needComma = false; + foreach ($names as $name) { + $sql .= ($needComma ? ',' : '') . '\'' . $name . '\''; + $needComma = true; + } + $sql .= ')'; + $tags = $this->_db->getAssoc($sql); + return $tags; + } + + /** + * Attempts to open a persistent connection to the SQL server. + * + * @return boolean True on success; PEAR_Error on failure. + */ + function _connect() + { + if ($this->_connected) { + return true; + } + + Horde::assertDriverConfig($this->_params, 'news', + array('phptype', 'charset'), + 'jonah news SQL'); + + if (!isset($this->_params['database'])) { + $this->_params['database'] = ''; + } + if (!isset($this->_params['username'])) { + $this->_params['username'] = ''; + } + if (!isset($this->_params['hostspec'])) { + $this->_params['hostspec'] = ''; + } + + /* Connect to the SQL server using the supplied parameters. */ + require_once 'DB.php'; + $this->_db = &DB::connect($this->_params, + array('persistent' => !empty($this->_params['persistent']))); + if (is_a($this->_db, 'PEAR_Error')) { + return $this->_db; + } + + // Set DB portability options. + switch ($this->_db->phptype) { + case 'mssql': + $this->_db->setOption('portability', DB_PORTABILITY_LOWERCASE | DB_PORTABILITY_ERRORS | DB_PORTABILITY_RTRIM); + break; + default: + $this->_db->setOption('portability', DB_PORTABILITY_LOWERCASE | DB_PORTABILITY_ERRORS); + } + + $this->_connected = true; + return true; + } + +} diff --git a/jonah/lib/FeedParser.php b/jonah/lib/FeedParser.php new file mode 100644 index 000000000..13a3b336d --- /dev/null +++ b/jonah/lib/FeedParser.php @@ -0,0 +1,504 @@ + + * @package Jonah + */ +class Jonah_FeedParser { + + /** + * XML parser resource. + * + * @var resource + */ + var $parser; + + /** + * The current parent tag - CHANNEL, STORY, etc. + * + * @var string + */ + var $parent = ''; + + /** + * The current child tag - TITLE, DESCRIPTION, URL, etc. + * + * @var string + */ + var $child = ''; + + /** + * All the attributes of the channel description. + * + * @var array + */ + var $channel; + + /** + * All the attributes of the channel image. + * + * @var array + */ + var $image; + + /** + * All the attributes of the current story being parsed. + * + * @var array + */ + var $story; + + /** + * All the attributes of the current item being parsed. + * + * @var array + */ + var $item; + + /** + * The array that all the parsed information gets dumped into. + * + * @var array + */ + var $structure; + + /** + * What kind of feed are we parsing? + * + * @var string + */ + var $format = 'rss'; + + /** + * Error string. + * + * @var string + */ + var $error; + + /** + * Feed charset. + * + * @var string + */ + var $charset; + + /** + * Constructs a new Jonah_FeedParser parser object. + */ + function Jonah_FeedParser($charset) + { + $this->channel = array(); + $this->image = array(); + $this->item = array(); + $this->story = array(); + $this->charset = $charset; + } + + /** + * Initialize the XML parser. + */ + function init() + { + // Check that the charset is supported by the XML parser. + $allowed_charsets = array('us-ascii', 'iso-8859-1', 'utf-8', 'utf-16'); + if (!in_array($this->charset, $allowed_charsets)) { + $this->charset = 'utf-8'; + } + + // Create the XML parser. + $this->parser = xml_parser_create($this->charset); + xml_set_object($this->parser, $this); + xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, false); + xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, 'UTF-8'); + xml_set_element_handler($this->parser, 'startElement', 'endElement'); + xml_set_character_data_handler($this->parser, 'characterData'); + xml_set_default_handler($this->parser, 'defaultHandler'); + + // Disable processing instructions and external entities. + xml_set_processing_instruction_handler($this->parser, ''); + xml_set_external_entity_ref_handler($this->parser, ''); + } + + /** + * Clean up any existing data - reset to a state where we can + * cleanly open a new file. + */ + function cleanup() + { + $this->channel = array(); + $this->image = array(); + $this->item = array(); + $this->story = array(); + $this->structure = array(); + } + + /** + * Actually do the parsing. Separated from the constructor just in + * case you want to set any other options on the parser, load + * initial data, whatever. + * + * @param $data The XML feed data to parse. + */ + function parse($data) + { + $this->init(); + + // Sanity checks. + if (!$this->parser) { + $this->error = 'Could not find xml parser handle'; + return false; + } + + // Parse. + if (!@xml_parse($this->parser, $data)) { + $this->error = sprintf('XML error: %s at line %d', xml_error_string(xml_get_error_code($this->parser)), xml_get_current_line_number($this->parser)); + return false; + } + + // Clean up. + xml_parser_free($this->parser); + + return true; + } + + /** + * Start collecting data about a new element. + */ + function startElement($parser, $name, $attribs) + { + $name = Horde_String::upper($name); + $attribs = array_change_key_case($attribs, CASE_LOWER); + + switch ($name) { + case 'FEED': + $this->format = 'atom'; + + case 'CHANNEL': + case 'IMAGE': + case 'ITEM': + case 'ENTRY': + case 'TEXTINPUT': + $this->parent = $name; + break; + + case 'LINUXTODAY': + case 'UUTISET': + $this->parent = 'channel'; + break; + + case 'UUTINEN': + $this->parent = 'item'; + break; + + case 'STORYLIST': + $this->structure['type'] = 'storylist'; + break; + + case 'RATING': + case 'DESCRIPTION': + case 'WIDTH': + case 'HEIGHT': + case 'LANGUAGE': + case 'MANAGINGEDITOR': + case 'WEBMASTER': + case 'COPYRIGHT': + case 'LASTBUILDDATE': + case 'AUTHOR': + case 'TOPIC': + case 'COMMENTS': + // Userland story format. + case 'POSTTIME': + case 'CHANNELTITLE': + case 'CHANNELURL': + case 'USERLANDCHANNELID': + case 'STORYTEXT': + $this->child = Horde_String::lower($name); + break; + + case 'LINK': + $this->child = 'link'; + if ($this->format == 'atom' && !empty($attribs['href'])) { + if ($this->parent == 'FEED') { + $target = &$this->channel; + } else { + $target = &$this->item; + } + + // For now, make the alternate link, which is most likely to + // point to the HTML copy of the article, the default one - or, + // if there isn't yet a link and the rel is empty, use it. + if ((empty($target['link']) && empty($attribs['rel'])) || + (isset($attribs['rel']) && $attribs['rel'] == 'alternate')) { + $target['link'] = $attribs['href']; + } + + // Store all links named by their rel. + if (!empty($attribs['rel'])) { + $rel = 'link-' . $attribs['rel']; + if (isset($target[$rel])) { + if (!is_array($target[$rel])) { + $target[$rel] = array($target[$rel]); + } + $target[$rel][] = $attribs['href']; + } else { + $target[$rel] = $attribs['href']; + } + } + } + break; + + case 'NAME': + if ($this->child != 'author') { + $this->child = Horde_String::lower($name); + } + break; + + // Atom feed entry body. + case 'CONTENT': + $this->child = 'body'; + if (isset($attribs['type']) && ($attribs['type'] == 'text/html' || $attribs['type'] == 'html')) { + $this->item['body_type'] = 'html'; + } + break; + + // Atom feed entry summary. + case 'SUMMARY': + $this->child = 'description'; + break; + + // If we're inside an ITEM, consider this a LINK. + case 'URL': + if ($this->parent == 'item') { + $this->child = 'link'; + } else { + $this->child = 'url'; + } + break; + + // For My.Userland channels, let these be STORY tags; + // otherwise, map them to ITEMs. + case 'STORY': + if ($this->parent == 'storylist') { + $this->parent = 'story'; + } else { + $this->parent = 'item'; + } + break; + + // Nonstandard bits that we want to map to standard bits. + case 'TITLE': + case 'OTSIKKO': + $this->child = 'title'; + break; + + case 'PUBLISHED': + case 'PUBDATE': + case 'TIME': + case 'PVM': + $this->child = 'pubdate'; + break; + + case 'MODIFIED': + case 'UPDATED': + $this->child = 'moddate'; + break; + + // More Atom dates. + case 'CREATED': + case 'ISSUED': + $this->child = Horde_String::lower($name); + break; + + case 'RDF:RDF': + case 'RSS': + $this->child = 'junk'; + break; + + // For Yahoo's media namespace extensions + // see http://search.yahoo.com/mrss + // Specs say that elements other than content may be + // either children of media:content OR siblings, so + // we don't nest these elements. + case 'MEDIA:CONTENT': + $this->child = 'media:content'; + foreach ($attribs as $aname => $avalue) { + $this->item[$this->child][$aname] = $avalue; + } + break; + case 'MEDIA:THUMBNAIL': + $this->child = 'media:thumbnail'; + foreach ($attribs as $aname => $avalue) { + $this->item[$this->child][$aname] = $avalue; + } + break; + case 'MEDIA:TITLE': + $this->child = 'media:title'; + break; + case 'MEDIA:DESCRIPTION': + $this->child = 'media:description'; + foreach ($attribs as $aname => $avalue) { + $this->item[$this->child][$aname] = $avalue; + } + // Ensure we have a default + $this->item[$this->child]['value'] = ''; + break; + case 'MEDIA:GROUP': + $this->child='media:group'; + break; + case 'MEDIA:KEYWORDS': + $this->child='media:keywords'; + break; + + default: + if ($this->format == 'atom' && in_array($this->child, array('body', 'description'))) { + if (!isset($this->item[$this->child])) { + $this->item[$this->child] = ''; + } + + $tag = Horde_String::lower($name); + switch ($tag) { + case 'br': + case 'hr': + $this->item[$this->child] .= '<' . $tag . '/>'; + break; + + default: + $this->item[$this->child] .= '<' . $tag; + foreach ($attribs as $aname => $avalue) { + $this->item[$this->child] .= ' ' . $aname . '="' . $avalue . '"'; + } + $this->item[$this->child] .= '>'; + break; + } + } else { + $this->child = 'junk'; + } + break; + } + } + + /** + * Handle the ends of XML elements - wrap up whatever we've been + * putting together and store it for safekeeping. + */ + function endElement($parser, $name) + { + $name = Horde_String::upper($name); + switch ($name) { + case 'CHANNEL': + case 'FEED': + $this->format = 'atom'; + $this->structure['channel'] = $this->channel; + break; + + case 'IMAGE': + $this->structure['image'] = $this->image; + break; + + case 'STORY': + if ($this->parent == 'storylist') { + $this->structure['stories'][] = $this->story; + $this->story = array(); + } else { + $this->structure['items'][] = $this->item; + $this->item = array(); + } + break; + + case 'TEXTINPUT': + $this->item['textinput'] = true; + // No break here; continue to the next case. + + case 'UUTINEN': + case 'ITEM': + case 'ENTRY': + $this->structure['items'][] = $this->item; + $this->item = array(); + break; + default: + if ($this->format == 'atom' && in_array($this->child, array('body', 'description'))) { + if (!isset($this->item[$this->child])) { + $this->item[$this->child] = ''; + } + + $tag = Horde_String::lower($name); + switch ($tag) { + case 'br': + case 'hr': + break; + + default: + $this->item[$this->child] .= ''; + break; + } + } + + } + } + + /** + * The handler for character data encountered in the XML file. + */ + function characterData($parser, $data) + { + if (preg_match('|\S|', $data)) { + switch ($this->parent) { + case 'CHANNEL': + case 'FEED': + if (!isset($this->channel[$this->child])) { + $this->channel[$this->child] = ''; + } + $this->channel[$this->child] = $data; + break; + + case 'IMAGE': + if (!isset($this->image[$this->child])) { + $this->image[$this->child] = ''; + } + $this->image[$this->child] .= $data; + break; + + case 'STORY': + if (!isset($this->story[$this->child])) { + $this->story[$this->child] = ''; + } + $this->story[$this->child] .= $data; + break; + + default: + switch ($this->child) { + case 'media:description': + $this->item[$this->child]['value'] = $data; + break; + + default: + + if (!isset($this->item[$this->child])) { + $this->item[$this->child] = ''; + } + $this->item[$this->child] .= $data; + break; + } + } + } + } + + /** + * Handles things that we don't recognize. A no-op. + */ + function defaultHandler($parser, $data) + { + } + +} diff --git a/jonah/lib/Forms/Feed.php b/jonah/lib/Forms/Feed.php new file mode 100644 index 000000000..f3fd78b08 --- /dev/null +++ b/jonah/lib/Forms/Feed.php @@ -0,0 +1,130 @@ + + * @author Chuck Hagenbuch + * @package Jonah + */ +class FeedForm extends Horde_Form +{ + /** + */ + function FeedForm(&$vars) + { + $channel_id = $vars->get('channel_id'); + $editing = (!empty($channel_id)); + + parent::Horde_Form($vars, ($editing ? _("Edit Feed") : _("New Feed"))); + + $this->addHidden('', 'channel_id', 'int', false); + $this->addHidden('', 'old_channel_type', 'text', false); + + $select_type =& $this->addVariable(_("Type"), 'channel_type', 'enum', true, false, null, array(Jonah_News::getAvailableTypes())); + $select_type->setDefault(Jonah_News::getDefaultType()); + $select_type->setHelp('feed-type'); + $select_type->setAction(Horde_Form_Action::factory('submit')); + + $this->addVariable(_("Name"), 'channel_name', 'text', true); + $this->addVariable(_("Extra information for this feed type"), 'extra_info', 'header', false); + } + + /** + */ + function getInfo(&$vars, &$info) + { + parent::getInfo($vars, $info); + if ($vars->get('channel_type') == JONAH_COMPOSITE_CHANNEL && + is_array($vars->get('subchannels'))) { + $info['channel_url'] = implode(':', $vars->get('subchannels')); + } + } + + /** + */ + function setExtraFields($type = null, $channel_id = null) + { + if (is_null($type)) { + $type = Jonah_News::getDefaultType(); + } + + switch ($type) { + case JONAH_INTERNAL_CHANNEL: + $this->addVariable(_("Description"), 'channel_desc', 'text', false); + $this->addVariable( + _("Channel Slug"), 'channel_slug', 'text', true, false, + sprintf(_("Slugs allows direct access to this channel's content by visiting: %s.
Slug names may contain only letters, numbers or the _ (underscore) character."), + Horde::applicationUrl('slugname', true)), + array('/^[a-zA-Z1-9_]*$/')); + + $this->addVariable(_("Include full story content in syndicated feeds?"), 'channel_full_feed', 'boolean', false); + $this->addVariable(_("Channel URL if not the default one. %c gets replaced by the feed ID."), 'channel_link', 'text', false); + $this->addVariable(_("Channel URL for further pages, if not the default one. %c gets replaced by the feed ID, %n by the story offset."), 'channel_page_link', 'text', false); + $this->addVariable(_("Story URL if not the default one. %c gets replaced by the feed ID, %s by the story ID."), 'channel_story_url', 'text', false); + break; + + case JONAH_EXTERNAL_CHANNEL: + $interval = Jonah_News::getIntervalLabel(); + $v = &$this->addVariable(_("Caching"), 'channel_interval', 'enum', false, false, _("The interval before stories in this feed are rechecked for updates. If none, then stories will always be refetched from the source."), array($interval)); + $v->setDefault('86400'); + $this->addVariable(_("Source URL"), 'channel_url', 'text', true, false, _("The url to use to fetch the stories, for example 'http://www.example.com/stories.rss'")); + $this->addVariable(_("Link"), 'channel_link', 'text', false); + $this->addVariable(_("Image"), 'channel_img', 'text', false); + break; + + case JONAH_AGGREGATED_CHANNEL: + $this->addHidden('', 'channel_url', 'text', false); + $interval = Jonah_News::getIntervalLabel(); + $this->addVariable(_("Description"), 'channel_desc', 'text', false); + $v = &$this->addVariable(_("Caching"), 'channel_interval', 'enum', false, false, _("The interval before stories aggregated into this feeds are rechecked for updates. If none, then stories will always be refetched from the sources."), array($interval)); + $v->setDefault('86400'); + if (!empty($channel_id)) { + $edit_url = Horde::applicationUrl('channels/aggregate.php'); + $edit_url = Horde_Util::addParameter($edit_url, 'channel_id', $channel_id); + $edit_url = Horde_Util::addParameter($edit_url, 'channel_id', $channel_id); + $this->addVariable(_("Source URLs"), 'channel_urls', 'link', false, false, null, array(array('text' => _("Edit aggregated feeds"), 'url' => $edit_url))); + } + break; + + case JONAH_COMPOSITE_CHANNEL: + global $news; + $channels = $news->getChannels(JONAH_INTERNAL_CHANNEL); + $enum = array(); + foreach ($channels as $channel) { + $enum[$channel['channel_id']] = $channel['channel_name']; + } + $this->addVariable(_("Description"), 'channel_desc', 'text', false); + $this->addVariable(_("Channel URL if not the default one. %c gets replaced by the feed ID, %n by the story offset."), 'channel_page_link', 'text', false); + $this->addVariable(_("Story URL if not the default one. %c gets replaced by the feed ID, %s by the story ID."), 'channel_story_url', 'text', false); + $v = &$this->addVariable(_("Composite feeds"), 'subchannels', 'multienum', false, false, '', array($enum)); + if (!empty($channel_id)) { + $channel = $news->getChannel($channel_id); + $v->setDefault(explode(':', $channel['channel_url'])); + } + break; + } + } + +} diff --git a/jonah/lib/Forms/Story.php b/jonah/lib/Forms/Story.php new file mode 100644 index 000000000..68f334e24 --- /dev/null +++ b/jonah/lib/Forms/Story.php @@ -0,0 +1,112 @@ + + * @author Chuck Hagenbuch + * @package Jonah + */ +class StoryForm extends Horde_Form +{ + /** + */ + function StoryForm(&$vars) + { + parent::Horde_Form($vars, $vars->get('story_id') ? _("Edit Story") : _("Add New Story")); + + $this->setButtons(_("Save"), true); + $this->addHidden('', 'channel_id', 'int', false); + $this->addHidden('', 'story_id', 'int', false); + $this->addHidden('', 'story_read', 'int', false); + $this->addVariable(_("Story Title (Headline)"), 'story_title', 'text', true); + $this->addVariable(_("Short Description"), 'story_desc', 'longtext', true, false, null, array(2, 80)); + $this->addVariable(_("Publish Now?"), 'publish_now', 'boolean', false); + + $published = $vars->get('story_published'); + if ($published) { + $date_params = array(min(date('Y', $published), date('Y')), + max(date('Y', $published), date('Y') + 10)); + } else { + $date_params = array(); + } + + $d = &$this->addVariable(_("Or publish on this date:"), 'publish_date', 'monthdayyear', false, false, null, $date_params); + $d->setDefault($published); + + $t = &$this->addVariable('', 'publish_time', 'hourminutesecond', false); + $t->setDefault($published); + + $v = &$this->addVariable(_("Story body type"), 'story_body_type', 'enum', false, false, null, array(Jonah::getBodyTypes())); + $v->setAction(Horde_Form_Action::factory('submit')); + $v->setOption('trackchange', true); + + /* If no body type specified, default to one. */ + $body_type = $vars->get('story_body_type'); + if (empty($body_type)) { + $body_type = Jonah::getDefaultBodyType(); + $vars->set('story_body_type', $body_type); + } + + /* Set up the fields according to what the type of body requested. */ + if ($body_type == 'text') { + $this->addVariable(_("Full Story Text"), 'story_body', 'longtext', false, false, null, array(15, 80)); + } elseif ($body_type == 'richtext') { + $this->addVariable(_("Full Story Text"), 'story_body', 'longtext', false, false, null, array(20, 80, array('rte'))); + } + + $this->addVariable(_("Tags"), 'story_tags', 'text', false, false, _("Enter keywords to tag this story, separated by commas")); + /* Only show URL insertion if it has been enabled in config. */ + if (in_array('links', $GLOBALS['conf']['news']['story_types'])) { + $this->addVariable(_("Story URL"), 'story_url', 'text', false, false, _("If you enter a URL without a full story text, clicking on the story will send the reader straight to the URL, otherwise it will be shown at the end of the full story.")); + } + } + + /** + */ + function getInfo(&$vars, &$info) + { + parent::getInfo($vars, $info); + + /* Build release date. */ + if (!empty($info['publish_now'])) { + $info['story_published'] = time(); + } elseif (!empty($info['publish_date'])) { + $info['story_published'] = mktime( + (int)$info['publish_time']['hour'], + (int)$info['publish_time']['minute'], + 0, + date('n', $info['publish_date']), + date('j', $info['publish_date']), + date('Y', $info['publish_date'])); + } else { + $info['story_published'] = null; + } + + unset($info['publish_now']); + unset($info['publish_date']); + unset($info['publish_time']); + } + +} diff --git a/jonah/lib/Jonah.php b/jonah/lib/Jonah.php new file mode 100644 index 000000000..54e9dee73 --- /dev/null +++ b/jonah/lib/Jonah.php @@ -0,0 +1,265 @@ + + * @author Eric Rechlin + * @package Jonah + */ +class Jonah { + + /** + */ + function _readURL($url) + { + global $conf; + + $options['method'] = 'GET'; + $options['timeout'] = 5; + $options['allowRedirects'] = true; + + if (!empty($conf['http']['proxy']['proxy_host'])) { + $options = array_merge($options, $conf['http']['proxy']); + } + + require_once 'HTTP/Request.php'; + $http = new HTTP_Request($url, $options); + @$http->sendRequest(); + if ($http->getResponseCode() != 200) { + return PEAR::raiseError(sprintf(_("Could not open %s."), $url)); + } + + $result = array('body' => $http->getResponseBody()); + $content_type = $http->getResponseHeader('Content-Type'); + if (preg_match('/.*;\s?charset="?([^"]*)/', $content_type, $match)) { + $result['charset'] = $match[1]; + } elseif (preg_match('/<\?xml[^>]+encoding=["\']?([^"\'\s?]+)[^?].*?>/i', $result['body'], $match)) { + $result['charset'] = $match[1]; + } + + return $result; + } + + /** + * Returns a drop-down select box to choose which view to display. + * + * @param name Name to assign to select box. + * @param selected Currently selected item. (optional) + * @param onchange JavaScript onchange code. (optional) + * + * @return string Generated select box code + */ + function buildViewWidget($name, $selected = 'standard', $onchange = '') + { + require JONAH_BASE . '/config/templates.php'; + + if ($onchange) { + $onchange = ' onchange="' . $onchange . '"'; + } + + $html = ''; + } + + /** + */ + function getChannelTypeLabel($type) + { + switch ($type) { + case JONAH_INTERNAL_CHANNEL: + return _("Local Feed"); + + case JONAH_EXTERNAL_CHANNEL: + return _("External Feed"); + + case JONAH_AGGREGATED_CHANNEL: + return _("Aggregated Feed"); + + case JONAH_COMPOSITE_CHANNEL: + return _("Composite Feed"); + } + } + + /** + */ + function checkPermissions($filter, $permission = Horde_Perms::READ, $in = null) + { + if (Horde_Auth::isAdmin('jonah:admin', $permission)) { + if (empty($in)) { + // Calls with no $in parameter are checking whether this user + // has permission. Since this user is an admin, they always + // have permission. If the $in parameter is an empty array, + // the method is expected to return an array too. + return is_array($in) ? array() : true; + } else { + return $in; + } + } + + global $perms; + + $out = array(); + + switch ($filter) { + case 'internal_channels': + case 'external_channels': + if (empty($in) || !$perms->exists('jonah:news:' . $filter . ':' . $in)) { + return $perms->hasPermission('jonah:news:' . $filter, Horde_Auth::getAuth(), $permission); + } elseif (!is_array($in)) { + return $perms->hasPermission('jonah:news:' . $filter . ':' . $in, Horde_Auth::getAuth(), $permission); + } else { + foreach ($in as $key => $val) { + if ($perms->hasPermission('jonah:news:' . $filter . ':' . $val, Horde_Auth::getAuth(), $permission)) { + $out[$key] = $val; + } + } + } + break; + + case 'channels': + foreach ($in as $key => $val) { + $perm_name = Jonah::typeToPermName($val['channel_type']); + if ($perms->hasPermission('jonah:news:' . $perm_name, Horde_Auth::getAuth(), $permission) || + $perms->hasPermission('jonah:news:' . $perm_name . ':' . $val['channel_id'], Horde_Auth::getAuth(), $permission)) { + $out[$key] = $in[$key]; + } + } + break; + + default: + return $perms->hasPermission($filter, Horde_Auth::getAuth(), Horde_Perms::EDIT); + } + + return $out; + } + + /** + */ + function typeToPermName($type) + { + if ($type == JONAH_INTERNAL_CHANNEL) { + return 'internal_channels'; + } elseif ($type == JONAH_EXTERNAL_CHANNEL) { + return 'external_channels'; + } + } + + /** + * Returns an array of configured body types from Jonah's $conf array. + * + * @return array An array of body types. + */ + function getBodyTypes() + { + static $types = array(); + if (!empty($types)) { + return $types; + } + + if (in_array('richtext', $GLOBALS['conf']['news']['story_types'])) { + $types['richtext'] = _("Rich Text"); + } + + /* Other than checking if text is enabled, it is inserted by default if + * no other body type has been enabled in the config. */ + if (in_array('text', $GLOBALS['conf']['news']['story_types']) || + empty($types)) { + $types['text'] = _("Text"); + } + + return $types; + } + + /** + * Tries to figure out a default body type. Used when none has been + * specified and a types is needed to fall back on to. + * + * @return string A default type. + */ + function getDefaultBodyType() + { + $types = Jonah::getBodyTypes(); + if (isset($types['text'])) { + return 'text'; + } elseif (isset($types['richtext'])) { + return 'richtext'; + } + /* The two most common body types have not been found, so just return + * the first one that is in the array. */ + $tmp = array_keys($types); + return array_shift($tmp); + } + + /** + * Build Jonah's list of menu items. + */ + function getMenu($returnType = 'object') + { + global $registry, $conf; + + $menu = new Horde_Menu(); + + /* If authorized, show admin links. */ + if (Jonah::checkPermissions('jonah:news', Horde_Perms::EDIT)) { + $menu->addArray(array('url' => Horde::applicationUrl('channels/index.php'), 'text' => _("_Feeds"), 'icon' => 'jonah.png')); + } + foreach ($conf['news']['enable'] as $channel_type) { + if (Jonah::checkPermissions($channel_type, Horde_Perms::EDIT)) { + $menu->addArray(array('url' => Horde::applicationUrl('channels/edit.php'), 'text' => _("New Feed"), 'icon' => 'new.png')); + break; + } + } + if ($channel_id = Horde_Util::getFormData('channel_id')) { + $news = Jonah_News::factory(); + $channel = $news->getChannel($channel_id); + if ($channel['channel_type'] == JONAH_INTERNAL_CHANNEL && + Jonah::checkPermissions(Jonah::typeToPermName($channel['channel_type']), Horde_Perms::EDIT, $channel_id)) { + $menu->addArray(array('url' => Horde::applicationUrl('stories/edit.php?channel_id=' . (int)$channel_id), 'text' => _("_New Story"), 'icon' => 'new.png')); + } + } + + if ($returnType == 'object') { + return $menu; + } else { + return $menu->render(); + } + } + +} diff --git a/jonah/lib/News.php b/jonah/lib/News.php new file mode 100644 index 000000000..2c6a6f323 --- /dev/null +++ b/jonah/lib/News.php @@ -0,0 +1,839 @@ + + * @author Marko Djukic + * @author Jan Schneider + * @package Jonah + */ +class Jonah_News { + + /** + * Hash containing connection parameters. + * + * @var array + */ + var $_params = array(); + + /** + * Constructs a new News storage object. + * + * @param array $params A hash containing connection parameters. + */ + function Jonah_News($params = array()) + { + $this->_params = $params; + } + + /** + */ + function deleteChannel(&$info) + { + return $this->_deleteChannel($info['channel_id']); + } + + /** + * Fetches the requested channel, while actually passing on the request to + * the backend _getChannel() function to do the real work. + * + * @param integer $channel_id The channel id to fetch. + * + * @return array|PEAR_Error The channel details as an array or a + * PEAR_Error if not valid or not found. + */ + function getChannel($channel_id) + { + static $channel = array(); + + /* We need a non empty channel id. */ + if (empty($channel_id)) { + return PEAR::raiseError(_("Missing channel id.")); + } + + /* Cache the fetching of channels. */ + if (!isset($channel[$channel_id])) { + $channel[$channel_id] = $this->_getChannel($channel_id); + if (!is_a($channel[$channel_id], 'PEAR_Error')) { + if (empty($channel[$channel_id]['channel_link'])) { + $channel[$channel_id]['channel_official'] = Horde_Util::addParameter(Horde::applicationUrl('delivery/html.php', true, -1), 'channel_id', $channel_id, false); + } else { + $channel[$channel_id]['channel_official'] = str_replace(array('%25c', '%c'), array('%c', $channel_id), $channel[$channel_id]['channel_link']); + } + } + } + + return $channel[$channel_id]; + } + + /** + * Checks if the channel is editable by first checking if the $channel_id + * returns a valid channel array and then whether the channel type is + * JONAH_INTERNAL_CHANNEL, which is the only one to allow stories to be + * added. + * + * @param integer $channel_id The channel id to check. + * + * @return array|PEAR_Error The channel details as an array or a + * PEAR_Error if not editable. + */ + function isChannelEditable($channel_id) + { + /* Check if this channel id returns a valid channel. */ + $channel = $this->getChannel($channel_id); + if (is_a($channel, 'PEAR_Error')) { + return $channel; + } + + /* Check if the channel type allows adding of stories. */ + if ($channel['channel_type'] != JONAH_INTERNAL_CHANNEL) { + return PEAR::raiseError(sprintf(_("Feed \"%s\" is not authored on this system."), $channel['channel_name'])); + } + + return $channel; + } + + /** + * Returns the most recent or all stories from a channel. + * + * @param integer $channel_id The news channel to get stories from. + * @param integer $max The maximum number of stories to get. If + * null, all stories will be returned. + * @param integer $from The number of the story to start with. + * @param boolean $refresh Force a refresh of stories in case this is + * an external channel. + * @param integer $date The timestamp of the date to start with. + * @param boolean $unreleased Return stories that have not yet been + * published? + * Defaults to false - only published stories. + * @param integer $order How to order the results for internal + * channels. Possible values are the + * JONAH_ORDER_* constants. + * + * @return array The specified number (or less, if there are fewer) of + * stories from the given channel. + */ + function getStories($channel_id, $max = 10, $from = 0, $refresh = false, + $date = null, $unreleased = false, + $order = JONAH_ORDER_PUBLISHED) + { + $channel = $this->getChannel($channel_id); + if (is_a($channel, 'PEAR_Error')) { + Horde::logMessage($channel, __FILE__, __LINE__, PEAR_LOG_ERR); + return array(); + } + + /* Fetch the stories according to channel type, using a + * template method pattern for each type. */ + $funcs = array( + JONAH_INTERNAL_CHANNEL => '_getInternalStories', + JONAH_EXTERNAL_CHANNEL => '_getExternalStories', + JONAH_AGGREGATED_CHANNEL => '_getAggregatedStories', + JONAH_COMPOSITE_CHANNEL => '_getCompositeStories', + ); + + $func = $funcs[$channel['channel_type']]; + return $this->$func($channel, $max, $from, $refresh, $date, $unreleased, $order); + } + + /** + */ + function _getInternalStories($channel, $max = 10, $from = 0, $refresh = false, + $date = null, $unreleased = false, + $order = JONAH_ORDER_PUBLISHED) + { + return $GLOBALS['jonah_driver']->legacyGetStories($channel, $max, $from, $refresh, $date, $unreleased, $order); + } + + /** + */ + function _getExternalStories($channel, $max = 10, $from = 0, $refresh = false, + $date = null, $unreleased = false, + $order = JONAH_ORDER_PUBLISHED) + { + if ($refresh) { + $channel['channel_interval'] = -1; + } + $stories = $this->fetchExternalStories($channel['channel_id'], $channel['channel_url'], $channel['channel_interval']); + array_walk($stories, array($this, '_escapeExternalStories'), $channel); + if (!is_null($max)) { + $stories = array_slice($stories, $from, $max); + } + return $stories; + } + + /** + */ + function _escapeExternalStories(&$story, $key, $channel) + { + $story = array_merge($channel, $story); + $story['story_link'] = Horde::externalUrl($story['story_url']); + } + + /** + */ + function _getAggregatedStories($channel, $max = 10, $from = 0, $refresh = false, + $date = null, $unreleased = false, + $order = JONAH_ORDER_PUBLISHED) + { + switch ($order) { + case JONAH_ORDER_PUBLISHED: + $sort = 'story_published'; + break; + + case JONAH_ORDER_READ: + $sort = 'story_read'; + break; + + case JONAH_ORDER_COMMENTS: + //@TODO + break; + } + + if ($refresh) { + $channel['channel_interval'] = -1; + } + + $stories = array(); + $date_format = $GLOBALS['prefs']->getValue('date_format'); + $channels = explode(':', $channel['channel_url']); + foreach ($channels as $id) { + $channel_data = $this->getChannel($id); + if (is_a($channel_data, 'PEAR_Error')) { + continue; + } + $externals = $this->fetchExternalStories(null, $channel_data['channel_url'], $channel['channel_interval']); + if (!is_array($externals)) { + continue; + } + + foreach ($externals as $external) { + $info = array(); + + /* Check if we have seen this story already. */ + $story = $this->_getStoryByUrl($channel['channel_id'], $external['story_url']); + if (is_array($story)) { + /* Check if the story is unchanged. */ + if ($this->getChecksum($story) == $this->getChecksum($external)) { + $story['story_updated_date'] = strftime($date_format, $story['story_updated']); + $story['story_link'] = Horde::externalUrl($story['story_url']); + $stories[] = array_merge($channel_data, $story); + continue; + } + + $info['story_id'] = $story['story_id']; + } + + $info['channel_id'] = $channel['channel_id']; + $info['story_title'] = $external['story_title']; + $info['story_desc'] = $external['story_desc']; + $info['story_url'] = $external['story_url']; + $info['story_link'] = Horde::externalUrl($external['story_url']); + $info['story_body'] = isset($external['story_body']) ? $external['story_body'] : null; + $info['story_body_type'] = isset($external['story_body_type']) ? $external['story_body_type'] : 'text'; + $info['story_published'] = $external['story_published']; + $info['story_updated'] = $external['story_updated']; + + $this->saveStory($info); + + $info['story_updated_date'] = strftime($date_format, $external['story_updated']); + $stories[] = array_merge($channel_data, $info); + } + } + + Horde_Array::arraySort($stories, $sort, 1); + if (!is_null($max)) { + $stories = array_slice($stories, $from, $max); + } + + return $stories; + } + + /** + */ + function _getCompositeStories($channel, $max = 10, $from = 0, $refresh = false, + $date = null, $unreleased = false, + $order = JONAH_ORDER_PUBLISHED) + { + switch ($order) { + case JONAH_ORDER_PUBLISHED: + $sort = 'story_published'; + break; + + case JONAH_ORDER_READ: + $sort = 'story_read'; + break; + + case JONAH_ORDER_COMMENTS: + //@TODO + break; + } + + $stories = array(); + $channels = explode(':', $channel['channel_url']); + foreach ($channels as $subchannel) { + $stories = array_merge($stories, $this->getStories($subchannel, null, 0, $refresh, $date)); + } + foreach ($stories as $key => $story) { + $stories[$key]['story_link'] = $this->getStoryLink($channel, $story); + } + Horde_Array::arraySort($stories, $sort, 1); + if (!is_null($max)) { + $stories = array_slice($stories, $from, $max); + } + return $stories; + } + + /** + */ + function saveStory(&$info) + { + /* Used for checking whether to send out delivery or not. */ + if (empty($info['story_published'])) { + /* Story is not being released. */ + $deliver = false; + } elseif (empty($info['story_id'])) { + /* Story is new. */ + $deliver = true; + } else { + /* Story is old, has it been released already? */ + $oldstory = $this->getStory(null, $info['story_id']); + if ((empty($oldstory['story_published']) || + $oldstory['story_published'] > $oldstory['story_updated']) && + $info['story_published'] <= time()) { + $deliver = true; + } else { + $deliver = false; + } + } + + /* First save to the backend. */ + $result = $this->_saveStory($info); + if (is_a($result, 'PEAR_Error') || !$deliver) { + /* Return here also if editing, do not bother doing deliveries for + * an edited story. */ + return $result; + } + } + + /** + */ + function getStory($channel_id, $story_id, $read = false) + { + $channel = null; + if ($channel_id) { + $channel = $this->getChannel($channel_id); + if (is_a($channel, 'PEAR_Error')) { + return $channel; + } + if ($channel['channel_type'] == JONAH_EXTERNAL_CHANNEL) { + return $this->_getExternalStory($channel, $story_id); + } + } + + $story = $this->_getStory($story_id, $read); + if (is_a($story, 'PEAR_Error')) { + return $story; + } + + /* Format story link. */ + $story['story_link'] = $this->getStoryLink($channel, $story); + + /* Format dates. */ + $date_format = $GLOBALS['prefs']->getValue('date_format'); + $story['story_updated_date'] = strftime($date_format, $story['story_updated']); + if (!empty($story['story_published'])) { + $story['story_published_date'] = strftime($date_format, $story['story_published']); + } + + return $story; + } + + /** + * Returns the official link to a story. + * + * @param array $channel A channel hash. + * @param array $story A story hash. + * + * @return string The story link. + */ + function getStoryLink($channel, $story) + { + if ((empty($story['story_url']) || !empty($story['story_body'])) && + !empty($channel['channel_story_url'])) { + $url = $channel['channel_story_url']; + } else { + $url = Horde_Util::addParameter(Horde::applicationUrl('stories/view.php', true, -1), array('channel_id' => '%c', 'story_id' => '%s'), null, false); + } + return str_replace(array('%25c', '%25s', '%c', '%s'), + array('%c', '%s', $channel['channel_id'], $story['story_id']), + $url); + } + + /** + */ + function getChecksum($story) + { + return md5($story['story_title'] . $story['story_desc']); + } + + /** + * Fetches a story list from an external channel, caching the data + * and only actually fetching if there is no valid cache. + * + * @param integer $channel_id The channel id to fetch. + * @param string $url The url from where to fetch the story list. + * @param integer $interval The interval in seconds since the last fetch + * after which the cache will be considered + * expired and an actual fetch will be done. + * + * @return array An array of available stories. + */ + function fetchExternalStories($channel_id, $url, $interval) + { + require_once 'Horde/Cache.php'; + require_once 'Horde/Serialize.php'; + + $cache = $GLOBALS['injector']->getInstance('Horde_Cache'); + $timestamp = time(); + if (is_a($cache, 'Horde_Cache') && ($stories = $cache->get($url, $interval))) { + $stories = Horde_Serialize::unserialize($stories, Horde_Serialize::UTF7_BASIC, Horde_Nls::getCharset()); + } else { + $stories = Jonah_News::_fetchExternalStories($url, $timestamp); + $cache->set($url, Horde_Serialize::serialize($stories, Horde_Serialize::UTF7_BASIC, Horde_Nls::getCharset())); + } + + /* If the stories from cache return the same timestamp as + * $timestamp it means that the cache has been refreshed. */ + if ($channel_id !== null) { + if ($stories['timestamp'] == $timestamp) { + $this->_timestampChannel($channel_id, $timestamp); + } + } + + unset($stories['timestamp']); + return $stories; + } + + /** + */ + function getIntervalLabel($seconds = null) + { + $interval = array(1 => _("none"), + 1800 => _("30 mins"), + 3600 => _("1 hour"), + 7200 => _("2 hours"), + 14400 => _("4 hours"), + 28800 => _("8 hours"), + 43200 => _("12 hours"), + 86400 => _("24 hours")); + + if ($seconds === null) { + return $interval; + } else { + return $interval[$seconds]; + } + } + + /** + * Returns the available channel types based on what was set in the + * configuration. + * + * @return array The available news channel types. + */ + function getAvailableTypes() + { + if (isset($types)) { + return $types; + } + + static $types = array(); + + if (empty($GLOBALS['conf']['news']['enable'])) { + return $types; + } + if (in_array('external', $GLOBALS['conf']['news']['enable'])) { + $types[JONAH_EXTERNAL_CHANNEL] = _("External Feed"); + } + if (in_array('internal', $GLOBALS['conf']['news']['enable'])) { + $types[JONAH_INTERNAL_CHANNEL] = _("Local Feed"); + } + if (in_array('aggregated', $GLOBALS['conf']['news']['enable'])) { + $types[JONAH_AGGREGATED_CHANNEL] = _("Aggregated Feed"); + } + if (in_array('composite', $GLOBALS['conf']['news']['enable'])) { + $types[JONAH_COMPOSITE_CHANNEL] = _("Composite Feed"); + } + + return $types; + } + + /** + * Returns the default channel type based on what was set in the + * configuration. + * + * @return integer The default news channel type. + */ + function getDefaultType() + { + if (in_array('external', $GLOBALS['conf']['news']['enable'])) { + return JONAH_EXTERNAL_CHANNEL; + } else { + return JONAH_INTERNAL_CHANNEL; + } + } + + /** + * Returns the stories of a channel rendered with the specified template. + * + * @param integer $channel_id The news channel to get stories from. + * @param string $tpl The name of the template to use. + * @param integer $max The maximum number of stories to get. If + * null, all stories will be returned. + * @param integer $from The number of the story to start with. + * @param integer $order How to sort the results for internal channels + * Possible values are the JONAH_ORDER_* + * constants. + * + * @return string The rendered story listing. + */ + function renderChannel($channel_id, $tpl, $max = 10, $from = 0, $order = JONAH_ORDER_PUBLISHED) + { + $channel = $this->getChannel($channel_id); + if (is_a($channel, 'PEAR_Error')) { + return sprintf(_("Error fetching feed: %s"), $channel->getMessage()); + } + + include JONAH_BASE . '/config/templates.php'; + $escape = !isset($templates[$tpl]['escape']) || + !empty($templates[$tpl]['escape']); + $template = new Horde_Template(); + + if ($escape) { + $channel['channel_name'] = htmlspecialchars($channel['channel_name']); + $channel['channel_desc'] = htmlspecialchars($channel['channel_desc']); + } + $template->set('channel', $channel, true); + + /* Get one story more than requested to see if there are more + * stories. */ + if ($max !== null) { + $stories = $this->getStories($channel_id, $max + 1, $from, false, time(), false, $order); + if (is_a($stories, 'PEAR_Error')) { + return $stories->getMessage(); + } + } else { + $stories = $this->getStories($channel_id, null, 0, false, time(), false, $order); + if (is_a($stories, 'PEAR_Error')) { + return $stories->getMessage(); + } + $max = count($stories); + } + + if (!$stories) { + $template->set('error', _("No stories are currently available."), true); + $template->set('stories', false, true); + $template->set('image', false, true); + $template->set('form', false, true); + } else { + /* Escape. */ + if ($escape) { + array_walk($stories, array($this, '_escapeStories')); + } + + /* Process story summaries. */ + array_walk($stories, array($this, '_escapeStoryDescriptions')); + + $template->set('error', false, true); + $template->set('story_marker', Horde::img('story_marker.png')); + $template->set('image', false, true); + $template->set('form', false, true); + if ($from) { + $template->set('previous', max(0, $from - $max), true); + } else { + $template->set('previous', false, true); + } + if ($from && !empty($channel['channel_page_link'])) { + $template->set('previous_link', + str_replace( + array('%25c', '%25n', '%c', '%n'), + array('%c', '%n', $channel['channel_id'], max(0, $from - $max)), + $channel['channel_page_link']), + true); + } else { + $template->set('previous_link', false, true); + } + $more = count($stories) > $max; + if ($more) { + $template->set('next', $from + $max, true); + array_pop($stories); + } else { + $template->set('next', false, true); + } + if ($more && !empty($channel['channel_page_link'])) { + $template->set('next_link', + str_replace( + array('%25c', '%25n', '%c', '%n'), + array('%c', '%n', $channel['channel_id'], $from + $max), + $channel['channel_page_link']), + true); + } else { + $template->set('next_link', false, true); + } + + $template->set('stories', $stories, true); + } + + return $template->parse($templates[$tpl]['template']); + } + + /** + */ + function _escapeStories(&$value, $key) + { + $value['story_title'] = htmlspecialchars($value['story_title']); + $value['story_desc'] = htmlspecialchars($value['story_desc']); + if (isset($value['story_link'])) { + $value['story_link'] = htmlspecialchars($value['story_link']); + } + if (empty($value['story_body_type']) || $value['story_body_type'] != 'richtext') { + $value['story_body'] = htmlspecialchars($value['story_body']); + } + } + + /** + */ + function _escapeStoryDescriptions(&$value, $key) + { + $value['story_desc'] = nl2br($value['story_desc']); + } + + /** + * Returns the provided story as a MIME part. + * + * @param array $story A data array representing a story. + * + * @return MIME_Part The MIME message part containing the story parts. + */ + function &getStoryAsMessage(&$story) + { + require_once 'Horde/MIME/Part.php'; + + /* Add the story to the message based on the story's body type. */ + switch ($story['story_body_type']) { + case 'richtext': + /* Get a plain text version of a richtext story. */ + $body_html = $story['story_body']; + $body_text = Horde_Text_Filter::filter($body_html, 'html2text'); + + /* Add description. */ + $body_html = '

' . Horde_Text_Filter::filter($story['story_desc'], 'text2html', array('parselevel' => Horde_Text_Filter_Text2html::MICRO, 'charset' => Horde_Nls::getCharset(), 'class' => null, 'callback' => null)) . "

\n" . $body_html; + $body_text = Horde_String::wrap(' ' . $story['story_desc'], 70) . "\n\n" . $body_text; + + /* Add the text version of the story to the base message. */ + $message_text = new MIME_Part('text/plain'); + $message_text->setCharset(Horde_Nls::getCharset()); + $message_text->setContents($message_text->replaceEOL($body_text)); + $message_text->setDescription(_("Plaintext Version of Story")); + + /* Add an HTML version of the story to the base message. */ + $message_html = new MIME_Part('text/html', Horde_String::wrap($body_html), + Horde_Nls::getCharset(), 'inline'); + $message_html->setDescription(_("HTML Version of Story")); + + /* Add the two parts as multipart/alternative. */ + $basepart = new MIME_Part('multipart/alternative'); + $basepart->addPart($message_text); + $basepart->addPart($message_html); + + return $basepart; + + case 'text': + /* This is just a plain text story. */ + $message_text = new MIME_Part('text/plain'); + $message_text->setContents($message_text->replaceEOL($story['story_desc'] . "\n\n" . $story['story_body'])); + $message_text->setCharset(Horde_Nls::getCharset()); + + return $message_text; + } + } + + /** + * Attempts to return a concrete Jonah_News instance based on $driver. + * + * @param string $driver The type of concrete Jonah_News subclass to + * return. The is based on the storage driver + * ($driver). The code is dynamically included. + * + * @param array $params A hash containing any additional configuration or + * connection parameters a subclass might need. + * + * @return mixed The newly created concrete Jonah_News instance, or false + * on an error. + */ + function factory($driver = null, $params = null) + { + if ($driver === null) { + $driver = $GLOBALS['conf']['news']['storage']['driver']; + } + $driver = basename($driver); + + if ($params === null) { + $params = Horde::getDriverConfig(array('news', 'storage'), $driver); + } + + $class = 'Jonah_News_' . $driver; + if (!class_exists($class, false)) { + include dirname(__FILE__) . '/News/' . $driver . '.php'; + } + if (class_exists($class)) { + return new $class($params); + } else { + return PEAR::raiseError(sprintf(_("No such backend \"%s\" found"), $driver)); + } + } + + /** + * Get the full body of an external feed story. + * + * @access private + * + * @param array $channel The channel the story belongs to. + * @param integer $story_id The id of the story in the channel. + * + * @return array The story array. + */ + function _getExternalStory($channel, $story_id) + { + $stories = $this->fetchExternalStories($channel['channel_id'], $channel['channel_url'], $channel['channel_interval']); + if (isset($stories[$story_id])) { + return $stories[$story_id]; + } + + return PEAR::raiseError(sprintf(_("Story \"%s\" not found in \"%s\"."), $story_id, $channel['channel_title'])); + } + + /** + * This function is called if cached data isn't available and is what + * actually does the URL fetching and XML parsing to get the story list. + * It is only called if the cached data has expired or didn't exist. + * + * @access private + * + * @param string $url The url from where to fetch the story list. + * @param integer $timestamp Timestamp of this fetch. + * + * @return array An array of available stories. + */ + function _fetchExternalStories($url, $timestamp) + { + $xml = Jonah::_readURL($url); + if (is_a($xml, 'PEAR_Error')) { + Horde::logMessage($xml, __FILE__, __LINE__, PEAR_LOG_ERR); + return array('timestamp' => $timestamp); + } + + /* Parse the feed. */ + require_once JONAH_BASE . '/lib/FeedParser.php'; + $charset = empty($xml['charset']) ? 'utf-8' : $xml['charset']; + $parser = new Jonah_FeedParser($charset); + if (!$parser->parse($xml['body'])) { + if (isset($GLOBALS['notification'])) { + $GLOBALS['notification']->push(sprintf(_("Error parsing external feed from %s: %s"), $url, $parser->error), 'warning'); + } else { + Horde::logMessage(sprintf("Error parsing external feed from %s: %s", $url, $parser->error), __FILE__, __LINE__, PEAR_LOG_ERR); + } + } + $stories = $parser->structure; + $parser->cleanup(); + + /* Set the passed timestamp. */ + $items = array('timestamp' => $timestamp); + if (!empty($stories['items'])) { + foreach ($stories['items'] as $key => $story) { + $items[$key]['story_id'] = $key; + $items[$key]['story_title'] = isset($story['title']) ? Horde_String::convertCharset($story['title'], 'utf-8') : _("[No title]"); + $items[$key]['story_desc'] = isset($story['description']) ? Horde_String::convertCharset($story['description'], 'utf-8') : ''; + $items[$key]['story_url'] = isset($story['link']) ? $story['link'] : ''; + + /* Set the body, and filter it if it's HTML */ + $items[$key]['story_body'] = isset($story['body']) ? Horde_String::convertCharset($story['body'], 'utf-8') : null; + $items[$key]['story_body_type'] = isset($story['body_type']) ? Horde_String::convertCharset($story['body_type'], 'utf-8') : 'text'; + if ($items[$key]['story_body_type'] == 'html') { + $items[$key]['story_body'] = Horde_Text_Filter::filter($items[$key]['story_body'], 'xss'); + } + + if (isset($story['pubdate']) && $pubdate_dt = strtotime($story['pubdate'])) { + $items[$key]['story_published'] = $pubdate_dt; + } else { + $items[$key]['story_published'] = $timestamp; + } + + if (isset($story['moddate']) && $moddate_dt = strtotime($story['moddate'])) { + $items[$key]['story_updated'] = $moddate_dt; + } else { + $items[$key]['story_updated'] = $timestamp; + } + + // Media related + if (isset($story['media:content']) && is_array($story['media:content'])) { + $items[$key]['story_media_content_url'] = $story['media:content']['url']; + $items[$key]['story_media_content_type'] = empty($story['media:content']['type']) ? null : $story['media:content']['type']; + $items[$key]['story_media_title'] = isset($story['media:title']) ? $story['media:title'] : ''; + $items[$key]['story_media_description'] = isset($story['media:description']['value']) ? $story['media:description']['value'] : ''; + $items[$key]['story_media_description_type'] = isset($story['media:description']['type']) ? $story['media:description']['type'] : ''; + $items[$key]['story_media_thumbnail_url'] = (isset($story['media:thumbnail']['url']) ? $story['media:thumbnail']['url'] : (isset($story['media:content']['url']) ? $story['media:content']['url'] : '')); + } + } + } + + return $items; + } + + /** + * Stubs for the tag functions. If supported by the backend, these need + * to be implemented in the concrete Jonah_News_* class. + */ + function writeTags($resource_id, $channel_id, $tags) + { + return PEAR::raiseError(_("Tag support not enabled in backend.")); + } + + function readTags($resource_id) + { + return PEAR::raiseError(_("Tag support not enabled in backend.")); + } + + function listTagInfo($tags = array(), $channel_id = null) + { + return PEAR::raiseError(_("Tag support not enabled in backend.")); + } + + function searchTagsById($ids, $max = 10, $from = 0, $channel_id = array(), + $order = JONAH_ORDER_PUBLISHED) + { + return PEAR::raiseError(_("Tag support not enabled in backend.")); + } + + function getTagNames($ids) + { + return PEAR::raiseError(_("Tag support not enabled in backend.")); + } + + +} diff --git a/jonah/lib/News/sql.php b/jonah/lib/News/sql.php new file mode 100644 index 000000000..0e8dc8381 --- /dev/null +++ b/jonah/lib/News/sql.php @@ -0,0 +1,900 @@ + + * 'phptype' The database type (e.g. 'pgsql', 'mysql', etc.). + * 'charset' The database's internal charset. + * + * Required by some database implementations:
+ *      'hostspec'      The hostname of the database server.
+ *      'protocol'      The communication protocol ('tcp', 'unix', etc.).
+ *      'database'      The name of the database.
+ *      'username'      The username with which to connect to the database.
+ *      'password'      The password associated with 'username'.
+ *      'options'       Additional options to pass to the database.
+ *      'tty'           The TTY on which to connect to the database.
+ *      'port'          The port on which to connect to the database.
+ * + * The table structure can be created by the scripts/db/jonah_news.sql + * script. The needed tables are jonah_channels and jonah_stories. + * + * $Horde: jonah/lib/News/sql.php,v 1.119 2010/02/01 10:32:04 jan Exp $ + * + * Copyright 2002-2009 The Horde Project (http://www.horde.org/) + * + * See the enclosed file LICENSE for license information (BSD). If you did not + * did not receive this file, see http://cvs.horde.org/co.php/jonah/LICENSE. + * + * @author Marko Djukic + * @author Chuck Hagenbuch + * @author Jan Schneider + * @package Jonah + */ +class Jonah_News_sql extends Jonah_News { + + /** + * Handle for the current database connection. + * + * @var DB + */ + var $_db; + + /** + * Boolean indicating whether or not we're connected to the SQL server. + * + * @var boolean + */ + var $_connected = false; + + /** + * Saves a channel to the backend. + * + * @param array $info The channel to add. + * Must contain a combination of the following + * entries: + *
+     * 'channel_id'       If empty a new channel is being added, otherwise one
+     *                    is being edited.
+     * 'channel_name'     The headline.
+     * 'channel_desc'     A description of this channel.
+     * 'channel_type'     Whether internal or external.
+     * 'channel_interval' If external then interval at which to refresh.
+     * 'channel_link'     The link to the source.
+     * 'channel_url'      The url from where to fetch the story list.
+     * 'channel_image'    A channel image.
+     * 
+ * + * @return int|PEAR_Error The channel ID on success, PEAR_Error on + * failure. + */ + function saveChannel(&$info) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + if (empty($info['channel_id'])) { + $info['channel_id'] = $this->_db->nextId('jonah_channels'); + if (is_a($info['channel_id'], 'PEAR_Error')) { + Horde::logMessage($info['channel_id'], __FILE__, __LINE__, PEAR_LOG_ERR); + return $info['channel_id']; + } + $sql = 'INSERT INTO jonah_channels' . + ' (channel_id, channel_name, channel_slug, channel_type, channel_full_feed, channel_desc, channel_interval, channel_url, channel_link, channel_page_link, channel_story_url, channel_img)' . + ' VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'; + $values = array(); + } else { + $sql = 'UPDATE jonah_channels' . + ' SET channel_id = ?, channel_name = ?, channel_slug = ?, channel_type = ?, channel_full_feed = ?, channel_desc = ?, channel_interval = ?, channel_url = ?, channel_link = ?, channel_page_link = ?, channel_story_url = ?, channel_img = ?' . + ' WHERE channel_id = ?'; + $values = array((int)$info['channel_id']); + } + + array_unshift($values, + (int)$info['channel_id'], + Horde_String::convertCharset($info['channel_name'], Horde_Nls::getCharset(), $this->_params['charset']), + isset($info['channel_slug']) ? $info['channel_slug'] : '', + (int)$info['channel_type'], + (int)$info['channel_full_feed'], + isset($info['channel_desc']) ? $info['channel_desc'] : null, + isset($info['channel_interval']) ? (int)$info['channel_interval'] : null, + isset($info['channel_url']) ? $info['channel_url'] : null, + isset($info['channel_link']) ? $info['channel_link'] : null, + isset($info['channel_page_link']) ? $info['channel_page_link'] : null, + isset($info['channel_story_url']) ? $info['channel_story_url'] : null, + isset($info['channel_img']) ? $info['channel_img'] : null); + Horde::logMessage('SQL Query by Jonah_News_sql::saveChannel(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->query($sql, $values); + if (is_a($result, 'PEAR_Error')) { + Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR); + return $result; + } + + return $info['channel_id']; + } + + /** + * Get a list of stored channels. + * + * @param integer $type The type of channel to filter for. Possible + * values are either JONAH_INTERNAL_CHANNEL + * to fetch only a list of internal channels, + * or JONAH_EXTERNAL_CHANNEL for only external. + * If null both channel types are returned. + * + * @return mixed An array of channels or PEAR_Error on error. + */ + function getChannels($type = null) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + $wsql = ''; + if (!is_null($type)) { + if (!is_array($type)) { + $type = array($type); + } + for ($i = 0, $i_max = count($type); $i < $i_max; ++$i) { + $type[$i] = 'channel_type = ' . (int)$type[$i]; + } + $wsql = 'WHERE ' . implode(' OR ', $type); + } + + $sql = sprintf('SELECT channel_id, channel_name, channel_type, channel_updated FROM jonah_channels %s ORDER BY channel_name', $wsql); + + Horde::logMessage('SQL Query by Jonah_News_sql::getChannels(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->getAll($sql, DB_FETCHMODE_ASSOC); + if (is_a($result, 'PEAR_Error')) { + Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR); + return $result; + } + for ($i = 0; $i < count($result); $i++) { + $result[$i]['channel_name'] = Horde_String::convertCharset($result[$i]['channel_name'], $this->_params['charset']); + } + + return $result; + } + + /** + */ + function _getChannel($channel_id) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + $sql = 'SELECT * FROM jonah_channels WHERE channel_id = ' . (int)$channel_id; + + Horde::logMessage('SQL Query by Jonah_News_sql::_getChannel(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->getRow($sql, DB_FETCHMODE_ASSOC); + if (is_a($result, 'PEAR_Error')) { + Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR); + return $result; + } elseif (empty($result)) { + return PEAR::raiseError(sprintf(_("Channel id \"%s\" not found."), $channel_id)); + } + + $result['channel_name'] = Horde_String::convertCharset($result['channel_name'], $this->_params['charset']); + if ($result['channel_type'] == JONAH_COMPOSITE_CHANNEL) { + $channels = explode(':', $result['channel_url']); + if (count($channels)) { + $sql = 'SELECT MAX(channel_updated) FROM jonah_channels WHERE channel_id IN (' . implode(',', $channels) . ')'; + Horde::logMessage('SQL Query by Jonah_News_sql::_getChannel(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $updated = $this->_db->getOne($sql); + if (is_a($updated, 'PEAR_Error')) { + Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR); + } else { + $result['channel_updated'] = $updated; + $this->_timestampChannel($channel_id, $updated); + } + } + } + + return $result; + } + + /** + */ + function _timestampChannel($channel_id, $timestamp) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + $sql = sprintf('UPDATE jonah_channels SET channel_updated = %s WHERE channel_id = %s', + (int)$timestamp, + (int)$channel_id); + Horde::logMessage('SQL Query by Jonah_News_sql::_timestampChannel(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->query($sql); + if (is_a($result, 'PEAR_Error')) { + Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR); + } + return $result; + } + + /** + */ + function _readStory($story_id) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + $sql = 'UPDATE jonah_stories SET story_read = story_read + 1 WHERE story_id = ' . (int)$story_id; + Horde::logMessage('SQL Query by Jonah_News_sql::_readStory(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->query($sql); + if (is_a($result, 'PEAR_Error')) { + Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR); + } + return $result; + } + + /** + */ + function _deleteChannel($channel_id) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + $sql = 'DELETE FROM jonah_channels WHERE channel_id = ?'; + $values = array($channel_id); + + Horde::logMessage('SQL Query by Jonah_News_sql::deleteChannel(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->query($sql, $values); + if (is_a($result, 'PEAR_Error')) { + Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR); + } + + return $result; + } + + /** + * @param array &$info + */ + function _saveStory(&$info) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + if (empty($info['story_id'])) { + $info['story_id'] = $this->_db->nextId('jonah_stories'); + if (is_a($info['story_id'], 'PEAR_Error')) { + Horde::logMessage($info['story_id'], __FILE__, __LINE__, PEAR_LOG_ERR); + return $info['story_id']; + } + $channel = $this->getChannel($info['channel_id']); + $permalink = $this->getStoryLink($channel, $info); + $sql = 'INSERT INTO jonah_stories (story_id, channel_id, story_title, story_desc, story_body_type, story_body, story_url, story_published, story_updated, story_read, story_permalink, story_author) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'; + $values = array($permalink, Horde_Auth::getAuth()); + } else { + $sql = 'UPDATE jonah_stories SET story_id = ?, channel_id = ?, story_title = ?, story_desc = ?, story_body_type = ?, story_body = ?, story_url = ?, story_published = ?, story_updated = ?, story_read = ? WHERE story_id = ?'; + $values = array((int)$info['story_id']); + } + + if (empty($info['story_read'])) { + $info['story_read'] = 0; + } + + /* Deal with any tags */ + if (!empty($info['story_tags'])) { + $tags = explode(',', $info['story_tags']); + } else { + $tags = array(); + } + $this->writeTags($info['story_id'], $info['channel_id'], $tags); + + array_unshift($values, + (int)$info['story_id'], + (int)$info['channel_id'], + Horde_String::convertCharset($info['story_title'], Horde_Nls::getCharset(), $this->_params['charset']), + Horde_String::convertCharset($info['story_desc'], Horde_Nls::getCharset(), $this->_params['charset']), + $info['story_body_type'], + isset($info['story_body']) ? Horde_String::convertCharset($info['story_body'], Horde_Nls::getCharset(), $this->_params['charset']) : null, + isset($info['story_url']) ? $info['story_url'] : null, + isset($info['story_published']) ? (int)$info['story_published'] : null, + time(), + (int)$info['story_read']); + + Horde::logMessage('SQL Query by Jonah_News_sql::_saveStory(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->query($sql, $values); + if (is_a($result, 'PEAR_Error')) { + Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR); + return $result; + } + + $this->_timestampChannel($info['channel_id'], time()); + return true; + } + + /** + * Converts the text fields of a story from the backend charset to the + * output charset. + * + * @param array $story A story hash. + * + * @return array The converted hash. + */ + function _convertFromBackend($story) + { + $story['story_title'] = Horde_String::convertCharset($story['story_title'], $this->_params['charset'], Horde_Nls::getCharset()); + $story['story_desc'] = Horde_String::convertCharset($story['story_desc'], $this->_params['charset'], Horde_Nls::getCharset()); + if (isset($story['story_body'])) { + $story['story_body'] = Horde_String::convertCharset($story['story_body'], $this->_params['charset'], Horde_Nls::getCharset()); + } + if (isset($story['story_tags'])) { + $story['story_tags'] = Horde_String::convertCharset($story['story_tags'], $this->_params['charset'], Horde_Nls::getCharset()); + } + return $story; + } + + /** + * Returns the most recent or all stories from a channel. + * + * @param integer $channel_id The news channel to get stories from. + * @param integer $max The maximum number of stories to get. + * @param integer $from The number of the story to start with. + * @param integer $date The timestamp of the date to start with. + * @param boolean $unreleased Whether to return not yet released stories. + * @param integer $order How to order the results for internal + * channels. Possible values are the + * JONAH_ORDER_* constants. + * + * @return array The specified number (or less, if there are fewer) of + * stories from the given channel. + */ + function _getStories($channel_id, $max, $from = 0, $date = null, + $unreleased = false, $order = JONAH_ORDER_PUBLISHED) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + $sql = 'SELECT * FROM jonah_stories WHERE channel_id = ?'; + $values = array((int)$channel_id); + + if ($unreleased) { + if ($date !== null) { + $sql .= ' AND story_published <= ?'; + $values[] = $date; + } + } else { + if ($date === null) { + $date = time(); + } else { + $date = max($date, time()); + } + $sql .= ' AND story_published <= ?'; + $values[] = $date; + } + + switch ($order) { + case JONAH_ORDER_PUBLISHED: + $sql .= ' ORDER BY story_published DESC'; + break; + case JONAH_ORDER_READ: + $sql .= ' ORDER BY story_read DESC'; + break; + case JONAH_ORDER_COMMENTS: + //@TODO + break; + } + + if (!is_null($max)) { + $sql = $this->_db->modifyLimitQuery($sql, (int)$from, (int)$max, $values); + } + + Horde::logMessage('SQL Query by Jonah_News_sql::_getStories(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->getAll($sql, $values, DB_FETCHMODE_ASSOC); + if (is_a($result, 'PEAR_Error')) { + return $result; + } + for ($i = 0; $i < count($result); $i++) { + $result[$i] = $this->_convertFromBackend($result[$i]); + if (empty($result[$i]['story_permalink'])) { + $this->_addPermalink($result[$i]); + } + $tags = $this->readTags($result[$i]['story_id']); + if (is_a($tags, 'PEAR_Error')) { + return $tags; + } + $result[$i]['story_tags'] = $tags; + } + return $result; + } + + /** + */ + function _getStory($story_id, $read = false) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + $sql = 'SELECT * FROM jonah_stories WHERE story_id = ?'; + $values = array((int)$story_id); + + Horde::logMessage('SQL Query by Jonah_News_sql::_getStory(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->getRow($sql, $values, DB_FETCHMODE_ASSOC); + if (is_a($result, 'PEAR_Error')) { + Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR); + return $result; + } elseif (empty($result)) { + return PEAR::raiseError(sprintf(_("Story id \"%s\" not found."), $story_id)); + } + $result['story_tags'] = $this->readTags($story_id); + $result = $this->_convertFromBackend($result); + if (empty($result['story_permalink'])) { + $this->_addPermalink($result); + } + if ($read) { + $this->_readStory($story_id); + } + + return $result; + } + + /** + */ + function _getStoryByUrl($channel_id, $story_url) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + $sql = 'SELECT * FROM jonah_stories' . + ' WHERE channel_id = ? AND story_url = ?'; + $values = array((int)$channel_id, $story_url); + + Horde::logMessage('SQL Query by Jonah_News_sql::_getStoryByUrl(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->getRow($sql, $values, DB_FETCHMODE_ASSOC); + if (is_a($result, 'PEAR_Error')) { + Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR); + return $result; + } elseif (empty($result)) { + return PEAR::raiseError(sprintf(_("Story URL \"%s\" not found."), $story_url)); + } + $result = $this->_convertFromBackend($result); + if (empty($result['story_permalink'])) { + $this->_addPermalink($result); + } + + return $result; + } + + /** + * Adds a missing permalink to a story. + * + * @param array $story A story hash. + */ + function _addPermalink(&$story) + { + $channel = $this->getChannel($story['channel_id']); + if (is_a($channel, 'PEAR_Error')) { + return; + } + $sql = 'UPDATE jonah_stories SET story_permalink = ? WHERE story_id = ?'; + $values = array($this->getStoryLink($channel, $story), $story['story_id']); + Horde::logMessage('SQL Query by Jonah_News_sql::_addPermalink(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->query($sql, $values); + if (!is_a($result, 'PEAR_Error')) { + $story['story_permalink'] = $values[0]; + } + } + + /** + * Gets the latest released story from a given internal channel + * + * @param int $channel_id The channel id. + * + * @return int The story id. + */ + function getLatestStoryId($channel_id) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + $sql = 'SELECT story_id FROM jonah_stories' . + ' WHERE channel_id = ? AND story_published <= ?' . + ' ORDER BY story_updated DESC'; + $values = array((int)$channel_id, time()); + + Horde::logMessage('SQL Query by Jonah_News_sql::getLatestStoryId(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->getRow($sql, $values, DB_FETCHMODE_ASSOC); + if (is_a($result, 'PEAR_Error')) { + Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR); + return $result; + } elseif (empty($result)) { + return PEAR::raiseError(sprintf(_("Channel \"%s\" not found."), $channel_id)); + } + + return $result['story_id']; + } + + /** + */ + function deleteStory($channel_id, $story_id) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + $sql = 'DELETE FROM jonah_stories' . + ' WHERE channel_id = ? AND story_id = ?'; + $values = array((int)$channel_id, (int)$story_id); + + Horde::logMessage('SQL Query by Jonah_News_sql::deleteStory(): ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->query($sql, $values); + if (is_a($result, 'PEAR_Error')) { + Horde::logMessage($result->getMessage(), __FILE__, __LINE__, PEAR_LOG_ERR); + return $result; + } + + $sql = 'DELETE FROM jonah_stories_tags ' . + 'WHERE channel_id = ? AND story_id = ?'; + $result = $this->_db->query($sql, $values); + if (is_a($result, 'PEAR_Error')) { + Horde::logMessage($result->getMessage(), __FILE__, __LINE__, PEAR_LOG_ERR); + return $result; + } + + return true; + } + + /** + * Write out the tags for a specific resource. + * + * @param int $resource_id The story we are tagging. + * @param int $channel_id The channel id for the story we are tagging + * @param array $tags An array of tags. + * + * @return mixed True | PEAR_Error + */ + function writeTags($resource_id, $channel_id, $tags) + { + global $conf; + + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + // First, make sure all tag names exist in the DB. + $tagkeys = array(); + $insert = $this->_db->prepare('INSERT INTO jonah_tags (tag_id, tag_name) VALUES(?, ?)'); + $query = $this->_db->prepare('SELECT tag_id FROM jonah_tags WHERE tag_name = ?'); + foreach ($tags as $tag) { + $tag = Horde_String::lower(trim($tag)); + $results = $this->_db->execute($query, $this->_db->escapeSimple($tag)); + if (is_a($results, 'PEAR_Error')) { + return $results; + } elseif ($results->numRows() == 0) { + $id = $this->_db->nextId('jonah_tags'); + $result = $this->_db->execute($insert, array($id, $tag)); + $tagkeys[] = $id; + } else { + $row = $results->fetchRow(DB_FETCHMODE_ASSOC); + $tagkeys[] = $row['tag_id']; + } + } + + // Free our resources. + $this->_db->freePrepared($insert, true); + $this->_db->freePrepared($query, true); + + $sql = 'DELETE FROM jonah_stories_tags WHERE story_id = ' . (int)$resource_id; + $query = $this->_db->prepare('INSERT INTO jonah_stories_tags (story_id, channel_id, tag_id) VALUES(?, ?, ?)'); + + Horde::logMessage('SQL query by Jonah_News_sql::writeTags: ' . $sql, + __FILE__, __LINE__, PEAR_LOG_DEBUG); + + $this->_db->query($sql); + foreach ($tagkeys as $key) { + $this->_db->execute($query, array($resource_id, $channel_id, $key)); + } + $this->_db->freePrepared($query, true); + + /* @TODO We should clear at least any of our cached counts */ + return true; + } + + /** + * Retrieve the tags for a specified resource. + * + * @param int $resource_id The resource to get tags for. + * + * @return mixed An array of tags | PEAR_Error + */ + function readTags($resource_id) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + $sql = 'SELECT jonah_tags.tag_id, tag_name FROM jonah_tags INNER JOIN jonah_stories_tags ON jonah_stories_tags.tag_id = jonah_tags.tag_id WHERE jonah_stories_tags.story_id = ?'; + + Horde::logMessage('SQL query by Jonah_News_sql::readTags ' . $sql, + __FILE__, __LINE__, PEAR_LOG_DEBUG); + + $tags = $this->_db->getAssoc($sql, false, array($resource_id), false); + return $tags; + } + + /** + * Retrieve the list of used tag_names, tag_ids and the total number + * of resources that are linked to that tag. + * + * @param array $tags An optional array of tag_ids. If omitted, all tags + * will be included. + * + * @param array $channel_id An optional array of channel_ids. + * + * @return mixed An array containing tag_name, and total | PEAR_Error + */ + function listTagInfo($tags = array(), $channel_id = null) + { + require_once 'Horde/Cache.php'; + + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + + if (!is_array($channel_id) && is_numeric($channel_id)) { + $channel_id = array($channel_id); + } + $cache = $GLOBALS['injector']->getInstance('Horde_Cache'); + $cache_key = 'jonah_tags_' . md5(serialize($tags) . md5(serialize($channel_id))); + $cache_value = $cache->get($cache_key, $GLOBALS['conf']['cache']['default_lifetime']); + if ($cache_value) { + return unserialize($cache_value); + } + + $haveWhere = false; + $sql = 'SELECT tn.tag_id, tag_name, COUNT(tag_name) total FROM jonah_tags as tn INNER JOIN jonah_stories_tags as t ON t.tag_id = tn.tag_id'; + if (count($tags)) { + $sql .= ' WHERE tn.tag_id IN (' . implode(',', $tags) . ')'; + $haveWhere = true; + } + if (!is_null($channel_id)) { + if (!$haveWhere) { + $sql .= ' WHERE'; + } else { + $sql .= ' AND'; + } + $channels = array(); + foreach ($channel_id as $cid) { + $c = $this->_getChannel($cid); + if ($c['channel_type'] == JONAH_COMPOSITE_CHANNEL) { + $channels = array_merge($channels, explode(':', $c['channel_url'])); + } + } + $channel_id = array_merge($channel_id, $channels); + $sql .= ' t.channel_id IN (' . implode(', ', $channel_id) . ')'; + } + $sql .= ' GROUP BY tn.tag_id, tag_name ORDER BY total DESC;'; + $results = $this->_db->getAssoc($sql,true, array(), DB_FETCHMODE_ASSOC, false); + $cache->set($cache_key, serialize($results)); + return $results; + } + + /** + * Search for resources matching the specified criteria + * + * @param array $ids An array of tag_ids to search for. Note that + * these are AND'd together. + * @param integer $max The maximum number of stories to get. If + * null, all stories will be returned. + * @param integer $from The number of the story to start with. + * @param array $channel Limit the result set to resources + * present in these channels + * @param integer $order How to order the results for internal + * channels. Possible values are the + * JONAH_ORDER_* constants. + * + * @return mixed Array of stories| PEAR_Error + */ + function searchTagsById($ids, $max = 10, $from = 0, $channel_id = array(), + $order = JONAH_ORDER_PUBLISHED) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + if (!is_array($ids) || !count($ids)) { + $stories[] = array(); + } else { + $stories = array(); + $sql = 'SELECT DISTINCT s.story_id, s.channel_id FROM jonah_stories' + . ' as s, jonah_stories_tags as t'; + for ($i = 0; $i < count($ids); $i++) { + $sql .= ', jonah_stories_tags as t' . $i; + } + $sql .= ' WHERE s.story_id = t.story_id'; + for ($i = 0 ; $i < count($ids); $i++) { + $sql .= ' AND t' . $i . '.tag_id = ' . $ids[$i] . ' AND t' + . $i . '.story_id = t.story_id'; + } + + /* Limit to particular channels if requested */ + if (count($channel_id) > 0) { + // Have to find out if we are a composite channel or not. + $channels = array(); + foreach ($channel_id as $cid) { + $c = $this->_getChannel($cid); + if ($c['channel_type'] == JONAH_COMPOSITE_CHANNEL) { + $temp = explode(':', $c['channel_url']); + // Save a map of channels that are from composites. + foreach ($temp as $t) { + $cchannels[$t] = $cid; + } + $channels = array_merge($channels, $temp); + } + } + $channels = array_merge($channel_id, $channels); + $timestamp = time(); + $sql .= ' AND t.channel_id IN (' . implode(', ', $channels) + . ') AND s.story_published IS NOT NULL AND ' + . 's.story_published < ' . $timestamp; + } + + switch ($order) { + case JONAH_ORDER_PUBLISHED: + $sql .= ' ORDER BY story_published DESC'; + break; + case JONAH_ORDER_READ: + $sql .= ' ORDER BY story_read DESC'; + break; + case JONAH_ORDER_COMMENTS: + //@TODO + break; + } + + /* Instantiate the channel object outside the loop if we + * are only limiting to one channel. */ + if (count($channel_id) == 1) { + $channel = $this->getChannel($channel_id[0]); + } + Horde::logMessage('SQL query by Jonah_News_sql::searchTags: ' . $sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $results = $this->_db->limitQuery($sql, $from, $max); + if (is_a($results, 'PEAR_Error')) { + return $results; + } + + for ($i = 0; $i < $results->numRows(); $i++) { + $row = $results->fetchRow(); + $story = $this->_getStory($row[0], false); + if (count($channel_id > 1)) { + // Make sure we get the correct channel info for composites + if (!empty($cchannels[$story['channel_id']])) { + $channel = $this->getChannel($cchannels[$story['channel_id']]); + } else { + $channel = $this->getChannel($story['channel_id']); + } + } + + /* Format story link. */ + $story['story_link'] = $this->getStoryLink($channel, $story); + $story = array_merge($story, $channel); + /* Format dates. */ + $date_format = $GLOBALS['prefs']->getValue('date_format'); + $story['story_updated_date'] = strftime($date_format, $story['story_updated']); + if (!empty($story['story_published'])) { + $story['story_published_date'] = strftime($date_format, $story['story_published']); + } + + $stories[] = $story; + } + } + + return $stories; + } + + /** + * Search for articles matching specific tag name(s). + * + * @see Jonah_News_sql::searchTagsById() + */ + function searchTags($names, $max = 10, $from = 0, $channel_id = array(), + $order = JONAH_ORDER_PUBLISHED) + { + $ids = $this->getTagIds($names); + if (is_a($ids, 'PEAR_Error')) { + return $ids; + } + return $this->searchTagsById(array_values($ids), $max, $from, $channel_id, $order); + } + + + /** + * Return a set of tag names given the tag_ids. + * + * @param array $ids An array of tag_ids to get names for. + * + * @return mixed An array of tag names | PEAR_Error. + */ + function getTagNames($ids) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + $sql = 'SELECT t.tag_name FROM jonah_tags as t WHERE t.tag_id IN('; + $needComma = false; + foreach ($ids as $id) { + $sql .= ($needComma ? ',' : '') . '\'' . $id . '\''; + $needComma = true; + } + $sql .= ')'; + $tags = $this->_db->getCol($sql); + return $tags; + } + + /** + * Return a set of tag_ids, given the tag name + * + * @param array $names An array of names to search for + * + * @return mixed An array of tag_name => tag_ids | PEAR_Error + */ + function getTagIds($names) + { + if (is_a(($result = $this->_connect()), 'PEAR_Error')) { + return $result; + } + $sql = 'SELECT t.tag_name, t.tag_id FROM jonah_tags as t WHERE t.tag_name IN('; + $needComma = false; + foreach ($names as $name) { + $sql .= ($needComma ? ',' : '') . '\'' . $name . '\''; + $needComma = true; + } + $sql .= ')'; + $tags = $this->_db->getAssoc($sql); + return $tags; + } + + /** + * Attempts to open a persistent connection to the SQL server. + * + * @return boolean True on success; PEAR_Error on failure. + */ + function _connect() + { + if ($this->_connected) { + return true; + } + + Horde::assertDriverConfig($this->_params, 'news', + array('phptype', 'charset'), + 'jonah news SQL'); + + if (!isset($this->_params['database'])) { + $this->_params['database'] = ''; + } + if (!isset($this->_params['username'])) { + $this->_params['username'] = ''; + } + if (!isset($this->_params['hostspec'])) { + $this->_params['hostspec'] = ''; + } + + /* Connect to the SQL server using the supplied parameters. */ + require_once 'DB.php'; + $this->_db = &DB::connect($this->_params, + array('persistent' => !empty($this->_params['persistent']))); + if (is_a($this->_db, 'PEAR_Error')) { + return $this->_db; + } + + // Set DB portability options. + switch ($this->_db->phptype) { + case 'mssql': + $this->_db->setOption('portability', DB_PORTABILITY_LOWERCASE | DB_PORTABILITY_ERRORS | DB_PORTABILITY_RTRIM); + break; + default: + $this->_db->setOption('portability', DB_PORTABILITY_LOWERCASE | DB_PORTABILITY_ERRORS); + } + + $this->_connected = true; + return true; + } + +} diff --git a/jonah/lib/base.php b/jonah/lib/base.php new file mode 100644 index 000000000..79b7f6670 --- /dev/null +++ b/jonah/lib/base.php @@ -0,0 +1,59 @@ +pushApp('jonah', !defined('AUTH_HANDLER')); +} catch (Horde_Exception $e) { + if ($e->getCode() == 'permission_denied') { + Horde::authenticationFailureRedirect(); + } + Horde::fatal($e, __FILE__, __LINE__, false); +} +$conf = &$GLOBALS['conf']; +define('JONAH_TEMPLATES', $registry->get('templates')); + +/* Notification system. */ +$notification = &Horde_Notification::singleton(); +$notification->attach('status'); + +/* Find the base file path of Jonah. */ +if (!defined('JONAH_BASE')) { + define('JONAH_BASE', dirname(__FILE__) . '/..'); +} + +/* Jonah base library. */ +require_once JONAH_BASE . '/lib/Jonah.php'; + +/* Instantiate Jonah storage */ +require_once JONAH_BASE . '/lib/Driver.php'; +$GLOBALS['jonah_driver'] = Jonah_Driver::factory(); + +// Start compression. +if (!Horde_Util::nonInputVar('no_compress')) { + Horde::compressOutput(); +} diff --git a/jonah/lib/version.php b/jonah/lib/version.php new file mode 100644 index 000000000..07bff535f --- /dev/null +++ b/jonah/lib/version.php @@ -0,0 +1 @@ + diff --git a/jonah/locale/.htaccess b/jonah/locale/.htaccess new file mode 100644 index 000000000..3a4288278 --- /dev/null +++ b/jonah/locale/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/jonah/locale/de_DE/LC_MESSAGES/jonah.mo b/jonah/locale/de_DE/LC_MESSAGES/jonah.mo new file mode 100644 index 0000000000000000000000000000000000000000..73e78d5ec8909112efa330e5b4a3bd295caba6fb GIT binary patch literal 169927 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 h2F>dSD(1a^uc^u`z + + + + + Overview + Introduction + + This is an application for displaying news and other data from various sources. You can subscribe to the information you are interested in, so you only see what you want to. + + + + + Feed Types + Internal Feeds + + Feeds that are managed and provided by this system. + + + External Feeds + + Feeds that are managed and provided by external systems, e.g. other + websites. + + + Aggregated Feeds + + Feeds that get their content from multiple external feeds. Internal + feeds can also be integrated through the RSS delivery. + + + Composite Feeds + + Feeds that get their content from multiple internal feeds. + + + diff --git a/jonah/locale/es_ES/LC_MESSAGES/jonah.mo b/jonah/locale/es_ES/LC_MESSAGES/jonah.mo new file mode 100644 index 0000000000000000000000000000000000000000..35e7411923abafb89b4ab4510cd1ebfa9c9b5c23 GIT binary patch literal 165244 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 literal 0 HcmV?d00001 diff --git a/jonah/locale/es_ES/help.xml b/jonah/locale/es_ES/help.xml new file mode 100644 index 000000000..7f70d1e3a --- /dev/null +++ b/jonah/locale/es_ES/help.xml @@ -0,0 +1,25 @@ + + + + + + Introducción + Introducción + Ésta es una aplicación para mostrar noticias y otros datos desde varios orígenes. Puede suscribirse a la información en la que esté interesado de forma que sólo vea lo que quiera ver. + + + + Tipos de suscripciones + Suscripciones internas + Suscripciones gestionadas y proporcionadas por este sistema. + + Suscripciones externas + Suscripciones gestionadas y proporcionadas por sistemas externos, por ejemplo, otras sedes web. + + Suscripciones asociadas + Suscripciones que obtienen su contenido de varias suscripciones externas. Las suscripciones internas también se pueden integrar con la distribución RSS. + + Suscripciones compuestas + Suscripciones que obtienen su contenido de varias suscripciones internas. + + diff --git a/jonah/locale/fi_FI/LC_MESSAGES/jonah.mo b/jonah/locale/fi_FI/LC_MESSAGES/jonah.mo new file mode 100644 index 0000000000000000000000000000000000000000..748722a02481e849fb361e939c6e8d4a56e2d00d GIT binary patch literal 161027 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�a}RtqN9!?2@4a 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 Boy7nE literal 0 HcmV?d00001 diff --git a/jonah/locale/fi_FI/help.xml b/jonah/locale/fi_FI/help.xml new file mode 100644 index 000000000..19250c6ce --- /dev/null +++ b/jonah/locale/fi_FI/help.xml @@ -0,0 +1,33 @@ + + + + + Yleiskuva + Esittely + + Tämän ohjelman avulla voidaan esittää uutisia ja muita tietoja monesta eri lähteestä. Sinun on mahdollista tilata vain ne kanavat, joissa on sinua kiinnostavia tietoja ja siten saat vain sinua kiinnostavia tietoja. + + + + Kanavatyypit + Sisäiset kanavat + + Kanavat, joita hoidetaan sisäisesti tämän ohjelmiston kautta. + + + Ulkoiset kanavat + + Kanavat, joita hoitaa ja joita tarjoaa jokin ulkopuolinen taho kuten esimerkiksi jokin toinen www-sivusto. + + + Yhdistetyt kanavat + + Kanavat, joiden sisältö on yhdistelmä monesta ulkopuolisesta kanavasta. Sisäiset kanavat voidaan myös liittää tähän kanvaan käyttäen RSS-jakelua. + + + Kootut kanavat + + Kanavat, joiden sisältö koostuu monesta sisäisestä kanavasta. + + + diff --git a/jonah/locale/fr_FR/LC_MESSAGES/jonah.mo b/jonah/locale/fr_FR/LC_MESSAGES/jonah.mo new file mode 100644 index 0000000000000000000000000000000000000000..320036915c3736667305a9bd30ef99b4419ecb20 GIT binary patch literal 152621 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%0AY7c^s>u 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 literal 0 HcmV?d00001 diff --git a/jonah/locale/ro_RO/LC_MESSAGES/jonah.mo b/jonah/locale/ro_RO/LC_MESSAGES/jonah.mo new file mode 100644 index 0000000000000000000000000000000000000000..6312282c77e00020835512c30f686a88661160a1 GIT binary patch literal 30297 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 U_s9VZyY3|Z-~Ig@6zRYJ2R%z%^#A|> literal 0 HcmV?d00001 diff --git a/jonah/po/.htaccess b/jonah/po/.htaccess new file mode 100644 index 000000000..3a4288278 --- /dev/null +++ b/jonah/po/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/jonah/po/README b/jonah/po/README new file mode 100644 index 000000000..a4356a923 --- /dev/null +++ b/jonah/po/README @@ -0,0 +1 @@ +see horde/po/README \ No newline at end of file diff --git a/jonah/po/de_DE.po b/jonah/po/de_DE.po new file mode 100644 index 000000000..e93ddc8f0 --- /dev/null +++ b/jonah/po/de_DE.po @@ -0,0 +1,864 @@ +# German translations for Jonah. +# Copyright 2002-2009 The Horde Project +# This file is distributed under the same license as the Jonah package. +# Jan Schneider, 2002-2008. +# +# story: Beitrag +msgid "" +msgstr "" +"Project-Id-Version: Jonah 1.0-cvs\n" +"Report-Msgid-Bugs-To: dev@lists.horde.org\n" +"POT-Creation-Date: 2008-09-18 11:24+0200\n" +"PO-Revision-Date: 2008-09-18 12:06+0200\n" +"Last-Translator: Jan Schneider\n" +"Language-Team: i18n@lists.horde.org\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: lib/Block/news_popular.php:75 lib/Block/news_popular.php:78 +msgid " - Most read stories" +msgstr " - Am häufigsten gelesene Beiträge" + +#: lib/Block/delivery.php:48 +#, php-format +msgid "\"%s\" stories in HTML" +msgstr "\"%s\"-Beiträge als HTML" + +#: lib/News.php:439 lib/Driver.php:338 +msgid "1 hour" +msgstr "1 Stunde" + +#: lib/News.php:443 lib/Driver.php:342 +msgid "12 hours" +msgstr "12 Stunden" + +#: lib/News.php:440 lib/Driver.php:339 +msgid "2 hours" +msgstr "2 Stunden" + +#: lib/News.php:444 lib/Driver.php:343 +msgid "24 hours" +msgstr "24 Stunden" + +#: lib/News.php:438 lib/Driver.php:337 +msgid "30 mins" +msgstr "30 Minuten" + +#: lib/News.php:441 lib/Driver.php:340 +msgid "4 hours" +msgstr "4 Stunden" + +#: lib/News.php:442 lib/Driver.php:341 +msgid "8 hours" +msgstr "8 Stunden" + +#: stories/share.php:86 +msgid "A link to the story" +msgstr "Einen Link zum Beitrag" + +#: channels/aggregate.php:59 +msgid "Add" +msgstr "Hinzufügen" + +#: content.php:37 +msgid "Add Content" +msgstr "Inhalt hinzufügen" + +#: lib/Forms/Story.php:37 +msgid "Add New Story" +msgstr "Neuen Beitrag hinzufügen" + +#: channels/index.php:65 +msgid "Add story" +msgstr "Beitrag hinzufügen" + +#: lib/api.php:90 +msgid "Administrator" +msgstr "Administrator" + +#: lib/News.php:477 lib/Jonah.php:113 +msgid "Aggregated Feed" +msgstr "Gesammelter Feed" + +#: channels/aggregate.php:58 +#, php-format +msgid "Aggregated channels for channel \"%s\"" +msgstr "Gesammelte Kanäle für Kanal \"%s\"" + +#: channels/delete.php:56 +msgid "All stories created in this channel will be lost!" +msgstr "Alle Beiträge, die für diesen Kanal erstellt wurden, gehen verloren!" + +#: stories/results.php:114 +#, php-format +msgid "All stories tagged with %s" +msgstr "Alle mit %s getaggte Beiträge" + +#: channels/index.php:35 +#, php-format +msgid "An error occurred fetching channels: %s" +msgstr "Beim Empfangen dieses Kanals ist ein Fehler aufgetreten: %s" + +#: channels/delete.php:58 +msgid "Any cached stories for this channel will be lost!" +msgstr "Alle zwischengespeicherten Beiträge für diesen Kanal gehen verloren!" + +#: lib/Forms/Feed.php:89 lib/Forms/Feed.php:100 +msgid "Caching" +msgstr "Caching" + +#: stories/pdf.php:44 +msgid "Cannot generate PDFs of remote stories." +msgstr "Von externen Beiträgen können keine PDF-Dateien erzeugt werden." + +#: lib/Driver/sql.php:651 lib/News/sql.php:511 +#, php-format +msgid "Channel \"%s\" not found." +msgstr "Kanal \"%s\" nicht gefunden." + +#: channels/aggregate.php:61 +msgid "Channel Name" +msgstr "Kanalname" + +#: lib/Forms/Feed.php:77 +msgid "Channel Slug" +msgstr "Kanalkurzname" + +#: lib/Forms/Feed.php:83 +msgid "" +"Channel URL for further pages, if not the default one. %c gets replaced by " +"the feed ID, %n by the story offset." +msgstr "" +"Kanal-URL für weiterführende Seiten, falls nicht die Standard-URL. %c wird " +"durch die Feed-ID und %s durch die Beitragsnummer ersetzt." + +#: lib/Forms/Feed.php:118 +msgid "" +"Channel URL if not the default one. %c gets replaced by the feed ID, %n by " +"the story offset." +msgstr "" +"Kanal-URL, falls nicht die Standard-URL. %c wird durch die Feed-ID und %s " +"durch die Beitragsnummer ersetzt." + +#: lib/Forms/Feed.php:82 +#, php-format +msgid "Channel URL if not the default one. %c gets replaced by the feed ID." +msgstr "" +"Kanal-URL, falls nicht die Standard-URL. %c wird durch die Feed-ID ersetzt." + +#: channels/delete.php:76 +msgid "Channel has not been deleted." +msgstr "Der Kanal wurde nicht entfernt." + +#: lib/Driver/sql.php:175 lib/News/sql.php:175 +#, php-format +msgid "Channel id \"%s\" not found." +msgstr "Kanal-ID \"%s\" nicht gefunden." + +#: stories/index.php:54 +msgid "Channel refreshed." +msgstr "Kanal aktualisiert." + +#: templates/channels/index.html:13 +msgid "Close Search" +msgstr "Suche beenden" + +#: templates/stories/index.html:27 +msgid "Comments" +msgstr "Kommentare" + +#: config/templates.php.dist:42 +msgid "Compact" +msgstr "Kompakt" + +#: lib/News.php:480 lib/Jonah.php:116 +msgid "Composite Feed" +msgstr "Zusammengefasster Feed" + +#: lib/Forms/Feed.php:120 +msgid "Composite feeds" +msgstr "Zusammengefasste Feeds" + +#: lib/Jonah.php:62 +#, php-format +msgid "Could not open %s." +msgstr "%s konnte nicht gelesen werden." + +#: lib/Block/latest.php:49 +msgid "Count reads of the latest story when this block is displayed" +msgstr "" +"Den neuesten Beitrag als gelesen markieren, wenn der Block angezeigt wird?" + +#: lib/Block/story.php:49 +msgid "Count reads of this story when this block is displayed" +msgstr "Diesen Beitrag als gelesen markieren, wenn der Block angezeigt wird?" + +#: stories/index.php:124 stories/results.php:116 +msgid "Date" +msgstr "Datum" + +#: stories/delete.php:63 stories/delete.php:68 channels/delete.php:51 +#: channels/delete.php:62 +msgid "Delete" +msgstr "Löschen" + +#: channels/delete.php:48 +#, php-format +msgid "Delete News Channel \"%s\"?" +msgstr "Nachrichtenkanal \"%s\" löschen?" + +#: stories/delete.php:59 +#, php-format +msgid "Delete News Story \"%s\"?" +msgstr "Nachrichtenbeitrag \"%s\" löschen?" + +#: channels/index.php:49 +msgid "Delete channel" +msgstr "Kanal löschen" + +#: stories/index.php:100 stories/results.php:94 +msgid "Delete story" +msgstr "Beitrag löschen" + +#: lib/Forms/Feed.php:75 lib/Forms/Feed.php:99 lib/Forms/Feed.php:117 +msgid "Description" +msgstr "Beschreibung" + +#: stories/delete.php:63 channels/delete.php:51 +msgid "Do not delete" +msgstr "Nicht löschen" + +#: lib/Forms/Feed.php:40 +msgid "Edit Feed" +msgstr "Feed bearbeiten" + +#: lib/Forms/Story.php:37 +msgid "Edit Story" +msgstr "Beitrag bearbeiten" + +#: lib/Forms/Feed.php:106 +msgid "Edit aggregated feeds" +msgstr "Gesammelte Feeds bearbeiten" + +#: channels/index.php:44 +msgid "Edit channel" +msgstr "Kanal bearbeiten" + +#: channels/aggregate.php:25 +#, php-format +msgid "Edit channel \"%s\"" +msgstr "Kanal \"%s\" bearbeiten" + +#: stories/index.php:94 stories/results.php:87 +msgid "Edit story" +msgstr "Beitrag bearbeiten" + +#: lib/Forms/Story.php:79 +msgid "Enter keywords to tag this story, separated by commas" +msgstr "Kommagetrennte Stichwörter für diesen Beitrag" + +#: lib/News.php:519 lib/Driver.php:370 +#, php-format +msgid "Error fetching feed: %s" +msgstr "Fehler beim Lesen des Feeds: %s" + +#: stories/share.php:66 stories/pdf.php:15 stories/view.php:25 +#: stories/view.php:35 lib/Block/latest.php:91 lib/Block/story.php:91 +#, php-format +msgid "Error fetching story: %s" +msgstr "Fehler beim Herunterladen des Beitrags: %s" + +#: lib/News.php:758 +#, php-format +msgid "Error parsing external feed from %s: %s" +msgstr "Fehler bei der Verarbeitung des externen Feeds von %s: %s" + +#: lib/api.php:96 +msgid "External Channels" +msgstr "Externe Kanäle" + +#: lib/News.php:471 lib/Jonah.php:110 +msgid "External Feed" +msgstr "Externer Feed" + +#: lib/Forms/Feed.php:51 +msgid "Extra information for this feed type" +msgstr "Zusätzliche Informationen für diesen Feedtyp" + +#: lib/Block/news_popular.php:32 lib/Block/news.php:3 lib/Block/news.php:30 +#: lib/Block/story.php:42 +msgid "Feed" +msgstr "Feed" + +#: lib/News.php:105 +#, php-format +msgid "Feed \"%s\" is not authored on this system." +msgstr "Der Feed \"%s\" wird nicht auf diesem System erzeugt." + +#: channels/edit.php:56 +msgid "Feed type changed." +msgstr "Feedtyp geändert." + +#: channels/index.php:93 lib/Block/delivery.php:3 lib/Block/delivery.php:25 +msgid "Feeds" +msgstr "Feeds" + +#: lib/Block/news.php:54 +msgid "First Story" +msgstr "Erster Beitrag" + +#: stories/share.php:78 +msgid "From" +msgstr "Von" + +#: lib/Forms/Story.php:74 lib/Forms/Story.php:76 +msgid "Full Story Text" +msgstr "Vollständiger Beitragstext" + +#: delivery/html.php:49 +#, php-format +msgid "HTML Delivery for \"%s\"" +msgstr "HTML-Auslieferung für \"%s\"" + +#: lib/News.php:658 lib/Driver.php:509 +msgid "HTML Version of Story" +msgstr "HTML-Version des Beitrags" + +#: lib/Forms/Story.php:82 +msgid "" +"If you enter a URL without a full story text, clicking on the story will " +"send the reader straight to the URL, otherwise it will be shown at the end " +"of the full story." +msgstr "" +"Wenn Sie eine URL aber keinen Beitragstext angeben, wird der Leser beim " +"Klick auf den Beitrag direkt an diese URL weitergeleitet, anderenfalls wird " +"die URL am Ende des Beitrags angezeigt." + +#: channels/aggregate.php:64 lib/Forms/Feed.php:93 +msgid "Image" +msgstr "Bild" + +#: stories/share.php:86 +msgid "Include" +msgstr "Einfügen" + +#: config/templates.php.dist:31 +msgid "Internal" +msgstr "Intern" + +#: lib/api.php:94 +msgid "Internal Channels" +msgstr "Interne Kanäle" + +#: stories/index.php:43 stories/results.php:49 +#, php-format +msgid "Invalid channel requested. %s" +msgstr "Ungültiger Kanal angefordert. %s" + +#: channels/delete.php:30 +msgid "Invalid channel specified for deletion." +msgstr "Kein gültiger Kanal zum Löschen ausgewählt." + +#: delivery/html.php:43 +msgid "Invalid channel." +msgstr "Ungültiger Kanal." + +#: channels/index.php:87 +msgid "Last Update" +msgstr "Letzte Aktualisierung" + +#: lib/Block/latest.php:3 lib/Block/latest.php:65 +msgid "Latest News" +msgstr "Neueste Beiträge" + +#: channels/aggregate.php:63 lib/Forms/Feed.php:92 +msgid "Link" +msgstr "Link" + +#: lib/News.php:474 lib/Jonah.php:107 +msgid "Local Feed" +msgstr "Lokaler Feed" + +#: channels/index.php:84 +msgid "Manage Feeds" +msgstr "Feeds verwalten" + +#: lib/Block/news_popular.php:52 lib/Block/news.php:49 +msgid "Maximum Stories" +msgstr "Maximale Beiträge" + +#: config/templates.php.dist:20 +msgid "Media" +msgstr "Multimedia" + +#: lib/Block/tree_menu.php:3 +msgid "Menu List" +msgstr "Menüliste" + +#: stories/share.php:87 +msgid "Message" +msgstr "Nachricht" + +#: lib/News.php:66 lib/Driver.php:67 +msgid "Missing channel id." +msgstr "Kanal-ID fehlt." + +#: lib/Block/news_popular.php:3 +msgid "Most Popular Stories" +msgstr "Populärste Beiträge" + +#: content.php:34 templates/content/header.inc:2 +msgid "My News" +msgstr "Meine Nachrichten" + +#: content_edit.php:33 +msgid "My News :: Add Content" +msgstr "Meine Nachrichten :: Inhalt hinzufügen" + +#: channels/index.php:85 lib/Forms/Feed.php:50 +msgid "Name" +msgstr "Name" + +#: lib/Jonah.php:249 lib/Forms/Feed.php:40 +msgid "New Feed" +msgstr "Neuer Feed" + +#: lib/api.php:92 +msgid "News" +msgstr "Nachrichten" + +#: lib/Block/latest.php:33 +msgid "News Source" +msgstr "Nachrichtenquelle" + +#: channels/index.php:25 +msgid "News is not enabled." +msgstr "Nachrichten sind nicht aktiviert." + +#: stories/index.php:51 stories/results.php:57 +msgid "No available stories." +msgstr "Keine Beiträge verfügbar." + +#: stories/index.php:23 +msgid "No channel requested." +msgstr "Kein Kanal angefragt." + +#: lib/Block/latest.php:86 +msgid "No channel specified." +msgstr "Kein Kanal angegeben." + +#: templates/channels/index.html:55 +msgid "No channels are available." +msgstr "Keine Kanäle sind verfügbar." + +#: lib/Block/news_popular.php:91 lib/Block/news.php:92 +msgid "No feed specified." +msgstr "Kein Feed angegeben." + +#: lib/Block/delivery.php:68 +msgid "No feeds are available." +msgstr "Keine Feeds verfügbar." + +#: templates/channels/index.html:51 +msgid "No feeds match" +msgstr "Keine Treffer" + +#: lib/News.php:549 lib/Driver.php:400 +msgid "No stories are currently available." +msgstr "Zur Zeit sind keine Beiträge verfügbar." + +#: lib/Block/story.php:86 +msgid "No story is selected." +msgstr "Kein Beitrag ausgewählt." + +#: lib/News.php:708 lib/Driver.php:559 +#, php-format +msgid "No such backend \"%s\" found" +msgstr "Ein Backend namens \"%s\" konnte nicht gefunden werden" + +#: stories/results.php:40 +msgid "No tag requested." +msgstr "Kein Tag angefragt." + +#: feed.php:37 +msgid "No valid feed name or ID requested." +msgstr "Ungültiger Feedname oder Feed-ID angefordert." + +#: stories/delete.php:48 +msgid "No valid story requested for deletion." +msgstr "Kein gültiger Beitrag zum Löschen ausgewählt.<" + +#: stories/share.php:25 +msgid "Note" +msgstr "Notiz" + +#: lib/Forms/Story.php:58 +msgid "" +"Note: this story won't be delivered to distribution lists automatically if " +"this time is in the future." +msgstr "" +"Hinweis: Die Nachricht wird nicht automatisch an Verteilerlisten " +"ausgeliefert, wenn dieser Zeitpunkt in der Zukunft liegt." + +#: lib/Forms/Story.php:55 +msgid "Or publish on this date:" +msgstr "Oder zu diesem Datum veröffentlichen:" + +#: stories/index.php:89 stories/results.php:81 +msgid "PDF version" +msgstr "PDF-Version" + +#: scripts/feed_tester.php:57 +msgid "Parse failed:" +msgstr "Parsen fehlgeschlagen:" + +#: scripts/feed_tester.php:60 +msgid "Parse succeeded, structure is:" +msgstr "Parsen erfolgreich, Struktur ist:" + +#: lib/News.php:653 lib/Driver.php:504 +msgid "Plaintext Version of Story" +msgstr "Textversion des Beitrags" + +#: lib/Forms/Story.php:45 +msgid "Publish Now?" +msgstr "Jetzt veröffentlichen?" + +#: lib/Block/delivery.php:59 +#, php-format +msgid "RSS Feed of \"%s\"" +msgstr "RSS-Feed für \"%s\"" + +#: templates/stories/index.html:22 +msgid "Read" +msgstr "Gelesen" + +#: channels/delete.php:54 +msgid "Really delete this News Channel?" +msgstr "Diesen Nachrichtenkanal wirlich löschen?" + +#: stories/delete.php:66 +msgid "Really delete this News Story?" +msgstr "Diesen Nachrichtenbeitrag wirklich löschen?" + +#: stories/index.php:123 +msgid "Refresh Channel" +msgstr "Kanal aktualisieren" + +#: channels/index.php:73 +msgid "Refresh channel" +msgstr "Kanal aktualisieren" + +#: channels/aggregate.php:26 +#, php-format +msgid "Remove channel \"%s\"" +msgstr "Kanal \"%s\" entfernen" + +#: lib/Block/cloud.php:28 +msgid "Results URL" +msgstr "Ergebnis-URL" + +#: lib/Jonah.php:197 +msgid "Rich Text" +msgstr "Formatierter Text" + +#: lib/Forms/Story.php:39 +msgid "Save" +msgstr "Speichern" + +#: channels/index.php:90 templates/channels/index.html:9 +msgid "Search" +msgstr "Suche" + +#: templates/delivery/html.html:13 +msgid "Select a format:" +msgstr "Wählen Sie ein Format:" + +#: stories/share.php:75 +msgid "Send" +msgstr "Senden" + +#: stories/share.php:84 +msgid "Separate multiple email addresses with commas." +msgstr "Trennen Sie mehrere Emailadressen durch Kommas." + +#: stories/share.php:73 +msgid "Share Story" +msgstr "Beitrag weitergeben" + +#: stories/view.php:87 +msgid "Share this story" +msgstr "Diesen Beitrag weitergeben" + +#: lib/Forms/Story.php:44 +msgid "Short Description" +msgstr "Kurzbeschreibung" + +#: lib/Forms/Feed.php:78 +#, php-format +msgid "" +"Slugs allows direct access to this channel's content by visiting: %s.
" +"Slug names may contain only letters, numbers or the _ (underscore) character." +msgstr "" +"Kurznamen ermöglichen den direkten Zugriff auf diesen Feed über: %s.
Kurznamen dürfen Buchstaben, Zahlen und Unterstriche enthalten." + +#: channels/aggregate.php:62 lib/Forms/Feed.php:91 +msgid "Source URL" +msgstr "Quellen-URL" + +#: lib/Forms/Feed.php:106 +msgid "Source URLs" +msgstr "Quellen-URLs" + +#: config/templates.php.dist:9 +msgid "Standard" +msgstr "Standard" + +#: delivery/rss.php:72 stories/results.php:112 +#, php-format +msgid "Stories tagged with %s in %s" +msgstr "Mit %s getaggte Beiträge in %s" + +#: stories/index.php:124 stories/results.php:116 lib/Block/story.php:3 +#: lib/Block/story.php:46 lib/Block/story.php:65 +msgid "Story" +msgstr "Beitrag" + +#: lib/News.php:729 +#, php-format +msgid "Story \"%s\" not found in \"%s\"." +msgstr "Beitrag \"%s\" nicht in \"%s\" gefunden." + +#: stories/share.php:109 +msgid "Story Link" +msgstr "Beitrags-URL" + +#: lib/Forms/Story.php:43 +msgid "Story Title (Headline)" +msgstr "Beitragstitel (Überschrift)" + +#: lib/Forms/Story.php:82 +msgid "Story URL" +msgstr "Beitrags-URL" + +#: lib/Driver/sql.php:597 lib/News/sql.php:457 +#, php-format +msgid "Story URL \"%s\" not found." +msgstr "Beitrags-URL \"%s\" nicht gefunden." + +#: lib/Forms/Feed.php:84 lib/Forms/Feed.php:119 +#, php-format +msgid "" +"Story URL if not the default one. %c gets replaced by the feed ID, %s by the " +"story ID." +msgstr "" +"Beitrags-URL, falls nicht die Standard-URL. %c wird durch die Feed-ID und %s " +"durch die Beitrags-ID ersetzt." + +#: lib/Forms/Story.php:61 +msgid "Story body type" +msgstr "Art des Beitragstexts" + +#: stories/edit.php:33 stories/delete.php:34 +#, php-format +msgid "Story editing failed: %s" +msgstr "Bearbeiten des Beitrags fehlgeschlagen: %s" + +#: stories/delete.php:83 +msgid "Story has not been deleted." +msgstr "Der Beitrag wurde nicht gelöscht." + +#: lib/Driver/sql.php:565 lib/News/sql.php:425 +#, php-format +msgid "Story id \"%s\" not found." +msgstr "Beitrags-ID \"%s\" nicht gefunden." + +#: stories/share.php:85 +msgid "Subject" +msgstr "Betreff" + +#: lib/Block/cloud.php:3 lib/Block/cloud.php:35 +msgid "Tag Cloud" +msgstr "Tagwolke" + +#: lib/News.php:816 lib/News.php:821 lib/News.php:826 lib/News.php:832 +#: lib/News.php:837 lib/Driver.php:569 lib/Driver.php:574 lib/Driver.php:579 +#: lib/Driver.php:585 lib/Driver.php:590 +msgid "Tag support not enabled in backend." +msgstr "Tags sind für dieses Backend nicht aktiviert." + +#: lib/Forms/Story.php:79 +msgid "Tags" +msgstr "Tags" + +#: lib/Block/story.php:105 templates/stories/story.html:6 +msgid "Tags: " +msgstr "Tags: " + +#: lib/Jonah.php:204 +msgid "Text" +msgstr "Text" + +#: channels/aggregate.php:100 +#, php-format +msgid "The channel \"%s\" has been removed." +msgstr "Der Kanal \"%s\" wurde entfernt." + +#: channels/aggregate.php:79 +#, php-format +msgid "The channel \"%s\" has been saved." +msgstr "Der Kanal \"%s\" wurde gespeichert." + +#: channels/aggregate.php:87 channels/aggregate.php:107 +#, php-format +msgid "The channel \"%s\" has been updated." +msgstr "Der Kanal \"%s\" wurde aktualisiert." + +#: channels/delete.php:69 +msgid "The channel has been deleted." +msgstr "Der Kanal wurde gelöscht." + +#: stories/share.php:86 +msgid "The complete text of the story" +msgstr "Den gesamten Nachrichtentext" + +#: channels/edit.php:70 +#, php-format +msgid "The feed \"%s\" has been saved." +msgstr "Der Feed \"%s\" wurde gespeichert." + +#: lib/Forms/Feed.php:100 +msgid "" +"The interval before stories aggregated into this feeds are rechecked for " +"updates. If none, then stories will always be refetched from the sources." +msgstr "" +"Der Intervall, in dem die Beiträge, die in diesem Feed gesammelt werden, auf " +"Aktualisierungen überprüft werden sollen. Falls nicht angegeben, werden die " +"Beiträge bei jedem Zugriff von ihrer Quelle geladen." + +#: lib/Forms/Feed.php:89 +msgid "" +"The interval before stories in this feed are rechecked for updates. If none, " +"then stories will always be refetched from the source." +msgstr "" +"Der Intervall, in dem die Beiträge dieses Feeds auf Aktualisierungen " +"überprüft werden sollen. Falls nicht angegeben, werden die Beiträge bei " +"jedem Zugriff von ihrer Quelle geladen." + +#: stories/edit.php:61 +#, php-format +msgid "The story \"%s\" has been saved." +msgstr "Der Beitrag \"%s\" wurde gespeichert." + +#: stories/delete.php:75 +msgid "The story has been deleted." +msgstr "Der Beitrag wurde gelöscht." + +#: stories/share.php:120 +msgid "The story was sent successfully." +msgstr "Der Beitrag wurde erfolgreich versendet." + +#: channels/aggregate.php:62 lib/Forms/Feed.php:91 +msgid "" +"The url to use to fetch the stories, for example 'http://www.example.com/" +"stories.rss'" +msgstr "" +"Die URL, die benutzt werden soll, um die Beiträge herunterzuladen, zum " +"Beispiel 'http://www.example.com/stories.rss'." + +#: channels/delete.php:67 +#, php-format +msgid "There was an error deleting the channel: %s" +msgstr "Beim Löschen des Kanals ist ein Fehler aufgetreten: %s" + +#: stories/delete.php:73 +#, php-format +msgid "There was an error deleting the story: %s" +msgstr "Beim Löschen des Beitrags ist ein Fehler aufgetreten: %s" + +#: channels/aggregate.php:98 +#, php-format +msgid "There was an error removing the channel: %s" +msgstr "Beim Entfernen des Kanals ist ein Fehler aufgetreten: %s" + +#: channels/aggregate.php:77 +#, php-format +msgid "There was an error saving the channel: %s" +msgstr "Beim Speichern des Kanals ist ein Fehler aufgetreten: %s" + +#: channels/edit.php:68 +#, php-format +msgid "There was an error saving the feed: %s" +msgstr "Beim Speichern des Feeds ist ein Fehler aufgetreten: %s" + +#: stories/edit.php:59 +#, php-format +msgid "There was an error saving the story: %s" +msgstr "Beim Speichern des Beitrags ist ein Fehler aufgetreten: %s" + +#: channels/aggregate.php:85 channels/aggregate.php:105 +#, php-format +msgid "There was an error updating the channel: %s" +msgstr "Beim Aktualisieren des Kanals ist ein Fehler aufgetreten: %s" + +#: channels/aggregate.php:46 +msgid "This is no aggregated channel." +msgstr "Dies ist kein gesammelter Kanal." + +#: stories/share.php:84 +msgid "To" +msgstr "An" + +#: channels/index.php:86 lib/Forms/Feed.php:45 +msgid "Type" +msgstr "Typ" + +#: config/templates.php.dist:53 +msgid "Ultracompact" +msgstr "Sehr kompakt" + +#: stories/share.php:118 +#, php-format +msgid "Unable to send story: %s" +msgstr "Der Beitrag konnte nicht versendet werden: %s" + +#: channels/aggregate.php:115 +msgid "Update" +msgstr "Aktualisierung" + +#: lib/Block/news_popular.php:45 lib/Block/news.php:41 +msgid "View" +msgstr "Anzeigen" + +#: stories/edit.php:41 stories/index.php:31 stories/results.php:24 +#: stories/delete.php:42 channels/edit.php:43 channels/index.php:19 +#: channels/delete.php:38 channels/aggregate.php:53 +msgid "You are not authorised for this action." +msgstr "Sie sind zu dieser Aktion nicht autorisiert." + +#: channels/edit.php:72 +msgid "You can now edit the sub-feeds." +msgstr "Sie können jetzt die Unter-Feeds bearbeiten." + +#: lib/News.php:771 +msgid "[No title]" +msgstr "[Keine Überschrift]" + +#: lib/Jonah.php:245 +msgid "_Feeds" +msgstr "_Feeds" + +#: lib/Jonah.php:241 +msgid "_My News" +msgstr "_Meine Nachrichten" + +#: lib/Jonah.php:258 +msgid "_New Story" +msgstr "_Neuer Beitrag" + +#: lib/News.php:437 lib/Driver.php:336 +msgid "none" +msgstr "keines" diff --git a/jonah/po/es_ES.po b/jonah/po/es_ES.po new file mode 100644 index 000000000..7e1f6507b --- /dev/null +++ b/jonah/po/es_ES.po @@ -0,0 +1,1038 @@ +# Spanish translations for jonah package +# Traducciones al español para el paquete jonah. +# Copyright 2008-2009 The Horde Project +# This file is distributed under the same license as the jonah package. +# Automatically generated, 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: Jonah 1.0-cvs\n" +"Report-Msgid-Bugs-To: dev@lists.horde.org\n" +"POT-Creation-Date: 2008-03-18 12:03+0100\n" +"PO-Revision-Date: 2008-03-18 12:03+0100\n" +"Last-Translator: Manuel P. Ayala \n" +"Language-Team: i18n@lists.horde.org\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: lib/Block/news_popular.php:77 lib/Block/news_popular.php:80 +msgid " - Most read stories" +msgstr " - Historias más leídas" + +#: lib/Block/delivery.php:48 +#, php-format +msgid "\"%s\" stories in HTML" +msgstr "\"%s\" historias en HTML" + +#: lib/Block/delivery_email.php:53 +#, php-format +msgid "%s by Email" +msgstr "%s por Email" + +#: lists/index.php:121 +#, php-format +msgid "%s to %s of %s" +msgstr "%s al %s de %s" + +#: lib/News.php:474 +msgid "1 hour" +msgstr "1 hora" + +#: lib/News.php:478 +msgid "12 hours" +msgstr "12 horas" + +#: lib/News.php:475 +msgid "2 hours" +msgstr "2 horas" + +#: lib/News.php:479 +msgid "24 hours" +msgstr "24 horas" + +#: lib/News.php:473 +msgid "30 mins" +msgstr "30 minutos" + +#: lib/News.php:476 +msgid "4 hours" +msgstr "4 horas" + +#: lib/News.php:477 +msgid "8 hours" +msgstr "8 horas" + +#: delivery/email.php:97 +#, php-format +msgid "" +"A confirmation message has been sent to %s. Click on the link in that " +"message to finally subscribe to channel \"%s\"." +msgstr "" +"Se ha enviado un mensaje de confirmación a %s. Pulse el vínculo de ese " +"mensaje para terminar de suscribirse al canal \"%s\"." + +#: stories/share.php:86 +msgid "A link to the story" +msgstr "Vínculo a la historia" + +#: channels/aggregate.php:56 +msgid "Add" +msgstr "Añadir" + +#: content.php:34 +msgid "Add Content" +msgstr "Añadir contenido" + +#: lib/Forms/Story.php:37 +msgid "Add New Story" +msgstr "Añadir historia" + +#: channels/index.php:71 +msgid "Add story" +msgstr "Añadir historia" + +#: lib/api.php:118 +msgid "Administrator" +msgstr "Administrador" + +#: lib/News.php:512 lib/Jonah.php:138 +msgid "Aggregated Feed" +msgstr "Suscripción asociada" + +#: channels/aggregate.php:55 +#, php-format +msgid "Aggregated channels for channel \"%s\"" +msgstr "Canales asociados del canal \"%s\"" + +#: channels/delete.php:55 +msgid "All stories created in this channel will be lost!" +msgstr "¡Se perderán todas las historias del canal!" + +#: stories/results.php:114 +#, php-format +msgid "All stories tagged with %s" +msgstr "Todas las historias etiquetadas como %s" + +#: channels/index.php:35 +#, php-format +msgid "An error occurred fetching channels: %s" +msgstr "Se ha producido un error al traer los canales: %s" + +#: channels/delete.php:57 +msgid "Any cached stories for this channel will be lost!" +msgstr "" +"¡Se perderán todas las historias de este canal almacenadas temporalmente!" + +#: lib/Forms/Feed.php:83 lib/Forms/Feed.php:94 +msgid "Caching" +msgstr "Almacenando" + +#: stories/pdf.php:44 +msgid "Cannot generate PDFs of remote stories." +msgstr "No se pueden generar PDFs de historias remotas." + +#: lib/Block/delivery_email.php:87 +msgid "Channel" +msgstr "Canal" + +#: lib/News/sql.php:510 +#, php-format +msgid "Channel \"%s\" not found." +msgstr "No se ha encontrado el canal \"%s\"." + +#: lists/index.php:130 +msgid "Channel Lists Admin" +msgstr "Administrador de listas de canales" + +#: channels/aggregate.php:58 +msgid "Channel Name" +msgstr "Nombre del canal" + +#: lib/Forms/Feed.php:77 +msgid "" +"Channel URL for further pages, if not the default one. %c gets replaced by " +"the feed ID, %n by the story offset." +msgstr "" +"URL de las páginas siguientes del canal, si no está por omisión. %c se " +"sustituye por el ID de la suscripción, %n por el desplazamiento de la " +"historia." + +#: lib/Forms/Feed.php:112 +msgid "" +"Channel URL if not the default one. %c gets replaced by the feed ID, %n by " +"the story offset." +msgstr "" +"URL del canal si no está por omisión. %c se sustituye por el ID de la " +"suscripción, %n por el desplazamiento de la historia." + +#: lib/Forms/Feed.php:76 +#, php-format +msgid "Channel URL if not the default one. %c gets replaced by the feed ID." +msgstr "" +"URL del canal si no está por omisión. %c se sustituye por el ID de la " +"suscripción." + +#: channels/delete.php:75 +msgid "Channel has not been deleted." +msgstr "No se ha eliminado el canal." + +#: lib/News/sql.php:174 +#, php-format +msgid "Channel id \"%s\" not found." +msgstr "No se ha encontrado el canal con id \"%s\"." + +#: stories/index.php:54 +msgid "Channel refreshed." +msgstr "Se ha actualizado el canal." + +#: templates/stories/index.html:37 +msgid "Comments" +msgstr "Comentarios" + +#: config/.bak/templates.php.dist:42 +msgid "Compact" +msgstr "Compactar" + +#: lib/News.php:515 lib/Jonah.php:141 +msgid "Composite Feed" +msgstr "Suscripción compuesta" + +#: lib/Forms/Feed.php:114 +msgid "Composite feeds" +msgstr "Suscripciones compuestas" + +#: lib/News.php:358 +#, php-format +msgid "Could not deliver to the %s distribution list. %s" +msgstr "No se puede enviar a la lista de distribución %s. %s" + +#: lib/Jonah.php:87 +#, php-format +msgid "Could not open %s." +msgstr "No se puede abrir %s." + +#: lib/Block/latest.php:49 +msgid "Count reads of the latest story when this block is displayed" +msgstr "" +"Cuando este bloque se muestra se cuentan las lecturas de la última historia" + +#: lib/Block/story.php:49 +msgid "Count reads of this story when this block is displayed" +msgstr "Cuando este bloque se muestra se cuentan las lecturas de esta historia" + +#: lists/index.php:110 +msgid "Current Recipients" +msgstr "Destinatarios actuales" + +#: stories/index.php:136 stories/results.php:116 +msgid "Date" +msgstr "Fecha" + +#: stories/delete.php:51 stories/delete.php:56 channels/delete.php:50 +#: channels/delete.php:61 +msgid "Delete" +msgstr "Eliminar" + +#: channels/delete.php:47 +#, php-format +msgid "Delete News Channel \"%s\"?" +msgstr "¿Eliminar canal de noticias \"%s\"?" + +#: stories/delete.php:47 +#, php-format +msgid "Delete News Story \"%s\"?" +msgstr "¿Eliminar historia de noticias \"%s\"?" + +#: channels/index.php:49 +msgid "Delete channel" +msgstr "Eliminar canal" + +#: lists/index.php:82 +msgid "Delete recipient" +msgstr "Eliminar destinatario" + +#: stories/index.php:97 stories/results.php:94 +msgid "Delete story" +msgstr "Eliminar historia" + +#: lists/edit.php:57 lists/edit.php:62 +msgid "Delivery" +msgstr "Entregar" + +#: channels/index.php:60 +msgid "Delivery lists" +msgstr "Listas de entrega" + +#: lists/edit.php:50 +#, php-format +msgid "Delivery of \"%s\" stories" +msgstr "Entrega de \"%s\" historias" + +#: lib/Forms/Feed.php:75 lib/Forms/Feed.php:93 lib/Forms/Feed.php:111 +msgid "Description" +msgstr "Descripción" + +#: stories/delete.php:51 channels/delete.php:50 +msgid "Do not delete" +msgstr "No eliminar" + +#: lib/Forms/Feed.php:40 +msgid "Edit Feed" +msgstr "Modificar suscripción" + +#: lib/Forms/Story.php:37 +msgid "Edit Story" +msgstr "Modificar historia" + +#: lib/Forms/Feed.php:100 +msgid "Edit aggregated feeds" +msgstr "Modificar suscripciones asociadas" + +#: channels/index.php:44 +msgid "Edit channel" +msgstr "Modificar canal" + +#: channels/aggregate.php:25 +#, php-format +msgid "Edit channel \"%s\"" +msgstr "Modificar el canal \"%s\"" + +#: stories/index.php:92 stories/results.php:87 +msgid "Edit story" +msgstr "Modificar historia" + +#: lib/Delivery/email.php:180 lib/Delivery/email.php:195 +msgid "Email" +msgstr "Correo" + +#: delivery/email.php:64 +#, php-format +msgid "Email Delivery for \"%s\"" +msgstr "Entrega de correo de \"%s\"" + +#: delivery/email.php:78 lib/Block/delivery_email.php:96 +msgid "Email address" +msgstr "Correo electrónico" + +#: lib/News.php:554 +#, php-format +msgid "Error fetching feed: %s" +msgstr "Error al traer la suscripción: %s" + +#: stories/pdf.php:15 stories/share.php:66 stories/view.php:25 +#: stories/view.php:35 lib/Block/latest.php:91 lib/Block/story.php:91 +#, php-format +msgid "Error fetching story: %s" +msgstr "Error al traer la historia: %s" + +#: lib/News.php:793 +#, php-format +msgid "Error parsing external feed from %s: %s" +msgstr "Error al procesar la suscripción externa de %s: %s" + +#: lib/api.php:109 +msgid "External Channels" +msgstr "Canales externos" + +#: lib/News.php:506 lib/Jonah.php:135 +msgid "External Feed" +msgstr "Suscripción externa" + +#: lib/Forms/Feed.php:51 +msgid "Extra information for this feed type" +msgstr "Información adicional para este tipo de suscripción" + +#: lib/Block/news_popular.php:32 lib/Block/story.php:42 lib/Block/news.php:3 +#: lib/Block/news.php:30 +msgid "Feed" +msgstr "Suscripción" + +#: lib/News.php:113 +#, php-format +msgid "Feed \"%s\" is not authored on this system." +msgstr "La suscripción \"%s\" no se ha generado en este sistema." + +#: channels/edit.php:56 +msgid "Feed type changed." +msgstr "Se ha cambiado el tipo de suscripción." + +#: lib/Block/delivery.php:3 lib/Block/delivery.php:25 channels/index.php:96 +msgid "Feeds" +msgstr "Suscripciones" + +#: lib/Block/news.php:54 +msgid "First Story" +msgstr "Primera historia" + +#: stories/share.php:78 +msgid "From" +msgstr "De" + +#: lib/Forms/Story.php:74 lib/Forms/Story.php:76 +msgid "Full Story Text" +msgstr "Texto completo de la historia" + +#: delivery/html.php:39 +#, php-format +msgid "HTML Delivery for \"%s\"" +msgstr "Entrega HTML de \"%s\"" + +#: lib/News.php:693 +msgid "HTML Version of Story" +msgstr "Versión HTML de la historia" + +#: lib/Block/delivery.php:67 +#, php-format +msgid "Have \"%s\" emailed to you" +msgstr "Enviarme \"%s\" por correo" + +#: lib/Delivery/email.php:72 lib/Delivery/email.php:75 +msgid "Hello" +msgstr "Hola" + +#: lib/Forms/Story.php:82 +msgid "" +"If you enter a URL without a full story text, clicking on the story will " +"send the reader straight to the URL, otherwise it will be shown at the end " +"of the full story." +msgstr "" +"Si introduce una URL sin un texto completo de historia, al hacer click en la " +"historia se enviará al lector directamente a la URL, de otro modo se le " +"mostrará al final de la historia completa." + +#: lib/Forms/Feed.php:87 channels/aggregate.php:61 +msgid "Image" +msgstr "Imagen" + +#: stories/share.php:86 +msgid "Include" +msgstr "Incluir" + +#: config/.bak/templates.php.dist:31 +msgid "Internal" +msgstr "Internos" + +#: lib/api.php:91 +msgid "Internal Channels" +msgstr "Canales internos" + +#: stories/index.php:43 stories/results.php:49 +#, php-format +msgid "Invalid channel requested. %s" +msgstr "Se ha solicitado un canal no válido. %s" + +#: channels/delete.php:35 +msgid "Invalid channel specified for deletion." +msgstr "Se ha indicado un canal no válido para eliminar." + +#: lists/delete.php:37 lists/edit.php:36 delivery/html.php:33 +#: delivery/email.php:55 +msgid "Invalid channel." +msgstr "Canal no válido." + +#: lists/delete.php:27 +msgid "Invalid request to delete recipient from delivery list." +msgstr "" +"Petición no válida de eliminación de destinatario de la lista de " +"distribución." + +#: delivery/email.php:69 +msgid "Join this channel" +msgstr "Unirse al canal" + +#: channels/index.php:91 +msgid "Last Update" +msgstr "Última actualización" + +#: lib/Block/latest.php:3 lib/Block/latest.php:65 +msgid "Latest News" +msgstr "Últimas Noticias" + +#: delivery/email.php:70 +msgid "Leave this channel" +msgstr "Abandonar este canal" + +#: lib/Forms/Feed.php:86 channels/aggregate.php:60 +msgid "Link" +msgstr "Vínculo" + +#: stories/index.php:128 +msgid "Lists" +msgstr "Listas" + +#: lib/News.php:509 lib/Jonah.php:132 +msgid "Local Feed" +msgstr "Suscripción local" + +#: channels/index.php:90 +msgid "Manage Feeds" +msgstr "Gestionar suscripciones" + +#: lib/Block/news_popular.php:53 lib/Block/news.php:49 +msgid "Maximum Stories" +msgstr "Cantidad máxima de historias" + +#: config/.bak/templates.php.dist:20 +msgid "Media" +msgstr "Medio" + +#: lib/Block/tree_menu.php:3 +msgid "Menu List" +msgstr "Lista del menú" + +#: stories/share.php:87 +msgid "Message" +msgstr "Mensaje" + +#: lists/index.php:125 +msgid "Method" +msgstr "Método" + +#: lib/News.php:74 +msgid "Missing channel id." +msgstr "Falta el id del canal." + +#: lib/Block/news_popular.php:3 +msgid "Most Popular Stories" +msgstr "Historias más populares" + +#: content.php:31 templates/content/header.inc:2 +msgid "My News" +msgstr "Mis noticias" + +#: content_edit.php:32 +msgid "My News :: Add Content" +msgstr "Mis noticias :: Añadir contenido" + +#: lists/index.php:125 delivery/email.php:83 lib/Forms/Feed.php:50 +#: lib/Delivery/email.php:197 lib/Block/delivery_email.php:97 +#: channels/index.php:91 +msgid "Name" +msgstr "Nombre" + +#: lib/Forms/Feed.php:40 +msgid "New Feed" +msgstr "Añadir suscripción" + +#: stories/index.php:122 lib/Block/news_popular.php:86 +msgid "New Story" +msgstr "Nueva historia" + +#: lists/index.php:106 +msgid "New recipient" +msgstr "Nuevo destinatario" + +#: lib/api.php:90 lib/api.php:108 +msgid "News" +msgstr "Noticias" + +#: lib/Block/delivery_email.php:29 +msgid "News Channel" +msgstr "Canal de noticias" + +#: lib/Block/latest.php:33 +msgid "News Source" +msgstr "Origen de noticias" + +#: lib/Block/delivery_email.php:3 +msgid "News by Email" +msgstr "Noticias por correo" + +#: lists/index.php:40 channels/index.php:25 +msgid "News is not enabled." +msgstr "No están activadas las noticias." + +#: stories/index.php:51 stories/results.php:57 +msgid "No available stories." +msgstr "No se dispone de historias." + +#: lists/index.php:26 stories/index.php:23 +msgid "No channel requested." +msgstr "No se ha solicitado un canal." + +#: lib/Block/latest.php:86 +msgid "No channel specified." +msgstr "No se ha especificado un canal." + +#: templates/channels/index.html:41 +msgid "No channels are available." +msgstr "No hay canales disponibles." + +#: lib/Block/delivery_email.php:67 +msgid "No channels available." +msgstr "No hay canales disponibles." + +#: lib/Block/news_popular.php:99 lib/Block/news.php:92 +msgid "No feed specified." +msgstr "No se ha indicado una suscripción." + +#: lib/Block/delivery.php:76 +msgid "No feeds are available." +msgstr "No hay suscripciones disponibles." + +#: lists/index.php:79 +msgid "No recipients." +msgstr "Sin destinatarios." + +#: lib/News.php:584 +msgid "No stories are currently available." +msgstr "Actualment no se dispone de historias." + +#: lib/Block/story.php:86 +msgid "No story is selected." +msgstr "No se ha seleccionado ninguna historia." + +#: lib/Delivery.php:215 +#, php-format +msgid "No such action \"%s\" found" +msgstr "No se encontró el tipo de acción \"%s\"" + +#: lib/News.php:743 +#, php-format +msgid "No such backend \"%s\" found" +msgstr "No se encontró el motor \"%s\"" + +#: stories/results.php:40 +msgid "No tag requested." +msgstr "No se ha solicitado una etiqueta." + +#: stories/delete.php:36 +msgid "No valid story requested for deletion." +msgstr "No se ha solicitado una historia válida para borrar." + +#: stories/share.php:25 +msgid "Note" +msgstr "Nota" + +#: lib/Forms/Story.php:58 +msgid "" +"Note: this story won't be delivered to distribution lists automatically if " +"this time is in the future." +msgstr "" +"Observación: esta historia no se enviará de forma automática a las listas de " +"distribución si esta hora está en el futuro." + +#: lib/Forms/Story.php:55 +msgid "Or publish on this date:" +msgstr "O publicar en esta fecha:" + +#: stories/index.php:87 stories/results.php:81 +msgid "PDF version" +msgstr "Versión PDF" + +#: channels/delete.php:22 +msgid "Permission Denied." +msgstr "Permiso denegado." + +#: lib/News.php:688 +msgid "Plaintext Version of Story" +msgstr "Versión en texto de la historia" + +#: lib/Forms/Story.php:45 +msgid "Publish Now?" +msgstr "¿Publicar ahora?" + +#: lib/Block/delivery.php:59 +#, php-format +msgid "RSS Feed of \"%s\"" +msgstr "Suscripción RSS de \"%s\"" + +#: templates/stories/index.html:32 +msgid "Read" +msgstr "Leer" + +#: channels/delete.php:53 +msgid "Really delete this News Channel?" +msgstr "¿Eliminar realmente este canal de noticias?" + +#: stories/delete.php:54 +msgid "Really delete this News Story?" +msgstr "¿Eliminar realmente esta historia de noticias?" + +#: lists/index.php:125 +msgid "Recipient" +msgstr "Destinatario" + +#: lists/edit.php:86 +msgid "Recipient saved." +msgstr "Se ha guardado el destinatario." + +#: lists/delete.php:52 +msgid "Recipient successfully removed." +msgstr "Se ha eliminado correctamente el destinatario." + +#: stories/index.php:135 +msgid "Refresh Channel" +msgstr "Actualizar canal" + +#: channels/index.php:79 +msgid "Refresh channel" +msgstr "Actualizar canal" + +#: lists/delete.php:54 +msgid "Removal of recipient failed." +msgstr "Ha fallado la eliminación del destinatario." + +#: channels/aggregate.php:26 +#, php-format +msgid "Remove channel \"%s\"" +msgstr "Eliminar el canal \"%s\"" + +#: delivery/email.php:44 +msgid "Request confirmed." +msgstr "Solicitud confirmada." + +#: lib/Delivery/email.php:69 +#, php-format +msgid "Request to receive news channel \"%s\"" +msgstr "Solicitar recibir el canal de noticias \"%s\"" + +#: lib/Delivery/email.php:74 +#, php-format +msgid "Request to stop receiving news channel \"%s\"" +msgstr "Solicitar dejar de recibir el canal de noticias \"%s\"" + +#: lib/Block/cloud.php:27 +msgid "Results URL" +msgstr "URL de resultados" + +#: lib/Jonah.php:218 +msgid "Rich Text" +msgstr "Texto enriquecido" + +#: lists/edit.php:52 delivery/email.php:66 lib/Forms/Story.php:39 +#: lib/Block/delivery_email.php:82 +msgid "Save" +msgstr "Guardar" + +#: templates/delivery/html.html:13 +msgid "Select a format:" +msgstr "Seleccione un formato:" + +#: stories/share.php:75 +msgid "Send" +msgstr "Enviar" + +#: stories/share.php:84 +msgid "Separate multiple email addresses with commas." +msgstr "Separar varias direcciones de correo mediante comas." + +#: stories/share.php:73 +msgid "Share Story" +msgstr "Compartir historia" + +#: stories/view.php:87 +msgid "Share this story" +msgstr "Compartir esta historia" + +#: lib/Forms/Story.php:44 +msgid "Short Description" +msgstr "Descripción corta" + +#: lib/Forms/Feed.php:85 channels/aggregate.php:59 +msgid "Source URL" +msgstr "URL origen" + +#: lib/Forms/Feed.php:100 +msgid "Source URLs" +msgstr "URLs origen" + +#: config/.bak/templates.php.dist:9 +msgid "Standard" +msgstr "Estándar" + +#: templates/stories/index.html:9 +msgid "Stories" +msgstr "Historias" + +#: stories/results.php:112 delivery/rss.php:58 +#, php-format +msgid "Stories tagged with %s in %s" +msgstr "Historias etiquetadas como %s en %s" + +#: stories/index.php:136 stories/results.php:116 lib/Block/story.php:3 +#: lib/Block/story.php:46 lib/Block/story.php:65 +msgid "Story" +msgstr "Historia" + +#: lib/News.php:764 +#, php-format +msgid "Story \"%s\" not found in \"%s\"." +msgstr "No se encontró la historia \"%s\" en \"%s\"." + +#: stories/share.php:109 +msgid "Story Link" +msgstr "Vínculo de la historia" + +#: lib/Forms/Story.php:43 +msgid "Story Title (Headline)" +msgstr "Título de la historia (Titular)" + +#: lib/Forms/Story.php:82 +msgid "Story URL" +msgstr "URL de la historia" + +#: lib/News/sql.php:456 +#, php-format +msgid "Story URL \"%s\" not found." +msgstr "No se encontró la URL \"%s\" de la historia." + +#: lib/Forms/Feed.php:78 lib/Forms/Feed.php:113 +#, php-format +msgid "" +"Story URL if not the default one. %c gets replaced by the feed ID, %s by the " +"story ID." +msgstr "" +"La URL de la historia no es la URL por omisión. %c se sustituye por el ID de " +"la suscripción, %s por el ID de la historia." + +#: lib/Forms/Story.php:61 +msgid "Story body type" +msgstr "Tipo de cuerpo de la historia" + +#: stories/edit.php:34 +#, php-format +msgid "Story editing failed: %s" +msgstr "Falló la modificación de la historia: %s" + +#: stories/delete.php:71 +msgid "Story has not been deleted." +msgstr "No se ha eliminado la historia." + +#: lib/News/sql.php:424 +#, php-format +msgid "Story id \"%s\" not found." +msgstr "No se encontró el id \"%s\" de historia." + +#: stories/share.php:85 +msgid "Subject" +msgstr "Asunto" + +#: lib/News.php:363 +#, php-format +msgid "Successfully delivered to the %s distribution list." +msgstr "Se ha enviado correctamente a la lista de distribución %s." + +#: lib/Block/cloud.php:3 lib/Block/cloud.php:35 +msgid "Tag Cloud" +msgstr "Conjunto de etiquetas" + +#: lib/News.php:834 lib/News.php:839 lib/News.php:844 lib/News.php:850 +#: lib/News.php:855 +msgid "Tag support not enabled in backend." +msgstr "El soporte de etiquetas no está habilitado en el motor." + +#: lib/Forms/Story.php:79 +msgid "Tags" +msgstr "Etiquetas" + +#: lib/Block/story.php:105 templates/stories/story.html:6 +msgid "Tags: " +msgstr "Etiquetas: " + +#: lib/Jonah.php:225 +msgid "Text" +msgstr "Texto" + +#: channels/aggregate.php:95 +#, php-format +msgid "The channel \"%s\" has been removed." +msgstr "Se ha eliminado el canal \"%s\"." + +#: channels/aggregate.php:76 +#, php-format +msgid "The channel \"%s\" has been saved." +msgstr "Se ha guardado el canal \"%s\"." + +#: channels/aggregate.php:84 channels/aggregate.php:102 +#, php-format +msgid "The channel \"%s\" has been updated." +msgstr "Se ha actualizado el canal \"%s\"." + +#: channels/delete.php:68 +msgid "The channel has been deleted." +msgstr "Se ha eliminado el canal." + +#: stories/share.php:86 +msgid "The complete text of the story" +msgstr "El texto completo de la historia" + +#: channels/edit.php:70 +#, php-format +msgid "The feed \"%s\" has been saved." +msgstr "Se ha guardado la suscripción \"%s\"." + +#: lib/Forms/Feed.php:94 +msgid "" +"The interval before stories aggregated into this feeds are rechecked for " +"updates. If none, then stories will always be refetched from the sources." +msgstr "" +"Intervalo antes de que se vuelvan a comprobar las actualizaciones de las " +"historias asociadas a estas suscripciones. Si es nulo, las historias se " +"traerán siempre del origen." + +#: lib/Forms/Feed.php:83 +msgid "" +"The interval before stories in this feed are rechecked for updates. If none, " +"then stories will always be refetched from the source." +msgstr "" +"Intervalo antes de que se vuelvan a comprobar las actualizaciones de las " +"historias de esta suscripción. Si es nulo, las historias se traerán siempre " +"del origen." + +#: stories/edit.php:63 +#, php-format +msgid "The story \"%s\" has been saved." +msgstr "Se ha guardado la historia \"%s\"." + +#: stories/delete.php:63 +msgid "The story has been deleted." +msgstr "Se ha eliminado la historia." + +#: stories/share.php:120 +msgid "The story was sent successfully." +msgstr "Se envío correctamente la historia." + +#: lib/Forms/Feed.php:85 channels/aggregate.php:59 +msgid "" +"The url to use to fetch the stories, for example 'http://www.example.com/" +"stories.rss'" +msgstr "" +"Url utilizado para traer las historias, por ejemplo 'http://www.ejemplo.com/" +"historias.rss'" + +#: channels/delete.php:66 +#, php-format +msgid "There was an error deleting the channel: %s" +msgstr "Se produjo un error al eliminar el canal: %s" + +#: stories/delete.php:61 +#, php-format +msgid "There was an error deleting the story: %s" +msgstr "Se produjo un error al eliminar la historia: %s" + +#: channels/aggregate.php:93 +#, php-format +msgid "There was an error removing the channel: %s" +msgstr "Se produjo un error al eliminar el canal: %s" + +#: channels/aggregate.php:74 +#, php-format +msgid "There was an error saving the channel: %s" +msgstr "Se produjo un error al guardar el canal: %s" + +#: channels/edit.php:68 +#, php-format +msgid "There was an error saving the feed: %s" +msgstr "Se produjo un error al guardar la suscripción: %s" + +#: stories/edit.php:61 +#, php-format +msgid "There was an error saving the story: %s" +msgstr "Se produjo un error al guardar la historia: %s" + +#: channels/aggregate.php:82 channels/aggregate.php:100 +#, php-format +msgid "There was an error updating the channel: %s" +msgstr "Se produjo un error al actualizar el canal: %s" + +#: lib/Delivery/email.php:181 +msgid "" +"This driver allows the delivery of news stories via email to one or more " +"recipients." +msgstr "" +"Este controlador permite el envío por correo de historias de noticias a uno " +"o más destinatarios." + +#: channels/aggregate.php:43 +msgid "This is no aggregated channel." +msgstr "Éste no es un canal asociado." + +#: stories/share.php:84 +msgid "To" +msgstr "Para" + +#: lib/Forms/Feed.php:45 channels/index.php:91 +msgid "Type" +msgstr "Tipo" + +#: config/.bak/templates.php.dist:53 +msgid "Ultracompact" +msgstr "Ultracompacto" + +#: delivery/email.php:42 +#, php-format +msgid "Unable to confirm request." +msgstr "Incapaz de confirmar la solicitud." + +#: stories/share.php:118 +#, php-format +msgid "Unable to send story: %s" +msgstr "Incapaz de enviar historia: %s" + +#: channels/aggregate.php:107 +msgid "Update" +msgstr "Actualizar" + +#: lib/Block/news_popular.php:45 lib/Block/news.php:41 +msgid "View" +msgstr "Ver" + +#: delivery/email.php:67 +msgid "What do you want to do?" +msgstr "¿Qué desea hacer?" + +#: lists/index.php:34 lists/delete.php:45 lists/edit.php:44 +#: stories/index.php:31 stories/delete.php:22 stories/results.php:24 +#: stories/edit.php:42 channels/index.php:19 channels/aggregate.php:50 +#: channels/edit.php:43 +msgid "You are not authorised for this action." +msgstr "Carece de autorización para realizar esta acción." + +#: channels/edit.php:72 +msgid "You can now edit the sub-feeds." +msgstr "Ahora puede modificar las suscripciones secundarias" + +#: lib/Delivery/email.php:72 +#, php-format +msgid "" +"You have requested to receive \"%s\" stories by email. Click on this link to " +"confirm the request: %s" +msgstr "" +"Ha solicitado recibir por correo las historias de \"%s\". Pulse este vínculo " +"para confirmar la petición: %s" + +#: lib/Delivery/email.php:75 +#, php-format +msgid "" +"You have requested to stop receiving \"%s\" stories by email. Click on this " +"link to confirm the request: %s" +msgstr "" +"Ha solicitado dejar de recibir por correo las historias de \"%s\". Pulse " +"este vínculo para confirmar la petición: %s" + +#: lib/Delivery.php:272 +msgid "You must configure a Horde Datatree backend to use Jonah." +msgstr "Para usar Jonah tiene que configurar un motor de DataTree." + +#: lib/News.php:806 +msgid "[No title]" +msgstr "[Sin título]" + +#: lib/Jonah.php:266 +msgid "_Feeds" +msgstr "_Suscripciones" + +#: lib/Jonah.php:262 +msgid "_My News" +msgstr ":Mis noticias" + +#: lib/Jonah.php:267 +msgid "_New Feed" +msgstr "_Añadir suscripción" + +#: lib/News.php:472 +msgid "none" +msgstr "ninguno" diff --git a/jonah/po/fi_FI.po b/jonah/po/fi_FI.po new file mode 100644 index 000000000..77bd8ee64 --- /dev/null +++ b/jonah/po/fi_FI.po @@ -0,0 +1,1047 @@ +# Finnish translation for Jonah. +# Copyright +# Leena Heino , 2003-2004. +# +msgid "" +msgstr "" +"Project-Id-Version: Jonah 0.1-cvs\n" +"Report-Msgid-Bugs-To: dev@lists.horde.org\n" +"POT-Creation-Date: 2005-03-14 11:02+0200\n" +"PO-Revision-Date: 2004-12-10 12:59+0200\n" +"Last-Translator: Leena Heino \n" +"Language-Team: Finnish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8-bit\n" + +#: lib/Block/delivery_email.php:60 +#, php-format +msgid "%s by Email" +msgstr "%s Sähköpostitse" + +#: lists/index.php:118 +#, php-format +msgid "%s to %s of %s" +msgstr "%s - %s / %s" + +#: lib/Block/delivery.php:77 delivery/index.php:47 +#, php-format +msgid "'%s' stories by email" +msgstr "'%s' artikkelia sähköpostitse" + +#: lib/Block/delivery.php:60 delivery/index.php:35 +#, php-format +msgid "'%s' stories in HTML" +msgstr "'%s' artikkelia HTML-muodossa" + +#: lib/Block/delivery.php:69 delivery/index.php:41 +#, php-format +msgid "'%s' stories in XML" +msgstr "'%s' artikkelia XML:llä" + +#: lib/News.php:417 +msgid "1 hour" +msgstr "1 tunti" + +#: lib/News.php:421 +msgid "12 hours" +msgstr "12 tuntia" + +#: lib/News.php:418 +msgid "2 hours" +msgstr "2 tuntia" + +#: lib/News.php:422 +msgid "24 hours" +msgstr "24 tuntia" + +#: lib/News.php:416 +msgid "30 mins" +msgstr "30 minuuttia" + +#: lib/News.php:419 +msgid "4 hours" +msgstr "4 tuntia" + +#: lib/News.php:420 +msgid "8 hours" +msgstr "8 tuntia" + +#: delivery/email.php:95 +#, php-format +msgid "" +"A confirmation message has been sent to %s. Click on the link in that " +"message to finally subscribe to channel \"%s\"." +msgstr "" +"Varmistusviesti on lähetetty osoitteeseen %s. Napsauta viestissä olevaan " +"linkkiä tilataksesi kanavan \"%s\"." + +#: stories/share.php:104 +msgid "A link to the story" +msgstr "Linkki artikkeliin" + +#: channels/aggregate.php:54 +msgid "Add" +msgstr "Lisää" + +#: lib/Form/EditChannel.php:32 +msgid "Add New Channel" +msgstr "Lisää uusi kanava" + +#: stories/edit.php:57 +msgid "Add New Story" +msgstr "Lisää uusi artikkeli" + +#: stories/view.php:56 +msgid "Add a comment" +msgstr "Lisää kommentti" + +#: channels/index.php:68 +msgid "Add story" +msgstr "Lisää artikkeli" + +#: lib/Jonah.php:127 lib/News.php:455 +msgid "Aggregated" +msgstr "Yhdistelty" + +#: channels/aggregate.php:53 +#, php-format +msgid "Aggregated channels for channel \"%s\"" +msgstr "Yhdistetyt kanavat kanavalle \"%s\"" + +#: channels/delete.php:54 +msgid "All stories created in this channel will be lost!" +msgstr "Kaikki tälle kanavalle luodut artikkelit tuhoutuvat!" + +#: channels/index.php:33 +#, php-format +msgid "An error occurred fetching channels: %s" +msgstr "Taphtui virhe haettaessa kanavia: %s" + +#: channels/delete.php:56 +msgid "Any cached stories for this channel will be lost!" +msgstr "Kaikki tämän kanavan välimuistissa olevat artikkelit tuhoutuvat!" + +#: channels/index.php:91 +msgid "Available Channels" +msgstr "Saatavissaolevat kanavat" + +#: lib/Block/delivery.php:35 +#, php-format +msgid "Available Channels from %s" +msgstr "Saatavissaolevat kanavat %s:stä" + +#: delivery/index.php:29 +#, php-format +msgid "Available Channels from %s (%s)" +msgstr "Saatavissaolevat kanavat %s:stä (%s)" + +#: lib/Block/delivery.php:51 +msgid "Available News Channels" +msgstr "Saatavissaolevat uutiskanavat" + +#: lib/Form/EditChannel.php:70 lib/Form/EditChannel.php:81 +msgid "Caching" +msgstr "Haetaan välimuistiin" + +#: config/prefs.php.dist:18 +msgid "Change your content display options." +msgstr "Voit muuttaa näkymään liittyviä asetuksia." + +#: lib/Block/delivery_email.php:83 +msgid "Channel" +msgstr "kanavat" + +#: stories/index.php:114 +#, php-format +msgid "Channel '%s'" +msgstr "Kanava '%s'" + +#: lib/News.php:110 +#, php-format +msgid "Channel '%s' is not an internally authored channel." +msgstr "Kanava '%s' ei pidetä itse yllä." + +#: content.php:77 +msgid "Channel Listing" +msgstr "Kanavan listaus" + +#: lists/index.php:128 +msgid "Channel Lists Admin" +msgstr "Kanavalistauksien ylläpitäjä" + +#: templates/subscribe/column_headers.inc:7 lib/Form/EditChannel.php:43 +#: channels/aggregate.php:56 +msgid "Channel Name" +msgstr "Kanavan nimi" + +#: subscribe.php:134 +msgid "Channel Subscriptions" +msgstr "Kanavan tilaukset" + +#: subscribe.php:127 +msgid "Channel display failed." +msgstr "Kanavan näyttäminen epäonnistui." + +#: channels/delete.php:76 +msgid "Channel has not been deleted." +msgstr "Kanavaa ei ole poistettu." + +#: lib/News/sql.php:158 +#, php-format +msgid "Channel id '%s' not found." +msgstr "Kanavaa id '%s' ei löydy." + +#: stories/index.php:51 +msgid "Channel refreshed." +msgstr "Kanava päivitetty." + +#: subscribe.php:86 +msgid "Channel subscription editing failed." +msgstr "Kanavan tilaustietojen muokkaus epäonnistui." + +#: subscribe.php:41 +msgid "Channel subscription failed." +msgstr "Kanavan tilaus epäonnistui." + +#: channels/edit.php:56 +msgid "Channel type changed." +msgstr "Kanavan tyyppi on vaihdettu." + +#: subscribe.php:73 +msgid "Channel unsubscription failed." +msgstr "Kanavan tilauksen lopettaminen." + +#: config/prefs.php.dist:11 +msgid "Choose which news channels you are subscribed to." +msgstr "Voit valita ne uutiskanavat jotka haluat tilata." + +#: templates/stories/index.html:37 +msgid "Comments" +msgstr "Kommentit" + +#: config/templates.php.dist:40 +msgid "Compact" +msgstr "Pienennetty" + +#: lib/Jonah.php:130 lib/News.php:458 +msgid "Composite" +msgstr "Yhdistelmä" + +#: lib/Form/EditChannel.php:100 +msgid "Composite channels" +msgstr "Yhdistelmä kanavat" + +#: lib/Block/news.php:3 +msgid "Content Channel" +msgstr "Sisältökanava" + +#: lib/News.php:281 +#, php-format +msgid "Could not deliver to the %s distribution list. %s" +msgstr "Ei voitu toimittaa %s jakelulistalle. %s" + +#: delivery/index.php:23 +#, php-format +msgid "Could not get channel list. %s" +msgstr "Kanavalistausta ei saatu. %s" + +#: lib/Jonah.php:71 +#, php-format +msgid "Could not open %s." +msgstr "Ei voitu aukaista %s." + +#: lists/index.php:107 +msgid "Current Recipients" +msgstr "Nykyiset vastaanottajat" + +#: stories/delete.php:50 stories/delete.php:55 channels/delete.php:49 +#: channels/delete.php:60 +msgid "Delete" +msgstr "Poista" + +#: channels/delete.php:46 +#, php-format +msgid "Delete News Channel \"%s\"?" +msgstr "Poista uutiskanava \"%s\"?" + +#: stories/delete.php:46 +#, php-format +msgid "Delete News Story \"%s\"?" +msgstr "Poista uutisartikkeli \"%s\"?" + +#: channels/index.php:49 +msgid "Delete channel" +msgstr "Poista kanava" + +#: lists/index.php:80 +msgid "Delete recipient" +msgstr "Poista vastaanottaja" + +#: stories/index.php:86 +msgid "Delete story" +msgstr "Poista artikkeli" + +#: lib/Jonah.php:254 lists/edit.php:56 lists/edit.php:61 +msgid "Delivery" +msgstr "Jakelu" + +#: channels/index.php:60 +msgid "Delivery lists" +msgstr "Jakelulista" + +#: lists/edit.php:49 +#, php-format +msgid "Delivery of '%s' stories" +msgstr "'%s' artikkeleiden jakelu" + +#: lib/Form/EditChannel.php:64 lib/Form/EditChannel.php:80 +#: lib/Form/EditChannel.php:98 +msgid "Description" +msgstr "Kuvaus" + +#: config/templates.php.dist:9 +msgid "Detailed" +msgstr "Yksityiskohtainen" + +#: config/prefs.php.dist:17 +msgid "Display Options" +msgstr "Näkymän asetukset" + +#: stories/delete.php:50 channels/delete.php:49 +msgid "Do not delete" +msgstr "Ei saa poistaa" + +#: templates/subscribe/column_headers.inc:13 +#: templates/subscribe/subscribe.inc:49 +msgid "Edit" +msgstr "Muokkaa" + +#: lib/Form/EditChannel.php:32 +msgid "Edit Channel" +msgstr "Muokkaa kanavaa" + +#: templates/subscribe/header.inc:3 +msgid "Edit Channel Subscriptions" +msgstr "Muokkaa kanavan tilaustietoja" + +#: stories/edit.php:57 +msgid "Edit Story" +msgstr "Muokkaa artikkelia" + +#: templates/subscribe/subscribe.inc:49 +msgid "Edit Subscription Details" +msgstr "Muokkaa kanavan tilauksen yksityiskohtia" + +#: lib/Form/EditChannel.php:87 +msgid "Edit aggregated channels" +msgstr "Muokkaa yhdisteltyjä kanavia" + +#: channels/index.php:44 +msgid "Edit channel" +msgstr "Muokkaa kanavaa" + +#: channels/aggregate.php:23 +#, php-format +msgid "Edit channel \"%s\"" +msgstr "Muokkaa kanavaa \"%s\"" + +#: stories/index.php:81 +msgid "Edit story" +msgstr "Muokkaa artikkelia" + +#: templates/subscribe/edit.inc:5 +#, php-format +msgid "Editing Channel %s" +msgstr "Muokataan kanavaa %s" + +#: lib/Delivery/email.php:195 lib/Delivery/email.php:210 +msgid "Email" +msgstr "Sähköposti" + +#: delivery/email.php:62 +#, php-format +msgid "Email Delivery for \"%s\"" +msgstr "Jakelu sähköpostitse \"%s\":lle" + +#: lib/Block/delivery_email.php:92 delivery/email.php:76 +msgid "Email address" +msgstr "Sähköpostiosoite" + +#: lib/News.php:499 +#, php-format +msgid "Error fetching channel. %s" +msgstr "Tapahtui virhe haettaessa kanavaa. %s" + +#: stories/share.php:83 stories/view.php:23 +#, php-format +msgid "Error fetching story: %s" +msgstr "Tapahtui virhe haettaessa artikkelia: %s" + +#: lib/News.php:391 +#, php-format +msgid "Error parsing external channel from %s: %s" +msgstr "Tapahtui virhe tulkittaessa ulkoista kanavaa lähteestä %s: %s" + +#: lib/Jonah.php:124 lib/News.php:449 +msgid "External" +msgstr "Ulkopuolinen" + +#: lib/Form/EditChannel.php:44 +msgid "Extra information for this channel type" +msgstr "Tämän kanavatyypin lisätietoja" + +#: lib/Block/news.php:62 +msgid "First Story" +msgstr "Ensimmäinen artikkeli" + +#: stories/share.php:101 +msgid "From" +msgstr "Lähettäjä" + +#: stories/edit.php:89 stories/edit.php:91 +msgid "Full Story Text" +msgstr "Artikkeli kokonaisuudessaan" + +#: delivery/html.php:35 +#, php-format +msgid "HTML Delivery for '%s'" +msgstr "HTML jakelu '%s':lle" + +#: lib/News.php:584 +msgid "HTML Version of Story" +msgstr "Artikkelin HTML-versio" + +#: templates/content/content.html:11 +msgid "Headlines" +msgstr "Pääotsikot" + +#: lib/Delivery/email.php:74 lib/Delivery/email.php:77 +msgid "Hello" +msgstr "Päivää" + +#: config/prefs.php.dist:35 +msgid "How many columns would you like to use to show headlines?" +msgstr "Kuinka monta saraketta käytetään otsikoiden esittämiseen?" + +#: stories/edit.php:96 +msgid "" +"If you enter a URL without a full story text, clicking on the story will " +"send the reader straight to the URL, otherwise it will be shown at the end " +"of the full story." +msgstr "" +"Jos laita URL:n ilman artikkelin teksti, niin artikkelia napsauttamalla " +"lähetät lukijan siihen URL:iin. Muussa tapauksessa URL näkyy vasta " +"artikkelin lopussa." + +#: lib/Form/EditChannel.php:74 channels/aggregate.php:59 +msgid "Image" +msgstr "Kuva" + +#: stories/share.php:104 +msgid "Include" +msgstr "Lisää" + +#: lib/Jonah.php:121 lib/News.php:452 +msgid "Internal" +msgstr "Sisäinen" + +#: lib/api.php:47 +msgid "Internal Channels" +msgstr "Sisäiset kanavat" + +#: stories/index.php:41 +#, php-format +msgid "Invalid channel requested. %s" +msgstr "Pyydettiin epäkelpoa kanavaa. %s" + +#: channels/delete.php:34 +msgid "Invalid channel specified for deletion." +msgstr "Poistettavaksi määritelty kanava on epäkelpo." + +#: lists/edit.php:33 lists/delete.php:37 delivery/email.php:52 +#: delivery/html.php:29 +msgid "Invalid channel." +msgstr "Epäkelpo kanava." + +#: lists/delete.php:27 +msgid "Invalid request to delete recipient from delivery list." +msgstr "Epäkelpo pyyntö poistaa vastaanottaja jakelulistalta." + +#: delivery/email.php:67 +msgid "Join this channel" +msgstr "Liity tälle kanavalle" + +#: delivery/index.php:53 channels/index.php:92 +msgid "Last Update" +msgstr "Edellinen päivitys" + +#: templates/subscribe/column_headers.inc:9 +msgid "Last Updated" +msgstr "Päivitetty viimeksi" + +#: delivery/email.php:68 +msgid "Leave this channel" +msgstr "Poistu tältä kanavalta" + +#: lib/Form/EditChannel.php:73 channels/aggregate.php:58 +msgid "Link" +msgstr "Linkki" + +#: stories/index.php:109 +msgid "Lists" +msgstr "Listat" + +#: lib/Block/news.php:57 +msgid "Maximum Stories" +msgstr "Maksimimäärä artikkeleita" + +#: lib/Block/tree_menu.php:3 +msgid "Menu List" +msgstr "Valikkolista" + +#: stories/share.php:105 +msgid "Message" +msgstr "Viesti" + +#: lists/index.php:123 +msgid "Method" +msgstr "Metodi" + +#: lib/News.php:78 +msgid "Missing channel id." +msgstr "Kanava id puuttuu." + +#: lib/Jonah.php:249 +msgid "My Content" +msgstr "Oma sisältö" + +#: lib/Block/delivery_email.php:93 lib/Delivery/email.php:212 +#: lists/index.php:123 delivery/email.php:81 delivery/index.php:53 +#: channels/index.php:92 +msgid "Name" +msgstr "Nimi" + +#: lib/Block/news.php:85 stories/index.php:104 +msgid "New Story" +msgstr "Uusi artikkeli" + +#: channels/index.php:88 +msgid "New channel" +msgstr "Uusi kanava" + +#: lists/index.php:104 +msgid "New recipient" +msgstr "Uusi vastaanottaja" + +#: lib/api.php:46 config/prefs.php.dist:10 +msgid "News" +msgstr "Uutiset" + +#: lib/Jonah.php:259 channels/index.php:97 +msgid "News Admin" +msgstr "Uutisten ylläpitäjä" + +#: lib/Block/delivery_email.php:40 +msgid "News Channel" +msgstr "Uutiskanava" + +#: lib/Block/news.php:38 +msgid "News Source" +msgstr "Uutislähde" + +#: lib/Block/delivery_email.php:3 +msgid "News by Email" +msgstr "Uutiset sähköpostitse" + +#: lib/Block/delivery.php:3 +msgid "News delivery" +msgstr "Uutisjakelu" + +#: lists/index.php:37 channels/index.php:23 +msgid "News is not enabled." +msgstr "Uutiset eivät ole päällä." + +#: delivery/index.php:49 channels/index.php:82 +msgid "No Data" +msgstr "Ei tietoa" + +#: channels/index.php:36 +msgid "No available channels." +msgstr "Ei kanavia saatavilla." + +#: stories/index.php:48 +msgid "No available stories." +msgstr "Ei artikkeleita saatavilla." + +#: stories/index.php:21 lists/index.php:23 +msgid "No channel requested." +msgstr "Ei pyydettyä kanavaa." + +#: lib/Block/news.php:94 +msgid "No channel specified." +msgstr "Ei määriteltyä kanavaa." + +#: lib/Block/delivery_email.php:70 +msgid "No channels available." +msgstr "Ainuttakaan kanavaa ei ole saatavilla." + +#: lists/index.php:77 +msgid "No recipients." +msgstr "Ei vastaanottajia." + +#: lib/News.php:516 +msgid "No stories are currently available." +msgstr "Artikkeleita ei ole saatavilla." + +#: lib/Delivery.php:223 +#, php-format +msgid "No such action '%s' found" +msgstr "Toimintoa '%s' ei löytynyt" + +#: lib/News.php:636 +#, php-format +msgid "No such backend '%s' found" +msgstr "Taustajärjestelmää '%s' ei löytynyt" + +#: stories/delete.php:35 +msgid "No valid story requested for deletion." +msgstr "Poistettavaa artikkelia ei ole olemassa." + +#: stories/share.php:26 +msgid "Note" +msgstr "Muistiinpano" + +#: stories/edit.php:67 +msgid "" +"Note: this story won't get delivered to distribution lists automatically if " +"this time is in the future." +msgstr "" +"Huomaa: Tätä artikkelia ei jaeta jakelulistalle automaattisesti, jos tämä " +"aika on tulevaisuudessa." + +#: config/prefs.php.dist:16 +msgid "Other Options" +msgstr "Muut asetukset" + +#: channels/delete.php:20 +msgid "Permission Denied." +msgstr "Käyttö kielletty." + +#: lib/News.php:579 +msgid "Plaintext Version of Story" +msgstr "Artikkeli tekstimuodossa." + +#: templates/stories/index.html:32 +msgid "Read" +msgstr "Lue" + +#: channels/delete.php:52 +msgid "Really delete this News Channel?" +msgstr "Poistetaanko uutiskanava?" + +#: stories/delete.php:53 +msgid "Really delete this News Story?" +msgstr "Poistetaanko uutisartikkeli?" + +#: lists/index.php:123 +msgid "Recipient" +msgstr "Vastaanottaja" + +#: lists/edit.php:85 +msgid "Recipient saved." +msgstr "Vastaanottaja talletettu." + +#: lists/delete.php:52 +msgid "Recipient successfully removed." +msgstr "Vastaanottajan poistaminen onnistui." + +#: stories/share.php:102 +msgid "Recipients" +msgstr "Vastaanottajat" + +#: channels/index.php:76 +msgid "Refresh channel" +msgstr "Päivitä kanava" + +#: stories/edit.php:67 +msgid "Release Date" +msgstr "Julkaisupäivämäärä" + +#: stories/edit.php:66 +msgid "Release?" +msgstr "Julkaise?" + +#: stories/index.php:115 +msgid "Released" +msgstr "Julkaistu" + +#: lists/delete.php:54 +msgid "Removal of recipient failed." +msgstr "Vastaanottajan poistaminen epäonnistui." + +#: channels/aggregate.php:24 +#, php-format +msgid "Remove channel \"%s\"" +msgstr "Poista kanava \"%s\"" + +#: delivery/email.php:41 +msgid "Request confirmed." +msgstr "Pyyntö varmistettu." + +#: lib/Delivery/email.php:71 +#, php-format +msgid "Request to receive news channel \"%s\"" +msgstr "Pyyntö vastaanottaa uutiskanavaa \"%s\"" + +#: lib/Delivery/email.php:76 +#, php-format +msgid "Request to stop receiving news channel \"%s\"" +msgstr "Pyyntö lopettaa uutiskanava \"%s\" vastaanotto" + +#: lib/Jonah.php:202 +msgid "Rich Text" +msgstr "Rich Text" + +#: lib/Block/delivery_email.php:79 stories/edit.php:61 lists/edit.php:51 +#: delivery/email.php:64 +msgid "Save" +msgstr "Talleta" + +#: templates/subscribe/edit.inc:19 +msgid "Save Changes" +msgstr "Talleta muutokset" + +#: templates/delivery/html.html:14 +msgid "Select a format:" +msgstr "Valitse muoto:" + +#: stories/share.php:98 +msgid "Send" +msgstr "Lähetä" + +#: stories/share.php:102 +msgid "Separate multiple email addresses with commas." +msgstr "Erota sähköpostiosoitteet toisistaan pilkuilla." + +#: stories/share.php:96 +msgid "Share Story" +msgstr "Jaa artikkeli" + +#: stories/view.php:43 +msgid "Share this story" +msgstr "Jaa tämä artikkeli" + +#: stories/edit.php:65 +msgid "Short Description" +msgstr "Lyhyt kuvaus" + +#: lib/Form/EditChannel.php:72 channels/aggregate.php:57 +msgid "Source URL" +msgstr "Lähde URL" + +#: lib/Form/EditChannel.php:87 +msgid "Source URLs" +msgstr "Lähde URL:t" + +#: config/templates.php.dist:26 +msgid "Standard" +msgstr "Standardi" + +#: stories/index.php:115 +msgid "Story" +msgstr "Artikkeli" + +#: stories/share.php:127 +msgid "Story Link" +msgstr "Artikkelilinkki" + +#: stories/edit.php:64 +msgid "Story Title (Headline)" +msgstr "Artikkelin nimi (Otsikko)" + +#: stories/edit.php:96 +msgid "Story URL" +msgstr "Artikkelin URL" + +#: lib/News/sql.php:343 +#, php-format +msgid "Story URL '%s' not found." +msgstr "Artikkeli URL '%s' ei löytynyt." + +#: lib/Form/EditChannel.php:65 lib/Form/EditChannel.php:99 +#, php-format +msgid "" +"Story URL if not the default one. %c gets replaced by the channel ID, %s by " +"the story ID." +msgstr "" +"Artikkelin URL, jos ei ole sama kuin oletus. %c korvautuu kanavan ID:llä, %s " +"artikkelin ID:llä." + +#: stories/edit.php:69 +msgid "Story body type" +msgstr "Artikkelin body-tyyppi" + +#: stories/edit.php:31 +#, php-format +msgid "Story editing failed: %s" +msgstr "Artikkelin muokkaus epäonnistui: %s" + +#: stories/delete.php:72 +msgid "Story has not been deleted." +msgstr "Artikkeli on poistettu." + +#: lib/News/sql.php:319 +#, php-format +msgid "Story id '%s' not found." +msgstr "Artikkelia id '%s' ei löytynyt." + +#: stories/share.php:103 +msgid "Subject" +msgstr "Otsikko" + +#: subscribe.php:122 templates/subscribe/subscribe.inc:40 +msgid "Subscribe" +msgstr "Tilaa" + +#: content.php:53 +#, php-format +msgid "" +"Subscribed channel '%s' is no longer available, it will be removed from your " +"subscriptions." +msgstr "" +"Tilattua kanavaa '%s' ei ole enää saatavilla, kanavan tilaustiedot " +"tilaustiedoistasi." + +#: templates/subscribe/column_headers.inc:11 +msgid "Subscription" +msgstr "Tilaus" + +#: lib/News.php:283 +#, php-format +msgid "Successfully delivered to the %s distribution list." +msgstr "Lähetettiin onnistuneesta %s jakelulistalle." + +#: lib/Jonah.php:210 +msgid "Text" +msgstr "Teksti" + +#: channels/aggregate.php:93 +#, php-format +msgid "The channel \"%s\" has been removed." +msgstr "Kanava \"%s\" on poistettu." + +#: channels/aggregate.php:74 +#, php-format +msgid "The channel \"%s\" has been saved." +msgstr "Kanava \"%s\" on talletettu." + +#: channels/aggregate.php:82 channels/aggregate.php:100 +#, php-format +msgid "The channel \"%s\" has been updated." +msgstr "Kanava \"%s\" on päivitetty." + +#: channels/edit.php:72 +#, php-format +msgid "The channel '%s' has been saved." +msgstr "Kanava '%s' on talletettu." + +#: channels/delete.php:69 +msgid "The channel has been deleted." +msgstr "Kanava on poistettu." + +#: stories/share.php:104 +msgid "The complete text of the story" +msgstr "Artikkelin teksti kokonaisuudessaan" + +#: lib/Form/EditChannel.php:81 +msgid "" +"The interval before stories aggregated into this channel are rechecked for " +"updates. If none, then stories will always be refetched from the sources." +msgstr "" +"Aikaväli, jonka jälkeen tarkistaan onko tälle kanavalle liitetyissä " +"artikkeleissa tapahtunut päivityksiä. Jos ei ole, niin artikkelit haetaan " +"joka kerta uudestaan uutislähteistä." + +#: lib/Form/EditChannel.php:70 +msgid "" +"The interval before stories in this channel are rechecked for updates. If " +"none, then stories will always be refetched from the source." +msgstr "" +"Kuinka usein tarkistetaan onko kanavan artikkeleita päivitetty. Jos valinta " +"on ei kertaakaan, niin artikkelit haetaan joka kerta uutislähteestä." + +#: stories/edit.php:105 +#, php-format +msgid "The story \"%s\" has been saved." +msgstr "Artikkeli \"%s\" on talletettu." + +#: stories/delete.php:64 +msgid "The story has been deleted." +msgstr "Artikkeli on poistettu." + +#: stories/share.php:138 +msgid "The story was sent successfully." +msgstr "Artikkelin lähetys onnistui." + +#: lib/Form/EditChannel.php:72 channels/aggregate.php:57 +msgid "" +"The url to use to fetch the stories, for example 'http://www.example.com/" +"stories.rss'" +msgstr "" +"URL, josta haetaan artikkeleita, esimerkiksi: 'http://www.example.com/" +"stories.rss'" + +#: channels/delete.php:67 +#, php-format +msgid "There was an error deleting the channel: %s" +msgstr "Tapahtui virhe poistettaessa kanavaa: %s" + +#: stories/delete.php:62 +#, php-format +msgid "There was an error deleting the story: %s" +msgstr "Tapahtui virhe poistettaessa artikkelia: %s" + +#: channels/aggregate.php:91 +#, php-format +msgid "There was an error removing the channel: %s" +msgstr "Tapahtui virhe poistettaessa kanavaa: %s" + +#: channels/edit.php:70 +#, php-format +msgid "There was an error saving the channel. %s" +msgstr "Tapahtui virhe talletettaessa kanavaa. %s" + +#: channels/aggregate.php:72 +#, php-format +msgid "There was an error saving the channel: %s" +msgstr "Tapahtui virhe talletettaessa kanavaa. %s" + +#: stories/edit.php:103 +#, php-format +msgid "There was an error saving the story: %s" +msgstr "Tapahtui virhe talletettaessa artikkelia: %s" + +#: channels/aggregate.php:80 channels/aggregate.php:98 +#, php-format +msgid "There was an error updating the channel: %s" +msgstr "Tapahtui virhe päivitettäessä kanavaa: %s" + +#: lib/Delivery/email.php:196 +msgid "" +"This driver allows the delivery of news stories via email to one or more " +"recipients." +msgstr "" +"Tämä ajuri mahdillistaa uutisartikkeleiden jakamisen sähköpostitse yhdelle " +"tai useammalle vastaanottajalle." + +#: channels/aggregate.php:41 +msgid "This is no aggregated channel." +msgstr "Tämä ei ole yhdistelty kanava." + +#: lib/Form/EditChannel.php:37 channels/index.php:92 +msgid "Type" +msgstr "Tyyppi" + +#: config/templates.php.dist:54 +msgid "Ultracompact" +msgstr "Ultrapieni" + +#: delivery/email.php:39 +#, php-format +msgid "Unable to confirm request." +msgstr "Pyyntöä ei pystytty varmistamaan." + +#: stories/share.php:136 +#, php-format +msgid "Unable to send story: %s" +msgstr "Artikkelia ei voitu lähettää: %s" + +#: templates/subscribe/edit.inc:20 +msgid "Undo Changes" +msgstr "Peru muutokset" + +#: subscribe.php:118 templates/subscribe/subscribe.inc:36 +msgid "Unsubscribe" +msgstr "Lopeta tilaus" + +#: channels/aggregate.php:105 +msgid "Update" +msgstr "Päivitä" + +#: stories/index.php:115 +msgid "Updated" +msgstr "Päivitetty" + +#: templates/subscribe/edit.inc:9 lib/Block/news.php:49 +msgid "View" +msgstr "Näytä" + +#: delivery/email.php:65 +msgid "What do you want to do?" +msgstr "Mitä haluat tehdä?" + +#: stories/delete.php:20 stories/edit.php:39 stories/index.php:29 +#: lists/edit.php:41 lists/index.php:31 lists/delete.php:45 +#: channels/edit.php:43 channels/index.php:17 channels/aggregate.php:48 +msgid "You are not authorised for this action." +msgstr "Sinulla ei ole oikeuksia suorittaa tätä toimenpidettä." + +#: channels/edit.php:74 +msgid "You can now edit the sub-channels." +msgstr "Voit nyt muokata alikanavia." + +#: subscribe.php:84 +#, php-format +msgid "You have edited your subscription to the channel '%s'." +msgstr "Olet muokannut tilaustietojasi kanavalle '%s'." + +#: templates/content/content.html:28 +msgid "You have no news subscriptions." +msgstr "Sinulla ei ole uutistilauksia." + +#: lib/Delivery/email.php:74 +#, php-format +msgid "" +"You have requested to receive \"%s\" stories by email. Click on this link to " +"confirm the request: %s" +msgstr "" +"Olet pyytänyt saada \"%s\" artikkeli sähköpostitse. Napsauta tätä linkkiä " +"vahvistaaksesi: %s" + +#: lib/Delivery/email.php:77 +#, php-format +msgid "" +"You have requested to stop receiving \"%s\" stories by email. Click on this " +"link to confirm the request: %s" +msgstr "" +"Olet pyytänyt lopettamaan \"%s\" artikkeleiden saapumista sähköpostitse " +"Napsauta tätä linkkiä vahvistaaksesi: %s" + +#: subscribe.php:39 +#, php-format +msgid "You have subscribed to the channel '%s'." +msgstr "Olet tilannut kanavan '%s'." + +#: subscribe.php:62 +#, php-format +msgid "You have unsubscribed from the channel '%s'." +msgstr "Olet lopettanut tilauksen kanavaan '%s'." + +#: lib/Delivery.php:282 +msgid "You must configure a Horde Datatree backend to use Jonah." +msgstr "" +"Sinun pitää asentaa Horde Datatree taustajärjestelmä ennen kuin voit käyttää " +"Jonah:ia." + +#: config/prefs.php.dist:9 +msgid "Your Content" +msgstr "Oma sisältö" + +#: lib/News.php:403 +msgid "[No title]" +msgstr "[Ei otsikkoa]" + +#: lib/News.php:415 +msgid "none" +msgstr "ei mitään" diff --git a/jonah/po/fr_FR.po b/jonah/po/fr_FR.po new file mode 100644 index 000000000..8816e73f2 --- /dev/null +++ b/jonah/po/fr_FR.po @@ -0,0 +1,258 @@ +# Jonah 3.1 French Translation. +# Copyright 2002-2009 The Horde Project. +# Eric Rostetter , 2002. +# +msgid "" +msgstr "" +"Project-Id-Version: Jonah 0.0.3-cvs\n" +"POT-Creation-Date: 2002-09-09 23:48-0500\n" +"PO-Revision-Date: 2002-09-09 23:48-0500\n" +"Last-Translator: Eric Rostetter \n" +"Language-Team: French \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#, c-format +msgid "%d Headlines Available" +msgstr "" + +msgid "Admin Home" +msgstr "" + +msgid "Ascending" +msgstr "Croissant" + +msgid "Change the location for which weather is obtained." +msgstr "Changez l'endroit pour lequel le temps est obtenu." + +msgid "Change your content display options." +msgstr "Changer les préférences de son contenu." + +msgid "Change" +msgstr "Modifier" + +msgid "Channel Listing" +msgstr "Liste de canal" + +msgid "Channel Name" +msgstr "Nom de canal" + +msgid "Channel Subscriptions" +msgstr "Abonnements de canal" + +msgid "Channel display failed." +msgstr "L'affichage de canal a échoué" + +msgid "Channel subscription editing failed." +msgstr "L'édition de l'abonnement de canal a échoué." + +msgid "Channel subscription failed." +msgstr "L'abonnement de canal a échoué" + +msgid "Channel unsubscription failed." +msgstr "L'unsubscription de canal a échoué" + +msgid "Choose which news channels you are subscribed to." +msgstr "Choisissez au lequel on souscrit des canaux vous." + +msgid "Default sorting direction:" +msgstr "Ordre de tru par défaut" + +msgid "Descending" +msgstr "Décroissant" + +msgid "Detail" +msgstr "Détail" + +msgid "Display Options" +msgstr "Options d'affichage" + +msgid "Edit Channel Subscriptions" +msgstr "Éditez vos abonnements de canal" + +msgid "Edit Subscription Details" +msgstr "Éditez vos détails d'abonnement de canal" + +msgid "Edit your news subscriptions" +msgstr "Éditez vos abonnements de nouvelles" + +msgid "Edit" +msgstr "Éditer" + +#, c-format +msgid "Editing Channel %s" +msgstr "Éditez le canal %s" + +msgid "Enter NASDAQ/AMEX/NYSE ticker symbols to watch, separated with commas:" +msgstr "" +"Écrivez les symboles de ticker de Nasdaq/AMEX/NYSE pour observer, séparé " +"avec des virgules:" + +msgid "Headlines Update" +msgstr "Mettez à jour les canaux" + +msgid "Help" +msgstr "Aide" + +msgid "How many columns would you like to use to show headlines?" +msgstr "Combien de colonnes aimez-vous employer pour montrer des canaux?" + +msgid "Jonah Backend" +msgstr "Jonah Interface" + +msgid "Jonah is not properly configured" +msgstr "Jonah n'est pas configuré correctement" + +msgid "Just Fetch latest RSS files" +msgstr "Recherchez seulement les derniers fichiers de RSS." + +msgid "Just Generate HTML from RSS files" +msgstr "Produisez seulement du HTML aux fichiers de RSS." + +msgid "Language" +msgstr "Langue" + +msgid "Last Updated" +msgstr "Mis à jour" + +msgid "Location for which to retrieve weather information." +msgstr "L'endroit pour que lequel recherche l'information de temps." + +msgid "My Content" +msgstr "Mon contenu" + +msgid "News" +msgstr "Nouvelles" + +msgid "Options" +msgstr "Options" + +msgid "Other Options" +msgstr "Autres Options" + +msgid "Problem?" +msgstr "Problème?" + +msgid "Radar" +msgstr "Radar" + +msgid "Save Changes" +msgstr "Enregistrer modifications" + +msgid "Select your preferred language:" +msgstr "Définir votre langue préférée:" + +msgid "Set the your preferred display language." +msgstr "Affecter la langue utilisée pour l'affichage." + +msgid "Set which stock ticker symbols to watch." +msgstr "Indiquez quels symboles de ticker courant à observer." + +msgid "Show Dow Jones Industrial Average (INDU)?" +msgstr "Montrez Dow Jones Industrial Average (INDU)?" + +msgid "Show S&P 500 (SPX)?" +msgstr "Montrez S&P 500 (SPX)?" + +msgid "Show headlines in Horde summary?" +msgstr "Montrez les canaux dans le sommaire de Horde?" + +msgid "Show headlines in channels display?" +msgstr "Montrez les citations courantes dans l'affichage de canal?" + +msgid "Show stock quotes in Horde summary?" +msgstr "Montrez les citations courantes dans le sommaire de Horde?" + +msgid "Show stock quotes in channels display?" +msgstr "Montrez les citations courantes dans l'affichage de canal?" + +msgid "Show weather and stock quotes on same row in two columns?" +msgstr "" +"Montrez les citations de temps et des marché des actions sur la même ligne " +"dans deux colonnes?" + +msgid "Show weather in Horde summary?" +msgstr "Montrez le temps dans le sommaire de Horde?" + +msgid "Show weather in channels display?" +msgstr "Montrez le temps dans l'affichage de canal?" + +msgid "Some of Jonah's configuration files are missing:" +msgstr "Certains fichiers de configuration sont absents:" + +msgid "Sort Direction" +msgstr "Sens du tri" + +msgid "Sort by Channel Name" +msgstr "Sorte par le nom de canal" + +msgid "Sort by Subscription Status" +msgstr "Sorte par statut d'abonnement" + +msgid "Sort by Update Date" +msgstr "Sorte par la date de mise à jour" + +msgid "Stock Quote" +msgstr "" + +msgid "Stocks" +msgstr "" + +msgid "Subscribe" +msgstr "Souscrivez" + +msgid "This file contains preferences for Jonah." +msgstr "Ce fichier contrôle les préférences pour Jonah" + +msgid "" +"This file defines all of the headline channels that you wish Jonah to " +"display." +msgstr "" +"Ce fichier définit tous les canaux que vous souhaitez Jonah pour montrer." + +msgid "" +"This is the main Jonah configuration file. It contains options for all Jonah " +"scripts." +msgstr "" +"Ceci est le principal fichier de configuration. Il contient toutes lesles " +"options des scripts." + +msgid "Undo Changes" +msgstr "Défaites les changements." + +msgid "Unsubscribe" +msgstr "" + +msgid "Update All Channels" +msgstr "Mettez à jour tous les canaux." + +msgid "Update" +msgstr "Mettez à jour" + +msgid "User Options" +msgstr "Options personnelles" + +msgid "Weather Station" +msgstr "" + +msgid "Weather station:" +msgstr "Station météorologique." + +msgid "You have edited your subscription to the channel " +msgstr "Vous avez édité votre abonnement au canal." + +msgid "You have subscribed to the channel " +msgstr "Vous avez souscrit au canal." + +msgid "You have unsubscribed to the channel " +msgstr "" + +msgid "Your Content" +msgstr "Votre contenu" + +msgid "Your Information" +msgstr "Vos données personnelles" + +msgid "no headlines available at this time" +msgstr "aucuns canaux disponibles actuellement" diff --git a/jonah/po/jonah.pot b/jonah/po/jonah.pot new file mode 100644 index 000000000..9996a3682 --- /dev/null +++ b/jonah/po/jonah.pot @@ -0,0 +1,820 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright YEAR Horde Project +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: dev@lists.horde.org\n" +"POT-Creation-Date: 2008-08-01 10:44+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: lib/Block/news_popular.php:75 lib/Block/news_popular.php:78 +msgid " - Most read stories" +msgstr "" + +#: lib/Block/delivery.php:48 +#, php-format +msgid "\"%s\" stories in HTML" +msgstr "" + +#: lib/News.php:461 +msgid "1 hour" +msgstr "" + +#: lib/News.php:465 +msgid "12 hours" +msgstr "" + +#: lib/News.php:462 +msgid "2 hours" +msgstr "" + +#: lib/News.php:466 +msgid "24 hours" +msgstr "" + +#: lib/News.php:460 +msgid "30 mins" +msgstr "" + +#: lib/News.php:463 +msgid "4 hours" +msgstr "" + +#: lib/News.php:464 +msgid "8 hours" +msgstr "" + +#: stories/share.php:86 +msgid "A link to the story" +msgstr "" + +#: channels/aggregate.php:59 +msgid "Add" +msgstr "" + +#: content.php:37 +msgid "Add Content" +msgstr "" + +#: lib/Forms/Story.php:37 +msgid "Add New Story" +msgstr "" + +#: channels/index.php:65 +msgid "Add story" +msgstr "" + +#: lib/api.php:118 +msgid "Administrator" +msgstr "" + +#: lib/News.php:499 lib/Jonah.php:113 +msgid "Aggregated Feed" +msgstr "" + +#: channels/aggregate.php:58 +#, php-format +msgid "Aggregated channels for channel \"%s\"" +msgstr "" + +#: channels/delete.php:56 +msgid "All stories created in this channel will be lost!" +msgstr "" + +#: stories/results.php:114 +#, php-format +msgid "All stories tagged with %s" +msgstr "" + +#: channels/index.php:35 +#, php-format +msgid "An error occurred fetching channels: %s" +msgstr "" + +#: channels/delete.php:58 +msgid "Any cached stories for this channel will be lost!" +msgstr "" + +#: lib/Forms/Feed.php:83 lib/Forms/Feed.php:94 +msgid "Caching" +msgstr "" + +#: stories/pdf.php:44 +msgid "Cannot generate PDFs of remote stories." +msgstr "" + +#: lib/News/sql.php:510 +#, php-format +msgid "Channel \"%s\" not found." +msgstr "" + +#: channels/aggregate.php:61 +msgid "Channel Name" +msgstr "" + +#: lib/Forms/Feed.php:77 +msgid "" +"Channel URL for further pages, if not the default one. %c gets replaced by " +"the feed ID, %n by the story offset." +msgstr "" + +#: lib/Forms/Feed.php:112 +msgid "" +"Channel URL if not the default one. %c gets replaced by the feed ID, %n by " +"the story offset." +msgstr "" + +#: lib/Forms/Feed.php:76 +#, php-format +msgid "Channel URL if not the default one. %c gets replaced by the feed ID." +msgstr "" + +#: channels/delete.php:76 +msgid "Channel has not been deleted." +msgstr "" + +#: lib/News/sql.php:174 +#, php-format +msgid "Channel id \"%s\" not found." +msgstr "" + +#: stories/index.php:54 +msgid "Channel refreshed." +msgstr "" + +#: templates/channels/index.html:13 +msgid "Close Search" +msgstr "" + +#: templates/stories/index.html:27 +msgid "Comments" +msgstr "" + +#: config/templates.php.dist:42 +msgid "Compact" +msgstr "" + +#: lib/News.php:502 lib/Jonah.php:116 +msgid "Composite Feed" +msgstr "" + +#: lib/Forms/Feed.php:114 +msgid "Composite feeds" +msgstr "" + +#: lib/Jonah.php:62 +#, php-format +msgid "Could not open %s." +msgstr "" + +#: lib/Block/latest.php:49 +msgid "Count reads of the latest story when this block is displayed" +msgstr "" + +#: lib/Block/story.php:49 +msgid "Count reads of this story when this block is displayed" +msgstr "" + +#: stories/index.php:124 stories/results.php:116 +msgid "Date" +msgstr "" + +#: stories/delete.php:61 stories/delete.php:66 channels/delete.php:51 +#: channels/delete.php:62 +msgid "Delete" +msgstr "" + +#: channels/delete.php:48 +#, php-format +msgid "Delete News Channel \"%s\"?" +msgstr "" + +#: stories/delete.php:57 +#, php-format +msgid "Delete News Story \"%s\"?" +msgstr "" + +#: channels/index.php:49 +msgid "Delete channel" +msgstr "" + +#: stories/index.php:100 stories/results.php:94 +msgid "Delete story" +msgstr "" + +#: lib/Forms/Feed.php:75 lib/Forms/Feed.php:93 lib/Forms/Feed.php:111 +msgid "Description" +msgstr "" + +#: stories/delete.php:61 channels/delete.php:51 +msgid "Do not delete" +msgstr "" + +#: lib/Forms/Feed.php:40 +msgid "Edit Feed" +msgstr "" + +#: lib/Forms/Story.php:37 +msgid "Edit Story" +msgstr "" + +#: lib/Forms/Feed.php:100 +msgid "Edit aggregated feeds" +msgstr "" + +#: channels/index.php:44 +msgid "Edit channel" +msgstr "" + +#: channels/aggregate.php:25 +#, php-format +msgid "Edit channel \"%s\"" +msgstr "" + +#: stories/index.php:94 stories/results.php:87 +msgid "Edit story" +msgstr "" + +#: lib/News.php:541 +#, php-format +msgid "Error fetching feed: %s" +msgstr "" + +#: stories/share.php:66 stories/pdf.php:15 stories/view.php:25 +#: stories/view.php:35 lib/Block/latest.php:91 lib/Block/story.php:91 +#, php-format +msgid "Error fetching story: %s" +msgstr "" + +#: lib/News.php:780 +#, php-format +msgid "Error parsing external feed from %s: %s" +msgstr "" + +#: lib/api.php:109 +msgid "External Channels" +msgstr "" + +#: lib/News.php:493 lib/Jonah.php:110 +msgid "External Feed" +msgstr "" + +#: lib/Forms/Feed.php:51 +msgid "Extra information for this feed type" +msgstr "" + +#: lib/Block/news_popular.php:32 lib/Block/news.php:3 lib/Block/news.php:30 +#: lib/Block/story.php:42 +msgid "Feed" +msgstr "" + +#: lib/News.php:105 +#, php-format +msgid "Feed \"%s\" is not authored on this system." +msgstr "" + +#: channels/edit.php:56 +msgid "Feed type changed." +msgstr "" + +#: channels/index.php:93 lib/Block/delivery.php:3 lib/Block/delivery.php:25 +msgid "Feeds" +msgstr "" + +#: lib/Block/news.php:54 +msgid "First Story" +msgstr "" + +#: stories/share.php:78 +msgid "From" +msgstr "" + +#: lib/Forms/Story.php:74 lib/Forms/Story.php:76 +msgid "Full Story Text" +msgstr "" + +#: delivery/html.php:39 +#, php-format +msgid "HTML Delivery for \"%s\"" +msgstr "" + +#: lib/News.php:680 +msgid "HTML Version of Story" +msgstr "" + +#: lib/Forms/Story.php:82 +msgid "" +"If you enter a URL without a full story text, clicking on the story will " +"send the reader straight to the URL, otherwise it will be shown at the end " +"of the full story." +msgstr "" + +#: channels/aggregate.php:64 lib/Forms/Feed.php:87 +msgid "Image" +msgstr "" + +#: stories/share.php:86 +msgid "Include" +msgstr "" + +#: config/templates.php.dist:31 +msgid "Internal" +msgstr "" + +#: lib/api.php:91 +msgid "Internal Channels" +msgstr "" + +#: stories/index.php:43 stories/results.php:49 +#, php-format +msgid "Invalid channel requested. %s" +msgstr "" + +#: channels/delete.php:30 +msgid "Invalid channel specified for deletion." +msgstr "" + +#: delivery/html.php:33 +msgid "Invalid channel." +msgstr "" + +#: channels/index.php:87 +msgid "Last Update" +msgstr "" + +#: lib/Block/latest.php:3 lib/Block/latest.php:65 +msgid "Latest News" +msgstr "" + +#: channels/aggregate.php:63 lib/Forms/Feed.php:86 +msgid "Link" +msgstr "" + +#: lib/News.php:496 lib/Jonah.php:107 +msgid "Local Feed" +msgstr "" + +#: channels/index.php:84 +msgid "Manage Feeds" +msgstr "" + +#: lib/Block/news_popular.php:52 lib/Block/news.php:49 +msgid "Maximum Stories" +msgstr "" + +#: config/templates.php.dist:20 +msgid "Media" +msgstr "" + +#: lib/Block/tree_menu.php:3 +msgid "Menu List" +msgstr "" + +#: stories/share.php:87 +msgid "Message" +msgstr "" + +#: lib/News.php:66 +msgid "Missing channel id." +msgstr "" + +#: lib/Block/news_popular.php:3 +msgid "Most Popular Stories" +msgstr "" + +#: content.php:34 templates/content/header.inc:2 +msgid "My News" +msgstr "" + +#: content_edit.php:33 +msgid "My News :: Add Content" +msgstr "" + +#: channels/index.php:85 lib/Forms/Feed.php:50 +msgid "Name" +msgstr "" + +#: lib/Jonah.php:245 lib/Forms/Feed.php:40 +msgid "New Feed" +msgstr "" + +#: lib/api.php:90 lib/api.php:108 +msgid "News" +msgstr "" + +#: lib/Block/latest.php:33 +msgid "News Source" +msgstr "" + +#: channels/index.php:25 +msgid "News is not enabled." +msgstr "" + +#: stories/index.php:51 stories/results.php:57 +msgid "No available stories." +msgstr "" + +#: stories/index.php:23 +msgid "No channel requested." +msgstr "" + +#: lib/Block/latest.php:86 +msgid "No channel specified." +msgstr "" + +#: templates/channels/index.html:55 +msgid "No channels are available." +msgstr "" + +#: lib/Block/news_popular.php:91 lib/Block/news.php:92 +msgid "No feed specified." +msgstr "" + +#: lib/Block/delivery.php:68 +msgid "No feeds are available." +msgstr "" + +#: templates/channels/index.html:51 +msgid "No feeds match" +msgstr "" + +#: lib/News.php:571 +msgid "No stories are currently available." +msgstr "" + +#: lib/Block/story.php:86 +msgid "No story is selected." +msgstr "" + +#: lib/News.php:730 +#, php-format +msgid "No such backend \"%s\" found" +msgstr "" + +#: stories/results.php:40 +msgid "No tag requested." +msgstr "" + +#: stories/delete.php:46 +msgid "No valid story requested for deletion." +msgstr "" + +#: stories/share.php:25 +msgid "Note" +msgstr "" + +#: lib/Forms/Story.php:58 +msgid "" +"Note: this story won't be delivered to distribution lists automatically if " +"this time is in the future." +msgstr "" + +#: lib/Forms/Story.php:55 +msgid "Or publish on this date:" +msgstr "" + +#: stories/index.php:89 stories/results.php:81 +msgid "PDF version" +msgstr "" + +#: scripts/feed_tester.php:57 +msgid "Parse failed:" +msgstr "" + +#: scripts/feed_tester.php:60 +msgid "Parse succeeded, structure is:" +msgstr "" + +#: lib/News.php:675 +msgid "Plaintext Version of Story" +msgstr "" + +#: lib/Forms/Story.php:45 +msgid "Publish Now?" +msgstr "" + +#: lib/Block/delivery.php:59 +#, php-format +msgid "RSS Feed of \"%s\"" +msgstr "" + +#: templates/stories/index.html:22 +msgid "Read" +msgstr "" + +#: channels/delete.php:54 +msgid "Really delete this News Channel?" +msgstr "" + +#: stories/delete.php:64 +msgid "Really delete this News Story?" +msgstr "" + +#: stories/index.php:123 +msgid "Refresh Channel" +msgstr "" + +#: channels/index.php:73 +msgid "Refresh channel" +msgstr "" + +#: channels/aggregate.php:26 +#, php-format +msgid "Remove channel \"%s\"" +msgstr "" + +#: lib/Block/cloud.php:28 +msgid "Results URL" +msgstr "" + +#: lib/Jonah.php:193 +msgid "Rich Text" +msgstr "" + +#: lib/Forms/Story.php:39 +msgid "Save" +msgstr "" + +#: channels/index.php:90 templates/channels/index.html:9 +msgid "Search" +msgstr "" + +#: templates/delivery/html.html:13 +msgid "Select a format:" +msgstr "" + +#: stories/share.php:75 +msgid "Send" +msgstr "" + +#: stories/share.php:84 +msgid "Separate multiple email addresses with commas." +msgstr "" + +#: stories/share.php:73 +msgid "Share Story" +msgstr "" + +#: stories/view.php:87 +msgid "Share this story" +msgstr "" + +#: lib/Forms/Story.php:44 +msgid "Short Description" +msgstr "" + +#: channels/aggregate.php:62 lib/Forms/Feed.php:85 +msgid "Source URL" +msgstr "" + +#: lib/Forms/Feed.php:100 +msgid "Source URLs" +msgstr "" + +#: config/templates.php.dist:9 +msgid "Standard" +msgstr "" + +#: delivery/rss.php:58 stories/results.php:112 +#, php-format +msgid "Stories tagged with %s in %s" +msgstr "" + +#: stories/index.php:124 stories/results.php:116 lib/Block/story.php:3 +#: lib/Block/story.php:46 lib/Block/story.php:65 +msgid "Story" +msgstr "" + +#: lib/News.php:751 +#, php-format +msgid "Story \"%s\" not found in \"%s\"." +msgstr "" + +#: stories/share.php:109 +msgid "Story Link" +msgstr "" + +#: lib/Forms/Story.php:43 +msgid "Story Title (Headline)" +msgstr "" + +#: lib/Forms/Story.php:82 +msgid "Story URL" +msgstr "" + +#: lib/News/sql.php:456 +#, php-format +msgid "Story URL \"%s\" not found." +msgstr "" + +#: lib/Forms/Feed.php:78 lib/Forms/Feed.php:113 +#, php-format +msgid "" +"Story URL if not the default one. %c gets replaced by the feed ID, %s by the " +"story ID." +msgstr "" + +#: lib/Forms/Story.php:61 +msgid "Story body type" +msgstr "" + +#: stories/edit.php:33 stories/delete.php:31 +#, php-format +msgid "Story editing failed: %s" +msgstr "" + +#: stories/delete.php:81 +msgid "Story has not been deleted." +msgstr "" + +#: lib/News/sql.php:424 +#, php-format +msgid "Story id \"%s\" not found." +msgstr "" + +#: stories/share.php:85 +msgid "Subject" +msgstr "" + +#: lib/Block/cloud.php:3 lib/Block/cloud.php:35 +msgid "Tag Cloud" +msgstr "" + +#: lib/News.php:838 lib/News.php:843 lib/News.php:848 lib/News.php:854 +#: lib/News.php:859 +msgid "Tag support not enabled in backend." +msgstr "" + +#: lib/Forms/Story.php:79 +msgid "Tags" +msgstr "" + +#: lib/Block/story.php:105 templates/stories/story.html:6 +msgid "Tags: " +msgstr "" + +#: lib/Jonah.php:200 +msgid "Text" +msgstr "" + +#: channels/aggregate.php:100 +#, php-format +msgid "The channel \"%s\" has been removed." +msgstr "" + +#: channels/aggregate.php:79 +#, php-format +msgid "The channel \"%s\" has been saved." +msgstr "" + +#: channels/aggregate.php:87 channels/aggregate.php:107 +#, php-format +msgid "The channel \"%s\" has been updated." +msgstr "" + +#: channels/delete.php:69 +msgid "The channel has been deleted." +msgstr "" + +#: stories/share.php:86 +msgid "The complete text of the story" +msgstr "" + +#: channels/edit.php:70 +#, php-format +msgid "The feed \"%s\" has been saved." +msgstr "" + +#: lib/Forms/Feed.php:94 +msgid "" +"The interval before stories aggregated into this feeds are rechecked for " +"updates. If none, then stories will always be refetched from the sources." +msgstr "" + +#: lib/Forms/Feed.php:83 +msgid "" +"The interval before stories in this feed are rechecked for updates. If none, " +"then stories will always be refetched from the source." +msgstr "" + +#: stories/edit.php:61 +#, php-format +msgid "The story \"%s\" has been saved." +msgstr "" + +#: stories/delete.php:73 +msgid "The story has been deleted." +msgstr "" + +#: stories/share.php:120 +msgid "The story was sent successfully." +msgstr "" + +#: channels/aggregate.php:62 lib/Forms/Feed.php:85 +msgid "" +"The url to use to fetch the stories, for example 'http://www.example.com/" +"stories.rss'" +msgstr "" + +#: channels/delete.php:67 +#, php-format +msgid "There was an error deleting the channel: %s" +msgstr "" + +#: stories/delete.php:71 +#, php-format +msgid "There was an error deleting the story: %s" +msgstr "" + +#: channels/aggregate.php:98 +#, php-format +msgid "There was an error removing the channel: %s" +msgstr "" + +#: channels/aggregate.php:77 +#, php-format +msgid "There was an error saving the channel: %s" +msgstr "" + +#: channels/edit.php:68 +#, php-format +msgid "There was an error saving the feed: %s" +msgstr "" + +#: stories/edit.php:59 +#, php-format +msgid "There was an error saving the story: %s" +msgstr "" + +#: channels/aggregate.php:85 channels/aggregate.php:105 +#, php-format +msgid "There was an error updating the channel: %s" +msgstr "" + +#: channels/aggregate.php:46 +msgid "This is no aggregated channel." +msgstr "" + +#: stories/share.php:84 +msgid "To" +msgstr "" + +#: channels/index.php:86 lib/Forms/Feed.php:45 +msgid "Type" +msgstr "" + +#: config/templates.php.dist:53 +msgid "Ultracompact" +msgstr "" + +#: stories/share.php:118 +#, php-format +msgid "Unable to send story: %s" +msgstr "" + +#: channels/aggregate.php:115 +msgid "Update" +msgstr "" + +#: lib/Block/news_popular.php:45 lib/Block/news.php:41 +msgid "View" +msgstr "" + +#: stories/edit.php:41 stories/index.php:31 stories/results.php:24 +#: stories/delete.php:39 channels/edit.php:43 channels/index.php:19 +#: channels/delete.php:38 channels/aggregate.php:53 +msgid "You are not authorised for this action." +msgstr "" + +#: channels/edit.php:72 +msgid "You can now edit the sub-feeds." +msgstr "" + +#: lib/News.php:793 +msgid "[No title]" +msgstr "" + +#: lib/Jonah.php:241 +msgid "_Feeds" +msgstr "" + +#: lib/Jonah.php:237 +msgid "_My News" +msgstr "" + +#: lib/Jonah.php:254 +msgid "_New Story" +msgstr "" + +#: lib/News.php:459 +msgid "none" +msgstr "" diff --git a/jonah/po/nl_NL.po b/jonah/po/nl_NL.po new file mode 100644 index 000000000..105892f09 --- /dev/null +++ b/jonah/po/nl_NL.po @@ -0,0 +1,1051 @@ +# Dutch translation for Jonah +# Copyright 2005-2009 The Horde Project +# This file is distributed under the same license as the Jonah package. +# Resan Sa-Ardnuam , 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: Jonah 0.1-cvs\n" +"Report-Msgid-Bugs-To: dev@lists.horde.org\n" +"POT-Creation-Date: 2005-05-11 11:00+0200\n" +"PO-Revision-Date: 2005-05-20 09:54+0200\n" +"Last-Translator: Resan Sa-Ardnuam \n" +"Language-Team: i18n@lists.horde.org\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: lib/Block/delivery_email.php:59 +#, php-format +msgid "%s by Email" +msgstr "%s via Email" + +#: lists/index.php:118 +#, php-format +msgid "%s to %s of %s" +msgstr "%s tot %s van %s" + +#: delivery/index.php:47 lib/Block/delivery.php:76 +#, php-format +msgid "'%s' stories by email" +msgstr "'%s' artikelen via email" + +#: delivery/index.php:35 lib/Block/delivery.php:59 +#, php-format +msgid "'%s' stories in HTML" +msgstr "'%s' artikelen in HTML" + +#: delivery/index.php:41 lib/Block/delivery.php:68 +#, php-format +msgid "'%s' stories in XML" +msgstr "'%s' artikelen in XML" + +#: lib/News.php:375 +msgid "1 hour" +msgstr "1 uur" + +#: lib/News.php:379 +msgid "12 hours" +msgstr "12 uren" + +#: lib/News.php:376 +msgid "2 hours" +msgstr "2 uren" + +#: lib/News.php:380 +msgid "24 hours" +msgstr "24 uren" + +#: lib/News.php:374 +msgid "30 mins" +msgstr "30 min." + +#: lib/News.php:377 +msgid "4 hours" +msgstr "4 uren" + +#: lib/News.php:378 +msgid "8 hours" +msgstr "8 uren" + +#: delivery/email.php:95 +#, php-format +msgid "" +"A confirmation message has been sent to %s. Click on the link in that " +"message to finally subscribe to channel \"%s\"." +msgstr "" +"Een bevestigings bericht is verzonden naar %s. Klik op de link in dat " +"bericht om uiteindelijk te abonneren op kanaal \"%s\"." + +#: stories/share.php:104 +msgid "A link to the story" +msgstr "Een link naar het artikel" + +#: channels/aggregate.php:54 +msgid "Add" +msgstr "Toevoegen" + +#: lib/Form/EditChannel.php:32 +msgid "Add New Channel" +msgstr "Nieuw kanaal toevoegen" + +#: stories/edit.php:57 +msgid "Add New Story" +msgstr "Nieuw Artikel toevoegen" + +#: stories/view.php:56 +msgid "Add a comment" +msgstr "Commentaar toevoegen" + +#: channels/index.php:68 +msgid "Add story" +msgstr "Artikel toevoegen" + +#: lib/News.php:413 lib/Jonah.php:125 +msgid "Aggregated" +msgstr "Aggregeren" + +#: channels/aggregate.php:53 +#, php-format +msgid "Aggregated channels for channel \"%s\"" +msgstr "Kanalen geaggregeerd voor kanaal \"%s\"" + +#: channels/delete.php:54 +msgid "All stories created in this channel will be lost!" +msgstr "Alle gemaakte artikelen in dit kanaal gaan verloren!" + +#: channels/index.php:33 +#, php-format +msgid "An error occurred fetching channels: %s" +msgstr "Een fout vond plaats bij het binnenhalen van kanalen: %s" + +#: channels/delete.php:56 +msgid "Any cached stories for this channel will be lost!" +msgstr "Ieder artikel in de cache in dit kanaal gaan verloren!" + +#: channels/index.php:91 +msgid "Available Channels" +msgstr "Beschikbare Kanalen" + +#: lib/Block/delivery.php:34 +#, php-format +msgid "Available Channels from %s" +msgstr "Beschikbare Kanalen van %s" + +#: delivery/index.php:29 +#, php-format +msgid "Available Channels from %s (%s)" +msgstr "Beschikbare Kanalen van %s (%s)" + +#: lib/Block/delivery.php:50 +msgid "Available News Channels" +msgstr "Beschikbare Nieuws Kanalen" + +#: lib/Form/EditChannel.php:70 lib/Form/EditChannel.php:81 +msgid "Caching" +msgstr "Caching" + +#: config/prefs.php.dist:18 +msgid "Change your content display options." +msgstr "Verander de opties van de weergave van de inhoud" + +#: lib/Block/delivery_email.php:82 +msgid "Channel" +msgstr "Kanaal" + +#: stories/index.php:125 +#, php-format +msgid "Channel \"%s\"" +msgstr "Kanaal \"%s\"" + +#: lib/News.php:110 +#, php-format +msgid "Channel '%s' is not an internally authored channel." +msgstr "Kanaal '%s' is een niet intern geauthoriseerd kanaal." + +#: content.php:77 +msgid "Channel Listing" +msgstr "Kanaal Inhoud" + +#: lists/index.php:128 +msgid "Channel Lists Admin" +msgstr "Kanaal Lijst Administratie" + +#: templates/subscribe/column_headers.inc:7 channels/aggregate.php:56 +#: lib/Form/EditChannel.php:43 +msgid "Channel Name" +msgstr "Kanaal Naam" + +#: subscribe.php:134 +msgid "Channel Subscriptions" +msgstr "Kanaal Abonnenmenten" + +#: subscribe.php:127 +msgid "Channel display failed." +msgstr "Kanaal weergeven faalde." + +#: channels/delete.php:76 +msgid "Channel has not been deleted." +msgstr "Kanaal is niet verwijderen." + +#: lib/News/sql.php:164 +#, php-format +msgid "Channel id '%s' not found." +msgstr "Kanaal id '%s' niet gevonden." + +#: stories/index.php:51 +msgid "Channel refreshed." +msgstr "Kanaal ververst" + +#: subscribe.php:86 +msgid "Channel subscription editing failed." +msgstr "Wijzigen van Kanaalabonnement is mislukt." + +#: subscribe.php:41 +msgid "Channel subscription failed." +msgstr "Abonneren op kanaal is mislukt." + +#: channels/edit.php:56 +msgid "Channel type changed." +msgstr "Kanaal type is gewijzigd." + +#: subscribe.php:73 +msgid "Channel unsubscription failed." +msgstr "Kanaal opzeggen is mislukt." + +#: config/prefs.php.dist:11 +msgid "Choose which news channels you are subscribed to." +msgstr "Kies op welke nieuws kanalen u geabonneerd bent." + +#: templates/stories/index.html:34 +msgid "Comments" +msgstr "Commentaar" + +#: config/templates.php.dist:40 +msgid "Compact" +msgstr "Compact" + +#: lib/News.php:416 lib/Jonah.php:128 +msgid "Composite" +msgstr "Samengesteld" + +#: lib/Form/EditChannel.php:100 +msgid "Composite channels" +msgstr "Samengestelde Kanalen" + +#: lib/Block/news.php:3 +msgid "Content Channel" +msgstr "Inhoud Kanaal" + +#: lib/News.php:281 +#, php-format +msgid "Could not deliver to the %s distribution list. %s" +msgstr "Kan niet leveren aan de %s distributie lijst. %s" + +#: delivery/index.php:23 +#, php-format +msgid "Could not get channel list. %s" +msgstr "Kan kanaal lijst niet verkrijgen. %s" + +#: lib/Jonah.php:69 +#, php-format +msgid "Could not open %s." +msgstr "Kan %s niet openen." + +#: lists/index.php:107 +msgid "Current Recipients" +msgstr "Huidige Ontvangers" + +#: stories/delete.php:50 stories/delete.php:55 channels/delete.php:49 +#: channels/delete.php:60 +msgid "Delete" +msgstr "Verwijderen" + +#: channels/delete.php:46 +#, php-format +msgid "Delete News Channel \"%s\"?" +msgstr "Verwijder Nieuws Kanaal \"%s\"?" + +#: stories/delete.php:46 +#, php-format +msgid "Delete News Story \"%s\"?" +msgstr "Verwijder Artikel \"%s\"?" + +#: channels/index.php:49 +msgid "Delete channel" +msgstr "Verwijder kanaal" + +#: lists/index.php:80 +msgid "Delete recipient" +msgstr "Verwijder ontvanger" + +#: stories/index.php:86 +msgid "Delete story" +msgstr "Verwijder artikel" + +#: lists/edit.php:56 lists/edit.php:61 lib/Jonah.php:252 +msgid "Delivery" +msgstr "Distributie" + +#: channels/index.php:60 +msgid "Delivery lists" +msgstr "Distributielijst" + +#: lists/edit.php:49 +#, php-format +msgid "Delivery of '%s' stories" +msgstr "Distributie van '%s' artikelen" + +#: lib/Form/EditChannel.php:64 lib/Form/EditChannel.php:80 +#: lib/Form/EditChannel.php:98 +msgid "Description" +msgstr "Omschrijving" + +#: config/templates.php.dist:9 +msgid "Detailed" +msgstr "Gedetaileerd" + +#: config/prefs.php.dist:17 +msgid "Display Options" +msgstr "Weergave Opties" + +#: stories/delete.php:50 channels/delete.php:49 +msgid "Do not delete" +msgstr "Niet verwijderen" + +#: templates/subscribe/subscribe.inc:49 +#: templates/subscribe/column_headers.inc:13 +msgid "Edit" +msgstr "Wijzigen" + +#: lib/Form/EditChannel.php:32 +msgid "Edit Channel" +msgstr "Wijzig Kanaal" + +#: templates/subscribe/header.inc:3 +msgid "Edit Channel Subscriptions" +msgstr "Wijzig Kanaal Abonnementen" + +#: stories/edit.php:57 +msgid "Edit Story" +msgstr "Wijzig Artikel" + +#: templates/subscribe/subscribe.inc:49 +msgid "Edit Subscription Details" +msgstr "Wijzig Abonnement Details" + +#: lib/Form/EditChannel.php:87 +msgid "Edit aggregated channels" +msgstr "Wijzig geaggregeerde kanalen" + +#: channels/index.php:44 +msgid "Edit channel" +msgstr "Wijzig kanaal" + +#: channels/aggregate.php:23 +#, php-format +msgid "Edit channel \"%s\"" +msgstr "Wijzig kanaal \"%s\"" + +#: stories/index.php:81 +msgid "Edit story" +msgstr "Wijzig artikel" + +#: templates/subscribe/edit.inc:5 +#, php-format +msgid "Editing Channel %s" +msgstr "Kanaal %s wijziging" + +#: lib/Delivery/email.php:195 lib/Delivery/email.php:210 +msgid "Email" +msgstr "Email" + +#: delivery/email.php:62 +#, php-format +msgid "Email Delivery for \"%s\"" +msgstr "Email distributie voor \"%s\"" + +#: delivery/email.php:76 lib/Block/delivery_email.php:91 +msgid "Email address" +msgstr "Email adres" + +#: lib/News.php:457 +#, php-format +msgid "Error fetching channel. %s" +msgstr "Fout bij binnenhalen van kanaal. %s" + +#: stories/share.php:83 stories/view.php:23 +#, php-format +msgid "Error fetching story: %s" +msgstr "Fout bij binnenhalen van artikel: %s" + +#: lib/News.php:694 +#, php-format +msgid "Error parsing external channel from %s: %s" +msgstr "Fout in onderzoeken van extern kanaal van %s: %s" + +#: lib/News.php:407 lib/Jonah.php:122 +msgid "External" +msgstr "Extern" + +#: lib/Form/EditChannel.php:44 +msgid "Extra information for this channel type" +msgstr "Extra informatie voor dit kanaal type" + +#: lib/Block/news.php:62 +msgid "First Story" +msgstr "Eerste Artikel" + +#: stories/share.php:101 +msgid "From" +msgstr "Van" + +#: stories/edit.php:89 stories/edit.php:91 +msgid "Full Story Text" +msgstr "Volledig Artikel" + +#: delivery/html.php:35 +#, php-format +msgid "HTML Delivery for '%s'" +msgstr "HTML Distributie voor '%s'" + +#: lib/News.php:549 +msgid "HTML Version of Story" +msgstr "HTML Versie van Artikel" + +#: templates/content/content.html:9 +msgid "Headlines" +msgstr "Onderwerpen" + +#: lib/Delivery/email.php:74 lib/Delivery/email.php:77 +msgid "Hello" +msgstr "Hallo" + +#: config/prefs.php.dist:35 +msgid "How many columns would you like to use to show headlines?" +msgstr "Hoeveel kolommen wilt u zien voor de onderwerpen?" + +#: stories/edit.php:96 +msgid "" +"If you enter a URL without a full story text, clicking on the story will " +"send the reader straight to the URL, otherwise it will be shown at the end " +"of the full story." +msgstr "" +"Als u een URL opgeeft zonder volledige tekst, zal de lezer rechtstreeksnaar " +"de URL worden geleid, anders zal het aan het eind van het volledigeartikel " +"worden getoond." + +#: channels/aggregate.php:59 lib/Form/EditChannel.php:74 +msgid "Image" +msgstr "Afbeelding" + +#: stories/share.php:104 +msgid "Include" +msgstr "Invoegen" + +#: lib/News.php:410 lib/Jonah.php:119 +msgid "Internal" +msgstr "Intern" + +#: lib/api.php:47 +msgid "Internal Channels" +msgstr "Interne Kanalen" + +#: stories/index.php:41 +#, php-format +msgid "Invalid channel requested. %s" +msgstr "Ongeldig verzoek voor kanaal. %s" + +#: channels/delete.php:34 +msgid "Invalid channel specified for deletion." +msgstr "Ongeldig kanaal gespecifiseerd voor verwijdering." + +#: delivery/html.php:29 delivery/email.php:52 lists/edit.php:33 +#: lists/delete.php:37 +msgid "Invalid channel." +msgstr "Ongeldig kanaal." + +#: lists/delete.php:27 +msgid "Invalid request to delete recipient from delivery list." +msgstr "Ongeldig verzoek om ontvanger te verwijderen van distributie lijst." + +#: delivery/email.php:67 +msgid "Join this channel" +msgstr "Abonneren op dit kanaal" + +#: delivery/index.php:53 channels/index.php:92 +msgid "Last Update" +msgstr "Laatst bijgewerkt" + +#: templates/subscribe/column_headers.inc:9 +msgid "Last Updated" +msgstr "Laatst bijgewerkt" + +#: delivery/email.php:68 +msgid "Leave this channel" +msgstr "Kanaal opzeggen" + +#: channels/aggregate.php:58 lib/Form/EditChannel.php:73 +msgid "Link" +msgstr "Link" + +#: stories/index.php:115 +msgid "Lists" +msgstr "Lijst" + +#: lib/Block/news.php:57 +msgid "Maximum Stories" +msgstr "Maximum artikelen" + +#: lib/Block/tree_menu.php:3 +msgid "Menu List" +msgstr "Menu Lijst" + +#: stories/share.php:105 +msgid "Message" +msgstr "Bericht" + +#: lists/index.php:123 +msgid "Method" +msgstr "Methode" + +#: lib/News.php:78 +msgid "Missing channel id." +msgstr "Onbrekende kanaal id." + +#: lib/Jonah.php:247 +msgid "My Content" +msgstr "Mijn Inhoud" + +#: delivery/email.php:81 delivery/index.php:53 channels/index.php:92 +#: lists/index.php:123 lib/Delivery/email.php:212 +#: lib/Block/delivery_email.php:92 +msgid "Name" +msgstr "Naam" + +#: stories/index.php:109 lib/Block/news.php:85 +msgid "New Story" +msgstr "Nieuw artikel" + +#: channels/index.php:88 +msgid "New channel" +msgstr "Nieuw kanaal" + +#: lists/index.php:104 +msgid "New recipient" +msgstr "Nieuwe ontvanger" + +#: lib/api.php:46 config/prefs.php.dist:10 +msgid "News" +msgstr "Nieuws" + +#: channels/index.php:97 lib/Jonah.php:257 +msgid "News Admin" +msgstr "Nieuws Admin" + +#: lib/Block/delivery_email.php:39 +msgid "News Channel" +msgstr "Nieuws Kanaal" + +#: lib/Block/news.php:38 +msgid "News Source" +msgstr "Nieuws Bron" + +#: lib/Block/delivery_email.php:3 +msgid "News by Email" +msgstr "Nieuws via Email" + +#: lib/Block/delivery.php:3 +msgid "News delivery" +msgstr "Nieuws distributie" + +#: channels/index.php:23 lists/index.php:37 +msgid "News is not enabled." +msgstr "Nieuws is niet actief." + +#: delivery/index.php:49 channels/index.php:82 +msgid "No Data" +msgstr "Geen Data" + +#: channels/index.php:36 +msgid "No available channels." +msgstr "Geen beschikbare kanalen." + +#: stories/index.php:48 +msgid "No available stories." +msgstr "Geen beschikbare artikelen." + +#: stories/index.php:21 lists/index.php:23 +msgid "No channel requested." +msgstr "Geen verzoek van kanaal." + +#: lib/Block/news.php:94 +msgid "No channel specified." +msgstr "Geen kanaal gespecifiseerd." + +#: lib/Block/delivery_email.php:69 +msgid "No channels available." +msgstr "Geen kanalen beschikbaar." + +#: lists/index.php:77 +msgid "No recipients." +msgstr "Geen ontvangers." + +#: lib/News.php:474 +msgid "No stories are currently available." +msgstr "Er zijn geen artikelen beschikbaar op dit moment." + +#: lib/Delivery.php:218 +#, php-format +msgid "No such action '%s' found" +msgstr "Actie '%s' niet gevonden" + +#: lib/News.php:601 +#, php-format +msgid "No such backend '%s' found" +msgstr "Backend '%s' niet gevonden" + +#: stories/delete.php:35 +msgid "No valid story requested for deletion." +msgstr "Geen geldig artikel voor verwijdering." + +#: stories/share.php:26 +msgid "Note" +msgstr "Notitie" + +#: stories/edit.php:67 +msgid "" +"Note: this story won't get delivered to distribution lists automatically if " +"this time is in the future." +msgstr "" +"N.B.: dit artikel zal niet automatisch worden afgeleverd aan distributie " +"lijsten als de tijd in de toekomst ligt." + +#: config/prefs.php.dist:16 +msgid "Other Options" +msgstr "Andere Opties" + +#: channels/delete.php:20 +msgid "Permission Denied." +msgstr "Toegang geweigerd." + +#: lib/News.php:544 +msgid "Plaintext Version of Story" +msgstr "Plattetekst versie van artikel" + +#: templates/stories/index.html:29 +msgid "Read" +msgstr "Lezen" + +#: channels/delete.php:52 +msgid "Really delete this News Channel?" +msgstr "Dit nieuws kanaal verwijderen?" + +#: stories/delete.php:53 +msgid "Really delete this News Story?" +msgstr "Dit artikel verwijderen?" + +#: lists/index.php:123 +msgid "Recipient" +msgstr "Ontvanger" + +#: lists/edit.php:85 +msgid "Recipient saved." +msgstr "Ontvanger opgeslagen." + +#: lists/delete.php:52 +msgid "Recipient successfully removed." +msgstr "Ontvanger met succes verwijderd." + +#: stories/share.php:102 +msgid "Recipients" +msgstr "Ontvangers" + +#: channels/index.php:76 +msgid "Refresh channel" +msgstr "Ververs kanaal" + +#: stories/edit.php:67 +msgid "Release Date" +msgstr "Publicatie datum" + +#: stories/edit.php:66 +msgid "Release?" +msgstr "Publiceren" + +#: stories/index.php:120 +msgid "Released" +msgstr "Gepubliceerd" + +#: lists/delete.php:54 +msgid "Removal of recipient failed." +msgstr "Verwijdering van ontvanger mislukt." + +#: channels/aggregate.php:24 +#, php-format +msgid "Remove channel \"%s\"" +msgstr "Verwijder kanaal \"%s\"" + +#: delivery/email.php:41 +msgid "Request confirmed." +msgstr "Verzoek bevestigd." + +#: lib/Delivery/email.php:71 +#, php-format +msgid "Request to receive news channel \"%s\"" +msgstr "Verzoek om kanaal \"%s\" te ontvangen" + +#: lib/Delivery/email.php:76 +#, php-format +msgid "Request to stop receiving news channel \"%s\"" +msgstr "Verzoek om ontvangst van kanaal \"%s\" te stoppen" + +#: lib/Jonah.php:200 +msgid "Rich Text" +msgstr "Rich Tekst" + +#: delivery/email.php:64 stories/edit.php:61 lists/edit.php:51 +#: lib/Block/delivery_email.php:78 +msgid "Save" +msgstr "Opslaan" + +#: templates/subscribe/edit.inc:19 +msgid "Save Changes" +msgstr "Wijzigingen opslaan" + +#: templates/delivery/html.html:14 +msgid "Select a format:" +msgstr "Selecteer een formaat:" + +#: stories/share.php:98 +msgid "Send" +msgstr "Zend" + +#: stories/share.php:102 +msgid "Separate multiple email addresses with commas." +msgstr "Scheid meerdere email adressen met komma's." + +#: stories/share.php:96 +msgid "Share Story" +msgstr "Deel Artikel" + +#: stories/view.php:43 +msgid "Share this story" +msgstr "Deel dit artikel" + +#: stories/edit.php:65 +msgid "Short Description" +msgstr "Korte Omschrijving" + +#: channels/aggregate.php:57 lib/Form/EditChannel.php:72 +msgid "Source URL" +msgstr "Bron URL" + +#: lib/Form/EditChannel.php:87 +msgid "Source URLs" +msgstr "Bron URL's" + +#: config/templates.php.dist:26 +msgid "Standard" +msgstr "Standaard" + +#: stories/index.php:118 +msgid "Story" +msgstr "Artikel" + +#: lib/News.php:667 +#, php-format +msgid "Story \"%s\" not found in channel \"%s\"." +msgstr "Artikel \"%s\" niet gevonden in kanaal \"%s\"." + +#: stories/share.php:127 +msgid "Story Link" +msgstr "Link naar artikel" + +#: stories/edit.php:64 +msgid "Story Title (Headline)" +msgstr "Titel" + +#: stories/edit.php:96 +msgid "Story URL" +msgstr "Artikel URL" + +#: lib/News/sql.php:356 +#, php-format +msgid "Story URL '%s' not found." +msgstr "Artikel URL '%s' niet gevonden." + +#: lib/Form/EditChannel.php:65 lib/Form/EditChannel.php:99 +#, php-format +msgid "" +"Story URL if not the default one. %c gets replaced by the channel ID, %s by " +"the story ID." +msgstr "" +"Artikel URL als niet de standaard. %c wordt vervangen door kanaal ID, %s " +"door het artikel ID." + +#: stories/edit.php:69 +msgid "Story body type" +msgstr "Artikel body type" + +#: stories/edit.php:31 +#, php-format +msgid "Story editing failed: %s" +msgstr "Artikel wijzigen mislukte: %s" + +#: stories/delete.php:72 +msgid "Story has not been deleted." +msgstr "Artikel is niet verwijderd." + +#: lib/News/sql.php:331 +#, php-format +msgid "Story id '%s' not found." +msgstr "Artikel id '%s' niet gevonden." + +#: stories/share.php:103 +msgid "Subject" +msgstr "Onderwerp" + +#: subscribe.php:122 templates/subscribe/subscribe.inc:40 +msgid "Subscribe" +msgstr "Abonneren" + +#: content.php:53 +#, php-format +msgid "" +"Subscribed channel '%s' is no longer available, it will be removed from your " +"subscriptions." +msgstr "" +"Geabonneerd kanaal '%s' is niet langer beschikbaar, het zal verwijderd " +"worden van uw lijst." + +#: templates/subscribe/column_headers.inc:11 +msgid "Subscription" +msgstr "Abonnement" + +#: lib/News.php:283 +#, php-format +msgid "Successfully delivered to the %s distribution list." +msgstr "De %s distributie lijst is met succes afgeleverd." + +#: lib/Jonah.php:208 +msgid "Text" +msgstr "Tekst" + +#: channels/aggregate.php:93 +#, php-format +msgid "The channel \"%s\" has been removed." +msgstr "Het kanaal \"%s\" is verwijderd." + +#: channels/aggregate.php:74 +#, php-format +msgid "The channel \"%s\" has been saved." +msgstr "Het kanaal \"%s\" is opgeslagen." + +#: channels/aggregate.php:82 channels/aggregate.php:100 +#, php-format +msgid "The channel \"%s\" has been updated." +msgstr "Het kanaal \"%s\" is bijgewerkt." + +#: channels/edit.php:72 +#, php-format +msgid "The channel '%s' has been saved." +msgstr "Het kanaal '%s' is opgeslagen." + +#: channels/delete.php:69 +msgid "The channel has been deleted." +msgstr "Het kanaal is verwijderd." + +#: stories/share.php:104 +msgid "The complete text of the story" +msgstr "De complete tekst van het artikel" + +#: lib/Form/EditChannel.php:81 +msgid "" +"The interval before stories aggregated into this channel are rechecked for " +"updates. If none, then stories will always be refetched from the sources." +msgstr "" +"Het interval voordat artikelen geaggregeerd worden in dit kanaal zijn " +"opnieuw gecontroleerd voor updates. Zoniet worden de artikelen altijd " +"herladen vanuit de bronnen." + +#: lib/Form/EditChannel.php:70 +msgid "" +"The interval before stories in this channel are rechecked for updates. If " +"none, then stories will always be refetched from the source." +msgstr "" +"Het interval voordat artikelen in dit kanaal zijn opnieuw gecontroleerd voor " +"updates. Zoniet worden de artikelen altijd herladen vanuit de bronnen." + +#: stories/edit.php:105 +#, php-format +msgid "The story \"%s\" has been saved." +msgstr "Het artikel \"%s\" is opgeslagen." + +#: stories/delete.php:64 +msgid "The story has been deleted." +msgstr "Het artikel is verwijderd." + +#: stories/share.php:138 +msgid "The story was sent successfully." +msgstr "Het artikel is met succes verzonden." + +#: channels/aggregate.php:57 lib/Form/EditChannel.php:72 +msgid "" +"The url to use to fetch the stories, for example 'http://www.example.com/" +"stories.rss'" +msgstr "" +"Het URL om artikelen op te halen, bijvoorbeed 'http://www.example.com/" +"stories.rss'" + +#: channels/delete.php:67 +#, php-format +msgid "There was an error deleting the channel: %s" +msgstr "Er was een fout bij verwijderen van kanaal: %s" + +#: stories/delete.php:62 +#, php-format +msgid "There was an error deleting the story: %s" +msgstr "Er was een fout bij verwijderen van artikel: %s" + +#: channels/aggregate.php:91 +#, php-format +msgid "There was an error removing the channel: %s" +msgstr "Er was een fout bij verwijderen van kanaal: %s" + +#: channels/edit.php:70 +#, php-format +msgid "There was an error saving the channel. %s" +msgstr "Er was een fout bij opslaan van kanaal. %s" + +#: channels/aggregate.php:72 +#, php-format +msgid "There was an error saving the channel: %s" +msgstr "Er was een fout bij opslaan van kanaal: %s" + +#: stories/edit.php:103 +#, php-format +msgid "There was an error saving the story: %s" +msgstr "Er was een fout bij opslaan van artikel: %s" + +#: channels/aggregate.php:80 channels/aggregate.php:98 +#, php-format +msgid "There was an error updating the channel: %s" +msgstr "Er was een fout met bijwerken van kanaal: %s" + +#: lib/Delivery/email.php:196 +msgid "" +"This driver allows the delivery of news stories via email to one or more " +"recipients." +msgstr "" +"Met deze driver is het mogelijk om nieuwsberichten af te leveren via email " +"naar een of meer ontvangers" + +#: channels/aggregate.php:41 +msgid "This is no aggregated channel." +msgstr "Er is geen geaggregeerd kanaal." + +#: channels/index.php:92 lib/Form/EditChannel.php:37 +msgid "Type" +msgstr "Type" + +#: config/templates.php.dist:54 +msgid "Ultracompact" +msgstr "Ultracompact" + +#: delivery/email.php:39 +#, php-format +msgid "Unable to confirm request." +msgstr "Niet in staat op verzoek te bevestigen." + +#: stories/share.php:136 +#, php-format +msgid "Unable to send story: %s" +msgstr "Niet in staat om artikel %s te verzenden." + +#: templates/subscribe/edit.inc:20 +msgid "Undo Changes" +msgstr "Wijzigingen ongedaan maken" + +#: subscribe.php:118 templates/subscribe/subscribe.inc:36 +msgid "Unsubscribe" +msgstr "Opzeggen" + +#: channels/aggregate.php:105 +msgid "Update" +msgstr "Bijwerken" + +#: stories/index.php:118 +msgid "Updated" +msgstr "Bijgewerkt" + +#: templates/subscribe/edit.inc:9 lib/Block/news.php:49 +msgid "View" +msgstr "Weergave" + +#: delivery/email.php:65 +msgid "What do you want to do?" +msgstr "Wat wilt u doen?" + +#: stories/edit.php:39 stories/index.php:29 stories/delete.php:20 +#: channels/edit.php:43 channels/index.php:17 channels/aggregate.php:48 +#: lists/edit.php:41 lists/index.php:31 lists/delete.php:45 +msgid "You are not authorised for this action." +msgstr "U bent niet geautoriseerd voor deze actie." + +#: channels/edit.php:74 +msgid "You can now edit the sub-channels." +msgstr "U kunt nu de sub-kanalen bewerken." + +#: subscribe.php:84 +#, php-format +msgid "You have edited your subscription to the channel '%s'." +msgstr "U heeft uw abonnement op kanaal '%s' bewerkt." + +#: templates/content/content.html:24 +msgid "You have no news subscriptions." +msgstr "U hebt geen abonnementen." + +#: lib/Delivery/email.php:74 +#, php-format +msgid "" +"You have requested to receive \"%s\" stories by email. Click on this link to " +"confirm the request: %s" +msgstr "" +"U hebt verzocht om \"%s\" artikelen te ontvangen per email. Klik op deze " +"link om het verzoek %s te bevestigen." + +#: lib/Delivery/email.php:77 +#, php-format +msgid "" +"You have requested to stop receiving \"%s\" stories by email. Click on this " +"link to confirm the request: %s" +msgstr "" +"U heeft verzocht om de ontvangst van \"%s\" artikelen via email te stoppen. " +"Klik op deze link om verzoek %s te bevestigen." + +#: subscribe.php:39 +#, php-format +msgid "You have subscribed to the channel '%s'." +msgstr "U heeft zich geabonneerd op kanaal '%s'." + +#: subscribe.php:62 +#, php-format +msgid "You have unsubscribed from the channel '%s'." +msgstr "U heeft het abonnement op kanaal '%s' opgezegd." + +#: lib/Delivery.php:275 +msgid "You must configure a Horde Datatree backend to use Jonah." +msgstr "U moet de Horde Datatree backend configureren om Jonah te gebruiken." + +#: config/prefs.php.dist:9 +msgid "Your Content" +msgstr "Uw Inhoud" + +#: lib/News.php:706 +msgid "[No title]" +msgstr "[Geen titel]" + +#: lib/News.php:373 +msgid "none" +msgstr "geen" diff --git a/jonah/po/ro_RO.po b/jonah/po/ro_RO.po new file mode 100644 index 000000000..f4c110274 --- /dev/null +++ b/jonah/po/ro_RO.po @@ -0,0 +1,970 @@ +# Romanian translations for Jonah package. +# Copyright 2003-2009 The Horde Project +# This file is distributed under the same license as the Jonah package. +# Eugen Hoanca , 2003. +# +msgid "" +msgstr "" +"Project-Id-Version: Jonah 0.0.3\n" +"POT-Creation-Date: 2003-03-04 13:46+0100\n" +"PO-Revision-Date: 2003-03-28 11:01+0200\n" +"Last-Translator: Eugen Hoanca \n" +"Language-Team: Romanian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: lib/NewsAdmin.php:41 +msgid " (id=%d, %d stories)" +msgstr "(id=%d, %d articole)" + +#: lib/Jonah.php:405 +msgid " and the UV index is a %s. " +msgstr " si indexul UV este %s. " + +#: lib/Block/metar.php:103 +msgid " at %s %s" +msgstr " la %s %s" + +#: lib/Jonah.php:389 +msgid " km" +msgstr " km" + +#: lib/Jonah.php:365 +msgid " km/h" +msgstr " km/h" + +#: lib/Jonah.php:390 +msgid " miles" +msgstr " mile" + +#: templates/content/header.inc:4 +msgid "%d Headlines Available" +msgstr " %d titluri disponibile" + +#: lib/Jonah.php:346 +msgid "%s at %s" +msgstr "%s la %s" + +#: lib/NewsAdmin.php:17 +msgid "Add News Source" +msgstr "Adaugare sursa stiri" + +#: lib/NewsAdmin.php:31 newsadmin.php:84 +msgid "Add Story" +msgstr "Adaugare articol" + +#: lib/NewsAdmin.php:115 +msgid "Add a News Story for '%s'" +msgstr "Adaugare stire pentru '%s'" + +#: lib/Jonah.php:378 +msgid "Barometer shows %s. " +msgstr "Barometrul arata %s. " + +#: templates/channels/column_headers.inc:13 +msgid "Change" +msgstr "Schimba" + +#: config/prefs.php.dist:22 +msgid "Change the location for which weather is obtained." +msgstr "Schimbare locatie pentru care se obtine timp probabil." + +#: config/prefs.php.dist:34 +msgid "Change your content display options." +msgstr "Schimbare optiuni afisare continut." + +#: content.php:15 +msgid "Channel Listing" +msgstr "Listare canale" + +#: templates/channels/column_headers.inc:7 +msgid "Channel Name" +msgstr "Nume canal" + +#: channels.php:180 +msgid "Channel Subscriptions" +msgstr "Abonamente canal" + +#: channels.php:173 +msgid "Channel display failed." +msgstr "Afisare canal esuata" + +#: channels.php:130 +msgid "Channel subscription editing failed." +msgstr "Editarea abonarii la canal esuata." + +#: channels.php:73 +msgid "Channel subscription failed." +msgstr "Abonare la canal esuata." + +#: channels.php:111 +msgid "Channel unsubscription failed." +msgstr "Dezabonarea de la canal esuata." + +#: config/prefs.php.dist:16 +msgid "Choose which news channels you are subscribed to." +msgstr "Alegere canale de stiri la care sunteti abonat." + +#: lib/Block/metar.php:101 +msgid "Clouds: %s" +msgstr "Nori: %s" + +#: config/templates.php.dist:41 +msgid "Compact" +msgstr "Compact" + +#: lib/api.php:63 +msgid "Current Phase" +msgstr "Faza curenta a lunii" + +#: lib/Block/metar.php:25 lib/api.php:74 +msgid "Current Weather" +msgstr "Timp probabil curent" + +#: lib/Block/metar.php:45 lib/Block/metar.php:47 +msgid "Current Weather for: %s" +msgstr "Timp probabil curent pentru: %s" + +#: lib/NewsAdmin.php:90 +msgid "Delete News Source" +msgstr "Stergere surse stiri" + +#: lib/NewsAdmin.php:216 +msgid "Delete News Story" +msgstr "Stergere stire" + +#: lib/NewsAdmin.php:34 newsadmin.php:99 +msgid "Delete Source" +msgstr "Stergere sursa" + +#: lib/NewsAdmin.php:144 newsadmin.php:165 +msgid "Delete Story" +msgstr "Stergere articol" + +#: config/templates.php.dist:9 +msgid "Detailed" +msgstr "Detaliat" + +#: config/prefs.php.dist:33 +msgid "Display Options" +msgstr "Optiuni afisaj" + +#: templates/channels/subscribe.inc:56 +#: templates/channels/column_headers.inc:15 +msgid "Edit" +msgstr "Editare" + +#: templates/channels/header.inc:3 +msgid "Edit Channel Subscriptions" +msgstr "Editare abonamente canale" + +#: lib/NewsAdmin.php:59 +msgid "Edit News Source" +msgstr "Editare sursa stiri" + +#: lib/NewsAdmin.php:171 +msgid "Edit News Story" +msgstr "Editare stire" + +#: lib/NewsAdmin.php:33 newsadmin.php:94 +msgid "Edit Source" +msgstr "Editare sursa" + +#: lib/NewsAdmin.php:32 newsadmin.php:89 +msgid "Edit Stories" +msgstr "Editare articole" + +#: lib/NewsAdmin.php:143 newsadmin.php:160 +msgid "Edit Story" +msgstr "Editare articol" + +#: templates/channels/subscribe.inc:55 +msgid "Edit Subscription Details" +msgstr "Editare detalii abonare" + +#: templates/channels/edit.inc:5 +msgid "Editing Channel %s" +msgstr "Editare canal %s" + +#: lib/Jonah.php:59 +msgid "" +"Either no weather data is available for the location you have selected, or " +"you have not selected a valid location." +msgstr "" +"Ori datele despre vreme nu sunt disponibile pentru locatia selectata, ori " +"nu ati selectat o locatie valida." + +#: config/prefs.php.dist:128 +msgid "Enter NASDAQ/AMEX/NYSE ticker symbols to watch, separated with commas:" +msgstr "Introduceti simbolurile NASDAQ/AMEX/NYSE, separate cu virgule:" + +#: lib/Jonah.php:490 +msgid "Error: could not open weather cache file for writing." +msgstr "Eroare: deschidere fisier de cache al vremii pentru scriere esuata." + +#: lib/Jonah.php:483 +msgid "Error: could not update weather." +msgstr "Eroare: nu s-a putut reinnoi informatia despre vreme." + +#: lib/Jonah.php:495 +msgid "Error: write to weather cache file failed." +msgstr "Eroare: scrierea in fisierul cache al vremii esuata." + +#: lib/Block/moon.php:143 +msgid "First Half" +msgstr "Prima jumatate" + +#: lib/Block/moon.php:53 lib/Block/moon.php:55 +msgid "First Quater" +msgstr "Primul patrar" + +#: lib/Jonah.php:410 +msgid "Forecast: " +msgstr "Prognoza: " + +#: lib/Jonah.php:325 +msgid "Friday" +msgstr "Vineri" + +#: lib/Block/moon.php:61 +msgid "Full Moon" +msgstr "Luna plina" + +#: lib/NewsAdmin.php:121 lib/NewsAdmin.php:191 +msgid "Full Story Text" +msgstr "Text integral articol" + +#: lib/Block/moon.php:153 +msgid "Full moon" +msgstr "Luna plina" + +#: lib/api.php:86 +msgid "Headlines" +msgstr "Titluri" + +#: templates/menu/menu.inc:18 +msgid "Help" +msgstr "Ajutor" + +#: lib/api.php:65 +msgid "Hemisphere:" +msgstr "Emisfera:" + +#: config/prefs.php.dist:57 +msgid "How many columns would you like to use to show headlines?" +msgstr "Cate coloane doriti pentru afisare titluri?" + +#: lib/Jonah.php:372 +msgid "It feels like %s. " +msgstr "Se pare ca %s. " + +#: templates/backend/backend.inc:5 +msgid "Jonah Backend" +msgstr "Suport Jonah" + +#: templates/index/notconfigured.inc:4 +msgid "Jonah is not properly configured" +msgstr "Jonah nu este corect configurat" + +#: templates/backend/backend.inc:14 +msgid "Just Fetch latest RSS files" +msgstr "Aducere ultimele fisiere RSS" + +#: templates/backend/backend.inc:15 +msgid "Just Generate HTML from RSS files" +msgstr "Generare HTML din fisiere RSS" + +#: config/prefs.php.dist:9 +msgid "Language" +msgstr "Limba" + +#: lib/Block/moon.php:146 +msgid "Last Half" +msgstr "Ultima jumatate" + +#: lib/Block/moon.php:67 lib/Block/moon.php:69 +msgid "Last Quater" +msgstr "Ultimul patrar" + +#: templates/channels/column_headers.inc:10 +msgid "Last Updated" +msgstr "Ultima data innoit" + +#: lib/Block/metar.php:52 +msgid "Last Updated: %s" +msgstr "Ultima data innoit: %s" + +#: lib/api.php:47 +msgid "Latitude" +msgstr "Latitudine" + +#: templates/index/notconfigured.inc:58 +msgid "List of METAR weather stations." +msgstr "Lista statii meteo METAR" + +#: lib/api.php:75 +msgid "Location" +msgstr "Locatie" + +#: lib/NewsAdmin.php:36 +msgid "Manage News Sources" +msgstr "Administrare surse stiri" + +#: lib/NewsAdmin.php:146 +msgid "Manage News Stories" +msgstr "Administrare stiri" + +#: lib/Jonah.php:325 +msgid "Monday" +msgstr "Luni" + +#: lib/Block/moon.php:19 lib/api.php:58 +msgid "Moon Phases" +msgstr "Fazele lunii" + +#: templates/menu/menu.inc:6 +msgid "My Content" +msgstr "Cuprinsul meu" + +#: lib/Block/moon.php:47 +msgid "New Moon" +msgstr "Luna noua" + +#: lib/Block/moon.php:31 lib/Block/moon.php:151 +msgid "New moon" +msgstr "Luna noua" + +#: lib/Block/news.php:37 config/prefs.php.dist:15 +msgid "News" +msgstr "Stire(i)" + +#: newsadmin.php:47 templates/menu/menu.inc:13 +msgid "News Admin" +msgstr "Administrator stire(i)" + +#: lib/NewsAdmin.php:48 +msgid "News Source" +msgstr "Sursa stire(i)" + +#: lib/api.php:64 +msgid "Next Phase" +msgstr "Faza urmatoare" + +#: lib/NewsAdmin.php:95 lib/NewsAdmin.php:220 +msgid "No" +msgstr "Nu" + +#: lib/News/sql.php:310 +msgid "No configuration information specified for SQL News Stories." +msgstr "Nici o configuratie specificata pentru stirile SQL." + +#: lib/Weather/sql.php:201 +msgid "No configuration information specified for SQL Preferences." +msgstr "Nici o configuratie specificata pentru preferintele SQL." + +#: lib/Block/sunrise.php:29 +msgid "No location is set." +msgstr "Nu e setata nici o locatie." + +#: lib/api.php:68 +msgid "Northern Hemisphere" +msgstr "Emisfera nordica" + +#: templates/menu/menu.inc:8 +msgid "Options" +msgstr "Optiuni" + +#: config/prefs.php.dist:32 +msgid "Other Options" +msgstr "Alte optiuni" + +#: templates/prefs/setlocation.inc:27 +msgid "Please select a Country/State..." +msgstr "Selectati un judet/o tara..." + +#: templates/prefs/setlocation.inc:40 +msgid "Please select a station..." +msgstr "Selectati o statie..." + +#: lib/Block/metar.php:92 +msgid "Pressure: %s%s" +msgstr "Presiune atmosferica: %s%s" + +#: lib/Jonah.php:51 lib/Jonah.php:54 +msgid "Radar" +msgstr "Radar" + +#: lib/NewsAdmin.php:102 +msgid "Really delete this News Source?" +msgstr "Sigur stergeti sursa de stiri?" + +#: lib/NewsAdmin.php:228 +msgid "Really delete this News Story?" +msgstr "Sigur stergeti stirea?" + +#: lib/News/sql.php:328 +msgid "Required 'charset' not specified in news stories configuration." +msgstr "'charset' nespecificat in configurarea stirilor." + +#: lib/News/sql.php:325 +msgid "Required 'database' not specified in news stories configuration." +msgstr "'database' nespecificat in configurarea stirilor." + +#: lib/Weather/sql.php:216 +msgid "Required 'database' not specified in preferences configuration." +msgstr "'database' nespecificat in configurarea preferintelor." + +#: lib/News/sql.php:316 +msgid "Required 'hostspec' not specified in news stories configuration." +msgstr "'hostspec' nespecificat in configuratia stirilor." + +#: lib/Weather/sql.php:207 +msgid "Required 'hostspec' not specified in preferences configuration." +msgstr "'hostspec' nespecificat in configurarea preferintelor." + +#: lib/News/sql.php:322 +msgid "Required 'password' not specified in news stories configuration." +msgstr "'password' nespecificat in configurarea stirilor." + +#: lib/Weather/sql.php:213 +msgid "Required 'password' not specified in preferences configuration." +msgstr "'password' nespecificat in configurarea preferintelor." + +#: lib/News/sql.php:313 +msgid "Required 'phptype' not specified in news stories configuration." +msgstr "'phptype' nespecificat in configurarea stirilor." + +#: lib/Weather/sql.php:204 +msgid "Required 'phptype' not specified in preferences configuration." +msgstr "'phptype' nespecificat in configurarea preferintelor." + +#: lib/News/sql.php:319 +msgid "Required 'username' not specified in news stories configuration." +msgstr "'username' nespecificat in configurarea stirilor." + +#: lib/Weather/sql.php:210 +msgid "Required 'username' not specified in preferences configuration." +msgstr "'username' nespecificat in configurarea preferintelor." + +#: lib/Jonah.php:325 +msgid "Saturday" +msgstr "Sambata" + +#: templates/channels/edit.inc:19 +msgid "Save Changes" +msgstr "Salveaza modificari" + +#: config/prefs.php.dist:44 +msgid "Select your preferred language:" +msgstr "Selectare limba favorita:" + +#: config/prefs.php.dist:10 +msgid "Set the your preferred display language." +msgstr "Setare limba favorita." + +#: config/prefs.php.dist:28 +msgid "Set which stock ticker symbols to watch." +msgstr "Setati ce simboluri doriti sa urmariti." + +#: lib/NewsAdmin.php:119 lib/NewsAdmin.php:186 +msgid "Short Description" +msgstr "Descriere scurta" + +#: config/prefs.php.dist:106 +msgid "Should measurements be shown in metric values?" +msgstr "Afisare masuri in sistem metric?" + +#: config/prefs.php.dist:135 +msgid "Show Dow Jones Industrial Average (INDU)?" +msgstr "Afisare medie industriala Dow Jones (INDU)?" + +#: config/prefs.php.dist:142 +msgid "Show S&P 500 (SPX)?" +msgstr "Afisare S& P500 (SPX)?" + +#: config/prefs.php.dist:71 +msgid "Show headlines in %s summary?" +msgstr "Afisare titluri in cuprinsul %s?" + +#: config/prefs.php.dist:92 +msgid "Show headlines in main content display?" +msgstr "Afisare titluri in fereastra principala?" + +#: config/prefs.php.dist:78 +msgid "Show stock quotes in %s summary?" +msgstr "Afisare cotatii bursa in cuprinsul %s?" + +#: config/prefs.php.dist:99 +msgid "Show stock quotes in main content display?" +msgstr "Afisare cotatii bursa in fereastra principala?" + +#: config/prefs.php.dist:64 +msgid "Show weather in %s summary?" +msgstr "Afisare timp probabil in cuprinsul %s?" + +#: config/prefs.php.dist:85 +msgid "Show weather in main content display?" +msgstr "Afisare timp probabil in fereastra principala?" + +#: templates/index/notconfigured.inc:39 +msgid "Some of Jonah's configuration files are missing:" +msgstr "Anumite fisiere de configurare Jonah lipsesc:" + +#: lib/Block/news.php:56 +msgid "Something went wrong!" +msgstr "Ceva nu a mers bine!" + +#: lib/NewsAdmin.php:99 lib/api.php:87 +msgid "Source" +msgstr "Sursa" + +#: lib/NewsAdmin.php:20 lib/NewsAdmin.php:76 +msgid "Source Description" +msgstr "Descriere sursa" + +#: lib/NewsAdmin.php:19 lib/NewsAdmin.php:71 +msgid "Source Name" +msgstr "Nume sursa" + +#: lib/api.php:69 +msgid "Southern Hemisphere" +msgstr "Emisfera sudica" + +#: config/templates.php.dist:27 +msgid "Standard" +msgstr "Standard" + +#: stockquote.php:17 +msgid "Stock Quote" +msgstr "Cotatie bursa" + +#: lib/Block/stocks.php:23 lib/api.php:105 content.php:30 +msgid "Stock Quotes" +msgstr "Cotatii bursa" + +#: config/prefs.php.dist:27 +msgid "Stocks" +msgstr "Burse" + +#: lib/NewsAdmin.php:160 lib/NewsAdmin.php:225 +msgid "Story" +msgstr "Articol" + +#: lib/NewsAdmin.php:118 lib/NewsAdmin.php:183 +msgid "Story Title (Headline)" +msgstr "Titlu Articol" + +#: lib/NewsAdmin.php:122 lib/NewsAdmin.php:194 +msgid "Story URL" +msgstr "URL Articol" + +#: lib/News/sql.php:214 +msgid "Story not found." +msgstr "Articol negasit." + +#: channels.php:168 templates/channels/subscribe.inc:45 +#: templates/channels/subscribe.inc:46 +msgid "Subscribe" +msgstr "Abonare" + +#: lib/Block/sunrise.php:42 +msgid "Sun Rise" +msgstr "Soarele rasare" + +#: lib/api.php:46 +msgid "Sun Rise / Set" +msgstr "Soarele Rasare / Apune" + +#: lib/Block/sunrise.php:23 +msgid "Sun Rise and Set" +msgstr "Soarele rasare si apune" + +#: lib/Block/sunrise.php:47 +msgid "Sun Set" +msgstr "Soarele apune" + +#: lib/Jonah.php:325 +msgid "Sunday" +msgstr "Duminica" + +#: lib/Block/metar.php:84 +msgid "Temperature: %s; Dewpoint: %s" +msgstr "Temperatura: %s; Umiditate: %s" + +#: newsadmin.php:186 +msgid "The News Story '%s' has been added." +msgstr "Stirea '%s' a fost adaugata." + +#: newsadmin.php:205 +msgid "The Story has been modified." +msgstr "Articolul a fost modificat." + +#: lib/Jonah.php:405 +msgid "The UV index is a %s. " +msgstr "Indexul de UV este %s." + +#: newsadmin.php:65 +msgid "The source '%s' has been added." +msgstr "Sursa '%s' a fost adaugata." + +#: newsadmin.php:136 +msgid "The source has been deleted." +msgstr "Sursa a fost stearsa." + +#: newsadmin.php:117 +msgid "The source has been modified." +msgstr "Sursa a fost modificata." + +#: newsadmin.php:141 +msgid "The source was not deleted." +msgstr "Sursa nu a fost stearsa." + +#: newsadmin.php:221 +msgid "The story has been deleted." +msgstr "Articolul a fost sters." + +#: newsadmin.php:226 +msgid "The story was not deleted." +msgstr "Articolul nu a fost sters" + +#: lib/Jonah.php:350 +msgid "The temperature is %s, " +msgstr "Temperatura este %s, " + +#: lib/NewsAdmin.php:45 +msgid "There are no News Sources." +msgstr "Nu exista surse de stiri." + +#: lib/NewsAdmin.php:156 +msgid "There are no News Stories." +msgstr "Nu exista stiri." + +#: newsadmin.php:184 +msgid "There was an error adding the News Story: %s." +msgstr "S-a produs o eroare la adaugarea stirii: %s." + +#: newsadmin.php:68 +msgid "There was an error adding the source: %s." +msgstr "S-a produs o eroare la adaugarea sursei: %s." + +#: newsadmin.php:138 +msgid "There was an error deleting the source: %s." +msgstr "S-a produs o eroare la stergerea sursei: %s." + +#: newsadmin.php:223 +msgid "There was an error deleting the story: %s." +msgstr "S-a produs o eroare la stergerea articolului: %s." + +#: newsadmin.php:203 +msgid "There was an error editing the Story: %s." +msgstr "S-a produs o eroare la editarea articolului: %s" + +#: newsadmin.php:120 +msgid "There was an error editing the source: %s." +msgstr "S-a produs o eroare la editarea sursei: %s." + +#: templates/index/notconfigured.inc:72 +msgid "This file contains preferences for Jonah." +msgstr "Acest fisier contine preferintele pentru Jonah." + +#: templates/index/notconfigured.inc:51 +msgid "" +"This file defines all of the headline channels that you wish Jonah to " +"display." +msgstr "" +"Acest fisier defineste toate titlurile canalelor pe care doriti sa le " +"afiseze Jonah." + +#: templates/index/notconfigured.inc:65 +msgid "" +"This file defines the HTML (or other) templates that are used to generate " +"different views of the news channels that Jonah provides." +msgstr "" +"Acest fisier defineste modelele HTML (sau altele) care vor fi utilizate " +"pentru a genera vizualizari diferite ale canalelor de stiri ale Jonah." + +#: lib/NewsAdmin.php:64 +msgid "This is not a valid News Source." +msgstr "Aceasta nu este o sursa de stiri valida." + +#: lib/NewsAdmin.php:175 +msgid "This is not a valid News Story." +msgstr "Aceasta nu este o stire valida." + +#: templates/index/notconfigured.inc:44 +msgid "" +"This is the main Jonah configuration file. It contains options for all Jonah " +"scripts." +msgstr "" +"Acesta este principalul fisier de configurare Jonah. Contine optiuni pentru " +"toate scripturile Jonah." + +#: lib/Jonah.php:325 +msgid "Thursday" +msgstr "Joi" + +#: lib/Jonah.php:325 +msgid "Tuesday" +msgstr "Marti" + +#: config/templates.php.dist:54 +msgid "Ultracompact" +msgstr "Ultracompact" + +#: templates/channels/edit.inc:20 +msgid "Undo Changes" +msgstr "Anuleaza schimbari" + +#: channels.php:164 templates/channels/subscribe.inc:40 +#: templates/channels/subscribe.inc:41 +msgid "Unsubscribe" +msgstr "Dezabonare" + +#: lib/api.php:119 templates/menu/menu.inc:12 +msgid "Update" +msgstr "Innoire" + +#: templates/backend/backend.inc:11 +msgid "Update All Channels" +msgstr "Innoire toate canalele" + +#: prefs.php:54 +msgid "User Options" +msgstr "Optiuni utilizator" + +#: lib/api.php:96 templates/channels/edit.inc:9 +msgid "View" +msgstr "Vizualizare" + +#: lib/Jonah.php:556 +msgid "View Quote Details" +msgstr "Vizualizare detalii cotatie" + +#: lib/Jonah.php:385 +msgid "Visibility is %s" +msgstr "Vizibilitatea este %s" + +#: lib/Block/metar.php:76 +msgid "Visibility: %s%s" +msgstr "Vizibilitate: %s%s" + +#: content.php:27 +msgid "Weather" +msgstr "Timp probabil" + +#: lib/Block/weather.php:23 lib/api.php:109 +msgid "Weather Forecast" +msgstr "Prognoza vreme" + +#: config/prefs.php.dist:21 +msgid "Weather Station" +msgstr "Statie meteo" + +#: templates/prefs/setlocation.inc:4 templates/prefs/setlocation.inc:60 +msgid "Weather station:" +msgstr "Statie meteo:" + +#: lib/Block/metar.php:113 +msgid "Weather:" +msgstr "Timp probabil:" + +#: lib/Jonah.php:325 +msgid "Wednesday" +msgstr "Miercuri" + +#: lib/api.php:60 +msgid "Which phases?" +msgstr "Care faze?" + +#: lib/Block/metar.php:59 +msgid "Wind: %s%s from %s, gusting to %s%s." +msgstr "Vant: %s%s dinspre %s, inspre %s%s." + +#: lib/Block/metar.php:66 +msgid "Wind: %s%s from %s." +msgstr "Vant: %s%s dinspre %s." + +#: lib/NewsAdmin.php:95 lib/NewsAdmin.php:220 +msgid "Yes" +msgstr "Da" + +#: lib/NewsAdmin.php:129 lib/NewsAdmin.php:202 +msgid "You MUST enter either a URL or a full story." +msgstr "TREBUIE introdus ori un URL ori un articol complet." + +#: channels.php:122 +msgid "You have edited your subscription to the channel %s." +msgstr "Ati editat abonamentul la canalul %s." + +#: content.php:70 +msgid "You have no news subscriptions." +msgstr "Nu aveti nici un abonament de stiri." + +#: lib/Block/stocks.php:30 +msgid "You have no ticker symbols in your portfolio at this time." +msgstr "Nu aveti nici un simbol in portofoliu in acest moment." + +#: content.php:44 +msgid "You have no ticker symbols listed at this time." +msgstr "Nu aveti nici un simbol listat in acest moment." + +#: channels.php:65 +msgid "You have subscribed to the channel %s." +msgstr "Ati fost inscris la canalul %s." + +#: channels.php:100 +msgid "You have unsubscribed from the channel %s." +msgstr "Ati fost dezabonat de la canalul %s." + +#: lib/NewsAdmin.php:120 lib/NewsAdmin.php:189 +msgid "You must enter either a URL or a full story." +msgstr "Trebuie introdus ori un URL ori un articol integral." + +#: config/prefs.php.dist:14 config/prefs.php.dist:20 config/prefs.php.dist:26 +msgid "Your Content" +msgstr "Cuprinsul vostru" + +#: config/prefs.php.dist:8 +msgid "Your Information" +msgstr "Informatii personale" + +#: lib/Jonah.php:362 +msgid "and the wind is %s at %s. " +msgstr "si vantul este %s la %s. " + +#: lib/Jonah.php:368 +msgid "and the wind is %s. " +msgstr "si vantul este %s. " + +#: lib/Jonah.php:359 +msgid "and there is no wind measured. " +msgstr "si nu este nici un vant masurat. " + +#: lib/Jonah.php:329 +msgid "cloudy" +msgstr "noros" + +#: lib/Jonah.php:329 +msgid "cold" +msgstr "rece" + +#: lib/Jonah.php:328 +msgid "dust" +msgstr "praf" + +#: lib/Jonah.php:302 +msgid "error: could not open quote %s cache file for writing." +msgstr "eroare: nu s-a putut deschide fisierul de cotatii pentru scriere." + +#: lib/Jonah.php:297 +msgid "error: could not update quote %s." +msgstr "eroare: nu s-a putut reinnoi cotatia %s." + +#: lib/Jonah.php:307 +msgid "error: write to quote %s cache file failed." +msgstr "eroare: scriere in fisierul de cotatii esuata." + +#: lib/Jonah.php:328 +msgid "flurries" +msgstr "rafale" + +#: lib/Jonah.php:328 +msgid "fog" +msgstr "ceata" + +#: lib/Jonah.php:329 +msgid "haze" +msgstr "ceata" + +#: lib/Jonah.php:327 +msgid "heavy rain" +msgstr "ploaie torentiala" + +#: lib/Jonah.php:401 +msgid "high %s. Use sunscreen" +msgstr "%s inalta(e). Utilizati protectie contra soarelui." + +#: lib/Jonah.php:330 +msgid "hot" +msgstr "fierbinte" + +#: lib/Jonah.php:356 +msgid "humidity is at %s" +msgstr "umiditate este %s" + +#: lib/Jonah.php:387 +msgid "infinite" +msgstr "infinit" + +#: lib/Jonah.php:327 +msgid "light flurries" +msgstr "rafale usoare" + +#: lib/Jonah.php:397 +msgid "low %s" +msgstr "%s scazuta(e)" + +#: lib/Jonah.php:395 +msgid "minimal %s" +msgstr "%s minim(e)" + +#: lib/Jonah.php:399 +msgid "moderate %s" +msgstr "%s moderat(e)" + +#: lib/Jonah.php:329 +msgid "mostly cloudy" +msgstr "mai mult noros" + +#: lib/Jonah.php:330 +msgid "mostly sunny" +msgstr "mai mult insorit" + +#: lib/Jonah.php:366 +msgid "mph" +msgstr "mph" + +#: templates/content/header.inc:6 +msgid "no headlines available at this time" +msgstr "nici un titlu disponibil in acest moment" + +#: lib/Jonah.php:330 +msgid "partly cloudy" +msgstr "partial noros" + +#: lib/Jonah.php:326 +msgid "rain" +msgstr "ploaie" + +#: lib/Jonah.php:327 +msgid "sleet" +msgstr "lapovita" + +#: lib/Jonah.php:329 +msgid "smoke" +msgstr "fum" + +#: lib/Jonah.php:326 +msgid "snow" +msgstr "zapada" + +#: lib/Jonah.php:328 +msgid "snow and wind" +msgstr "viscol" + +#: lib/Jonah.php:330 +msgid "sunny" +msgstr "insorit(a)" + +#: lib/Jonah.php:326 +msgid "thunder storms" +msgstr "furtuna de fulgere" + +#: lib/Jonah.php:403 +msgid "very high %s. Stay indoors" +msgstr "%s foarte ridicata(e). Ramaneti inauntru" + +#: lib/Jonah.php:326 +msgid "windy" +msgstr "vantos(asa)" diff --git a/jonah/po/tr_TR.po b/jonah/po/tr_TR.po new file mode 100644 index 000000000..739342ce1 --- /dev/null +++ b/jonah/po/tr_TR.po @@ -0,0 +1,1027 @@ +# Turkish translations for Jonah. +# Copyright 2002-2009 The Horde Project +# This file is distributed under the same license as the Jonah package. +# horde-tr team , 2008. +# +# story: Haber +msgid "" +msgstr "" +"Project-Id-Version: Jonah 1.0-cvs\n" +"Report-Msgid-Bugs-To: dev@lists.horde.org\n" +"POT-Creation-Date: 2008-04-15 12:57+0300\n" +"PO-Revision-Date: 2008-04-01 10:12+0300\n" +"Last-Translator: A.Ozaygen, O.Kosar, E.sezginer\n" +"Language-Team: i18n@lists.horde.org\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-9\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: lib/Block/news_popular.php:77 lib/Block/news_popular.php:80 +msgid " - Most read stories" +msgstr " - En çok okunan haberler" + +#: lib/Block/delivery.php:48 +#, php-format +msgid "\"%s\" stories in HTML" +msgstr "\"%s\"HTML haberler" + +#: lib/Block/delivery_email.php:53 +#, php-format +msgid "%s by Email" +msgstr "%s Eposta ile" + +#: lists/index.php:121 +#, php-format +msgid "%s to %s of %s" +msgstr "%s'den %s'e, %s üstünden" + +#: lib/News.php:474 +msgid "1 hour" +msgstr "1 saat" + +#: lib/News.php:478 +msgid "12 hours" +msgstr "12 saat" + +#: lib/News.php:475 +msgid "2 hours" +msgstr "2 saat" + +#: lib/News.php:479 +msgid "24 hours" +msgstr "24 saat" + +#: lib/News.php:473 +msgid "30 mins" +msgstr "30 dk" + +#: lib/News.php:476 +msgid "4 hours" +msgstr "4 saat" + +#: lib/News.php:477 +msgid "8 hours" +msgstr "8 saat" + +#: delivery/email.php:97 +#, php-format +msgid "" +"A confirmation message has been sent to %s. Click on the link in that " +"message to finally subscribe to channel \"%s\"." +msgstr "" +"%s'e doðrulama iletisi gönderilmiþtir. Ýleti içindeki baða týklayarak\"%s\" " +"kanalýna abone olabilirsiniz." + +#: stories/share.php:86 +msgid "A link to the story" +msgstr "Habere baðlantý" + +#: channels/aggregate.php:56 +msgid "Add" +msgstr "Ekle" + +#: content.php:34 +msgid "Add Content" +msgstr "Ýçerik Ekle" + +#: lib/Forms/Story.php:37 +msgid "Add New Story" +msgstr "Yeni Haber Ekle" + +#: channels/index.php:71 +msgid "Add story" +msgstr "Haber ekle" + +#: lib/api.php:118 +msgid "Administrator" +msgstr "Yönetici" + +#: lib/News.php:512 lib/Jonah.php:138 +msgid "Aggregated Feed" +msgstr "Toplu Besleme" + +#: channels/aggregate.php:55 +#, php-format +msgid "Aggregated channels for channel \"%s\"" +msgstr "\"%s\" kanalý için toplu kanallar" + +#: channels/delete.php:55 +msgid "All stories created in this channel will be lost!" +msgstr "Bu kanalda yaratýlan tüm haberler kaybolacaktýr!" + +#: stories/results.php:114 +#, php-format +msgid "All stories tagged with %s" +msgstr "Tüm haberler %s olarak iþaretlendi" + +#: channels/index.php:35 +#, php-format +msgid "An error occurred fetching channels: %s" +msgstr "Kanallarý çekerken bir hata oluþtu: %s" + +#: channels/delete.php:57 +msgid "Any cached stories for this channel will be lost!" +msgstr "Bu kanal için önbelleklenmiþ herhangi bir haber silinecektir!" + +#: lib/Forms/Feed.php:83 lib/Forms/Feed.php:94 +msgid "Caching" +msgstr "Önbellekleniyor" + +#: stories/pdf.php:44 +msgid "Cannot generate PDFs of remote stories." +msgstr "Uzaktaki haberin PDFi yaratýlamýyor." + +#: lib/Block/delivery_email.php:87 +msgid "Channel" +msgstr "Kanal" + +#: lib/News/sql.php:510 +#, php-format +msgid "Channel \"%s\" not found." +msgstr "Kanal \"%s\" bulunamýyor." + +#: lists/index.php:130 +msgid "Channel Lists Admin" +msgstr "Kanal Listeleri Yöneticisi" + +#: channels/aggregate.php:58 +msgid "Channel Name" +msgstr "Kanal Ýsmi" + +#: lib/Forms/Feed.php:77 +msgid "" +"Channel URL for further pages, if not the default one. %c gets replaced by " +"the feed ID, %n by the story offset." +msgstr "" +"Öntanýmlý olan deðilse, daha baþka sayfalar için kanalýn URLsi. %c, besleme " +"IDsi %n haber göreli konumu tarafýndan yer deðiþtirilmiþtir." + +#: lib/Forms/Feed.php:112 +msgid "" +"Channel URL if not the default one. %c gets replaced by the feed ID, %n by " +"the story offset." +msgstr "" +"Öntanýmlý olan deðilse kanalýn URLsi. %c, besleme IDsi %n haber göreli " +"konumu tarafýndan yer deðiþtirilmiþtir." + +#: lib/Forms/Feed.php:76 +#, php-format +msgid "Channel URL if not the default one. %c gets replaced by the feed ID." +msgstr "" +"Öntanýmlý olan deðilse kanalýn URLsi. %c, besleme IDsi tarafýndan yer " +"deðiþtirilmiþtir." + +#: channels/delete.php:75 +msgid "Channel has not been deleted." +msgstr "Kanal silinmemiþtir." + +#: lib/News/sql.php:174 +#, php-format +msgid "Channel id \"%s\" not found." +msgstr "Kanal ID \"%s\" bulunamamýþtýr." + +#: stories/index.php:54 +msgid "Channel refreshed." +msgstr "Kanal yenilenmiþtir." + +#: templates/stories/index.html:37 +msgid "Comments" +msgstr "Yorumlar" + +#: config/templates.php.dist:42 +msgid "Compact" +msgstr "Yoðun" + +#: lib/News.php:515 lib/Jonah.php:141 +msgid "Composite Feed" +msgstr "Birleþik Besleme" + +#: lib/Forms/Feed.php:114 +msgid "Composite feeds" +msgstr "Birleþik besleme" + +#: lib/News.php:358 +#, php-format +msgid "Could not deliver to the %s distribution list. %s" +msgstr "%s daðýtým listesine verilemiyor. %s" + +#: lib/Jonah.php:87 +#, php-format +msgid "Could not open %s." +msgstr "%s açýlamýyor." + +#: lib/Block/latest.php:49 +msgid "Count reads of the latest story when this block is displayed" +msgstr "Bu blok gösterildiðinde son haberin kaç kere okunduðunu sayýlýr" + +#: lib/Block/story.php:49 +msgid "Count reads of this story when this block is displayed" +msgstr "Bu blok gösterildiðinde bu haberin kaç kere okunduðunu sayýlýr" + +#: lists/index.php:110 +msgid "Current Recipients" +msgstr "Tanýmlý Alýcýlar" + +#: stories/index.php:136 stories/results.php:116 +msgid "Date" +msgstr "Tarih" + +#: channels/delete.php:50 channels/delete.php:61 stories/delete.php:51 +#: stories/delete.php:56 +msgid "Delete" +msgstr "Sil" + +#: channels/delete.php:47 +#, php-format +msgid "Delete News Channel \"%s\"?" +msgstr "\"%s\" Haber Kanalý Silinsin mi?" + +#: stories/delete.php:47 +#, php-format +msgid "Delete News Story \"%s\"?" +msgstr "\"%s\" Haberi Silinsin mi?" + +#: channels/index.php:49 +msgid "Delete channel" +msgstr "Kanal sil" + +#: lists/index.php:82 +msgid "Delete recipient" +msgstr "Alýcý sil" + +#: stories/index.php:97 stories/results.php:94 +msgid "Delete story" +msgstr "Haber sil" + +#: lists/edit.php:57 lists/edit.php:62 +msgid "Delivery" +msgstr "Teslimat" + +#: channels/index.php:60 +msgid "Delivery lists" +msgstr "Teslimat listeleri" + +#: lists/edit.php:50 +#, php-format +msgid "Delivery of \"%s\" stories" +msgstr "\"%s\" haberlerinin teslimatý" + +#: lib/Forms/Feed.php:75 lib/Forms/Feed.php:93 lib/Forms/Feed.php:111 +msgid "Description" +msgstr "Açýklama" + +#: channels/delete.php:50 stories/delete.php:51 +msgid "Do not delete" +msgstr "Sime" + +#: lib/Forms/Feed.php:40 +msgid "Edit Feed" +msgstr "Besleme Düzenle" + +#: lib/Forms/Story.php:37 +msgid "Edit Story" +msgstr "Haber Düzenle" + +#: lib/Forms/Feed.php:100 +msgid "Edit aggregated feeds" +msgstr "Toplu beslemeleri düzenle" + +#: channels/index.php:44 +msgid "Edit channel" +msgstr "Kanal düzenle" + +#: channels/aggregate.php:25 +#, php-format +msgid "Edit channel \"%s\"" +msgstr "\"%s\" kanalý düzenle" + +#: stories/index.php:92 stories/results.php:87 +msgid "Edit story" +msgstr "Haber düzenle" + +#: lib/Delivery/email.php:180 lib/Delivery/email.php:195 +msgid "Email" +msgstr "Eposta" + +#: delivery/email.php:64 +#, php-format +msgid "Email Delivery for \"%s\"" +msgstr "\"%s\" için eposta teslimi" + +#: lib/Block/delivery_email.php:96 delivery/email.php:78 +msgid "Email address" +msgstr "Eposta adresi" + +#: lib/News.php:554 +#, php-format +msgid "Error fetching feed: %s" +msgstr "Besleme çekmede hata: %s" + +#: stories/pdf.php:15 stories/share.php:66 stories/view.php:25 +#: stories/view.php:35 lib/Block/latest.php:91 lib/Block/story.php:91 +#, php-format +msgid "Error fetching story: %s" +msgstr "Haber çekmede hata: %s" + +#: lib/News.php:793 +#, php-format +msgid "Error parsing external feed from %s: %s" +msgstr "%s'den beslemeyi düzenlemede hata: %s" + +#: lib/api.php:109 +msgid "External Channels" +msgstr "Uzak Kanallar" + +#: lib/News.php:506 lib/Jonah.php:135 +msgid "External Feed" +msgstr "Uzak Besleme" + +#: lib/Forms/Feed.php:51 +msgid "Extra information for this feed type" +msgstr "Bu beleme türü için fazladan bilgi" + +#: lib/Block/news_popular.php:32 lib/Block/news.php:3 lib/Block/news.php:30 +#: lib/Block/story.php:42 +msgid "Feed" +msgstr "Besleme" + +#: lib/News.php:113 +#, php-format +msgid "Feed \"%s\" is not authored on this system." +msgstr "Besleme \"%s\" bu sistemde yazlýmamýþtýr." + +#: channels/edit.php:56 +msgid "Feed type changed." +msgstr "Besleme tipi deðiþti." + +#: channels/index.php:96 lib/Block/delivery.php:3 lib/Block/delivery.php:25 +msgid "Feeds" +msgstr "Beslemeler" + +#: lib/Block/news.php:54 +msgid "First Story" +msgstr "Ýlk Haber" + +#: stories/share.php:78 +msgid "From" +msgstr "Kimden" + +#: lib/Forms/Story.php:74 lib/Forms/Story.php:76 +msgid "Full Story Text" +msgstr "Haberin tam metni" + +#: delivery/html.php:39 +#, php-format +msgid "HTML Delivery for \"%s\"" +msgstr "\"%s\" 'ýn HTML-daðýtýmý " + +#: lib/News.php:693 +msgid "HTML Version of Story" +msgstr "Haber'in HTML-versiyonu" + +#: lib/Block/delivery.php:67 +#, php-format +msgid "Have \"%s\" emailed to you" +msgstr "\"%s\" size e-posta ile gönderildi" + +#: lib/Delivery/email.php:72 lib/Delivery/email.php:75 +msgid "Hello" +msgstr "Merhaba" + +#: lib/Forms/Story.php:82 +msgid "" +"If you enter a URL without a full story text, clicking on the story will " +"send the reader straight to the URL, otherwise it will be shown at the end " +"of the full story." +msgstr "" +"Tam haber metni olmadan bir URL eklerseniz, bu link'e týklamak okuyucuyu " +"direk olarak bu URL'e yönlendirecek, aksi halde bu URL tam haber'in en " +"sonunda gösterilecek." + +#: channels/aggregate.php:61 lib/Forms/Feed.php:87 +msgid "Image" +msgstr "Resim" + +#: stories/share.php:86 +msgid "Include" +msgstr "Ýçer" + +#: config/templates.php.dist:31 +msgid "Internal" +msgstr "Ýç" + +#: lib/api.php:91 +msgid "Internal Channels" +msgstr "Ýç Kanallar" + +#: stories/index.php:43 stories/results.php:49 +#, php-format +msgid "Invalid channel requested. %s" +msgstr "Geçersiz kanal isteði. %s" + +#: channels/delete.php:35 +msgid "Invalid channel specified for deletion." +msgstr "Silmek için geçersiz kanal belirtildi." + +#: lists/edit.php:36 lists/delete.php:37 delivery/html.php:33 +#: delivery/email.php:55 +msgid "Invalid channel." +msgstr "Geçersiz kanal." + +#: lists/delete.php:27 +msgid "Invalid request to delete recipient from delivery list." +msgstr "Alýcýyý daðýtým listesinden silmek için geçersiz istek." + +#: delivery/email.php:69 +msgid "Join this channel" +msgstr "Bu kanal'a katýl" + +#: channels/index.php:91 +msgid "Last Update" +msgstr "Son güncelleme" + +#: lib/Block/latest.php:3 lib/Block/latest.php:65 +msgid "Latest News" +msgstr "Son haberler" + +#: delivery/email.php:70 +msgid "Leave this channel" +msgstr "Bu kanal'ý býrak" + +#: channels/aggregate.php:60 lib/Forms/Feed.php:86 +msgid "Link" +msgstr "Baðlantý" + +#: stories/index.php:128 +msgid "Lists" +msgstr "Listeler" + +#: lib/News.php:509 lib/Jonah.php:132 +msgid "Local Feed" +msgstr "Yerel Besleme" + +#: channels/index.php:90 +msgid "Manage Feeds" +msgstr "Beslemeleri Yönet" + +#: lib/Block/news_popular.php:53 lib/Block/news.php:49 +msgid "Maximum Stories" +msgstr "Maksimum Haber" + +#: config/templates.php.dist:20 +msgid "Media" +msgstr "Medya" + +#: lib/Block/tree_menu.php:3 +msgid "Menu List" +msgstr "Menü listesi" + +#: stories/share.php:87 +msgid "Message" +msgstr "Mesaj" + +#: lists/index.php:125 +msgid "Method" +msgstr "Metod" + +#: lib/News.php:74 +msgid "Missing channel id." +msgstr "Kanal numarasý bulunamadý." + +#: lib/Block/news_popular.php:3 +msgid "Most Popular Stories" +msgstr "En Popüler Haberler " + +#: content.php:31 templates/content/header.inc:2 +msgid "My News" +msgstr "Haberlerim" + +#: content_edit.php:32 +msgid "My News :: Add Content" +msgstr "Haberlerim :: Ýçerik Ekle " + +#: lists/index.php:125 channels/index.php:91 lib/Delivery/email.php:197 +#: lib/Block/delivery_email.php:97 lib/Forms/Feed.php:50 delivery/email.php:83 +msgid "Name" +msgstr "Ad" + +#: lib/Forms/Feed.php:40 +msgid "New Feed" +msgstr "Yeni Besleme" + +#: stories/index.php:122 lib/Block/news_popular.php:86 +msgid "New Story" +msgstr "Yeni Haber" + +#: lists/index.php:106 +msgid "New recipient" +msgstr "Yeni Alýcý" + +#: lib/api.php:90 lib/api.php:108 +msgid "News" +msgstr "Haberler" + +#: lib/Block/delivery_email.php:29 +msgid "News Channel" +msgstr "Haber Kanalý" + +#: lib/Block/latest.php:33 +msgid "News Source" +msgstr "Haber Kaynaðý" + +#: lib/Block/delivery_email.php:3 +msgid "News by Email" +msgstr "E-posta aracýlýðý ile Haber" + +#: lists/index.php:40 channels/index.php:25 +msgid "News is not enabled." +msgstr "Haberler aktif edilemedi." + +#: stories/index.php:51 stories/results.php:57 +msgid "No available stories." +msgstr "Uygun Haber bulunamadý." + +#: lists/index.php:26 stories/index.php:23 +msgid "No channel requested." +msgstr "Kanal isteði yok." + +#: lib/Block/latest.php:86 +msgid "No channel specified." +msgstr "Kanal belirtilmedi." + +#: templates/channels/index.html:41 +msgid "No channels are available." +msgstr "Hiçbir kanal eriþilebilir deðil." + +#: lib/Block/delivery_email.php:67 +msgid "No channels available." +msgstr "Hiçbir kanal eriþilebilir deðil." + +#: lib/Block/news_popular.php:99 lib/Block/news.php:92 +msgid "No feed specified." +msgstr "Hiçbir besleme belirtilmedi." + +#: lib/Block/delivery.php:76 +msgid "No feeds are available." +msgstr "Hiçbir besleme eriþilebilir deðil." + +#: lists/index.php:79 +msgid "No recipients." +msgstr "Alýcý yok." + +#: lib/News.php:584 +msgid "No stories are currently available." +msgstr "Hiçbir haber þu an eriþilebilir deðil." + +#: lib/Block/story.php:86 +msgid "No story is selected." +msgstr "Hiçbir haber seçilmedi." + +#: lib/Delivery.php:215 +#, php-format +msgid "No such action \"%s\" found" +msgstr "Hiçbir \"%s\" iþlemi bulunamadý" + +#: lib/News.php:743 +#, php-format +msgid "No such backend \"%s\" found" +msgstr "Hiçbir \"%s\" arka araç'ý bulunamadý" + +#: stories/results.php:40 +msgid "No tag requested." +msgstr "Hiçbir etiket istenmedi." + +#: stories/delete.php:36 +msgid "No valid story requested for deletion." +msgstr "Silmek için geçerli bir haber yok." + +#: stories/share.php:25 +msgid "Note" +msgstr "Not" + +#: lib/Forms/Story.php:58 +msgid "" +"Note: this story won't be delivered to distribution lists automatically if " +"this time is in the future." +msgstr "" +"Uyarý: belirtilen zaman ileri bir tarihe ait ise bu haber daðýtým " +"listelerine otomatik olarak daðýtýlmayacaktýr." + +#: lib/Forms/Story.php:55 +msgid "Or publish on this date:" +msgstr "Ya da bu tarihte yayýnla:" + +#: stories/index.php:87 stories/results.php:81 +msgid "PDF version" +msgstr "PDF versiyonu" + +#: channels/delete.php:22 +msgid "Permission Denied." +msgstr "Ýzin verilmedi." + +#: lib/News.php:688 +msgid "Plaintext Version of Story" +msgstr "Haberin basit metin versiyonu" + +#: lib/Forms/Story.php:45 +msgid "Publish Now?" +msgstr "Þimdi yayýnla?" + +#: lib/Block/delivery.php:59 +#, php-format +msgid "RSS Feed of \"%s\"" +msgstr "\"%s\" 'in RSS-beslemesi" + +#: templates/stories/index.html:32 +msgid "Read" +msgstr "Oku" + +#: channels/delete.php:53 +msgid "Really delete this News Channel?" +msgstr "Gerçekten bu kanal silinsin mi?" + +#: stories/delete.php:54 +msgid "Really delete this News Story?" +msgstr "Gerçekten bu haber silinsin mi?" + +#: lists/index.php:125 +msgid "Recipient" +msgstr "Alýcý" + +#: lists/edit.php:86 +msgid "Recipient saved." +msgstr "Alýcý kaydedildi." + +#: lists/delete.php:52 +msgid "Recipient successfully removed." +msgstr "Alýcý baþarý ile kaldýrýldý." + +#: stories/index.php:135 +msgid "Refresh Channel" +msgstr "Kanal'ý yenile" + +#: channels/index.php:79 +msgid "Refresh channel" +msgstr "Kanal'ý yenile" + +#: lists/delete.php:54 +msgid "Removal of recipient failed." +msgstr "Alýcýnýn kaldýrýlmasý baþarýsýz." + +#: channels/aggregate.php:26 +#, php-format +msgid "Remove channel \"%s\"" +msgstr "Kanal \"%s\"'ý kaldýr" + +#: delivery/email.php:44 +msgid "Request confirmed." +msgstr "Ýstek onaylandý." + +#: lib/Delivery/email.php:69 +#, php-format +msgid "Request to receive news channel \"%s\"" +msgstr "\"%s\" haber kanallarýný almak için istekte bulun" + +#: lib/Delivery/email.php:74 +#, php-format +msgid "Request to stop receiving news channel \"%s\"" +msgstr "\"%s\" haber kanallarýnýn alýmýný durdurmak için istekte bulun" + +#: lib/Jonah.php:218 +msgid "Rich Text" +msgstr "Rich Text formatý" + +#: lists/edit.php:52 lib/Block/delivery_email.php:82 lib/Forms/Story.php:39 +#: delivery/email.php:66 +msgid "Save" +msgstr "Sakla" + +#: templates/delivery/html.html:13 +msgid "Select a format:" +msgstr "Bir biçim seçiniz:" + +#: stories/share.php:75 +msgid "Send" +msgstr "Gönder" + +#: stories/share.php:84 +msgid "Separate multiple email addresses with commas." +msgstr "Trennen Sie mehrere Emailadressen durch Kommas." + +#: stories/share.php:73 +msgid "Share Story" +msgstr "Haberi Paylaþ" + +#: stories/view.php:87 +msgid "Share this story" +msgstr "Bu haberi paylaþ" + +#: lib/Forms/Story.php:44 +msgid "Short Description" +msgstr "Kýsa Taným" + +#: channels/aggregate.php:59 lib/Forms/Feed.php:85 +msgid "Source URL" +msgstr "Kaynak URL" + +#: lib/Forms/Feed.php:100 +msgid "Source URLs" +msgstr "Kaynak URL ler" + +#: config/templates.php.dist:9 +msgid "Standard" +msgstr "Standard" + +#: templates/stories/index.html:9 +msgid "Stories" +msgstr "Haberler" + +#: stories/results.php:112 delivery/rss.php:58 +#, php-format +msgid "Stories tagged with %s in %s" +msgstr "%s ile iþaretlenmiþ %s içindeki haberler" + +#: stories/index.php:136 stories/results.php:116 lib/Block/story.php:3 +#: lib/Block/story.php:46 lib/Block/story.php:65 +msgid "Story" +msgstr "Haber" + +#: lib/News.php:764 +#, php-format +msgid "Story \"%s\" not found in \"%s\"." +msgstr "Haber \"%s\", \"%s\" içerisinde bulunamadý." + +#: stories/share.php:109 +msgid "Story Link" +msgstr "Haber Baðý" + +#: lib/Forms/Story.php:43 +msgid "Story Title (Headline)" +msgstr "Haber Baþlýðý(Manþet)" + +#: lib/Forms/Story.php:82 +msgid "Story URL" +msgstr "Haber URL i" + +#: lib/News/sql.php:456 +#, php-format +msgid "Story URL \"%s\" not found." +msgstr "Haber URL I \"%s\" bulunamadý." + +#: lib/Forms/Feed.php:78 lib/Forms/Feed.php:113 +#, php-format +msgid "" +"Story URL if not the default one. %c gets replaced by the feed ID, %s by the " +"story ID." +msgstr "" +"Haber URL i -öntanýmlý olan deðilse- %c besleme numarasý ile, %s ise haber " +"numarasý ile deðiþtirilir." + +#: lib/Forms/Story.php:61 +msgid "Story body type" +msgstr "Haber gövde tipi" + +#: stories/edit.php:34 +#, php-format +msgid "Story editing failed: %s" +msgstr "Haber düzenleme baþarýsýz oldu: %s" + +#: stories/delete.php:71 +msgid "Story has not been deleted." +msgstr "Haber silinmedi." + +#: lib/News/sql.php:424 +#, php-format +msgid "Story id \"%s\" not found." +msgstr "Haber numarasý \"%s\" bulunamadý." + +#: stories/share.php:85 +msgid "Subject" +msgstr "Konu" + +#: lib/News.php:363 +#, php-format +msgid "Successfully delivered to the %s distribution list." +msgstr "%s daðýtým listesine baþarýyla iletildi." + +#: lib/Block/cloud.php:3 lib/Block/cloud.php:24 +msgid "Tag Cloud" +msgstr "Ýþaret Bulutu" + +#: lib/News.php:834 lib/News.php:839 lib/News.php:844 lib/News.php:850 +#: lib/News.php:855 +msgid "Tag support not enabled in backend." +msgstr "Arka araçta iþaretleme desteði faal faal deðil." + +#: lib/Forms/Story.php:79 +msgid "Tags" +msgstr "Ýþaretler" + +#: lib/Block/story.php:105 templates/stories/story.html:6 +msgid "Tags: " +msgstr "Ýþaretler: " + +#: lib/Jonah.php:225 +msgid "Text" +msgstr "Metin" + +#: channels/aggregate.php:95 +#, php-format +msgid "The channel \"%s\" has been removed." +msgstr "Kanal \"%s\" silindi." + +#: channels/aggregate.php:76 +#, php-format +msgid "The channel \"%s\" has been saved." +msgstr "Kanal \"%s\" saklandý." + +#: channels/aggregate.php:84 channels/aggregate.php:102 +#, php-format +msgid "The channel \"%s\" has been updated." +msgstr "Kanal \"%s\" güncellendi." + +#: channels/delete.php:68 +msgid "The channel has been deleted." +msgstr "Kanal silindi." + +#: stories/share.php:86 +msgid "The complete text of the story" +msgstr "Haberin tam metni" + +#: channels/edit.php:70 +#, php-format +msgid "The feed \"%s\" has been saved." +msgstr "Besleme \"%s\" saklandý." + +#: lib/Forms/Feed.php:94 +msgid "" +"The interval before stories aggregated into this feeds are rechecked for " +"updates. If none, then stories will always be refetched from the sources." +msgstr "" +"Haberlerin, bu beslemede toplanmadan önce, güncellemeler için tekrar kontrol " +"sýklýðý. Belirtilmezse, haberler her zaman kaynaktan yeniden çekilecektir." + +#: lib/Forms/Feed.php:83 +msgid "" +"The interval before stories in this feed are rechecked for updates. If none, " +"then stories will always be refetched from the source." +msgstr "" +"Bu beslemedeki haberlerin güncellemeler için tekrar kontrol sýklýðý." +"Belirtilmezse, haberler her zaman kaynaktan yeniden çekilecektir." + +#: stories/edit.php:63 +#, php-format +msgid "The story \"%s\" has been saved." +msgstr "Haber \"%s\" saklandý." + +#: stories/delete.php:63 +msgid "The story has been deleted." +msgstr "Haber silindi." + +#: stories/share.php:120 +msgid "The story was sent successfully." +msgstr "Haber baþarýyla gönderildi." + +#: channels/aggregate.php:59 lib/Forms/Feed.php:85 +msgid "" +"The url to use to fetch the stories, for example 'http://www.example.com/" +"stories.rss'" +msgstr "" +"Haberleri çekmek için kullanýlacak url. Örneðin 'http://www.example.com/" +"stories.rss'." + +#: channels/delete.php:66 +#, php-format +msgid "There was an error deleting the channel: %s" +msgstr "Kanalý silerken bir hata oluþtu: %s" + +#: stories/delete.php:61 +#, php-format +msgid "There was an error deleting the story: %s" +msgstr "Haberi silerken bir hata oluþtu: %s" + +#: channels/aggregate.php:93 +#, php-format +msgid "There was an error removing the channel: %s" +msgstr "Kanal silinirken bir hata oluþtur: %s" + +#: channels/aggregate.php:74 +#, php-format +msgid "There was an error saving the channel: %s" +msgstr "Kanal saklanýrken bir hata oluþtu: %s" + +#: channels/edit.php:68 +#, php-format +msgid "There was an error saving the feed: %s" +msgstr "Besleme saklanýrken bir hata oluþtu: %s" + +#: stories/edit.php:61 +#, php-format +msgid "There was an error saving the story: %s" +msgstr "Haberi saklarken bir hata oluþtu: %s" + +#: channels/aggregate.php:82 channels/aggregate.php:100 +#, php-format +msgid "There was an error updating the channel: %s" +msgstr "Kanal güncellenirken bir hata oluþtu: %s" + +#: lib/Delivery/email.php:181 +msgid "" +"This driver allows the delivery of news stories via email to one or more " +"recipients." +msgstr "" +"Bu sürücü, haberlerin bir ya da birden fazla alýcýya, eposta aracýlýðý ile " +"ulaþtýrýlmasýný saðlar. " + +#: channels/aggregate.php:43 +msgid "This is no aggregated channel." +msgstr "Toplanmýþ kanal yok." + +#: stories/share.php:84 +msgid "To" +msgstr "Kime" + +#: channels/index.php:91 lib/Forms/Feed.php:45 +msgid "Type" +msgstr "Tip" + +#: config/templates.php.dist:53 +msgid "Ultracompact" +msgstr "Çok yoðun" + +#: delivery/email.php:42 +#, php-format +msgid "Unable to confirm request." +msgstr "Talep doðrulanamadý." + +#: stories/share.php:118 +#, php-format +msgid "Unable to send story: %s" +msgstr "Haber gönderilemedi: %s" + +#: channels/aggregate.php:107 +msgid "Update" +msgstr "Güncelle" + +#: lib/Block/news_popular.php:45 lib/Block/news.php:41 +msgid "View" +msgstr "Görünüm" + +#: delivery/email.php:67 +msgid "What do you want to do?" +msgstr "Ne yapmak istiyorsunuz?" + +#: lists/index.php:34 lists/edit.php:44 lists/delete.php:45 +#: channels/aggregate.php:50 channels/index.php:19 channels/edit.php:43 +#: stories/index.php:31 stories/edit.php:42 stories/delete.php:22 +#: stories/results.php:24 +msgid "You are not authorised for this action." +msgstr "Bu eylem için yetkili deðilsiniz." + +#: channels/edit.php:72 +msgid "You can now edit the sub-feeds." +msgstr "Þimdi alt beslemeleri düzenleyebilirsiniz." + +#: lib/Delivery/email.php:72 +#, php-format +msgid "" +"You have requested to receive \"%s\" stories by email. Click on this link to " +"confirm the request: %s" +msgstr "" +"\"%s\" haberlerini eposta ile almayý talep ettiniz. Talebi onaylamak için " +"linki týklayýnýz: %s" + +#: lib/Delivery/email.php:75 +#, php-format +msgid "" +"You have requested to stop receiving \"%s\" stories by email. Click on this " +"link to confirm the request: %s" +msgstr "" +"\"%s\" haberlerini eposta ile almayý durdurma talebinde bulundunuz. Talebi " +"onaylamak için linki týklayýnýz: %s" + +#: lib/Delivery.php:272 +msgid "You must configure a Horde Datatree backend to use Jonah." +msgstr "" +"Haberleri kullanmak için bir Horde Veri Aðacý arka aracý yapýlandýrmalýsýnýz." + +#: lib/News.php:806 +msgid "[No title]" +msgstr "[Baþlýksýz]" + +#: lib/Jonah.php:266 +msgid "_Feeds" +msgstr "_Besleme" + +#: lib/Jonah.php:262 +msgid "_My News" +msgstr "_Haberlerim" + +#: lib/Jonah.php:267 +msgid "_New Feed" +msgstr "_Yeni Besleme" + +#: lib/News.php:472 +msgid "none" +msgstr "hiçbiri" diff --git a/jonah/po/zh_TW.po b/jonah/po/zh_TW.po new file mode 100644 index 000000000..e4d3f3b43 --- /dev/null +++ b/jonah/po/zh_TW.po @@ -0,0 +1,1226 @@ +# Chinese translations for Jonah package. +# Copyright 2003-2009 The Horde Project +# This file is distributed under the same license as the Jonah package. +# Automatically generated, 2003. +# +msgid "" +msgstr "" +"Project-Id-Version: Jonah 0.0.3-cvs\n" +"POT-Creation-Date: 2003-06-15 11:23+0800\n" +"PO-Revision-Date: 2003-06-15 11:23+0800\n" +"Last-Translator: \n" +"Language-Team: Traditional Chinese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=BIG5\n" +"Content-Transfer-Encoding: 8bit\n" + +#: lib/Jonah.php:217 +#, c-format +msgid " and the UV index is a %s. " +msgstr " ¦P®Éµµ¥~½u«ü¼Æ¬O %s." + +#: lib/Block/metar.php:105 +#, c-format +msgid " at %s %s" +msgstr "" + +#: lib/Jonah.php:201 +msgid " km" +msgstr "¤½¨½" + +#: lib/Jonah.php:176 +msgid " km/h" +msgstr "¤½¨½/¤p®É" + +#: lib/Jonah.php:202 +msgid " miles" +msgstr "­^­ù" + +#: lib/Jonah.php:156 +#, c-format +msgid "%s at %s" +msgstr "" + +#: newsfeed.php:41 +#, c-format +msgid "'%s' stories in XML" +msgstr "%s XML ®æ¦¡¤å³¹" + +#: lib/News.php:216 +msgid "1 hour" +msgstr "1 ¤p®É" + +#: lib/News.php:220 +msgid "12 hours" +msgstr "12 ¤p®É" + +#: lib/News.php:217 +msgid "2 hours" +msgstr "2 ¤p®É" + +#: lib/News.php:221 +msgid "24 hours" +msgstr "24 ¤p®É" + +#: lib/News.php:215 +msgid "30 mins" +msgstr "30 ¤ÀÄÁ" + +#: lib/News.php:218 +msgid "4 hours" +msgstr "4 ¤p®É" + +#: lib/Jonah.php:223 +msgid "5-Day Forecast" +msgstr "5 ¤Ñ¹w³ø" + +#: stockquote.php:93 +msgid "52-week high" +msgstr "52 ¶g°ªÂI" + +#: stockquote.php:97 +msgid "52-week low" +msgstr "52 ¶g§CÂI" + +#: lib/News.php:219 +msgid "8 hours" +msgstr "8 ¤p®É" + +#: lib/Form/EditChannel.php:33 +msgid "Add New Channel" +msgstr "·s¼WÀW¹D" + +#: lib/Form/EditStory.php:31 +msgid "Add New Story" +msgstr "·s¼W¤å³¹" + +#: lib/Form/DeleteChannel.php:37 +msgid "All stories created in this channel will be lost!" +msgstr "©Ò¦³¥»ÀW¹D¤¤ªº¤å³¹±N·|¬y¥¢!" + +#: news/index.php:40 +#, c-format +msgid "An error occurred fetching channels: %s" +msgstr "§ì¨úÀW¹D¤º®e®Éµo¥Í¿ù»~: %s" + +#: lib/Form/DeleteChannel.php:39 +msgid "Any cached stories for this channel will be lost!" +msgstr "©Ò¦³¥»ÀW¹Dªº¼È¦s¤å³¹±N·|¬y¥¢!" + +#: news/index.php:85 +msgid "Available Channels" +msgstr "¥i¿ï¾ÜªºÀW¹D" + +#: newsfeed.php:28 +#, c-format +msgid "Available Channels from %s (%s)" +msgstr "¨Ó¦Û %s ªºÀW¹D (%s)" + +#: lib/Jonah.php:190 +#, c-format +msgid "Barometer shows %s. " +msgstr "®ðÀ£¬O %s. " + +#: lib/Form/EditChannel.php:58 +msgid "Caching" +msgstr "§Ö¨ú" + +#: stockquote.php:57 templates/channels/column_headers.inc:13 +#: lib/Jonah.php:303 +msgid "Change" +msgstr "­×§ï" + +#: stockquote.php:71 +msgid "Change %" +msgstr "º¦¶^´T %" + +#: config/prefs.php.dist:19 +msgid "Change the location for which weather is obtained." +msgstr "­×§ï¨ú±o®ð¶H¸ê®Æªº¦ì§}" + +#: config/prefs.php.dist:31 +msgid "Change your content display options." +msgstr "­×§ï§Aªº¤º®eÅã¥Ü¤è¦¡" + +#: news/stories.php:103 +#, c-format +msgid "Channel '%s'" +msgstr "ÀW¹D '%s'" + +#: lib/News.php:88 +#, c-format +msgid "Channel '%s' is not an internally authored channel." +msgstr "ÀW¹D '%s' ¨Ã¤£¬O¤º³¡³\¥iªºÀW¹D." + +#: content.php:15 +msgid "Channel Listing" +msgstr "ÀW¹D¦Cªí" + +#: templates/channels/column_headers.inc:7 lib/Form/EditChannel.php:43 +msgid "Channel Name" +msgstr "ÀW¹D¦WºÙ" + +#: channels.php:132 +msgid "Channel Subscriptions" +msgstr "­q¾\ÀW¹D" + +#: channels.php:125 +msgid "Channel display failed." +msgstr "ÀW¹DÅã¥Ü¥¢±Ñ." + +#: news/deletechannel.php:68 +msgid "Channel has not been deleted." +msgstr "ÀW¹D¨Ã¥¼³Q§R°£." + +#: lib/News/sql.php:165 +#, c-format +msgid "Channel id '%s' not found." +msgstr "§ä¤£¨ìÀW¹D¥N¸¹ '%s'" + +#: news/stories.php:56 +msgid "Channel refreshed." +msgstr "ÀW¹D¤º®e¤w§ó·s." + +#: channels.php:85 +msgid "Channel subscription editing failed." +msgstr "­q¾\ÀW¹D½s¿è¥¢±Ñ." + +#: channels.php:41 +msgid "Channel subscription failed." +msgstr "­q¾\ÀW¹D¥¢±Ñ." + +#: news/editchannel.php:59 +msgid "Channel type changed." +msgstr "ÀW¹D«¬ºA¤w§ïÅÜ." + +#: channels.php:72 +msgid "Channel unsubscription failed." +msgstr "¨ú®ø­q¾\ÀW¹D¥¢±Ñ." + +#: lib/Jonah.php:303 +msgid "Chart" +msgstr "¨«¶Õ¹Ï" + +#: config/prefs.php.dist:13 +msgid "Choose which news channels you are subscribed to." +msgstr "¿ï¾Ü§A­n·s­q¾\ªºÀW¹D." + +#: lib/Block/metar.php:103 +#, c-format +msgid "Clouds: %s" +msgstr "" + +#: config/templates.php.dist:36 +msgid "Compact" +msgstr "²¼ä" + +#: lib/Weather/intercept.php:95 +msgid "Could not find XML parser handle." +msgstr "µLªk§ä¨ì¥i¥H³B²zªº XML ¸ÑªR¾¹." + +#: lib/Stocks/nasdaq.php:98 +msgid "Could not find xml parser handle." +msgstr "µLªk§ä¨ì¥i¥H³B²zªº XML ¸ÑªR¾¹." + +#: lib/Jonah.php:72 +#, c-format +msgid "Could not open %s." +msgstr "µLªk¶}±Ò %s." + +#: lib/api.php:57 +msgid "Current Phase" +msgstr "¥Ø«e¬ÕÁ«" + +#: lib/api.php:68 lib/Block/metar.php:25 +msgid "Current Weather" +msgstr "¥Ø«e¤Ñ®ð" + +#: lib/Block/metar.php:47 lib/Block/metar.php:49 +#, c-format +msgid "Current Weather for: %s" +msgstr "¥Ø«e¤Ñ®ð¦b: %s" + +#: news/deletechannel.php:52 news/deletestory.php:53 +#: lib/Form/DeleteChannel.php:32 lib/Form/DeleteStory.php:32 +msgid "Delete" +msgstr "§R°£" + +#: lib/Form/DeleteChannel.php:29 +#, c-format +msgid "Delete News Channel '%s'?" +msgstr "§R°£·s»DÀW¹D '%s'?" + +#: lib/Form/DeleteStory.php:29 +#, c-format +msgid "Delete News Story '%s'?" +msgstr "§R°£·s»D¤å³¹ '%s'?" + +#: news/stories.php:82 +msgid "Delete story" +msgstr "§R°£¤å³¹" + +#: lib/Form/EditChannel.php:54 +msgid "Description" +msgstr "´y­z" + +#: config/templates.php.dist:9 +msgid "Detailed" +msgstr "²Ó¸`" + +#: config/prefs.php.dist:30 +msgid "Display Options" +msgstr "Åã¥Ü¿ï¶µ" + +#: lib/Form/DeleteChannel.php:32 lib/Form/DeleteStory.php:32 +msgid "Do not delete" +msgstr "¨ú®ø§R°£" + +#: stockquote.php:117 +msgid "Earnings" +msgstr "¬Õ¾l" + +#: templates/channels/column_headers.inc:15 +#: templates/channels/subscribe.inc:56 +msgid "Edit" +msgstr "½s¿è" + +#: lib/Form/EditChannel.php:33 +msgid "Edit Channel" +msgstr "½s¿èÀW¹D" + +#: templates/channels/header.inc:3 +msgid "Edit Channel Subscriptions" +msgstr "½s¿èÀW¹D­q¾\³]©w" + +#: stockquote.php:149 +msgid "Edit My Portfolio" +msgstr "½s¿è§Úªº§ë¸ê²Õ¦X" + +#: lib/Form/EditStory.php:31 +msgid "Edit Story" +msgstr "½s¿è¤å³¹" + +#: templates/channels/subscribe.inc:56 +msgid "Edit Subscription Details" +msgstr "½s¿è­q¾\¸ê®Æ²Ó¸`" + +#: newsfeed.php:35 +#, c-format +msgid "Edit channel '%s'" +msgstr "½s¿èÀW¹D '%s'" + +#: news/stories.php:77 +msgid "Edit story" +msgstr "½s¿è¤å³¹" + +#: templates/channels/edit.inc:5 +#, c-format +msgid "Editing Channel %s" +msgstr "½s¿èÀW¹D %s" + +#: lib/Jonah.php:130 +msgid "" +"Either no weather data is available for the location you have selected, or " +"you have not selected a valid location." +msgstr "¥i¯à¥Ø«e¨S¦³§A©Ò¿ï¾Ü¦ì¸mªº¤Ñ®ð¸ê®Æ, ©Î¬O§AÁÙ¨S¿ï¨ú¦³®Äªº¦ì¸m." + +#: templates/prefs/portfolio_select.inc:1 +msgid "" +"Enter NASDAQ/AMEX/NYSE ticker symbols to watch, and the number of shares you " +"own, if any:" +msgstr "¿é¤J­n¬d¬Ýªº NASDAQ/AMEX/NYSE ªÑ²¼¥N¸¹, ¥H¤Î§A©Ò¾Ö¦³ªºªÑ²¼±i¼Æ:" + +#: lib/News.php:281 +#, c-format +msgid "Error fetching channel. %s" +msgstr "§ì¨úÀW¹Dµo¥Í¿ù»~. %s" + +#: newsfeed.php:58 +#, c-format +msgid "Error fetching story: %s" +msgstr "§ì¨ú¤å³¹µo¥Í¿ù»~: %s" + +#: lib/Jonah.php:383 +msgid "External" +msgstr "¥~³¡ªº" + +#: lib/Form/EditChannel.php:44 +msgid "Extra information for this channel type" +msgstr "¦¹ÃþÀW¹D«¬ºAªºÃB¥~¸ê°T" + +#: lib/Block/moon.php:143 +msgid "First Half" +msgstr "¤W¥b¤ë" + +#: lib/Block/moon.php:53 lib/Block/moon.php:55 +msgid "First Quater" +msgstr "¤W©¶¤ë" + +#: lib/Jonah.php:133 +msgid "Friday" +msgstr "¶g¤­" + +#: lib/Block/moon.php:61 +msgid "Full Moon" +msgstr "º¡¤ë" + +#: lib/Form/EditStory.php:39 +msgid "Full Story Text" +msgstr "¥þ³¡¤å³¹¤º®e" + +#: lib/Block/moon.php:153 +msgid "Full moon" +msgstr "º¡¤ë" + +#: content.php:69 lib/api.php:83 +msgid "Headlines" +msgstr "ÀY±ø®ø®§" + +#: templates/menu/menu.inc:24 +msgid "Help" +msgstr "¨D§U" + +#: lib/api.php:59 +msgid "Hemisphere:" +msgstr "«n¥_¥b²y:" + +#: config/prefs.php.dist:54 +msgid "How many columns would you like to use to show headlines?" +msgstr "§A­n¨Ï¥Î´XÄæ¨ÓÅã¥ÜÀY±ø·s»D?" + +#: lib/Form/EditChannel.php:62 +msgid "Image" +msgstr "¹Ï¥Ü" + +#: lib/Jonah.php:380 +msgid "Internal" +msgstr "¤º³¡ªº" + +#: news/stories.php:46 +#, c-format +msgid "Invalid channel requested. %s" +msgstr "­n¨DªºÀW¹D¬OµL®Äªº. %s" + +#: lib/Jonah.php:184 +#, c-format +msgid "It feels like %s. " +msgstr "·Pı¹³¬O %s." + +#: templates/index/notconfigured.inc:4 +msgid "Jonah is not properly configured" +msgstr "Jonah ©|¥¼³]©w" + +#: config/prefs.php.dist:6 +msgid "Language" +msgstr "»y¨¥" + +#: lib/Block/moon.php:146 +msgid "Last Half" +msgstr "¤U¥b¤ë" + +#: lib/Block/moon.php:67 lib/Block/moon.php:69 +msgid "Last Quater" +msgstr "¤U©¶¤ë" + +#: newsfeed.php:46 news/index.php:86 +msgid "Last Update" +msgstr "¤W¦¸§ó·s" + +#: templates/channels/column_headers.inc:10 +msgid "Last Updated" +msgstr "¤W¦¸§ó·s" + +#: lib/Block/metar.php:54 +#, c-format +msgid "Last Updated: %s" +msgstr "¤W¦¸§ó·s: %s" + +#: stockquote.php:121 +msgid "Last dividend" +msgstr "¤W¦¸°£Åv" + +#: stockquote.php:126 +msgid "Last dividend date" +msgstr "¤W¦¸°£Åv¤é´Á" + +#: stockquote.php:53 +msgid "Last price" +msgstr "³Ìªñ¦¨¥æ»ù" + +#: stockquote.php:18 +#, c-format +msgid "Latest Data for %s" +msgstr "%s ³Ì·sªº¸ê®Æ" + +#: lib/api.php:41 +msgid "Latitude" +msgstr "½n«×" + +#: lib/Form/EditChannel.php:61 +msgid "Link" +msgstr "³sµ²" + +#: templates/index/notconfigured.inc:51 +msgid "List of METAR weather stations." +msgstr "®ð¶H¯¸¦Cªí" + +#: lib/api.php:69 +msgid "Location" +msgstr "¦ì¸m" + +#: stockquote.php:49 +msgid "Market Center" +msgstr "" + +#: stockquote.php:139 +msgid "Market cap" +msgstr "¸ê¥»ÃB" + +#: lib/News.php:52 +msgid "Missing channel id." +msgstr "¿ò¥¢ÀW¹D¥N¸¹." + +#: lib/Jonah.php:133 +msgid "Monday" +msgstr "¶g¤@" + +#: lib/api.php:52 lib/Block/moon.php:19 +msgid "Moon Phases" +msgstr "¤ë«G¬ÕÁ«" + +#: templates/menu/menu.inc:6 +msgid "My Content" +msgstr "§Úªº·s»D¤º®e" + +#: stockquote.php:18 stockquote.php:149 +msgid "My Portfolio" +msgstr "§Úªº§ë¸ê²Õ¦X" + +#: newsfeed.php:46 stockquote.php:37 news/index.php:86 lib/Jonah.php:303 +msgid "Name" +msgstr "¦WºÙ" + +#: lib/Block/moon.php:47 +msgid "New Moon" +msgstr "·s¤ë" + +#: news/index.php:81 +msgid "New channel" +msgstr "·sÀW¹D" + +#: lib/Block/moon.php:31 lib/Block/moon.php:151 +msgid "New moon" +msgstr "·s¤ë" + +#: lib/Block/news.php:43 config/prefs.php.dist:12 +msgid "News" +msgstr "·s»D" + +#: templates/menu/menu.inc:15 +msgid "News Admin" +msgstr "·s»DºÞ²z" + +#: templates/menu/menu.inc:12 +msgid "News Feed" +msgstr "·s»D¨Ó·½" + +#: news/index.php:28 +msgid "News is not enabled." +msgstr "·s»D¥\¯à¨Ã¥¼¶}±Ò." + +#: lib/api.php:58 +msgid "Next Phase" +msgstr "" + +#: newsfeed.php:43 news/index.php:75 +msgid "No Data" +msgstr "¨S¦³¸ê®Æ" + +#: news/index.php:38 +msgid "No available channels." +msgstr "¨S¦³ÀW¹D." + +#: news/stories.php:53 +msgid "No available stories." +msgstr "¨S¦³¤å³¹." + +#: news/stories.php:31 +msgid "No channel requested." +msgstr "¨S¦³­n¨DªºÀW¹D." + +#: lib/Block/news.php:53 +msgid "No channel specified." +msgstr "¨S¦³«ü©wªºÀW¹D." + +#: lib/News/sql.php:319 +msgid "No configuration information specified for SQL News Stories." +msgstr "¨S¦³ SQL ·s»D¤å³¹ªº³]©w¸ê®Æ." + +#: lib/Weather/sql.php:201 +msgid "No configuration information specified for SQL Preferences." +msgstr "¨S¦³ SQL °¾¦nªº³]©w¸ê®Æ." + +#: lib/Block/sunrise.php:29 +msgid "No location is set." +msgstr "¦ì¸m¸ê°T©|¥¼³]©w" + +#: lib/News.php:285 +msgid "No stories currently available." +msgstr "¥Ø«e¨S¦³¤å³¹." + +#: lib/News.php:326 lib/Stocks.php:137 +#, c-format +msgid "No such backend '%s' found" +msgstr "¨S¦³¦¹«áºÝ¥­¥x '%s'" + +#: news/deletechannel.php:39 +msgid "No valid channel requested for deletion." +msgstr "¨S¦³¥¿½TªºÀW¹D¥i¨Ñ§R°£." + +#: news/deletestory.php:40 +msgid "No valid story requested for deletion." +msgstr "¨S¦³¥¿½Tªº¤å³¹¥i¨Ñ§R°£." + +#: lib/api.php:62 +msgid "Northern Hemisphere" +msgstr "¥_¥b²y" + +#: templates/menu/menu.inc:19 +msgid "Options" +msgstr "¿ï¶µ" + +#: config/prefs.php.dist:29 +msgid "Other Options" +msgstr "¨ä¥L¿ï¶µ" + +#: stockquote.php:109 +msgid "P-E ratio" +msgstr "¥»¯q¤ñ" + +#: templates/prefs/setlocation.inc:27 +msgid "Please select a Country/State..." +msgstr "½Ð¿ï¾Ü°ê®a/¬Ù¥÷..." + +#: templates/prefs/setlocation.inc:40 +msgid "Please select a station..." +msgstr "½Ð¿ï¾Ü¤@­Ó®ð¶H¯¸..." + +#: templates/menu/menu.inc:8 +msgid "Portfolio" +msgstr "§ë¸ê²Õ¦X" + +#: lib/Block/metar.php:94 +#, c-format +msgid "Pressure: %s%s" +msgstr "®ðÀ£: %s%s" + +#: stockquote.php:101 +msgid "Previous close" +msgstr "¬Q¦¬" + +#: lib/Jonah.php:303 +msgid "Price" +msgstr "ªÑ»ù" + +#: stockquote.php:135 +msgid "Quote date" +msgstr "³ø»ù¤é´Á" + +#: lib/Jonah.php:122 lib/Jonah.php:125 +msgid "Radar" +msgstr "½Ã¬P¶³¹Ï" + +#: lib/Form/DeleteChannel.php:35 +msgid "Really delete this News Channel?" +msgstr "½T©w§R°£¦¹·s»DÀW¹D?" + +#: lib/Form/DeleteStory.php:35 +msgid "Really delete this News Story?" +msgstr "½T©w§R°£¦¹·s»D¤å³¹?" + +#: lib/News/sql.php:337 +msgid "Required 'charset' not specified in news stories configuration." +msgstr "¥²¶ñÄæ¦ì 'charset' ¨Ã¥¼¦b·s»D¤å³¹³]©w¤¤«ü©w." + +#: lib/News/sql.php:334 +msgid "Required 'database' not specified in news stories configuration." +msgstr "¥²¶ñÄæ¦ì 'database' ¨Ã¥¼¦b·s»D¤å³¹³]©w¤¤«ü©w." + +#: lib/Weather/sql.php:216 +msgid "Required 'database' not specified in preferences configuration." +msgstr "¥²¶ñÄæ¦ì '¸ê®Æ®w' ¨Ã¥¼¦b°¾¦n³]©w¤¤«ü©w." + +#: lib/News/sql.php:325 +msgid "Required 'hostspec' not specified in news stories configuration." +msgstr "¥²¶ñÄæ¦ì 'hostspec' ¨Ã¥¼¦b·s»D¤å³¹³]©w¤¤«ü©w." + +#: lib/Weather/sql.php:207 +msgid "Required 'hostspec' not specified in preferences configuration." +msgstr "¥²¶ñÄæ¦ì 'hostspec' ¨Ã¥¼¦b°¾¦n³]©w¤¤«ü©w." + +#: lib/News/sql.php:331 +msgid "Required 'password' not specified in news stories configuration." +msgstr "¥²¶ñÄæ¦ì 'password' ¨Ã¥¼¦b·s»D¤å³¹³]©w¤¤«ü©w." + +#: lib/Weather/sql.php:213 +msgid "Required 'password' not specified in preferences configuration." +msgstr "¥²¶ñÄæ¦ì 'password' ¨Ã¥¼¦b°¾¦n³]©w¤¤«ü©w." + +#: lib/News/sql.php:322 +msgid "Required 'phptype' not specified in news stories configuration." +msgstr "¥²¶ñÄæ¦ì 'phptype' ¨Ã¥¼¦b·s»D¤å³¹³]©w¤¤«ü©w." + +#: lib/Weather/sql.php:204 +msgid "Required 'phptype' not specified in preferences configuration." +msgstr "¥²¶ñÄæ¦ì 'phptype' ¨Ã¥¼¦b°¾¦n³]©w¤¤«ü©w." + +#: lib/News/sql.php:328 +msgid "Required 'username' not specified in news stories configuration." +msgstr "¥²¶ñÄæ¦ì 'username' ¨Ã¥¼¦b·s»D¤å³¹³]©w¤¤«ü©w." + +#: lib/Weather/sql.php:210 +msgid "Required 'username' not specified in preferences configuration." +msgstr "¥²¶ñÄæ¦ì 'username' ¨Ã¥¼¦b·s»D¤å³¹³]©w¤¤«ü©w." + +#: stockquote.php:131 +msgid "S&P 500 beta" +msgstr "" + +#: lib/Jonah.php:133 +msgid "Saturday" +msgstr "¶g¤»" + +#: lib/Form/EditStory.php:33 +msgid "Save" +msgstr "Àx¦s" + +#: config/prefs.php.dist:40 +msgid "Select your preferred language:" +msgstr "¿ï¾Ü§Aªº°¾¦n»y¨¥: " + +#: config/prefs.php.dist:7 +msgid "Set the your preferred display language." +msgstr "¿ï¾Ü°¾¦nÅã¥Ü»y¨t." + +#: config/prefs.php.dist:25 +msgid "Set which stock ticker symbols to watch." +msgstr "³]©w­n°lÂܪºªÑ²¼¥N½X." + +#: templates/prefs/portfolio_select.inc:6 +msgid "Shares" +msgstr "ªÑ¼Æ" + +#: lib/Form/EditStory.php:37 +msgid "Short Description" +msgstr "²µu´y­z" + +#: config/prefs.php.dist:83 +msgid "Should measurements be shown in metric values?" +msgstr "­n¥Î¤Q¶i¦ì¨î¨ÓÅã¥Ü¸ê®Æ¶Ü?" + +#: config/prefs.php.dist:117 +msgid "Show Dow Jones Industrial Average?" +msgstr "Åã¥Ü¹Dã¤u·~«ü¼Æ?" + +#: config/prefs.php.dist:133 +msgid "Show Nasdaq Composite Index?" +msgstr "Åã¥Ü Nasdaq «ü¼Æ?" + +#: config/prefs.php.dist:125 +msgid "Show S&P 500?" +msgstr "Åã¥Ü S&P 500 «ü¼Æ?" + +#: config/prefs.php.dist:69 +msgid "Show headlines in main content display?" +msgstr "¦b¥D­n¤º®e¤¤Åã¥ÜÀY±ø®ø®§?" + +#: config/prefs.php.dist:76 +msgid "Show stock quotes in main content display?" +msgstr "¦b¥D­n¤º®e¤¤Åã¥ÜªÑ¥«¦æ±¡?" + +#: config/prefs.php.dist:62 +msgid "Show weather in main content display?" +msgstr "¦b¥D­n¤º®e¤¤Åã¥Ü¤Ñ®ð¸ê°T?" + +#: templates/index/notconfigured.inc:39 +msgid "Some of Jonah's configuration files are missing:" +msgstr "³¡¤Àªº Jonah ³]©wÀɮ׿ò¥¢:" + +#: lib/api.php:84 +msgid "Source" +msgstr "®ø®§¨Ó·½" + +#: lib/Form/EditChannel.php:60 +msgid "Source url" +msgstr "®ø®§¨Ó·½ url" + +#: lib/api.php:63 +msgid "Southern Hemisphere" +msgstr "«n¥b²y" + +#: config/templates.php.dist:24 +msgid "Standard" +msgstr "¼Ð·Ç" + +#: content.php:30 lib/api.php:102 lib/Block/stocks.php:23 +msgid "Stock Quotes" +msgstr "ªÑ»ù" + +#: config/prefs.php.dist:24 +msgid "Stocks" +msgstr "ªÑ²¼" + +#: news/stories.php:104 +msgid "Story" +msgstr "¤å³¹" + +#: lib/Form/EditStory.php:36 +msgid "Story Title (Headline)" +msgstr "¤å³¹¼ÐÃD (ÀY±ø)" + +#: lib/Form/EditStory.php:40 +msgid "Story URL" +msgstr "¤å³¹ºô§}" + +#: news/editstory.php:40 +#, c-format +msgid "Story editing failed. %s" +msgstr "½s¿è¤å³¹¥¢±Ñ. %s" + +#: news/deletestory.php:69 +msgid "Story has not been deleted." +msgstr "¤å³¹©|¥¼³Q§R°£." + +#: lib/News/sql.php:286 +#, c-format +msgid "Story id '%s' not found." +msgstr "§ä¤£¨ì¤å³¹½s¸¹ '%s'" + +#: channels.php:120 templates/channels/subscribe.inc:47 +msgid "Subscribe" +msgstr "­q¾\" + +#: content.php:88 +#, c-format +msgid "" +"Subscribed channel '%s' is no longer available, it will be removed from your " +"subscriptions." +msgstr "­q¾\ªºÀW¹D '%s' ¤w¤£¦A¦s¦b, ¨Ã±N±q§Aªº­q¾\¸ê®Æ¤¤²¾°£." + +#: lib/Block/sunrise.php:42 +msgid "Sun Rise" +msgstr "¤é¥X" + +#: lib/api.php:40 +msgid "Sun Rise / Set" +msgstr "¤é¥X/¸¨" + +#: lib/Block/sunrise.php:23 +msgid "Sun Rise and Set" +msgstr "¤é¥X»P¤é¸¨" + +#: lib/Block/sunrise.php:47 +msgid "Sun Set" +msgstr "¤é¸¨" + +#: lib/Jonah.php:133 +msgid "Sunday" +msgstr "¶g¤é" + +#: templates/prefs/portfolio_select.inc:5 lib/Jonah.php:303 +msgid "Symbol" +msgstr "ªÑ²¼¥N¸¹" + +#: lib/Block/metar.php:86 +#, c-format +msgid "Temperature: %s; Dewpoint: %s" +msgstr "·Å«×: %s; Àã«×: %s" + +#: lib/Jonah.php:217 +#, c-format +msgid "The UV index is a %s. " +msgstr "µµ¥~½u«ü¼Æ¬O %s." + +#: news/editchannel.php:75 +#, c-format +msgid "The channel '%s' has been saved." +msgstr "ÀW¹D '%s' ¤w¸gÀx¦s." + +#: news/deletechannel.php:61 +msgid "The channel has been deleted." +msgstr "ÀW¹D '%s' ¤w¸g§R°£." + +#: lib/Form/EditChannel.php:58 +msgid "" +"The interval before stories in this channel are rechecked for updates. If " +"none, then stories will always be refetched from the source." +msgstr "" + +#: news/editstory.php:68 +#, c-format +msgid "The story '%s' has been saved." +msgstr "¤å³¹ '%s' ¤w¸gÀx¦s." + +#: news/deletestory.php:62 +msgid "The story has been deleted." +msgstr "¤å³¹¤w¸g§R°£." + +#: lib/Jonah.php:160 +#, c-format +msgid "The temperature is %s, " +msgstr "·Å«×¬O %s," + +#: lib/Form/EditChannel.php:60 +msgid "" +"The url to use to fetch the stories, for example 'http://www.example.com/" +"stories.rss'" +msgstr "¥Î¨Ó§ì¨ú¤å³¹ªººô§}, ¨Ò¦p 'http://www.example.com/stories.rss'" + +#: news/deletechannel.php:59 +#, c-format +msgid "There was an error deleting the channel. %s" +msgstr "§R°£ÀW¹D®Éµo¥Í¿ù»~: %s" + +#: news/deletestory.php:60 +#, c-format +msgid "There was an error deleting the story. %s" +msgstr "§R°£¤å³¹®Éµo¥Í¿ù»~. %s" + +#: news/editchannel.php:73 +#, c-format +msgid "There was an error saving the channel. %s" +msgstr "Àx¦sÀW¹D®Éµo¥Í¿ù»~. %s" + +#: news/editstory.php:66 +#, c-format +msgid "There was an error saving the story. %s" +msgstr "Àx¦s¤å³¹®Éµo¥Í¿ù»~. %s" + +#: templates/index/notconfigured.inc:65 +msgid "This file contains preferences for Jonah." +msgstr "¦¹ÀÉ®×¥]§t Jonah ªº°¾¦n³]©w." + +#: templates/index/notconfigured.inc:58 +msgid "" +"This file defines the HTML (or other) templates that are used to generate " +"different views of the news channels that Jonah provides." +msgstr "" + +#: templates/index/notconfigured.inc:44 +msgid "" +"This is the main Jonah configuration file. It contains options for all Jonah " +"scripts." +msgstr "" + +#: lib/Jonah.php:133 +msgid "Thursday" +msgstr "¶g¥|" + +#: stockquote.php:85 +msgid "Today's high" +msgstr "¥»¤é³Ì°ª" + +#: stockquote.php:89 +msgid "Today's low" +msgstr "¥»¤é³Ì§C" + +#: lib/Jonah.php:133 +msgid "Tuesday" +msgstr "¶g¤G" + +#: news/index.php:86 lib/Form/EditChannel.php:38 +msgid "Type" +msgstr "«¬ºA" + +#: config/templates.php.dist:48 +msgid "Ultracompact" +msgstr "·¥Â²¼ä" + +#: channels.php:116 templates/channels/subscribe.inc:43 +msgid "Unsubscribe" +msgstr "¨ú®ø­q¾\" + +#: news/stories.php:104 +msgid "Updated" +msgstr "¤w§ó·s" + +#: prefs.php:74 +msgid "User Options" +msgstr "¨Ï¥ÎªÌ¿ï¶µ" + +#: lib/Jonah.php:303 +msgid "Value" +msgstr "" + +#: templates/channels/edit.inc:9 lib/api.php:93 +msgid "View" +msgstr "À˵ø" + +#: lib/Jonah.php:323 lib/Jonah.php:326 +msgid "View Chart" +msgstr "À˵ø¨«¶Õ¹Ï" + +#: lib/Jonah.php:330 +msgid "View Quote Details" +msgstr "À˵øªÑ»ù²Ó¸`" + +#: lib/Jonah.php:197 +#, c-format +msgid "Visibility is %s" +msgstr "¯à¨£«×¬O %s" + +#: lib/Block/metar.php:78 +#, c-format +msgid "Visibility: %s%s" +msgstr "¯à¨£«×: %s%s" + +#: stockquote.php:105 +msgid "Volume" +msgstr "¦¨¥æ¶q" + +#: content.php:27 +msgid "Weather" +msgstr "¤Ñ®ð" + +#: lib/api.php:106 lib/Block/weather.php:23 +msgid "Weather Forecast" +msgstr "¤Ñ®ð¹w´ú" + +#: config/prefs.php.dist:18 +msgid "Weather Station" +msgstr "®ð¶H¯¸" + +#: templates/prefs/setlocation.inc:4 templates/prefs/setlocation.inc:60 +msgid "Weather station:" +msgstr "®ð¶H¯¸:" + +#: lib/Block/metar.php:115 +msgid "Weather:" +msgstr "¤Ñ®ð:" + +#: lib/Jonah.php:133 +msgid "Wednesday" +msgstr "¶g¤T" + +#: lib/api.php:54 +msgid "Which phases?" +msgstr "" + +#: lib/Block/metar.php:61 +#, c-format +msgid "Wind: %s%s from %s, gusting to %s%s." +msgstr "­·¤O: %s%s ¨Ó¦Û %s, °}­· %s%s." + +#: lib/Block/metar.php:68 +#, c-format +msgid "Wind: %s%s from %s." +msgstr "­·¤O: %s%s ¨Ó¦Û %s." + +#: lib/Weather/intercept.php:102 lib/Stocks/nasdaq.php:102 +#, c-format +msgid "XML error: %s at line %d" +msgstr "" + +#: stockquote.php:113 +msgid "Yield %" +msgstr "" + +#: lib/Form/EditStory.php:47 +msgid "You MUST enter either a URL or a full story." +msgstr "§A¥²¶·¿é¤J¤@­Óºô§}©Î¬O§¹¾ãªº¤å³¹." + +#: news/deletechannel.php:25 news/deletestory.php:25 news/editchannel.php:25 +#: news/editstory.php:25 news/index.php:22 news/stories.php:22 +msgid "You are not authorised for this action." +msgstr "¥¼³Q±ÂÅv°õ¦æ¦¹°Ê§@." + +#: channels.php:83 +#, c-format +msgid "You have edited your subscription to the channel %s." +msgstr "§A¤w¸g½s¿èÀW¹D %s ªº­q¾\¸ê®Æ." + +#: content.php:77 +msgid "You have no news subscriptions." +msgstr "§A©|¥¼­q¾\¥ô¦ó·s»D." + +#: lib/Block/stocks.php:30 +msgid "You have no ticker symbols in your portfolio at this time." +msgstr "§A¥Ø«eªº§ë¸ê²Õ¦X¤¤¨S¦³ªÑ²¼¥N½X." + +#: content.php:44 stockquote.php:146 +msgid "You have no ticker symbols in your portfolio." +msgstr "§Aªº§ë¸ê²Õ¦X¤¤¨S¦³ªÑ²¼¥N½X." + +#: channels.php:39 +#, c-format +msgid "You have subscribed to the channel '%s'." +msgstr "§A¤w­q¾\ÀW¹D '%s'." + +#: channels.php:61 +#, c-format +msgid "You have unsubscribed from the channel '%s'." +msgstr "§A¤w¨ú®ø­q¾\ÀW¹D '%s'" + +#: lib/Form/EditStory.php:38 +msgid "You must enter either a URL or a full story." +msgstr "§A¥²¶·¿é¤Jºô§}©Î¬O§¹¾ãªº¤å³¹." + +#: config/prefs.php.dist:11 config/prefs.php.dist:17 config/prefs.php.dist:23 +msgid "Your Content" +msgstr "¤º®e" + +#: config/prefs.php.dist:5 +msgid "Your Information" +msgstr "­Ó¤H¸ê°T" + +#: lib/Jonah.php:173 +#, c-format +msgid "and the wind is %s at %s. " +msgstr "¦P®É­·¤O¬O %s at %s." + +#: lib/Jonah.php:179 +#, c-format +msgid "and the wind is %s. " +msgstr "¦P®É­·¤O¬O %s." + +#: lib/Jonah.php:170 +msgid "and there is no wind measured. " +msgstr "¦P®É¥Ø«e¨S¦³­·¤O¸ê°T." + +#: news/stories.php:94 +msgid "channels" +msgstr "ÀW¹D" + +#: lib/Jonah.php:137 +msgid "cloudy" +msgstr "¦h¶³" + +#: lib/Jonah.php:137 +msgid "cold" +msgstr "´H§N" + +#: lib/Jonah.php:136 +msgid "dust" +msgstr "¹Ð" + +#: lib/News.php:248 +msgid "external" +msgstr "¥~³¡ªº" + +#: lib/Jonah.php:136 +msgid "flurries" +msgstr "°}«B" + +#: lib/Jonah.php:136 +msgid "fog" +msgstr "¦³Ãú" + +#: lib/Jonah.php:137 +msgid "haze" +msgstr "·ÏÃú°gº©" + +#: lib/Jonah.php:135 +msgid "heavy rain" +msgstr "»¨«B" + +#: lib/Jonah.php:213 +#, c-format +msgid "high %s. Use sunscreen" +msgstr "°ª¶q¯Å %s. ½Ðª`·N¨¾ÅÎ" + +#: lib/Jonah.php:138 +msgid "hot" +msgstr "ª¢¼ö" + +#: lib/Jonah.php:166 +#, c-format +msgid "humidity is at %s" +msgstr "·Ã«×¬O %s" + +#: lib/Jonah.php:199 +msgid "infinite" +msgstr "µLªýꪺ" + +#: lib/News.php:251 +msgid "internal" +msgstr "¤º³¡ªº" + +#: lib/Jonah.php:135 +msgid "light flurries" +msgstr "°¸°}«B" + +#: lib/Jonah.php:209 +#, c-format +msgid "low %s" +msgstr "§C %s" + +#: lib/Jonah.php:207 +#, c-format +msgid "minimal %s" +msgstr "§C¶q¯Å %s" + +#: lib/Jonah.php:211 +#, c-format +msgid "moderate %s" +msgstr "¾A¶q¯Å %s" + +#: lib/Jonah.php:137 +msgid "mostly cloudy" +msgstr "®É³±" + +#: lib/Jonah.php:138 +msgid "mostly sunny" +msgstr "®É´¸" + +#: lib/Jonah.php:177 +msgid "mph" +msgstr "" + +#: news/stories.php:98 +msgid "new story" +msgstr "·s¤å³¹" + +#: lib/News.php:214 +msgid "none" +msgstr "" + +#: lib/Jonah.php:138 +msgid "partly cloudy" +msgstr "¦h¶³" + +#: lib/Jonah.php:134 +msgid "rain" +msgstr "«B" + +#: lib/Jonah.php:135 +msgid "sleet" +msgstr "¦B¹r" + +#: lib/Jonah.php:137 +msgid "smoke" +msgstr "·ÏÃú" + +#: lib/Jonah.php:134 +msgid "snow" +msgstr "¦³³·" + +#: lib/Jonah.php:136 +msgid "snow and wind" +msgstr "­·³·" + +#: lib/Jonah.php:138 +msgid "sunny" +msgstr "´¸®Ô" + +#: lib/Jonah.php:134 +msgid "thunder storms" +msgstr "¼É­·³·" + +#: lib/Jonah.php:215 +#, c-format +msgid "very high %s. Stay indoors" +msgstr "·¥°ª %s. Á×§K¥Xªù" + +#: lib/Jonah.php:134 +msgid "windy" +msgstr "±j­·" diff --git a/jonah/scripts/.htaccess b/jonah/scripts/.htaccess new file mode 100644 index 000000000..3a4288278 --- /dev/null +++ b/jonah/scripts/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/jonah/scripts/feed_tester.php b/jonah/scripts/feed_tester.php new file mode 100755 index 000000000..b8f5fde12 --- /dev/null +++ b/jonah/scripts/feed_tester.php @@ -0,0 +1,61 @@ +#!/usr/bin/php -q +pushApp('jonah', false); + +// Include needed libraries. +require_once JONAH_BASE . '/lib/Jonah.php'; +require_once JONAH_BASE . '/lib/FeedParser.php'; + +/* Make sure there's no compression. */ +@ob_end_clean(); + +if (empty($argv[1]) || !file_exists($argv[1])) { + exit("Need a valid filename.\n"); +} + +$data = file_get_contents($argv[1]); + +if (preg_match('/.*;\s?charset="?([^"]*)/', 'text/xml', $match)) { + $charset = $match[1]; +} elseif (preg_match('/<\?xml[^>]+encoding=["\']?([^"\'\s?]+)[^?].*?>/i', $data, $match)) { + $charset = $match[1]; +} else { + $charset = 'utf-8'; +} + +$parser = new Jonah_FeedParser($charset); +if (!$parser->parse($data)) { + $cli->writeln($cli->red(_("Parse failed:"))); + var_dump($parser->error); +} else { + $cli->writeln($cli->green(_("Parse succeeded, structure is:"))); + var_dump($parser->structure); +} diff --git a/jonah/scripts/sql/jonah.mssql.sql b/jonah/scripts/sql/jonah.mssql.sql new file mode 100644 index 000000000..8463d3897 --- /dev/null +++ b/jonah/scripts/sql/jonah.mssql.sql @@ -0,0 +1,56 @@ +-- $Horde: jonah/scripts/sql/jonah.mssql.sql,v 1.9 2009/10/20 21:28:29 jan Exp $ + +CREATE TABLE jonah_channels ( + channel_id INT NOT NULL, + channel_slug VARCHAR(64) NOT NULL, + channel_name VARCHAR(255) NOT NULL, + channel_type SMALLINT NOT NULL, + channel_full_feed SMALLINT DEFAULT 0 NOT NULL, + channel_desc VARCHAR(255), + channel_interval INT, + channel_url VARCHAR(255), + channel_link VARCHAR(255), + channel_page_link VARCHAR(255), + channel_story_url VARCHAR(255), + channel_img VARCHAR(255), + channel_updated INT, +-- + PRIMARY KEY (channel_id) +); + +CREATE TABLE jonah_stories ( + story_id INT NOT NULL, + channel_id INT NOT NULL, + story_author VARCHAR(255) NOT NULL, + story_title VARCHAR(255) NOT NULL, + story_desc VARCHAR(MAX), + story_body_type VARCHAR(255) NOT NULL, + story_body VARCHAR(MAX), + story_url VARCHAR(255), + story_permalink VARCHAR(255), + story_published INT, + story_updated INT NOT NULL, + story_read INT NOT NULL, +-- + PRIMARY KEY (story_id) +); + +CREATE TABLE jonah_tags ( + tag_id INT NOT NULL, + tag_name VARCHAR(255) NOT NULL, +-- + PRIMARY KEY (tag_id) +); + +CREATE TABLE jonah_stories_tags ( + story_id INT NOT NULL, + channel_id INT NOT NULL, + tag_id INT NOT NULL, +-- + PRIMARY KEY (story_id, channel_id, tag_id) +); + +CREATE INDEX jonah_stories_channel_idx ON jonah_stories (channel_id); +CREATE INDEX jonah_stories_published_idx ON jonah_stories (story_published); +CREATE INDEX jonah_stories_url_idx ON jonah_stories (story_url); +CREATE INDEX jonah_channels_type_idx ON jonah_channels (channel_type); diff --git a/jonah/scripts/sql/jonah.sql b/jonah/scripts/sql/jonah.sql new file mode 100644 index 000000000..40b78534c --- /dev/null +++ b/jonah/scripts/sql/jonah.sql @@ -0,0 +1,56 @@ +-- $Horde: jonah/scripts/sql/jonah.sql,v 1.17 2009/10/20 21:28:30 jan Exp $ + +CREATE TABLE jonah_channels ( + channel_id INT NOT NULL, + channel_slug VARCHAR(64) NOT NULL, + channel_name VARCHAR(255) NOT NULL, + channel_type SMALLINT NOT NULL, + channel_full_feed SMALLINT DEFAULT 0 NOT NULL, + channel_desc VARCHAR(255), + channel_interval INT, + channel_url VARCHAR(255), + channel_link VARCHAR(255), + channel_page_link VARCHAR(255), + channel_story_url VARCHAR(255), + channel_img VARCHAR(255), + channel_updated INT, +-- + PRIMARY KEY (channel_id) +); + +CREATE TABLE jonah_stories ( + story_id INT NOT NULL, + channel_id INT NOT NULL, + story_author VARCHAR(255) NOT NULL, + story_title VARCHAR(255) NOT NULL, + story_desc TEXT, + story_body_type VARCHAR(255) NOT NULL, + story_body TEXT, + story_url VARCHAR(255), + story_permalink VARCHAR(255), + story_published INT, + story_updated INT NOT NULL, + story_read INT NOT NULL, +-- + PRIMARY KEY (story_id) +); + +CREATE TABLE jonah_tags ( + tag_id INT NOT NULL, + tag_name VARCHAR(255) NOT NULL, +-- + PRIMARY KEY (tag_id) +); + +CREATE TABLE jonah_stories_tags ( + story_id INT NOT NULL, + channel_id INT NOT NULL, + tag_id INT NOT NULL, +-- + PRIMARY KEY (story_id, channel_id, tag_id) +); + +CREATE INDEX jonah_stories_channel_idx ON jonah_stories (channel_id); +CREATE INDEX jonah_stories_published_idx ON jonah_stories (story_published); +CREATE INDEX jonah_stories_url_idx ON jonah_stories (story_url); +CREATE INDEX jonah_channels_type_idx ON jonah_channels (channel_type); diff --git a/jonah/scripts/upgrades/2005-03-13_release_date.sql b/jonah/scripts/upgrades/2005-03-13_release_date.sql new file mode 100644 index 000000000..b983684cc --- /dev/null +++ b/jonah/scripts/upgrades/2005-03-13_release_date.sql @@ -0,0 +1,4 @@ +-- SQL script for adding a column for the story release date. + +ALTER TABLE jonah_stories ADD COLUMN story_release INT; +UPDATE jonah_stories SET story_release = 1; \ No newline at end of file diff --git a/jonah/scripts/upgrades/2006-01-01_release_date.sql b/jonah/scripts/upgrades/2006-01-01_release_date.sql new file mode 100644 index 000000000..9616b0373 --- /dev/null +++ b/jonah/scripts/upgrades/2006-01-01_release_date.sql @@ -0,0 +1,3 @@ +-- SQL script for setting the release date to the story date if it was "1". + +UPDATE jonah_stories SET story_release = story_date WHERE story_release = 1; diff --git a/jonah/scripts/upgrades/2006-02-22_dates.sql b/jonah/scripts/upgrades/2006-02-22_dates.sql new file mode 100644 index 000000000..7fd78b03f --- /dev/null +++ b/jonah/scripts/upgrades/2006-02-22_dates.sql @@ -0,0 +1,8 @@ +-- SQL script for adapting to updated story date handling. + +ALTER TABLE jonah_stories ADD COLUMN story_published INT; +ALTER TABLE jonah_stories ADD COLUMN story_updated INT NOT NULL; +UPDATE jonah_stories SET story_published = story_release; +UPDATE jonah_stories SET story_updated = story_date; +ALTER TABLE jonah_stories DROP COLUMN story_release; +ALTER TABLE jonah_stories DROP COLUMN story_date; diff --git a/jonah/scripts/upgrades/2006-05-11_channel_page.sql b/jonah/scripts/upgrades/2006-05-11_channel_page.sql new file mode 100644 index 000000000..003674d21 --- /dev/null +++ b/jonah/scripts/upgrades/2006-05-11_channel_page.sql @@ -0,0 +1,3 @@ +-- SQL script for adding a column for the channel story pages. + +ALTER TABLE jonah_channels ADD COLUMN channel_page_link VARCHAR(255); diff --git a/jonah/scripts/upgrades/2006-05-12_permalink.sql b/jonah/scripts/upgrades/2006-05-12_permalink.sql new file mode 100644 index 000000000..2226f7460 --- /dev/null +++ b/jonah/scripts/upgrades/2006-05-12_permalink.sql @@ -0,0 +1,3 @@ +-- SQL script for adding a column for the stories' permalinks. + +ALTER TABLE jonah_stories ADD COLUMN story_permalink VARCHAR(255); diff --git a/jonah/scripts/upgrades/2007-06-07_tags.sql b/jonah/scripts/upgrades/2007-06-07_tags.sql new file mode 100644 index 000000000..1169a9c3b --- /dev/null +++ b/jonah/scripts/upgrades/2007-06-07_tags.sql @@ -0,0 +1,16 @@ +-- SQL script for adding the tag tables to Jonah. + +CREATE TABLE jonah_tags ( + tag_id INT NOT NULL, + tag_name VARCHAR(255) NOT NULL, +--- + PRIMARY KEY (tag_id) +); + +CREATE TABLE jonah_stories_tags ( + story_id INT NOT NULL, + channel_id INT NOT NULL, + tag_id INT NOT NULL, +--- + PRIMARY KEY (story_id, channel_id, tag_id) +); diff --git a/jonah/scripts/upgrades/2008-08-22_add_channel_slugs.sql b/jonah/scripts/upgrades/2008-08-22_add_channel_slugs.sql new file mode 100644 index 000000000..80b05a4fc --- /dev/null +++ b/jonah/scripts/upgrades/2008-08-22_add_channel_slugs.sql @@ -0,0 +1,6 @@ +-- +-- $Horde: jonah/scripts/upgrades/2008-08-22_add_channel_slugs.sql,v 1.1 2008/08/23 02:02:37 bklang Exp $ +-- +ALTER TABLE jonah_channels ADD COLUMN `channel_slug` VARCHAR(64); +UPDATE jonah_channels SET channel_slug=channel_id; +ALTER TABLE jonah_channels CHANGE channel_slug channel_slug VARCHAR(64) NOT NULL; diff --git a/jonah/scripts/upgrades/2008-08-22_add_story_authors.sql b/jonah/scripts/upgrades/2008-08-22_add_story_authors.sql new file mode 100644 index 000000000..a381c6fd2 --- /dev/null +++ b/jonah/scripts/upgrades/2008-08-22_add_story_authors.sql @@ -0,0 +1,6 @@ +-- +-- $Horde: jonah/scripts/upgrades/2008-08-22_add_story_authors.sql,v 1.1 2008/08/23 02:48:34 bklang Exp $ +-- +ALTER TABLE jonah_stories ADD COLUMN story_author VARCHAR(255); +UPDATE jonah_stories SET story_author='Anonymous'; +ALTER TABLE jonah_stories CHANGE COLUMN story_author story_author VARCHAR(255) NOT NULL; diff --git a/jonah/scripts/upgrades/2008-12-17_add_full_feed.sql b/jonah/scripts/upgrades/2008-12-17_add_full_feed.sql new file mode 100644 index 000000000..b59c16888 --- /dev/null +++ b/jonah/scripts/upgrades/2008-12-17_add_full_feed.sql @@ -0,0 +1,6 @@ +-- +-- $Horde: jonah/scripts/upgrades/2008-12-17_add_full_feed.sql,v 1.2 2009/10/20 21:28:30 jan Exp $ +-- +ALTER TABLE jonah_channels ADD COLUMN `channel_full_feed` SMALLINT; +UPDATE jonah_channels SET channel_full_feed = 0; +ALTER TABLE jonah_channels CHANGE channel_full_feed channel_full_feed SMALLINT DEFAULT 0 NOT NULL; diff --git a/jonah/stories/delete.php b/jonah/stories/delete.php new file mode 100644 index 000000000..fdfd89423 --- /dev/null +++ b/jonah/stories/delete.php @@ -0,0 +1,96 @@ + + * @author Marko Djukic + */ + +define('JONAH_BASE', dirname(__FILE__) . '/..'); +require_once JONAH_BASE . '/lib/base.php'; +require_once JONAH_BASE . '/lib/News.php'; +require_once 'Horde/Form.php'; +require_once 'Horde/Form/Renderer.php'; + +/* Set up the form variables. */ +$vars = Horde_Variables::getDefaultVariables(); +$form_submit = $vars->get('submitbutton'); +$channel_id = $vars->get('channel_id'); +$story_id = $vars->get('story_id'); + +/* Driver */ +$news = Jonah_News::factory(); + +/* Fetch the channel details, needed for later and to check if valid + * channel has been requested. */ +$channel = $news->isChannelEditable($channel_id); +if (is_a($channel, 'PEAR_Error')) { + $notification->push(sprintf(_("Story editing failed: %s"), $channel->getMessage()), 'horde.error'); + $url = Horde::applicationUrl('channels/index.php', true); + header('Location: ' . $url); + exit; +} + +/* Check permissions. */ +if (!Jonah::checkPermissions(Jonah::typeToPermName($channel['channel_type']), Horde_Perms::DELETE, $channel_id)) { + $notification->push(_("You are not authorised for this action."), 'horde.warning'); + Horde::authenticationFailureRedirect(); +} + +$story = $news->getStory($channel_id, $story_id); +if (is_a($story, 'PEAR_Error')) { + $notification->push(_("No valid story requested for deletion."), 'horde.message'); + $url = Horde::applicationUrl('channels/index.php', true); + header('Location: ' . $url); + exit; +} + +/* If not yet submitted set up the form vars from the fetched story. */ +if (empty($form_submit)) { + $vars = new Horde_Variables($story); +} + +$title = sprintf(_("Delete News Story \"%s\"?"), $vars->get('story_title')); + +$form = new Horde_Form($vars, $title); + +$form->setButtons(array(_("Delete"), _("Do not delete"))); +$form->addHidden('', 'channel_id', 'int', true, true); +$form->addHidden('', 'story_id', 'int', true, true); +$form->addVariable(_("Really delete this News Story?"), 'confirm', 'description', false); + +if ($form_submit == _("Delete")) { + if ($form->validate($vars)) { + $form->getInfo($vars, $info); + $delete = $news->deleteStory($info['channel_id'], $info['story_id']); + if (is_a($delete, 'PEAR_Error')) { + $notification->push(sprintf(_("There was an error deleting the story: %s"), $delete->getMessage()), 'horde.error'); + } else { + $notification->push(_("The story has been deleted."), 'horde.success'); + $url = Horde::applicationUrl('stories/index.php', true); + $url = Horde_Util::addParameter($url, 'channel_id', $channel_id, false); + header('Location: ' . $url); + exit; + } + } +} elseif (!empty($form_submit)) { + $notification->push(_("Story has not been deleted."), 'horde.message'); + $url = Horde::applicationUrl('stories/index.php', true); + $url = Horde_Util::addParameter($url, 'channel_id', $channel_id, false); + header('Location: ' . $url); + exit; +} + +$template = new Horde_Template(); +$template->set('main', Horde_Util::bufferOutput(array($form, 'renderActive'), new Horde_Form_Renderer(), $vars, 'delete.php', 'post')); +$template->set('menu', Jonah::getMenu('string')); +$template->set('notify', Horde_Util::bufferOutput(array($notification, 'notify'), array('listeners' => 'status'))); + +require JONAH_TEMPLATES . '/common-header.inc'; +echo $template->fetch(JONAH_TEMPLATES . '/main/main.html'); +require $registry->get('templates', 'horde') . '/common-footer.inc'; diff --git a/jonah/stories/edit.php b/jonah/stories/edit.php new file mode 100644 index 000000000..e19aee723 --- /dev/null +++ b/jonah/stories/edit.php @@ -0,0 +1,79 @@ + + * @author Marko Djukic + */ + +require_once dirname(__FILE__) . '/../lib/base.php'; +require_once JONAH_BASE . '/lib/News.php'; +require_once JONAH_BASE . '/lib/Forms/Story.php'; +require_once 'Horde/Form/Action.php'; +require_once 'Horde/Form/Renderer.php'; + +$news = Jonah_News::factory(); + +/* Set up the form variables. */ +$vars = Horde_Variables::getDefaultVariables(); +$channel_id = $vars->get('channel_id'); + +/* Fetch the channel details, needed for later and to check if valid + * channel has been requested. */ +$channel = $news->isChannelEditable($channel_id); +if (is_a($channel, 'PEAR_Error')) { + $notification->push(sprintf(_("Story editing failed: %s"), $channel->getMessage()), 'horde.error'); + $url = Horde::applicationUrl('channels/index.php', true); + header('Location: ' . $url); + exit; +} + +/* Check permissions. */ +if (!Jonah::checkPermissions(Jonah::typeToPermName($channel['channel_type']), Horde_Perms::EDIT, $channel_id)) { + $notification->push(_("You are not authorised for this action."), 'horde.warning'); + Horde::authenticationFailureRedirect(); +} + +/* Check if a story is being edited. */ +$story_id = $vars->get('story_id'); +if ($story_id && !$vars->get('formname')) { + $story = $news->getStory($channel_id, $story_id); + $story['story_tags'] = implode(',', array_values($story['story_tags'])); + $vars = new Horde_Variables($story); +} + +/* Set up the form. */ +$form = new StoryForm($vars); +if ($form->validate($vars)) { + $form->getInfo($vars, $info); + $result = $news->saveStory($info); + if (is_a($result, 'PEAR_Error')) { + $notification->push(sprintf(_("There was an error saving the story: %s"), $result->getMessage()), 'horde.error'); + } else { + $notification->push(sprintf(_("The story \"%s\" has been saved."), $info['story_title']), 'horde.success'); + $url = Horde_Util::addParameter('stories/index.php', 'channel_id', $channel_id); + header('Location: ' . Horde::applicationUrl($url, true)); + exit; + } +} + +/* Needed javascript. */ +Horde::addScriptFile('open_calendar.js', 'horde'); + +/* Render the form. */ +$template = new Horde_Template(); +$template->set('main', Horde_Util::bufferOutput(array($form, 'renderActive'), $form->getRenderer(), $vars, 'edit.php', 'post')); +$template->set('menu', Jonah::getMenu('string')); +$template->set('notify', Horde_Util::bufferOutput(array($notification, 'notify'), array('listeners' => 'status'))); + +$title = $form->getTitle(); +require JONAH_TEMPLATES . '/common-header.inc'; +echo $template->fetch(JONAH_TEMPLATES . '/main/main.html'); +require $registry->get('templates', 'horde') . '/common-footer.inc'; diff --git a/jonah/stories/index.php b/jonah/stories/index.php new file mode 100644 index 000000000..b0d2773e9 --- /dev/null +++ b/jonah/stories/index.php @@ -0,0 +1,134 @@ + + * @author Marko Djukic + */ + +@define('JONAH_BASE', dirname(__FILE__) . '/..'); +require_once JONAH_BASE . '/lib/base.php'; +require_once JONAH_BASE . '/lib/News.php'; + +$news = Jonah_News::factory(); + +/* Redirect to the news index if no channel_id is specified. */ +$channel_id = Horde_Util::getFormData('channel_id'); +if (empty($channel_id)) { + $notification->push(_("No channel requested."), 'horde.error'); + $url = Horde::applicationUrl('channels/index.php', true); + header('Location: ' . $url); + exit; +} + +$channel = $news->getChannel($channel_id); +if (!Jonah::checkPermissions(Jonah::typeToPermName($channel['channel_type']), Horde_Perms::EDIT, $channel_id)) { + $notification->push(_("You are not authorised for this action."), 'horde.warning'); + Horde::authenticationFailureRedirect(); +} + +/* Check if a forced refresh is being called for an external channel. */ +$refresh = Horde_Util::getFormData('refresh'); + +/* Check if a URL has been passed. */ +$url = Horde_Util::getFormData('url'); + +$stories = $news->getStories($channel_id, null, 0, !empty($refresh), null, true); +if (is_a($stories, 'PEAR_Error')) { + $notification->push(sprintf(_("Invalid channel requested. %s"), $stories->getMessage()), 'horde.error'); + $url = Horde::applicationUrl('channels/index.php', true); + header('Location: ' . $url); + exit; +} + +/* Do some state tests. */ +if (empty($stories)) { + $notification->push(_("No available stories."), 'horde.warning'); +} +if (!empty($refresh)) { + $notification->push(_("Channel refreshed."), 'horde.success'); +} +if (!empty($url)) { + header('Location: ' . $url); + exit; +} + +/* Get channel details, for title, etc. */ +$channel = $news->getChannel($channel_id); + +$allow_delete = Jonah::checkPermissions(Jonah::typeToPermName($channel['channel_type']), Horde_Perms::DELETE, $channel_id); + +/* Build story specific fields. */ +foreach ($stories as $key => $story) { + /* story_published is the publication/release date, story_updated + * is the last change date. */ + if (!empty($stories[$key]['story_published'])) { + $stories[$key]['story_published_date'] = strftime($prefs->getValue('date_format') . ', ' . ($prefs->getValue('twentyFour') ? '%H:%M' : '%I:%M%p'), $stories[$key]['story_published']); + } else { + $stories[$key]['story_published_date'] = ''; + } + + /* Default to no links. */ + $stories[$key]['pdf_link'] = ''; + $stories[$key]['edit_link'] = ''; + $stories[$key]['delete_link'] = ''; + + /* These links only if internal channel. */ + if ($channel['channel_type'] == JONAH_INTERNAL_CHANNEL || + $channel['channel_type'] == JONAH_COMPOSITE_CHANNEL) { + $stories[$key]['view_link'] = Horde::link(Horde::url($story['story_link']), $story['story_desc']) . htmlspecialchars($story['story_title']) . '
'; + + /* PDF link. */ + $url = Horde::applicationUrl('stories/pdf.php'); + $url = Horde_Util::addParameter($url, array('story_id' => $story['story_id'], 'channel_id' => $channel_id)); + $stories[$key]['pdf_link'] = Horde::link($url, _("PDF version")) . Horde::img('mime/pdf.png', _("PDF version"), '', $registry->getImageDir('horde')) . ''; + + /* Edit story link. */ + $url = Horde::applicationUrl('stories/edit.php'); + $url = Horde_Util::addParameter($url, array('story_id' => $story['story_id'], 'channel_id' => $channel_id)); + $stories[$key]['edit_link'] = Horde::link($url, _("Edit story")) . Horde::img('edit.png', _("Edit story"), '', $registry->getImageDir('horde')) . ''; + + /* Delete story link. */ + if ($allow_delete) { + $url = Horde::applicationUrl('stories/delete.php'); + $url = Horde_Util::addParameter($url, array('story_id' => $story['story_id'], 'channel_id' => $channel_id)); + $stories[$key]['delete_link'] = Horde::link($url, _("Delete story")) . Horde::img('delete.png', _("Delete story"), '', $registry->getImageDir('horde')) . ''; + } + + /* Comment counter. */ + if ($conf['comments']['allow'] && + $registry->hasMethod('forums/numMessages')) { + $comments = $registry->call('forums/numMessages', array($stories[$key]['story_id'], 'jonah')); + if (!is_a($comments, 'PEAR_Error')) { + $stories[$key]['comments'] = $comments; + } + } + } else { + if (!empty($story['story_body'])) { + $stories[$key]['view_link'] = Horde::link(Horde::url($story['story_link']), $story['story_desc'], '', '_blank') . htmlspecialchars($story['story_title']) . ''; + } else { + $stories[$key]['view_link'] = Horde::link(Horde::externalUrl($story['story_url']), $story['story_desc'], '', '_blank') . htmlspecialchars($story['story_title']) . ''; + } + } +} + +$template = new Horde_Template(); +$template->setOption('gettext', true); +$template->set('header', htmlspecialchars($channel['channel_name'])); +$template->set('refresh', Horde::link(Horde_Util::addParameter(Horde::selfUrl(true), array('refresh' => 1)), _("Refresh Channel")) . Horde::img('reload.png', '', '', $registry->getImageDir('horde')) . ''); +$template->set('listheaders', array(_("Story"), _("Date"))); +$template->set('stories', $stories, true); +$template->set('read', $channel['channel_type'] == JONAH_INTERNAL_CHANNEL || $channel['channel_type'] == JONAH_COMPOSITE_CHANNEL, true); +$template->set('comments', $conf['comments']['allow'] && $registry->hasMethod('forums/numMessages') && $channel['channel_type'] == JONAH_INTERNAL_CHANNEL, true); +$template->set('menu', Jonah::getMenu('string')); +$template->set('notify', Horde_Util::bufferOutput(array($notification, 'notify'), array('listeners' => 'status'))); + +$title = $channel['channel_name']; +require JONAH_TEMPLATES . '/common-header.inc'; +echo $template->fetch(JONAH_TEMPLATES . '/stories/index.html'); +require $registry->get('templates', 'horde') . '/common-footer.inc'; diff --git a/jonah/stories/pdf.php b/jonah/stories/pdf.php new file mode 100644 index 000000000..7a5c0f3f7 --- /dev/null +++ b/jonah/stories/pdf.php @@ -0,0 +1,83 @@ + + */ + +function _exit($message) +{ + $GLOBALS['notification']->push(sprintf(_("Error fetching story: %s"), $message), 'horde.error'); + require JONAH_TEMPLATES . '/common-header.inc'; + $GLOBALS['notification']->notify(array('listeners' => 'status')); + require $GLOBALS['registry']->get('templates', 'horde') . '/common-footer.inc'; + exit; +} + +$session_control = 'readonly'; +@define('AUTH_HANDLER', true); +@define('JONAH_BASE', dirname(__FILE__) . '/..'); +require_once JONAH_BASE . '/lib/base.php'; +require_once JONAH_BASE . '/lib/News.php'; +require_once 'File/PDF.php'; + +$news = Jonah_News::factory(); + +$channel_id = Horde_Util::getFormData('channel_id'); +$story_id = Horde_Util::getFormData('story_id'); +if (!$story_id) { + $story_id = $news->getLatestStoryId($channel_id); + if (is_a($story_id, 'PEAR_Error')) { + _exit($story_id->getMessage()); + } +} + +$story = $news->getStory($channel_id, $story_id, !$browser->isRobot()); +if (is_a($story, 'PEAR_Error')) { + _exit($story->getMessage()); +} elseif (empty($story['story_body']) && !empty($story['story_url'])) { + _exit(_("Cannot generate PDFs of remote stories.")); +} + +// Convert the body from HTML to text if necessary. +if (!empty($story['story_body_type']) && $story['story_body_type'] == 'richtext') { + $story['story_body'] = Horde_Text_Filter::filter($story['story_body'], 'html2text'); +} + +// Set up the PDF object. +$pdf = File_PDF::factory(array('format' => 'Letter', 'unit' => 'pt')); +$pdf->setMargins(50, 50); + +// Enable automatic page breaks. +$pdf->setAutoPageBreak(true, 50); + +// Start the document. +$pdf->open(); + +// Start a page. +$pdf->addPage(); + +// Publication date. +if (!empty($story['story_published_date'])) { + $pdf->setFont('Times', 'B', 14); + $pdf->cell(0, 14, $story['story_published_date'], 0, 1); + $pdf->newLine(10); +} + +// Write the header in Times 24 Bold. +$pdf->setFont('Times', 'B', 24); +$pdf->multiCell(0, 24, $story['story_title'], 'B', 1); +$pdf->newLine(20); + +// Write the story body in Times 14. +$pdf->setFont('Times', '', 14); +$pdf->write(14, $story['story_body']); + +// Output the generated PDF. +$browser->downloadHeaders($story['story_title'] . '.pdf', 'application/pdf'); +echo $pdf->getOutput(); diff --git a/jonah/stories/results.php b/jonah/stories/results.php new file mode 100644 index 000000000..df65ced22 --- /dev/null +++ b/jonah/stories/results.php @@ -0,0 +1,125 @@ +getChannel($channel_id); + if (!Jonah::checkPermissions(Jonah::typeToPermName($channel['channel_type']), Horde_Perms::SHOW, $channel_id)) { + $notification->push(_("You are not authorised for this action."), 'horde.warning'); + Horde::authenticationFailureRedirect(); + } + $channel_ids = array($channel_id); +} else { + $channel_ids = array(); + $channels = $news->getChannels(JONAH_INTERNAL_CHANNEL); + foreach ($channels as $ch) { + if (Jonah::checkPermissions(Jonah::typeToPermName($ch['channel_type']), Horde_Perms::SHOW, $ch['channel_id'])) { + $channel_ids[] = $ch['channel_id']; + } + } +} + +/* Make sure we actually requested a tag search */ +if (empty($tag_id)) { + $notification->push(_("No tag requested."), 'horde.error'); + $url = Horde::applicationUrl('channels/index.php', true); + header('Location: ' . $url); + exit; +} +$tag_name = array_shift($news->getTagNames(array($tag_id))); + +$stories = $news->searchTagsById(array($tag_id), 10, 0, $channel_ids); +if (is_a($stories, 'PEAR_Error')) { + $notification->push(sprintf(_("Invalid channel requested. %s"), $stories->getMessage()), 'horde.error'); + $url = Horde::applicationUrl('channels/index.php', true); + header('Location: ' . $url); + exit; +} + +/* Do some state tests. */ +if (empty($stories)) { + $notification->push(_("No available stories."), 'horde.warning'); +} + +foreach ($stories as $key => $story) { + /* Use the channel_id from the story hash since we might be dealing + with more than one channel. */ + $channel_id = $story['channel_id']; + + if (!empty($stories[$key]['story_published'])) { + $stories[$key]['story_published_date'] = strftime($prefs->getValue('date_format') . ', ' . ($prefs->getValue('twentyFour') ? '%H:%M' : '%I:%M%p'), $stories[$key]['story_published']); + } else { + $stories[$key]['story_published_date'] = ''; + } + + /* Default to no links. */ + $stories[$key]['pdf_link'] = ''; + $stories[$key]['edit_link'] = ''; + $stories[$key]['delete_link'] = ''; + + $stories[$key]['view_link'] = Horde::link(Horde::url($story['story_link']), $story['story_desc']) . htmlspecialchars($story['story_title']) . ''; + + /* PDF link. */ + $url = Horde::applicationUrl('stories/pdf.php'); + $url = Horde_Util::addParameter($url, array('story_id' => $story['story_id'], 'channel_id' => $channel_id)); + $stories[$key]['pdf_link'] = Horde::link($url, _("PDF version")) . Horde::img('mime/pdf.png', _("PDF version"), '', $registry->getImageDir('horde')) . ''; + + /* Edit story link. */ + if (Jonah::checkPermissions(Jonah::typeToPermName(JONAH_INTERNAL_CHANNEL), Horde_Perms::EDIT, $channel_id)) { + $url = Horde::applicationUrl('stories/edit.php'); + $url = Horde_Util::addParameter($url, array('story_id' => $story['story_id'], 'channel_id' => $channel_id)); + $stories[$key]['edit_link'] = Horde::link($url, _("Edit story")) . Horde::img('edit.png', _("Edit story"), '', $registry->getImageDir('horde')) . ''; + } + + /* Delete story link. */ + if (Jonah::checkPermissions(Jonah::typeToPermName(JONAH_INTERNAL_CHANNEL), Horde_Perms::DELETE, $channel_id)) { + $url = Horde::applicationUrl('stories/delete.php'); + $url = Horde_Util::addParameter($url, array('story_id' => $story['story_id'], 'channel_id' => $channel_id)); + $stories[$key]['delete_link'] = Horde::link($url, _("Delete story")) . Horde::img('delete.png', _("Delete story"), '', $registry->getImageDir('horde')) . ''; + } + + /* Comment counter. */ + if ($conf['comments']['allow'] && + $registry->hasMethod('forums/numMessages')) { + $comments = $registry->call('forums/numMessages', array($stories[$key]['story_id'], 'jonah')); + if (!is_a($comments, 'PEAR_Error')) { + $stories[$key]['comments'] = $comments; + } + } +} + + +/** @TODO It might be better using a new template for results? **/ +$template = new Horde_Template(); +$template->setOption('gettext', true); +if (isset($channel)) { + $template->set('header', sprintf(_("Stories tagged with %s in %s"), $tag_name, htmlspecialchars($channel['channel_name']))); +} else { + $template->set('header', sprintf(_("All stories tagged with %s"), $tag_name)); +} +$template->set('listheaders', array(_("Story"), _("Date"))); +$template->set('stories', $stories, true); +$template->set('read', true, true); +$template->set('comments', $conf['comments']['allow'] && $registry->hasMethod('forums/numMessages'), true); +$template->set('menu', Jonah::getMenu('string')); +$template->set('notify', Horde_Util::bufferOutput(array($notification, 'notify'), array('listeners' => 'status'))); + +require JONAH_TEMPLATES . '/common-header.inc'; +echo $template->fetch(JONAH_TEMPLATES . '/stories/index.html'); +require $registry->get('templates', 'horde') . '/common-footer.inc'; diff --git a/jonah/stories/share.php b/jonah/stories/share.php new file mode 100644 index 000000000..110eafc51 --- /dev/null +++ b/jonah/stories/share.php @@ -0,0 +1,133 @@ + $subject, + 'to' => $recipients, + 'from' => $from, + 'charset' => Horde_Nls::getCharset())); + $mail->addHeader('User-Agent', 'Jonah ' . JONAH_VERSION); + + /* If a note has been provided, add it to the message as a text part. */ + if (strlen($note) > 0) { + $message_note = new MIME_Part('text/plain', null, Horde_Nls::getCharset()); + $message_note->setContents($message_note->replaceEOL($note)); + $message_note->setDescription(_("Note")); + $mail->addMIMEPart($message_note); + } + + /* Get the story as a MIME part and add it to our message. */ + $mail->addMIMEPart($story_part); + + /* Log the pending outbound message. */ + Horde::logMessage(sprintf('<%s> is sending "%s" to (%s)', + $from, $subject, $recipients), + __FILE__, __LINE__, PEAR_LOG_INFO); + + /* Send the message and return the result. */ + return $mail->send(Horde::getMailerConfig()); +} + +$session_control = 'readonly'; +@define('AUTH_HANDLER', true); +@define('JONAH_BASE', dirname(__FILE__) . '/..'); +require_once JONAH_BASE . '/lib/base.php'; +require_once JONAH_BASE . '/lib/News.php'; +require_once 'Horde/Form.php'; +require_once 'Horde/Form/Renderer.php'; + +$news = Jonah_News::factory(); + +/* Set up the form variables. */ +$vars = Horde_Variables::getDefaultVariables(); +$channel_id = $vars->get('channel_id'); +$story_id = $vars->get('story_id'); + +if (!$conf['sharing']['allow']) { + $url = Horde::applicationUrl('stories/view.php', true); + $url = Horde_Util::addParameter($url, array('story_id' => $story_id, 'channel_id' => $channel_id)); + header('Location: ' . $url); + exit; +} + +$story = $news->getStory($channel_id, $story_id); +if (is_a($story, 'PEAR_Error')) { + $notification->push(sprintf(_("Error fetching story: %s"), $story->getMessage()), 'horde.warning'); + $story = ''; +} +$vars->set('subject', $story['story_title']); + +/* Set up the form. */ +$form = new Horde_Form($vars); +$title = _("Share Story"); +$form->setTitle($title); +$form->setButtons(_("Send")); +$form->addHidden('', 'channel_id', 'int', false); +$form->addHidden('', 'story_id', 'int', false); +$v = &$form->addVariable(_("From"), 'from', 'email', true, false); +if (Horde_Auth::getAuth()) { + require_once 'Horde/Identity.php'; + $identity = Identity::factory(); + $v->setDefault($identity->getValue('from_addr')); +} +$form->addVariable(_("To"), 'recipients', 'email', true, false, _("Separate multiple email addresses with commas."), true); +$form->addVariable(_("Subject"), 'subject', 'text', true); +$form->addVariable(_("Include"), 'include', 'enum', true, false, null, array(array(_("A link to the story"), _("The complete text of the story")))); +$form->addVariable(_("Message"), 'message', 'longtext', false, false, null, array(4, 40)); + +if ($form->validate($vars)) { + $form->getInfo($vars, $info); + + $channel = $news->getChannel($channel_id); + if (empty($channel['channel_story_url'])) { + $story_url = Horde::applicationUrl('stories/view.php', true); + $story_url = Horde_Util::addParameter($story_url, array('channel_id' => '%c', 'story_id' => '%s')); + } else { + $story_url = $channel['channel_story_url']; + } + + $story_url = str_replace(array('%25c', '%25s'), array('%c', '%s'), $story_url); + $story_url = str_replace(array('%c', '%s', '&'), array($channel_id, $story['story_id'], '&'), $story_url); + + if ($info['include'] == 0) { + require_once 'Horde/MIME/Part.php'; + + /* TODO: Create a "URL link" MIME part instead. */ + $message_part = new MIME_Part('text/plain'); + $message_part->setContents($message_part->replaceEOL($story_url)); + $message_part->setDescription(_("Story Link")); + } else { + $message_part = Jonah_News::getStoryAsMessage($story); + } + + $result = _mail($message_part, $info['from'], $info['recipients'], + $info['subject'], $info['message']); + + if (is_a($result, 'PEAR_Error')) { + $notification->push(sprintf(_("Unable to send story: %s"), $result->getMessage()), 'horde.error'); + } else { + $notification->push(_("The story was sent successfully."), 'horde.success'); + header('Location: ' . $story_url); + exit; + } +} + +$share_template = new Horde_Template(); +$share_template->set('main', Horde_Util::bufferOutput(array($form, 'renderActive'), new Horde_Form_Renderer(), $vars, 'share.php', 'post')); +$share_template->set('notify', Horde_Util::bufferOutput(array($notification, 'notify'), array('listeners' => 'status'))); + +require JONAH_TEMPLATES . '/common-header.inc'; +echo $share_template->fetch(JONAH_TEMPLATES . '/stories/share.html'); +require $registry->get('templates', 'horde') . '/common-footer.inc'; diff --git a/jonah/stories/view.php b/jonah/stories/view.php new file mode 100644 index 000000000..454ebc86d --- /dev/null +++ b/jonah/stories/view.php @@ -0,0 +1,113 @@ + + */ + +@define('AUTH_HANDLER', true); +@define('JONAH_BASE', dirname(__FILE__) . '/..'); +require_once JONAH_BASE . '/lib/base.php'; +require_once JONAH_BASE . '/lib/News.php'; + +$news = Jonah_News::factory(); + +$channel_id = Horde_Util::getFormData('channel_id'); +$story_id = Horde_Util::getFormData('story_id'); +if (!$story_id) { + $story_id = $news->getLatestStoryId($channel_id); + if (is_a($story_id, 'PEAR_Error')) { + $notification->push(sprintf(_("Error fetching story: %s"), $story_id->getMessage()), 'horde.warning'); + require JONAH_TEMPLATES . '/common-header.inc'; + $notification->notify(array('listeners' => 'status')); + require $registry->get('templates', 'horde') . '/common-footer.inc'; + exit; + } +} + +$story = $news->getStory($channel_id, $story_id, !$browser->isRobot()); +if (is_a($story, 'PEAR_Error')) { + $notification->push(sprintf(_("Error fetching story: %s"), $story->getMessage()), 'horde.warning'); + require JONAH_TEMPLATES . '/common-header.inc'; + $notification->notify(array('listeners' => 'status')); + require $registry->get('templates', 'horde') . '/common-footer.inc'; + exit; +} elseif (empty($story['story_body']) && !empty($story['story_url'])) { + header('Location: ' . Horde::externalUrl($story['story_url'])); + exit; +} + +/* Grab tag related content for entire channel */ +$cloud = new Horde_Ui_TagCloud(); +$allTags = $news->listTagInfo(array(), $channel_id); +foreach ($allTags as $tag_id => $taginfo) { + $cloud->addElement($taginfo['tag_name'], Horde_Util::addParameter('results.php', array('tag_id' => $tag_id, 'channel_id' => $channel_id)), $taginfo['total']); +} + +/* Prepare the story's tags for display */ +$tag_html = array(); +$tag_link = Horde_Util::addParameter(Horde::applicationUrl('stories/results.php'), 'channel_id', $channel_id); +foreach ($story['story_tags'] as $id => $tag) { + $link = Horde_Util::addParameter($tag_link, 'tag_id', $id); + $tag_html[] = Horde::link($link) . $tag . ''; +} + +/* Filter and prepare story content. */ +$story['story_title'] = htmlspecialchars($story['story_title']); +$story['story_desc'] = htmlspecialchars($story['story_desc']); +if (!empty($story['story_body_type']) && $story['story_body_type'] == 'text') { + $story['story_body'] = Horde_Text_Filter::filter($story['story_body'], 'text2html', array('parselevel' => Horde_Text_Filter_Text2html::MICRO, 'class' => null)); +} +if (!empty($story['story_url'])) { + $story['story_body'] .= "\n

" . Horde::link(Horde::externalUrl($story['story_url'])) . htmlspecialchars($story['story_url']) . '

'; +} +if (empty($story['story_published_date'])) { + $story['story_published_date'] = false; +} + +$story_template = new Horde_Template(); +$story_template->set('story', $story, true); +$story_template->set('storytags', implode(', ', $tag_html)); + +$view_template = new Horde_Template(); +$view_template->setOption('gettext', true); +$view_template->set('story', $story_template->fetch(JONAH_TEMPLATES . '/stories/story.html')); +$view_template->set('cloud', '
buildHTML() . '
', true); +/* Insert link for sharing. */ +if ($conf['sharing']['allow']) { + $url = Horde::applicationUrl('stories/share.php'); + $url = Horde_Util::addParameter($url, array('story_id' => $story['story_id'], 'channel_id' => $channel_id)); + $view_template->set('sharelink', Horde::link($url) . _("Share this story") . '', true); +} else { + $view_template->set('sharelink', false, true); +} + +/* Insert comments. */ +if ($conf['comments']['allow']) { + if (!$registry->hasMethod('forums/doComments')) { + $err = 'User comments are enabled but the forums API is not available.'; + Horde::logMessage($err, __FILE__, __LINE__, PEAR_LOG_ERR); + } else { + $comments = $registry->call('forums/doComments', array('jonah', $story_id, 'commentCallback')); + if (is_a($comments, 'PEAR_Error')) { + Horde::logMessage($threads, __FILE__, __LINE__, PEAR_LOG_ERR); + $comments = ''; + } + $comments = $comments['threads'] . '
' . $comments['comments']; + $view_template->set('comments', $comments, true); + } +} else { + $view_template->set('comments', false, true); +} + +$view_template->set('menu', Jonah::getMenu('string')); +$view_template->set('notify', Horde_Util::bufferOutput(array($notification, 'notify'), array('listeners' => 'status'))); + +require JONAH_TEMPLATES . '/common-header.inc'; +echo $view_template->fetch(JONAH_TEMPLATES . '/stories/view.html'); +require $registry->get('templates', 'horde') . '/common-footer.inc'; diff --git a/jonah/templates/.htaccess b/jonah/templates/.htaccess new file mode 100644 index 000000000..3a4288278 --- /dev/null +++ b/jonah/templates/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/jonah/templates/channels/index.html b/jonah/templates/channels/index.html new file mode 100644 index 000000000..601f92d01 --- /dev/null +++ b/jonah/templates/channels/index.html @@ -0,0 +1,58 @@ + + + + +
+ + + +
+ + + + + + + + > + + + + + + + + + + + + + + + + +
 
+ + + + + + + +
+
+ No feeds match +
+ +
+ No channels are available. +
+
+
diff --git a/jonah/templates/common-header.inc b/jonah/templates/common-header.inc new file mode 100644 index 000000000..8fb225dee --- /dev/null +++ b/jonah/templates/common-header.inc @@ -0,0 +1,36 @@ + + + + + +' : '' ?> + +get('name'); +if (!empty($title)) $page_title .= ' :: ' . $title; +if (!empty($refresh_time) && ($refresh_time > 0) && !empty($refresh_url)) { + echo "\n"; +} + +Horde::includeScriptFiles(); + +if ($channel_id = Horde_Util::getFormData('channel_id')) { + $rss_url_params = array('channel_id' => $channel_id); + if ($tag_id = Horde_Util::getFormData('tag_id')) { + $rss_url_params['tag_id'] = $tag_id; + } + echo ''; +} +?> +<?php echo htmlspecialchars($page_title) ?> + + + + +> diff --git a/jonah/templates/delivery/html.html b/jonah/templates/delivery/html.html new file mode 100644 index 000000000..56be0b873 --- /dev/null +++ b/jonah/templates/delivery/html.html @@ -0,0 +1,27 @@ + + + + + + + + + + + +
+
+ + + Select a format: + + +
+ +
diff --git a/jonah/templates/delivery/rss.xml b/jonah/templates/delivery/rss.xml new file mode 100644 index 000000000..c473511ca --- /dev/null +++ b/jonah/templates/delivery/rss.xml @@ -0,0 +1,19 @@ +"?> +" type="text/xsl"?> + + + + <tag:channel_name /> + + + + + + + <tag:stories.story_title /> + + + + + + diff --git a/jonah/templates/delivery/rss2.xml b/jonah/templates/delivery/rss2.xml new file mode 100644 index 000000000..0674c3744 --- /dev/null +++ b/jonah/templates/delivery/rss2.xml @@ -0,0 +1,21 @@ +"?> +" type="text/xsl"?> + + + <tag:channel_name /> + + + + + + + + <tag:stories.story_title /> + + + + + + + + diff --git a/jonah/templates/delivery/rss2_full.xml b/jonah/templates/delivery/rss2_full.xml new file mode 100644 index 000000000..dd09f2380 --- /dev/null +++ b/jonah/templates/delivery/rss2_full.xml @@ -0,0 +1,23 @@ +"?> +" type="text/xsl"?> + + + <tag:channel_name /> + + + + + + + + <tag:stories.story_title /> + + + +]]> + + + + + + diff --git a/jonah/templates/delivery/rss_full.xml b/jonah/templates/delivery/rss_full.xml new file mode 100644 index 000000000..cf2610fb9 --- /dev/null +++ b/jonah/templates/delivery/rss_full.xml @@ -0,0 +1,21 @@ +"?> +" type="text/xsl"?> + + + + <tag:channel_name /> + + + + + + + <tag:stories.story_title /> + + +]]> + + + + + diff --git a/jonah/templates/main/main.html b/jonah/templates/main/main.html new file mode 100644 index 000000000..46a0d7cae --- /dev/null +++ b/jonah/templates/main/main.html @@ -0,0 +1,7 @@ + + + + + diff --git a/jonah/templates/stories/index.html b/jonah/templates/stories/index.html new file mode 100644 index 000000000..5948bac72 --- /dev/null +++ b/jonah/templates/stories/index.html @@ -0,0 +1,58 @@ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  + + + Read + + Comments +
+ + + + + + + + + + + +
+
diff --git a/jonah/templates/stories/share.html b/jonah/templates/stories/share.html new file mode 100644 index 000000000..896f0a2a5 --- /dev/null +++ b/jonah/templates/stories/share.html @@ -0,0 +1,2 @@ + + diff --git a/jonah/templates/stories/story.html b/jonah/templates/stories/story.html new file mode 100644 index 000000000..18419471a --- /dev/null +++ b/jonah/templates/stories/story.html @@ -0,0 +1,15 @@ +

+ +

+ + + +

+ +

+ +
+ +
diff --git a/jonah/templates/stories/view.html b/jonah/templates/stories/view.html new file mode 100644 index 000000000..12cae02df --- /dev/null +++ b/jonah/templates/stories/view.html @@ -0,0 +1,25 @@ + + + + +
+
+ +
+ + + + + +
+ +
+ +
+
diff --git a/jonah/test.php b/jonah/test.php new file mode 100644 index 000000000..54b841a4d --- /dev/null +++ b/jonah/test.php @@ -0,0 +1,74 @@ +

The Horde_Util package was not found. If PHP\'s error_reporting setting is high enough and display_errors is on, there should be error messages printed above that may help you in debugging the problem. If you are simply missing these files, then you need to get the framework module from Horde CVS, and install the packages in it with the install-packages.php script.

'; + exit; +} + +/* Initialize the Horde_Test:: class. */ +if (!is_readable('../lib/Test.php')) { + echo 'ERROR: You must install Horde before running this script.'; + exit; +} +require_once '../lib/Test.php'; +$horde_test = new Horde_Test(); + +/* Jonah definitions. */ +$module = 'Jonah'; +require_once dirname(__FILE__) . '/lib/Application.php'; +$app = new Jonah_Application(); +$module_version = $app->version; + + +/* PHP module capabilities. */ +$module_list = array( + 'gettext' => array( + 'descrip' => 'Gettext Support', + 'error' => 'Jonah will not run without gettext support. Compile php --with-gettext before continuing.' + ), + 'xml' => array( + 'descrip' => 'XML Support', + 'error' => 'Without XML support, Jonah WILL NOT WORK. You must fix this before going any further.' + ) +); + +/* Jonah configuration files. */ +$file_list = array( + 'config/conf.php' => 'The file ./config/conf.php appears to be missing. You probably just forgot to copy ./config/conf.php.dist over. While you do that, take a look at the settings and make sure they are appropriate for your site.' +); + +require TEST_TEMPLATES . 'header.inc'; +require TEST_TEMPLATES . 'version.inc'; + +/* Display PHP Version information. */ +$php_info = $horde_test->getPhpVersionInformation(); +require TEST_TEMPLATES . 'php_version.inc'; + +?> + +

PHP Modules

+
    + phpModuleCheck($module_list) ?> +
+ +

Jonah Configuration Files

+
    + requiredFileCheck($file_list) ?> +
+ + + + + + + + + + + + <xsl:value-of select="/rss/channel/title"/> + + + + +

+ You're viewing an XML content feed which is + intended to be viewed within a feed aggregator. +

+ + +

Subscribe to

+ +
+

+ Subscribe now in your favorite RSS aggregator: +

+ + + + + +

+

Preview

+

+ + + + + +
+ + + +

+ + + +
+ +

+
+ +
diff --git a/jonah/themes/graphics/atom.png b/jonah/themes/graphics/atom.png new file mode 100644 index 0000000000000000000000000000000000000000..a0bc1e6c8414c1e01c4c73de25918240085f6ff5 GIT binary patch literal 254 zcmV+82jNY&NVrh0m_v$N07&&S8drKP3D#>ULd%#@UrAAs3h00001 zbW%=J06^y0W&i*Hd`Uz>R0vyRV88%Ow|DQ2dRNTA5Np7E^NQ*n1BOKm>&nZWSQao` zwbg3NxT1Q1q3Dr?U|Os11O|HrH9@gF{tXP3Kt@`Y{RD>1OD)pUTBlB6xL~)kE#pYR z0fq|YMMAH}^vVU9r2dIj{)78&q Iol`;+0JRbu(EtDd literal 0 HcmV?d00001 diff --git a/jonah/themes/graphics/blog.png b/jonah/themes/graphics/blog.png new file mode 100644 index 0000000000000000000000000000000000000000..5199aa2601eb0966687195e2325d68250d16fce0 GIT binary patch literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=(3?#Lsx0C=W&H$ef*Z=?jGo;M~@>XQG&I3~N zo-U3d9MQ=UTeCzDU%6nwA=aAYrl8AoRKYAnZiN^_IxpX4f1V$VK&1?xu6{1-oD!M< DEAAVE literal 0 HcmV?d00001 diff --git a/jonah/themes/graphics/editstory.png b/jonah/themes/graphics/editstory.png new file mode 100644 index 0000000000000000000000000000000000000000..54cceea40d37ada42bb0aa2379bcee5272df5db7 GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}RDe&2E0F&G|No2UFCN@~aO3)o zX;Y`&zyIL+^&8J$ytsbj#?)!kt^-AHT)%MP{IqFPUp#+);r#h&Q>T9T@ZrUa7Y`mh zxB-;AetpA+4GR`5m^N)%U0q#nZf;Ia4$#c#)#tQHxB1_KV(z}2PkQQ{ZA{ktw=lDSIF@5ij~3Jf(KNj)6G#heUJ4A~4h6ouxC z9xv!w_)y^PX2nPQKkf>=b!FO0*)Ud?R9T8F$Te@0o>6J?v4Ey_|7g$I9 e`2AV>y+5A>&y~IB{~iWf%i!ti=d#Wzp$P!^0-?|V literal 0 HcmV?d00001 diff --git a/jonah/themes/graphics/favicon.ico b/jonah/themes/graphics/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..7e7d804676cda969ff0a761b1fa955d1221fc962 GIT binary patch literal 1150 zcmbtSF>-@25R@l*fUDFg^E4Om1;(F1HBaCP`2loNhdL0bzP;ZsyjgIy6zXC14n+=qZjM`;u1gm<;;F1e%2oGkw5wfu0OfoD{c`~Lb^zvjA^vm# z|8xN6fdJ@y8{&T;<%0w4fB@!$1NeIY{doY$iA(H-0QG?Y_J#n_jY;!_9sGp=_=o`b zi2&}62J4Uw{EPtjjsyOU0QHgx>X#DhmlN!m66%mc{*ndIn^XUj1>~7A(w$V_nnLlK z6!MxB{Fn;&nh^7uFX)~&|C$Zwpf~8CI_;ZF_@EZ-qbmNN691nP_nk=mq!<097wMp6 z|E3rFs2l#P9rLM1|EwL>v4QTZVg0Zo{jnqAvTFXZBLA`@{I)0DvzO_zeEzp6|FBZ@Z#0<;nVoy$?)aZ`Qy~}<<qoKZlmZvR%d9>l~LAq?+)AOJiFm-n}=a&bxTJfl1 z6JTtqFK()<)?3w%&W%89<%hm%v+k8Pp|cnux=>PP>8-+MbsPaiB|hmjx2(XOU9-Iq w3FIZj|D-rwPNyp;JuaD`R73bbLlU8W0g+ucGzXTfn*aa+07*qoM6N<$f`M0ZO#lD@ literal 0 HcmV?d00001 diff --git a/jonah/themes/graphics/jonah.png b/jonah/themes/graphics/jonah.png new file mode 100644 index 0000000000000000000000000000000000000000..54cceea40d37ada42bb0aa2379bcee5272df5db7 GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}RDe&2E0F&G|No2UFCN@~aO3)o zX;Y`&zyIL+^&8J$ytsbj#?)!kt^-AHT)%MP{IqFPUp#+);r#h&Q>T9T@ZrUa7Y`mh zxB-;AetpA+4GR`5m^N)%U0q#nZf;Ia4$#c#)#tQHxB1_KV(z}2PkQQ{ZA{ktw=lDSIF@5ij~3Jf(KNj)6G#heUJ4A~4h6ouxC z9xv!w_)y^PX2nPQKkf>=b!FO0*)Ud?R9T8F$Te@0o>6J?v4Ey_|7g$I9 e`2AV>y+5A>&y~IB{~iWf%i!ti=d#Wzp$P!^0-?|V literal 0 HcmV?d00001 diff --git a/jonah/themes/graphics/lists.png b/jonah/themes/graphics/lists.png new file mode 100644 index 0000000000000000000000000000000000000000..9ae2f9859beabb1c1af40b8bd31ab01033830085 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UAm`Z~Df*JltPgL3p zzjkEmH@36?`{hTJO2A*UjsuUcobS(fw_{uN{T7$lj&S*(rbh4C0{*IrPdLzg>Uh6$ z{(V2z)&KcLR@Bw}Ja_eWcp1ahW|^Y`TeH5ty1M$>nn>;t{%_pOOb2Y+A4aDzFr+VB Ue09A@5j)7`p00i_>zopr026ps<^TWy literal 0 HcmV?d00001 diff --git a/jonah/themes/graphics/new.png b/jonah/themes/graphics/new.png new file mode 100644 index 0000000000000000000000000000000000000000..4c849e51ba828636659b6be83101a2de1d15fcef GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}LV!<*>$Is;b8>QWb93wJ>VRU? zrUD@lfQSVP7JOPEx?#hH3+K;YxN!dem7?n)aO1{x5Cqa7){PtY?>~3|L=PUkc>eqa z2!g1V6Mdku2@=!r7%xX>^OL z4bEEPwX>aj!!QhRo@4V1vcX^w6#Wji;{!E1;n*IxQSpzntI-#4J_iS-2IpOw-i0Gb zv-ss=j{67X$rJ#OG)=a-xw#|F5SbG^wOYAK$RsEF-S?~YE<&bv-jErbm8EUdGg`Af zzqq(?sBUSVEdW}z>au3Fig8n$z^zU4%JE#PchwLER~eySR-vsF<2u_z?rwz&!2?0% zH=n5!}4wi%I##Uk79|0l8&reNFf~HjsG6j+6@hhUZ zNO<`K1a%T=Y^wKnbapTni)D}dTy2}yTfr;aEGa1|7l|>LoE!&j`(v=#Yn+a literal 0 HcmV?d00001 diff --git a/jonah/themes/graphics/story_marker.png b/jonah/themes/graphics/story_marker.png new file mode 100644 index 0000000000000000000000000000000000000000..3e4fad5fecb747385511eded11715d137ff8a079 GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_|Y3?y$c)pCP40X`wFXU_ajOPhJT*`xv}!sqGY k7{Vc&{O9lurq+4}i8L1e2hOWc0A(0FUHx3vIVCg!08}3q?EnA( literal 0 HcmV?d00001 diff --git a/jonah/themes/graphics/za.png b/jonah/themes/graphics/za.png new file mode 100644 index 0000000000000000000000000000000000000000..a154237b5566afebb81997b3357056b6e722bfca GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4^3?%3Nf7cA+1o(uw?qU#2OG^XtdbXZ%0#b}6 zL4Lsu4$p3Y#AG~O978ywlM@)2)`s%<$p3TxFyCI_&wpkKp#ED^czP}U!-RqA7(8A5 KT-G@yGywoiogUr* literal 0 HcmV?d00001 diff --git a/jonah/themes/screen.css b/jonah/themes/screen.css new file mode 100644 index 000000000..c3d885df9 --- /dev/null +++ b/jonah/themes/screen.css @@ -0,0 +1,110 @@ +/** + * $Horde: jonah/themes/screen.css,v 1.9 2008/05/26 21:33:11 chuck Exp $ + */ + +.storySubtitle { + font-style: italic; + font-size: 90%; + color: #999; + margin: 5px 10px; + padding: 2px; + background: #fff; +} + +.storyBody { + margin: 5px 10px; + padding: 2px; + color: #000; + background: #fff; +} +.storyBody ul, .storyBody ol { + margin: 1em 0; + -moz-padding-start: 40px; +} + +.storyLinks, .storyTags { + margin: 5px 10px; + padding: 2px; + font-size: 90%; + background: #fff; +} +.storyLinks { + border-top: 1px solid #ccc; +} + +.storyComments { + margin-top: 8px; +} + +.tagSelector { + border: 1px solid #ccc; + margin: 4px; + padding: 5px; + background: #fff; + width: 150px; +} + +a.earliest:link, a.earliest:visited, a.earliest:hover, a.earliest:active { + color: #ccc; +} + +a.earlier:link, a.earlier:visited, a.earlier:hover, a.earlier:active { + color: #99c; +} + +a.later:link, a.later:visited, a.later:hover, a.later:active { + color: #99f; +} + +a.latest:link, a.latest:visited, a.latest:hover, a.latest:active { + color: #00f; +} + +/* Tables. */ +table#feeds { + width: 99%; + margin: 0 0 8px 5px; + border-top: 1px solid #ddd; + border-left: 1px solid #ddd; +} +table#feeds th { + padding: 3px; + background: #e9e9e9; + border-right: 1px solid #ccc; + text-align: left; +} +table#feeds td { + padding: 3px; + border-right: 1px solid #ddd; + border-bottom: 1px solid #ddd; +} +table#feeds th.sortup { + background: #bbcbff url("graphics/za.png") center left no-repeat; + padding-left: 10px; +} +table#feeds th.sortdown { + background: #bbcbff url("graphics/az.png") center left no-repeat; + padding-left: 10px; +} + +/* QuickFinder */ +.QuickFinderNoMatch { + display: none; +} +#feeds-empty { + padding: 4px; + font-style: italic; +} +#quicksearch { + display: inline; +} +#quicksearch input { + background-image: url("graphics/search.png"); + background-repeat: no-repeat; + background-position: 2px center; + padding: 1px 0 1px 20px; +} +#quicksearch a { + display: inline-block; + padding: 2px 4px; +} -- 2.11.0