]> git.mjollnir.org Git - s9y.git/commitdiff
adding freetag plugin joh-1.0
authorPenny Leach <penny@mickey.wgtn.cat-it.co.nz>
Mon, 29 Jan 2007 05:27:49 +0000 (18:27 +1300)
committerPenny Leach <penny@mickey.wgtn.cat-it.co.nz>
Mon, 29 Jan 2007 05:27:49 +0000 (18:27 +1300)
20 files changed:
plugins/serendipity_event_freetag/ChangeLog [new file with mode: 0644]
plugins/serendipity_event_freetag/README [new file with mode: 0644]
plugins/serendipity_event_freetag/UTF-8/CVS/Entries [new file with mode: 0644]
plugins/serendipity_event_freetag/UTF-8/CVS/Repository [new file with mode: 0644]
plugins/serendipity_event_freetag/UTF-8/CVS/Root [new file with mode: 0644]
plugins/serendipity_event_freetag/UTF-8/lang_de.inc.php [new file with mode: 0644]
plugins/serendipity_event_freetag/UTF-8/lang_fr.inc.php [new file with mode: 0644]
plugins/serendipity_event_freetag/UTF-8/lang_it.inc.php [new file with mode: 0644]
plugins/serendipity_event_freetag/UTF-8/lang_ja.inc.php [new file with mode: 0644]
plugins/serendipity_event_freetag/UTF-8/lang_nl.inc.php [new file with mode: 0644]
plugins/serendipity_event_freetag/UTF-8/lang_pl.inc.php [new file with mode: 0644]
plugins/serendipity_event_freetag/lang_de.inc.php [new file with mode: 0644]
plugins/serendipity_event_freetag/lang_en.inc.php [new file with mode: 0644]
plugins/serendipity_event_freetag/lang_fr.inc.php [new file with mode: 0644]
plugins/serendipity_event_freetag/lang_it.inc.php [new file with mode: 0644]
plugins/serendipity_event_freetag/lang_ja.inc.php [new file with mode: 0644]
plugins/serendipity_event_freetag/lang_nl.inc.php [new file with mode: 0644]
plugins/serendipity_event_freetag/lang_pl.inc.php [new file with mode: 0644]
plugins/serendipity_event_freetag/serendipity_event_freetag.php [new file with mode: 0644]
plugins/serendipity_event_freetag/serendipity_plugin_freetag.php [new file with mode: 0644]

diff --git a/plugins/serendipity_event_freetag/ChangeLog b/plugins/serendipity_event_freetag/ChangeLog
new file mode 100644 (file)
index 0000000..33ae742
--- /dev/null
@@ -0,0 +1,22 @@
+2.70:
+-----
+ * Added possiblity for "automatted tags". These will indicate what tags to assign to an entry
+   when keywords are found in an entry
+
+2.64:
+-----
+ * Added option to convert categories to tags
+
+2.48:
+-----
+ * Config option for lowercasing, patch by Lars Strojny
+
+2.47:
+----
+ * Better show metastuff
+
+2.44:
+----
+ * Show related Entries, patch by stain
+ * Make configurable where to show tags
+
diff --git a/plugins/serendipity_event_freetag/README b/plugins/serendipity_event_freetag/README
new file mode 100644 (file)
index 0000000..38adced
--- /dev/null
@@ -0,0 +1,38 @@
+Using this subquery you can convert existing categories to tags:
+
+INSERT INTO serendipity_entrytags (entryid, tag) 
+  SELECT serendipity_entries.id, serendipity_category.category_name 
+    FROM serendipity_entries, serendipity_category, serendipity_entrycat 
+   WHERE serendipity_entrycat.entryid = serendipity_entries.id 
+     AND serendipity_category.categoryid = serendipity_entrycat.categoryid;
+
+[quoted from: http://pixelated-dreams.com/archives/229-Spring-Cleaning.html]
+
+Or using this script you can convert existing categories to tags:
+
+<?php
+include 'serendipity_config.inc.php';
+
+$rows = serendipity_db_query("SELECT e.id, e.title, c.category_name
+                                FROM {$serendipity['dbPrefix']}entries AS e
+                                JOIN {$serendipity['dbPrefix']}entrycat AS ec
+                                  ON ec.entryid = e.id
+                                JOIN {$serendipity['dbPrefix']}category AS c
+                                  ON ec.categoryid = c.categoryid");
+
+foreach($rows AS $row) {
+    serendipity_db_query(
+        sprintf(
+            "REPLACE INTO {$serendipity['dbPrefix']}entrytags (entryid, tag) VALUES (%d, %s)",
+            (int)$row['id'],
+            serendipity_db_escape_string($row['category_name'])
+        )
+    );
+    
+    printf(
+        "Category '%s' added as Tag for Entry #%d, '%s'<br />\n",
+        htmlspecialchars($row['category_name']),
+        (int)$row['id'],
+        htmlspecialchars($row['title'])
+    );
+}
\ No newline at end of file
diff --git a/plugins/serendipity_event_freetag/UTF-8/CVS/Entries b/plugins/serendipity_event_freetag/UTF-8/CVS/Entries
new file mode 100644 (file)
index 0000000..0907e75
--- /dev/null
@@ -0,0 +1,7 @@
+/lang_it.inc.php/1.1/Wed Apr 19 09:33:20 2006//
+/lang_pl.inc.php/1.1/Mon Jul 17 08:22:23 2006//
+/lang_ja.inc.php/1.4/Fri Aug 18 07:31:17 2006//
+/lang_nl.inc.php/1.2/Thu Nov  2 10:18:09 2006//
+/lang_de.inc.php/1.8/Sun Nov 19 08:31:30 2006//
+/lang_fr.inc.php/1.1/Sat Dec 30 11:02:21 2006//
+D
diff --git a/plugins/serendipity_event_freetag/UTF-8/CVS/Repository b/plugins/serendipity_event_freetag/UTF-8/CVS/Repository
new file mode 100644 (file)
index 0000000..1ad4ba2
--- /dev/null
@@ -0,0 +1 @@
+additional_plugins/serendipity_event_freetag/UTF-8
diff --git a/plugins/serendipity_event_freetag/UTF-8/CVS/Root b/plugins/serendipity_event_freetag/UTF-8/CVS/Root
new file mode 100644 (file)
index 0000000..d3135e5
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@php-blog.cvs.sourceforge.net:/cvsroot/php-blog
diff --git a/plugins/serendipity_event_freetag/UTF-8/lang_de.inc.php b/plugins/serendipity_event_freetag/UTF-8/lang_de.inc.php
new file mode 100644 (file)
index 0000000..88897c9
--- /dev/null
@@ -0,0 +1,66 @@
+<?php # $Id: lang_de.inc.php,v 1.8 2006/11/18 20:26:26 garvinhicking Exp $
+
+/**
+ *  @version $Revision: 1.8 $
+ *  @author Translator Name <yourmail@example.com>
+ *  EN-Revision: Revision of lang_en.inc.php
+ */
+
+//
+//  serendipity_event_freetag.php
+//
+@define('PLUGIN_EVENT_FREETAG_TITLE', 'Freie Artikel-Tags');
+@define('PLUGIN_EVENT_FREETAG_DESC', 'Erlaubt das freie Tagging von Artikeln');
+@define('PLUGIN_EVENT_FREETAG_ENTERDESC', 'Bitte alle zutreffenden Tags angeben. Mehrere zutreffende Tags mit Komma (,) trennen');
+@define('PLUGIN_EVENT_FREETAG_LIST', 'Tags für diesen Artikel: %s');
+@define('PLUGIN_EVENT_FREETAG_USING', 'Artikel mit Tag %s');
+@define('PLUGIN_EVENT_FREETAG_SUBTAG', 'Verwandte Tags zu Tag %s');
+@define('PLUGIN_EVENT_FREETAG_NO_RELATED','Keine verwandten Tags gefunden.');
+@define('PLUGIN_EVENT_FREETAG_ALLTAGS', 'Alle festgelegten Tags');
+@define('PLUGIN_EVENT_FREETAG_MANAGETAGS', 'Tags verwalten');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ALL', 'Alle Tags verwalten');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LEAF', '\'Verwaiste\' Tags verwalten');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED', 'Einträge ohne Tags anzeigen');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LEAFTAGGED', 'Einträge mit \'verwaisten\' Tags anzeigen');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED_NONE', 'Keine Einträge ohne Tags gefunden!');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_TAG', 'Tag');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_WEIGHT', 'Häufigkeit');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_ACTIONS', 'Funktionen');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_RENAME', 'Umbenennen');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_SPLIT', 'Aufteilen');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_DELETE', 'Löschen');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_CONFIRM_DELETE', 'Tag %s wirklich löschen?');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_INFO_SPLIT', 'Tags mit einem Komma trennen:');
+@define('PLUGIN_EVENT_FREETAG_SHOW_TAGCLOUD', 'Zeige Wolke mit verwandten Tags an?');
+
+//
+//  serendipity_plugin_freetag.php
+//
+@define('PLUGIN_FREETAG_NAME', 'Getaggte Artikel');
+@define('PLUGIN_FREETAG_BLAHBLAH', 'Zeigt alle vorhandenen Tags');
+@define('PLUGIN_FREETAG_NEWLINE', 'Zeilenumbruch nach jedem Tag?');
+@define('PLUGIN_FREETAG_XML', 'XML-Icons anzeigen?');
+@define('PLUGIN_FREETAG_SCALE', 'Schriftgröße des Font-Tags je nach Popularität vergrößern (wie Technorati, flickr)?');
+@define('PLUGIN_FREETAG_UPGRADE1_2','Aktualisiere %d Tags zu Eintrag %d');
+@define('PLUGIN_FREETAG_MAX_TAGS', 'Wieviele Tags sollen angezeigt werden?');
+@define('PLUGIN_FREETAG_TRESHOLD_TAG_COUNT', 'Wie oft muß ein Tag vorkommen, damit er angezeigt wird?');
+@define('PLUGIN_EVENT_FREETAG_TAGCLOUD_MIN', 'Minimale Schriftgröße eines Tags in der Wolke in %');
+@define('PLUGIN_EVENT_FREETAG_TAGCLOUD_MAX', 'Maximale Schriftgröße eines Tags in der Wolke in %');
+@define('PLUGIN_FREETAG_META_KEYWORDS', 'Anzahl der Stichwörter, die in die Meta-Angaben des HTML-Codes eingesetzt werden sollen (0: abgeschaltet)');
+@define('PLUGIN_EVENT_FREETAG_RELATED_ENTRIES', 'Artikel mit ähnlichen Themen:');
+@define('PLUGIN_EVENT_FREETAG_SHOW_RELATED','Zeige Artikel mit ähnlichen Themen an?');
+@define('PLUGIN_EVENT_FREETAG_SHOW_RELATED_COUNT','Wieviele Artikel mit ähnlichen Themen sollen angezeigt werden?');
+@define('PLUGIN_EVENT_FREETAG_EMBED_FOOTER', 'Zeige die Tags in der Fußzeile an?');
+@define('PLUGIN_EVENT_FREETAG_EMBED_FOOTER_DESC', 'Falls eingeschaltet, werden die Tags in der Fußzeile des Eintrags angezeigt. Wenn abgeschaltet, werden die Tags innerhalb des Textkörpers/erweiterten Teils des Artikels angezeigt.');
+@define('PLUGIN_EVENT_FREETAG_LOWERCASE_TAGS', 'Tags in Kleinbuchstaben umwandeln');
+@define('PLUGIN_EVENT_FREETAG_RELATED_TAGS', 'Verwandte Tags');
+
+@define('PLUGIN_EVENT_FREETAG_CAT2TAG', 'Erstelle Tags für zugewiesene Kategorien?');
+@define('PLUGIN_EVENT_FREETAG_CAT2TAG_DESC', 'Falls aktiviert werden alle Kategorien eines Eintrags als Tags zugewiesen. Alle bestehende Kategoriezuweisungen können über die Tag-Verwaltung in Tags konvertiert werden.');
+@define('PLUGIN_EVENT_FREETAG_GLOBALLINKS', 'Alle zugewiesenen Kategorien bestehender Artikel zu Tags konvertieren');
+@define('PLUGIN_EVENT_FREETAG_GLOBALCAT2TAG_ENTRY', 'Kategorien von Artikel #%d (%s) konvertiert zu: %s.');
+@define('PLUGIN_EVENT_FREETAG_GLOBALCAT2TAG', 'Alle Kategorien wurden zu Tags konvertiert.');
+
+@define('PLUGIN_EVENT_FREETAG_KEYWORDS', 'Automatische Schlüsselwörter');
+@define('PLUGIN_EVENT_FREETAG_KEYWORDS_DESC', 'Sie können Schlüsselwörter (mit "," getrennt) für jedes Tag zuweisen. Immer wenn eines dieser Schlüsselwörter im Text gefunden wird, wird der zugehörige Tag automatisch dem Eintrag zugewiesen. Achten Sie darauf dass sehr viele automatische Schlüsselwörter beim Speichern eines Artikels längere Zeit beanspruchen können.');
+@define('PLUGIN_EVENT_FREETAG_KEYWORDS_ADD', 'Schlüsselwort <strong>%s</strong> gefunden, Tag <strong><em>%s</em></strong> automatisch zugewiesen.<br />');
diff --git a/plugins/serendipity_event_freetag/UTF-8/lang_fr.inc.php b/plugins/serendipity_event_freetag/UTF-8/lang_fr.inc.php
new file mode 100644 (file)
index 0000000..e81ecb3
--- /dev/null
@@ -0,0 +1,53 @@
+<?php # $Id: lang_fr.inc.php,v 1.1 2006/12/30 11:02:21 garvinhicking Exp $
+
+/**
+ *  @version $Revision: 1.1 $
+ *  @author P'tit Lu <ptitlu@ptitlu.org>
+ *  EN-Revision: Revision of lang_en.inc.php
+ */
+
+//
+//  serendipity_event_freetag.php
+//
+@define('PLUGIN_EVENT_FREETAG_TITLE', 'Marquage des entrées');
+@define('PLUGIN_EVENT_FREETAG_DESC', 'Autorise le marquage libre des billets');
+@define('PLUGIN_EVENT_FREETAG_ENTERDESC', 'Entrez tous les tags s\'appliquant. Séparer les tags multiples par des virgules (,)');
+@define('PLUGIN_EVENT_FREETAG_LIST', 'Tags pour ce billet: %s');
+@define('PLUGIN_EVENT_FREETAG_USING', 'Billets marqués comme %s');
+@define('PLUGIN_EVENT_FREETAG_SUBTAG', 'Tags se rapportant au tag %s');
+@define('PLUGIN_EVENT_FREETAG_NO_RELATED','Pas de tags en rapport.');
+@define('PLUGIN_EVENT_FREETAG_ALLTAGS', 'Tous les tags définis');
+@define('PLUGIN_EVENT_FREETAG_MANAGETAGS', 'Gérer les tags');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ALL', 'Gérer tous les tags');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LEAF', 'Gérer les tags \'orphelins\'');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED', 'Lister les billets non marqués');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LEAFTAGGED', 'Lister les billets marqués \'orphelins\'');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED_NONE', 'Aucune entrée non marquée');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_TAG', 'Tag');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_WEIGHT', 'Poids');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_ACTIONS', 'Action');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_RENAME', 'Renommer');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_SPLIT', 'Séparer');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_DELETE', 'Effacer');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_CONFIRM_DELETE', 'voulez-vous vraiment effacer le tag %s ?');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_INFO_SPLIT', 'Utilisez la virgule pour séparer les tags :');
+@define('PLUGIN_EVENT_FREETAG_SHOW_TAGCLOUD', 'Afficher le nuage de tags pour les tags en rapport ?');
+@define('PLUGIN_EVENT_FREETAG_RELATED_ENTRIES', 'Billets ayant les mêmes tags :');
+@define('PLUGIN_EVENT_FREETAG_SHOW_RELATED','Afficher les billets ayant les même tags  ?');
+@define('PLUGIN_EVENT_FREETAG_SHOW_RELATED_COUNT','Combien de billets doivent être affichés ?');
+
+//
+//  serendipity_plugin_freetag.php
+//
+@define('PLUGIN_FREETAG_NAME', 'Nuage de tags');
+@define('PLUGIN_FREETAG_BLAHBLAH', 'Montre une liste des tags existant pour les billets');
+@define('PLUGIN_FREETAG_NEWLINE', 'Retour à la ligne après chaque tag ?');
+@define('PLUGIN_FREETAG_XML', 'Afficher les icones XML ?');
+@define('PLUGIN_FREETAG_SCALE','Ajuster la taille du tag par rapport à sa fréquence (comme sur Technorati, flickr) ?');
+@define('PLUGIN_FREETAG_UPGRADE1_2','Mise à jour des tags %d pour le billet numéro: %d');
+@define('PLUGIN_FREETAG_MAX_TAGS', 'Combien de tags doivent être affichés ?');
+@define('PLUGIN_FREETAG_TRESHOLD_TAG_COUNT', 'Combien de fois un tag doit-il être présent pour apparaître ?');
+
+@define('PLUGIN_EVENT_FREETAG_TAGCLOUD_MIN', 'Taille de police minimale (%) d\'un tag dans le nuage');
+@define('PLUGIN_EVENT_FREETAG_TAGCLOUD_MAX', 'Taille de police maximale (%) d\'un tag dans le nuage');
+?>
diff --git a/plugins/serendipity_event_freetag/UTF-8/lang_it.inc.php b/plugins/serendipity_event_freetag/UTF-8/lang_it.inc.php
new file mode 100644 (file)
index 0000000..3140fba
--- /dev/null
@@ -0,0 +1,53 @@
+<?php # $Id: lang_it.inc.php,v 1.1 2006/04/19 09:33:20 garvinhicking Exp $
+
+/**
+ *  @version $Revision: 1.1 $
+ *  @author Alberto Mucignat <alberto.mucignat@gmail.com>
+ *  EN-Revision: Revision of lang_en.inc.php
+ */
+
+//
+//  serendipity_event_freetag.php
+//
+@define('PLUGIN_EVENT_FREETAG_TITLE', 'Freetag');
+@define('PLUGIN_EVENT_FREETAG_DESC', 'Consente il libero tagging dei post');
+@define('PLUGIN_EVENT_FREETAG_ENTERDESC', 'Inserisci i tag. I tag diversi vanno separati con la virgola (,)');
+@define('PLUGIN_EVENT_FREETAG_LIST', 'Tags: %s');
+@define('PLUGIN_EVENT_FREETAG_USING', 'Post con tag %s');
+@define('PLUGIN_EVENT_FREETAG_SUBTAG', 'Tag simili a %s');
+@define('PLUGIN_EVENT_FREETAG_NO_RELATED','Non ci sono tag associati.');
+@define('PLUGIN_EVENT_FREETAG_ALLTAGS', 'Tutti i tag');
+@define('PLUGIN_EVENT_FREETAG_MANAGETAGS', 'Gestione tag');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ALL', 'Gestione di tutti i tag');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LEAF', 'Gestione dei tag \'foglie\'');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED', 'Lista dei post senza tag');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LEAFTAGGED', 'Lista dei post con tag \'foglie\'');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED_NONE', 'Non ci sono post senza !');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_TAG', 'Tag');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_WEIGHT', 'Peso');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_ACTIONS', 'Azione');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_RENAME', 'Rinomina');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_SPLIT', 'Splitta');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_DELETE', 'Cancella');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_CONFIRM_DELETE', 'Vuoi veramente cancellare il tag %s?');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_INFO_SPLIT', 'Usa la virgola per separare i tag:');
+@define('PLUGIN_EVENT_FREETAG_SHOW_TAGCLOUD', 'Visualizza la nuvola dei tag correlati ai post?');
+@define('PLUGIN_EVENT_FREETAG_RELATED_ENTRIES', 'Post simili:');
+@define('PLUGIN_EVENT_FREETAG_SHOW_RELATED','Visualizzare post simili?');
+@define('PLUGIN_EVENT_FREETAG_SHOW_RELATED_COUNT','Quanti post simili devono essere visualizzati?');
+
+//
+//  serendipity_plugin_freetag.php
+//
+@define('PLUGIN_FREETAG_NAME', 'Tags');
+@define('PLUGIN_FREETAG_BLAHBLAH', 'Mostra i tag associati ai post');
+@define('PLUGIN_FREETAG_NEWLINE', 'Fineriga dopo ogni tag?');
+@define('PLUGIN_FREETAG_XML', 'Visualizza le icone XML?');
+@define('PLUGIN_FREETAG_SCALE','Scala la dimensione dei font in base alla popolarit\88 (come Technorati, Flickr)?');
+@define('PLUGIN_FREETAG_UPGRADE1_2','Salvando i tag %d per il post %d');
+@define('PLUGIN_FREETAG_MAX_TAGS', 'Quanti tag devono essere visualizzati?');
+@define('PLUGIN_FREETAG_TRESHOLD_TAG_COUNT', 'Quante occorrenze deve avere un tag per essere visibile?');
+
+@define('PLUGIN_EVENT_FREETAG_TAGCLOUD_MIN', 'Misura minima del font % di un tag nella nuvola');
+@define('PLUGIN_EVENT_FREETAG_TAGCLOUD_MAX', 'Misura massima del font  % di un tag nella nuvola');
+?>
diff --git a/plugins/serendipity_event_freetag/UTF-8/lang_ja.inc.php b/plugins/serendipity_event_freetag/UTF-8/lang_ja.inc.php
new file mode 100644 (file)
index 0000000..719837e
--- /dev/null
@@ -0,0 +1,61 @@
+<?php # $Id: lang_ja.inc.php,v 1.4 2006/08/17 16:54:34 elf2000 Exp $
+
+/**
+ *  @version $Revision: 1.4 $
+ *  @author Tadashi Jokagi <elf2000@users.sourceforge.net>
+ *  EN-Revision: 1.11
+ */
+
+//
+//  serendipity_event_freetag.php
+//
+@define('PLUGIN_EVENT_FREETAG_TITLE', 'エントリのタグ');
+@define('PLUGIN_EVENT_FREETAG_DESC', 'エントリの自由なタグを許可します。');
+@define('PLUGIN_EVENT_FREETAG_ENTERDESC', 'いくつかのタグをエントリに適用します。カンマ(「,」)で複数のタグを分割します。');
+@define('PLUGIN_EVENT_FREETAG_LIST', 'このエントリに定義されたタグ: %s');
+@define('PLUGIN_EVENT_FREETAG_USING', '「%s」としてタグ付けされたエントリ');
+@define('PLUGIN_EVENT_FREETAG_SUBTAG', 'タグ「%s」に関連したタグ');
+@define('PLUGIN_EVENT_FREETAG_NO_RELATED','関連したタグはありません。');
+@define('PLUGIN_EVENT_FREETAG_ALLTAGS', 'すべての定義済みタグ');
+@define('PLUGIN_EVENT_FREETAG_MANAGETAGS', 'タグを管理する');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ALL', 'すべてのタグを管理する');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LEAF', '「空」のタグを管理する');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED', 'タグがないエントリの一覧');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LEAFTAGGED', '「空」タグのエントリの一覧');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED_NONE', 'エントリはタグがありません!');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_TAG', 'タグ');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_WEIGHT', '重み');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_ACTIONS', '操作');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_RENAME', '名称変更');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_SPLIT', '分割');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_DELETE', '削除');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_CONFIRM_DELETE', 'タグ「%s」を本当に削除しますか?');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_INFO_SPLIT', 'カンマで区切ったタグを使用する:');
+@define('PLUGIN_EVENT_FREETAG_SHOW_TAGCLOUD', '関連タグへのタグクラウドを表示しますか?');
+@define('PLUGIN_EVENT_FREETAG_SEND_HTTP_HEADER', 'X-FreeTag-HTTP-Headers を送信する');
+//
+//  serendipity_plugin_freetag.php
+//
+@define('PLUGIN_FREETAG_NAME', 'エントリタグの表示');
+@define('PLUGIN_FREETAG_BLAHBLAH', 'エントリの既存タグの一覧を表示します。');
+@define('PLUGIN_FREETAG_NEWLINE', '各タグの後に改行を入れますか?');
+@define('PLUGIN_FREETAG_XML', 'XML アイコンを表示しますか?');
+@define('PLUGIN_FREETAG_SCALE','(Technorati、flickr のように)タグのフォントサイズを人気度に依存して変化させますか?');
+@define('PLUGIN_FREETAG_UPGRADE1_2','エントリ番号の %d 個のタグをアップグレード中: %d');
+@define('PLUGIN_FREETAG_MAX_TAGS', 'いくつのタグを表示するべきですか?');
+@define('PLUGIN_FREETAG_TRESHOLD_TAG_COUNT', 'How many occurences must a tag have in order to be shown?');
+
+@define('PLUGIN_EVENT_FREETAG_TAGCLOUD_MIN', 'タグクラウドの最小フォントサイズ(単位:パーセント)');
+@define('PLUGIN_EVENT_FREETAG_TAGCLOUD_MAX', 'タグクラウドの最大フォントサイズ(単位:パーセント)');
+
+@define('PLUGIN_FREETAG_META_KEYWORDS', 'Number of meta keywords to embed in HTML source (0: disabled)');
+
+@define('PLUGIN_EVENT_FREETAG_RELATED_ENTRIES', 'タグに関連するエントリ一覧:');
+@define('PLUGIN_EVENT_FREETAG_SHOW_RELATED','Display related entries by tags?');
+@define('PLUGIN_EVENT_FREETAG_SHOW_RELATED_COUNT','How many related entries should be dislayed?');
+@define('PLUGIN_EVENT_FREETAG_EMBED_FOOTER', 'フッターでタグを表示しますか?');
+@define('PLUGIN_EVENT_FREETAG_EMBED_FOOTER_DESC', 'If enabled, the tags will be shown in the footer of an entry. If disabled, the tags will be put inside the body/extended part of your entries.');
+@define('PLUGIN_EVENT_FREETAG_LOWERCASE_TAGS', 'Lowercase tags');
+
+@define('PLUGIN_EVENT_FREETAG_RELATED_TAGS', '関連タグ');
+@define('PLUGIN_EVENT_FREETAG_TAGLINK', 'Taglink');
diff --git a/plugins/serendipity_event_freetag/UTF-8/lang_nl.inc.php b/plugins/serendipity_event_freetag/UTF-8/lang_nl.inc.php
new file mode 100644 (file)
index 0000000..6ff2c85
--- /dev/null
@@ -0,0 +1,61 @@
+<?php # $Id: lang_nl.inc.php,v 1.2 2006/11/02 10:18:09 garvinhicking Exp $
+
+/**
+ *  @version $Revision: 1.2 $
+ *  @author Ivo Jansch <ivo@ibuildings.nl>
+ *  NL-Revision: Revision of lang_nl.inc.php
+ */
+
+//
+//  serendipity_event_freetag.php
+//
+@define('PLUGIN_EVENT_FREETAG_TITLE', 'Taggen van bijdragen');
+@define('PLUGIN_EVENT_FREETAG_DESC', 'Maakt het mogelijk om bijdragen van tags te voorzien');
+@define('PLUGIN_EVENT_FREETAG_ENTERDESC', 'Vul relevante tags in, meerdere tags kunnen met een komma worden gescheiden (,)');
+@define('PLUGIN_EVENT_FREETAG_LIST', 'Tags voor deze bijdrage: %s');
+@define('PLUGIN_EVENT_FREETAG_USING', 'Bijdragen met tag %s');
+@define('PLUGIN_EVENT_FREETAG_SUBTAG', 'Tags gerelateerd aan tag %s');
+@define('PLUGIN_EVENT_FREETAG_NO_RELATED','Geen gerelateerde tags.');
+@define('PLUGIN_EVENT_FREETAG_ALLTAGS', 'Alle tags');
+@define('PLUGIN_EVENT_FREETAG_MANAGETAGS', 'Beheer tags');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ALL', 'Beheer alle tags');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LEAF', 'Beheer \'leaf\' tags');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED', 'Laat niet-getagde bijdragen zien');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LEAFTAGGED', 'Laat \'leaf\' getagde bijdragen zien');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED_NONE', 'Geen niet-getagde bijdragen!');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_TAG', 'Tag');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_WEIGHT', 'Gewicht');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_ACTIONS', 'Actie');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_RENAME', 'Hernoem');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_SPLIT', 'Splits');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_DELETE', 'Verwijder');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_CONFIRM_DELETE', 'Weet je zeker dat je de %s tag wil verwijderen?');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_INFO_SPLIT', 'gebruik een komma om tags te scheiden:');
+@define('PLUGIN_EVENT_FREETAG_SHOW_TAGCLOUD', 'Toon tag cloud met gerelateerde tags?');
+@define('PLUGIN_EVENT_FREETAG_SEND_HTTP_HEADER', 'Stuur X-FreeTag-HTTP-Headers?');
+//
+//  serendipity_plugin_freetag.php
+//
+@define('PLUGIN_FREETAG_NAME', 'Toon getagde bijdragen');
+@define('PLUGIN_FREETAG_BLAHBLAH', 'Toon een "tag cloud" van gebruikte tags');
+@define('PLUGIN_FREETAG_NEWLINE', 'Linefeed na elke tag?');
+@define('PLUGIN_FREETAG_XML', 'Toon XML-icoon?');
+@define('PLUGIN_FREETAG_SCALE','Lettergrootte obv populariteit (zoals Technorati, flickr)?');
+@define('PLUGIN_FREETAG_UPGRADE1_2','Bijwerken van %d tags voor bijdrage: %d');
+@define('PLUGIN_FREETAG_MAX_TAGS', 'Hoeveel tags maximaal tonen?');
+@define('PLUGIN_FREETAG_TRESHOLD_TAG_COUNT', 'Hoevaak moet een tag gebruikt zijn om getoond te worden?');
+
+@define('PLUGIN_EVENT_FREETAG_TAGCLOUD_MIN', 'Minimaal font percentage van tag in tag cloud?');
+@define('PLUGIN_EVENT_FREETAG_TAGCLOUD_MAX', 'Maximaal font percentage van tag in tag cloud?');
+
+@define('PLUGIN_FREETAG_META_KEYWORDS', 'Hoeveel meta keywords in HTML source invoegen? (0: uitgeschakeld)');
+
+@define('PLUGIN_EVENT_FREETAG_RELATED_ENTRIES', 'Gerelateerde bijdragen op basis van tags:');
+@define('PLUGIN_EVENT_FREETAG_SHOW_RELATED','Toon gerelateerde bijdragen obv tags?');
+@define('PLUGIN_EVENT_FREETAG_SHOW_RELATED_COUNT','Hoeveel gerelateerde bijdragen tonen?');
+@define('PLUGIN_EVENT_FREETAG_EMBED_FOOTER', 'Tags in footer weergeven?');
+@define('PLUGIN_EVENT_FREETAG_EMBED_FOOTER_DESC', 'Wanneer aktief, worden de tags in de footer van een bijdrage weergegeven. Wanneer niet aktief, worden de tags in de verkorte/uitgebreide bijdrage geplaatst.');
+@define('PLUGIN_EVENT_FREETAG_LOWERCASE_TAGS', 'Tags altijd in kleine letters?');
+
+@define('PLUGIN_EVENT_FREETAG_RELATED_TAGS', 'Gerelateerde tags');
+@define('PLUGIN_EVENT_FREETAG_TAGLINK', 'Taglink:');
diff --git a/plugins/serendipity_event_freetag/UTF-8/lang_pl.inc.php b/plugins/serendipity_event_freetag/UTF-8/lang_pl.inc.php
new file mode 100644 (file)
index 0000000..1461bd4
--- /dev/null
@@ -0,0 +1,59 @@
+<?php # $Id: lang_pl.inc.php,v 1.1 2006/07/17 08:22:23 garvinhicking Exp $
+
+/**
+ *  @version $Revision: 1.1 $
+ *  Kostas CoSTa Brzezinski <costa@kofeina.net>
+ *  EN-Revision: Revision of lang_en.inc.php
+ */
+
+//
+//  serendipity_event_freetag.php
+//
+@define('PLUGIN_EVENT_FREETAG_TITLE', 'Tagowanie wpisów');
+@define('PLUGIN_EVENT_FREETAG_DESC', 'Umożliwia dowolne tagowanie wpisów');
+@define('PLUGIN_EVENT_FREETAG_ENTERDESC', 'Wprowadź dowolne pasujące tagi. Rozdzielaj tagi przecinkami (,).');
+@define('PLUGIN_EVENT_FREETAG_LIST', 'Tagi dla tego wpisu: %s');
+@define('PLUGIN_EVENT_FREETAG_USING', 'Wpisy otagowane jako %s');
+@define('PLUGIN_EVENT_FREETAG_SUBTAG', 'Tagi powiązane z tagiem %s');
+@define('PLUGIN_EVENT_FREETAG_NO_RELATED', 'Brak powiązanych tagów.');
+@define('PLUGIN_EVENT_FREETAG_ALLTAGS', 'Wszystkie zdefiniowane tagi');
+@define('PLUGIN_EVENT_FREETAG_MANAGETAGS', 'Zarządzaj tagami');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ALL', 'Zarządzaj wszystkimi tagami');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LEAF', 'Zarządzaj tagami \'Leaf\' (pojedynczymi)');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED', 'Lista nieotagowanych wpisów');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LEAFTAGGED', 'Lista wpisów z tagami \'Leaf\'');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED_NONE', 'Nie ma nieotagowanych wpisów!');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_TAG', 'Tag');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_WEIGHT', 'Waga');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_ACTIONS', 'Akcja');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_RENAME', 'Zmień nazwę');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_SPLIT', 'Rozdziel');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_DELETE', 'Usuń');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_CONFIRM_DELETE', 'Na pewno chcesz usunąć tag %s?');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_INFO_SPLIT', 'użyj przecinka by rozdzielić tagi:');
+@define('PLUGIN_EVENT_FREETAG_SHOW_TAGCLOUD', 'Pokazać tag cloud (chmurę tagów) do powiązanych wpisów?');
+
+//
+//  serendipity_plugin_freetag.php
+//
+@define('PLUGIN_FREETAG_NAME', 'Tagi');
+@define('PLUGIN_FREETAG_BLAHBLAH', 'Pokazuje listę tagów zdefiniowanych dla wpisów');
+@define('PLUGIN_FREETAG_NEWLINE', 'Przejście do nowej linii po każdym tagu?');
+@define('PLUGIN_FREETAG_XML', 'Pokazywać ikony XML?');
+@define('PLUGIN_FREETAG_SCALE', 'Skalować rozmiar czcionki w zależności od popularności taga (jak w serwisach Technorati czy flickr)?');
+@define('PLUGIN_FREETAG_UPGRADE1_2', 'Poprawiono %d tagów dla wpisu numer: %d');
+@define('PLUGIN_FREETAG_MAX_TAGS', 'Jak wiele tagów ma być pokazywanych?');
+@define('PLUGIN_FREETAG_TRESHOLD_TAG_COUNT', 'Jak wiele razy musi wystąpić dany tag, by był pokazywany na liście?');
+
+@define('PLUGIN_EVENT_FREETAG_TAGCLOUD_MIN', 'Minimalny rozmiar czcionki w procentach (%) w chmurze tagów (tag cloud)');
+@define('PLUGIN_EVENT_FREETAG_TAGCLOUD_MAX', 'Maksymalny rozmiar czcionki w procentach (%) w chmurze tagów (tag cloud)');
+
+@define('PLUGIN_FREETAG_META_KEYWORDS', 'Ilość słów kluczowych meta umieszczanych w źródle HTML (0: wyłączenie opcji)');
+
+@define('PLUGIN_EVENT_FREETAG_RELATED_ENTRIES', 'Powiązane wpisy wedlug tagów:');
+@define('PLUGIN_EVENT_FREETAG_SHOW_RELATED', 'Wyświetlać wpisy powiązane według tagów?');
+@define('PLUGIN_EVENT_FREETAG_SHOW_RELATED_COUNT', 'Jak wiele powiązanych wpisów ma być pokazywanych?');
+@define('PLUGIN_EVENT_FREETAG_EMBED_FOOTER', 'Pokazywać tagi w stopce wpisu?');
+@define('PLUGIN_EVENT_FREETAG_EMBED_FOOTER_DESC', 'Jeśli opcja jest włączona, tagi będą pokazywane w stopce wpisu. Jeśli opcja będzie wyłączona, tagi zostaną umieszczone w treści (na samym dole) wpisu lub rozszerzonej treści wpisu.');
+@define('PLUGIN_EVENT_FREETAG_LOWERCASE_TAGS', 'Pokaż tagi tylko małymi literami');
+
diff --git a/plugins/serendipity_event_freetag/lang_de.inc.php b/plugins/serendipity_event_freetag/lang_de.inc.php
new file mode 100644 (file)
index 0000000..c8dda5e
--- /dev/null
@@ -0,0 +1,68 @@
+<?php # $Id: lang_de.inc.php,v 1.9 2006/11/18 20:26:26 garvinhicking Exp $
+
+/**
+ *  @version $Revision: 1.9 $
+ *  @author Translator Name <yourmail@example.com>
+ *  EN-Revision: Revision of lang_en.inc.php
+ */
+
+//
+//  serendipity_event_freetag.php
+//
+@define('PLUGIN_EVENT_FREETAG_TITLE', 'Freie Artikel-Tags');
+@define('PLUGIN_EVENT_FREETAG_DESC', 'Erlaubt das freie Tagging von Artikeln');
+@define('PLUGIN_EVENT_FREETAG_ENTERDESC', 'Bitte alle zutreffenden Tags angeben. Mehrere zutreffende Tags mit Komma (,) trennen');
+@define('PLUGIN_EVENT_FREETAG_LIST', 'Tags für diesen Artikel: %s');
+@define('PLUGIN_EVENT_FREETAG_USING', 'Artikel mit Tag %s');
+@define('PLUGIN_EVENT_FREETAG_SUBTAG', 'Verwandte Tags zu Tag %s');
+@define('PLUGIN_EVENT_FREETAG_NO_RELATED','Keine verwandten Tags gefunden.');
+@define('PLUGIN_EVENT_FREETAG_ALLTAGS', 'Alle festgelegten Tags');
+@define('PLUGIN_EVENT_FREETAG_MANAGETAGS', 'Tags verwalten');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ALL', 'Alle Tags verwalten');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LEAF', '\'Verwaiste\' Tags verwalten');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED', 'Einträge ohne Tags anzeigen');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LEAFTAGGED', 'Einträge mit \'verwaisten\' Tags anzeigen');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED_NONE', 'Keine Einträge ohne Tags gefunden!');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_TAG', 'Tag');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_WEIGHT', 'Häufigkeit');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_ACTIONS', 'Funktionen');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_RENAME', 'Umbenennen');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_SPLIT', 'Aufteilen');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_DELETE', 'Löschen');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_CONFIRM_DELETE', 'Tag %s wirklich löschen?');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_INFO_SPLIT', 'Tags mit einem Komma trennen:');
+@define('PLUGIN_EVENT_FREETAG_SHOW_TAGCLOUD', 'Zeige Wolke mit verwandten Tags an?');
+@define('PLUGIN_EVENT_FREETAG_SEND_HTTP_HEADER', 'Sende X-FreeTag-HTTP-Header');
+
+//
+//  serendipity_plugin_freetag.php
+//
+@define('PLUGIN_FREETAG_NAME', 'Getaggte Artikel');
+@define('PLUGIN_FREETAG_BLAHBLAH', 'Zeigt alle vorhandenen Tags');
+@define('PLUGIN_FREETAG_NEWLINE', 'Zeilenumbruch nach jedem Tag?');
+@define('PLUGIN_FREETAG_XML', 'XML-Icons anzeigen?');
+@define('PLUGIN_FREETAG_SCALE', 'Schriftgröße des Font-Tags je nach Popularität vergrößern (wie Technorati, flickr)?');
+@define('PLUGIN_FREETAG_UPGRADE1_2','Aktualisiere %d Tags zu Eintrag %d');
+@define('PLUGIN_FREETAG_MAX_TAGS', 'Wieviele Tags sollen angezeigt werden?');
+@define('PLUGIN_FREETAG_TRESHOLD_TAG_COUNT', 'Wie oft muß ein Tag vorkommen, damit er angezeigt wird?');
+@define('PLUGIN_EVENT_FREETAG_TAGCLOUD_MIN', 'Minimale Schriftgröße eines Tags in der Wolke in %');
+@define('PLUGIN_EVENT_FREETAG_TAGCLOUD_MAX', 'Maximale Schriftgröße eines Tags in der Wolke in %');
+@define('PLUGIN_FREETAG_META_KEYWORDS', 'Anzahl der Stichwörter, die in die Meta-Angaben des HTML-Codes eingesetzt werden sollen (0: abgeschaltet)');
+@define('PLUGIN_EVENT_FREETAG_RELATED_ENTRIES', 'Artikel mit ähnlichen Themen:');
+@define('PLUGIN_EVENT_FREETAG_SHOW_RELATED','Zeige Artikel mit ähnlichen Themen an?');
+@define('PLUGIN_EVENT_FREETAG_SHOW_RELATED_COUNT','Wieviele Artikel mit ähnlichen Themen sollen angezeigt werden?');
+@define('PLUGIN_EVENT_FREETAG_EMBED_FOOTER', 'Zeige die Tags in der Fußzeile an?');
+@define('PLUGIN_EVENT_FREETAG_EMBED_FOOTER_DESC', 'Falls eingeschaltet, werden die Tags in der Fußzeile des Eintrags angezeigt. Wenn abgeschaltet, werden die Tags innerhalb des Textkörpers/erweiterten Teils des Artikels angezeigt.');
+@define('PLUGIN_EVENT_FREETAG_LOWERCASE_TAGS', 'Tags in Kleinbuchstaben umwandeln');
+
+@define('PLUGIN_EVENT_FREETAG_RELATED_TAGS', 'Verwandte Tags');
+
+@define('PLUGIN_EVENT_FREETAG_CAT2TAG', 'Erstelle Tags für zugewiesene Kategorien?');
+@define('PLUGIN_EVENT_FREETAG_CAT2TAG_DESC', 'Falls aktiviert werden alle Kategorien eines Eintrags als Tags zugewiesen. Alle bestehende Kategoriezuweisungen können über die Tag-Verwaltung in Tags konvertiert werden.');
+@define('PLUGIN_EVENT_FREETAG_GLOBALLINKS', 'Alle zugewiesenen Kategorien bestehender Artikel zu Tags konvertieren');
+@define('PLUGIN_EVENT_FREETAG_GLOBALCAT2TAG_ENTRY', 'Kategorien von Artikel #%d (%s) konvertiert zu: %s.');
+@define('PLUGIN_EVENT_FREETAG_GLOBALCAT2TAG', 'Alle Kategorien wurden zu Tags konvertiert.');
+
+@define('PLUGIN_EVENT_FREETAG_KEYWORDS', 'Automatische Schlüsselwörter');
+@define('PLUGIN_EVENT_FREETAG_KEYWORDS_DESC', 'Sie können Schlüsselwörter (mit "," getrennt) für jedes Tag zuweisen. Immer wenn eines dieser Schlüsselwörter im Text gefunden wird, wird der zugehörige Tag automatisch dem Eintrag zugewiesen. Achten Sie darauf dass sehr viele automatische Schlüsselwörter beim Speichern eines Artikels längere Zeit beanspruchen können.');
+@define('PLUGIN_EVENT_FREETAG_KEYWORDS_ADD', 'Schlüsselwort <strong>%s</strong> gefunden, Tag <strong><em>%s</em></strong> automatisch zugewiesen.<br />');
diff --git a/plugins/serendipity_event_freetag/lang_en.inc.php b/plugins/serendipity_event_freetag/lang_en.inc.php
new file mode 100644 (file)
index 0000000..6492da4
--- /dev/null
@@ -0,0 +1,76 @@
+<?php # $Id: lang_en.inc.php,v 1.14 2006/12/11 11:23:06 garvinhicking Exp $
+
+/**
+ *  @version $Revision: 1.14 $
+ *  @author Translator Name <yourmail@example.com>
+ *  EN-Revision: Revision of lang_en.inc.php
+ */
+
+//
+//  serendipity_event_freetag.php
+//
+@define('PLUGIN_EVENT_FREETAG_TITLE', 'Tagging of entries');
+@define('PLUGIN_EVENT_FREETAG_DESC', 'Allows freestyle tagging of entries');
+@define('PLUGIN_EVENT_FREETAG_ENTERDESC', 'Enter any tags that apply. Seperate multiple tags with a comma (,)');
+@define('PLUGIN_EVENT_FREETAG_LIST', 'Defined tags for this entry: %s');
+@define('PLUGIN_EVENT_FREETAG_USING', 'Entries tagged as %s');
+@define('PLUGIN_EVENT_FREETAG_SUBTAG', 'Tags related to tag %s');
+@define('PLUGIN_EVENT_FREETAG_NO_RELATED','No related tags.');
+@define('PLUGIN_EVENT_FREETAG_ALLTAGS', 'All defined Tags');
+@define('PLUGIN_EVENT_FREETAG_MANAGETAGS', 'Manage Tags');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ALL', 'Manage All Tags');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LEAF', 'Manage \'Leaf\' Tags');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED', 'List Untagged Entries');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LEAFTAGGED', 'List \'Leaf\' Tagged Entries');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED_NONE', 'No Untagged entries!');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_TAG', 'Tag');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_WEIGHT', 'Weight');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_ACTIONS', 'Action');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_RENAME', 'Rename');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_SPLIT', 'Split');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_DELETE', 'Delete');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_CONFIRM_DELETE', 'Do you really want to delete the %s tag?');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_INFO_SPLIT', 'use a comma to seperate tags:');
+@define('PLUGIN_EVENT_FREETAG_SHOW_TAGCLOUD', 'Show tag cloud to related tags?');
+@define('PLUGIN_EVENT_FREETAG_SEND_HTTP_HEADER', 'Send X-FreeTag-HTTP-Headers');
+//
+//  serendipity_plugin_freetag.php
+//
+@define('PLUGIN_FREETAG_NAME', 'Show tagged entries');
+@define('PLUGIN_FREETAG_BLAHBLAH', 'Shows a list of existing tags for entries');
+@define('PLUGIN_FREETAG_NEWLINE', 'Linefeed after each Tag?');
+@define('PLUGIN_FREETAG_XML', 'Show XML-icons?');
+@define('PLUGIN_FREETAG_SCALE','Scale tag font size depending on popularity (like Technorati, flickr)?');
+@define('PLUGIN_FREETAG_UPGRADE1_2','Upgrading %d tags for entry number: %d');
+@define('PLUGIN_FREETAG_MAX_TAGS', 'How many tags should be shown?');
+@define('PLUGIN_FREETAG_TRESHOLD_TAG_COUNT', 'How many occurences must a tag have in order to be shown?');
+
+@define('PLUGIN_EVENT_FREETAG_TAGCLOUD_MIN', 'Minimum font size % of tag in tag cloud');
+@define('PLUGIN_EVENT_FREETAG_TAGCLOUD_MAX', 'Maximum font size % of tag in tag cloud');
+
+@define('PLUGIN_FREETAG_META_KEYWORDS', 'Number of meta keywords to embed in HTML source (0: disabled)');
+
+@define('PLUGIN_EVENT_FREETAG_RELATED_ENTRIES', 'Related entries by tags:');
+@define('PLUGIN_EVENT_FREETAG_SHOW_RELATED','Display related entries by tags?');
+@define('PLUGIN_EVENT_FREETAG_SHOW_RELATED_COUNT','How many related entries should be dislayed?');
+@define('PLUGIN_EVENT_FREETAG_EMBED_FOOTER', 'Show tags in footer?');
+@define('PLUGIN_EVENT_FREETAG_EMBED_FOOTER_DESC', 'If enabled, the tags will be shown in the footer of an entry. If disabled, the tags will be put inside the body/extended part of your entries.');
+@define('PLUGIN_EVENT_FREETAG_LOWERCASE_TAGS', 'Lowercase tags');
+
+@define('PLUGIN_EVENT_FREETAG_RELATED_TAGS', 'Related tags');
+@define('PLUGIN_EVENT_FREETAG_TAGLINK', 'Taglink');
+@define('PLUGIN_EVENT_FREETAG_CAT2TAG', 'Create tags for all associated categories?');
+@define('PLUGIN_EVENT_FREETAG_CAT2TAG_DESC', 'If enabled, all categories that an entry is assigned to will be added as tags to your entry. You can set all category associations of all your existing entries within the "Manage Tags" menu of your Administration Suite.');
+@define('PLUGIN_EVENT_FREETAG_GLOBALLINKS', 'Convert all assigned categories of existing entries to tags');
+@define('PLUGIN_EVENT_FREETAG_GLOBALCAT2TAG_ENTRY', 'Converted categories of entry #%d (%s): %s.');
+@define('PLUGIN_EVENT_FREETAG_GLOBALCAT2TAG', 'All categories converted to tags.');
+
+@define('PLUGIN_EVENT_FREETAG_KEYWORDS', 'Automatted keywords');
+@define('PLUGIN_EVENT_FREETAG_KEYWORDS_DESC', 'You can assign keywords (separated by ",") for each tag. Whenever you use those keywords in the text of your entries, the corresponding tag is assigned to your entry. Note that many automatted keywords may increase the time taken for saving an entry.');
+@define('PLUGIN_EVENT_FREETAG_KEYWORDS_ADD', 'Found keyword <strong>%s</strong>, tag <strong><em>%s</em></strong> assigned automatically.<br />');
+
+@define('PLUGIN_EVENT_FREETAG_REBUILD_FETCHNO', 'Fetching entries %d to %d');
+@define('PLUGIN_EVENT_FREETAG_REBUILD_TOTAL', ' (totalling %d entries)...');
+@define('PLUGIN_EVENT_FREETAG_REBUILD_FETCHNEXT', 'Fetching next batch of entries...');
+@define('PLUGIN_EVENT_FREETAG_REBUILD', 'Reparse all automatted keywords');
+@define('PLUGIN_EVENT_FREETAG_REBUILD_DESC', 'Warning: This function will fetch and re-save every single one of your entries. This will take some time, and it might even damage existing articles. It is suggested you first backup your database! Click on "CANCEL" to abort this action.');
diff --git a/plugins/serendipity_event_freetag/lang_fr.inc.php b/plugins/serendipity_event_freetag/lang_fr.inc.php
new file mode 100644 (file)
index 0000000..dc790dd
--- /dev/null
@@ -0,0 +1,76 @@
+<?php # $Id: lang_fr.inc.php,v 1.1 2006/12/30 11:02:21 garvinhicking Exp $
+
+/**
+ *  @version $Revision: 1.1 $
+ *  @author P'tit Lu <ptitlu@ptitlu.org>
+ *  EN-Revision: Revision of lang_en.inc.php
+ */
+
+//
+//  serendipity_event_freetag.php
+//
+@define('PLUGIN_EVENT_FREETAG_TITLE', 'Marquage des entrées');
+@define('PLUGIN_EVENT_FREETAG_DESC', 'Autorise le marquage libre des billets');
+@define('PLUGIN_EVENT_FREETAG_ENTERDESC', 'Entrez tous les tags s\'appliquant. Séparer les tags multiples par des virgules (,)');
+@define('PLUGIN_EVENT_FREETAG_LIST', 'Tags pour ce billet: %s');
+@define('PLUGIN_EVENT_FREETAG_USING', 'Billets marqués comme %s');
+@define('PLUGIN_EVENT_FREETAG_SUBTAG', 'Tags se rapportant au tag %s');
+@define('PLUGIN_EVENT_FREETAG_NO_RELATED','Pas de tags en rapport.');
+@define('PLUGIN_EVENT_FREETAG_ALLTAGS', 'Tous les tags définis');
+@define('PLUGIN_EVENT_FREETAG_MANAGETAGS', 'Gérer les tags');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ALL', 'Gérer tous les tags');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LEAF', 'Gérer les tags \'orphelins\'');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED', 'Lister les billets non marqués');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LEAFTAGGED', 'Lister les billets marqués \'orphelins\'');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED_NONE', 'Aucune entrée non marquée');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_TAG', 'Tag');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_WEIGHT', 'Poids');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_ACTIONS', 'Action');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_RENAME', 'Renommer');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_SPLIT', 'Séparer');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_DELETE', 'Effacer');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_CONFIRM_DELETE', 'voulez-vous vraiment effacer le tag %s ?');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_INFO_SPLIT', 'Utilisez la virgule pour séparer les tags :');
+@define('PLUGIN_EVENT_FREETAG_SHOW_TAGCLOUD', 'Afficher le nuage de tags pour les tags en rapport ?');
+@define('PLUGIN_EVENT_FREETAG_SEND_HTTP_HEADER', 'Send X-FreeTag-HTTP-Headers');
+//
+//  serendipity_plugin_freetag.php
+//
+@define('PLUGIN_FREETAG_NAME', 'Nuage de tags');
+@define('PLUGIN_FREETAG_BLAHBLAH', 'Montre une liste des tags existant pour les billets');
+@define('PLUGIN_FREETAG_NEWLINE', 'Retour à la ligne après chaque tag ?');
+@define('PLUGIN_FREETAG_XML', 'Afficher les icones XML ?');
+@define('PLUGIN_FREETAG_SCALE','Ajuster la taille du tag par rapport à sa fréquence (comme sur Technorati, flickr) ?');
+@define('PLUGIN_FREETAG_UPGRADE1_2','Mise à jour des tags %d pour le billet numéro: %d');
+@define('PLUGIN_FREETAG_MAX_TAGS', 'Combien de tags doivent être affichés ?');
+@define('PLUGIN_FREETAG_TRESHOLD_TAG_COUNT', 'Combien de fois un tag doit-il être présent pour apparaître ?');
+
+@define('PLUGIN_EVENT_FREETAG_TAGCLOUD_MIN', 'Taille de police minimale (%) d\'un tag dans le nuage');
+@define('PLUGIN_EVENT_FREETAG_TAGCLOUD_MAX', 'Taille de police maximale (%) d\'un tag dans le nuage');
+
+@define('PLUGIN_FREETAG_META_KEYWORDS', 'Nombre de mots-clef à insérer dans lfile:///home/ptitlu/www/blog/plugins/serendipity_event_freetag/lang_fr.inc.phpe code HTML (0: désactivé)');
+
+@define('PLUGIN_EVENT_FREETAG_RELATED_ENTRIES', 'Billets ayant les mêmes tags :');
+@define('PLUGIN_EVENT_FREETAG_SHOW_RELATED','Afficher les billets ayant les même tags  ?');
+@define('PLUGIN_EVENT_FREETAG_SHOW_RELATED_COUNT','Combien de billets doivent être affichés ?');
+@define('PLUGIN_EVENT_FREETAG_EMBED_FOOTER', 'Montrer les tags dans le pied de page ?');
+@define('PLUGIN_EVENT_FREETAG_EMBED_FOOTER_DESC', 'Si activé, les tags seront affichés dans le pied de page du billet. Si non, ils seront affichés dans le corps du billet.');
+@define('PLUGIN_EVENT_FREETAG_LOWERCASE_TAGS', 'Mettre les tags en minuscules.');
+
+@define('PLUGIN_EVENT_FREETAG_RELATED_TAGS', 'Tags en rapport');
+@define('PLUGIN_EVENT_FREETAG_TAGLINK', 'Lien Tag');
+@define('PLUGIN_EVENT_FREETAG_CAT2TAG', 'Créer des tags pour toutes les catégories associées ?');
+@define('PLUGIN_EVENT_FREETAG_CAT2TAG_DESC', 'Si activé, les catégories dont un billet fait partie seront ajoutées en tant que tag à ce billet.');
+@define('PLUGIN_EVENT_FREETAG_GLOBALLINKS', 'Convertir toutes les catégories assignées à des billets en tags.');
+@define('PLUGIN_EVENT_FREETAG_GLOBALCAT2TAG_ENTRY', 'Catégories converties du billet #%d (%s): %s.');
+@define('PLUGIN_EVENT_FREETAG_GLOBALCAT2TAG', 'Toutes les catogries sont converties.');
+
+@define('PLUGIN_EVENT_FREETAG_KEYWORDS', 'Mots-clef automatisés');
+@define('PLUGIN_EVENT_FREETAG_KEYWORDS_DESC', 'Vous pouvez assigner des mots-clef (séparatés par ",") à chaque tag. Dès que vous utilisez ces mots-clef dans le texte de vos billets, le tag correspondant est à votre billet. Notez que ceci allonge le temps de sauvegarde de votre billet.');
+@define('PLUGIN_EVENT_FREETAG_KEYWORDS_ADD', 'Mot-clef trouvé <strong>%s</strong>, tag <strong><em>%s</em></strong> assigné automatiquement.<br />');
+
+@define('PLUGIN_EVENT_FREETAG_REBUILD_FETCHNO', 'Recherche des billets %d à %d');
+@define('PLUGIN_EVENT_FREETAG_REBUILD_TOTAL', ' (totalisant %d billets)...');
+@define('PLUGIN_EVENT_FREETAG_REBUILD_FETCHNEXT', 'Recherche du prochain groupe de billets...');
+@define('PLUGIN_EVENT_FREETAG_REBUILD', 'Analyse des mots-clef automatiques');
+@define('PLUGIN_EVENT_FREETAG_REBUILD_DESC', 'Attention : Cette fonction va rechercher et re-sauvegarder chacun de vos billets. Cela va prendre du temps, et risque d\'endommager certains de vos billets. Il est conseillé de faire auparavant une sauvegarde de votre base de données ! Cliquez sur "ANNULER" pour arrêter.');
diff --git a/plugins/serendipity_event_freetag/lang_it.inc.php b/plugins/serendipity_event_freetag/lang_it.inc.php
new file mode 100644 (file)
index 0000000..0d274c0
--- /dev/null
@@ -0,0 +1,53 @@
+<?php # $Id: lang_it.inc.php,v 1.1 2006/04/19 09:33:20 garvinhicking Exp $
+
+/**
+ *  @version $Revision: 1.1 $
+ *  @author Alberto Mucignat <alberto.mucignat@gmail.com>
+ *  EN-Revision: Revision of lang_en.inc.php
+ */
+
+//
+//  serendipity_event_freetag.php
+//
+@define('PLUGIN_EVENT_FREETAG_TITLE', 'Freetag');
+@define('PLUGIN_EVENT_FREETAG_DESC', 'Consente il libero tagging dei post');
+@define('PLUGIN_EVENT_FREETAG_ENTERDESC', 'Inserisci i tag. I tag diversi vanno separati con la virgola (,)');
+@define('PLUGIN_EVENT_FREETAG_LIST', 'Tags: %s');
+@define('PLUGIN_EVENT_FREETAG_USING', 'Post con tag %s');
+@define('PLUGIN_EVENT_FREETAG_SUBTAG', 'Tag simili a %s');
+@define('PLUGIN_EVENT_FREETAG_NO_RELATED','Non ci sono tag associati.');
+@define('PLUGIN_EVENT_FREETAG_ALLTAGS', 'Tutti i tag');
+@define('PLUGIN_EVENT_FREETAG_MANAGETAGS', 'Gestione tag');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ALL', 'Gestione di tutti i tag');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LEAF', 'Gestione dei tag \'foglie\'');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED', 'Lista dei post senza tag');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LEAFTAGGED', 'Lista dei post con tag \'foglie\'');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED_NONE', 'Non ci sono post senza !');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_TAG', 'Tag');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_WEIGHT', 'Peso');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_ACTIONS', 'Azione');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_RENAME', 'Rinomina');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_SPLIT', 'Splitta');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_DELETE', 'Cancella');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_CONFIRM_DELETE', 'Vuoi veramente cancellare il tag %s?');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_INFO_SPLIT', 'Usa la virgola per separare i tag:');
+@define('PLUGIN_EVENT_FREETAG_SHOW_TAGCLOUD', 'Visualizza la nuvola dei tag correlati ai post?');
+@define('PLUGIN_EVENT_FREETAG_RELATED_ENTRIES', 'Post simili:');
+@define('PLUGIN_EVENT_FREETAG_SHOW_RELATED','Visualizzare post simili?');
+@define('PLUGIN_EVENT_FREETAG_SHOW_RELATED_COUNT','Quanti post simili devono essere visualizzati?');
+
+//
+//  serendipity_plugin_freetag.php
+//
+@define('PLUGIN_FREETAG_NAME', 'Tags');
+@define('PLUGIN_FREETAG_BLAHBLAH', 'Mostra i tag associati ai post');
+@define('PLUGIN_FREETAG_NEWLINE', 'Fineriga dopo ogni tag?');
+@define('PLUGIN_FREETAG_XML', 'Visualizza le icone XML?');
+@define('PLUGIN_FREETAG_SCALE','Scala la dimensione dei font in base alla popolarit\88 (come Technorati, Flickr)?');
+@define('PLUGIN_FREETAG_UPGRADE1_2','Salvando i tag %d per il post %d');
+@define('PLUGIN_FREETAG_MAX_TAGS', 'Quanti tag devono essere visualizzati?');
+@define('PLUGIN_FREETAG_TRESHOLD_TAG_COUNT', 'Quante occorrenze deve avere un tag per essere visibile?');
+
+@define('PLUGIN_EVENT_FREETAG_TAGCLOUD_MIN', 'Misura minima del font % di un tag nella nuvola');
+@define('PLUGIN_EVENT_FREETAG_TAGCLOUD_MAX', 'Misura massima del font  % di un tag nella nuvola');
+?>
diff --git a/plugins/serendipity_event_freetag/lang_ja.inc.php b/plugins/serendipity_event_freetag/lang_ja.inc.php
new file mode 100644 (file)
index 0000000..378594f
--- /dev/null
@@ -0,0 +1,61 @@
+<?php # $Id: lang_ja.inc.php,v 1.4 2006/08/17 10:48:57 elf2000 Exp $
+
+/**
+ *  @version $Revision: 1.4 $
+ *  @author Tadashi Jokagi <elf2000@users.sourceforge.net>
+ *  EN-Revision: 1.11
+ */
+
+//
+//  serendipity_event_freetag.php
+//
+@define('PLUGIN_EVENT_FREETAG_TITLE', 'エントリのタグ');
+@define('PLUGIN_EVENT_FREETAG_DESC', 'エントリの自由なタグを許可します。');
+@define('PLUGIN_EVENT_FREETAG_ENTERDESC', 'いくつかのタグをエントリに適用します。カンマ(「,」)で複数のタグを分割します。');
+@define('PLUGIN_EVENT_FREETAG_LIST', 'このエントリに定義されたタグ: %s');
+@define('PLUGIN_EVENT_FREETAG_USING', '「%s」としてタグ付けされたエントリ');
+@define('PLUGIN_EVENT_FREETAG_SUBTAG', 'タグ「%s」に関連したタグ');
+@define('PLUGIN_EVENT_FREETAG_NO_RELATED','関連したタグはありません。');
+@define('PLUGIN_EVENT_FREETAG_ALLTAGS', 'すべての定義済みタグ');
+@define('PLUGIN_EVENT_FREETAG_MANAGETAGS', 'タグを管理する');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ALL', 'すべてのタグを管理する');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LEAF', '「空」のタグを管理する');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED', 'タグがないエントリの一覧');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LEAFTAGGED', '「空」タグのエントリの一覧');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED_NONE', 'エントリはタグがありません!');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_TAG', 'タグ');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_WEIGHT', '重み');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_ACTIONS', '操作');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_RENAME', '名称変更');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_SPLIT', '分割');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_DELETE', '削除');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_CONFIRM_DELETE', 'タグ「%s」を本当に削除しますか?');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_INFO_SPLIT', 'カンマで区切ったタグを使用する:');
+@define('PLUGIN_EVENT_FREETAG_SHOW_TAGCLOUD', '関連タグへのタグクラウドを表示しますか?');
+@define('PLUGIN_EVENT_FREETAG_SEND_HTTP_HEADER', 'X-FreeTag-HTTP-Headers を送信する');
+//
+//  serendipity_plugin_freetag.php
+//
+@define('PLUGIN_FREETAG_NAME', 'エントリタグの表示');
+@define('PLUGIN_FREETAG_BLAHBLAH', 'エントリの既存タグの一覧を表示します。');
+@define('PLUGIN_FREETAG_NEWLINE', '各タグの後に改行を入れますか?');
+@define('PLUGIN_FREETAG_XML', 'XML アイコンを表示しますか?');
+@define('PLUGIN_FREETAG_SCALE','(Technorati、flickr のように)タグのフォントサイズを人気度に依存して変化させますか?');
+@define('PLUGIN_FREETAG_UPGRADE1_2','エントリ番号の %d 個のタグをアップグレード中: %d');
+@define('PLUGIN_FREETAG_MAX_TAGS', 'いくつのタグを表示するべきですか?');
+@define('PLUGIN_FREETAG_TRESHOLD_TAG_COUNT', 'How many occurences must a tag have in order to be shown?');
+
+@define('PLUGIN_EVENT_FREETAG_TAGCLOUD_MIN', 'タグクラウドの最小フォントサイズ(単位:パーセント)');
+@define('PLUGIN_EVENT_FREETAG_TAGCLOUD_MAX', 'タグクラウドの最大フォントサイズ(単位:パーセント)');
+
+@define('PLUGIN_FREETAG_META_KEYWORDS', 'Number of meta keywords to embed in HTML source (0: disabled)');
+
+@define('PLUGIN_EVENT_FREETAG_RELATED_ENTRIES', 'タグに関連するエントリ一覧:');
+@define('PLUGIN_EVENT_FREETAG_SHOW_RELATED','Display related entries by tags?');
+@define('PLUGIN_EVENT_FREETAG_SHOW_RELATED_COUNT','How many related entries should be dislayed?');
+@define('PLUGIN_EVENT_FREETAG_EMBED_FOOTER', 'フッターでタグを表示しますか?');
+@define('PLUGIN_EVENT_FREETAG_EMBED_FOOTER_DESC', 'If enabled, the tags will be shown in the footer of an entry. If disabled, the tags will be put inside the body/extended part of your entries.');
+@define('PLUGIN_EVENT_FREETAG_LOWERCASE_TAGS', 'Lowercase tags');
+
+@define('PLUGIN_EVENT_FREETAG_RELATED_TAGS', '関連タグ');
+@define('PLUGIN_EVENT_FREETAG_TAGLINK', 'Taglink');
diff --git a/plugins/serendipity_event_freetag/lang_nl.inc.php b/plugins/serendipity_event_freetag/lang_nl.inc.php
new file mode 100644 (file)
index 0000000..ef79860
--- /dev/null
@@ -0,0 +1,61 @@
+<?php # $Id: lang_nl.inc.php,v 1.1 2006/11/02 09:25:57 garvinhicking Exp $
+
+/**
+ *  @version $Revision: 1.1 $
+ *  @author Ivo Jansch <ivo@ibuildings.nl>
+ *  NL-Revision: Revision of lang_nl.inc.php
+ */
+
+//
+//  serendipity_event_freetag.php
+//
+@define('PLUGIN_EVENT_FREETAG_TITLE', 'Taggen van bijdragen');
+@define('PLUGIN_EVENT_FREETAG_DESC', 'Maakt het mogelijk om bijdragen van tags te voorzien');
+@define('PLUGIN_EVENT_FREETAG_ENTERDESC', 'Vul relevante tags in, meerdere tags kunnen met een komma worden gescheiden (,)');
+@define('PLUGIN_EVENT_FREETAG_LIST', 'Tags voor deze bijdrage: %s');
+@define('PLUGIN_EVENT_FREETAG_USING', 'Bijdragen met tag %s');
+@define('PLUGIN_EVENT_FREETAG_SUBTAG', 'Tags gerelateerd aan tag %s');
+@define('PLUGIN_EVENT_FREETAG_NO_RELATED','Geen gerelateerde tags.');
+@define('PLUGIN_EVENT_FREETAG_ALLTAGS', 'Alle tags');
+@define('PLUGIN_EVENT_FREETAG_MANAGETAGS', 'Beheer tags');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ALL', 'Beheer alle tags');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LEAF', 'Beheer \'leaf\' tags');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED', 'Laat niet-getagde bijdragen zien');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LEAFTAGGED', 'Laat \'leaf\' getagde bijdragen zien');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED_NONE', 'Geen niet-getagde bijdragen!');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_TAG', 'Tag');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_WEIGHT', 'Gewicht');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_ACTIONS', 'Actie');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_RENAME', 'Hernoem');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_SPLIT', 'Splits');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_DELETE', 'Verwijder');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_CONFIRM_DELETE', 'Weet je zeker dat je de %s tag wil verwijderen?');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_INFO_SPLIT', 'gebruik een komma om tags te scheiden:');
+@define('PLUGIN_EVENT_FREETAG_SHOW_TAGCLOUD', 'Toon tag cloud met gerelateerde tags?');
+@define('PLUGIN_EVENT_FREETAG_SEND_HTTP_HEADER', 'Stuur X-FreeTag-HTTP-Headers?');
+//
+//  serendipity_plugin_freetag.php
+//
+@define('PLUGIN_FREETAG_NAME', 'Toon getagde bijdragen');
+@define('PLUGIN_FREETAG_BLAHBLAH', 'Toon een "tag cloud" van gebruikte tags');
+@define('PLUGIN_FREETAG_NEWLINE', 'Linefeed na elke tag?');
+@define('PLUGIN_FREETAG_XML', 'Toon XML-icoon?');
+@define('PLUGIN_FREETAG_SCALE','Lettergrootte obv populariteit (zoals Technorati, flickr)?');
+@define('PLUGIN_FREETAG_UPGRADE1_2','Bijwerken van %d tags voor bijdrage: %d');
+@define('PLUGIN_FREETAG_MAX_TAGS', 'Hoeveel tags maximaal tonen?');
+@define('PLUGIN_FREETAG_TRESHOLD_TAG_COUNT', 'Hoevaak moet een tag gebruikt zijn om getoond te worden?');
+
+@define('PLUGIN_EVENT_FREETAG_TAGCLOUD_MIN', 'Minimaal font percentage van tag in tag cloud?');
+@define('PLUGIN_EVENT_FREETAG_TAGCLOUD_MAX', 'Maximaal font percentage van tag in tag cloud?');
+
+@define('PLUGIN_FREETAG_META_KEYWORDS', 'Hoeveel meta keywords in HTML source invoegen? (0: uitgeschakeld)');
+
+@define('PLUGIN_EVENT_FREETAG_RELATED_ENTRIES', 'Gerelateerde bijdragen op basis van tags:');
+@define('PLUGIN_EVENT_FREETAG_SHOW_RELATED','Toon gerelateerde bijdragen obv tags?');
+@define('PLUGIN_EVENT_FREETAG_SHOW_RELATED_COUNT','Hoeveel gerelateerde bijdragen tonen?');
+@define('PLUGIN_EVENT_FREETAG_EMBED_FOOTER', 'Tags in footer weergeven?');
+@define('PLUGIN_EVENT_FREETAG_EMBED_FOOTER_DESC', 'Wanneer aktief, worden de tags in de footer van een bijdrage weergegeven. Wanneer niet aktief, worden de tags in de verkorte/uitgebreide bijdrage geplaatst.');
+@define('PLUGIN_EVENT_FREETAG_LOWERCASE_TAGS', 'Tags altijd in kleine letters?');
+
+@define('PLUGIN_EVENT_FREETAG_RELATED_TAGS', 'Gerelateerde tags');
+@define('PLUGIN_EVENT_FREETAG_TAGLINK', 'Taglink:');
diff --git a/plugins/serendipity_event_freetag/lang_pl.inc.php b/plugins/serendipity_event_freetag/lang_pl.inc.php
new file mode 100644 (file)
index 0000000..c98a023
--- /dev/null
@@ -0,0 +1,59 @@
+<?php # $Id: lang_pl.inc.php,v 1.1 2006/07/17 08:22:23 garvinhicking Exp $
+
+/**
+ *  @version $Revision: 1.1 $
+ *  Kostas CoSTa Brzezinski <costa@kofeina.net>
+ *  EN-Revision: Revision of lang_en.inc.php
+ */
+
+//
+//  serendipity_event_freetag.php
+//
+@define('PLUGIN_EVENT_FREETAG_TITLE', 'Tagowanie wpisów');
+@define('PLUGIN_EVENT_FREETAG_DESC', 'Umo¿liwia dowolne tagowanie wpisów');
+@define('PLUGIN_EVENT_FREETAG_ENTERDESC', 'Wprowad¼ dowolne pasuj±ce tagi. Rozdzielaj tagi przecinkami (,).');
+@define('PLUGIN_EVENT_FREETAG_LIST', 'Tagi dla tego wpisu: %s');
+@define('PLUGIN_EVENT_FREETAG_USING', 'Wpisy otagowane jako %s');
+@define('PLUGIN_EVENT_FREETAG_SUBTAG', 'Tagi powi±zane z tagiem %s');
+@define('PLUGIN_EVENT_FREETAG_NO_RELATED', 'Brak powi±zanych tagów.');
+@define('PLUGIN_EVENT_FREETAG_ALLTAGS', 'Wszystkie zdefiniowane tagi');
+@define('PLUGIN_EVENT_FREETAG_MANAGETAGS', 'Zarz±dzaj tagami');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ALL', 'Zarz±dzaj wszystkimi tagami');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LEAF', 'Zarz±dzaj tagami \'Leaf\' (pojedynczymi)');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED', 'Lista nieotagowanych wpisów');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LEAFTAGGED', 'Lista wpisów z tagami \'Leaf\'');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED_NONE', 'Nie ma nieotagowanych wpisów!');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_TAG', 'Tag');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_WEIGHT', 'Waga');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_LIST_ACTIONS', 'Akcja');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_RENAME', 'Zmieñ nazwê');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_SPLIT', 'Rozdziel');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_ACTION_DELETE', 'Usuñ');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_CONFIRM_DELETE', 'Na pewno chcesz usun±æ tag %s?');
+@define('PLUGIN_EVENT_FREETAG_MANAGE_INFO_SPLIT', 'u¿yj przecinka by rozdzieliæ tagi:');
+@define('PLUGIN_EVENT_FREETAG_SHOW_TAGCLOUD', 'Pokazaæ tag cloud (chmurê tagów) do powi±zanych wpisów?');
+
+//
+//  serendipity_plugin_freetag.php
+//
+@define('PLUGIN_FREETAG_NAME', 'Tagi');
+@define('PLUGIN_FREETAG_BLAHBLAH', 'Pokazuje listê tagów zdefiniowanych dla wpisów');
+@define('PLUGIN_FREETAG_NEWLINE', 'Przej¶cie do nowej linii po ka¿dym tagu?');
+@define('PLUGIN_FREETAG_XML', 'Pokazywaæ ikony XML?');
+@define('PLUGIN_FREETAG_SCALE', 'Skalowaæ rozmiar czcionki w zale¿no¶ci od popularno¶ci taga (jak w serwisach Technorati czy flickr)?');
+@define('PLUGIN_FREETAG_UPGRADE1_2', 'Poprawiono %d tagów dla wpisu numer: %d');
+@define('PLUGIN_FREETAG_MAX_TAGS', 'Jak wiele tagów ma byæ pokazywanych?');
+@define('PLUGIN_FREETAG_TRESHOLD_TAG_COUNT', 'Jak wiele razy musi wyst±piæ dany tag, by by³ pokazywany na li¶cie?');
+
+@define('PLUGIN_EVENT_FREETAG_TAGCLOUD_MIN', 'Minimalny rozmiar czcionki w procentach (%) w chmurze tagów (tag cloud)');
+@define('PLUGIN_EVENT_FREETAG_TAGCLOUD_MAX', 'Maksymalny rozmiar czcionki w procentach (%) w chmurze tagów (tag cloud)');
+
+@define('PLUGIN_FREETAG_META_KEYWORDS', 'Ilo¶æ s³ów kluczowych meta umieszczanych w ¼ródle HTML (0: wy³±czenie opcji)');
+
+@define('PLUGIN_EVENT_FREETAG_RELATED_ENTRIES', 'Powi±zane wpisy wedlug tagów:');
+@define('PLUGIN_EVENT_FREETAG_SHOW_RELATED', 'Wy¶wietlaæ wpisy powi±zane wed³ug tagów?');
+@define('PLUGIN_EVENT_FREETAG_SHOW_RELATED_COUNT', 'Jak wiele powi±zanych wpisów ma byæ pokazywanych?');
+@define('PLUGIN_EVENT_FREETAG_EMBED_FOOTER', 'Pokazywaæ tagi w stopce wpisu?');
+@define('PLUGIN_EVENT_FREETAG_EMBED_FOOTER_DESC', 'Je¶li opcja jest w³±czona, tagi bêd± pokazywane w stopce wpisu. Je¶li opcja bêdzie wy³±czona, tagi zostan± umieszczone w tre¶ci (na samym dole) wpisu lub rozszerzonej tre¶ci wpisu.');
+@define('PLUGIN_EVENT_FREETAG_LOWERCASE_TAGS', 'Poka¿ tagi tylko ma³ymi literami');
+
diff --git a/plugins/serendipity_event_freetag/serendipity_event_freetag.php b/plugins/serendipity_event_freetag/serendipity_event_freetag.php
new file mode 100644 (file)
index 0000000..28bb11d
--- /dev/null
@@ -0,0 +1,1742 @@
+<?php #$Id: serendipity_event_freetag.php,v 1.86 2007/01/14 15:54:26 garvinhicking Exp $
+/*
+ * ULTRA HIGH PRIORITY
+ * - get some kind of data-sharing protocol in action.  It is very difficult
+ *   tracing out what the hell is going on with this thing.
+ * - Refactor out the entryproperties depenancy, and use our own space
+ * - Refactor the external plugin event hook.  Its kind of cruddy.
+ *
+ * TODO:
+ * - Add tag intersections with + on the URI
+ * - Integrate into the del.icio.us plugin
+ * - Integrate into the flickr plugin
+ * - Refactor code out of the main event dispatch and into its own methods
+ * - Remove comma-delimiting and use the 'standard' space delimiting instead
+ * - - convert tags with spaces to no-space tags
+ * - - convert database structure to a truely 3rd normal form
+ * - Tag administration
+ * - - Describe Tag
+ * - - Super-Tag (tags 'php', 'java' and 'scheme' are super-tagged to tag code)
+ * - - Add Tag
+ *
+ * DONE:
+ * - Added more microformat support
+ * - Better RSS/Technorati integration
+ * - Better styling on tag display (more classes, less inline styles)
+ * - Tag Intersections
+ *   - Note: Tag intersections do work, but it is a little hackey.  You need
+ *           to apply a patch to your main serendiptiy file.  The patch is
+ *           available here:
+ *              http://blog.jonnay.net/uploads/Code/freetag2.1.s9y.patch.txt
+ *           If you are using PostgreSQL then this patch wont work for you.
+ *           sorry, but thems the breaks.  Maybe you can help fix the query?
+ * - Tag Administration
+ */
+
+
+if (IN_serendipity !== true) {
+    die ("Don't hack!");
+}
+
+// Probe for a language include with constants. Still include defines later on, if some constants were missing
+$probelang = dirname(__FILE__) . '/' . $serendipity['charset'] . 'lang_' . $serendipity['lang'] . '.inc.php';
+if (file_exists($probelang)) {
+    include $probelang;
+}
+
+include_once dirname(__FILE__) . '/lang_en.inc.php';
+
+// Because I am using get methods, if you change this, you also have to change the getManageUrlAsHidden
+define('FREETAG_MANAGE_URL','?serendipity[adminModule]=event_display&amp;serendipity[adminAction]=managetags');
+define('FREETAG_EDITENTRY_URL','?serendipity[action]=admin&amp;serendipity[adminModule]=entries&amp;serendipity[adminAction]=edit&amp;serendipity[id]=');
+
+class serendipity_event_freetag extends serendipity_event
+{
+    var $tags  = array();
+    var $title = PLUGIN_EVENT_FREETAG_TITLE;
+    var $displayTag = false;
+    var $TaggedEntries = null;
+    var $eventData;            // We use this as an eventdata store, so that we don't have to keep passing it
+                            // back and forth.
+
+    function introspect(&$propbag)
+    {
+        global $serendipity;
+
+        $propbag->add('name',          PLUGIN_EVENT_FREETAG_TITLE);
+        $propbag->add('description',   PLUGIN_EVENT_FREETAG_DESC);
+        $propbag->add('stackable',     false);
+        $propbag->add('author',        'Garvin Hicking, Jonathan Arkell');
+        $propbag->add('requirements',  array(
+            'serendipity' => '0.8',
+            'smarty'      => '2.6.7',
+            'php'         => '4.1.0'
+        ));
+        $propbag->add('version',       '2.76');
+        $propbag->add('event_hooks',    array(
+            'frontend_fetchentries'                             => true,
+            'frontend_fetchentry'                               => true,
+            'frontend_display:rss-2.0:per_entry'                => true,
+            'frontend_header'                                   => true,
+//            'frontend_display:rss-0.92:per_entry'             => true,
+            'frontend_display:rss-1.0:per_entry'                => true,
+//            'frontend_display:rss-0.91:per_entry'             => true,
+            'frontend_display:atom-0.3:per_entry'               => true,
+            'frontend_display:atom-1.0:per_entry'               => true,
+            'frontend_entryproperties'                          => true,
+            'frontend_rss'                                      => true,
+            'entry_display'                                     => true,
+            'entries_header'                                    => true,
+            'backend_publish'                                   => true,
+            'backend_save'                                      => true,
+            'backend_display'                                   => true,
+            'backend_sidebar_entries'                           => true,
+            'backend_sidebar_entries_event_display_managetags'  => true,
+            'backend_delete_entry'                              => true,
+            'external_plugin'                                   => true,
+            'xmlrpc_updertEntry'                                => true,
+            'xmlrpc_fetchEntry'                                 => true,
+            'xmlrpc_deleteEntry'                                => true,
+            'css'                                               => true
+        ));
+        $propbag->add('groups', array('BACKEND_EDITOR'));
+        $this->supported_properties = array('freetag_name', 'freetag_tagList');
+        $this->dependencies = array('serendipity_plugin_freetag' => 'keep');
+        $propbag->add('configuration', array('cat2tag', 'taglink', 'embed_footer', 'show_tagcloud', 'min_percent', 'max_percent', 'meta_keywords', 'show_related', 'show_related_count', 'lowercase_tags', 'send_http_header'));
+    }
+
+    function introspect_config_item($name, &$propbag) {
+        global $serendipity;
+        switch($name) {
+            case 'show_tagcloud':
+                 $propbag->add('type',        'boolean');
+                 $propbag->add('name',        PLUGIN_EVENT_FREETAG_SHOW_TAGCLOUD);
+                 $propbag->add('description', '');
+                 $propbag->add('default',     true);
+                 break;
+
+            case 'cat2tag':
+                 $propbag->add('type',        'boolean');
+                 $propbag->add('name',        PLUGIN_EVENT_FREETAG_CAT2TAG);
+                 $propbag->add('description', PLUGIN_EVENT_FREETAG_CAT2TAG_DESC);
+                 $propbag->add('default',     false);
+                 break;
+
+            case 'embed_footer':
+                 $propbag->add('type',        'boolean');
+                 $propbag->add('name',        PLUGIN_EVENT_FREETAG_EMBED_FOOTER);
+                 $propbag->add('description', PLUGIN_EVENT_FREETAG_EMBED_FOOTER_DESC);
+                 $propbag->add('default',     true);
+                 break;
+
+            case 'taglink':
+                 $propbag->add('type',        'string');
+                 $propbag->add('name',        PLUGIN_EVENT_FREETAG_TAGLINK);
+                 $propbag->add('description', '');
+                 $propbag->add('default',     $serendipity['baseURL'] . ($serendipity['rewrite'] == 'none' ? $serendipity['indexFile'] . '?/' : '') . 'plugin/tag/');
+                 break;
+
+            case 'min_percent':
+                 $propbag->add('type',        'string');
+                 $propbag->add('name',        PLUGIN_EVENT_FREETAG_TAGCLOUD_MIN);
+                 $propbag->add('description', '');
+                 $propbag->add('default',     '100');
+                 break;
+
+            case 'max_percent':
+                 $propbag->add('type',        'string');
+                 $propbag->add('name',        PLUGIN_EVENT_FREETAG_TAGCLOUD_MAX);
+                 $propbag->add('description', '');
+                 $propbag->add('default',     '300');
+                 break;
+
+            case 'meta_keywords':
+                 $propbag->add('type',        'string');
+                 $propbag->add('name',        PLUGIN_FREETAG_META_KEYWORDS);
+                 $propbag->add('description', '');
+                 $propbag->add('default',     '0');
+                 break;
+
+            case 'show_related':
+                $propbag->add('type',            'boolean');
+                $propbag->add('name',            PLUGIN_EVENT_FREETAG_SHOW_RELATED);
+                $propbag->add('description',     '');
+                $propbag->add('default',         true);
+                break;
+
+            case 'show_related_count':
+                $propbag->add('type',            'string');
+                $propbag->add('name',            PLUGIN_EVENT_FREETAG_SHOW_RELATED_COUNT);
+                $propbag->add('description',     '');
+                $propbag->add('default',         '5');
+                break;
+
+            case 'lowercase_tags':
+                 $propbag->add('type',        'boolean');
+                 $propbag->add('name',        PLUGIN_EVENT_FREETAG_LOWERCASE_TAGS);
+                 $propbag->add('description', '');
+                 $propbag->add('default',     true);
+                 break;
+
+            case 'send_http_header':
+                 $propbag->add('type',        'boolean');
+                 $propbag->add('name',        PLUGIN_EVENT_FREETAG_SEND_HTTP_HEADER);
+                 $propbag->add('description', '');
+                 $propbag->add('default',     true);
+                 break;
+        }
+        return true;
+    }
+
+    function generate_content(&$title) {
+        $title = $this->title;
+    }
+
+    function tableCreated($table = 'entrytags')  {
+        global $serendipity;
+
+        $q = "select count(tag) from {$serendipity['dbPrefix']}" . $table;
+        $row = serendipity_db_query($q, true, 'num');
+
+        if (!is_numeric($row[0])) {        // if the response we got back was an SQL error.. :P
+            return false;
+        } else {
+            return true;
+        }
+    }
+
+    function upgradeFromVersion1() {
+        global $serendipity;
+
+        $q = "select count(*) from {$serendipity['dbPrefix']}entryproperties where property = 'ep_freetag_name'";
+        $result = serendipity_db_query($q);
+
+        if ((int)$result[0] > 0) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    function convertEntryPropertiesTags() {
+        global $serendipity;
+
+        $q = "select entryid, value from {$serendipity['dbPrefix']}entryproperties where property = 'ep_freetag_name'";
+        $result = serendipity_db_query($q);
+
+        if (!is_array($result)) {
+            return false;
+        }
+
+        foreach($result as $entry) {
+            $tags = serendipity_event_freetag::makeTagsFromTaglist($entry['value']);
+            serendipity_event_freetag::addTagsToEntry($entry['entryid'], $tags);
+
+            printf(PLUGIN_FREETAG_UPGRADE1_2, count($tags), $entry['entryid']);
+            echo '<BR/>';
+        }
+
+        $q = "delete from {$serendipity['dbPrefix']}entryproperties where property = 'ep_freetag_name'";
+        $result = serendipity_db_query($q);
+    }
+
+    function cleanup() {
+        global $serendipity;
+
+        serendipity_event_freetag::install();
+    }
+
+    function install() {
+        global $serendipity;
+
+        if (!serendipity_event_freetag::tableCreated('entrytags')) {
+            $q = "create table {$serendipity['dbPrefix']}entrytags (" .
+                    "entryid int(10) not null, " .
+                    "tag varchar(50) not null, " .
+                    "primary key (entryid, tag)" .
+                ")";
+
+            $result = serendipity_db_schema_import($q);
+
+            if ($result !== true) {
+                return;
+            }
+
+            serendipity_db_schema_import("CREATE INDEX tagsentryindex ON {$serendipity['dbPrefix']}entrytags (entryid)");
+            serendipity_db_schema_import("CREATE INDEX tagsTagIndex ON {$serendipity['dbPrefix']}entrytags (tag)");
+        }
+
+        if (!serendipity_event_freetag::tableCreated('tagkeywords')) {
+            $q = "create table {$serendipity['dbPrefix']}tagkeywords (" .
+                    "keywords text, " .
+                    "tag varchar(50) not null, " .
+                    "primary key (tag)" .
+                ")";
+
+            $result = serendipity_db_schema_import($q);
+        }
+
+        if (serendipity_event_freetag::upgradeFromVersion1()) {
+            serendipity_event_freetag::convertEntryPropertiesTags();
+        } else {
+            echo "NOT UPGRADING!";
+        }
+    }
+
+    function getTagHtmlFromCSV($tagString) {
+        global $serendipity;
+        static $taglink = null;
+
+        if ($taglink == null) {
+            $taglink = $this->get_config('taglink');
+        }
+
+        $links   = array();
+        if (empty($tagString)) {
+            return array();
+        }
+        $tags    = explode(',', $tagString);
+        foreach($tags as $tag) {
+            $tag = trim($tag);
+            if (empty($tag)) {
+                continue;
+            }
+            $links[] = '<a href="' . $taglink . urlencode($tag) . '"' .
+                       ' title="' . htmlspecialchars($tag) . '"' .
+                       ' rel="tag">' . htmlspecialchars($tag) . '</a>';
+        }
+
+        return implode(', ', $links);
+    }
+
+    function getTagHtml($tags) {
+        global $serendipity;
+        static $taglink = null;
+
+        $links   = array();
+
+        if ($taglink == null) {
+            $taglink = $this->get_config('taglink');
+        }
+
+        if (!is_array($tags)) {
+            return '';
+        }
+
+        foreach($tags as $tag) {
+            $tag = trim($tag);
+            if (empty($tag)) {
+                continue;
+            }
+            $links[] = '<a href="' . $taglink . urlencode($tag) . '"' .
+                       ' title="' . htmlspecialchars($tag) . '"' .
+                       ' rel="tag">' . htmlspecialchars($tag) . '</a>';
+        }
+
+        return implode(', ', $links);
+    }
+
+    function getRelatedEntries($tags, $postID) {
+        global $serendipity;
+
+        if (!is_array($tags)) {
+            return false;
+        }
+
+        $q = "SELECT DISTINCT e1.entryid,
+                     e2.title
+                FROM {$serendipity['dbPrefix']}entrytags AS e1
+           LEFT JOIN {$serendipity['dbPrefix']}entries   AS e2
+                  ON e1.entryid = e2.id
+               WHERE e1.tag IN ('" . implode("', '", $tags) . "')
+                 AND e1.entryid != " . (int)$postID . "
+                 AND e2.isdraft = 'false'
+                     " . (!serendipity_db_bool($serendipity['showFutureEntries']) ? " AND e2.timestamp <= " . time() : '') . "
+            ORDER BY  e2.timestamp DESC
+               LIMIT " . $this->get_config('show_related_count', 10);
+
+        $result = serendipity_db_query($q, false, 'assoc', false, 'entryid', 'title');
+
+        if (!is_array($result)) {
+            return false;
+        }
+
+        return $result;
+    }
+
+    function getRelatedEntriesHtml(&$entries) {
+        global $serendipity;
+
+        if (!is_array($entries)) {
+            return false;
+        }
+
+        $entrylink = $serendipity['baseURL'] . ($serendipity['rewrite'] == 'none' ? $serendipity['indexFile'] . '?/' : '/');
+
+        $return = '<div class="serendipity_freeTag_related">' . PLUGIN_EVENT_FREETAG_RELATED_ENTRIES . '<br />';
+        foreach($entries AS $entryid => $title) {
+            $return .= ' <a href="' . serendipity_archiveURL($entryid, $title) . '" title="' . htmlspecialchars($title) . '">' . htmlspecialchars($title) . '</a><br />';
+        }
+        $return .= '</div>';
+        return $return;
+    }
+
+    /*  This method can be called statically.
+        Tags should be an array with the key being the tag name, and val being
+        the number of occurances. */
+    function displayTags($tags, $xml, $nl, $scaling, $maxSize = 200, $minSize = 100)
+    {
+        global $serendipity;
+        static $taglink = null;
+
+        if (!is_array($tags)) {
+            return false;
+        }
+
+        if ($taglink == null) {
+            $taglink = $this->get_config('taglink');
+        }
+
+        $rsslink = $serendipity['serendipityHTTPPath'] . 'rss.php?serendipity[tag]=';
+        $xmlImg  = serendipity_getTemplateFile('img/xml.gif');
+
+        $first   = true;
+        $biggest = max($tags);
+        $smallest= min($tags);
+
+        $scale   = $biggest - $smallest;
+
+        if ($scale < 0) {
+            $scale = 1;
+        }
+
+        foreach($tags AS $name => $quantity) {
+            if (empty($name)) {
+                continue;
+            }
+
+            if (!$first && !$nl && !$scaling) {
+                echo ', ';
+            }
+
+            if ($xml) {
+                echo '<a rel="tag" href="' . $rsslink . urlencode($name) . '" title="' . htmlspecialchars($name) . '">'.
+                     '<img alt="xml" src="' . $xmlImg . '" class="serendipity_freeTag_xmlButton" /></a>&nbsp;';
+            }
+
+            if ($scaling) {
+                if ($scale==0) {
+                    $fontSize = $maxSize;
+                } elseif ($scale==1) {
+                    if ($quantity==$biggest) {
+                        $fontSize = $maxSize;
+                    } else {
+                        $fontSize = $minSize;
+                    }
+                } else {
+                    $fontSize = round(($quantity - $smallest)*(($maxSize - $minSize)/($scale))) + $minSize;
+                }
+                echo '<span class="tag_weight_' . $fontSize . '" style="font-size: '. $fontSize .'%">';
+            }
+
+            echo '<a rel="tag" href="' . $taglink . urlencode($name) . '" title="' . htmlspecialchars($name) . ($quantity > 0 ? ' (' . $quantity . ') ' : '') . '">' . str_replace(' ','&nbsp;',htmlspecialchars($name)) . '</a>';
+
+            if ($scaling) {
+                echo '</span>';
+            }
+
+            if ($nl) {
+                echo '<br />' . "\n";
+            } else {
+                echo ' ';
+            }
+
+            $first = false;
+        }
+    }
+
+    function event_hook($event, &$bag, &$eventData, $addData = null) {
+        global $serendipity;
+
+        $hooks = &$bag->get('event_hooks');
+        if (isset($hooks[$event])) {
+            switch($event) {
+                case 'backend_delete_entry':
+                    $this->deleteTagsForEntry((int)$eventData);
+                    return true;
+
+                case 'frontend_header':
+                    $this->displayMetaKeywords($serendipity['GET']['id'] );
+                    return true;
+
+                case 'frontend_display:rss-2.0:per_entry':
+                case 'frontend_display:rss-0.91:per_entry':
+                    $eventData['display_dat'] .= $this->getFeedXmlForTags('category', $eventData['properties']['freetag_tags']);
+                    return true;
+
+                case 'frontend_display:rss-1.0:per_entry':
+                case 'frontend_display:rss-0.91:per_entry':
+                case 'frontend_display:atom-0.3:per_entry':
+                case 'frontend_display:atom-1.0:per_entry':
+                    $eventData['display_dat'] .= $this->getFeedXmlForTags('dc:subject', $eventData['properties']['freetag_tags']);
+                    return true;
+
+                case 'external_plugin':
+                    $uri_parts  = explode('?', str_replace('&amp;', '&', $eventData));
+                    $param      = explode('/', $uri_parts[0]);
+                    $plugincode = array_shift($param);
+
+                    if (($plugincode == "tag") || ($plugincode == "tags") || ($plugincode == "freetag")) {
+                        /* Attempt to locate hidden variables within the URI */
+                        foreach ($serendipity['uriArguments'] as $k => $v) {
+                            if ($v{0} == 'P') { /* Page */
+                                $page = substr($v, 1);
+                                if (is_numeric($page)) {
+                                    $serendipity['GET']['page'] = $page;
+                                    unset($serendipity['uriArguments'][$k]);
+                                    if ($param[count($param)-1] == "P{$page}.html") {
+                                        array_pop($param);  // knock it off of the param array as well
+                                    }
+                                }
+                            }
+                        }
+
+                        if (count($param) == 0 || empty($param[0])) {
+                            $serendipity['head_subtitle'] = PLUGIN_EVENT_FREETAG_ALLTAGS;
+                            $this->displayTag = true;
+                            $param = null;
+                        } else if (count($param) == 1) {
+                            $param      = urldecode($param[0]);
+                            $serendipity['head_subtitle'] = sprintf(PLUGIN_EVENT_FREETAG_USING, htmlspecialchars($param));
+                            $emit_404 = true;
+                        } else {
+                            $serendipity['head_subtitle'] = sprintf(PLUGIN_EVENT_FREETAG_USING, implode(' + ', array_map('htmlspecialchars', $param)));
+                            $param = array_map('urldecode', $param);
+                            $emit_404 = true;
+                        }
+                        $this->tags['show'] = $param;
+
+                        $serendipity['GET']['subpage'] = $eventData;
+                        include_once(S9Y_INCLUDE_PATH . 'include/genpage.inc.php');
+                        if ($emit_404 && $this->TaggedEntries !== null && $this->TaggedEntries < 1) {
+                            @header('HTTP/1.0 404 Not found');
+                            if (serendipity_db_bool($this->get_config('send_http_header', true))) {
+                                @header('X-FreeTag: not found');
+                            }
+                        } else {
+                            if (serendipity_db_bool($this->get_config('send_http_header', true))) {
+                                @header('X-FreeTag: ' . $this->TaggedEntries);
+                            }
+                        }
+                        $raw_data = ob_get_contents();
+                        ob_end_clean();
+                        $serendipity['smarty']->assign('raw_data', $raw_data);
+                        serendipity_gzCompression();
+                        $serendipity['smarty']->display(serendipity_getTemplateFile($serendipity['smarty_file'], 'serendipityPath'));
+                        @define('NO_EXIT', true);
+                    }
+                    break;
+
+                case 'backend_sidebar_entries':
+?>
+                        <li>
+                            <a href="?serendipity[adminModule]=event_display&amp;serendipity[adminAction]=managetags">
+                                <?php echo PLUGIN_EVENT_FREETAG_MANAGETAGS; ?>
+                            </a>
+                        </li>
+<?php
+                    return true;
+                    break;
+
+
+                case 'backend_sidebar_entries_event_display_managetags':
+                    $this->eventData = $eventData;
+                    $this->displayManageTags($event, $bag, $eventData, $addData);
+
+                    return true;
+                    break;
+
+                case 'backend_publish':
+                case 'backend_save':
+                    if (!isset($serendipity['POST']['properties']) || !is_array($serendipity['POST']['properties']) || !isset($eventData['id'])) {
+                        return true;
+                    }
+
+                    $to_lower = serendipity_db_bool($this->get_config('lowercase_tags'));
+                    $keylist = serendipity_db_query("SELECT tag, keywords FROM {$serendipity['dbPrefix']}tagkeywords", false, 'assoc');
+                    $automatted = array(array());
+                    if (is_array($keylist)) {
+                        foreach($keylist AS $key) {
+                            $keywords = explode(',', $key['keywords']);
+                            foreach($keywords AS $keyword) {
+                                $automatted[trim($keyword)][$key['tag']] = true;
+                            }
+                        }
+                    }
+
+                    $tags = $this->makeTagsFromTagList($serendipity['POST']['properties']['freetag_tagList']);
+
+                    $searchtext = $eventData['body'] . $eventData['extended'];
+                    foreach($automatted AS $keyword => $ktags) {
+                        $keyword = trim($keyword);
+                        if (empty($keyword)) continue;
+                        if (!is_array($ktags) || count($ktags) < 1) continue;
+                        if (stristr($searchtext, $keyword)) {
+                            foreach($ktags AS $tag => $is_assigned) {
+                                if (!is_array($tags) || !in_array(strtolower($tag), $tags)) {
+                                    if ($to_lower) {
+                                        if (function_exists("mb_strtolower")) {
+                                            $tag = mb_strtolower($tag);
+                                        } else {
+                                            $tag = strtolower($tag);
+                                        }
+                                    }
+
+                                    $tags[] = $tag;
+                                    printf(PLUGIN_EVENT_FREETAG_KEYWORDS_ADD, htmlspecialchars($keyword), htmlspecialchars($tag));
+                                }
+                            }
+                        }
+                    }
+
+                    if (!empty($tags)) {
+                        if (serendipity_db_bool($this->get_config('cat2tag'))) {
+                            if (is_array($cats = serendipity_fetchCategories())) {
+                                $cats = serendipity_walkRecursive($cats, 'categoryid', 'parentid', VIEWMODE_THREADED);
+                                foreach ($cats as $cat) {
+                                    if ($to_lower) {
+                                        if (function_exists("mb_strtolower")) {
+                                            $cat['category_name'] = mb_strtolower($cat['category_name']);
+                                        } else {
+                                            $cat['category_name'] = strtolower($cat['category_name']);
+                                        }
+                                    }
+
+                                    $names = explode(',', $cat['category_name']);
+                                    foreach($names AS $name) {
+                                        $name = trim($name);
+                                        if (in_array($cat['categoryid'], $eventData['categories']) && !in_array($name, $tags)) {
+                                            $tags[] = $name;
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                        $serendipity['POST']['properties']['freetag_tagList'] = implode(',', $tags);
+
+                        $this->deleteTagsForEntry($eventData['id']);
+                        $this->addTagsToEntry($eventData['id'], $tags);
+                    } else {
+                        $this->deleteTagsForEntry($eventData['id']);
+                    }
+
+                    return true;
+                    break;
+
+                case 'backend_display':
+                    if (isset($serendipity['POST']['properties']['freetag_tagList'])) {
+                        $tagList = $serendipity['POST']['properties']['freetag_tagList'];
+                    } else if (isset($eventData['id'])) {
+                        $tagList = implode(',', $this->getTagsForEntry($eventData['id']));
+                    } else {
+                        $tagList = '';
+                    }
+
+                    if (serendipity_db_bool($this->get_config('lowercase_tags', true))) {
+                        if (function_exists("mb_strtolower")) {
+                            $tagList = mb_strtolower($tagList);
+                        } else {
+                            $tagList = strtolower($tagList);
+                        }
+                    }
+
+                    $freetags = $this->makeTagsFromTagList($tagList);
+                    if (!empty($freetags)) {
+                        $tagList = implode(',', $freetags);
+                    }
+
+                    $taglist = (array)$this->getAllTags();
+?>
+                    <script language="Javascript">
+                    function addTag(addTag)
+                    {
+                        var freetags = document.getElementById("properties_freetag_tagList").value.split(',');
+
+                        inList = false;
+                        for (var freetag = 0; freetag < freetags.length; freetag++) {
+                            if (freetags[freetag] && trim(freetags[freetag].toLowerCase()) == addTag.toLowerCase()) {
+                                inList = true;
+                            }
+                        }
+
+                        if (!inList) {
+                            document.getElementById("properties_freetag_tagList").value = document.getElementById("properties_freetag_tagList").value + "," + addTag
+                        }
+                    }
+
+                    function trim(str)
+                    {
+                        if (str) return str.replace(/^\s*|\s*$/g,"");
+                         else return '';
+                    }
+                    </script>
+                    <fieldset style="margin: 5px">
+                        <a name="tagListAnchor"></a>
+                        <div id="backend_freetag_list" style="margin: 5px; border: 1px dotted #000; padding: 5px; font-size: 9px;">
+<?php
+                            $lastletter = '';
+                            foreach ($taglist as $tag => $count) {
+                                if (substr($tag, 0, 1) != $lastletter)
+                                    echo " <b>|".strtoupper(substr($tag, 0, 1)).':</b> ';
+                                echo "<a href=\"#tagListAnchor\" style=\"text-decoration: none\" onClick=\"addTag('$tag')\">$tag</a>, ";
+                                $lastletter = substr($tag, 0, 1);
+                            }
+?>
+                        </div>
+                        <legend><?php echo PLUGIN_EVENT_FREETAG_TITLE; ?></legend>
+                        <label for="serendipity[properties][freetag_tagList]" title="<?php echo PLUGIN_EVENT_FREETAG_TITLE; ?>">
+                            <?php echo PLUGIN_EVENT_FREETAG_ENTERDESC; ?>:</label><br/>
+                        <input type="text" name="serendipity[properties][freetag_tagList]" id="properties_freetag_tagList" value="<?php echo htmlspecialchars($tagList); ?>" style="width: 100%" />
+                    </fieldset>
+<?php
+                    return true;
+                    break;
+
+
+                case 'frontend_entryproperties':
+                    $this->importEntryTagsIntoProperties($eventData, $addData);
+
+                    return true;
+                    break;
+
+                case 'frontend_fetchentries':
+                case 'frontend_fetchentry':
+                    if (!empty($this->tags['show'])) {
+                        if (is_array($this->tags['show'])) {
+                            $showtag = array_map('serendipity_db_escape_string', $this->tags['show']);
+                        } else {
+                            $showtag = serendipity_db_escape_string($this->tags['show']);
+                        }
+                    } else if (!empty($serendipity['GET']['tag'])) {
+                        $showtag = serendipity_db_escape_string(urldecode($serendipity['GET']['tag']));
+                    }
+
+                    if (is_string($show_tag) && serendipity_db_bool($this->get_config('lowercase_tags', true))) {
+                        if (function_exists("mb_strtolower")) {
+                            $showtag = mb_strtolower($showtag);
+                        } else {
+                            $showtag = strtolower($showtag);
+                        }
+                    }
+
+                    if (!empty($showtag)) {
+                        if (is_string($showtag)) {
+                            $join = "INNER JOIN {$serendipity['dbPrefix']}entrytags AS entrytags ON (e.id = entrytags.entryid) ";
+                            $cond = "entrytags.tag = '$showtag' ";
+                        } else if (is_array($showtag)) {
+                            $taglist = implode('\',\'', $showtag);  // outputs tag','tag2','tag3
+                            $total = count($showtag);
+                            $join = "INNER JOIN {$serendipity['dbPrefix']}entrytags AS entrytags ".
+                                    "ON e.id = entrytags.entryid ";
+                            $cond = "(entrytags.tag IN ('$taglist'))";
+                            $eventData['having'] = " HAVING count(entrytags.tag) = $total";
+                        }
+
+                        if (empty($eventData['and'])) {
+                            $eventData['and'] = " WHERE $cond ";
+                        } else {
+                            $eventData['and'] .= " AND $cond ";
+                        }
+
+
+                        if (empty($eventData['joins'])) {
+                            $eventData['joins'] = $join;
+                        } else {
+                            $eventData['joins'] .= $join;
+                        }
+
+                        $this->displayTag = $showtag;
+                    }
+
+                    return true;
+                    break;
+
+                case 'frontend_rss':
+                    if (!empty($this->displayTag)) {
+                        $eventData['title'] .= serendipity_utf8_encode(htmlspecialchars(' (' . sprintf(PLUGIN_EVENT_FREETAG_USING, $this->displayTag) . ')'));
+                    }
+
+                    return true;
+                    break;
+
+                case 'entries_header':
+                    if ($this->displayTag !== false && serendipity_db_bool($this->get_config('show_tagcloud'))) {
+                         $this->displayTagCloud();
+                    }
+
+                    return true;
+                    break;
+
+                case 'css':
+                    if (strpos($eventData, '.serendipity_freeTag')) {
+                        // class exists in CSS, so a user has customized it and we don't need default
+                        return true;
+                    }
+
+                    $this->addToCSS($eventData);
+
+                    return true;
+                    break;
+
+                case 'entry_display':
+                    // Don't display entries if we are getting a full tag list
+
+                    if (is_array($eventData)) {
+                        $this->TaggedEntries = count($eventData);
+                        if (serendipity_db_bool($this->get_config('send_http_header', true))) {
+                            @header('X-FreeTag-Count: Array');
+                        }
+                    } else {
+                        if (serendipity_db_bool($this->get_config('send_http_header', true))) {
+                            @header('X-FreeTag-Count: Empty');
+                        }
+                        $this->TaggedEntries = 0;
+                    }
+                    if ($this->displayTag === true) {
+                        $eventData['clean_page'] = true;
+                        return true;
+                    }
+
+                    // This falls into the default case, which returns false...  Is this supposed to happen?
+                    // Is it a bug?
+                    // Is it a feature?
+                    $this->displayEntry($eventData, $addData);
+                    return true;
+
+                case 'xmlrpc_updertEntry':
+                    if (isset($eventData['id']) && isset($eventData['mt_keywords'])) {
+                        //XMLRPC call
+                        $tags = $this->makeTagsFromTagList($eventData['mt_keywords']);
+                        if (!empty($tags)) {
+                            $this->deleteTagsForEntry($eventData['id']);
+                            $this->addTagsToEntry($eventData['id'], $tags);
+                        }
+                    }
+                    return true;
+                    break;
+
+                case 'xmlrpc_fetchEntry':
+                    $eventData['mt_keywords']=implode(',', $this->getTagsForEntry($eventData['id']));
+                    return true;
+                    break;
+
+                case 'xmlrpc_deleteEntry':
+                    if (isset($eventData["id"])) {
+                        $this->deleteTagsForEntry($eventData["id"]);
+                    }
+
+                    return true;
+                    break;
+
+                default:
+                    return false;
+                    break;
+            }
+        } else {
+            return false;
+        }
+    }
+
+    function displayEntry(&$eventData, $addData)
+    {
+        global $serendipity;
+        $msg = '<div class="serendipity_freeTag">' . PLUGIN_EVENT_FREETAG_LIST . '</div>';
+
+        if (serendipity_db_bool($this->get_config('embed_footer'))) {
+            $field = 'add_footer';
+        } else {
+            if (strlen($eventData[0]['extended']) > 0) {
+                $field = 'extended';
+            } else {
+                $field = 'body';
+            }
+
+        }
+
+        if ($addData['extended']) {
+            $key =& $this->getFieldReference($field, $eventData[0]);
+
+            $tags = $this->getTagsForEntries(array($eventData[0]['id']));
+            if (!empty($tags)) {
+                $key .= sprintf($msg, $this->getTagHtml($tags[$eventData[0]['id']]));
+            }
+            if (serendipity_db_bool($this->get_config('show_related', true))) {
+                $passvar =& $this->getRelatedEntries($tags[$eventData[0]['id']], $eventData[0]['id']);
+                if (is_array($passvar)) {
+                    $eventData[0]['add_footer'] .= $this->getRelatedEntriesHtml($passvar);
+                }
+            }
+        } else if ($addData['preview']) {
+            $eventData[0]['exflag']    = 1;
+            if (!empty($serendipity['POST']['properties']['freetag_tagList'])) {
+                $eventData[0][$field] .= sprintf($msg, $this->getTagHtmlFromCSV($serendipity['POST']['properties']['freetag_tagList']));
+            }
+            if (serendipity_db_bool($this->get_config('show_related', true))) {
+                $ctags = explode(',', $serendipity['POST']['properties']['freetag_tagList']);
+                $passvar =& $this->getRelatedEntries($ctags, $eventData[0]['id']);
+                if (is_array($passvar)) {
+                    $eventData[0]['add_footer'] .= $this->getRelatedEntriesHtml($passvar);
+                }
+            }
+        } else {
+            $elements = count($eventData);
+            $skeys = array();
+            for ($i = 0; $i < $elements; $i++) {
+                if (empty($eventData[$i]['properties']['freetag_tags'])) {
+                    continue;
+                }
+
+                if (!isset($eventData[$i]['add_footer'])) {
+                    $eventData[$i]['add_footer'] = '';
+                }
+
+                $cont = sprintf($msg, $this->getTagHtml($eventData[$i]['properties']['freetag_tags']));
+                if ($field == 'add_footer') {
+                    $skeys[$i] =& $eventData[$i]['add_footer'];
+                } elseif (strlen($eventData[$i]['extended']) > 0) {
+                    $skeys[$i] =& $this->getFieldReference('extended', $eventData[$i]);
+                } else {
+                    $skeys[$i] =& $this->getFieldReference('body', $eventData[$i]);
+                }
+                $skeys[$i] .= $cont;
+            }
+        }
+    }
+
+    /**
+     * Returns a list of all tags
+     * This performs a memoization operation, so that if we happen to be
+     * getting all tags more then one time per request, we only perform
+     * the SQL query once
+     */
+    // static
+    function makeTagsFromTaglist($tagList)
+    {
+        $freetags = explode(',', $tagList);
+        foreach($freetags AS $idx => $tag) {
+            $tag = trim($tag);
+            if (!empty($tag)) {
+                $tags[] = $tag;
+            }
+        }
+        return $tags;
+    }
+
+    function getAllTags()
+    {
+        global $serendipity;
+
+        static $memo = false;
+
+        if (is_array($memo)) {
+            return $memo;
+        }
+
+        $q = "SELECT tag, count(tag) as total
+                FROM {$serendipity['dbPrefix']}entrytags
+                GROUP BY tag
+                ORDER BY tag";
+
+        $rows = serendipity_db_query($q);
+
+        if (!is_array($rows)) {
+            echo $rows;
+            return false;
+        }
+
+        $memo = array();
+        foreach((array)$rows as $r) {
+            $memo[$r['tag']] = $r['total'];
+        }
+
+        return $memo;
+    }
+
+    function displayTagCloud()
+    {
+        $tags = $this->getTagCloudTags();
+
+        echo '<div class="serendipity_Entry_Date freetag_cloud">';
+        echo '<h2 class="serendipity_date">';
+        $tagTitle = is_array($this->displayTag) ? implode(' + ',$this->displayTag) : $this->displayTag;
+        printf ($title, $tagTitle);
+        echo '</h2>';
+        echo '<div class="serendipity_freetag_taglist">';
+        echo '<div class="serendipity_freetag_taglist_related">' . PLUGIN_EVENT_FREETAG_RELATED_TAGS . '</div>' . "\n";
+        if (!empty($tags)) {
+            $min = $this->get_config('min_percent', 100);
+            $max = $this->get_config('max_percent', 300);
+            serendipity_event_freetag::displayTags($tags, false, false, true, $max, $min);
+        } else {
+            echo PLUGIN_EVENT_FREETAG_NO_RELATED;
+        }
+        echo '</div>';
+        echo '</div>';
+    }
+
+    function getTagCloudTags() {
+        $rows = serendipity_db_query($this->getTagCloudQuery());
+
+        foreach((array)$rows as $r) {
+            $tags[$r['tag']] = $r['total'];
+        }
+        return $tags;
+    }
+
+    /* Todo:
+        - turn use of instance var to parameter */
+    function getTagCloudQuery()
+    {
+        global $serendipity;
+        if ($this->displayTag === true) {
+            $title = PLUGIN_EVENT_FREETAG_ALLTAGS;
+            $q = "SELECT tag, count(tag) as total FROM {$serendipity['dbPrefix']}entrytags GROUP BY tag ORDER BY tag";
+        } else {
+            $title = PLUGIN_EVENT_FREETAG_SUBTAG;
+
+            if (is_string($this->displayTag)) {
+                $cond = "main.tag = '$this->displayTag'";
+                $ncond = "neg.tag != '$this->displayTag'";
+                $join = "LEFT JOIN {$serendipity['dbPrefix']}entrytags AS neg ".
+                      "ON main.entryid = neg.entryid ";
+                $totalModifier = '';
+            } else if (is_array($this->displayTag)) {
+                 $join = "LEFT JOIN {$serendipity['dbPrefix']}entrytags AS neg ".
+                    "ON main.entryid = neg.entryid ";
+                $ccond = '';
+                $ncond = '';
+
+                 $first = true;
+                $total = count($this->displayTag);
+
+                $totalModifier = " - $total";
+
+                for ($i = 0; $i < $total; $i++) {
+                    if (!$first) {
+                        $ncond .= " AND ";
+                        $cond .= " AND ";
+                    } else {
+                        $first = false;
+                    }
+
+                    $join .= "LEFT JOIN {$serendipity['dbPrefix']}entrytags AS sub{$i} ".
+                                "ON main.entryid = sub{$i}.entryid ";
+                    $cond .= "sub{$i}.tag = '{$this->displayTag[$i]}' ";
+                    $ncond .= "neg.tag != '{$this->displayTag[$i]}' ";
+                }
+            } else {
+                echo "FATAL ERROR! Unrecognized type for serendipity_event_freetag::$displayTag !";
+            }
+            $q = "SELECT neg.tag AS tag, count(neg.tag) {$totalModifier} AS total
+                    FROM {$serendipity['dbPrefix']}entrytags AS main
+               {$join}
+                   WHERE ($cond)
+                      AND ($ncond)
+                 GROUP BY neg.tag";
+        }
+        return $q;
+    }
+
+    /* Todo:
+        - turn use of instance var to parameter */
+    function displayMetaKeywords($id = null)
+    {
+        global $serendipity;
+        $max_keywords = (int)$this->get_config('meta_keywords', 0);
+        if ($max_keywords < 1) {
+            return;
+        }
+        if ($this->displayTag !== false && $this->displayTag !== true) { //show related tags
+          $query = $this->getTagCloudQuery();
+          $query = $query . " ORDER BY total DESC LIMIT " . $max_keywords;
+        } else if ($id == null) { // show all tags
+            // select most used tags in descending order
+            $query = "SELECT tag,
+                             count(tag) AS total
+                        FROM {$serendipity['dbPrefix']}entrytags
+                    GROUP BY tag
+                    ORDER BY total DESC
+                       LIMIT " . $max_keywords;
+        } else { // show tags for entry
+            // select tags from entry $id ordered by most usage descending
+            $query = "SELECT one.tag,
+                             two.entryid,
+                             count(two.tag) AS total
+                        FROM {$serendipity['dbPrefix']}entrytags
+                          AS one
+                        JOIN {$serendipity['dbPrefix']}entrytags AS two
+                          ON two.entryid = " . $id . "
+                         AND one.tag = two.tag
+                    GROUP BY one.tag
+                    ORDER BY total DESC
+                       LIMIT " . $max_keywords;
+        }
+        $rows = serendipity_db_query($query);
+        if (!is_array($rows)) {
+            return;
+        }
+        echo "<meta name=\"keywords\" content=\"";
+        if (isset($this->tags['show'])) {
+            if (is_array($this->tags['show'])) {
+                foreach($this->tags['show'] AS $r) {
+                    $not_first ? print(', ') : $not_first = true;
+                    echo $r;
+                }
+            } else {
+                echo $this->tags['show'];
+                $not_first = true;
+            }
+        }
+        foreach($rows AS $r) {
+            if (empty($r['tag'])) {
+                continue;
+            }
+            $not_first ? print(', ') : $not_first = true;
+            echo htmlspecialchars($r['tag']);
+        }
+        echo "\" />";
+    }
+
+    function getRelatedTags($tag) {
+        global $serendipity;
+
+        $q = "SELECT sub.tag AS tag, count(sub.tag) AS total
+                     FROM {$serendipity['dbPrefix']}entrytags AS main
+                LEFT JOIN {$serendipity['dbPrefix']}entrytags AS sub
+                       ON main.entryid = sub.entryid
+                    WHERE main.tag = '$tag'
+                      AND sub.tag != '$tag'
+                 GROUP BY sub.tag
+                 ORDER BY sub.tag";
+
+        $rows = serendipity_db_query($q);
+
+        if (!is_array($rows)) {
+             if ($rows !== true && $rows !== 1 && $rows !== 'true') {
+                 echo $rows;
+             }
+             return array();
+        }
+
+        foreach($rows as $r) {
+            $tags[$r['tag']] = $r['total'];
+        }
+
+        return $tags;
+    }
+
+    function getLeafTags($leafWeight=1) {
+        global $serendipity;
+
+    $q = "SELECT tag, count(tag) as total
+               FROM {$serendipity['dbPrefix']}entrytags
+               GROUP BY tag
+               HAVING count(tag) <= $leafWeight
+               ORDER BY tag";
+
+    $rows = serendipity_db_query($q);
+
+        if (!is_array($rows)) {
+             echo $rows;
+        }
+
+        $tags = array();
+        foreach((array)$rows as $r) {
+            $tags[$r['tag']] = $r['total'];
+        }
+
+        return $tags;
+    }
+
+    function getTagsForEntries($entries) {
+        global $serendipity;
+
+        $q = "SELECT entryid, tag from {$serendipity['dbPrefix']}entrytags WHERE entryid IN (".implode(',', $entries).") order by entryid, tag";
+        $result = serendipity_db_query($q);
+
+        if (!is_array($result)) {
+            return false;
+        }
+
+        $return = array();
+        foreach($result as $idx => $row) {
+            $return[$row['entryid']][] = $row['tag'];
+        }
+
+        return $return;
+    }
+
+    function getTagsForEntry($entryId) {
+        $array = $this->getTagsForEntries(array($entryId));
+        return (is_array($array) ? array_pop($array) : array());
+    }
+
+    function deleteTagsForEntry($entryId) {
+        global $serendipity;
+
+        $q = "DELETE FROM {$serendipity['dbPrefix']}entrytags WHERE entryid = ".(int)$entryId;
+        serendipity_db_query($q);
+    }
+
+    // Static
+    function addTagsToEntry($entryId, $tags) {
+        global $serendipity;
+
+        if (!is_array($tags)) {
+            return false;
+        }
+
+        foreach($tags as $tag) {
+            $q = "INSERT INTO {$serendipity['dbPrefix']}entrytags (entryid, tag) VALUES (".(int)$entryId.", '".serendipity_db_escape_string($tag)."')";
+            serendipity_db_query($q);
+        }
+    }
+
+    // This may not be the right way to do this...
+    function importEntryTagsIntoProperties(&$eventData, $addData) {
+        // we do a dual loop here, which is probably the worst thing to do.
+        // A better thing might be some kind of array merge action, but I am not
+        // entirely sure how do do that with the arrays we are given.
+        //
+        // RefactorMe Later.
+
+        // Loop one in getTagsForEntries
+        $tagGroups = $this->getTagsForEntries(array_keys($addData));
+
+        // Loop 2
+        if (is_array($tagGroups))  {
+            foreach($tagGroups as $entryId => $tagList) {
+                $eventData[$addData[$entryId]]['properties']['freetag_tags'] = $tagList;
+                $eventData[$addData[$entryId]]['properties']['freetag_tagList'] = implode(",", $tagList);
+            }
+        }
+    }
+
+    function getFeedXmlForTags($element, $tagList) {
+        $out = '';
+        if (!is_array($tagList)) {
+            return $out;
+        }
+
+        foreach($tagList as $tag) {
+            $out .= serendipity_utf8_encode("<$element>".htmlspecialchars($tag)."</$element>\n");
+        }
+        return $out;
+    }
+
+    function displayManageTags($event, &$bag, &$eventData, $addData) {
+        global $serendipity;
+
+        if ($this->get_config('dbversion', 1) != 2) {
+            $this->install();
+            $this->set_config('dbversion', 2);
+        }
+        ?>
+        <div style="border: 1px solid #000; padding: 5px;">
+        <ul>
+            <li> <a href="<?php echo FREETAG_MANAGE_URL ?>&amp;serendipity[tagview]=all"><?php echo PLUGIN_EVENT_FREETAG_MANAGE_ALL ?></a> </li>
+            <li> <a href="<?php echo FREETAG_MANAGE_URL ?>&amp;serendipity[tagview]=leaf"><?php echo PLUGIN_EVENT_FREETAG_MANAGE_LEAF ?></a> </li>
+            <li> <a href="<?php echo FREETAG_MANAGE_URL ?>&amp;serendipity[tagview]=entryuntagged"><?php echo PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED ?></a> </li>
+            <li> <a href="<?php echo FREETAG_MANAGE_URL ?>&amp;serendipity[tagview]=entryleaf"><?php echo PLUGIN_EVENT_FREETAG_MANAGE_LEAFTAGGED ?></a> </li>
+            <li> <a href="<?php echo FREETAG_MANAGE_URL ?>&amp;serendipity[tagview]=keywords"><?php echo PLUGIN_EVENT_FREETAG_KEYWORDS; ?></a></li>
+            <li> <a href="<?php echo FREETAG_MANAGE_URL ?>&amp;serendipity[tagview]=cat2tag"><?php echo PLUGIN_EVENT_FREETAG_GLOBALLINKS; ?></a></li>
+            <li> <a href="<?php echo FREETAG_MANAGE_URL ?>&amp;serendipity[tagview]=tagupdate" onclick="return confirm('<?php echo htmlspecialchars(PLUGIN_EVENT_FREETAG_REBUILD_DESC); ?>');" ><?php echo PLUGIN_EVENT_FREETAG_REBUILD; ?></a></li>
+        </ul>
+        </div>
+        <?php
+        if (!empty($this->eventData['GET']['tagaction'])) {
+            $this->displayTagAction($this->eventData);
+        }
+
+        switch(@$this->eventData['GET']['tagview']) {
+            case "entryuntagged":
+                $this->displayUntaggedEntries();
+                break;
+
+            case "entryleaf":
+                $this->displayLeafTaggedEntries();
+                break;
+
+            case "all":
+                $tags = (array)$this->getAllTags();
+                $this->displayEditTags($this->eventData, $tags);
+                break;
+
+            case "leaf":
+                $tags = $this->getLeafTags();
+                $this->displayEditTags($this->eventData, $tags);
+                break;
+
+            case 'keywords':
+                $tags = (array)$this->getAllTags();
+                $this->displayKeywordAssignment($tags);
+                break;
+
+            case 'tagupdate':
+                $per_fetch = 25;
+                $page = (isset($serendipity['GET']['page']) ? $serendipity['GET']['page'] : 1);
+                $from = ($page-1)*$per_fetch;
+                $to   = ($page)*$per_fetch;
+                printf(PLUGIN_EVENT_FREETAG_REBUILD_FETCHNO, $from, $to);
+                $entries = serendipity_fetchEntries(
+                    null,
+                    true,
+                    $per_fetch,
+                    false,
+                    false,
+                    'timestamp DESC',
+                    '',
+                    true
+                );
+
+                $total = serendipity_getTotalEntries();
+                printf(PLUGIN_EVENT_FREETAG_REBUILD_TOTAL . '<br />', $total);
+
+                if (is_array($entries)) {
+                    foreach($entries AS $idx => $entry) {
+                        unset($entry['orderkey']);
+                        unset($entry['loginname']);
+                        unset($entry['email']);
+                        printf('%d - "%s"<br />', $entry['id'], htmlspecialchars($entry['title']));
+                        $up = serendipity_updertEntry($entry);
+                        if (is_string($up)) {
+                            echo "<div>$up</div>\n";
+                        }
+                        echo DONE . "<br />\n";
+                    }
+                }
+
+                echo '<br />';
+
+                if ($to < $total) {
+?>
+                <script type="text/javascript">
+                    if (confirm("<?php echo htmlspecialchars(PLUGIN_EVENT_FREETAG_REBUILD_FETCHNEXT); ?>")) {
+                        location.href = "?serendipity[adminModule]=event_display&serendipity[adminAction]=managetags&serendipity[tagview]=tagupdate&serendipity[page]=<?php echo ($page+1); ?>";
+                    } else {
+                        alert("<?php echo htmlspecialchars(DONE); ?>");
+                    }
+                </script>
+<?php
+                } else {
+                    echo '<div class="serendipity_msg_notice">' . DONE . '</div>';
+                }
+                break;
+
+            case 'cat2tag':
+                $e = serendipity_db_query("SELECT e.id, e.title, c.category_name, et.tag
+                                        FROM {$serendipity['dbPrefix']}entries AS e
+                             LEFT OUTER JOIN {$serendipity['dbPrefix']}entrycat AS ec
+                                          ON e.id = ec.entryid
+                             LEFT OUTER JOIN {$serendipity['dbPrefix']}category AS c
+                                          ON ec.categoryid = c.categoryid
+                             LEFT OUTER JOIN {$serendipity['dbPrefix']}entrytags AS et
+                                          ON e.id = et.entryid", false, 'assoc');
+                // Get all categories and tags of all entries
+                $entries = array();
+                foreach($e AS $row) {
+                    $entries[$row['id']]['title'] = $row['title'];
+                    $entries[$row['id']]['categories'][$row['category_name']] = $row['category_name'];
+                    $entries[$row['id']]['tags'][$row['tag']] = $row['tag'];
+                }
+
+                // Cycle all entries
+                foreach($entries AS $id => $props) {
+                    $newtags = array();
+                    // Fetch all tags that should be added
+                    foreach($props['categories'] AS $tag) {
+                        if (empty($tag)) continue;
+                        $newtags[$tag] = $tag;
+                    }
+
+                    // Subtract all tags that already exist
+                    foreach($props['tags'] AS $tag) {
+                        unset($newtags[$tag]);
+                    }
+
+                    if (count($newtags) < 1) {
+                        continue;
+                    }
+
+                    $this->addTagsToEntry($id, $newtags);
+                    printf(PLUGIN_EVENT_FREETAG_GLOBALCAT2TAG_ENTRY . '<br />',
+                           $id,
+                           htmlspecialchars($props['title']),
+                           htmlspecialchars(implode(', ', $newtags))
+                    );
+                }
+
+                echo PLUGIN_EVENT_FREETAG_GLOBALCAT2TAG . '<br />';
+                break;
+
+            default:
+                if (!empty($this->eventData['GET']['tagview'])) {
+                    echo "Can't execute {$this->eventData['GET']['tagview']}";
+                }
+                break;
+        }
+        return true;
+    }
+
+    function displayUntaggedEntries() {
+        global $serendipity;
+
+        $q = "SELECT e.id as id, e.title as title
+                FROM ${serendipity['dbPrefix']}entries AS e
+                LEFT OUTER JOIN ${serendipity['dbPrefix']}entrytags AS t
+                    ON e.id = t.entryid
+                WHERE entryid IS NULL
+                GROUP BY e.id, e.title";
+
+        $this->displayEditEntries($q);
+    }
+
+    function displayLeafTaggedEntries() {
+        global $serendipity;
+
+        $q = "SELECT e.id as id, e.title as title, count(*) as total
+                FROM ${serendipity['dbPrefix']}entries AS e
+                LEFT JOIN ${serendipity['dbPrefix']}entrytags AS t
+                    ON e.id = t.entryid
+                GROUP BY e.id, e.title
+                HAVING count(*) = 1";
+
+        $this->displayEditEntries($q);
+    }
+
+    function displayEditEntries($q) {
+        global $serendipity;
+
+        $r = serendipity_db_query($q);
+
+        if ($r === true) {
+            echo PLUGIN_EVENT_FREETAG_MANAGE_UNTAGGED_NONE;
+        } else if (!is_array($r)) {
+            echo $r;
+        } else {
+            foreach ($r as $row) {
+            echo '<p style="margin: 5px; border: 1px dotted #000; padding: 3px;">
+                    <a href="' . FREETAG_EDITENTRY_URL . $row['id'] . '"><img style="border: 0px;" src="' . serendipity_getTemplateFile('admin/img/edit.png') . '"></a>
+                    ' . $row['title'] . '
+                </p>';
+            }
+        }
+    }
+
+    function displayKeywordAssignment($taglist) {
+        global $serendipity;
+
+        if ($serendipity['POST']['keywordsubmit']) {
+            serendipity_db_query("DELETE FROM {$serendipity['dbPrefix']}tagkeywords WHERE tag = '" . serendipity_db_escape_string(urldecode($serendipity['POST']['tag'])) . "'");
+            serendipity_db_query("INSERT INTO {$serendipity['dbPrefix']}tagkeywords (tag, keywords) VALUES ('" . serendipity_db_escape_string(urldecode($serendipity['POST']['tag'])) . "', '" . serendipity_db_escape_string($serendipity['POST']['keywords']) . "')");
+        }
+
+        $keys = array();
+        $keylist = serendipity_db_query("SELECT tag, keywords FROM {$serendipity['dbPrefix']}tagkeywords ORDER BY tag");
+        if (is_array($keylist)) {
+            foreach($keylist AS $key) {
+                $keys[$key['tag']] = $key['keywords'];
+            }
+        }
+        $url = FREETAG_MANAGE_URL . "&amp;serendipity[tagview]=".$this->eventData['GET']['tagview'];
+
+        echo '<br />' . PLUGIN_EVENT_FREETAG_KEYWORDS_DESC . '<br /><br />';
+?>
+        <form action="<?php echo $url; ?>" method="post">
+        <table>
+            <tr>
+                <th> <?php echo PLUGIN_EVENT_FREETAG_MANAGE_LIST_TAG ?> </th>
+                <th> <?php echo PLUGIN_EVENT_FREETAG_KEYWORDS ?> </th>
+                <th> <?php echo PLUGIN_EVENT_FREETAG_MANAGE_LIST_ACTIONS ?> </th>
+            </tr>
+<?php
+        foreach($taglist as $tag => $weight) {
+?>
+            <tr>
+                <td valign="top"> <?php echo $tag; ?> </td>
+                <td valign="top">
+<?php
+            if (urldecode($serendipity['GET']['tag']) == $tag) {
+?>
+                <a id="edit"></a>
+                <textarea rows="4" cols="40" name="serendipity[keywords]"><?php echo htmlspecialchars($keys[$tag]); ?></textarea>
+<?php
+            } else {
+                echo $keys[$tag];
+            }
+?> </td>
+                <td valign="top">
+<?php
+            if (urldecode($serendipity['GET']['tag']) == $tag) {
+?>
+                    <input type="hidden" name="serendipity[tag]" value="<?php echo urlencode(urldecode($serendipity['GET']['tag'])); ?>" />
+                    <input type="submit" name="serendipity[keywordsubmit]" class="serendipityPrettyButton" value="<?php echo SAVE; ?>" />
+<?php
+            } else {
+?>
+                    <a href="<?php echo $url ?>&amp;serendipity[tag]=<?php echo urlencode($tag)?>#edit"><?php echo EDIT ?></a>
+<?php
+            }
+?>
+                </td>
+            </tr>
+<?php
+        }
+?>
+        </table>
+        </form>
+<?php
+
+    }
+
+    function displayEditTags(&$eventData, $taglist) {
+        $url = FREETAG_MANAGE_URL . "&amp;serendipity[tagview]=".$this->eventData['GET']['tagview'];
+?>
+        <table>
+            <tr>
+                <th> <?php echo PLUGIN_EVENT_FREETAG_MANAGE_LIST_TAG ?> </th>
+                <th> <?php echo PLUGIN_EVENT_FREETAG_MANAGE_LIST_WEIGHT ?> </th>
+                <th> <?php echo PLUGIN_EVENT_FREETAG_MANAGE_LIST_ACTIONS ?> </th>
+            </tr>
+<?php
+        foreach($taglist as $tag => $weight) {
+?>
+            <tr>
+                <td> <?php echo $tag; ?> </td>
+                <td> <?php echo $weight; ?> </td>
+                <td>
+                    <a href="<?php echo $url?>&amp;serendipity[tagaction]=rename&amp;serendipity[tag]=<?php echo urlencode($tag)?>"><?php echo PLUGIN_EVENT_FREETAG_MANAGE_ACTION_RENAME ?></a>
+                    <a href="<?php echo $url?>&amp;serendipity[tagaction]=split&amp;serendipity[tag]=<?php echo urlencode($tag)?>"><?php echo  PLUGIN_EVENT_FREETAG_MANAGE_ACTION_SPLIT ?></a>
+                    <a href="<?php echo $url?>&amp;serendipity[tagaction]=delete&amp;serendipity[tag]=<?php echo urlencode($tag)?>"><?php echo PLUGIN_EVENT_FREETAG_MANAGE_ACTION_DELETE ?></a>
+                </td>
+            </tr>
+<?php
+        }
+?>
+        </table>
+<?php
+    }
+
+    /**
+     * Here we are going to do a dispatch based on the action.
+     * There are 2 dispatches that happen here: The first is the display/query, where
+     * we ask the user for any extra information, and/or a confirmation.
+     * The next is the actual action itself, where we do a db update/delete of some sort.
+     */
+    function displayTagAction(&$eventData) {
+        global $serendipity;
+
+        $validActions = array('rename','split','delete');
+
+        // Sanitize user input
+        $tag = urldecode($this->eventData['GET']['tag']);
+        $action = urldecode($this->eventData['GET']['tagaction']);
+        if (!in_array($this->eventData['GET']['tagaction'], $validActions))
+            exit ("DON'T HACK!");
+
+        if ($this->eventData['GET']['commit'] == 'true') {
+            $method = 'get'.$this->eventData['GET']['tagaction'].'TagQuery';
+            $q = $this->$method($tag, $this->eventData);
+            echo $this->eventData['GET']['tagaction'] . " Completed";
+        } else {
+            $method = 'display'.$this->eventData['GET']['tagaction']."Tag";
+            $this->$method($tag, $this->eventData);
+        }
+    }
+
+    function getManageUrlAsHidden(&$eventData) {
+        return '<input type="hidden" name="serendipity[adminModule]" value="event_display" />
+                <input type="hidden" name="serendipity[adminAction]" value="managetags" />';
+    }
+
+    function displayRenameTag($tag, &$eventData) {
+?>
+        <form action="" method="GET">
+            <?php echo $this->getManageUrlAsHidden($this->eventData) ?>
+            <input type="hidden" name="serendipity[tagview]" value="<?php echo $this->eventData['GET']['tagview'] ?>">
+            <input type="hidden" name="serendipity[tagaction]" value="rename" />
+            <input type="hidden" name="serendipity[commit]" value="true" />
+            <input type="hidden" name="serendipity[tag]" value="<?php echo $tag?>" />
+            <?php echo $tag?> => <input type="text" name="serendipity[newtag]" /> <input type="submit" name="submit" value="rename" />
+        </form>
+<?php
+    }
+
+    /**
+     * Execute A rename of a tag
+     * We select all the entreis with the old tag name, delete all entry tags
+     * with the old tag name, and finally re insert.  The reason we do this is
+     * that we might be renaming a tag, to an already exising tag that is
+     * already associated to an entry, duplicating the primary key.
+     * If we do it via an update, the update fails, and our rename doesn't
+     * happen.  This way our update does happen, and we can siltenly fail
+     * when we hit a duplicate key condition.
+     * Postgres doesnt have an UPDATE IGNORE syntax, so we can't use that
+     * method.  Sux0rz.
+     */
+    function getRenameTagQuery($tag, &$eventData) {
+        global $serendipity;
+
+        $tag = serendipity_db_escape_string($tag);
+        $newtag = serendipity_db_escape_string(urldecode($serendipity['GET']['newtag']));
+
+        $q = "select entryid from ${serendipity['dbPrefix']}entrytags where tag = '$tag'";
+
+        $r = serendipity_db_query($q);
+        if (!is_array($r)) {
+            echo $r;
+            return false;
+        }
+
+        $q = "delete from ${serendipity['dbPrefix']}entrytags where tag = '$tag'";
+        serendipity_db_query($q);
+
+        foreach ($r as $row) {
+            $q = "insert into ${serendipity['dbPrefix']}entrytags values ('{$row['entryid']}','$newtag')";
+            serendipity_db_query($q);
+        }
+
+        return true;
+    }
+
+    function displayDeleteTag($tag, &$eventData) {
+        $no  = FREETAG_MANAGE_URL . "&amp;serendipity[tagview]=".$this->eventData['GET']['tagview'];
+        $yes = FREETAG_MANAGE_URL . "&amp;serendipity[tagview]=".$this->eventData['GET']['tagview'].
+                    "&amp;serendipity[tagaction]=delete".
+                    "&amp;serendipity[tag]=".urlencode($tag)."&amp;serendipity[commit]=true";
+?>
+        <h2> <?php printf(PLUGIN_EVENT_FREETAG_MANAGE_CONFIRM_DELETE, $tag)?></h2>
+        <h3> <a href="<?php echo $yes; ?>"><?php echo YES; ?></a> &nbsp; &nbsp; <a href="<?php echo $no; ?>"><?php echo NO; ?></a> </h3>
+<?php
+    }
+
+    function getDeleteTagQuery($tag, &$eventData) {
+        global $serendipity;
+
+           $tag = serendipity_db_escape_string($tag);
+
+        $q = "DELETE from ${serendipity['dbPrefix']}entrytags
+                WHERE tag='$tag'";
+
+        $r = serendipity_db_query($q);
+        if ($r !== true) {
+            echo $r;
+        }
+    }
+
+    function displaySplitTag($tag, &$eventData) {
+        if (strstr($tag, ' ')) {
+            $newtag = str_replace(' ',',',$tag);
+        } else {
+            $newtag = '';
+        }
+?>
+        <form action="" method="GET">
+            <?php echo $this->getManageUrlAsHidden($this->eventData) ?>
+            <input type="hidden" name="serendipity[tagview]" value="<?php echo $this->eventData['GET']['tagview'] ?>">
+            <input type="hidden" name="serendipity[tagaction]" value="split" />
+            <input type="hidden" name="serendipity[commit]" value="true" />
+            <input type="hidden" name="serendipity[tag]" value="<?php echo $tag?>" />
+            <p> <?php echo PLUGIN_EVENT_FREETAG_MANAGE_INFO_SPLIT ?> <br/>
+                foobarbaz =&gt; foo,bar,baz</p>
+            <?php echo $tag ?> =&gt; <input type="text" name="serendipity[newtags]" value="<?php echo $newtag; ?>" />
+            <input type="submit" name="submit" value="split" />
+        </form>
+<?php
+    }
+
+    function getSplitTagQuery($tag, &$eventData) {
+        global $serendipity;
+
+        $newtags = $this->makeTagsFromTaglist(urldecode($this->eventData['GET']['newtags']));
+        $tag = serendipity_db_escape_string($tag);
+
+        $q = "SELECT entryid from ${serendipity['dbPrefix']}entrytags where tag = '$tag'";
+        $entries = serendipity_db_query($q);
+
+        if (!is_array($entries)) {
+            echo $entries;
+            return false;
+        }
+
+        $q = "DELETE FROM ${serendipity['dbPrefix']}entrytags where tag = '$tag'";
+        $r = serendipity_db_query($q);
+        if ($r !== true) {
+            echo $r;
+            return false;
+        }
+
+        foreach ($entries as $entryid) {
+            foreach ($newtags as $tag) {
+                $q = "INSERT INTO ${serendipity['dbPrefix']}entrytags (entryid, tag)
+                        VALUES ('${entryid['entryid']}', '$tag')";
+                $r = serendipity_db_query($q);
+            }
+        }
+    }
+
+    function addToCSS(&$eventData) {
+        $eventData .= '
+.serendipity_freeTag
+{
+    margin-left: auto;
+    margin-right: 0px;
+    text-align: right;
+    font-size: 7pt;
+    display: block;
+    margin-top: 5px;
+    margin-bottom: 0px;
+}
+
+.serendipity_freeTag_related
+{
+    margin-left: 50px;
+    margin-right: 0px;
+    text-align: left;
+    font-size: small;
+    display: block;
+    margin-top: 20px;
+    margin-bottom: 0px;
+}
+
+.serendipity_freetag_taglist
+{
+    margin: 10px;
+    border: 1px solid #6265F0;
+    padding: 5px;
+    background-color: #B5B8FF;
+    text-align: justify;
+}
+
+.serendipity_freeTag a
+{
+    font-size: 7pt;
+    text-decoration: none;
+}
+
+.serendipity_freeTag a:hover
+{
+    color: green;
+    text-decoration: underline;
+}
+img.serendipity_freeTag_xmlButton
+{
+    vertical-align: bottom;
+    display: inline;
+    border: 0px
+}
+';
+    }
+}
+
+/* vim: set sts=4 ts=4 expandtab : */
diff --git a/plugins/serendipity_event_freetag/serendipity_plugin_freetag.php b/plugins/serendipity_event_freetag/serendipity_plugin_freetag.php
new file mode 100644 (file)
index 0000000..a041283
--- /dev/null
@@ -0,0 +1,146 @@
+<?php # $Id: serendipity_plugin_freetag.php,v 1.23 2006/12/01 09:00:43 garvinhicking Exp $
+
+
+if (IN_serendipity !== true) {
+    die ("Don't hack!");
+}
+
+// Probe for a language include with constants. Still include defines later on, if some constants were missing
+$probelang = dirname(__FILE__) . '/' . $serendipity['charset'] . 'lang_' . $serendipity['lang'] . '.inc.php';
+if (file_exists($probelang)) {
+    include $probelang;
+}
+
+include_once dirname(__FILE__) . '/lang_en.inc.php';
+
+class serendipity_plugin_freetag extends serendipity_plugin
+{
+    var $title = PLUGIN_FREETAG_NAME;
+
+    function introspect(&$propbag)
+    {
+        global $serendipity;
+
+        $this->title = $this->get_config('title', $this->title);
+
+        $propbag->add('name',          PLUGIN_FREETAG_NAME);
+        $propbag->add('description',   PLUGIN_FREETAG_BLAHBLAH);
+        $propbag->add('stackable',     false);
+        $propbag->add('author',        'Garvin Hicking, Jonathan Arkell');
+        $propbag->add('requirements',  array(
+            'serendipity' => '0.8',
+            'smarty'      => '2.6.7',
+            'php'         => '4.1.0'
+        ));
+        $propbag->add('version',       '2.39');
+        $propbag->add('groups',        array('FRONTEND_ENTRY_RELATED'));
+        $propbag->add('configuration', array('title', 'show_xml', 'show_newline', 'taglink', 'scale_tag', 'max_tags', 'treshold_tag_count'));
+        $this->dependencies = array('serendipity_event_freetag' => 'keep');
+    }
+
+
+    function introspect_config_item($name, &$propbag) {
+        global $serendipity;
+        switch($name) {
+            case 'title':
+                 $propbag->add('type',        'string');
+                 $propbag->add('name',        TITLE);
+                 $propbag->add('description', TITLE_FOR_NUGGET);
+                 $propbag->add('default',     PLUGIN_FREETAG_NAME);
+                 break;
+
+            case 'taglink':
+                 $propbag->add('type',        'string');
+                 $propbag->add('name',        PLUGIN_EVENT_FREETAG_TAGLINK);
+                 $propbag->add('description', '');
+                 $propbag->add('default',     $serendipity['baseURL'] . ($serendipity['rewrite'] == 'none' ? $serendipity['indexFile'] . '?/' : '') . 'plugin/tag/');
+                 break;
+
+            case 'scale_tag':
+                 $propbag->add('type',        'boolean');
+                 $propbag->add('name',        PLUGIN_FREETAG_SCALE);
+                 $propbag->add('description', '');
+                 $propbag->add('default',     false);
+                 break;
+
+            case 'show_xml':
+                $propbag->add('type',        'boolean');
+                $propbag->add('name',        PLUGIN_FREETAG_XML);
+                $propbag->add('description', '');
+                $propbag->add('default',     true);
+                break;
+
+            case 'show_newline':
+                $propbag->add('type',        'boolean');
+                $propbag->add('name',        PLUGIN_FREETAG_NEWLINE);
+                $propbag->add('description', '');
+                $propbag->add('default',     true);
+                break;
+
+            case 'max_tags':
+                $propbag->add('type',        'string');
+                $propbag->add('name',        PLUGIN_FREETAG_MAX_TAGS);
+                $propbag->add('description', '');
+                $propbag->add('default',     '100');
+                break;
+
+            case 'treshold_tag_count':
+                $propbag->add('type',        'string');
+                $propbag->add('name',        PLUGIN_FREETAG_TRESHOLD_TAG_COUNT);
+                $propbag->add('description', '');
+                $propbag->add('default',     '2');
+                break;
+            }
+
+        return true;
+    }
+
+    function generate_content(&$title)
+    {
+        global $serendipity;
+
+        $title = $this->get_config('title', $this->title);
+
+        if ($this->get_config('max_tags', 0) != 0) {
+            $limit = "LIMIT " . $this->get_config('max_tags', 0);
+        } else {
+            $limit = '';
+        }
+
+        $query = "SELECT et.tag, count(et.tag) AS total
+                    FROM {$serendipity['dbPrefix']}entrytags AS et
+         LEFT OUTER JOIN {$serendipity['dbPrefix']}entries AS e
+                      ON et.entryid = e.id
+                   WHERE e.isdraft = 'false' "
+                         . (!serendipity_db_bool($serendipity['showFutureEntries']) ? " AND e.timestamp <= " . time() : '') . "
+                GROUP BY et.tag
+                  HAVING count(et.tag) >= " . $this->get_config('treshold_tag_count') . "
+                ORDER BY et.tag " . $limit;
+
+        $rows = serendipity_db_query($query);
+
+        if (!is_array($rows)) {
+            return;
+        }
+
+        // not sure if we can optimize this loop... :/
+        // Probably through some SQL magick.
+        foreach($rows as $r) {
+            $tags[$r['tag']] = $r['total'];
+        }
+
+        $xml     = serendipity_db_bool($this->get_config('show_xml'));
+        $nl      = serendipity_db_bool($this->get_config('show_newline'));
+        $scaling = serendipity_db_bool($this->get_config('scale_tag'));
+
+        serendipity_event_freetag::displayTags($tags, $xml, $nl, $scaling);
+    }
+
+    function cleanup() {
+        global $serendipity;
+
+        serendipity_event_freetag::install();
+    }
+}
+
+/* vim: set sts=4 ts=4 expandtab : */