summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYaco <franco@reevo.org>2022-03-19 15:09:45 +0000
committerYaco <franco@reevo.org>2022-03-19 15:09:45 +0000
commitbbf56876ca1564597bd859691ca698a7d2851387 (patch)
tree4c779d76b86b8da583a63654a70da1b2df12f0ef
parent435085ad710450bed7890f28a9cc9d3bb2e7fd72 (diff)
add plugins blog, pagelist and tagHEADmaster
-rw-r--r--platform/www/lib/plugins/blog/COPYING340
-rw-r--r--platform/www/lib/plugins/blog/README10
-rw-r--r--platform/www/lib/plugins/blog/_template.txt6
-rw-r--r--platform/www/lib/plugins/blog/action.php259
-rw-r--r--platform/www/lib/plugins/blog/conf/default.php18
-rw-r--r--platform/www/lib/plugins/blog/conf/metadata.php22
-rw-r--r--platform/www/lib/plugins/blog/helper.php189
-rw-r--r--platform/www/lib/plugins/blog/lang/ar/lang.php36
-rw-r--r--platform/www/lib/plugins/blog/lang/ar/settings.php35
-rw-r--r--platform/www/lib/plugins/blog/lang/ckb/lang.php30
-rw-r--r--platform/www/lib/plugins/blog/lang/ckb/settings.php41
-rw-r--r--platform/www/lib/plugins/blog/lang/cs/lang.php25
-rw-r--r--platform/www/lib/plugins/blog/lang/cs/settings.php25
-rw-r--r--platform/www/lib/plugins/blog/lang/da/lang.php31
-rw-r--r--platform/www/lib/plugins/blog/lang/da/settings.php29
-rw-r--r--platform/www/lib/plugins/blog/lang/de-informal/lang.php31
-rw-r--r--platform/www/lib/plugins/blog/lang/de-informal/settings.php29
-rw-r--r--platform/www/lib/plugins/blog/lang/de/lang.php31
-rw-r--r--platform/www/lib/plugins/blog/lang/de/settings.php29
-rw-r--r--platform/www/lib/plugins/blog/lang/en/lang.php36
-rw-r--r--platform/www/lib/plugins/blog/lang/en/settings.php38
-rw-r--r--platform/www/lib/plugins/blog/lang/eo/lang.php31
-rw-r--r--platform/www/lib/plugins/blog/lang/eo/settings.php28
-rw-r--r--platform/www/lib/plugins/blog/lang/es/lang.php30
-rw-r--r--platform/www/lib/plugins/blog/lang/es/settings.php23
-rw-r--r--platform/www/lib/plugins/blog/lang/fa/lang.php30
-rw-r--r--platform/www/lib/plugins/blog/lang/fa/settings.php27
-rw-r--r--platform/www/lib/plugins/blog/lang/fr/lang.php32
-rw-r--r--platform/www/lib/plugins/blog/lang/fr/settings.php29
-rw-r--r--platform/www/lib/plugins/blog/lang/hu/lang.php32
-rw-r--r--platform/www/lib/plugins/blog/lang/hu/settings.php29
-rw-r--r--platform/www/lib/plugins/blog/lang/it/lang.php36
-rw-r--r--platform/www/lib/plugins/blog/lang/it/settings.php12
-rw-r--r--platform/www/lib/plugins/blog/lang/ja/lang.php30
-rw-r--r--platform/www/lib/plugins/blog/lang/ja/settings.php27
-rw-r--r--platform/www/lib/plugins/blog/lang/ko/lang.php30
-rw-r--r--platform/www/lib/plugins/blog/lang/ko/settings.php27
-rw-r--r--platform/www/lib/plugins/blog/lang/nl/lang.php31
-rw-r--r--platform/www/lib/plugins/blog/lang/nl/settings.php28
-rw-r--r--platform/www/lib/plugins/blog/lang/pl/lang.php31
-rw-r--r--platform/www/lib/plugins/blog/lang/pl/settings.php25
-rw-r--r--platform/www/lib/plugins/blog/lang/pt-br/lang.php30
-rw-r--r--platform/www/lib/plugins/blog/lang/pt-br/settings.php29
-rw-r--r--platform/www/lib/plugins/blog/lang/pt/lang.php31
-rw-r--r--platform/www/lib/plugins/blog/lang/pt/settings.php28
-rw-r--r--platform/www/lib/plugins/blog/lang/ro/lang.php32
-rw-r--r--platform/www/lib/plugins/blog/lang/ro/settings.php30
-rw-r--r--platform/www/lib/plugins/blog/lang/ru/lang.php31
-rw-r--r--platform/www/lib/plugins/blog/lang/ru/settings.php29
-rw-r--r--platform/www/lib/plugins/blog/lang/sk/lang.php34
-rw-r--r--platform/www/lib/plugins/blog/lang/sk/settings.php34
-rw-r--r--platform/www/lib/plugins/blog/lang/sl/lang.php15
-rw-r--r--platform/www/lib/plugins/blog/lang/sl/settings.php19
-rw-r--r--platform/www/lib/plugins/blog/lang/sv/lang.php32
-rw-r--r--platform/www/lib/plugins/blog/lang/sv/settings.php29
-rw-r--r--platform/www/lib/plugins/blog/lang/tr/lang.php30
-rw-r--r--platform/www/lib/plugins/blog/lang/tr/settings.php27
-rw-r--r--platform/www/lib/plugins/blog/lang/zh/lang.php36
-rw-r--r--platform/www/lib/plugins/blog/lang/zh/settings.php38
-rw-r--r--platform/www/lib/plugins/blog/manager.dat2
-rw-r--r--platform/www/lib/plugins/blog/plugin.info.txt8
-rw-r--r--platform/www/lib/plugins/blog/print.css3
-rw-r--r--platform/www/lib/plugins/blog/style.css40
-rw-r--r--platform/www/lib/plugins/blog/syntax/archive.php245
-rw-r--r--platform/www/lib/plugins/blog/syntax/autoarchive.php157
-rw-r--r--platform/www/lib/plugins/blog/syntax/blog.php213
-rw-r--r--platform/www/lib/plugins/blog/syntax/draft.php33
-rw-r--r--platform/www/lib/plugins/pagelist/COPYING340
-rw-r--r--platform/www/lib/plugins/pagelist/README9
-rw-r--r--platform/www/lib/plugins/pagelist/conf/default.php19
-rw-r--r--platform/www/lib/plugins/pagelist/conf/metadata.php24
-rw-r--r--platform/www/lib/plugins/pagelist/helper.php448
-rw-r--r--platform/www/lib/plugins/pagelist/lang/ar/lang.php16
-rw-r--r--platform/www/lib/plugins/pagelist/lang/ar/settings.php32
-rw-r--r--platform/www/lib/plugins/pagelist/lang/bg/lang.php14
-rw-r--r--platform/www/lib/plugins/pagelist/lang/bg/settings.php32
-rw-r--r--platform/www/lib/plugins/pagelist/lang/ckb/lang.php14
-rw-r--r--platform/www/lib/plugins/pagelist/lang/ckb/settings.php33
-rw-r--r--platform/www/lib/plugins/pagelist/lang/cs/lang.php15
-rw-r--r--platform/www/lib/plugins/pagelist/lang/cs/settings.php36
-rw-r--r--platform/www/lib/plugins/pagelist/lang/cy/lang.php14
-rw-r--r--platform/www/lib/plugins/pagelist/lang/cy/settings.php32
-rw-r--r--platform/www/lib/plugins/pagelist/lang/da/lang.php14
-rw-r--r--platform/www/lib/plugins/pagelist/lang/da/settings.php33
-rw-r--r--platform/www/lib/plugins/pagelist/lang/de-informal/lang.php14
-rw-r--r--platform/www/lib/plugins/pagelist/lang/de-informal/settings.php33
-rw-r--r--platform/www/lib/plugins/pagelist/lang/de/lang.php16
-rw-r--r--platform/www/lib/plugins/pagelist/lang/de/settings.php35
-rw-r--r--platform/www/lib/plugins/pagelist/lang/en/lang.php17
-rw-r--r--platform/www/lib/plugins/pagelist/lang/en/settings.php38
-rw-r--r--platform/www/lib/plugins/pagelist/lang/eo/lang.php15
-rw-r--r--platform/www/lib/plugins/pagelist/lang/eo/settings.php31
-rw-r--r--platform/www/lib/plugins/pagelist/lang/es/lang.php15
-rw-r--r--platform/www/lib/plugins/pagelist/lang/es/settings.php34
-rw-r--r--platform/www/lib/plugins/pagelist/lang/fr/lang.php15
-rw-r--r--platform/www/lib/plugins/pagelist/lang/fr/settings.php36
-rw-r--r--platform/www/lib/plugins/pagelist/lang/hu/lang.php14
-rw-r--r--platform/www/lib/plugins/pagelist/lang/hu/settings.php32
-rw-r--r--platform/www/lib/plugins/pagelist/lang/it/lang.php17
-rw-r--r--platform/www/lib/plugins/pagelist/lang/it/settings.php36
-rw-r--r--platform/www/lib/plugins/pagelist/lang/ja/lang.php15
-rw-r--r--platform/www/lib/plugins/pagelist/lang/ja/settings.php35
-rw-r--r--platform/www/lib/plugins/pagelist/lang/ko/lang.php16
-rw-r--r--platform/www/lib/plugins/pagelist/lang/ko/settings.php34
-rw-r--r--platform/www/lib/plugins/pagelist/lang/nl/lang.php16
-rw-r--r--platform/www/lib/plugins/pagelist/lang/nl/settings.php36
-rw-r--r--platform/www/lib/plugins/pagelist/lang/no/lang.php14
-rw-r--r--platform/www/lib/plugins/pagelist/lang/no/settings.php32
-rw-r--r--platform/www/lib/plugins/pagelist/lang/pt-br/lang.php15
-rw-r--r--platform/www/lib/plugins/pagelist/lang/pt-br/settings.php31
-rw-r--r--platform/www/lib/plugins/pagelist/lang/pt/lang.php15
-rw-r--r--platform/www/lib/plugins/pagelist/lang/pt/settings.php35
-rw-r--r--platform/www/lib/plugins/pagelist/lang/ro/lang.php12
-rw-r--r--platform/www/lib/plugins/pagelist/lang/ro/settings.php13
-rw-r--r--platform/www/lib/plugins/pagelist/lang/ru/lang.php14
-rw-r--r--platform/www/lib/plugins/pagelist/lang/ru/settings.php35
-rw-r--r--platform/www/lib/plugins/pagelist/lang/sv/lang.php14
-rw-r--r--platform/www/lib/plugins/pagelist/lang/sv/settings.php33
-rw-r--r--platform/www/lib/plugins/pagelist/lang/tr/lang.php15
-rw-r--r--platform/www/lib/plugins/pagelist/lang/tr/settings.php33
-rw-r--r--platform/www/lib/plugins/pagelist/lang/uk/lang.php14
-rw-r--r--platform/www/lib/plugins/pagelist/lang/uk/settings.php33
-rw-r--r--platform/www/lib/plugins/pagelist/lang/zh-tw/lang.php15
-rw-r--r--platform/www/lib/plugins/pagelist/lang/zh-tw/settings.php35
-rw-r--r--platform/www/lib/plugins/pagelist/lang/zh/lang.php15
-rw-r--r--platform/www/lib/plugins/pagelist/lang/zh/settings.php35
-rw-r--r--platform/www/lib/plugins/pagelist/manager.dat2
-rw-r--r--platform/www/lib/plugins/pagelist/plugin.info.txt8
-rw-r--r--platform/www/lib/plugins/pagelist/style.css57
-rw-r--r--platform/www/lib/plugins/pagelist/syntax.php106
-rw-r--r--platform/www/lib/plugins/tag/COPYING340
-rw-r--r--platform/www/lib/plugins/tag/README10
-rw-r--r--platform/www/lib/plugins/tag/_test/topic_and_tagrefine.test.php107
-rw-r--r--platform/www/lib/plugins/tag/_test/topic_sort.test.php59
-rw-r--r--platform/www/lib/plugins/tag/_test/topic_tag.test.php36
-rw-r--r--platform/www/lib/plugins/tag/action.php138
-rw-r--r--platform/www/lib/plugins/tag/conf/default.php13
-rw-r--r--platform/www/lib/plugins/tag/conf/metadata.php20
-rw-r--r--platform/www/lib/plugins/tag/helper.php513
-rw-r--r--platform/www/lib/plugins/tag/images/tag-toolbar.pngbin0 -> 328 bytes
-rw-r--r--platform/www/lib/plugins/tag/images/tag.gifbin0 -> 111 bytes
-rw-r--r--platform/www/lib/plugins/tag/lang/ar/lang.php20
-rw-r--r--platform/www/lib/plugins/tag/lang/ar/settings.php31
-rw-r--r--platform/www/lib/plugins/tag/lang/be/lang.php18
-rw-r--r--platform/www/lib/plugins/tag/lang/be/settings.php29
-rw-r--r--platform/www/lib/plugins/tag/lang/bg/lang.php19
-rw-r--r--platform/www/lib/plugins/tag/lang/bg/settings.php30
-rw-r--r--platform/www/lib/plugins/tag/lang/ckb/lang.php18
-rw-r--r--platform/www/lib/plugins/tag/lang/ckb/settings.php29
-rw-r--r--platform/www/lib/plugins/tag/lang/cs/lang.php22
-rw-r--r--platform/www/lib/plugins/tag/lang/cs/settings.php31
-rw-r--r--platform/www/lib/plugins/tag/lang/cy/lang.php20
-rw-r--r--platform/www/lib/plugins/tag/lang/cy/settings.php29
-rw-r--r--platform/www/lib/plugins/tag/lang/da/lang.php20
-rw-r--r--platform/www/lib/plugins/tag/lang/da/settings.php30
-rw-r--r--platform/www/lib/plugins/tag/lang/de-informal/lang.php20
-rw-r--r--platform/www/lib/plugins/tag/lang/de-informal/settings.php30
-rw-r--r--platform/www/lib/plugins/tag/lang/de/lang.php22
-rw-r--r--platform/www/lib/plugins/tag/lang/de/settings.php31
-rw-r--r--platform/www/lib/plugins/tag/lang/el/lang.php18
-rw-r--r--platform/www/lib/plugins/tag/lang/el/settings.php29
-rw-r--r--platform/www/lib/plugins/tag/lang/en/lang.php23
-rw-r--r--platform/www/lib/plugins/tag/lang/en/settings.php32
-rw-r--r--platform/www/lib/plugins/tag/lang/eo/lang.php19
-rw-r--r--platform/www/lib/plugins/tag/lang/eo/settings.php30
-rw-r--r--platform/www/lib/plugins/tag/lang/es/lang.php21
-rw-r--r--platform/www/lib/plugins/tag/lang/es/settings.php31
-rw-r--r--platform/www/lib/plugins/tag/lang/fa/lang.php19
-rw-r--r--platform/www/lib/plugins/tag/lang/fa/settings.php29
-rw-r--r--platform/www/lib/plugins/tag/lang/fi/lang.php18
-rw-r--r--platform/www/lib/plugins/tag/lang/fi/settings.php29
-rw-r--r--platform/www/lib/plugins/tag/lang/fr/lang.php20
-rw-r--r--platform/www/lib/plugins/tag/lang/fr/settings.php33
-rw-r--r--platform/www/lib/plugins/tag/lang/he/lang.php18
-rw-r--r--platform/www/lib/plugins/tag/lang/he/settings.php29
-rw-r--r--platform/www/lib/plugins/tag/lang/hi/lang.php18
-rw-r--r--platform/www/lib/plugins/tag/lang/hi/settings.php29
-rw-r--r--platform/www/lib/plugins/tag/lang/hr/lang.php19
-rw-r--r--platform/www/lib/plugins/tag/lang/hr/settings.php29
-rw-r--r--platform/www/lib/plugins/tag/lang/hu/lang.php19
-rw-r--r--platform/www/lib/plugins/tag/lang/hu/settings.php31
-rw-r--r--platform/www/lib/plugins/tag/lang/id/lang.php18
-rw-r--r--platform/www/lib/plugins/tag/lang/id/settings.php29
-rw-r--r--platform/www/lib/plugins/tag/lang/it/lang.php18
-rw-r--r--platform/www/lib/plugins/tag/lang/it/settings.php29
-rw-r--r--platform/www/lib/plugins/tag/lang/ja/lang.php20
-rw-r--r--platform/www/lib/plugins/tag/lang/ja/settings.php30
-rw-r--r--platform/www/lib/plugins/tag/lang/ko/lang.php20
-rw-r--r--platform/www/lib/plugins/tag/lang/ko/settings.php29
-rw-r--r--platform/www/lib/plugins/tag/lang/nl/lang.php20
-rw-r--r--platform/www/lib/plugins/tag/lang/nl/settings.php31
-rw-r--r--platform/www/lib/plugins/tag/lang/pl/lang.php18
-rw-r--r--platform/www/lib/plugins/tag/lang/pl/settings.php29
-rw-r--r--platform/www/lib/plugins/tag/lang/pt-br/lang.php18
-rw-r--r--platform/www/lib/plugins/tag/lang/pt-br/settings.php32
-rw-r--r--platform/www/lib/plugins/tag/lang/pt/lang.php18
-rw-r--r--platform/www/lib/plugins/tag/lang/pt/settings.php29
-rw-r--r--platform/www/lib/plugins/tag/lang/ru/lang.php20
-rw-r--r--platform/www/lib/plugins/tag/lang/ru/settings.php30
-rw-r--r--platform/www/lib/plugins/tag/lang/sv/lang.php20
-rw-r--r--platform/www/lib/plugins/tag/lang/sv/settings.php30
-rw-r--r--platform/www/lib/plugins/tag/lang/tr/lang.php19
-rw-r--r--platform/www/lib/plugins/tag/lang/tr/settings.php29
-rw-r--r--platform/www/lib/plugins/tag/lang/uk/lang.php18
-rw-r--r--platform/www/lib/plugins/tag/lang/uk/settings.php29
-rw-r--r--platform/www/lib/plugins/tag/lang/vi/lang.php19
-rw-r--r--platform/www/lib/plugins/tag/lang/vi/settings.php29
-rw-r--r--platform/www/lib/plugins/tag/lang/zh-tw/lang.php21
-rw-r--r--platform/www/lib/plugins/tag/lang/zh-tw/settings.php32
-rw-r--r--platform/www/lib/plugins/tag/lang/zh/lang.php20
-rw-r--r--platform/www/lib/plugins/tag/lang/zh/settings.php30
-rw-r--r--platform/www/lib/plugins/tag/manager.dat2
-rw-r--r--platform/www/lib/plugins/tag/plugin.info.txt7
-rw-r--r--platform/www/lib/plugins/tag/script.js16
-rw-r--r--platform/www/lib/plugins/tag/style.css28
-rw-r--r--platform/www/lib/plugins/tag/syntax/count.php124
-rw-r--r--platform/www/lib/plugins/tag/syntax/searchtags.php281
-rw-r--r--platform/www/lib/plugins/tag/syntax/tag.php112
-rw-r--r--platform/www/lib/plugins/tag/syntax/tagpage.php90
-rw-r--r--platform/www/lib/plugins/tag/syntax/topic.php129
220 files changed, 9150 insertions, 0 deletions
diff --git a/platform/www/lib/plugins/blog/COPYING b/platform/www/lib/plugins/blog/COPYING
new file mode 100644
index 0000000..d60c31a
--- /dev/null
+++ b/platform/www/lib/plugins/blog/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/platform/www/lib/plugins/blog/README b/platform/www/lib/plugins/blog/README
new file mode 100644
index 0000000..86e31d7
--- /dev/null
+++ b/platform/www/lib/plugins/blog/README
@@ -0,0 +1,10 @@
+====== Blog Plugin for DokuWiki ======
+
+All documentation for the Blog Plugin is available online at:
+
+ * http://dokuwiki.org/plugin:blog
+
+(c) 2005 - 2007 by Esther Brunner <wikidesign@gmail.com>
+(c) 2008 - 2009 by Gina Häußge, Michael Klier <dokuwiki@chimeric.de>
+(c) 2013 by Michael Hamann <michael@content-space.de>
+See COPYING for license info.
diff --git a/platform/www/lib/plugins/blog/_template.txt b/platform/www/lib/plugins/blog/_template.txt
new file mode 100644
index 0000000..01fefa5
--- /dev/null
+++ b/platform/www/lib/plugins/blog/_template.txt
@@ -0,0 +1,6 @@
+====== @TITLE@ ======
+
+@TAG@
+
+@LINKBACK@
+@DISCUSSION@
diff --git a/platform/www/lib/plugins/blog/action.php b/platform/www/lib/plugins/blog/action.php
new file mode 100644
index 0000000..61ffd9e
--- /dev/null
+++ b/platform/www/lib/plugins/blog/action.php
@@ -0,0 +1,259 @@
+<?php
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Esther Brunner <wikidesign@gmail.com>
+ */
+
+class action_plugin_blog extends DokuWiki_Action_Plugin {
+
+ /**
+ * register the eventhandlers
+ * @param Doku_Event_Handler $contr
+ */
+ function register(Doku_Event_Handler $contr) {
+ $contr->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_act_preprocess', array());
+ $contr->register_hook('FEED_ITEM_ADD', 'BEFORE', $this, 'handle_feed_item');
+ $contr->register_hook('PARSER_CACHE_USE', 'BEFORE', $this, 'handle_cache');
+ }
+
+ /**
+ * Checks if 'newentry' was given as action, if so we
+ * do handle the event our self and no further checking takes place
+ * @param Doku_Event $event
+ * @param $param
+ */
+ function handle_act_preprocess(Doku_Event $event, $param) {
+ if ($event->data != 'newentry') return; // nothing to do for us
+
+ $event->data = $this->_handle_newEntry($event);
+ }
+
+ /**
+ * Removes draft entries from feeds
+ *
+ * @param Doku_Event $event
+ * @param $param
+ *
+ * @author Michael Klier <chi@chimeric.de>
+ */
+ function handle_feed_item(Doku_Event $event, $param) {
+ global $conf;
+
+ $url = parse_url($event->data['item']->link);
+ $base_url = getBaseURL();
+
+ // determine page id by rewrite mode
+ switch($conf['userewrite']) {
+ case 0:
+ preg_match('#id=([^&]*)#', $url['query'], $match);
+ if($base_url != '/') {
+ $id = cleanID(str_replace($base_url, '', $match[1]));
+ } else {
+ $id = cleanID($match[1]);
+ }
+ break;
+
+ case 1:
+ if($base_url != '/') {
+ $id = cleanID(str_replace('/',':',str_replace($base_url, '', $url['path'])));
+ } else {
+ $id = cleanID(str_replace('/',':', $url['path']));
+ }
+ break;
+
+ case 2:
+ preg_match('#doku.php/([^&]*)#', $url['path'], $match);
+ if($base_url != '/') {
+ $id = cleanID(str_replace($base_url, '', $match[1]));
+ } else {
+ $id = cleanID($match[1]);
+ }
+ break;
+ }
+
+ // don't add drafts to the feed
+ if(p_get_metadata($id, 'type') == 'draft') {
+ $event->preventDefault();
+ return;
+ }
+ }
+
+ /**
+ * Creates a new entry page
+ *
+ * @param Doku_Event $event
+ * @return string
+ */
+ function _handle_newEntry(Doku_Event $event) {
+ global $ID, $INFO;
+
+ $ns = cleanID($_REQUEST['ns']);
+ $title = str_replace(':', '', $_REQUEST['title']);
+ $ID = $this->_newEntryID($ns, $title);
+ $INFO = pageinfo();
+
+ // check if we are allowed to create this file
+ if ($INFO['perm'] >= AUTH_CREATE) {
+
+ // prepare the new thread file with default stuff
+ if (!@file_exists($INFO['filepath'])) {
+
+ //check if locked by anyone - if not lock for my self
+ if ($INFO['locked']) return 'locked';
+ else lock($ID);
+
+ global $TEXT;
+
+ $TEXT = pageTemplate($ID);
+ if (!$TEXT) {
+ // if there is no page template, load our custom one
+ $TEXT = io_readFile(DOKU_PLUGIN.'blog/_template.txt');
+ }
+
+ $data = array('id' => $ID, 'ns' => $ns, 'title' => $_REQUEST['title']);
+ // Apply replacements regardless if they have already been applied by DokuWiki in order to
+ // make custom replacements like @TITLE@ available in standard page templates.
+ $TEXT = $this->_pageTemplate($TEXT, $data);
+
+ return 'preview';
+ } else {
+ return 'edit';
+ }
+ } else {
+ return 'show';
+ }
+ }
+
+ /**
+ * Adapted version of pageTemplate() function
+ *
+ * @param $text
+ * @param $data
+ * @return string|string[]
+ */
+ function _pageTemplate($text, $data) {
+ global $conf, $INFO;
+
+ $id = $data['id'];
+ $user = $_SERVER['REMOTE_USER'];
+
+ // standard replacements
+ $replace = array(
+ '@ID@' => $id,
+ '@NS@' => $data['ns'],
+ '@PAGE@' => strtr(noNS($id),'_',' '),
+ '@USER@' => $user,
+ '@NAME@' => $INFO['userinfo']['name'],
+ '@MAIL@' => $INFO['userinfo']['mail'],
+ '@DATE@' => strftime($conf['dformat']),
+ );
+
+ // additional replacements
+ $replace['@TITLE@'] = $data['title'];
+
+ // tag if tag plugin is available
+ if ((@file_exists(DOKU_PLUGIN.'tag/syntax/tag.php'))
+ && (!plugin_isdisabled('tag'))) {
+ $replace['@TAG@'] = "\n\n{{tag>}}";
+ } else {
+ $replace['@TAG@'] = '';
+ }
+
+ // discussion if discussion plugin is available
+ if ((@file_exists(DOKU_PLUGIN.'discussion/syntax/comments.php'))
+ && (!plugin_isdisabled('discussion'))) {
+ $replace['@DISCUSSION@'] = "~~DISCUSSION~~";
+ } else {
+ $replace['@DISCUSSION@'] = '';
+ }
+
+ // linkbacks if linkback plugin is available
+ if ((@file_exists(DOKU_PLUGIN.'linkback/syntax.php'))
+ && (!plugin_isdisabled('linkback'))) {
+ $replace['@LINKBACK@'] = "~~LINKBACK~~";
+ } else {
+ $replace['@LINKBACK@'] = '';
+ }
+
+ // do the replace
+ return str_replace(array_keys($replace), array_values($replace), $text);
+ }
+
+ /**
+ * Returns the ID of a new entry based on its namespace, title and the date prefix
+ *
+ * @param $ns
+ * @param $title
+ * @return mixed|string|string[]|null
+ *
+ * @author Michael Arlt <michael.arlt@sk-chwanstetten.de>
+ * @author Esther Brunner <wikidesign@gmail.com>
+ */
+ function _newEntryID($ns, $title) {
+ $dateprefix = $this->getConf('dateprefix');
+ if (substr($dateprefix, 0, 1) == '<') {
+ // <9?%y1-%y2:%d.%m._ -> 05-06:31.08._ | 06-07:01.09._
+ list($newmonth, $dateprefix) = explode('?', substr($dateprefix, 1));
+ if (intval(strftime("%m")) < intval($newmonth)) {
+ $longyear2 = strftime("%Y");
+ $longyear1 = $longyear2 - 1;
+ } else {
+ $longyear1 = strftime("%Y");
+ $longyear2 = $longyear1 + 1;
+ }
+ $shortyear1 = substr($longyear1, 2);
+ $shortyear2 = substr($longyear2, 2);
+ $dateprefix = str_replace(
+ array('%Y1', '%Y2', '%y1', '%y2'),
+ array($longyear1, $longyear2, $shortyear1, $shortyear2),
+ $dateprefix
+ );
+ }
+ $pre = strftime($dateprefix);
+ return cleanID(($ns ? $ns.':' : '').$pre.$title);
+ }
+
+ /**
+ * Expire the renderer cache of archive pages whenever a page is updated or a comment or linkback is added
+ *
+ * @param Doku_Event $event
+ * @param $params
+ *
+ * @author Michael Hamann <michael@content-space.de>
+ */
+ function handle_cache(Doku_Event $event, $params) {
+ global $conf;
+ /** @var cache_parser $cache */
+ $cache = $event->data;
+ if (!in_array($cache->mode, array('xhtml', 'metadata'))) return;
+ $page = $cache->page;
+
+ // try to extract the page id from the file if possible
+ if (empty($page)) {
+ if (strpos($cache->file, $conf['datadir']) === 0) {
+ $page = pathID(substr($cache->file, strlen($conf['datadir'])+1));
+ } else {
+ return;
+ }
+ }
+
+ $meta = p_get_metadata($page, 'plugin_blog');
+ if ($meta === null) return;
+
+ if (isset($meta['purgefile_cache'])) {
+ $cache->depends['files'][] = $conf['cachedir'].'/purgefile';
+ $cache->depends['files'][] = $conf['metadir'].'/_comments.changes';
+ $cache->depends['files'][] = $conf['metadir'].'/_linkbacks.changes';
+ }
+
+ // purge the cache when a page is listed that the current user can't access
+ if (isset($meta['archive_pages'])) {
+ foreach ($meta['archive_pages'] as $page) {
+ if (auth_quickaclcheck($page) < AUTH_READ) {
+ $cache->depends['purge'] = true;
+ return;
+ }
+ }
+ }
+ }
+}
diff --git a/platform/www/lib/plugins/blog/conf/default.php b/platform/www/lib/plugins/blog/conf/default.php
new file mode 100644
index 0000000..80fb610
--- /dev/null
+++ b/platform/www/lib/plugins/blog/conf/default.php
@@ -0,0 +1,18 @@
+<?php
+/**
+ * Options for the Blog Plugin
+ */
+$conf['namespace'] = 'blog'; // default location for blog entries
+$conf['formposition'] = 'bottom'; // position of new entry form
+$conf['newentrytitle'] = ''; // Title text for the 'new entry' form
+$conf['dateprefix'] = ''; // prefix date to new entry IDs
+$conf['sortkey'] = 'cdate'; // sort key for blog entries
+$conf['sortorder'] = 'descending'; // ascending or descending
+
+$conf['showhistogram'] = 1; // show histogramm in archive
+$conf['max_months'] = 100; // max months to show in the histogram
+$conf['histogram_height'] = 50; // height of the histogram in pixels
+
+$conf['excluded_pages'] = '!^blog:\d{4}(:\d{2})?$!'; // regex for pages to exclude from bloglisting
+
+// vim:ts=4:sw=4:et:enc=utf-8:
diff --git a/platform/www/lib/plugins/blog/conf/metadata.php b/platform/www/lib/plugins/blog/conf/metadata.php
new file mode 100644
index 0000000..822d3c4
--- /dev/null
+++ b/platform/www/lib/plugins/blog/conf/metadata.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Metadata for configuration manager plugin
+ * Additions for the blog plugin
+ *
+ * @author Esther Brunner <wikidesign@gmail.com>
+ */
+$meta['namespace'] = array('string');
+$meta['formposition'] = array('multichoice',
+ '_choices' => array('top', 'bottom', 'none'));
+$meta['newentrytitle'] = array('string');
+$meta['dateprefix'] = array('string');
+$meta['sortkey'] = array('multichoice',
+ '_choices' => array('cdate', 'mdate', 'pagename', 'id', 'title'));
+$meta['sortorder'] = array('multichoice',
+ '_choices' => array('ascending', 'descending'));
+$meta['excluded_pages'] = array('string');
+
+$meta['showhistogram'] = array('onoff');
+$meta['max_months'] = array('numeric');
+$meta['histogram_height'] = array('numeric');
+// vim:ts=4:sw=4:et:enc=utf-8:
diff --git a/platform/www/lib/plugins/blog/helper.php b/platform/www/lib/plugins/blog/helper.php
new file mode 100644
index 0000000..9dd8b9a
--- /dev/null
+++ b/platform/www/lib/plugins/blog/helper.php
@@ -0,0 +1,189 @@
+<?php
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Esther Brunner <wikidesign@gmail.com>
+ */
+
+class helper_plugin_blog extends DokuWiki_Plugin {
+
+ var $sort = ''; // sort key
+
+ /**
+ * Constructor
+ */
+ function helper_plugin_blog() {
+ // load sort key from settings
+ $this->sort = $this->getConf('sortkey');
+ }
+
+ function getMethods() {
+ $result = array();
+ $result[] = array(
+ 'name' => 'getBlog',
+ 'desc' => 'returns blog entries in reverse chronological order',
+ 'params' => array(
+ 'namespace' => 'string',
+ 'number (optional)' => 'integer'),
+ 'return' => array('pages' => 'array'),
+ );
+ $result[] = array(
+ 'name' => 'getFlags',
+ 'desc' => 'get values for flags, or defaults where not supplied',
+ 'params' => array('flags' => 'array'),
+ 'return' => array('flags' => 'array'),
+ );
+ return $result;
+ }
+
+ /**
+ * Get blog entries from a given namespace
+ *
+ * @param $ns
+ * @param null $num
+ * @param null $author
+ * @return array
+ */
+ function getBlog($ns, $num = NULL, $author = NULL) {
+ // add pages in given namespace
+ $result = array();
+ global $conf;
+
+ $pages = array();
+ $unique_keys_memoize = array();
+
+ $dir = str_replace(':', '/', $ns);
+ search($pages, $conf['datadir'], 'search_pagename', array('query' => '.txt'), $dir);
+
+ foreach ($pages as $page) {
+ $id = $page['id'];
+ $file = wikiFN($id);
+
+ // do some checks first
+ if (isHiddenPage($id)) continue; // skip excluded pages
+ $excluded_pages = $this->getConf('excluded_pages');
+ if (strlen($excluded_pages) > 0 && preg_match($excluded_pages, $id)) continue;
+ if (($ns) && (strpos($id, $ns.':') !== 0)) continue; // filter namespaces
+ if (!@file_exists($file)) continue; // skip deleted
+
+ $perm = auth_quickaclcheck($id);
+ if ($perm < AUTH_READ) continue; // check ACL
+
+ // skip drafts unless for users with create priviledge
+ $meta = p_get_metadata($id, '', false);
+ $draft = ($meta['type'] == 'draft');
+ if ($draft && ($perm < AUTH_CREATE)) continue;
+
+ // filter by author
+ if ($author && ($meta['user'] != $author)) continue;
+
+ $date = $meta['date']['modified'];
+ if (!$date) $date = filemtime(wikiFN($id));
+ if ($this->sort != 'mdate') {
+ $cdate = $meta['date']['created'];
+ if (!$cdate) $cdate = filectime(wikiFN($id));
+ // prefer the date further in the past:
+ $date = min($date, $cdate);
+ }
+
+ if (isset($meta['title'])) {
+ $title = $meta['title'];
+ } else {
+ $title = $id;
+ }
+
+ // determine the sort key
+ if ($this->sort == 'id') $key = $id;
+ elseif ($this->sort == 'pagename') $key = noNS($id);
+ elseif ($this->sort == 'title') $key = $title;
+ else $key = $date;
+
+ // get a unique sortable key
+ $key = $this->_uniqueKey($key, $unique_keys_memoize);
+
+ $result[$key] = array(
+ 'id' => $id,
+ 'title' => $title,
+ 'date' => $date,
+ 'user' => $meta['creator'],
+ 'desc' => $meta['description']['abstract'],
+ 'exists' => true,
+ 'perm' => $perm,
+ 'draft' => $draft,
+ );
+ }
+
+ // finally sort by sort key
+ if ($this->getConf('sortorder') == 'ascending') ksort($result);
+ else krsort($result);
+
+ if (is_numeric($num)) $result = array_slice($result, 0, $num);
+
+ return $result;
+ }
+
+ /**
+ * Turn a list of user-supplied flags into a complete list of all flags
+ * required by the Blog plugin (not including those for the Include plugin),
+ * using global configuration options or plugin defaults where flags have
+ * not been supplied.
+ *
+ * Currently handles 'formpos' and 'newentrytitle'.
+ *
+ * @author Sam Wilson <sam@samwilson.id.au>
+ * @param array $setflags Flags that have been set by the user
+ * @return array All flags required by the Blog plugin (only)
+ */
+ function getFlags($setflags) {
+ $flags = array();
+
+ // Form Position
+ $flags['formpos'] = $this->getConf('formposition');
+ if(in_array('topform', $setflags)) {
+ $flags['formpos'] = 'top';
+ }elseif(in_array('bottomform', $setflags)) {
+ $flags['formpos'] = 'bottom';
+ }elseif(in_array('noform', $setflags)) {
+ $flags['formpos'] = 'none';
+ }
+
+ // New Entry Title
+ $newentrytitle = preg_grep('|newentrytitle=.*|', $setflags);
+ if (count($newentrytitle) > 0) {
+ $newentrytitle = array_pop(explode('=', array_pop($newentrytitle), 2));
+ if (!empty($newentrytitle)) {
+ $flags['newentrytitle'] = $newentrytitle;
+ }
+ } elseif ($conf_title = $this->getConf('newentrytitle')) {
+ $flags['newentrytitle'] = $conf_title;
+ } else {
+ $flags['newentrytitle'] = $this->getLang('newentry');
+ }
+
+ // Paging Controls
+ $flags['pagingcontrols'] = !in_array('nopagingcontrols', $setflags);
+
+ return $flags;
+ }
+
+ /**
+ * Function to create sortable, unique array keys
+ *
+ * @param $key
+ * @param $unique_keys_memoize
+ * @return string
+ *
+ * @author Esther Brunner <wikidesign@gmail.com>
+ * @author Ilya S. Lebedev <ilya@lebedev.net>
+ * @author Balazs Attila-Mihaly <x_at_y_or_z@yahoo.com>
+ */
+ function _uniqueKey($key, &$unique_keys_memoize){
+ //convert numeric keys to string
+ if (is_numeric($key))
+ $key = sprintf('%08x', $key);
+ if (!array_key_exists($key, $unique_keys_memoize))
+ $unique_keys_memoize[$key] = 0;
+
+ return sprintf('%s_%s', $key, $unique_keys_memoize[$key]++);
+ }
+
+}
diff --git a/platform/www/lib/plugins/blog/lang/ar/lang.php b/platform/www/lib/plugins/blog/lang/ar/lang.php
new file mode 100644
index 0000000..68c0ee7
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/ar/lang.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Arabic language file
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author M. Bashir Al-Noimi <bashir.storm@gmail.com>
+ */
+
+// custom language strings for the plugin
+$lang['blog'] = 'مدوّنة';
+$lang['older'] = 'تدوينات قديمة';
+$lang['newer'] = 'تدوينات جديدة';
+$lang['newentry'] = 'إضافة تدوينة جديدة:';
+
+$lang['missing_includeplugin'] = 'إضافة "Include" يجب أن تكون منزلّة ومفعّلة لتعمل المدونّة.';
+$lang['missing_pagelistplugin'] = 'إضافة "Pagelist" يجب أن تكون منزلّة ومفعّلة لتعمل قوائم المدوّنات.';
+$lang['missing_tagplugin'] = 'إضافة "Tag" يجب أن تكون منزلّة ومفعّلة لتعمل سحابة الوسوم.';
+
+$lang['autoarchive'] = '%d مشاركة لشهر %s %s';
+$lang['month_01'] = 'كانون الثاني';
+$lang['month_02'] = 'شباط';
+$lang['month_03'] = 'آذار';
+$lang['month_04'] = 'نيسان';
+$lang['month_05'] = 'أيار';
+$lang['month_06'] = 'حزيران';
+$lang['month_07'] = 'تموز';
+$lang['month_08'] = 'آب';
+$lang['month_09'] = 'أيلول';
+$lang['month_10'] = 'تشرين الأول';
+$lang['month_11'] = 'تشرين الثاني';
+$lang['month_12'] = 'كانون الأول';
+
+$lang['entries'] = 'مُدخلات';
+$lang['entry'] = 'مُدخلة';
+$lang['archive_title'] = 'أرشيف المدوّنة';
+//Setup VIM: ex: et ts=2 enc=utf-8 :
diff --git a/platform/www/lib/plugins/blog/lang/ar/settings.php b/platform/www/lib/plugins/blog/lang/ar/settings.php
new file mode 100644
index 0000000..65e5aab
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/ar/settings.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Arabic language file
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author M. Bashir Al-Noimi <bashir.storm@gmail.com>
+ */
+
+// for the configuration manager
+$lang['namespace'] = 'فضاء أسماء إفتراضي للمدوّنة';
+
+$lang['formposition'] = 'موقع التدوينة الجديدة';
+$lang['formposition_o_top'] = 'أعلى';
+$lang['formposition_o_bottom'] = 'أسفل';
+
+$lang['dateprefix'] = 'بادئة التاريخ للتدوينات الجديدة';
+
+$lang['sortkey'] = 'ترتيب التدوينات حسب:';
+$lang['sortkey_o_cdate'] = 'تاريخ الإنشاء';
+$lang['sortkey_o_pagename'] = 'إسم الصفحة';
+$lang['sortkey_o_id'] = 'رقم الصفحة';
+
+$lang['sortkey_o_mdate'] = 'تاريخ التعديل';
+$lang['sortkey_o_title'] = 'العنوان';
+
+$lang['sortorder'] = 'ترتيباً';
+$lang['sortorder_o_ascending'] = 'تصاعدياً';
+$lang['sortorder_o_descending'] = 'تنازلياً';
+
+$lang['excluded_pages'] = 'استثناء صفحات معيّنة من قوائم المدوّنات (يتطلّب تعبيراً نمطيّاً RegEx)';
+
+$lang['showhistorgram'] = 'عرض الرسم البياني عند عرض الأرشيف';
+$lang['max_months'] = 'العدد الأقصى للأشهر المعروضة في الرسم البياني';
+$lang['histogram_height'] = 'طول الرسم البياني (بكسل)';
+//Setup VIM: ex: et ts=2 enc=utf-8 :
diff --git a/platform/www/lib/plugins/blog/lang/ckb/lang.php b/platform/www/lib/plugins/blog/lang/ckb/lang.php
new file mode 100644
index 0000000..7521ec6
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/ckb/lang.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author qezwan <qezwan@gmail.com>
+ */
+$lang['blog'] = 'بلۆگ';
+$lang['older'] = 'تێکردنەکانی کۆنتر';
+$lang['newer'] = 'تێکردنەکانی نوێتر';
+$lang['newentry'] = 'چوونەژوورەوەی بلۆگی نوێ:';
+$lang['missing_includeplugin'] = 'پێوەکراو دەگرێتە خۆ دەبێت دابەزێنرابێت بۆ بلۆگ بۆ کارکردن.';
+$lang['missing_pagelistplugin'] = 'پێوەکراو پێویستە بۆ لیستی ئەرشیف دابمەزرێنێت بۆ کارکردن.';
+$lang['missing_tagplugin'] = 'پێوەکراو تاگ دەبێت دابەزێنرێت بۆ بەکارهێنانی پوختەکردنی تاگ.';
+$lang['autoarchive'] = '%1$d پۆست بۆ %2$s %3$s';
+$lang['month_01'] = 'کانوونی دووەم';
+$lang['month_02'] = 'شوبات';
+$lang['month_03'] = 'ئازار';
+$lang['month_04'] = 'نیسان';
+$lang['month_05'] = 'ئایار';
+$lang['month_06'] = 'حوزەیران';
+$lang['month_07'] = 'تەممووز';
+$lang['month_08'] = 'ئاب';
+$lang['month_09'] = 'ئەیلوول';
+$lang['month_10'] = 'تشرینی یەکەم';
+$lang['month_11'] = 'تشرینی دووەم';
+$lang['month_12'] = 'کانوونی یەکەم';
+$lang['entries'] = 'تێکردنەکان';
+$lang['entry'] = 'تێکردن';
+$lang['archive_title'] = 'مێژووی بلۆگ';
diff --git a/platform/www/lib/plugins/blog/lang/ckb/settings.php b/platform/www/lib/plugins/blog/lang/ckb/settings.php
new file mode 100644
index 0000000..8a8b1c1
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/ckb/settings.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author qezwan <qezwan@gmail.com>
+ */
+$lang['namespace'] = 'بۆشایی ناوی ئاسایی بۆ بلۆگ';
+$lang['formposition'] = 'شوێنی فۆرمی چوونەناوی نوێ';
+$lang['formposition_o_top'] = 'سەرەوە';
+$lang['formposition_o_bottom'] = 'خوارەوە';
+$lang['formposition_o_none'] = 'هیچ';
+$lang['newentrytitle'] = 'ناونیشانی فۆرمی چوونەژوورەوەی نوێ';
+$lang['dateprefix'] = 'بەرواری پێشگر بۆ ئای دیی تێنووسێکی نوێ';
+$lang['sortkey'] = 'پۆلێنکردنی بڵاگ ەکان بەپێی
+';
+$lang['sortkey_o_cdate'] = 'بەرواری دروست کردن
+';
+$lang['sortkey_o_mdate'] = 'بەرواری هەموارکردن
+';
+$lang['sortkey_o_pagename'] = 'ناوی پەڕە
+';
+$lang['sortkey_o_id'] = 'ناسنامەی پەڕە
+';
+$lang['sortkey_o_title'] = 'ناونیشان
+';
+$lang['sortorder'] = 'ڕیزکردن لە ریزبەند
+';
+$lang['sortorder_o_ascending'] = 'بەرەو سەرەوە
+';
+$lang['sortorder_o_descending'] = 'descending';
+$lang['excluded_pages'] = 'دەرکردنی هەندێک لاپەڕە لە لیستی بلۆگ (دەربڕینی ئاسایی پێویستە)
+';
+$lang['showhistogram'] = 'پیشاندانی هێڵکاری لەسەر نمایشی ئەرشیف
+';
+$lang['max_months'] = 'زۆرینەی مانگ بۆ ئەوەی لە هیستوگرامەکە نیشان بدا
+
+';
+$lang['histogram_height'] = '(بەرزی هیتۆگرام (بە پیکسڵ
+
+';
diff --git a/platform/www/lib/plugins/blog/lang/cs/lang.php b/platform/www/lib/plugins/blog/lang/cs/lang.php
new file mode 100644
index 0000000..07af210
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/cs/lang.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Lukas Zapletal <lukas.zapletal at gmail dot com>
+ * @author Vojta Olsan <olsh0@seznam.cz>
+ */
+$lang['blog'] = 'Blog';
+$lang['older'] = 'Starší zápisky';
+$lang['newer'] = 'Novější zápisky';
+$lang['newentry'] = 'Nový zápisek:';
+$lang['month_01'] = 'leden';
+$lang['month_02'] = 'únor';
+$lang['month_03'] = 'březen';
+$lang['month_04'] = 'duben';
+$lang['month_05'] = 'květen';
+$lang['month_06'] = 'červen';
+$lang['month_07'] = 'červenec';
+$lang['month_08'] = 'srpen';
+$lang['month_09'] = 'září';
+$lang['month_10'] = 'říjen';
+$lang['month_11'] = 'listopad';
+$lang['month_12'] = 'prosinec';
+$lang['archive_title'] = 'Historie blogu';
diff --git a/platform/www/lib/plugins/blog/lang/cs/settings.php b/platform/www/lib/plugins/blog/lang/cs/settings.php
new file mode 100644
index 0000000..f27b53f
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/cs/settings.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Lukas Zapletal <lukas.zapletal at gmail dot com>
+ * @author Vojta Olsan <olsh0@seznam.cz>
+ */
+$lang['namespace'] = 'implicitní jmenný prostor pro blog';
+$lang['formposition'] = 'pozice pole pro zadání nového příspěvku';
+$lang['formposition_o_top'] = 'nahoře';
+$lang['formposition_o_bottom'] = 'dole';
+$lang['formposition_o_none'] = 'žádný';
+$lang['dateprefix'] = 'přidat datumový prefix novým příspěvkům';
+$lang['sortkey'] = 'razení zápisků podle';
+$lang['sortkey_o_cdate'] = 'data vytvoření';
+$lang['sortkey_o_mdate'] = 'data modifikace';
+$lang['sortkey_o_pagename'] = 'názvu stránky';
+$lang['sortkey_o_id'] = 'ID stránky';
+$lang['sortkey_o_title'] = 'název';
+$lang['sortorder'] = 'pořadí';
+$lang['sortorder_o_ascending'] = 'vzestupné';
+$lang['sortorder_o_descending'] = 'sestupné';
+$lang['max_months'] = 'Maximální počet měsíců zobrazených v histogramu';
+$lang['histogram_height'] = 'Výška histogramu (v pixelech)';
diff --git a/platform/www/lib/plugins/blog/lang/da/lang.php b/platform/www/lib/plugins/blog/lang/da/lang.php
new file mode 100644
index 0000000..c07c90e
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/da/lang.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Esther Brunner <wikidesign@gmail.com>
+ * @author Soren Birk <soer9648@eucl.dk>
+ */
+$lang['blog'] = 'Blog';
+$lang['older'] = 'Ældre indlæg';
+$lang['newer'] = 'Nyere indlæg';
+$lang['newentry'] = 'Nyt indlæg:';
+$lang['missing_includeplugin'] = 'Include plugin skal være installeret for at bloggen virker.';
+$lang['missing_pagelistplugin'] = 'Pagelist plugin skal være installeret for at arkivlister virker.';
+$lang['missing_tagplugin'] = 'Tag plugin skal være installeret for at benytte denne funktion.';
+$lang['autoarchive'] = '%1$d indlæg i %2$s %3$s';
+$lang['month_01'] = 'januar';
+$lang['month_02'] = 'februar';
+$lang['month_03'] = 'marts';
+$lang['month_04'] = 'april';
+$lang['month_05'] = 'maj';
+$lang['month_06'] = 'juni';
+$lang['month_07'] = 'juli';
+$lang['month_08'] = 'august';
+$lang['month_09'] = 'september';
+$lang['month_10'] = 'oktober';
+$lang['month_11'] = 'november';
+$lang['month_12'] = 'december';
+$lang['entries'] = 'indlæg';
+$lang['entry'] = 'indlæg';
+$lang['archive_title'] = 'Blog Arkiv';
diff --git a/platform/www/lib/plugins/blog/lang/da/settings.php b/platform/www/lib/plugins/blog/lang/da/settings.php
new file mode 100644
index 0000000..035964a
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/da/settings.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Kalle Sommer Nielsen <kalle@php.net>
+ * @author Esther Brunner <wikidesign@gmail.com>
+ * @author Soren Birk <soer9648@eucl.dk>
+ */
+$lang['namespace'] = 'standard navnerum til blog';
+$lang['formposition'] = 'position af formular til nyt indlæg';
+$lang['formposition_o_top'] = 'top';
+$lang['formposition_o_bottom'] = 'bund';
+$lang['formposition_o_none'] = 'intet';
+$lang['newentrytitle'] = 'title på den nye indlægs formular';
+$lang['dateprefix'] = 'foruddefineret dato for nye indlæg IDs';
+$lang['sortkey'] = 'sortér blog indlæg efter';
+$lang['sortkey_o_cdate'] = 'dato for oprettelse';
+$lang['sortkey_o_mdate'] = 'dato for seneste ændring';
+$lang['sortkey_o_pagename'] = 'sidenavn';
+$lang['sortkey_o_id'] = 'side id';
+$lang['sortkey_o_title'] = 'titel';
+$lang['sortorder'] = 'sorteringsrækkefølge';
+$lang['sortorder_o_ascending'] = 'stigende';
+$lang['sortorder_o_descending'] = 'faldende';
+$lang['excluded_pages'] = 'Udeluk bestemte sider fra blog listen (kræver regulært udtryk)';
+$lang['showhistogram'] = 'Vis histogram på arkiv rendering';
+$lang['max_months'] = 'Maksimum antal måneder for visning i histogram';
+$lang['histogram_height'] = 'Histogram højde (i pixel)';
diff --git a/platform/www/lib/plugins/blog/lang/de-informal/lang.php b/platform/www/lib/plugins/blog/lang/de-informal/lang.php
new file mode 100644
index 0000000..f4602ee
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/de-informal/lang.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Esther Brunner <wikidesign@gmail.com>
+ * @author Michael Hamann <michael@content-space.de>
+ */
+$lang['blog'] = 'Blog';
+$lang['older'] = 'Ältere Einträge';
+$lang['newer'] = 'Neuere Einträge';
+$lang['newentry'] = 'Neuer Blogeintrag:';
+$lang['missing_includeplugin'] = 'Ohne das Include Plugin funktioniert das Blog nicht.';
+$lang['missing_pagelistplugin'] = 'Ohne das Pagelist Plugin funktionieren Archivlisten nicht.';
+$lang['missing_tagplugin'] = 'Um Tag-Verfeinerungen zu verwenden, muss das Tag Plugin installiert sein.';
+$lang['autoarchive'] = '%1$d Beiträge für den %2$s %3$s';
+$lang['month_01'] = 'Januar';
+$lang['month_02'] = 'Februar';
+$lang['month_03'] = 'März';
+$lang['month_04'] = 'April';
+$lang['month_05'] = 'Mai';
+$lang['month_06'] = 'Juni';
+$lang['month_07'] = 'Juli';
+$lang['month_08'] = 'August';
+$lang['month_09'] = 'September';
+$lang['month_10'] = 'Oktober';
+$lang['month_11'] = 'November';
+$lang['month_12'] = 'Dezember';
+$lang['entries'] = 'Einträge';
+$lang['entry'] = 'Eintrag';
+$lang['archive_title'] = 'Blog-Archiv';
diff --git a/platform/www/lib/plugins/blog/lang/de-informal/settings.php b/platform/www/lib/plugins/blog/lang/de-informal/settings.php
new file mode 100644
index 0000000..c8d396a
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/de-informal/settings.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Esther Brunner <wikidesign@gmail.com>
+ * @author Michael Hamann <michael@content-space.de>
+ * @author Dominik Eckelmann <deckelmann@gmail.com>
+ */
+$lang['namespace'] = 'Standard-Namensraum für Blog';
+$lang['formposition'] = 'Position des Formulars für neue Blogeinträge';
+$lang['formposition_o_top'] = 'oben';
+$lang['formposition_o_bottom'] = 'unten';
+$lang['formposition_o_none'] = 'Keine';
+$lang['newentrytitle'] = 'Titel des Formulars um neue Einträge anzulegen';
+$lang['dateprefix'] = 'Datum den IDs neuer Seiten voranstellen';
+$lang['sortkey'] = 'Blogeinträge sortieren nach:';
+$lang['sortkey_o_cdate'] = 'Erstellungsdatum';
+$lang['sortkey_o_mdate'] = 'Änderungsdatum';
+$lang['sortkey_o_pagename'] = 'Seitenname';
+$lang['sortkey_o_id'] = 'Seiten-ID';
+$lang['sortkey_o_title'] = 'Titel';
+$lang['sortorder'] = 'Sortierrichtung';
+$lang['sortorder_o_ascending'] = 'aufsteigend';
+$lang['sortorder_o_descending'] = 'absteigend';
+$lang['excluded_pages'] = 'Seiten von den Blog-Auflistungen ausschließen (regulärer Ausdruck)';
+$lang['showhistogram'] = 'Ein Histogramm auf den Archiv-Seiten anzeigen';
+$lang['max_months'] = 'Maximale Anzahl an Monaten die im Histogramm angezeigt werden sollen';
+$lang['histogram_height'] = 'Höhe des Histogramms (in Pixeln)';
diff --git a/platform/www/lib/plugins/blog/lang/de/lang.php b/platform/www/lib/plugins/blog/lang/de/lang.php
new file mode 100644
index 0000000..f4602ee
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/de/lang.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Esther Brunner <wikidesign@gmail.com>
+ * @author Michael Hamann <michael@content-space.de>
+ */
+$lang['blog'] = 'Blog';
+$lang['older'] = 'Ältere Einträge';
+$lang['newer'] = 'Neuere Einträge';
+$lang['newentry'] = 'Neuer Blogeintrag:';
+$lang['missing_includeplugin'] = 'Ohne das Include Plugin funktioniert das Blog nicht.';
+$lang['missing_pagelistplugin'] = 'Ohne das Pagelist Plugin funktionieren Archivlisten nicht.';
+$lang['missing_tagplugin'] = 'Um Tag-Verfeinerungen zu verwenden, muss das Tag Plugin installiert sein.';
+$lang['autoarchive'] = '%1$d Beiträge für den %2$s %3$s';
+$lang['month_01'] = 'Januar';
+$lang['month_02'] = 'Februar';
+$lang['month_03'] = 'März';
+$lang['month_04'] = 'April';
+$lang['month_05'] = 'Mai';
+$lang['month_06'] = 'Juni';
+$lang['month_07'] = 'Juli';
+$lang['month_08'] = 'August';
+$lang['month_09'] = 'September';
+$lang['month_10'] = 'Oktober';
+$lang['month_11'] = 'November';
+$lang['month_12'] = 'Dezember';
+$lang['entries'] = 'Einträge';
+$lang['entry'] = 'Eintrag';
+$lang['archive_title'] = 'Blog-Archiv';
diff --git a/platform/www/lib/plugins/blog/lang/de/settings.php b/platform/www/lib/plugins/blog/lang/de/settings.php
new file mode 100644
index 0000000..c8d396a
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/de/settings.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Esther Brunner <wikidesign@gmail.com>
+ * @author Michael Hamann <michael@content-space.de>
+ * @author Dominik Eckelmann <deckelmann@gmail.com>
+ */
+$lang['namespace'] = 'Standard-Namensraum für Blog';
+$lang['formposition'] = 'Position des Formulars für neue Blogeinträge';
+$lang['formposition_o_top'] = 'oben';
+$lang['formposition_o_bottom'] = 'unten';
+$lang['formposition_o_none'] = 'Keine';
+$lang['newentrytitle'] = 'Titel des Formulars um neue Einträge anzulegen';
+$lang['dateprefix'] = 'Datum den IDs neuer Seiten voranstellen';
+$lang['sortkey'] = 'Blogeinträge sortieren nach:';
+$lang['sortkey_o_cdate'] = 'Erstellungsdatum';
+$lang['sortkey_o_mdate'] = 'Änderungsdatum';
+$lang['sortkey_o_pagename'] = 'Seitenname';
+$lang['sortkey_o_id'] = 'Seiten-ID';
+$lang['sortkey_o_title'] = 'Titel';
+$lang['sortorder'] = 'Sortierrichtung';
+$lang['sortorder_o_ascending'] = 'aufsteigend';
+$lang['sortorder_o_descending'] = 'absteigend';
+$lang['excluded_pages'] = 'Seiten von den Blog-Auflistungen ausschließen (regulärer Ausdruck)';
+$lang['showhistogram'] = 'Ein Histogramm auf den Archiv-Seiten anzeigen';
+$lang['max_months'] = 'Maximale Anzahl an Monaten die im Histogramm angezeigt werden sollen';
+$lang['histogram_height'] = 'Höhe des Histogramms (in Pixeln)';
diff --git a/platform/www/lib/plugins/blog/lang/en/lang.php b/platform/www/lib/plugins/blog/lang/en/lang.php
new file mode 100644
index 0000000..c3f63ee
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/en/lang.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * English language file
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Esther Brunner <wikidesign@gmail.com>
+ */
+
+// custom language strings for the plugin
+$lang['blog'] = 'Blog';
+$lang['older'] = 'Older entries';
+$lang['newer'] = 'Newer entries';
+$lang['newentry'] = 'New blog entry:';
+
+$lang['missing_includeplugin'] = 'The Include Plugin must be installed for the blog to work.';
+$lang['missing_pagelistplugin'] = 'The Pagelist Plugin must be installed for archive lists to work.';
+$lang['missing_tagplugin'] = 'The Tag Plugin must be installed to use tag refinements.';
+
+$lang['autoarchive'] = '%1$d Post(s) for %2$s %3$s';
+$lang['month_01'] = 'January';
+$lang['month_02'] = 'February';
+$lang['month_03'] = 'March';
+$lang['month_04'] = 'April';
+$lang['month_05'] = 'May';
+$lang['month_06'] = 'June';
+$lang['month_07'] = 'July';
+$lang['month_08'] = 'August';
+$lang['month_09'] = 'September';
+$lang['month_10'] = 'October';
+$lang['month_11'] = 'November';
+$lang['month_12'] = 'December';
+
+$lang['entries'] = 'entries';
+$lang['entry'] = 'entry';
+$lang['archive_title'] = 'Blog History';
+//Setup VIM: ex: et ts=2 enc=utf-8 :
diff --git a/platform/www/lib/plugins/blog/lang/en/settings.php b/platform/www/lib/plugins/blog/lang/en/settings.php
new file mode 100644
index 0000000..a112896
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/en/settings.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * English language file
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Esther Brunner <wikidesign@gmail.com>
+ */
+
+// for the configuration manager
+$lang['namespace'] = 'default namespace for blog';
+
+$lang['formposition'] = 'position of the new entry form';
+$lang['formposition_o_top'] = 'top';
+$lang['formposition_o_bottom'] = 'bottom';
+$lang['formposition_o_none'] = 'none';
+
+$lang['newentrytitle'] = 'title of the new entry form';
+
+$lang['dateprefix'] = 'prefix date to new entry IDs';
+
+$lang['sortkey'] = 'sort blog entries by';
+$lang['sortkey_o_cdate'] = 'creation date';
+$lang['sortkey_o_mdate'] = 'modification date';
+$lang['sortkey_o_pagename'] = 'page name';
+$lang['sortkey_o_id'] = 'page ID';
+$lang['sortkey_o_title'] = 'title';
+
+$lang['sortorder'] = 'sort order';
+$lang['sortorder_o_ascending'] = 'ascending';
+$lang['sortorder_o_descending'] = 'descending';
+
+$lang['excluded_pages'] = 'exclude certain pages from blog listing (regular expression required)';
+
+$lang['showhistogram'] = 'Display histogram on archive rendering';
+$lang['max_months'] = 'Max months to show in the histogram';
+$lang['histogram_height'] = 'Height of the histogram (in pixels)';
+
+// vim:ts=4:sw=4:et:enc=utf-8:
diff --git a/platform/www/lib/plugins/blog/lang/eo/lang.php b/platform/www/lib/plugins/blog/lang/eo/lang.php
new file mode 100644
index 0000000..5af3c5d
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/eo/lang.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Piotr Hołda <holda.piotr@gmail.com>
+ * @author Robert Bogenschneider <bogi@uea.org>
+ */
+$lang['blog'] = 'Blogo';
+$lang['older'] = 'Pli malnovaj enskriboj';
+$lang['newer'] = 'Pli novaj enskriboj';
+$lang['newentry'] = 'Nova blog-enskribo:';
+$lang['missing_includeplugin'] = 'La "Include"-kromaĵo devas esti instalita por uzi la blogon.';
+$lang['missing_pagelistplugin'] = 'La "Pagelist"-kromaĵo devas esti instalita por uzi arkivlistojn.';
+$lang['missing_tagplugin'] = 'La "Tag"-kromaĵo devas esti instalita por ŝanĝi etikedojn.';
+$lang['autoarchive'] = '%1$d Enskribo(j) por %2$s %3$s';
+$lang['month_01'] = 'Januaro';
+$lang['month_02'] = 'Februaro';
+$lang['month_03'] = 'Marto';
+$lang['month_04'] = 'Aprilo';
+$lang['month_05'] = 'Majo';
+$lang['month_06'] = 'Junio';
+$lang['month_07'] = 'Julio';
+$lang['month_08'] = 'Aŭgusto';
+$lang['month_09'] = 'Septembro';
+$lang['month_10'] = 'Oktobro';
+$lang['month_11'] = 'Novembro';
+$lang['month_12'] = 'Decembro';
+$lang['entries'] = 'enskriboj';
+$lang['entry'] = 'enskribo';
+$lang['archive_title'] = 'Blog-historio';
diff --git a/platform/www/lib/plugins/blog/lang/eo/settings.php b/platform/www/lib/plugins/blog/lang/eo/settings.php
new file mode 100644
index 0000000..baee492
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/eo/settings.php
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Piotr Hołda <holda.piotr@gmail.com>
+ * @author Robert Bogenschneider <bogi@uea.org>
+ */
+$lang['namespace'] = 'defaŭlta nomspaco por la blogo';
+$lang['formposition'] = 'pozicio de formularo de nova blog-enskribo';
+$lang['formposition_o_top'] = 'supro';
+$lang['formposition_o_bottom'] = 'malsupro';
+$lang['formposition_o_none'] = 'neniu';
+$lang['newentrytitle'] = 'Titolo de nova enmet-formularo';
+$lang['dateprefix'] = 'prefikso al novaj enskrib-ID-oj';
+$lang['sortkey'] = 'ordigi blog-enskriboj laŭ';
+$lang['sortkey_o_cdate'] = 'kreodato';
+$lang['sortkey_o_mdate'] = 'modifodato';
+$lang['sortkey_o_pagename'] = 'paĝ-nomo';
+$lang['sortkey_o_id'] = 'paĝ-identigilo';
+$lang['sortkey_o_title'] = 'titolo';
+$lang['sortorder'] = 'ordiga ordo';
+$lang['sortorder_o_ascending'] = 'kreskante';
+$lang['sortorder_o_descending'] = 'malkreskante';
+$lang['excluded_pages'] = 'ekskludi certajn paĝojn de bloglistado (per regula esprimo)';
+$lang['showhistogram'] = 'Montri histogramon de arkivado';
+$lang['max_months'] = 'Montri maksimume tiom da monatoj en la histogramo';
+$lang['histogram_height'] = 'Alteco de la histogramo (en pikseloj)';
diff --git a/platform/www/lib/plugins/blog/lang/es/lang.php b/platform/www/lib/plugins/blog/lang/es/lang.php
new file mode 100644
index 0000000..68ef65a
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/es/lang.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Herman Fabián Sandoval Manrique <hfsandovalm@emzac.com>
+ * @author r0sk <r0sk10@gmail.com>
+ */
+$lang['blog'] = 'Blog';
+$lang['older'] = 'Entradas anteriores';
+$lang['newer'] = 'Entradas nuevas';
+$lang['newentry'] = 'Nueva entrada en el blog:';
+$lang['missing_includeplugin'] = 'El plugin Include debe estar instalado para que el blog funcione.';
+$lang['missing_pagelistplugin'] = 'El plugin Pagelist debe estar instalado para que funcionen los listados de archivo.';
+$lang['missing_tagplugin'] = 'El plugin Tag debe estar instalado para que funcionen los tags.';
+$lang['month_01'] = 'Enero';
+$lang['month_02'] = 'Febrero';
+$lang['month_03'] = 'Marzo';
+$lang['month_04'] = 'Abril';
+$lang['month_05'] = 'Mayo';
+$lang['month_06'] = 'Junio';
+$lang['month_07'] = 'Julio';
+$lang['month_08'] = 'Agosto';
+$lang['month_09'] = 'Septiembre';
+$lang['month_10'] = 'Octubre';
+$lang['month_11'] = 'Noviembre';
+$lang['month_12'] = 'Diciembre';
+$lang['entries'] = 'entradas';
+$lang['entry'] = 'entrada';
+$lang['archive_title'] = 'Histórico';
diff --git a/platform/www/lib/plugins/blog/lang/es/settings.php b/platform/www/lib/plugins/blog/lang/es/settings.php
new file mode 100644
index 0000000..d86f15a
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/es/settings.php
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Herman Fabián Sandoval Manrique <hfsandovalm@emzac.com>
+ * @author r0sk <r0sk10@gmail.com>
+ */
+$lang['namespace'] = 'namespace predeterminado para el blog';
+$lang['formposition'] = 'posición del formulario de nueva entrada';
+$lang['formposition_o_top'] = 'arriba';
+$lang['formposition_o_bottom'] = 'abajo';
+$lang['formposition_o_none'] = 'ninguna';
+$lang['newentrytitle'] = 'título del formulario de nueva entrada';
+$lang['sortkey'] = 'ordenar entradas por';
+$lang['sortkey_o_cdate'] = 'fecha de creación';
+$lang['sortkey_o_mdate'] = 'fecha de modificación';
+$lang['sortkey_o_pagename'] = 'nombre de página';
+$lang['sortkey_o_id'] = 'ID de página';
+$lang['sortkey_o_title'] = 'título';
+$lang['sortorder'] = 'ordenamiento';
+$lang['sortorder_o_ascending'] = 'ascendente';
+$lang['sortorder_o_descending'] = 'descendente';
diff --git a/platform/www/lib/plugins/blog/lang/fa/lang.php b/platform/www/lib/plugins/blog/lang/fa/lang.php
new file mode 100644
index 0000000..ca6b600
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/fa/lang.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Sam01 <m.sajad079@gmail.com>
+ */
+$lang['blog'] = 'وبلاگ';
+$lang['older'] = 'نوشته‌های قدیمی‌تر';
+$lang['newer'] = 'نوشته‌های جدیدتر';
+$lang['newentry'] = 'ثبت وبلاگ جدید:';
+$lang['missing_includeplugin'] = 'برای کارکردن وبلاگ نیاز به نصب پلاگین است.';
+$lang['missing_pagelistplugin'] = 'پلاگینPagelist باید برای آرشیوبندی نصب شود.';
+$lang['missing_tagplugin'] = 'پلاگین برچسب باید نصب شود تا اصطلاحات آن استفاده شود.';
+$lang['autoarchive'] = '%1$d مطلب (s) برای %2$s %3$s';
+$lang['month_01'] = 'ژانویه';
+$lang['month_02'] = 'فوریه';
+$lang['month_03'] = 'مارس';
+$lang['month_04'] = 'آوریل';
+$lang['month_05'] = 'می';
+$lang['month_06'] = 'ژوئن';
+$lang['month_07'] = 'جولای';
+$lang['month_08'] = 'اوت';
+$lang['month_09'] = 'سپتامبر';
+$lang['month_10'] = 'اکتبر';
+$lang['month_11'] = 'نوامبر';
+$lang['month_12'] = 'دسامبر';
+$lang['entries'] = 'ورودی‌ها';
+$lang['entry'] = 'ورودی';
+$lang['archive_title'] = 'تاریخچه وبلاگ';
diff --git a/platform/www/lib/plugins/blog/lang/fa/settings.php b/platform/www/lib/plugins/blog/lang/fa/settings.php
new file mode 100644
index 0000000..4c72e67
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/fa/settings.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Sam01 <m.sajad079@gmail.com>
+ */
+$lang['namespace'] = 'فضای نام پیش‌فرض برای وبلاگ';
+$lang['formposition'] = 'موقعیت فرم جدید وارد شده';
+$lang['formposition_o_top'] = 'بالا';
+$lang['formposition_o_bottom'] = 'پایین';
+$lang['formposition_o_none'] = 'هیچ';
+$lang['newentrytitle'] = 'عنوان فرم جدید وارد شده';
+$lang['dateprefix'] = 'تاریخ پیشوند آیدی‌های ورودی‌های جدید';
+$lang['sortkey'] = 'مرتب سازی مطالب وبلاگ براساس';
+$lang['sortkey_o_cdate'] = 'تاریخ ایجاد';
+$lang['sortkey_o_mdate'] = 'تاریخ اصلاح';
+$lang['sortkey_o_pagename'] = 'نام صفحه';
+$lang['sortkey_o_id'] = 'آیدی صفحه';
+$lang['sortkey_o_title'] = 'عنوان';
+$lang['sortorder'] = 'مرتب سازی سفارشی';
+$lang['sortorder_o_ascending'] = 'صعودی';
+$lang['sortorder_o_descending'] = 'نزولی';
+$lang['excluded_pages'] = 'به غیر از صفحه‌های خاص از لیست وبلاگ (عبارت منظم مورد نیاز است)';
+$lang['showhistogram'] = 'نمایش بافت‌نگار در تفسیر آرشیو';
+$lang['max_months'] = 'حداکثر ماه‌ها برای نمایش بافت‌نگار';
+$lang['histogram_height'] = 'ارتفاع بافت‌نگار (به پیکسل)';
diff --git a/platform/www/lib/plugins/blog/lang/fr/lang.php b/platform/www/lib/plugins/blog/lang/fr/lang.php
new file mode 100644
index 0000000..c786d5f
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/fr/lang.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Damien Raude-Morvan <drazzib@drazzib.com>
+ * @author Stanislas Reltgen <stanislas@reltgen.net>
+ * @author Florent Chabaud <fchabaud@free.fr>
+ */
+$lang['blog'] = 'Blog';
+$lang['older'] = 'Anciens billets';
+$lang['newer'] = 'Billets récents';
+$lang['newentry'] = 'Nouveau billet :';
+$lang['missing_includeplugin'] = 'Le module "include" doit être installé pour que le module "blog" puisse fonctionner.';
+$lang['missing_pagelistplugin'] = 'Le module "pagelist" doit être installé pour que les archives puissent fonctionner.';
+$lang['missing_tagplugin'] = 'Le module "tag" doit être installé pour pouvoir en bénéficier dans le module "blog".';
+$lang['autoarchive'] = '%1$d billet(s) pour %2$s %3$s';
+$lang['month_01'] = 'janvier';
+$lang['month_02'] = 'février';
+$lang['month_03'] = 'mars';
+$lang['month_04'] = 'avril';
+$lang['month_05'] = 'mai';
+$lang['month_06'] = 'juin';
+$lang['month_07'] = 'juillet';
+$lang['month_08'] = 'août';
+$lang['month_09'] = 'septembre';
+$lang['month_10'] = 'octobre';
+$lang['month_11'] = 'novembre';
+$lang['month_12'] = 'décembre';
+$lang['entries'] = 'billets';
+$lang['entry'] = 'billet';
+$lang['archive_title'] = 'Historique du blog';
diff --git a/platform/www/lib/plugins/blog/lang/fr/settings.php b/platform/www/lib/plugins/blog/lang/fr/settings.php
new file mode 100644
index 0000000..21902e6
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/fr/settings.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Stanislas Reltgen <stanislas@reltgen.net>
+ * @author Florent Chabaud <fchabaud@free.fr>
+ * @author Nicolas Friedli <nicolas@theologique.ch>
+ */
+$lang['namespace'] = 'espace de nom par défaut pour le blog';
+$lang['formposition'] = 'position du formulaire de saisie de nouveau billet';
+$lang['formposition_o_top'] = 'haut';
+$lang['formposition_o_bottom'] = 'bas';
+$lang['formposition_o_none'] = 'aucun';
+$lang['newentrytitle'] = 'titre de la nouvelle entrée de formulaire';
+$lang['dateprefix'] = 'date préfixant les IDs des nouveaux billets';
+$lang['sortkey'] = 'trier les billets du blog par:';
+$lang['sortkey_o_cdate'] = 'date de création';
+$lang['sortkey_o_mdate'] = 'date de modification';
+$lang['sortkey_o_pagename'] = 'nom de la page';
+$lang['sortkey_o_id'] = 'ID de la page';
+$lang['sortkey_o_title'] = 'titre';
+$lang['sortorder'] = 'ordre de tri';
+$lang['sortorder_o_ascending'] = 'croissant';
+$lang['sortorder_o_descending'] = 'décroissant';
+$lang['excluded_pages'] = 'exclure certaines pages des archives du blog (expression régulière requise)';
+$lang['showhistogram'] = 'Afficher l\'histogramme du rendu des archives';
+$lang['max_months'] = 'Nombre maximal de mois à représenter dans l\'histogramme';
+$lang['histogram_height'] = 'Hauteur de l\'histogramme (en pixels)';
diff --git a/platform/www/lib/plugins/blog/lang/hu/lang.php b/platform/www/lib/plugins/blog/lang/hu/lang.php
new file mode 100644
index 0000000..85f47c4
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/hu/lang.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Norbert Csík <norbert.csik@gmail.com>
+ * @author Serenity87HUN <anikototh87@gmail.com>
+ * @author Marina Vladi <deldadam@gmail.com>
+ */
+$lang['blog'] = 'Napló';
+$lang['older'] = 'régi bejegyzések';
+$lang['newer'] = 'új bejegyzések';
+$lang['newentry'] = 'Új bejegyzés:';
+$lang['missing_includeplugin'] = 'Az \'Include Plugin\'-t telepítenünk kell a napló (blog) működéséhez.';
+$lang['missing_pagelistplugin'] = 'A \'Pagelist Plugin\'-t telepítenünk kell az archiválási listák működéséhez.';
+$lang['missing_tagplugin'] = 'A \'Tag Plugin\'-t telepítenünk kell a címkék használatához.';
+$lang['autoarchive'] = '%1$d hozzászólás ehhez: %2$s %3$s';
+$lang['month_01'] = 'Január';
+$lang['month_02'] = 'Február';
+$lang['month_03'] = 'Március';
+$lang['month_04'] = 'Április';
+$lang['month_05'] = 'Május';
+$lang['month_06'] = 'Június';
+$lang['month_07'] = 'Július';
+$lang['month_08'] = 'Augusztus';
+$lang['month_09'] = 'Szeptember';
+$lang['month_10'] = 'Október';
+$lang['month_11'] = 'November';
+$lang['month_12'] = 'December';
+$lang['entries'] = 'bejegyzés';
+$lang['entry'] = 'bejegyzés';
+$lang['archive_title'] = 'Naplótörténet';
diff --git a/platform/www/lib/plugins/blog/lang/hu/settings.php b/platform/www/lib/plugins/blog/lang/hu/settings.php
new file mode 100644
index 0000000..01a0aff
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/hu/settings.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Norbert Csík <norbert.csik@gmail.com>
+ * @author Serenity87HUN <anikototh87@gmail.com>
+ * @author Marina Vladi <deldadam@gmail.com>
+ */
+$lang['namespace'] = 'napló alapértelmezett névtere';
+$lang['formposition'] = 'új bejegyzés űrlapjának helye';
+$lang['formposition_o_top'] = 'felül';
+$lang['formposition_o_bottom'] = 'alul';
+$lang['formposition_o_none'] = 'sehol';
+$lang['newentrytitle'] = 'új bejegyzés űrlapcíme';
+$lang['dateprefix'] = 'Dátumelőtag új bejegyzések ID-jéhez';
+$lang['sortkey'] = 'naplóbejegyzések rendezése eszerint';
+$lang['sortkey_o_cdate'] = 'készítés dátuma';
+$lang['sortkey_o_mdate'] = 'módosítás dátuma';
+$lang['sortkey_o_pagename'] = 'oldalnév';
+$lang['sortkey_o_id'] = 'oldalazonosító';
+$lang['sortkey_o_title'] = 'cím';
+$lang['sortorder'] = 'rendezés iránya';
+$lang['sortorder_o_ascending'] = 'növekvő';
+$lang['sortorder_o_descending'] = 'csökkenő';
+$lang['excluded_pages'] = 'bizonyos oldalak kihagyása a blog listázása esetén (regurális kifejezés használata szükséges)';
+$lang['showhistogram'] = 'Grafikon megjelenítése archiváláskor';
+$lang['max_months'] = 'Grafikonon megjelenítendő hónapok max. száma';
+$lang['histogram_height'] = 'Grafikon magassága (pixelben)';
diff --git a/platform/www/lib/plugins/blog/lang/it/lang.php b/platform/www/lib/plugins/blog/lang/it/lang.php
new file mode 100644
index 0000000..874253c
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/it/lang.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Italian language file
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Niccolo Rigacci <niccolo@rigacci.org>
+ */
+
+// custom language strings for the plugin
+$lang['older'] = 'Articoli meno recenti';
+$lang['newer'] = 'Articoli più recent';
+$lang['newentry'] = 'Nuovo articolo:';
+
+$lang['missing_includeplugin'] = 'Questo blog non funziona senza il plugin Include.';
+$lang['missing_pagelistplugin'] = 'Questo blog non funziona senza il plugin Pagelist.';
+$lang['missing_tagplugin'] = 'Per utilizare i tag è ncessario installare il Plugin Tag.';
+
+$lang['autoarchive'] = '%1$d Articoli del %2$s %3$s';
+$lang['month_01'] = 'Gennaio';
+$lang['month_02'] = 'Febbraio';
+$lang['month_03'] = 'Marzo';
+$lang['month_04'] = 'Aprile';
+$lang['month_05'] = 'Maggio';
+$lang['month_06'] = 'Giugno';
+$lang['month_07'] = 'Luglio';
+$lang['month_08'] = 'Agosto';
+$lang['month_09'] = 'Settembre';
+$lang['month_10'] = 'Ottobre';
+$lang['month_11'] = 'Novembre';
+$lang['month_12'] = 'Dicembre';
+
+$lang['entries'] = 'Voci';
+$lang['entry'] = 'Voce';
+$lang['archive_title'] = 'Archivio Blog';
+
+//Setup VIM: ex: et ts=2 enc=utf-8 :
diff --git a/platform/www/lib/plugins/blog/lang/it/settings.php b/platform/www/lib/plugins/blog/lang/it/settings.php
new file mode 100644
index 0000000..7026236
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/it/settings.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * Italian language file
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Niccolo Rigacci <niccolo@rigacci.org>
+ */
+
+// for the configuration manager
+$lang['namespace'] = 'Namespace predefinito per il blog';
+
+//Setup VIM: ex: et ts=2 enc=utf-8 :
diff --git a/platform/www/lib/plugins/blog/lang/ja/lang.php b/platform/www/lib/plugins/blog/lang/ja/lang.php
new file mode 100644
index 0000000..51ec982
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/ja/lang.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Hideaki SAWADA <chuno@live.jp>
+ */
+$lang['blog'] = 'ブログ';
+$lang['older'] = '古い記事';
+$lang['newer'] = '新しい記事';
+$lang['newentry'] = '新しい記事の投稿:';
+$lang['missing_includeplugin'] = 'blog 構文が動くために Include プラグインが必要';
+$lang['missing_pagelistplugin'] = 'archive 構文が動くために Pagelist プラグインが必要';
+$lang['missing_tagplugin'] = 'タグ機能を使用するために Tag プラグインが必要';
+$lang['autoarchive'] = '%3$s年%2$sの%1$d記事';
+$lang['month_01'] = '01月';
+$lang['month_02'] = '02月';
+$lang['month_03'] = '03月';
+$lang['month_04'] = '04月';
+$lang['month_05'] = '05月';
+$lang['month_06'] = '06月';
+$lang['month_07'] = '07月';
+$lang['month_08'] = '08月';
+$lang['month_09'] = '09月';
+$lang['month_10'] = '10月';
+$lang['month_11'] = '11月';
+$lang['month_12'] = '12月';
+$lang['entries'] = '記事';
+$lang['entry'] = '記事';
+$lang['archive_title'] = 'ブログ履歴';
diff --git a/platform/www/lib/plugins/blog/lang/ja/settings.php b/platform/www/lib/plugins/blog/lang/ja/settings.php
new file mode 100644
index 0000000..b848358
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/ja/settings.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Hideaki SAWADA <chuno@live.jp>
+ */
+$lang['namespace'] = 'ブログ用のデフォルト名前空間';
+$lang['formposition'] = '新しい記事投稿用フォームの位置';
+$lang['formposition_o_top'] = '上部';
+$lang['formposition_o_bottom'] = '下部';
+$lang['formposition_o_none'] = '非表示';
+$lang['newentrytitle'] = '新しい記事投稿用フォームの題名';
+$lang['dateprefix'] = '新しい記事のページIDの先頭に付加する日付形式';
+$lang['sortkey'] = '記事のソート項目';
+$lang['sortkey_o_cdate'] = '作成日';
+$lang['sortkey_o_mdate'] = '変更日';
+$lang['sortkey_o_pagename'] = 'ページ名';
+$lang['sortkey_o_id'] = 'ページ ID';
+$lang['sortkey_o_title'] = 'タイトル';
+$lang['sortorder'] = 'ソート順';
+$lang['sortorder_o_ascending'] = '昇順';
+$lang['sortorder_o_descending'] = '降順';
+$lang['excluded_pages'] = '記事一覧から除外するページ(正規表現)';
+$lang['showhistogram'] = '記事一覧にヒストグラムを表示する';
+$lang['max_months'] = 'ヒストグラムに表示する最大月数';
+$lang['histogram_height'] = 'ヒストグラムの高さ(ピクセル)';
diff --git a/platform/www/lib/plugins/blog/lang/ko/lang.php b/platform/www/lib/plugins/blog/lang/ko/lang.php
new file mode 100644
index 0000000..a97d074
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/ko/lang.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Myeongjin <aranet100@gmail.com>
+ */
+$lang['blog'] = '블로그';
+$lang['older'] = '오래된 항목';
+$lang['newer'] = '새 항목';
+$lang['newentry'] = '새 블로그 항목:';
+$lang['missing_includeplugin'] = 'Include 플러그인은 블로그가 작동하기 위해 설치되어야 합니다.';
+$lang['missing_pagelistplugin'] = 'Pagelist 플러그인은 보존 목록이 작동하기 위해 설치되어야 합니다.';
+$lang['missing_tagplugin'] = 'Tag 플러그인은 태그 분류를 사용하기 위해 설치되어야 합니다.';
+$lang['autoarchive'] = '%3$s년 %2$s의 게시물 %1$d개';
+$lang['month_01'] = '1월';
+$lang['month_02'] = '2월';
+$lang['month_03'] = '3월';
+$lang['month_04'] = '4월';
+$lang['month_05'] = '5월';
+$lang['month_06'] = '6월';
+$lang['month_07'] = '7월';
+$lang['month_08'] = '8월';
+$lang['month_09'] = '9월';
+$lang['month_10'] = '10월';
+$lang['month_11'] = '11월';
+$lang['month_12'] = '12월';
+$lang['entries'] = '항목';
+$lang['entry'] = '항목';
+$lang['archive_title'] = '블로그 역사';
diff --git a/platform/www/lib/plugins/blog/lang/ko/settings.php b/platform/www/lib/plugins/blog/lang/ko/settings.php
new file mode 100644
index 0000000..fc20515
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/ko/settings.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Myeongjin <aranet100@gmail.com>
+ */
+$lang['namespace'] = '블로그에 대한 기본 이름공간';
+$lang['formposition'] = '새 항목 양식의 위치';
+$lang['formposition_o_top'] = '위';
+$lang['formposition_o_bottom'] = '아래';
+$lang['formposition_o_none'] = '없음';
+$lang['newentrytitle'] = '새 항목 양식의 제목';
+$lang['dateprefix'] = '새 항목 ID에 접두어 날짜';
+$lang['sortkey'] = '블로그 항목 순서로 정렬';
+$lang['sortkey_o_cdate'] = '만든 날짜';
+$lang['sortkey_o_mdate'] = '수정한 날짜';
+$lang['sortkey_o_pagename'] = '문서 이름';
+$lang['sortkey_o_id'] = '문서 ID';
+$lang['sortkey_o_title'] = '제목';
+$lang['sortorder'] = '정렬 순서';
+$lang['sortorder_o_ascending'] = '오름차순';
+$lang['sortorder_o_descending'] = '내림차순';
+$lang['excluded_pages'] = '블로그 목록에서 특정 문서를 제외 (정규 표현식 필요)';
+$lang['showhistogram'] = '보존 렌더링에 히스토그램 표시';
+$lang['max_months'] = '히스토그램에서 보여줄 최대 월';
+$lang['histogram_height'] = '히스토그램의 높이 (픽셀)';
diff --git a/platform/www/lib/plugins/blog/lang/nl/lang.php b/platform/www/lib/plugins/blog/lang/nl/lang.php
new file mode 100644
index 0000000..da4a889
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/nl/lang.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Gijs H. van Gemert <g.v.gemert@inter.nl.net>
+ * @author Mark Prins <mprins@users.sf.net>
+ */
+$lang['blog'] = 'Blog';
+$lang['older'] = 'Oude berichten';
+$lang['newer'] = 'Nieuwe berichten';
+$lang['newentry'] = 'Nieuw bericht:';
+$lang['missing_includeplugin'] = 'De Include Plugin dient geïnstalleerd te zijn om de blog te laten werken.';
+$lang['missing_pagelistplugin'] = 'De Pagelist Plugin dient geïnstalleerd te zijn om archief lijsten te laten werken.';
+$lang['missing_tagplugin'] = 'De Tag Plugin dient geïnstalleerd te zijn om label filters te laten werken.';
+$lang['autoarchive'] = '%1$d artikel(en) voor %2$s %3$s';
+$lang['month_01'] = 'januari';
+$lang['month_02'] = 'februari';
+$lang['month_03'] = 'maart';
+$lang['month_04'] = 'april';
+$lang['month_05'] = 'mei';
+$lang['month_06'] = 'juni';
+$lang['month_07'] = 'juli';
+$lang['month_08'] = 'augustus';
+$lang['month_09'] = 'september';
+$lang['month_10'] = 'october';
+$lang['month_11'] = 'november';
+$lang['month_12'] = 'december';
+$lang['entries'] = 'berichten';
+$lang['entry'] = 'bericht';
+$lang['archive_title'] = 'Blog geschiedenis';
diff --git a/platform/www/lib/plugins/blog/lang/nl/settings.php b/platform/www/lib/plugins/blog/lang/nl/settings.php
new file mode 100644
index 0000000..2431948
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/nl/settings.php
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Gijs van Gemert <gijsh@sherpanet.nl>
+ * @author Mark Prins <mprins@users.sf.net>
+ */
+$lang['namespace'] = 'default namespace voor blog';
+$lang['formposition'] = 'positie van het nieuwe bericht formulier';
+$lang['formposition_o_top'] = 'boven';
+$lang['formposition_o_bottom'] = 'onder';
+$lang['formposition_o_none'] = 'geen';
+$lang['newentrytitle'] = 'titels van het nieuwe bericht formulier';
+$lang['dateprefix'] = 'datum prefix aan nieuwe bericht IDs toevoegen';
+$lang['sortkey'] = 'Sorteer blog berichten op';
+$lang['sortkey_o_cdate'] = 'aanmaak datum';
+$lang['sortkey_o_mdate'] = 'bewerkingsdatum';
+$lang['sortkey_o_pagename'] = 'pagina naam';
+$lang['sortkey_o_id'] = 'pagina ID';
+$lang['sortkey_o_title'] = 'titel';
+$lang['sortorder'] = 'sorteer volgorde';
+$lang['sortorder_o_ascending'] = 'oplopend';
+$lang['sortorder_o_descending'] = 'aflopend';
+$lang['excluded_pages'] = 'bepaalde pagina\'s uitsluiten van blog lijst (vereist reguliere expressie)';
+$lang['showhistogram'] = 'Histogram tonen in de archief weergave';
+$lang['max_months'] = 'Maximum aantal te tonen maanden in het histogram';
+$lang['histogram_height'] = 'Hoogte van het histogram (in pixels)';
diff --git a/platform/www/lib/plugins/blog/lang/pl/lang.php b/platform/www/lib/plugins/blog/lang/pl/lang.php
new file mode 100644
index 0000000..3cdbeaf
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/pl/lang.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Bartek S <sadupl@gmail.com>
+ * @author Radoslaw Gorniak
+ * @author Tomasz Dworakowski <tomaszdworakowski@gmail.com>
+ */
+$lang['blog'] = 'Blog';
+$lang['older'] = 'Wcześniejsze wpisy';
+$lang['newer'] = 'Nowsze wpisy';
+$lang['newentry'] = 'Nowy wpis';
+$lang['missing_includeplugin'] = 'Wtyczka Include musi być zainstalowana, aby blog mógł działać poprawnie.';
+$lang['missing_pagelistplugin'] = 'Wtyczka Pagelist musi być zainstalowana, aby archiwizacja mógła działać poprawnie.';
+$lang['missing_tagplugin'] = 'Wtyczka Tag Plugin musi być zainstalowana, aby móc używać tagów.';
+$lang['month_01'] = 'Styczeń';
+$lang['month_02'] = 'Luty';
+$lang['month_03'] = 'Marzec';
+$lang['month_04'] = 'Kwiecień';
+$lang['month_05'] = 'Maj';
+$lang['month_06'] = 'Czerwiec';
+$lang['month_07'] = 'Lipiec';
+$lang['month_08'] = 'Sierpień';
+$lang['month_09'] = 'Wrzesień';
+$lang['month_10'] = 'Październik';
+$lang['month_11'] = 'Listopad';
+$lang['month_12'] = 'Grudzień';
+$lang['entries'] = 'wyników';
+$lang['entry'] = 'wynik';
+$lang['archive_title'] = 'Historia bloga';
diff --git a/platform/www/lib/plugins/blog/lang/pl/settings.php b/platform/www/lib/plugins/blog/lang/pl/settings.php
new file mode 100644
index 0000000..8890afa
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/pl/settings.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Bartek S <sadupl@gmail.com>
+ * @author Radoslaw Gorniak
+ * @author Tomasz Dworakowski <tomaszdworakowski@gmail.com>
+ */
+$lang['namespace'] = 'Domyślna przestrzeń nazw dla bloga';
+$lang['formposition'] = 'Pozycja formularza nowy wpis';
+$lang['formposition_o_top'] = 'góra';
+$lang['formposition_o_bottom'] = 'dół';
+$lang['formposition_o_none'] = 'brak';
+$lang['dateprefix'] = 'Dołącz datę do ID nowego wpisu (ciąg formatujący datę)';
+$lang['sortkey'] = 'Sortuj wpisy używając';
+$lang['sortkey_o_cdate'] = 'daty stworzenia';
+$lang['sortkey_o_mdate'] = 'daty modifikacji';
+$lang['sortkey_o_pagename'] = 'nazwy strony';
+$lang['sortkey_o_id'] = 'ID strony';
+$lang['sortkey_o_title'] = 'tytułu';
+$lang['sortorder'] = 'Kolejność sortowania';
+$lang['sortorder_o_ascending'] = 'rosnąca';
+$lang['sortorder_o_descending'] = 'malejąca';
+$lang['max_months'] = 'Maksymalna liczba miesięcy do pokazania w histogramie';
diff --git a/platform/www/lib/plugins/blog/lang/pt-br/lang.php b/platform/www/lib/plugins/blog/lang/pt-br/lang.php
new file mode 100644
index 0000000..bd219ba
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/pt-br/lang.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Flávio Roberto Santos <flavio.barata@gmail.com>
+ * @author Samory Pereira Santos <samory.santos@gmail.com>
+ */
+$lang['blog'] = 'Blog';
+$lang['older'] = 'registros antigos';
+$lang['newer'] = 'registros mais novos';
+$lang['newentry'] = 'Novo registro do blog:';
+$lang['missing_includeplugin'] = 'O plugin Inlude deve estar instalado para que o blog funcione.';
+$lang['missing_pagelistplugin'] = 'O plugin Pagelist deve estar instalado para que a listagem de arquivo funcione,';
+$lang['missing_tagplugin'] = 'O plugin Tag deve estar instalado para usar refinamentos de etiquetagem.';
+$lang['month_01'] = 'Janeiro';
+$lang['month_02'] = 'Fevereiro';
+$lang['month_03'] = 'Março';
+$lang['month_04'] = 'Abril';
+$lang['month_05'] = 'Maio';
+$lang['month_06'] = 'Junho';
+$lang['month_07'] = 'Julho';
+$lang['month_08'] = 'Agosto';
+$lang['month_09'] = 'Setembro';
+$lang['month_10'] = 'Outubro';
+$lang['month_11'] = 'Novembro';
+$lang['month_12'] = 'Dezembro';
+$lang['entries'] = 'entradas';
+$lang['entry'] = 'entrada';
+$lang['archive_title'] = 'Histórico do Blog';
diff --git a/platform/www/lib/plugins/blog/lang/pt-br/settings.php b/platform/www/lib/plugins/blog/lang/pt-br/settings.php
new file mode 100644
index 0000000..1346c22
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/pt-br/settings.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Fabio Pereira de Sousa <fabiosousa.eti@gmail.com>
+ * @author Flávio Roberto Santos <flavio.barata@gmail.com>
+ * @author Samory Pereira Santos <samory.santos@gmail.com>
+ */
+$lang['namespace'] = 'namespace padrão para o blog';
+$lang['formposition'] = 'posição do novo formulário de inscrição';
+$lang['formposition_o_top'] = 'topo';
+$lang['formposition_o_bottom'] = 'final';
+$lang['formposition_o_none'] = 'nenhum';
+$lang['newentrytitle'] = 'título do novo formulário de inscrição';
+$lang['dateprefix'] = 'prefixo de data para novos IDs de entrada';
+$lang['sortkey'] = 'ordenar as entradas do blog por';
+$lang['sortkey_o_cdate'] = 'data de criação';
+$lang['sortkey_o_mdate'] = 'data de modificação';
+$lang['sortkey_o_pagename'] = 'nome da página';
+$lang['sortkey_o_id'] = 'ID da página';
+$lang['sortkey_o_title'] = 'título';
+$lang['sortorder'] = 'ordenação';
+$lang['sortorder_o_ascending'] = 'ascendente';
+$lang['sortorder_o_descending'] = 'descendente';
+$lang['excluded_pages'] = 'excluir determinadas páginas da listagem do blog (requer expressões regulares)';
+$lang['showhistogram'] = 'Exibir histograma na renderização de archive';
+$lang['max_months'] = 'Máximo de meses para mostrar no histograma';
+$lang['histogram_height'] = 'Altura do histograma (em pixels)';
diff --git a/platform/www/lib/plugins/blog/lang/pt/lang.php b/platform/www/lib/plugins/blog/lang/pt/lang.php
new file mode 100644
index 0000000..2816f05
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/pt/lang.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Esther Brunner <wikidesign@gmail.com>
+ * @author Fernando Ribeiro <pinguim.ribeiro@gmail.com>
+ */
+$lang['blog'] = 'Blog';
+$lang['older'] = 'Entradas mais antigas';
+$lang['newer'] = 'Entradas mais recentes';
+$lang['newentry'] = 'Nova entrada do blog:';
+$lang['missing_includeplugin'] = 'O Plugin Include deve estar instalado para o blog funcionar.';
+$lang['missing_pagelistplugin'] = 'O Plugin Pagelist deve estar instalado para as listas do arquivo funcionarem.';
+$lang['missing_tagplugin'] = 'O Plugin Tag deve estar instalado para as etiquetas funcionarem.';
+$lang['autoarchive'] = '%1$d Artigo(s) para %2$s %3$s';
+$lang['month_01'] = 'Janeiro';
+$lang['month_02'] = 'Fevereiro';
+$lang['month_03'] = 'Março';
+$lang['month_04'] = 'Abril';
+$lang['month_05'] = 'Maio';
+$lang['month_06'] = 'Junho';
+$lang['month_07'] = 'Julho';
+$lang['month_08'] = 'Agosto';
+$lang['month_09'] = 'Setembro';
+$lang['month_10'] = 'Outubro';
+$lang['month_11'] = 'Novembro';
+$lang['month_12'] = 'Dezembro';
+$lang['entries'] = 'entradas';
+$lang['entry'] = 'entrada';
+$lang['archive_title'] = 'Histórico do Blog';
diff --git a/platform/www/lib/plugins/blog/lang/pt/settings.php b/platform/www/lib/plugins/blog/lang/pt/settings.php
new file mode 100644
index 0000000..43720ae
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/pt/settings.php
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Esther Brunner <wikidesign@gmail.com>
+ * @author Fernando Ribeiro <pinguim.ribeiro@gmail.com>
+ */
+$lang['namespace'] = 'default namespace for blog';
+$lang['formposition'] = 'posição do formulário de entrada nova';
+$lang['formposition_o_top'] = 'topo';
+$lang['formposition_o_bottom'] = 'fundo';
+$lang['formposition_o_none'] = 'nenhum';
+$lang['newentrytitle'] = 'título do formulário de entrada nova';
+$lang['dateprefix'] = 'prefixo do ID para a nova entrada';
+$lang['sortkey'] = 'ordenar entradas do blog por';
+$lang['sortkey_o_cdate'] = 'data de criação';
+$lang['sortkey_o_mdate'] = 'data de modificação';
+$lang['sortkey_o_pagename'] = 'nome da página';
+$lang['sortkey_o_id'] = 'ID da página';
+$lang['sortkey_o_title'] = 'título';
+$lang['sortorder'] = 'ordenação';
+$lang['sortorder_o_ascending'] = 'ascendente';
+$lang['sortorder_o_descending'] = 'descendente';
+$lang['excluded_pages'] = 'excluir determinadas páginas da listagem do blog (requer expressão regular)';
+$lang['showhistogram'] = 'Mostrar histograma na representação do arquivo';
+$lang['max_months'] = 'Nº máximo de meses para mostrar no histograma';
+$lang['histogram_height'] = 'Altura do histograma (em pixels)';
diff --git a/platform/www/lib/plugins/blog/lang/ro/lang.php b/platform/www/lib/plugins/blog/lang/ro/lang.php
new file mode 100644
index 0000000..5a216db
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/ro/lang.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Romanian language file
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Esther Brunner <wikidesign@gmail.com>
+ * @author Florin Chitiul <florinko@gmail.com>
+ */
+// custom language strings for the plugin
+$lang['blog'] = 'Blog';
+$lang['older'] = 'Intrări vechi';
+$lang['newer'] = 'Intrări mai noi';
+$lang['newentry'] = 'Postare nouă:';
+$lang['missing_includeplugin'] = 'Plugin-ul Include trebuie să fie instalat pentru ca blogul să fie funcțional.';
+$lang['missing_pagelistplugin'] = 'The Pagelist Plugin must be installed for archive lists to work.';
+$lang['missing_tagplugin'] = 'Plugin-ul Tag trebuie să fie instalat pentru a utiliza convocări subtile tag.';
+$lang['autoarchive'] = '%1$d Post(ări) pentru %2$lea %3$lea';
+$lang['month_01'] = 'Ianuarie';
+$lang['month_02'] = 'Februarie';
+$lang['month_03'] = 'Martie';
+$lang['month_04'] = 'Aprilie';
+$lang['month_05'] = 'Mai';
+$lang['month_06'] = 'Iunie';
+$lang['month_07'] = 'Iulie';
+$lang['month_08'] = 'August';
+$lang['month_09'] = 'Septembrie';
+$lang['month_10'] = 'Octobrie';
+$lang['month_11'] = 'Noiebrie';
+$lang['month_12'] = 'Decembrie';
+$lang['entries'] = 'intrări';
+$lang['entry'] = 'intrare';
+$lang['archive_title'] = 'Istoria blogului';
diff --git a/platform/www/lib/plugins/blog/lang/ro/settings.php b/platform/www/lib/plugins/blog/lang/ro/settings.php
new file mode 100644
index 0000000..f5407dd
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/ro/settings.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Romanian language file
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Esther Brunner <wikidesign@gmail.com>
+ * @author Florin Chitiul <florinko@gmail.com>
+ */
+
+// for the configuration manager
+$lang['namespace'] = 'numele implicit al blogului';
+$lang['formposition'] = 'poziția formularului de inserare nouă';
+$lang['formposition_o_top'] = 'sus';
+$lang['formposition_o_bottom'] = 'jos';
+$lang['formposition_o_none'] = 'niciuna';
+$lang['newentrytitle'] = 'titlul inserării formularului de inserare nouă';
+$lang['dateprefix'] = 'prefixul datei identității noii inserări';
+$lang['sortkey'] = 'sortează intrările blogului după data celei mai noi inserări';
+$lang['sortkey_o_cdate'] = 'data creării';
+$lang['sortkey_o_mdate'] = 'data modificării';
+$lang['sortkey_o_pagename'] = 'numele paginii';
+$lang['sortkey_o_id'] = 'ID-ul paginii';
+$lang['sortkey_o_title'] = 'titlul';
+$lang['sortorder'] = 'ordinea de sortare';
+$lang['sortorder_o_ascending'] = 'crescatoare';
+$lang['sortorder_o_descending'] = 'descrescatoare';
+$lang['excluded_pages'] = 'exclude anumite pagini de la listarea în blog (sunt necesare expresii)';
+$lang['showhistogram'] = 'Afișează histograma în redarea arhivei';
+$lang['max_months'] = 'Maximul nr. de luni afișabile în histogramă';
+$lang['histogram_height'] = 'Înălțimea histogramei (în pixeli)';
diff --git a/platform/www/lib/plugins/blog/lang/ru/lang.php b/platform/www/lib/plugins/blog/lang/ru/lang.php
new file mode 100644
index 0000000..13d6fac
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/ru/lang.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Spike <spike@foobar2000.ru>
+ * @author Aleksandr Selivanov <alexgearbox@gmail.com>
+ */
+$lang['blog'] = 'Блог';
+$lang['older'] = 'Предыдущие записи';
+$lang['newer'] = 'Новые записи';
+$lang['newentry'] = 'Новая запись:';
+$lang['missing_includeplugin'] = 'Для работы блога необходимо установить плагин Include.';
+$lang['missing_pagelistplugin'] = 'Для создания архивного списка должен быть установлен плагин Pagelist.';
+$lang['missing_tagplugin'] = 'Для использования меток должен быть установлен плагин Tag.';
+$lang['autoarchive'] = '%1$d сообщ. за %2$s %3$s';
+$lang['month_01'] = 'январь';
+$lang['month_02'] = 'февраль';
+$lang['month_03'] = 'март';
+$lang['month_04'] = 'апрель';
+$lang['month_05'] = 'май';
+$lang['month_06'] = 'июнь';
+$lang['month_07'] = 'июль';
+$lang['month_08'] = 'август';
+$lang['month_09'] = 'сентябрь';
+$lang['month_10'] = 'октябрь';
+$lang['month_11'] = 'ноябрь';
+$lang['month_12'] = 'декабрь';
+$lang['entries'] = 'записи';
+$lang['entry'] = 'запись';
+$lang['archive_title'] = 'Статистика';
diff --git a/platform/www/lib/plugins/blog/lang/ru/settings.php b/platform/www/lib/plugins/blog/lang/ru/settings.php
new file mode 100644
index 0000000..3e2c1bd
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/ru/settings.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Spike <spike@foobar2000.ru>
+ * @author Aleksandr Selivanov <alexgearbox@gmail.com>
+ * @author Aleksandr Selivanov <alexgearbox@yandex.ru>
+ */
+$lang['namespace'] = 'Пространство имён по умолчанию для блога';
+$lang['formposition'] = 'Расположить форму для новой записи:';
+$lang['formposition_o_top'] = 'вверху страницы';
+$lang['formposition_o_bottom'] = 'внизу страницы';
+$lang['formposition_o_none'] = 'скрыть';
+$lang['newentrytitle'] = 'Заголовок формы для новой записи';
+$lang['dateprefix'] = 'Префикс даты для ID новой записи';
+$lang['sortkey'] = 'Сортировать записи по:';
+$lang['sortkey_o_cdate'] = 'дате написания';
+$lang['sortkey_o_mdate'] = 'дате редактирования';
+$lang['sortkey_o_pagename'] = 'имени страницы';
+$lang['sortkey_o_id'] = 'ID страницы';
+$lang['sortkey_o_title'] = 'заголовку';
+$lang['sortorder'] = 'Направление сортировки:';
+$lang['sortorder_o_ascending'] = 'по возрастанию';
+$lang['sortorder_o_descending'] = 'по убыванию';
+$lang['excluded_pages'] = 'Исключить определённые страницы из перечня блога (задаётся регулярным выражением)';
+$lang['showhistogram'] = 'Отображать гистограмму в режиме архива';
+$lang['max_months'] = 'Максимальное количество месяцев для отображения на гистограмме';
+$lang['histogram_height'] = 'Высота гистограммы (в пикселях)';
diff --git a/platform/www/lib/plugins/blog/lang/sk/lang.php b/platform/www/lib/plugins/blog/lang/sk/lang.php
new file mode 100644
index 0000000..b1b0dcf
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/sk/lang.php
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Igor Korček <korcek dot igor at gmail dot com>
+ */
+
+$lang['blog'] = 'Blog';
+$lang['older'] = 'Staršie články';
+$lang['newer'] = 'Novšie články';
+$lang['newentry'] = 'Nový článok:';
+
+$lang['missing_includeplugin'] = 'Pre fungovanie pluginu je potrebné nainštalovať Include Plugin.';
+$lang['missing_pagelistplugin'] = 'Pre fungovanie archívu je potrebné nainštalovať Pagelist Plugin.';
+$lang['missing_tagplugin'] = 'Pre správne fungovanie tagov je potrebné nainštalovať Tag Plugin.';
+
+$lang['autoarchive'] = '%1$d Článok(ov) pre %2$s %3$s';
+$lang['month_01'] = 'január';
+$lang['month_02'] = 'február';
+$lang['month_03'] = 'marec';
+$lang['month_04'] = 'april';
+$lang['month_05'] = 'máj';
+$lang['month_06'] = 'jún';
+$lang['month_07'] = 'júl';
+$lang['month_08'] = 'august';
+$lang['month_09'] = 'septemeber';
+$lang['month_10'] = 'október';
+$lang['month_11'] = 'november';
+$lang['month_12'] = 'december';
+
+$lang['entries'] = 'položiek';
+$lang['entry'] = 'položka';
+$lang['archive_title'] = 'História blogu';
diff --git a/platform/www/lib/plugins/blog/lang/sk/settings.php b/platform/www/lib/plugins/blog/lang/sk/settings.php
new file mode 100644
index 0000000..bd44367
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/sk/settings.php
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Igor Korček <korcek dot igor at gmail dot com>
+ */
+$lang['namespace'] = 'implicitný menný priestor pre blog';
+
+$lang['formposition'] = 'pozícia poľa pre zadávanie nového príspevku';
+$lang['formposition_o_top'] = 'na vrchu';
+$lang['formposition_o_bottom'] = 'dole';
+$lang['formposition_o_none'] = 'žiadny';
+
+$lang['newentrytitle'] = 'Titulka na stránke pre nový článok';
+
+$lang['dateprefix'] = 'pridať datumový prefix novým príspevkom';
+
+$lang['sortkey'] = 'radenie článkov podľa';
+$lang['sortkey_o_cdate'] = 'dátumu vytvorenia';
+$lang['sortkey_o_mdate'] = 'dátumu úpravy';
+$lang['sortkey_o_pagename'] = 'názvu stránky';
+$lang['sortkey_o_id'] = 'ID stránky';
+$lang['sortkey_o_title'] = 'názov';
+
+$lang['sortorder'] = 'poradie';
+$lang['sortorder_o_ascending'] = 'vzostupné';
+$lang['sortorder_o_descending'] = 'zostupné';
+
+$lang['excluded_pages'] = 'vyčleniť určité stránky zo zobrazovanie v blogu (vyžaduje sa RegEx)';
+
+$lang['showhistogram'] = 'Zobraziť histogram na stránke archívu';
+$lang['max_months'] = 'Maximálny počet mesiacov zobrazených v histogramu';
+$lang['histogram_height'] = 'Výška histogramu (v pixeloch)';
diff --git a/platform/www/lib/plugins/blog/lang/sl/lang.php b/platform/www/lib/plugins/blog/lang/sl/lang.php
new file mode 100644
index 0000000..a197646
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/sl/lang.php
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Slovenian language file
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Blaž Mertelj <Blaz.Mertelj@atol.si>
+ */
+
+// custom language strings for the plugin
+$lang['blog'] = 'Blog';
+$lang['older'] = 'Starejši vnosi';
+$lang['newer'] = 'Novejši vnosi';
+$lang['newentry'] = 'Nov blog vnos:';
+
+//Setup VIM: ex: et ts=2 enc=utf-8 : \ No newline at end of file
diff --git a/platform/www/lib/plugins/blog/lang/sl/settings.php b/platform/www/lib/plugins/blog/lang/sl/settings.php
new file mode 100644
index 0000000..d4c4ffe
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/sl/settings.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ * Slovenian language file
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Blaž Mertelj <Blaz.Mertelj@atol.si>
+ */
+
+// for the configuration manager
+$lang['namespace'] = 'privzeti namespace za blog';
+
+$lang['sortkey'] = 'sortiraj blog vnose po:';
+$lang['sortkey_o_cdate'] = 'ustvarjeno dne';
+$lang['sortkey_o_pagename'] = 'ime strani';
+$lang['sortkey_o_id'] = 'ID strani';
+
+$lang['dateprefix'] = 'pripeti datum pred IDje novih vnosov';
+
+//Setup VIM: ex: et ts=2 enc=utf-8 : \ No newline at end of file
diff --git a/platform/www/lib/plugins/blog/lang/sv/lang.php b/platform/www/lib/plugins/blog/lang/sv/lang.php
new file mode 100644
index 0000000..b6a4046
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/sv/lang.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Christer Nygren <wiki@fronet.fro.se>
+ * @author Tor Härnqvist <tor.harnqvist@gmail.com>
+ * @author Tor Härnqvist <tor@harnqvist.se>
+ */
+$lang['blog'] = 'Blogg';
+$lang['older'] = 'Äldre inlägg';
+$lang['newer'] = 'Nyare inlägg';
+$lang['newentry'] = 'Nytt inlägg:';
+$lang['missing_includeplugin'] = 'Include-pluginet måste vara installerat för att bloggen ska fungera.';
+$lang['missing_pagelistplugin'] = 'Pagelist-pluginet måste vara installerat för att arkivlistningar ska fungera.';
+$lang['missing_tagplugin'] = 'Tagg-pluginet måste vara installerat för att använda tagg-funktionen.';
+$lang['autoarchive'] = '%1$d inlägg i %2$s %3$s';
+$lang['month_01'] = 'januari';
+$lang['month_02'] = 'februari';
+$lang['month_03'] = 'mars';
+$lang['month_04'] = 'april';
+$lang['month_05'] = 'maj';
+$lang['month_06'] = 'juni';
+$lang['month_07'] = 'juli';
+$lang['month_08'] = 'augusti';
+$lang['month_09'] = 'september';
+$lang['month_10'] = 'oktober';
+$lang['month_11'] = 'november';
+$lang['month_12'] = 'december';
+$lang['entries'] = 'Inlägg';
+$lang['entry'] = 'Inlägg';
+$lang['archive_title'] = 'Blogghistorik';
diff --git a/platform/www/lib/plugins/blog/lang/sv/settings.php b/platform/www/lib/plugins/blog/lang/sv/settings.php
new file mode 100644
index 0000000..34e82cc
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/sv/settings.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Christer Nygren <wiki@fronet.fro.se>
+ * @author Tor Härnqvist <tor.harnqvist@gmail.com>
+ * @author hib <hibratt@gmail.com>
+ */
+$lang['namespace'] = 'standard vy för blogg';
+$lang['formposition'] = 'nya formulärets position ';
+$lang['formposition_o_top'] = 'längst upp';
+$lang['formposition_o_bottom'] = 'längst ned';
+$lang['formposition_o_none'] = 'inget';
+$lang['newentrytitle'] = 'rubrik för nytt inläggsformulär';
+$lang['dateprefix'] = 'sätt datum före nytt inläggs-ID';
+$lang['sortkey'] = 'sortera inlägg efter:';
+$lang['sortkey_o_cdate'] = 'skapat datum';
+$lang['sortkey_o_mdate'] = 'ändringsdatum';
+$lang['sortkey_o_pagename'] = 'sidnamn';
+$lang['sortkey_o_id'] = 'sid-ID';
+$lang['sortkey_o_title'] = 'rubrik';
+$lang['sortorder'] = 'sorteringsordning';
+$lang['sortorder_o_ascending'] = 'stigande';
+$lang['sortorder_o_descending'] = 'fallande';
+$lang['excluded_pages'] = 'uteslut vissa sidor från blogglistan (regular expresstion krävs)';
+$lang['showhistogram'] = 'Visa histogram när arkivet skapas';
+$lang['max_months'] = 'Maximalt antal månader att visa i histogramet';
+$lang['histogram_height'] = 'Histogramets höjd (i pixlar)';
diff --git a/platform/www/lib/plugins/blog/lang/tr/lang.php b/platform/www/lib/plugins/blog/lang/tr/lang.php
new file mode 100644
index 0000000..592c6aa
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/tr/lang.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author İlker R. Kapaç <irifat@gmail.com>
+ */
+$lang['blog'] = 'Günce';
+$lang['older'] = 'Daha eski girdiler';
+$lang['newer'] = 'Daha yeni girdiler';
+$lang['newentry'] = 'Yeni günce oluştur:';
+$lang['missing_includeplugin'] = 'Güncenin (blog) çalışması için Include eklentisi yüklü olmalıdır.';
+$lang['missing_pagelistplugin'] = 'Arşiv listelerinin çalışması için Pagelist eklentisi yüklü olmalıdır.';
+$lang['missing_tagplugin'] = 'Etiket tanımlayabilmek için Tag eklentisi yüklü olmalıdır.';
+$lang['autoarchive'] = 'Her %2$s %3$s için %1$d Gönderi(ler)';
+$lang['month_01'] = 'Ocak';
+$lang['month_02'] = 'Şubat';
+$lang['month_03'] = 'Mart';
+$lang['month_04'] = 'Nisan';
+$lang['month_05'] = 'Mayıs';
+$lang['month_06'] = 'Haziran';
+$lang['month_07'] = 'Temmuz';
+$lang['month_08'] = 'Ağustos';
+$lang['month_09'] = 'Eylül';
+$lang['month_10'] = 'Ekim';
+$lang['month_11'] = 'Kasım';
+$lang['month_12'] = 'Aralık';
+$lang['entries'] = 'girdiler';
+$lang['entry'] = 'girdi';
+$lang['archive_title'] = 'Günce tarihçesi';
diff --git a/platform/www/lib/plugins/blog/lang/tr/settings.php b/platform/www/lib/plugins/blog/lang/tr/settings.php
new file mode 100644
index 0000000..d549800
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/tr/settings.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author İlker R. Kapaç <irifat@gmail.com>
+ */
+$lang['namespace'] = 'günce için varsayılan isimalanı';
+$lang['formposition'] = 'yeni girdi formunun konumu';
+$lang['formposition_o_top'] = 'üst';
+$lang['formposition_o_bottom'] = 'alt';
+$lang['formposition_o_none'] = 'yok';
+$lang['newentrytitle'] = 'yeni girdi formunun başlığı';
+$lang['dateprefix'] = 'yeni girdi kimliklerinde ön ek olarak kullanılacak tarih';
+$lang['sortkey'] = 'günce girdilerinin sıralanma şekli';
+$lang['sortkey_o_cdate'] = 'oluşturma tarihi';
+$lang['sortkey_o_mdate'] = 'değiştirilme tarihi';
+$lang['sortkey_o_pagename'] = 'sayfa adı';
+$lang['sortkey_o_id'] = 'sayfa kimliği';
+$lang['sortkey_o_title'] = 'başlık';
+$lang['sortorder'] = 'sıralama şekli';
+$lang['sortorder_o_ascending'] = 'artan';
+$lang['sortorder_o_descending'] = 'azalan';
+$lang['excluded_pages'] = 'bazı sayfaları günce listesinin dışında tut (kurallı tanımlama gereklidir)';
+$lang['showhistogram'] = 'Arşivi sunarken grafik göster';
+$lang['max_months'] = 'Grafikte gösterilecek en fazla ay sayısı';
+$lang['histogram_height'] = 'Grafiğin yüksekliği (piksel olarak)';
diff --git a/platform/www/lib/plugins/blog/lang/zh/lang.php b/platform/www/lib/plugins/blog/lang/zh/lang.php
new file mode 100644
index 0000000..3bbcd50
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/zh/lang.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * English language file
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Esther Brunner <wikidesign@gmail.com>
+ */
+
+// custom language strings for the plugin
+$lang['blog'] = '博客';
+$lang['older'] = '更早的文章';
+$lang['newer'] = '更新的文章';
+$lang['newentry'] = '新建文章:';
+
+$lang['missing_includeplugin'] = '要使用博客功能必须安装 Include 插件。';
+$lang['missing_pagelistplugin'] = '要使用存档列表功能必须安装 Pagelist 插件。';
+$lang['missing_tagplugin'] = '要使用标签 refinements 必须安装 Tag 插件。';
+
+$lang['autoarchive'] = '%3$s年%2$s有%1$d篇文章';
+$lang['month_01'] = '一月';
+$lang['month_02'] = '二月';
+$lang['month_03'] = '三月';
+$lang['month_04'] = '四月';
+$lang['month_05'] = '五月';
+$lang['month_06'] = '六月';
+$lang['month_07'] = '七月';
+$lang['month_08'] = '八月';
+$lang['month_09'] = '九月';
+$lang['month_10'] = '十月';
+$lang['month_11'] = '十一月';
+$lang['month_12'] = '十二月';
+
+$lang['entries'] = '文章';
+$lang['entry'] = '文章';
+$lang['archive_title'] = '文章历史';
+//Setup VIM: ex: et ts=2 enc=utf-8 :
diff --git a/platform/www/lib/plugins/blog/lang/zh/settings.php b/platform/www/lib/plugins/blog/lang/zh/settings.php
new file mode 100644
index 0000000..6ec12bb
--- /dev/null
+++ b/platform/www/lib/plugins/blog/lang/zh/settings.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * English language file
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Esther Brunner <wikidesign@gmail.com>
+ */
+
+// for the configuration manager
+$lang['namespace'] = '博客默认命名空间';
+
+$lang['formposition'] = '新文章的表单位置';
+$lang['formposition_o_top'] = '顶上';
+$lang['formposition_o_bottom'] = '底下';
+$lang['formposition_o_none'] = '不显示';
+
+$lang['newentrytitle'] = '新文章表单的标题';
+
+$lang['dateprefix'] = '为新文章 ID 添加日期前缀';
+
+$lang['sortkey'] = '文章排序按';
+$lang['sortkey_o_cdate'] = '创建时间';
+$lang['sortkey_o_mdate'] = '修改时间';
+$lang['sortkey_o_pagename'] = '页面名称';
+$lang['sortkey_o_id'] = '页面 ID';
+$lang['sortkey_o_title'] = '标题';
+
+$lang['sortorder'] = '排序顺序';
+$lang['sortorder_o_ascending'] = '升序';
+$lang['sortorder_o_descending'] = '降序';
+
+$lang['excluded_pages'] = '从博客列表中排除特定的页面 (要求是正则表达式)';
+
+$lang['showhistogram'] = '在存档页面上显示直方图';
+$lang['max_months'] = '在直方图上最多显示月份数';
+$lang['histogram_height'] = '直方图的高度 (单位像素)';
+
+// vim:ts=4:sw=4:et:enc=utf-8:
diff --git a/platform/www/lib/plugins/blog/manager.dat b/platform/www/lib/plugins/blog/manager.dat
new file mode 100644
index 0000000..1eadc20
--- /dev/null
+++ b/platform/www/lib/plugins/blog/manager.dat
@@ -0,0 +1,2 @@
+downloadurl=https://github.com/dokufreaks/plugin-blog/archive/master.zip
+installed=Sat, 19 Mar 2022 15:05:39 +0000
diff --git a/platform/www/lib/plugins/blog/plugin.info.txt b/platform/www/lib/plugins/blog/plugin.info.txt
new file mode 100644
index 0000000..73bd83c
--- /dev/null
+++ b/platform/www/lib/plugins/blog/plugin.info.txt
@@ -0,0 +1,8 @@
+# General Plugin Info
+base blog
+author Michael Hamann, Michael Klier, Gina Haeussge
+email michael@content-space.de
+date 2022-02-20
+name Blog
+desc Use DokuWiki as blogging tool. (previous authors: Esther Brunner)
+url https://www.dokuwiki.org/plugin:blog
diff --git a/platform/www/lib/plugins/blog/print.css b/platform/www/lib/plugins/blog/print.css
new file mode 100644
index 0000000..d912867
--- /dev/null
+++ b/platform/www/lib/plugins/blog/print.css
@@ -0,0 +1,3 @@
+#blog__newentry_form {
+ display:none;
+} \ No newline at end of file
diff --git a/platform/www/lib/plugins/blog/style.css b/platform/www/lib/plugins/blog/style.css
new file mode 100644
index 0000000..08c0a99
--- /dev/null
+++ b/platform/www/lib/plugins/blog/style.css
@@ -0,0 +1,40 @@
+div.dokuwiki div.newentry_form {
+ text-align: center;
+ margin-bottom: 1em;
+}
+
+div.dokuwiki #blog__newentry_form input.edit {
+ width: 95%;
+}
+
+div.dokuwiki tr.draft,
+div.dokuwiki div.draft {
+ opacity: 0.5;
+}
+
+div.dokuwiki div.autoarchive_selector ul {
+ list-style-type: none;
+ clear: left;
+ margin: 0 0.5em 0 0;
+}
+
+div.dokuwiki div.autoarchive_selector ul div.li {
+ float: left;
+ margin: 0 1em 0 0;
+}
+
+div.dokuwiki div.autoarchive_selector ul ul {
+ float: left;
+ clear: none;
+}
+
+div.dokuwiki div.autoarchive_selector ul ul div.li {
+ margin: 0;
+}
+
+img.blog_archive_bar {
+ background-color: __border__;
+ width: 5px;
+ border: 0 none;
+ vertical-align: bottom;
+}
diff --git a/platform/www/lib/plugins/blog/syntax/archive.php b/platform/www/lib/plugins/blog/syntax/archive.php
new file mode 100644
index 0000000..751a4a6
--- /dev/null
+++ b/platform/www/lib/plugins/blog/syntax/archive.php
@@ -0,0 +1,245 @@
+<?php
+/**
+ * Archive Plugin: displays links to all wiki pages from a given month
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Esther Brunner <wikidesign@gmail.com>
+ */
+
+/**
+ * All DokuWiki plugins to extend the parser/rendering mechanism
+ * need to inherit from this class
+ */
+class syntax_plugin_blog_archive extends DokuWiki_Syntax_Plugin {
+
+ function getType() { return 'substition'; }
+ function getPType() { return 'block'; }
+ function getSort() { return 309; }
+
+ function connectTo($mode) {
+ $this->Lexer->addSpecialPattern('\{\{archive>.*?\}\}', $mode, 'plugin_blog_archive');
+ }
+
+ function handle($match, $state, $pos, Doku_Handler $handler) {
+ global $ID;
+
+ $match = substr($match, 10, -2); // strip {{archive> from start and }} from end
+ list($match, $flags) = explode('&', $match, 2);
+ $flags = explode('&', $flags);
+ list($match, $refine) = explode(' ', $match, 2);
+ list($ns, $rest) = explode('?', $match, 2);
+
+ $author = NULL;
+ foreach($flags as $i=>$flag) {
+ if(preg_match('/(\w+)\s*=(.+)/', $flag, $temp) == 1) {
+ if ($temp[1] == 'author') {
+ $author = trim($temp[2]);
+ unset($flags[$i]);
+ }
+ }
+ }
+
+ if (!$rest) {
+ $rest = $ns;
+ $ns = '';
+ }
+
+ if ($ns == '') $ns = cleanID($this->getConf('namespace'));
+ elseif (($ns == '*') || ($ns == ':')) $ns = '';
+ elseif ($ns == '.') $ns = getNS($ID);
+ else $ns = cleanID($ns);
+
+ // daily archive
+ if (preg_match("/\d{4}-\d{2}-\d{2}/", $rest)) {
+ list($year, $month, $day) = explode('-', $rest, 3);
+
+ $start = mktime(0, 0, 0, $month, $day, $year);
+ $end = $start + 24*60*60;
+
+ // monthly archive
+ } elseif (preg_match("/\d{4}-\d{2}/", $rest)) {
+ list($year, $month) = explode('-', $rest, 2);
+
+ // calculate start and end times
+ $nextmonth = $month + 1;
+ $year2 = $year;
+ if ($nextmonth > 12) {
+ $nextmonth = 1;
+ $year2 = $year + 1;
+ }
+
+ $start = mktime(0, 0, 0, $month, 1, $year);
+ $end = mktime(0, 0, 0, $nextmonth, 1, $year2);
+
+ // a whole year
+ } elseif (preg_match("/\d{4}/", $rest)) {
+ $start = mktime(0, 0, 0, 1, 1, $rest);
+ $end = mktime(0, 0, 0, 1, 1, $rest + 1);
+
+ // all entries from that namespace up to now
+ } elseif ($rest == '*') {
+ $start = 0;
+ $end = PHP_INT_MAX;
+
+ // unknown format
+ } else {
+ return false;
+ }
+
+ return array($ns, $start, $end, $flags, $refine, $author);
+ }
+
+ function render($mode, Doku_Renderer $renderer, $data) {
+ list($ns, $start, $end, $flags, $refine, $author) = $data;
+
+ // get the blog entries for our namespace
+ /** @var helper_plugin_blog $my */
+ if ($my = plugin_load('helper', 'blog')) $entries = $my->getBlog($ns, NULL, $author);
+ else return false;
+
+ // use tag refinements?
+ if ($refine) {
+ /** @var helper_plugin_tag $tag */
+ if (plugin_isdisabled('tag') || (!$tag = plugin_load('helper', 'tag'))) {
+ msg($this->getLang('missing_tagplugin'), -1);
+ } else {
+ $entries = $tag->tagRefine($entries, $refine);
+ }
+ }
+
+ if (!$entries) return true; // nothing to display
+
+ if ($mode == 'xhtml') {
+ if ($this->getConf('showhistogram')) {
+ $alt_list = $this->_build_alternative_list($start, $end, $entries);
+
+ // Add histogram and posts list
+ $renderer->doc .= '<div class="level1">';
+ $renderer->doc .= '<h1>' . $this->getLang('archive_title') . '</h1>';
+ $renderer->doc .= $alt_list;
+ $renderer->doc .= '</div>' . DOKU_LF;
+ } else {
+ // let Pagelist Plugin do the work for us
+ if (plugin_isdisabled('pagelist')
+ || (!$pagelist = plugin_load('helper', 'pagelist'))) {
+ msg($this->getLang('missing_pagelistplugin'), -1);
+ return false;
+ }
+ /** @var helper_plugin_pagelist $pagelist */
+ $pagelist->setFlags($flags);
+ $pagelist->startList();
+ foreach ($entries as $entry) {
+
+ // entry in the right date range?
+ if (($start > $entry['date']) || ($entry['date'] >= $end)) continue;
+
+ $pagelist->addPage($entry);
+ }
+ $renderer->doc .= $pagelist->finishList();
+ }
+ return true;
+
+ // for metadata renderer
+ } elseif ($mode == 'metadata') {
+ /** @var Doku_Renderer_metadata $renderer */
+ // use the blog plugin cache handler in order to ensure that the cache is expired whenever a page, comment
+ // or linkback is added
+ if (time() < $end) $renderer->meta['plugin_blog']['purgefile_cache'] = true;
+
+ foreach ($entries as $entry) {
+
+ // entry in the right date range?
+ if (($start > $entry['date']) || ($entry['date'] >= $end)) continue;
+
+ $renderer->meta['relation']['references'][$entry['id']] = true;
+ $renderer->meta['plugin_blog']['archive_pages'][] = $entry['id'];
+ }
+
+ return true;
+ }
+ return false;
+ }
+
+ // Generate alternative posts list
+ function _build_alternative_list($start, $end, $entries) {
+ $current_year ='';
+ $current_month ='';
+ $ul_open = false;
+
+ $histogram_count = array();
+ $histogram_higher = 0;
+
+ $list = '';
+ foreach ($entries as $entry) {
+ // entry in the right date range?
+ if (($start > $entry['date']) || ($entry['date'] >= $end)) continue;
+
+ if ($current_year != date('o',$entry['date'])) {
+ if ($ul_open) {
+ $list .= '</ul>' . DOKU_LF;
+ $ul_open = false;
+ }
+ $current_year = date('o',$entry['date']);
+ $list .= '<h2>' . $current_year . '</h2>' . DOKU_LF;
+ $current_month = '';
+ }
+ if ($current_month != date('m',$entry['date'])) {
+ if ($ul_open) {
+ $list .= '</ul>' . DOKU_LF;
+ }
+ $current_month = date('m',$entry['date']);
+ $list .= '<h3 id="m' . date('o-m',$entry['date']) . '">' . $this->getLang('month_' . $current_month) . '</h3><ul>' . DOKU_LF;
+ $ul_open = true;
+ }
+ $histogram_count[date('o-m',$entry['date'])] += 1;
+ if ($histogram_higher < $histogram_count[date('o-m',$entry['date'])]) {
+ $histogram_higher = $histogram_count[date('o-m',$entry['date'])];
+ }
+ $list .= '<li>' . date('d',$entry['date']) . ' - <a href="' . wl($entry['id']) . '" title="' . $entry['id'] . '">' . $entry['title'] . '</a></li>' . DOKU_LF;
+ }
+ $list .= '</ul>' . DOKU_LF;
+
+ $histogram = $this->_build_histogram($histogram_count, $histogram_higher);
+
+ return $histogram . $list;
+ }
+
+ // Generate histogram
+ function _build_histogram($histogram_count, $histogram_higher) {
+ if (empty($histogram_count)) return '';
+
+ $histogram = '<p>';
+ $max_months = $this->getConf('max_months');
+ $histogram_height = $this->getConf('histogram_height');
+ $histogram_count = array_reverse($histogram_count);
+ $month_count = 0;
+ foreach ($histogram_count as $key => $month_reference) {
+ // Check the max_months parameter
+ if ($month_count >= $max_months) {
+ break;
+ }
+ if ($month_reference > 0) {
+ // Height in "px"
+ $current_height = $histogram_height / $histogram_higher * $month_reference;
+ } else {
+ // Height in "px"
+ $current_height = 1;
+ }
+ // Generate the alt attribute
+ $alt = $key.': '.$month_reference.' ';
+ if ($month_reference > 1) {
+ $alt .= $this->getLang('entries');
+ } else {
+ $alt .= $this->getLang('entry');
+ }
+ $histogram .= '<a href="#m' . $key . '" title="' . $alt . '">';
+ $histogram .= '<img class="blog_archive_bar" alt="' . $alt . '" style="height: ' . $current_height . 'px;" src="'.DOKU_BASE.'lib/images/blank.gif"/></a>' . DOKU_LF;
+ $month_count += 1;
+ }
+ $histogram .= '</p>';
+
+ return $histogram;
+ }
+
+}
+// vim:ts=4:sw=4:et:enc=utf-8:
diff --git a/platform/www/lib/plugins/blog/syntax/autoarchive.php b/platform/www/lib/plugins/blog/syntax/autoarchive.php
new file mode 100644
index 0000000..34cb240
--- /dev/null
+++ b/platform/www/lib/plugins/blog/syntax/autoarchive.php
@@ -0,0 +1,157 @@
+<?php
+/**
+ * Dynamic Archive Plugin: dynamically displays
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Esther Brunner <wikidesign@gmail.com>
+ */
+
+/**
+ * All DokuWiki plugins to extend the parser/rendering mechanism
+ * need to inherit from this class
+ */
+class syntax_plugin_blog_autoarchive extends DokuWiki_Syntax_Plugin {
+
+ function getType() { return 'substition'; }
+ function getPType() { return 'block'; }
+ function getSort() { return 309; }
+
+ function connectTo($mode) {
+ $this->Lexer->addSpecialPattern('\{\{autoarchive>.*?\}\}', $mode, 'plugin_blog_autoarchive');
+ }
+
+ function handle($match, $state, $pos, Doku_Handler $handler) {
+ global $ID;
+
+ $match = substr($match, 14, -2); // strip {{autoarchive> from start and }} from end
+ list($match, $flags) = explode('?', $match, 2);
+ $flags = explode('&', $flags);
+ list($ns, $refine) = explode(' ', $match, 2);
+
+ if ($ns == '') $ns = cleanID($this->getConf('namespace'));
+ elseif (($ns == '*') || ($ns == ':')) $ns = '';
+ elseif ($ns == '.') $ns = getNS($ID);
+ else $ns = cleanID($ns);
+
+ return array($ns, $flags, $refine, $pos);
+ }
+
+ function render($mode, Doku_Renderer $renderer, $data) {
+ list($ns, $flags, $refine, $pos) = $data;
+ if ($mode != 'xhtml') return false;
+
+ // no caching for dynamic content
+ $renderer->nocache();
+
+ // get the blog entries for our namespace
+ if ($my = plugin_load('helper', 'blog')) $entries = $my->getBlog($ns);
+
+ // use tag refinements?
+ if ($refine) {
+ if (plugin_isdisabled('tag') || (!$tag = plugin_load('helper', 'tag'))) {
+ msg($this->getLang('missing_tagplugin'), -1);
+ } else {
+ $entries = $tag->tagRefine($entries, $refine);
+ }
+ }
+
+ if (!$entries) return true; // nothing to display
+
+ // what to display
+ if(preg_match('/^\d\d\d\d-\d\d$/',$_REQUEST['blogarchive'])){
+ $now = $_REQUEST['blogarchive'];
+ }else{
+ $now = strftime('%Y-%m'); // current month
+ }
+ list($y,$m) = explode('-',$now);
+
+ // display the archive overview
+ $cnt = $this->_buildTimeChooser($renderer, $entries, $now);
+
+ $renderer->header($this->_posts($cnt,$m,$y),2,$pos);
+ $renderer->section_open(2);
+
+ // let Pagelist Plugin do the work for us
+ if (plugin_isdisabled('pagelist')
+ || (!$pagelist = plugin_load('helper', 'pagelist'))) {
+ msg($this->getLang('missing_pagelistplugin'), -1);
+ return false;
+ }
+ $pagelist->setFlags($flags);
+ $pagelist->startList();
+ foreach ($entries as $entry) {
+ $date = strftime('%Y-%m',$entry['date']);
+ // entry in the right date range?
+ if($date < $now || $date > $now) continue;
+ $pagelist->addPage($entry);
+ }
+ $renderer->doc .= $pagelist->finishList();
+
+ $renderer->section_close();
+ return true;
+
+ }
+
+ /**
+ * Creates a list of monthly archive links
+ *
+ * @param object reference $R - the XHTML renderer
+ * @param array reference $entries - all entries metadata
+ * @param string $now - currently selected month ('YYYY-MM')
+ * @return int - number of posts for selected month
+ */
+ function _buildTimeChooser(&$R, &$entries, $now){
+ global $ID;
+
+ // get the months where posts exist
+ $months = array();
+ foreach($entries as $entry){
+ $y = date('Y',$entry['date']);
+ $m = date('m',$entry['date']);
+ if(isset($months[$y][$m])) {
+ $months[$y][$m]++;
+ }else{
+ $months[$y][$m] = 1;
+ }
+ }
+
+ $ret = 0;
+ // output
+ $R->doc .= '<div class="autoarchive_selector">';
+ foreach($months as $y => $mdata){
+ $R->listu_open();
+ $R->listitem_open(1);
+ $R->listcontent_open();
+ $R->doc .= $y.'<span>:</span>';
+ $R->listcontent_close();
+ ksort($mdata);
+ foreach($mdata as $m => $cnt){
+ $R->listu_open();
+ $R->listitem_open(2);
+ $R->listcontent_open();
+ if("$y-$m" == $now) $R->doc .= '<span class="cur">';
+ $R->doc .= '<a href="'.wl($ID,array('blogarchive'=>"$y-$m")).'" class="wikilink1" title="'.$this->_posts($cnt,$m,$y).'">';
+ $R->doc .= $this->getLang('month_'.$m);
+ $R->doc .= '</a>';
+ if("$y-$m" == $now){
+ $R->doc .= '</span>';
+ $ret = $cnt;
+ }
+ $R->listcontent_close();
+ $R->listitem_close();
+ $R->listu_close();
+ }
+ $R->listitem_close();
+ $R->listu_close();
+ }
+ $R->doc .='</div>';
+ return $ret;
+ }
+
+ function _posts($num,$month,$year){
+ return sprintf($this->getLang('autoarchive'),
+ $num, $this->getLang("month_$month"),
+ $year);
+ }
+}
+// vim:ts=4:sw=4:et:enc=utf-8:
diff --git a/platform/www/lib/plugins/blog/syntax/blog.php b/platform/www/lib/plugins/blog/syntax/blog.php
new file mode 100644
index 0000000..2ca56d8
--- /dev/null
+++ b/platform/www/lib/plugins/blog/syntax/blog.php
@@ -0,0 +1,213 @@
+<?php
+/**
+ * Blog Plugin: displays a number of recent entries from the blog subnamespace
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Esther Brunner <wikidesign@gmail.com>
+ * @author Robert Rackl <wiki@doogie.de>
+ */
+
+class syntax_plugin_blog_blog extends DokuWiki_Syntax_Plugin {
+ private $included_pages = array();
+
+ function getType() { return 'substition'; }
+ function getPType() { return 'block'; }
+ function getSort() { return 307; }
+
+ function connectTo($mode) {
+ $this->Lexer->addSpecialPattern('\{\{blog>.*?\}\}',$mode,'plugin_blog_blog');
+ }
+
+ function handle($match, $state, $pos, Doku_Handler $handler) {
+ global $ID;
+
+ $match = substr($match, 7, -2); // strip {{blog> from start and }} from end
+ list($match, $flags) = explode('&', $match, 2);
+ $flags = explode('&', $flags);
+ array_unshift($flags, 'link'); // always make the first header of a blog entry a permalink (unless nolink is set)
+ list($match, $refine) = explode(' ', $match, 2);
+ list($ns, $num) = explode('?', $match, 2);
+
+ if (!is_numeric($num)) {
+ if (is_numeric($ns)) {
+ $num = $ns;
+ $ns = '';
+ } else {
+ $num = 5;
+ }
+ }
+
+ if ($ns == '') $ns = cleanID($this->getConf('namespace'));
+ elseif (($ns == '*') || ($ns == ':')) $ns = '';
+ elseif ($ns == '.') $ns = getNS($ID);
+ else $ns = cleanID($ns);
+
+ return array($ns, $num, $flags, $refine);
+ }
+
+ function render($mode, Doku_Renderer $renderer, $data) {
+ list($ns, $num, $flags, $refine) = $data;
+
+ $first = $_REQUEST['first'];
+ if (!is_numeric($first)) $first = 0;
+
+ // get the blog entries for our namespace
+ /** @var helper_plugin_blog $my */
+ if ($my = plugin_load('helper', 'blog')) $entries = $my->getBlog($ns);
+ else return false;
+
+ // use tag refinements?
+ if ($refine) {
+ /** @var helper_plugin_tag $tag */
+ if (plugin_isdisabled('tag') || (!$tag = plugin_load('helper', 'tag'))) {
+ msg($this->getLang('missing_tagplugin'), -1);
+ } else {
+ $entries = $tag->tagRefine($entries, $refine);
+ }
+ }
+
+ // Normalise flags
+ $blog_flags = $my->getFlags($flags);
+ $formpos = $blog_flags['formpos'];
+ $newentrytitle = $blog_flags['newentrytitle'];
+ $pagingcontrols = $blog_flags['pagingcontrols'];
+
+ if ($mode == 'xhtml') {
+ // prevent caching to ensure the included pages are always fresh
+ $renderer->nocache();
+ }
+
+ if (!$entries) {
+ if ((auth_quickaclcheck($ns.':*') >= AUTH_CREATE) && ($mode == 'xhtml')) {
+ if($formpos != 'none') $renderer->doc .= $this->_newEntryForm($ns, $newentrytitle);
+ }
+ return true; // nothing to display
+ }
+
+ // slice the needed chunk of pages
+ $isMore = count($entries) > ($first + $num);
+ $entries = array_slice($entries, $first, $num);
+
+ // load the include helper plugin
+ /** @var helper_plugin_include $include */
+ if (plugin_isdisabled('include') || (!$include = plugin_load('helper', 'include'))) {
+ msg($this->getLang('missing_includeplugin'), -1);
+ return false;
+ }
+
+ // current section level
+ $clevel = 0;
+
+ $perm_create = (auth_quickaclcheck($ns.':*') >= AUTH_CREATE);
+ $include_flags = $include->get_flags($flags);
+
+ if ($mode == 'xhtml') {
+ // show new entry form
+ if ($perm_create && $formpos == 'top') {
+ $renderer->doc .= $this->_newEntryForm($ns, $newentrytitle);
+ }
+
+ // get current section level
+ preg_match_all('|<div class="level(\d)">|i', $renderer->doc, $matches, PREG_SET_ORDER);
+ $n = count($matches)-1;
+ if ($n > -1) $clevel = $matches[$n][1];
+
+ // close current section
+ if ($clevel && !$include_flags['inline']) $renderer->doc .= '</div>'.DOKU_LF;
+ $renderer->doc .= '<div class="hfeed">'.DOKU_LF;
+ }
+
+
+ // now include the blog entries
+ foreach ($entries as $entry) {
+ if ($mode == 'xhtml' || $mode == 'code') {
+ if(auth_quickaclcheck($entry['id']) >= AUTH_READ) {
+ // prevent blog include loops
+ if(!$this->included_pages[$entry['id']]) {
+ $this->included_pages[$entry['id']] = true;
+ $renderer->nest($include->_get_instructions($entry['id'], '', 'page', $clevel, $include_flags));
+ $this->included_pages[$entry['id']] = false;
+ }
+ }
+ } elseif ($mode == 'metadata') {
+ /** @var Doku_Renderer_metadata $renderer */
+ $renderer->meta['relation']['haspart'][$entry['id']] = true;
+ }
+ }
+
+ if ($mode == 'xhtml') {
+ // resume the section
+ $renderer->doc .= '</div>'.DOKU_LF;
+ if ($clevel && !$include_flags['inline']) $renderer->doc .= '<div class="level'.$clevel.'">'.DOKU_LF;
+
+ // show older / newer entries links
+ if ($pagingcontrols) $renderer->doc .= $this->_browseEntriesLinks($isMore, $first, $num);
+
+ // show new entry form
+ if ($perm_create && $formpos == 'bottom') {
+ $renderer->doc .= $this->_newEntryForm($ns, $newentrytitle);
+ }
+ }
+
+ return in_array($mode, array('xhtml', 'metadata', 'code'));
+ }
+
+ /* ---------- (X)HTML Output Functions ---------- */
+
+ /**
+ * Displays links to older newer entries of the blog namespace
+ *
+ * @param $more
+ * @param $first
+ * @param $num
+ * @return string
+ */
+ function _browseEntriesLinks($more, $first, $num) {
+ global $ID;
+
+ $ret = '';
+ $last = $first+$num;
+ if ($first > 0) {
+ $first -= $num;
+ if ($first < 0) $first = 0;
+ $ret .= '<p class="centeralign">'.DOKU_LF.'<a href="'.wl($ID, 'first='.$first).'"'.
+ ' class="wikilink1">&lt;&lt; '.$this->getLang('newer').'</a>';
+ if ($more) $ret .= ' | ';
+ else $ret .= '</p>';
+ } else if ($more) {
+ $ret .= '<p class="centeralign">'.DOKU_LF;
+ }
+ if ($more) {
+ $ret .= '<a href="'.wl($ID, 'first='.$last).'" class="wikilink1">'.
+ $this->getLang('older').' &gt;&gt;</a>'.DOKU_LF.'</p>'.DOKU_LF;
+ }
+ return $ret;
+ }
+
+ /**
+ * Displays a form to enter the title of a new entry in the blog namespace
+ * and then open that page in the edit mode
+ *
+ * @param $ns
+ * @param $newentrytitle
+ * @return string
+ */
+ function _newEntryForm($ns, $newentrytitle) {
+ global $lang;
+ global $ID;
+
+ return '<div class="newentry_form">'.DOKU_LF.
+ '<form id="blog__newentry_form" method="post" action="'.script().'" accept-charset="'.$lang['encoding'].'">'.DOKU_LF.
+ DOKU_TAB.'<fieldset>'.DOKU_LF.
+ DOKU_TAB.DOKU_TAB.'<legend>'.hsc($newentrytitle).'</legend>'.DOKU_LF.
+ DOKU_TAB.DOKU_TAB.'<input type="hidden" name="id" value="'.$ID.'" />'.DOKU_LF.
+ DOKU_TAB.DOKU_TAB.'<input type="hidden" name="do" value="newentry" />'.DOKU_LF.
+ DOKU_TAB.DOKU_TAB.'<input type="hidden" name="ns" value="'.$ns.'" />'.DOKU_LF.
+ DOKU_TAB.DOKU_TAB.'<input class="edit" type="text" name="title" id="blog__newentry_title" size="40" tabindex="1" />'.DOKU_LF.
+ DOKU_TAB.DOKU_TAB.'<input class="button" type="submit" value="'.$lang['btn_create'].'" tabindex="2" />'.DOKU_LF.
+ DOKU_TAB.'</fieldset>'.DOKU_LF.
+ '</form>'.DOKU_LF.
+ '</div>'.DOKU_LF;
+ }
+}
+// vim:ts=4:sw=4:et:enc=utf-8:
diff --git a/platform/www/lib/plugins/blog/syntax/draft.php b/platform/www/lib/plugins/blog/syntax/draft.php
new file mode 100644
index 0000000..239f0c2
--- /dev/null
+++ b/platform/www/lib/plugins/blog/syntax/draft.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Blog Plugin, draft component: marks the current page as draft
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Esther Brunner <wikidesign@gmail.com>
+ */
+
+class syntax_plugin_blog_draft extends DokuWiki_Syntax_Plugin {
+
+ function getType() { return 'substition'; }
+ function getSort() { return 99; }
+
+ function connectTo($mode) {
+ $this->Lexer->addSpecialPattern('~~DRAFT~~', $mode, 'plugin_blog_draft');
+ }
+
+ function handle($match, $state, $pos, Doku_Handler $handler) {
+ return true;
+ }
+
+ /**
+ * The only thing this plugin component does is to set the metadata 'type' to 'draft'
+ */
+ function render($mode, Doku_Renderer $renderer, $data) {
+ if ($mode == 'xthml') {
+ return true; // don't output anything
+ } elseif ($mode == 'metadata') {
+ $renderer->meta['type'] = 'draft';
+ }
+ }
+}
+// vim:ts=4:sw=4:et:enc=utf-8:
diff --git a/platform/www/lib/plugins/pagelist/COPYING b/platform/www/lib/plugins/pagelist/COPYING
new file mode 100644
index 0000000..d60c31a
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/platform/www/lib/plugins/pagelist/README b/platform/www/lib/plugins/pagelist/README
new file mode 100644
index 0000000..ad864dc
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/README
@@ -0,0 +1,9 @@
+====== Pagelist Plugin for DokuWiki ======
+
+All documentation for the Pagelist Plugin is available online at:
+
+ * http://dokuwiki.org/plugin:pagelist
+
+(c) 2005 - 2007 by Esther Brunner <wikidesign@gmail.com>
+(c) 2008 - 2010 by Gina Häußge, Michael Klier <dokuwiki@chimeric.de>
+See COPYING for license info.
diff --git a/platform/www/lib/plugins/pagelist/conf/default.php b/platform/www/lib/plugins/pagelist/conf/default.php
new file mode 100644
index 0000000..ba1468b
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/conf/default.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ * Options for the Pagelist Plugin
+ */
+$conf['style'] = 'default';
+$conf['showheader'] = 0;
+$conf['showdate'] = 1;
+$conf['showuser'] = 1;
+$conf['showdesc'] = 0;
+$conf['showcomments'] = 0;
+$conf['showlinkbacks']= 0;
+$conf['showtags'] = 0;
+$conf['showfirsthl'] = 1;
+$conf['showimage'] = 0;
+$conf['showdiff'] = 0;
+$conf['sort'] = 0;
+$conf['rsort'] = 0;
+
+//Setup VIM: ex: et ts=2 :
diff --git a/platform/www/lib/plugins/pagelist/conf/metadata.php b/platform/www/lib/plugins/pagelist/conf/metadata.php
new file mode 100644
index 0000000..4f32bf5
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/conf/metadata.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Metadata for configuration manager plugin
+ * Additions for the Pagelist Plugin
+ *
+ * @author Esther Brunner <wikidesign@gmail.com>
+ */
+
+$meta['style'] = array('multichoice',
+ '_choices' => array('default', 'table', 'list', 'simplelist'));
+$meta['showheader'] = array('onoff');
+$meta['showdate'] = array('multichoice', '_choices' => array('0', '1', '2'));
+$meta['showuser'] = array('multichoice', '_choices' => array('0', '1', '2'));
+$meta['showdesc'] = array('multichoice', '_choices' => array('0', '160', '500'));
+$meta['showcomments'] = array('onoff');
+$meta['showlinkbacks']= array('onoff');
+$meta['showtags'] = array('onoff');
+$meta['showfirsthl'] = array('onoff');
+$meta['showimage'] = array('onoff');
+$meta['showdiff'] = array('onoff');
+$meta['sort'] = array('onoff');
+$meta['rsort'] = array('onoff');
+
+//Setup VIM: ex: et ts=2 :
diff --git a/platform/www/lib/plugins/pagelist/helper.php b/platform/www/lib/plugins/pagelist/helper.php
new file mode 100644
index 0000000..4ed425b
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/helper.php
@@ -0,0 +1,448 @@
+<?php
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Esther Brunner <wikidesign@gmail.com>
+ * @author Gina Häußge <osd@foosel.net>
+ */
+
+class helper_plugin_pagelist extends DokuWiki_Plugin {
+
+ /* public */
+
+ var $page = NULL; // associative array for page to list
+ // must contain a value to key 'id'
+ // can contain: 'title', 'date', 'user', 'desc', 'comments',
+ // 'tags', 'status' and 'priority'
+
+ var $style = ''; // table style: 'default', 'table', 'list'
+ var $showheader = false; // show a heading line
+ var $column = array(); // which columns to show
+ var $header = array(); // language strings for table headers
+ var $sort = false; // alphabetical sort of pages by pagename
+ var $rsort = false; // reverse alphabetical sort of pages by pagename
+
+ var $plugins = array(); // array of plugins to extend the pagelist
+ var $discussion = NULL; // discussion class object
+ var $tag = NULL; // tag class object
+
+ var $doc = ''; // the final output XHTML string
+
+ /* private */
+
+ var $_meta = NULL; // metadata array for page
+
+ /**
+ * Constructor gets default preferences
+ *
+ * These can be overriden by plugins using this class
+ */
+ function __construct() {
+ $this->style = $this->getConf('style');
+ $this->showheader = $this->getConf('showheader');
+ $this->showfirsthl = $this->getConf('showfirsthl');
+ $this->sort = $this->getConf('sort');
+ $this->rsort = $this->getConf('rsort');
+
+ $this->column = array(
+ 'page' => true,
+ 'date' => $this->getConf('showdate'),
+ 'user' => $this->getConf('showuser'),
+ 'desc' => $this->getConf('showdesc'),
+ 'comments' => $this->getConf('showcomments'),
+ 'linkbacks'=> $this->getConf('showlinkbacks'),
+ 'tags' => $this->getConf('showtags'),
+ 'image' => $this->getConf('showimage'),
+ 'diff' => $this->getConf('showdiff'),
+ );
+
+ $this->plugins = array(
+ 'discussion' => 'comments',
+ 'linkback' => 'linkbacks',
+ 'tag' => 'tags',
+ 'pageimage' => 'image',
+ );
+ }
+
+ function getMethods() {
+ $result = array();
+ $result[] = array(
+ 'name' => 'addColumn',
+ 'desc' => 'adds an extra column for plugin data',
+ 'params' => array(
+ 'plugin name' => 'string',
+ 'column key' => 'string'),
+ );
+ $result[] = array(
+ 'name' => 'setFlags',
+ 'desc' => 'overrides standard values for showfooter and firstseconly settings',
+ 'params' => array('flags' => 'array'),
+ 'return' => array('success' => 'boolean'),
+ );
+ $result[] = array(
+ 'name' => 'startList',
+ 'desc' => 'prepares the table header for the page list',
+ );
+ $result[] = array(
+ 'name' => 'addPage',
+ 'desc' => 'adds a page to the list',
+ 'params' => array("page attributes, 'id' required, others optional" => 'array'),
+ );
+ $result[] = array(
+ 'name' => 'finishList',
+ 'desc' => 'returns the XHTML output',
+ 'return' => array('xhtml' => 'string'),
+ );
+ return $result;
+ }
+
+ /**
+ * Adds an extra column for plugins
+ */
+ function addColumn($plugin, $col) {
+ $this->plugins[$plugin] = $col;
+ $this->column[$col] = true;
+ }
+
+ /**
+ * Overrides standard values for style, showheader and show(column) settings
+ */
+ function setFlags($flags) {
+ if (!is_array($flags)) return false;
+
+ $columns = array('date', 'user', 'desc', 'comments', 'linkbacks', 'tags', 'image', 'diff');
+ foreach ($flags as $flag) {
+ switch ($flag) {
+ case 'default':
+ $this->style = 'default';
+ break;
+ case 'table':
+ $this->style = 'table';
+ break;
+ case 'list':
+ $this->style = 'list';
+ break;
+ case 'simplelist':
+ $this->style = 'simplelist'; // Displays pagenames only, no other information
+ break;
+ case 'header':
+ $this->showheader = true;
+ break;
+ case 'noheader':
+ $this->showheader = false;
+ break;
+ case 'firsthl':
+ $this->showfirsthl = true;
+ break;
+ case 'nofirsthl':
+ $this->showfirsthl = false;
+ break;
+ case 'sort':
+ $this->sort = true;
+ $this->rsort = false;
+ break;
+ case 'rsort':
+ $this->sort = false;
+ $this->rsort = true;
+ break;
+ case 'nosort':
+ $this->sort = false;
+ $this->rsort = false;
+ break;
+ case 'showdiff':
+ $flag = 'diff';
+ break;
+ }
+
+ if (substr($flag, 0, 2) == 'no') {
+ $value = false;
+ $flag = substr($flag, 2);
+ } else {
+ $value = true;
+ }
+
+ if (in_array($flag, $columns)) $this->column[$flag] = $value;
+ }
+ return true;
+ }
+
+ /**
+ * Sets the list header
+ */
+ function startList($callerClass=NULL) {
+
+ // table style
+ switch ($this->style) {
+ case 'table':
+ $class = 'inline';
+ break;
+ case 'list':
+ $class = 'ul';
+ break;
+ case 'simplelist':
+ $class = false;
+ break;
+ default:
+ $class = 'pagelist';
+ }
+
+ if($class) {
+ if ($callerClass) {
+ $class .= ' '.$callerClass;
+ }
+ $this->doc = '<div class="table">'.DOKU_LF.'<table class="'.$class.'">'.DOKU_LF;
+ } else {
+ // Simplelist is enabled; Skip header and firsthl
+ $this->showheader = false;
+ $this->showfirsthl = false;
+ //$this->doc .= DOKU_LF.DOKU_TAB.'</tr>'.DOKU_LF;
+ $this->doc = '<ul>';
+ }
+
+ $this->page = NULL;
+
+ // check if some plugins are available - if yes, load them!
+ foreach ($this->plugins as $plug => $col) {
+ if (!$this->column[$col]) continue;
+ if (plugin_isdisabled($plug) || (!$this->$plug = plugin_load('helper', $plug)))
+ $this->column[$col] = false;
+ }
+
+ // header row
+ if ($this->showheader) {
+ $this->doc .= DOKU_TAB.'<tr>'.DOKU_LF.DOKU_TAB.DOKU_TAB;
+ $columns = array('page', 'date', 'user', 'desc', 'diff');
+ if ($this->column['image']) {
+ if (!$this->header['image']) $this->header['image'] = hsc($this->pageimage->th());
+ $this->doc .= '<th class="images">'.$this->header['image'].'</th>';
+ }
+ foreach ($columns as $col) {
+ if ($this->column[$col]) {
+ if (!$this->header[$col]) $this->header[$col] = hsc($this->getLang($col));
+ $this->doc .= '<th class="'.$col.'">'.$this->header[$col].'</th>';
+ }
+ }
+ foreach ($this->plugins as $plug => $col) {
+ if ($this->column[$col] && $col != 'image') {
+ if (!$this->header[$col]) $this->header[$col] = hsc($this->$plug->th());
+ $this->doc .= '<th class="'.$col.'">'.$this->header[$col].'</th>';
+ }
+ }
+ $this->doc .= DOKU_LF.DOKU_TAB.'</tr>'.DOKU_LF;
+ }
+ return true;
+ }
+
+ /**
+ * Sets a list row
+ */
+ function addPage($page) {
+
+ $id = $page['id'];
+ if (!$id) return false;
+ $this->page = $page;
+ $this->_meta = NULL;
+
+ if($this->style != 'simplelist') {
+ // priority and draft
+ if (!isset($this->page['draft'])) {
+ $this->page['draft'] = ($this->_getMeta('type') == 'draft');
+ }
+ $class = '';
+ if (isset($this->page['priority'])) $class .= 'priority'.$this->page['priority']. ' ';
+ if ($this->page['draft']) $class .= 'draft ';
+ if ($this->page['class']) $class .= $this->page['class'];
+ if(!empty($class)) $class = ' class="' . $class . '"';
+
+ $this->doc .= DOKU_TAB.'<tr'.$class.'>'.DOKU_LF;
+ if ($this->column['image']) $this->_pluginCell('pageimage','image',$id);
+ $this->_pageCell($id);
+ if ($this->column['date']) $this->_dateCell();
+ if ($this->column['user']) $this->_userCell();
+ if ($this->column['desc']) $this->_descCell();
+ if ($this->column['diff']) $this->_diffCell($id);
+ foreach ($this->plugins as $plug => $col) {
+ if ($this->column[$col] && $col != 'image') $this->_pluginCell($plug, $col, $id);
+ }
+
+ $this->doc .= DOKU_TAB.'</tr>'.DOKU_LF;
+ } else {
+ $class = '';
+ // simplelist is enabled; just output pagename
+ $this->doc .= DOKU_TAB . '<li>' . DOKU_LF;
+ if(page_exists($id)) $class = 'wikilink1';
+ else $class = 'wikilink2';
+
+ if (!$this->page['title']) $this->page['title'] = str_replace('_', ' ', noNS($id));
+ $title = hsc($this->page['title']);
+
+ $content = '<a href="'.wl($id).'" class="'.$class.'" title="'.$id.'">'.$title.'</a>';
+ $this->doc .= $content;
+ $this->doc .= DOKU_TAB . '</li>' . DOKU_LF;
+ }
+
+ return true;
+ }
+
+ /**
+ * Sets the list footer
+ */
+ function finishList() {
+ if($this->style != 'simplelist') {
+ if (!isset($this->page)) $this->doc = '';
+ else $this->doc .= '</table>'.DOKU_LF.'</div>'.DOKU_LF;
+ } else {
+ $this->doc .= '</ul>' . DOKU_LF;
+ }
+
+ // reset defaults
+ $this->__construct();
+
+ return $this->doc;
+ }
+
+ /* ---------- Private Methods ---------- */
+
+ /**
+ * Page title / link to page
+ */
+ function _pageCell($id) {
+
+ // check for page existence
+ if (!isset($this->page['exists'])) {
+ if (!isset($this->page['file'])) $this->page['file'] = wikiFN($id);
+ $this->page['exists'] = @file_exists($this->page['file']);
+ }
+ if ($this->page['exists']) $class = 'wikilink1';
+ else $class = 'wikilink2';
+
+ // handle image and text titles
+ if ($this->page['titleimage']) {
+ $title = '<img src="'.ml($this->page['titleimage']).'" class="media"';
+ if ($this->page['title']) $title .= ' title="'.hsc($this->page['title']).'"'.
+ ' alt="'.hsc($this->page['title']).'"';
+ $title .= ' />';
+ } else {
+ if($this->showfirsthl) {
+ $this->page['title'] = $this->_getMeta('title');
+ } else {
+ $this->page['title'] = $id;
+ }
+
+ if (!$this->page['title']) $this->page['title'] = str_replace('_', ' ', noNS($id));
+ $title = hsc($this->page['title']);
+ }
+
+ // produce output
+ $content = '<a href="'.wl($id).($this->page['section'] ? '#'.$this->page['section'] : '').
+ '" class="'.$class.'" title="'.$id.'">'.$title.'</a>';
+ if ($this->style == 'list') $content = '<ul><li>'.$content.'</li></ul>';
+ return $this->_printCell('page', $content);
+ }
+
+ /**
+ * Date - creation or last modification date if not set otherwise
+ */
+ function _dateCell() {
+ global $conf;
+
+ if($this->column['date'] == 2) {
+ $this->page['date'] = $this->_getMeta(array('date', 'modified'));
+ } elseif(!$this->page['date'] && $this->page['exists']) {
+ $this->page['date'] = $this->_getMeta(array('date', 'created'));
+ }
+
+ if ((!$this->page['date']) || (!$this->page['exists'])) {
+ return $this->_printCell('date', '');
+ } else {
+ return $this->_printCell('date', dformat($this->page['date'], $conf['dformat']));
+ }
+ }
+
+ /**
+ * User - page creator or contributors if not set otherwise
+ */
+ function _userCell() {
+ if (!array_key_exists('user', $this->page)) {
+ if ($this->column['user'] == 2) {
+ $users = $this->_getMeta('contributor');
+ if (is_array($users)) $this->page['user'] = join(', ', $users);
+ } else {
+ $this->page['user'] = $this->_getMeta('creator');
+ }
+ }
+ return $this->_printCell('user', hsc($this->page['user']));
+ }
+
+ /**
+ * Description - (truncated) auto abstract if not set otherwise
+ */
+ function _descCell() {
+ if (array_key_exists('desc', $this->page)) {
+ $desc = $this->page['desc'];
+ } elseif (strlen($this->page['description']) > 0) {
+ // This condition will become true, when a page-description is given
+ // inside the syntax-block
+ $desc = $this->page['description'];
+ } else {
+ $desc = $this->_getMeta(array('description', 'abstract'));
+ }
+
+ $max = $this->column['desc'];
+ if (($max > 1) && (utf8_strlen($desc) > $max)) $desc = utf8_substr($desc, 0, $max).'…';
+ return $this->_printCell('desc', hsc($desc));
+ }
+
+ /**
+ * Diff icon / link to diff page
+ */
+ function _diffCell($id) {
+ // check for page existence
+ if (!isset($this->page['exists'])) {
+ if (!isset($this->page['file'])) $this->page['file'] = wikiFN($id);
+ $this->page['exists'] = @file_exists($this->page['file']);
+ }
+
+ // produce output
+ $url_params = array();
+ $url_params ['do'] = 'diff';
+ $content = '<a href="'.wl($id, $url_params).($this->page['section'] ? '#'.$this->page['section'] : '').'" class="diff_link">
+<img src="/lib/images/diff.png" width="15" height="11" title="'.hsc($this->getLang('diff_title')).'" alt="'.hsc($this->getLang('diff_alt')).'"/>
+</a>';
+ return $this->_printCell('page', $content);
+ }
+
+ /**
+ * Plugins - respective plugins must be installed!
+ */
+ function _pluginCell($plug, $col, $id) {
+ if (!isset($this->page[$col])) $this->page[$col] = $this->$plug->td($id);
+ return $this->_printCell($col, $this->page[$col]);
+ }
+
+ /**
+ * Produce XHTML cell output
+ */
+ function _printCell($class, $content) {
+ if (!$content) {
+ $content = '&nbsp;';
+ $empty = true;
+ } else {
+ $empty = false;
+ }
+ $this->doc .= DOKU_TAB.DOKU_TAB.'<td class="'.$class.'">'.$content.'</td>'.DOKU_LF;
+ return (!$empty);
+ }
+
+
+ /**
+ * Get default value for an unset element
+ */
+ function _getMeta($key) {
+ if (!$this->page['exists']) return false;
+ if (!isset($this->_meta)) $this->_meta = p_get_metadata($this->page['id'], '', METADATA_RENDER_USING_CACHE);
+ if (is_array($key)) return $this->_meta[$key[0]][$key[1]];
+ else return $this->_meta[$key];
+ }
+
+}
+// vim:ts=4:sw=4:et:
diff --git a/platform/www/lib/plugins/pagelist/lang/ar/lang.php b/platform/www/lib/plugins/pagelist/lang/ar/lang.php
new file mode 100644
index 0000000..6a77ad9
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/ar/lang.php
@@ -0,0 +1,16 @@
+<?php
+/**
+* Arabic language file
+*
+* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+* @author Muhammad Bashir Al-Noimi <bashir.storm@gmail.com>
+* http://www.hali-sy.com
+*/
+
+// custom language strings for the plugin
+$lang['page'] = 'الصفحة';
+$lang['date'] = 'التاريخ';
+$lang['user'] = 'المستخدم';
+$lang['desc'] = 'الوصف';
+
+//Setup VIM: ex: et ts=2 enc=utf-8 :
diff --git a/platform/www/lib/plugins/pagelist/lang/ar/settings.php b/platform/www/lib/plugins/pagelist/lang/ar/settings.php
new file mode 100644
index 0000000..b209277
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/ar/settings.php
@@ -0,0 +1,32 @@
+<?php
+/**
+* Arabic language file
+*
+* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+* @author Muhammad Bashir Al-Noimi <bashir.storm@gmail.com>
+* http://www.hali-sy.com
+*/
+
+// for the configuration manager
+$lang['style'] = 'شكل جدول قائمة الصفحات';
+$lang['style_o_default'] = 'إفتراضي';
+$lang['style_o_table'] = 'جدول';
+$lang['style_o_list'] = 'قائمة';
+
+$lang['showheader'] = 'عرض شريط الترويسة';
+$lang['showdate'] = 'عرض عمود التاريخ';
+$lang['showdate_o_0'] = 'إخفاء';
+$lang['showdate_o_1'] = 'تاريخ الإنشاء';
+$lang['showdate_o_2'] = 'تاريخ التعديل';
+$lang['showuser'] = 'عرض عمود المستخدم';
+$lang['showuser_o_0'] = 'إخفاء';
+$lang['showuser_o_1'] = 'المنشئ';
+$lang['showuser_o_2'] = 'المساهمون';
+$lang['showdesc'] = 'عرض عمود الوصف';
+$lang['showdesc_o_0'] = 'إخفاء';
+$lang['showdesc_o_160'] = 'أكثر عدد 160 محرف';
+$lang['showdesc_o_500'] = 'أكثر عدد 500 محرف';
+$lang['showcomments'] = 'عرض عمود التعليقات';
+$lang['showtags'] = 'عرض عمود الأقسامn';
+
+//Setup VIM: ex: et ts=2 enc=utf-8 :
diff --git a/platform/www/lib/plugins/pagelist/lang/bg/lang.php b/platform/www/lib/plugins/pagelist/lang/bg/lang.php
new file mode 100644
index 0000000..05881d1
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/bg/lang.php
@@ -0,0 +1,14 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Kiril <neohidra@gmail.com>
+ */
+$lang['page'] = 'Страница';
+$lang['date'] = 'Дата';
+$lang['user'] = 'Потребител';
+$lang['desc'] = 'Описание';
+$lang['diff'] = 'Разлики';
+$lang['diff_title'] = 'Покажи разликите с текущата версия';
+$lang['diff_alt'] = 'Покажи разликите с текущата версия';
diff --git a/platform/www/lib/plugins/pagelist/lang/bg/settings.php b/platform/www/lib/plugins/pagelist/lang/bg/settings.php
new file mode 100644
index 0000000..22f8787
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/bg/settings.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Kiril <neohidra@gmail.com>
+ */
+$lang['style'] = 'Стил';
+$lang['style_o_default'] = 'стандартен';
+$lang['style_o_table'] = 'табличен';
+$lang['style_o_list'] = 'таблица/списък';
+$lang['style_o_simple'] = 'списък';
+$lang['showheader'] = 'Показване на заглавния ред';
+$lang['showdate'] = 'Показване на колона за дата';
+$lang['showdate_o_0'] = 'скрий';
+$lang['showdate_o_1'] = 'дата на създаване';
+$lang['showdate_o_2'] = 'дата на редактиране';
+$lang['showuser'] = 'Показване на колона за потребител';
+$lang['showuser_o_0'] = 'скрий';
+$lang['showuser_o_1'] = 'създател';
+$lang['showuser_o_2'] = 'допринесли';
+$lang['showdesc'] = 'Показване на колона за описание';
+$lang['showdesc_o_0'] = 'скрий';
+$lang['showdesc_o_160'] = 'максимум 160 символа';
+$lang['showdesc_o_500'] = 'максимум 500 символа';
+$lang['showcomments'] = 'Показвай колона за коментари (изисква приставката Discussion)';
+$lang['showlinkbacks'] = 'Показвай колона за linkbacks (изисква приставката Linkback )';
+$lang['showtags'] = 'Показвай колона за етикети (изисква приставката Tag)';
+$lang['showfirsthl'] = 'Показвай първото заглавие вместо името на страницата';
+$lang['showdiff'] = 'Показвай линк към страница с разликите';
+$lang['sort'] = 'Сортиране на страниците по име на страница';
+$lang['rsort'] = 'Обратен ред на сортиране по име на страница';
diff --git a/platform/www/lib/plugins/pagelist/lang/ckb/lang.php b/platform/www/lib/plugins/pagelist/lang/ckb/lang.php
new file mode 100644
index 0000000..bc62a67
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/ckb/lang.php
@@ -0,0 +1,14 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author qezwan <qezwan@gmail.com>
+ */
+$lang['page'] = 'پەڕە';
+$lang['date'] = 'بەروار';
+$lang['user'] = 'بەکارهێنەر';
+$lang['desc'] = 'وەسف';
+$lang['diff'] = 'جیاوازیەکان';
+$lang['diff_title'] = 'جیاوازیەکان نیشان بدە بۆ پێداچوونەوەکانی ئێستا';
+$lang['diff_alt'] = 'جیاوازیەکان نیشان بدە بۆ پێداچوونەوەکانی ئێستا';
diff --git a/platform/www/lib/plugins/pagelist/lang/ckb/settings.php b/platform/www/lib/plugins/pagelist/lang/ckb/settings.php
new file mode 100644
index 0000000..54ebf7e
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/ckb/settings.php
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author qezwan <qezwan@gmail.com>
+ */
+$lang['style'] = 'شێوازی لیستی لاپەڕە';
+$lang['style_o_default'] = 'بنەڕەت';
+$lang['style_o_table'] = 'خشتە';
+$lang['style_o_list'] = 'خشتە/لیست';
+$lang['style_o_simple'] = 'لیستی سادە';
+$lang['showheader'] = 'پیشاندانی هێڵی ناونیشان';
+$lang['showdate'] = 'ستوونی بەروار پیشان بدە';
+$lang['showdate_o_0'] = 'بشارەوە';
+$lang['showdate_o_1'] = 'بەرواری دروست کردن';
+$lang['showdate_o_2'] = 'بەرواری هەموارکردن';
+$lang['showuser'] = 'ستوونی بەکارهێنەر نیشان بدە';
+$lang['showuser_o_0'] = 'بشارەوە';
+$lang['showuser_o_1'] = 'دروستکەر';
+$lang['showuser_o_2'] = 'بەشداران';
+$lang['showdesc'] = 'پیشاندانی ستوونی وەسف';
+$lang['showdesc_o_0'] = 'بشارەوە';
+$lang['showdesc_o_160'] = 'زۆرینە. 160 نووسە';
+$lang['showdesc_o_500'] = 'زۆرینە. 500 نووسە';
+$lang['showcomments'] = 'ستوونی سەرنجەکان نیشان بدە (پێوەکراوی گفتوگۆ پێویستە)';
+$lang['showlinkbacks'] = 'ستوونی linkback نیشان بدە (پێوەکراوی Linkback پێویستە)';
+$lang['showtags'] = 'نیشاندانی ستوونی تاگەکان (تاگی پێوەکراو پێویستە)';
+$lang['showfirsthl'] = 'یەکەم سەردێڕ نیشان بدە لەجیاتی ناوی لاپەڕەکە';
+$lang['showimage'] = 'پیشاندانی ستوونی وێنە (پێوەکراوی Pageimage پێویستە)';
+$lang['showdiff'] = 'نیشاندانی لینک بۆ لاپەڕەی جیاکراوە';
+$lang['sort'] = 'پۆلێنکردنی پەڕەکان بەپێی ناوی لاپەڕە';
+$lang['rsort'] = 'پێچەوانەکردنی لاپەڕەکان بەپێی ناوی لاپەڕە';
diff --git a/platform/www/lib/plugins/pagelist/lang/cs/lang.php b/platform/www/lib/plugins/pagelist/lang/cs/lang.php
new file mode 100644
index 0000000..1873bc3
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/cs/lang.php
@@ -0,0 +1,15 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Lukas Zapletal <lukas.zapletal at gmail dot com>
+ * @author Roman Svoboda <svoboro1@fel.cvut.cz>
+ */
+$lang['page'] = 'Stránka';
+$lang['date'] = 'Datum';
+$lang['user'] = 'Uživatel';
+$lang['desc'] = 'Popis';
+$lang['diff'] = 'Rozdíly';
+$lang['diff_title'] = 'Zobrazit rozdíly vůči aktuální verzi';
+$lang['diff_alt'] = 'Zobrazit rozdíly vůči aktuální verzi';
diff --git a/platform/www/lib/plugins/pagelist/lang/cs/settings.php b/platform/www/lib/plugins/pagelist/lang/cs/settings.php
new file mode 100644
index 0000000..b605cdc
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/cs/settings.php
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Petr Kajzar <petr.kajzar@centrum.cz>
+ * @author Lukas Zapletal <lukas.zapletal at gmail dot com>
+ * @author Jaroslav Lichtblau <jlichtblau@seznam.cz>
+ * @author Roman Svoboda <svoboro1@fel.cvut.cz>
+ */
+$lang['style'] = 'Styl seznamu stránek';
+$lang['style_o_default'] = 'implicitní';
+$lang['style_o_table'] = 'tabulka';
+$lang['style_o_list'] = 'seznam';
+$lang['style_o_simple'] = 'jednoduchý seznam';
+$lang['showheader'] = 'zobrazovat čáru pod nadpisem';
+$lang['showdate'] = 'zobrazovat sloupec s datem';
+$lang['showdate_o_0'] = 'nezobrazovat';
+$lang['showdate_o_1'] = 'datum vytvoření';
+$lang['showdate_o_2'] = 'datum poslední změny';
+$lang['showuser'] = 'zobrazovat sloupec s uživatelem';
+$lang['showuser_o_0'] = 'nezobrazovat';
+$lang['showuser_o_1'] = 'autor';
+$lang['showuser_o_2'] = 'přispěvovatelé';
+$lang['showdesc'] = 'zobrazovat sloupec s popisem';
+$lang['showdesc_o_0'] = 'nezobrazovat';
+$lang['showdesc_o_160'] = 'max. 160 znaků';
+$lang['showdesc_o_500'] = 'max. 500 znaků';
+$lang['showcomments'] = 'zobrazovat sloupec s komentáři (vyžadován Discussion plugin)';
+$lang['showlinkbacks'] = 'zobrazit linkback sloupec (vyžaduje modul Linkback)';
+$lang['showtags'] = 'zobrazovat sloupec s tagy (vyžadován Tag plugin)';
+$lang['showfirsthl'] = 'zobrazit první nadpis místo jména stránky';
+$lang['showimage'] = 'zobrazovat sloupec s obrázkem (nutný plugin Pageimage)';
+$lang['showdiff'] = 'zobrazit odkaz na stránku diff';
+$lang['sort'] = 'řadit stránky dle jejich jména';
+$lang['rsort'] = 'řadit stránky zpětně dle jejich jména';
diff --git a/platform/www/lib/plugins/pagelist/lang/cy/lang.php b/platform/www/lib/plugins/pagelist/lang/cy/lang.php
new file mode 100644
index 0000000..576af32
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/cy/lang.php
@@ -0,0 +1,14 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Alan Davies <ben.brynsadler@gmail.com>
+ */
+$lang['page'] = 'Tudalen';
+$lang['date'] = 'Dyddiad';
+$lang['user'] = 'Defnyddiwr';
+$lang['desc'] = 'Disgrifiad';
+$lang['diff'] = 'Gwahaniaethau';
+$lang['diff_title'] = 'Dangos gwahaniaethau i adolygiadau cyfredol';
+$lang['diff_alt'] = 'Dangos gwahaniaethau i adolygiadau cyfredol';
diff --git a/platform/www/lib/plugins/pagelist/lang/cy/settings.php b/platform/www/lib/plugins/pagelist/lang/cy/settings.php
new file mode 100644
index 0000000..2846321
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/cy/settings.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Alan Davies <ben.brynsadler@gmail.com>
+ */
+$lang['style'] = 'Arddull y rhestr tudalennau';
+$lang['style_o_default'] = 'diofyn';
+$lang['style_o_table'] = 'tabl';
+$lang['style_o_list'] = 'tabl/rhestr';
+$lang['style_o_simple'] = 'rhestr syml';
+$lang['showheader'] = 'dangos llinell pennawd';
+$lang['showdate'] = 'dangos colofn dyddiad';
+$lang['showdate_o_0'] = 'cyddio';
+$lang['showdate_o_1'] = 'dyddiad creu';
+$lang['showdate_o_2'] = 'dyddiad newid';
+$lang['showuser'] = 'dangos colofn defnyddiwr';
+$lang['showuser_o_0'] = 'cuddio';
+$lang['showuser_o_1'] = 'crëwr';
+$lang['showuser_o_2'] = 'cyfranwyr';
+$lang['showdesc'] = 'dangos colofn disgrifiad';
+$lang['showdesc_o_0'] = 'cuddio';
+$lang['showdesc_o_160'] = 'uchaf. 160 nod';
+$lang['showdesc_o_500'] = 'uchaf. 500 nod';
+$lang['showcomments'] = 'dangos colofn sylwadau (angen Ategyn \'Discussion\')';
+$lang['showlinkbacks'] = 'dangos colofn olgysylltiadau (angen Ategyn \'Linkback\')';
+$lang['showtags'] = 'dangos colofn tagiau (angen Ategyn \'Tag\')';
+$lang['showfirsthl'] = 'dangos y pennawd cyntaf yn hytrach nag enw\'r dudalen';
+$lang['showdiff'] = 'dangos y ddolen i\'r dudalen gwahaniaethau';
+$lang['sort'] = 'trefnu tudalennau gan enw tudalen';
+$lang['rsort'] = 'cildroi trefnu tudalennau gan enw tudalen';
diff --git a/platform/www/lib/plugins/pagelist/lang/da/lang.php b/platform/www/lib/plugins/pagelist/lang/da/lang.php
new file mode 100644
index 0000000..2e37a4a
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/da/lang.php
@@ -0,0 +1,14 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Jacob Palm <jacobpalmdk@icloud.com>
+ */
+$lang['page'] = 'Side';
+$lang['date'] = 'Dato';
+$lang['user'] = 'Bruger';
+$lang['desc'] = 'Beskrivelse';
+$lang['diff'] = 'Forskelle';
+$lang['diff_title'] = 'Vis forskelle fra nuværende revisioner';
+$lang['diff_alt'] = 'Vis forskelle fra nuværende revisioner';
diff --git a/platform/www/lib/plugins/pagelist/lang/da/settings.php b/platform/www/lib/plugins/pagelist/lang/da/settings.php
new file mode 100644
index 0000000..2f9bd7a
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/da/settings.php
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Jacob Palm <jacobpalmdk@icloud.com>
+ */
+$lang['style'] = 'Stil til sideliste';
+$lang['style_o_default'] = 'standard';
+$lang['style_o_table'] = 'tabel';
+$lang['style_o_list'] = 'tabel/liste';
+$lang['style_o_simple'] = 'simpel liste';
+$lang['showheader'] = 'vis overskriftslinje';
+$lang['showdate'] = 'vis datokolonne';
+$lang['showdate_o_0'] = 'skjul';
+$lang['showdate_o_1'] = 'oprettelsesdato';
+$lang['showdate_o_2'] = 'ændringsdato';
+$lang['showuser'] = 'vis brugerkolonne';
+$lang['showuser_o_0'] = 'skjul';
+$lang['showuser_o_1'] = 'forfatter';
+$lang['showuser_o_2'] = 'bidragsydere';
+$lang['showdesc'] = 'vis beskrivelseskolonne';
+$lang['showdesc_o_0'] = 'skjul';
+$lang['showdesc_o_160'] = 'maksimalt 160 tegn';
+$lang['showdesc_o_500'] = 'maksimalt 500 tegn';
+$lang['showcomments'] = 'vis kommentarkolonne (Diskussion udvidelse påkrævet)';
+$lang['showlinkbacks'] = 'vis linkback kolonne (Linkback udvidelse påkrævet)';
+$lang['showtags'] = 'vis tagkolonne (Tag udvidelse påkrævet)';
+$lang['showfirsthl'] = 'vis første overskrift i stedet for sidenavn';
+$lang['showimage'] = 'vis billedkolonne (Pageimage plugin påkrævet)';
+$lang['showdiff'] = 'vis link til difference siden';
+$lang['sort'] = 'sorter sider efter sidenavn';
+$lang['rsort'] = 'sorter sider omvendt efter sidenavn';
diff --git a/platform/www/lib/plugins/pagelist/lang/de-informal/lang.php b/platform/www/lib/plugins/pagelist/lang/de-informal/lang.php
new file mode 100644
index 0000000..adcba6b
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/de-informal/lang.php
@@ -0,0 +1,14 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author F. Mueller-Donath <j.felix@mueller-donath.de>
+ */
+$lang['page'] = 'Seite';
+$lang['date'] = 'Datum';
+$lang['user'] = 'Benutzer';
+$lang['desc'] = 'Beschreibung';
+$lang['diff'] = 'Unterschiede';
+$lang['diff_title'] = 'Zeige Unterschiede zur aktuellen Version';
+$lang['diff_alt'] = 'Zeige Unterschiede zur aktuellen Version';
diff --git a/platform/www/lib/plugins/pagelist/lang/de-informal/settings.php b/platform/www/lib/plugins/pagelist/lang/de-informal/settings.php
new file mode 100644
index 0000000..eb73719
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/de-informal/settings.php
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author F. Mueller-Donath <j.felix@mueller-donath.de>
+ */
+$lang['style'] = 'Stil der Seitenlisten';
+$lang['style_o_default'] = 'Standard';
+$lang['style_o_table'] = 'Tabelle';
+$lang['style_o_list'] = 'Tabelle/Liste';
+$lang['style_o_simple'] = 'Einfache Liste';
+$lang['showheader'] = 'Tabellenkopf anzeigen';
+$lang['showdate'] = 'Datum anzeigen';
+$lang['showdate_o_0'] = 'ausblenden';
+$lang['showdate_o_1'] = 'Erstellungsdatum';
+$lang['showdate_o_2'] = 'Änderungsdatum';
+$lang['showuser'] = 'Benutzer anzeigen';
+$lang['showuser_o_0'] = 'ausblenden';
+$lang['showuser_o_1'] = 'Ersteller';
+$lang['showuser_o_2'] = 'Beitragende';
+$lang['showdesc'] = 'Beschreibung anzeigen';
+$lang['showdesc_o_0'] = 'ausblenden';
+$lang['showdesc_o_160'] = 'max. 160 Zeichen';
+$lang['showdesc_o_500'] = 'max. 500 Zeichen';
+$lang['showcomments'] = 'Kommentare anzeigen (Discussion Plugin wird benötigt)';
+$lang['showlinkbacks'] = 'Linkbacks anzeigen (Linkback Plugin wird benötigt)';
+$lang['showtags'] = 'Tags anzeigen (Tag Plugin wird benötigt)';
+$lang['showfirsthl'] = 'Erste Überschrift anstatt des Seitennamens anzeigen';
+$lang['showimage'] = 'Bild anzeigen (Pageimage Plugin wird benötigt)';
+$lang['showdiff'] = 'Link auf Diff-Seite anzeigen';
+$lang['sort'] = 'Seiten alphabetisch nach Namen sortieren';
+$lang['rsort'] = 'Seiten in umgekehrter alphabetischer Reihenfolge nach Namen sortieren';
diff --git a/platform/www/lib/plugins/pagelist/lang/de/lang.php b/platform/www/lib/plugins/pagelist/lang/de/lang.php
new file mode 100644
index 0000000..74c3660
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/de/lang.php
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Esther Brunner <wikidesign@gmail.com>
+ * @author Dominik Eckelmann <deckelmann@gmail.com>
+ * @author e-dschungel <github@e-dschungel.de>
+ */
+$lang['page'] = 'Seite';
+$lang['date'] = 'Datum';
+$lang['user'] = 'Benutzer';
+$lang['desc'] = 'Beschreibung';
+$lang['diff'] = 'Unterschiede';
+$lang['diff_title'] = 'Zeige Unterschiede zur aktuellen Version';
+$lang['diff_alt'] = 'Zeige Unterschiede zur aktuellen Version';
diff --git a/platform/www/lib/plugins/pagelist/lang/de/settings.php b/platform/www/lib/plugins/pagelist/lang/de/settings.php
new file mode 100644
index 0000000..7805f74
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/de/settings.php
@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Esther Brunner <wikidesign@gmail.com>
+ * @author Dominik Eckelmann <deckelmann@gmail.com>
+ * @author e-dschungel <github@e-dschungel.de>
+ */
+$lang['style'] = 'Stil der Seitenlisten';
+$lang['style_o_default'] = 'Standard';
+$lang['style_o_table'] = 'Tabelle';
+$lang['style_o_list'] = 'Tabelle/Liste';
+$lang['style_o_simple'] = 'Einfache Liste';
+$lang['showheader'] = 'Tabellenkopf anzeigen';
+$lang['showdate'] = 'Datum anzeigen';
+$lang['showdate_o_0'] = 'ausblenden';
+$lang['showdate_o_1'] = 'Erstellungsdatum';
+$lang['showdate_o_2'] = 'Änderungsdatum';
+$lang['showuser'] = 'Benutzer anzeigen';
+$lang['showuser_o_0'] = 'ausblenden';
+$lang['showuser_o_1'] = 'Ersteller';
+$lang['showuser_o_2'] = 'Beitragende';
+$lang['showdesc'] = 'Beschreibung anzeigen';
+$lang['showdesc_o_0'] = 'ausblenden';
+$lang['showdesc_o_160'] = 'max. 160 Zeichen';
+$lang['showdesc_o_500'] = 'max. 500 Zeichen';
+$lang['showcomments'] = 'Kommentare anzeigen (Discussion Plugin wird benötigt)';
+$lang['showlinkbacks'] = 'Linkbacks anzeigen (Linkback Plugin wird benötigt)';
+$lang['showtags'] = 'Tags anzeigen (Tag Plugin wird benötigt)';
+$lang['showfirsthl'] = 'Erste Überschrift anstatt des Seitennamens anzeigen';
+$lang['showimage'] = 'Bild anzeigen (Pageimage Plugin wird benötigt)';
+$lang['showdiff'] = 'Link auf Diff-Seite anzeigen';
+$lang['sort'] = 'Seiten alphabetisch nach Namen sortieren';
+$lang['rsort'] = 'Seiten in umgekehrter alphabetischer Reihenfolge nach Namen sortieren';
diff --git a/platform/www/lib/plugins/pagelist/lang/en/lang.php b/platform/www/lib/plugins/pagelist/lang/en/lang.php
new file mode 100644
index 0000000..241b285
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/en/lang.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * English language file
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Esther Brunner <wikidesign@gmail.com>
+ */
+
+// custom language strings for the plugin
+$lang['page'] = 'Page';
+$lang['date'] = 'Date';
+$lang['user'] = 'User';
+$lang['desc'] = 'Description';
+$lang['diff'] = 'Differences';
+$lang['diff_title'] = 'Show differences to current revisions';
+$lang['diff_alt'] = 'Show differences to current revisions';
+//Setup VIM: ex: et ts=2 enc=utf-8 :
diff --git a/platform/www/lib/plugins/pagelist/lang/en/settings.php b/platform/www/lib/plugins/pagelist/lang/en/settings.php
new file mode 100644
index 0000000..87ee834
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/en/settings.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * English language file
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Esther Brunner <wikidesign@gmail.com>
+ */
+
+// for the configuration manager
+$lang['style'] = 'Style of pagelist';
+$lang['style_o_default'] = 'default';
+$lang['style_o_table'] = 'table';
+$lang['style_o_list'] = 'table/list';
+$lang['style_o_simple'] = 'simple list';
+
+$lang['showheader'] = 'show heading line';
+$lang['showdate'] = 'show date column';
+$lang['showdate_o_0'] = 'hide';
+$lang['showdate_o_1'] = 'creation date';
+$lang['showdate_o_2'] = 'modification date';
+$lang['showuser'] = 'show user column';
+$lang['showuser_o_0'] = 'hide';
+$lang['showuser_o_1'] = 'creator';
+$lang['showuser_o_2'] = 'contributors';
+$lang['showdesc'] = 'show description column';
+$lang['showdesc_o_0'] = 'hide';
+$lang['showdesc_o_160'] = 'max. 160 chars';
+$lang['showdesc_o_500'] = 'max. 500 chars';
+$lang['showcomments'] = 'show comments column (Discussion Plugin needed)';
+$lang['showlinkbacks'] = 'show linkbacks column (Linkback Plugin needed)';
+$lang['showtags'] = 'show tags column (Tag Plugin needed)';
+$lang['showfirsthl'] = 'show the first headline instead of the page name';
+$lang['showimage'] = 'show image column (Pageimage Plugin needed)';
+$lang['showdiff'] = 'show link to the diff page';
+$lang['sort'] = 'sort pages by pagename';
+$lang['rsort'] = 'reverse sort pages by pagename';
+
+//Setup VIM: ex: et ts=2 :
diff --git a/platform/www/lib/plugins/pagelist/lang/eo/lang.php b/platform/www/lib/plugins/pagelist/lang/eo/lang.php
new file mode 100644
index 0000000..a1e6ee4
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/eo/lang.php
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Esperanta dosiero
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Felipe Castro <fefcas@yahoo.com.br>
+ */
+
+// persona lingvo-cxenoj por la ilero (plugin)
+$lang['page'] = 'Paĝo';
+$lang['date'] = 'Dato';
+$lang['user'] = 'Uzulo';
+$lang['desc'] = 'Priskribo';
+
+//Setup VIM: ex: et ts=2 enc=utf-8 :
diff --git a/platform/www/lib/plugins/pagelist/lang/eo/settings.php b/platform/www/lib/plugins/pagelist/lang/eo/settings.php
new file mode 100644
index 0000000..7a9ffb7
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/eo/settings.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * Esperanta dosiero
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Felipe Castro <fefcas@yahoo.com.br>
+ */
+
+// por la agordo-administrilo
+$lang['style'] = 'Estilo de la tabelo por la paĝlistoj';
+$lang['style_o_default'] = 'aprioro';
+$lang['style_o_table'] = 'tabelo';
+$lang['style_o_list'] = 'listo';
+
+$lang['showheader'] = 'montri kaplinion';
+$lang['showdate'] = 'montri kolumnon pri dato';
+$lang['showdate_o_0'] = 'kaŝi';
+$lang['showdate_o_1'] = 'dato de kreo';
+$lang['showdate_o_2'] = 'dato de modifo';
+$lang['showuser'] = 'montri kolumnon pri uzulo';
+$lang['showuser_o_0'] = 'kaŝi';
+$lang['showuser_o_1'] = 'kreinto';
+$lang['showuser_o_2'] = 'kontribuantoj';
+$lang['showdesc'] = 'montri kolumnon por priskribo';
+$lang['showdesc_o_0'] = 'kaŝi';
+$lang['showdesc_o_160'] = 'maks. 160 signaĵoj';
+$lang['showdesc_o_500'] = 'maks. 500 signaĵoj';
+$lang['showcomments'] = 'montri kolumnon pri komentoj ("Discussion Plugin" bezonatas)';
+$lang['showtags'] = 'montri kolumnon pri etikedoj ("Tag Plugin" bezonatas)';
+
+//Setup VIM: ex: et ts=2 enc=utf-8 :
diff --git a/platform/www/lib/plugins/pagelist/lang/es/lang.php b/platform/www/lib/plugins/pagelist/lang/es/lang.php
new file mode 100644
index 0000000..98824cb
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/es/lang.php
@@ -0,0 +1,15 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Herman Fabián Sandoval Manrique <hfsandovalm@emzac.com>
+ * @author Domingo Redal <docxml@gmail.com>
+ */
+$lang['page'] = 'Página';
+$lang['date'] = 'Fecha';
+$lang['user'] = 'Usuario';
+$lang['desc'] = 'Descripción';
+$lang['diff'] = 'Diferencias';
+$lang['diff_title'] = 'Mostrar diferencias con la revisión actual';
+$lang['diff_alt'] = 'Mostrar diferencias con la revisión actual';
diff --git a/platform/www/lib/plugins/pagelist/lang/es/settings.php b/platform/www/lib/plugins/pagelist/lang/es/settings.php
new file mode 100644
index 0000000..62cafa6
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/es/settings.php
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Herman Fabián Sandoval Manrique <hfsandovalm@emzac.com>
+ * @author Domingo Redal <docxml@gmail.com>
+ */
+$lang['style'] = 'estilo de las tablas pagelist';
+$lang['style_o_default'] = 'por defecto';
+$lang['style_o_table'] = 'tabla';
+$lang['style_o_list'] = 'lista';
+$lang['style_o_simple'] = 'lista simple';
+$lang['showheader'] = 'mostrar línea de encabezado';
+$lang['showdate'] = 'mostrar columna de fecha';
+$lang['showdate_o_0'] = 'ocultar';
+$lang['showdate_o_1'] = 'fecha de creación';
+$lang['showdate_o_2'] = 'fecha de modificación';
+$lang['showuser'] = 'mostrar columna de usuario';
+$lang['showuser_o_0'] = 'ocultar';
+$lang['showuser_o_1'] = 'creador';
+$lang['showuser_o_2'] = 'contributors';
+$lang['showdesc'] = 'mostrar columna de descripción';
+$lang['showdesc_o_0'] = 'ocultar';
+$lang['showdesc_o_160'] = 'max. 160 caracteres';
+$lang['showdesc_o_500'] = 'max. 500 caracteres';
+$lang['showcomments'] = 'mostrar columna de comentarios (Se requiere el plugin Discussion)';
+$lang['showlinkbacks'] = 'mostrar columna LinkBacks (Se requiere el plugin Linkback)';
+$lang['showtags'] = 'mostrar columna de etiquetas (Se requiere el plugin Tag)';
+$lang['showfirsthl'] = 'mostrar el primer título en lugar del nombre de la página';
+$lang['showimage'] = 'mostrar la columna de la imagen (plugin Pageimage necesario)';
+$lang['showdiff'] = 'muestra el enlace a la página de diferencias';
+$lang['sort'] = 'ordenar páginas por nombre de la página';
+$lang['rsort'] = 'orden descendente de páginas por nombre de la página';
diff --git a/platform/www/lib/plugins/pagelist/lang/fr/lang.php b/platform/www/lib/plugins/pagelist/lang/fr/lang.php
new file mode 100644
index 0000000..9ddb894
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/fr/lang.php
@@ -0,0 +1,15 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Olivier Humbert <trebmuh@tuxfamily.org>
+ * @author Laynee <seedfloyd@gmail.com>
+ */
+$lang['page'] = 'Page';
+$lang['date'] = 'Date';
+$lang['user'] = 'Utilisateur';
+$lang['desc'] = 'Description';
+$lang['diff'] = 'Différences';
+$lang['diff_title'] = 'Différences avec la version précédente';
+$lang['diff_alt'] = 'Différences avec la version précédente';
diff --git a/platform/www/lib/plugins/pagelist/lang/fr/settings.php b/platform/www/lib/plugins/pagelist/lang/fr/settings.php
new file mode 100644
index 0000000..31a7e0d
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/fr/settings.php
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Olivier Humbert <trebmuh@tuxfamily.org>
+ * @author Nicolas Friedli <nicolas@theologique.ch>
+ * @author Laynee <seedfloyd@gmail.com>
+ * @author Schplurtz le Déboulonné <schplurtz@laposte.net>
+ */
+$lang['style'] = 'Type de présentation';
+$lang['style_o_default'] = 'par défault';
+$lang['style_o_table'] = 'tableau';
+$lang['style_o_list'] = 'liste';
+$lang['style_o_simple'] = 'liste simple';
+$lang['showheader'] = 'Afficher l\'entête';
+$lang['showdate'] = 'Afficher la colonne "date"';
+$lang['showdate_o_0'] = 'ne pas montrer';
+$lang['showdate_o_1'] = 'date de création';
+$lang['showdate_o_2'] = 'date de modification';
+$lang['showuser'] = 'Afficher la colonne "utilisateur"';
+$lang['showuser_o_0'] = 'ne pas montrer';
+$lang['showuser_o_1'] = 'créateur';
+$lang['showuser_o_2'] = 'contributeurs';
+$lang['showdesc'] = 'Afficher la colonne "description"';
+$lang['showdesc_o_0'] = 'ne pas montrer';
+$lang['showdesc_o_160'] = '160 caractères maximum';
+$lang['showdesc_o_500'] = '500 caractères maximum';
+$lang['showcomments'] = 'Afficher la colonne "commentaires" (plugin Discussion requis)';
+$lang['showlinkbacks'] = 'Afficher la colonne "liens de retour" (plugin Linkback requis)';
+$lang['showtags'] = 'Afficher la colonne "tags" (plugin Tag requis)';
+$lang['showfirsthl'] = 'Afficher le titre de premier niveau plutôt que le nom de page ("pagename")';
+$lang['showimage'] = 'Afficher la colonne image (greffon Pageimage nécessaire)';
+$lang['showdiff'] = 'Afficher un lien vers les anciennes révisions';
+$lang['sort'] = 'Trier selon le nom de page ("pagename")';
+$lang['rsort'] = 'Inverser le tri selon le nom des pages';
diff --git a/platform/www/lib/plugins/pagelist/lang/hu/lang.php b/platform/www/lib/plugins/pagelist/lang/hu/lang.php
new file mode 100644
index 0000000..94eceaf
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/hu/lang.php
@@ -0,0 +1,14 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author DelD <deldadam@gmail.com>
+ */
+$lang['page'] = 'Oldal';
+$lang['date'] = 'Dátum';
+$lang['user'] = 'Felhasználó';
+$lang['desc'] = 'Leírás';
+$lang['diff'] = 'Eltérések';
+$lang['diff_title'] = 'Aktuális revizíóhoz képesti eltérések kijelzése';
+$lang['diff_alt'] = 'Aktuális revizíóhoz képesti eltérések kijelzése';
diff --git a/platform/www/lib/plugins/pagelist/lang/hu/settings.php b/platform/www/lib/plugins/pagelist/lang/hu/settings.php
new file mode 100644
index 0000000..7f585a1
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/hu/settings.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author DelD <deldadam@gmail.com>
+ */
+$lang['style'] = 'Oldallista stílusa';
+$lang['style_o_default'] = 'Alapértelmezett';
+$lang['style_o_table'] = 'Táblázat';
+$lang['style_o_list'] = 'Táblázat/lista';
+$lang['style_o_simple'] = 'Egyszerű lista';
+$lang['showheader'] = 'Címsor megjelenítése';
+$lang['showdate'] = 'Dátum oszlopának megjelenítése';
+$lang['showdate_o_0'] = 'Elrejtés';
+$lang['showdate_o_1'] = 'Készítés dátuma';
+$lang['showdate_o_2'] = 'Módosítás dátuma';
+$lang['showuser'] = 'Felhasználó oszlopának megjelenítése';
+$lang['showuser_o_0'] = 'Elrejtés';
+$lang['showuser_o_1'] = 'Készítette';
+$lang['showuser_o_2'] = 'Hozzájárulók';
+$lang['showdesc'] = 'Leírás oszlopának megjelenítése';
+$lang['showdesc_o_0'] = 'Elrejtés';
+$lang['showdesc_o_160'] = 'max. 160 karakter';
+$lang['showdesc_o_500'] = 'max. 500 karakter';
+$lang['showcomments'] = 'Hozzászólás oszlopának megjelenítése (Discussion bővítmény kell hozzá)';
+$lang['showlinkbacks'] = 'Visszamutató hivatkozások oszlopának megjelenítése (Linkback bővítmény kell hozzá)';
+$lang['showtags'] = 'Címke oszlopának megjelenítése (Tag bővítmény kell hozzá)';
+$lang['showfirsthl'] = 'Első címsor megjelenítése az oldal neve helyett';
+$lang['showdiff'] = 'Hivatkozás megjelenítése a korábbi változatok oldalára';
+$lang['sort'] = 'Sorrend az oldalak neve szerint';
+$lang['rsort'] = 'Fordított sorrend az oldalak neve szerint';
diff --git a/platform/www/lib/plugins/pagelist/lang/it/lang.php b/platform/www/lib/plugins/pagelist/lang/it/lang.php
new file mode 100644
index 0000000..24eca96
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/it/lang.php
@@ -0,0 +1,17 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Roberto Bellingeri <bellingeri@netguru.it>
+ * @author Willy <willygroup@gmail.com>
+ * @author OlatusRooc <olatusrooc@virgilio.it>
+ * @author Marco Fenoglio <marco.fenoglio@gmail.com>
+ */
+$lang['page'] = 'Pagina';
+$lang['date'] = 'Data';
+$lang['user'] = 'Utente';
+$lang['desc'] = 'Descrizione';
+$lang['diff'] = 'Differenze';
+$lang['diff_title'] = 'Mostra le differenze alle revisioni correnti';
+$lang['diff_alt'] = 'Mostra le differenze alle revisioni correnti';
diff --git a/platform/www/lib/plugins/pagelist/lang/it/settings.php b/platform/www/lib/plugins/pagelist/lang/it/settings.php
new file mode 100644
index 0000000..9550231
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/it/settings.php
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Roberto Bellingeri <bellingeri@netguru.it>
+ * @author Willy <willygroup@gmail.com>
+ * @author OlatusRooc <olatusrooc@virgilio.it>
+ * @author Marco Fenoglio <marco.fenoglio@gmail.com>
+ */
+$lang['style'] = 'Stile delle tabelle di pagelist';
+$lang['style_o_default'] = 'default';
+$lang['style_o_table'] = 'tabella';
+$lang['style_o_list'] = 'tabella/elenco';
+$lang['style_o_simple'] = 'elenco semplice';
+$lang['showheader'] = 'mostra la riga delle intestazioni';
+$lang['showdate'] = 'mostra la colonna della data';
+$lang['showdate_o_0'] = 'nascondi';
+$lang['showdate_o_1'] = 'data di creazione';
+$lang['showdate_o_2'] = 'data di modifica';
+$lang['showuser'] = 'mostra la colonna user';
+$lang['showuser_o_0'] = 'nascondi';
+$lang['showuser_o_1'] = 'creatore';
+$lang['showuser_o_2'] = 'contributi';
+$lang['showdesc'] = 'mostra la colonna con la descrizione';
+$lang['showdesc_o_0'] = 'nascondi';
+$lang['showdesc_o_160'] = 'max. 160 caratteri';
+$lang['showdesc_o_500'] = 'max. 500 caratteri';
+$lang['showcomments'] = 'mostra la colonna dei commenti (devi avere installato il Plugin Discussion)';
+$lang['showlinkbacks'] = 'mostra la colonna dei linkback (devi avere installato il Plugin Linkback)';
+$lang['showtags'] = 'mostra la colonna dei tag (devi avere installato il Plugin Tag)';
+$lang['showfirsthl'] = 'mostrare la prima riga di intestazione anziché il nome della pagina';
+$lang['showimage'] = 'mostra la colonna immagine (è richiesto il plugin Pageimage)';
+$lang['showdiff'] = 'mostra link alla pagina delle differenze';
+$lang['sort'] = 'ordina le pagine per nome di pagina';
+$lang['rsort'] = 'ordina le pagine al contrario per nome di pagina';
diff --git a/platform/www/lib/plugins/pagelist/lang/ja/lang.php b/platform/www/lib/plugins/pagelist/lang/ja/lang.php
new file mode 100644
index 0000000..34e1882
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/ja/lang.php
@@ -0,0 +1,15 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Ikuo Obataya <cxx05051@nifty.com>
+ * @author Hideaki SAWADA <chuno@live.jp>
+ */
+$lang['page'] = 'ページ';
+$lang['date'] = '日付';
+$lang['user'] = 'ユーザー';
+$lang['desc'] = '内容';
+$lang['diff'] = '差分';
+$lang['diff_title'] = '現在のリビジョンとの差分を表示';
+$lang['diff_alt'] = '現在のリビジョンとの差分を表示';
diff --git a/platform/www/lib/plugins/pagelist/lang/ja/settings.php b/platform/www/lib/plugins/pagelist/lang/ja/settings.php
new file mode 100644
index 0000000..21610e5
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/ja/settings.php
@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author HokkaidoPerson <dosankomali@yahoo.co.jp>
+ * @author Ikuo Obataya <cxx05051@nifty.com>
+ * @author Hideaki SAWADA <chuno@live.jp>
+ */
+$lang['style'] = 'ページ一覧の表示形式';
+$lang['style_o_default'] = '横罫線のみのテーブル(デフォルト)';
+$lang['style_o_table'] = 'テーブル';
+$lang['style_o_list'] = 'リスト';
+$lang['style_o_simple'] = 'シンプルな一覧';
+$lang['showheader'] = 'ヘッダ行を表示する';
+$lang['showdate'] = '日付を表示する';
+$lang['showdate_o_0'] = '非表示';
+$lang['showdate_o_1'] = '作成日';
+$lang['showdate_o_2'] = '変更日';
+$lang['showuser'] = 'ユーザーを表示する';
+$lang['showuser_o_0'] = '非表示';
+$lang['showuser_o_1'] = '作成者';
+$lang['showuser_o_2'] = '編集者';
+$lang['showdesc'] = '内容を表示する';
+$lang['showdesc_o_0'] = '非表示';
+$lang['showdesc_o_160'] = '最大 160 文字';
+$lang['showdesc_o_500'] = '最大 500 文字';
+$lang['showcomments'] = 'コメントを表示する(Discussionプラグインが必要)';
+$lang['showlinkbacks'] = 'リンクバックを表示する(Linkbackプラグインが必要)';
+$lang['showtags'] = 'タグを表示する(Tagプラグインが必要)';
+$lang['showfirsthl'] = '最初の見出しをページ名とする';
+$lang['showimage'] = '画像カラムを表示(Pageimageプラグインが必要)';
+$lang['showdiff'] = '差分ページヘのリンクを表示';
+$lang['sort'] = 'ページ名でソート';
+$lang['rsort'] = 'ページ名で逆ソート';
diff --git a/platform/www/lib/plugins/pagelist/lang/ko/lang.php b/platform/www/lib/plugins/pagelist/lang/ko/lang.php
new file mode 100644
index 0000000..1a9a432
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/ko/lang.php
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author S.C.Yoo <dryoo@live.com>
+ * @author Myeongjin <aranet100@gmail.com>
+ * @author Erial <erial2@gmail.com>
+ */
+$lang['page'] = '문서';
+$lang['date'] = '날짜';
+$lang['user'] = '사용자';
+$lang['desc'] = '설명';
+$lang['diff'] = '차이';
+$lang['diff_title'] = '현재 판과의 차이 보기';
+$lang['diff_alt'] = '현재 판과의 차이 보기';
diff --git a/platform/www/lib/plugins/pagelist/lang/ko/settings.php b/platform/www/lib/plugins/pagelist/lang/ko/settings.php
new file mode 100644
index 0000000..e08495d
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/ko/settings.php
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author S.C.Yoo <dryoo@live.com>
+ * @author Myeongjin <aranet100@gmail.com>
+ * @author Erial <erial2@gmail.com>
+ */
+$lang['style'] = 'Pagelist의 스타일';
+$lang['style_o_default'] = '기본값';
+$lang['style_o_table'] = '표';
+$lang['style_o_list'] = '표/목록';
+$lang['style_o_simple'] = '간단한 목록';
+$lang['showheader'] = '제목 줄 보이기';
+$lang['showdate'] = '날짜 열 보이기';
+$lang['showdate_o_0'] = '숨기기';
+$lang['showdate_o_1'] = '만든 날짜';
+$lang['showdate_o_2'] = '수정한 날짜';
+$lang['showuser'] = '사용자 열 보이기';
+$lang['showuser_o_0'] = '숨기기';
+$lang['showuser_o_1'] = '만든이';
+$lang['showuser_o_2'] = '기여자';
+$lang['showdesc'] = '설명 열 보이기';
+$lang['showdesc_o_0'] = '숨기기';
+$lang['showdesc_o_160'] = '최대 160 문자';
+$lang['showdesc_o_500'] = '최대 500 문자';
+$lang['showcomments'] = '댓글 열 보이기 (Discussion 플러그인 필요)';
+$lang['showlinkbacks'] = '링크백 열 보이기 (Linkback 플러그인 필요)';
+$lang['showtags'] = '태그 열 보이기 (Tag 플러그인 필요)';
+$lang['showfirsthl'] = '문서 이름 대신 첫 제목줄 보이기';
+$lang['showdiff'] = '문서 차이 보기 링크 보이기';
+$lang['sort'] = '문서 이름 순으로 정렬';
+$lang['rsort'] = '문서 이름 역순으로 정렬';
diff --git a/platform/www/lib/plugins/pagelist/lang/nl/lang.php b/platform/www/lib/plugins/pagelist/lang/nl/lang.php
new file mode 100644
index 0000000..ac707ba
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/nl/lang.php
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Esther Brunner <wikidesign@gmail.com>
+ * @author Mark C. Prins <mprins@users.sf.net>
+ * @author Hugo Smet <hugo.smet@scarlet.be>
+ */
+$lang['page'] = 'Pagina';
+$lang['date'] = 'Datum';
+$lang['user'] = 'Gebruiker';
+$lang['desc'] = 'Beschrijving';
+$lang['diff'] = 'Verschillen';
+$lang['diff_title'] = 'Toon verschillen met de huidige revisies';
+$lang['diff_alt'] = 'Toon verschillen met de huidige revisies';
diff --git a/platform/www/lib/plugins/pagelist/lang/nl/settings.php b/platform/www/lib/plugins/pagelist/lang/nl/settings.php
new file mode 100644
index 0000000..5cf1e7b
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/nl/settings.php
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Esther Brunner <wikidesign@gmail.com>
+ * @author Mark C. Prins <mprins@users.sf.net>
+ * @author Hugo Smet <hugo.smet@scarlet.be>
+ * @author mark prins <mprins@users.sf.net>
+ */
+$lang['style'] = 'Stijl van de pagelist tabellen';
+$lang['style_o_default'] = 'default';
+$lang['style_o_table'] = 'tabel';
+$lang['style_o_list'] = 'lijst';
+$lang['style_o_simple'] = 'Eenvoudige lijst';
+$lang['showheader'] = 'toon kopregel';
+$lang['showdate'] = 'toon datum kolom';
+$lang['showdate_o_0'] = 'verberg';
+$lang['showdate_o_1'] = 'aanmaakdatum';
+$lang['showdate_o_2'] = 'bewerkingsdatum';
+$lang['showuser'] = 'toon gebruikers kolom';
+$lang['showuser_o_0'] = 'verberg';
+$lang['showuser_o_1'] = 'maker';
+$lang['showuser_o_2'] = 'bijdragers';
+$lang['showdesc'] = 'toon beschrijvingskolom';
+$lang['showdesc_o_0'] = 'verberg';
+$lang['showdesc_o_160'] = 'max. 160 chars.';
+$lang['showdesc_o_500'] = 'max. 500 chars.';
+$lang['showcomments'] = 'toon commentaar kolom (Discussion Plugin benodigd)';
+$lang['showlinkbacks'] = 'toon linkbacks kolom (Linkback Plugin benodigd)';
+$lang['showtags'] = 'toon tags kolom (Tag Plugin benodigd)';
+$lang['showfirsthl'] = 'toon de eerste kopregel in plaats van de pagina naam';
+$lang['showimage'] = 'toon afbeeldingskolom (Pageimage Plugin nodig)';
+$lang['showdiff'] = 'toon link naar verschil pagina';
+$lang['sort'] = 'sorteer paginas op pagina naam';
+$lang['rsort'] = 'sorteer paginas omgekeerd op pagina naam';
diff --git a/platform/www/lib/plugins/pagelist/lang/no/lang.php b/platform/www/lib/plugins/pagelist/lang/no/lang.php
new file mode 100644
index 0000000..5700a47
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/no/lang.php
@@ -0,0 +1,14 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Arne Hanssen <arne.hanssen@getmail.no>
+ */
+$lang['page'] = 'Side';
+$lang['date'] = 'Dato';
+$lang['user'] = 'Bruker';
+$lang['desc'] = 'Beskrivelse';
+$lang['diff'] = 'Forskjeller';
+$lang['diff_title'] = 'Vis forskjeller til nåværende versjoner';
+$lang['diff_alt'] = 'Vis forskjeller til nåværende versjoner';
diff --git a/platform/www/lib/plugins/pagelist/lang/no/settings.php b/platform/www/lib/plugins/pagelist/lang/no/settings.php
new file mode 100644
index 0000000..446e03f
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/no/settings.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Arne Hanssen <arne.hanssen@getmail.no>
+ */
+$lang['style'] = 'Pagelist-stil';
+$lang['style_o_default'] = 'standard';
+$lang['style_o_table'] = 'tabell';
+$lang['style_o_list'] = 'tabell/liste';
+$lang['style_o_simple'] = 'enkel liste';
+$lang['showheader'] = 'Vis tabellhoder';
+$lang['showdate'] = 'Vis kolonne for dato';
+$lang['showdate_o_0'] = 'skjul';
+$lang['showdate_o_1'] = 'opprettelses dato';
+$lang['showdate_o_2'] = 'dato for endring';
+$lang['showuser'] = 'Vis kolonne for bruker';
+$lang['showuser_o_0'] = 'skjul';
+$lang['showuser_o_1'] = 'opprettet av';
+$lang['showuser_o_2'] = 'bidragsytere';
+$lang['showdesc'] = 'vis kolonne for beskrivelse';
+$lang['showdesc_o_0'] = 'skjul';
+$lang['showdesc_o_160'] = 'maks. 160 tegn';
+$lang['showdesc_o_500'] = 'maks. 500 tegn';
+$lang['showcomments'] = 'Vis kolonne for kommenta (avhengig av Discussion-utvidelse)';
+$lang['showlinkbacks'] = 'Vis kolonne for tilbakelenker (avhengig av Linkback-utvidelse)';
+$lang['showtags'] = 'Vis kolonne for emneknagg (avhengig av Tag-utvidelse)';
+$lang['showfirsthl'] = 'Vis første overskrift istedetfor sidenavn';
+$lang['showdiff'] = 'Vis lenke til siden som viser forskjeller mellom versjoner av siden';
+$lang['sort'] = 'Sorter etter sidenavn';
+$lang['rsort'] = 'Sorter etter sidenavn i omvendt rekkefølge';
diff --git a/platform/www/lib/plugins/pagelist/lang/pt-br/lang.php b/platform/www/lib/plugins/pagelist/lang/pt-br/lang.php
new file mode 100644
index 0000000..9c40d21
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/pt-br/lang.php
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Arquivo para o português
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Sidnei Neves <sidnei@sidnei.org>
+ */
+
+// cadeias customizadas da língua para o plugin
+$lang['page'] = 'Página';
+$lang['date'] = 'Data';
+$lang['user'] = 'Usuário';
+$lang['desc'] = 'Descrição';
+
+//Setup Notepad++ enc=utf-8 :
diff --git a/platform/www/lib/plugins/pagelist/lang/pt-br/settings.php b/platform/www/lib/plugins/pagelist/lang/pt-br/settings.php
new file mode 100644
index 0000000..fac69a0
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/pt-br/settings.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * Arquivo para o português
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Felipe Castro <fefcas@yahoo.com.br>
+ */
+
+// para o gerenciador de configurações
+$lang['style'] = 'Estilo da tabela para a lista de páginas';
+$lang['style_o_default'] = 'original';
+$lang['style_o_table'] = 'tabela';
+$lang['style_o_list'] = 'lista';
+
+$lang['showheader'] = 'mostrar cabeçalho';
+$lang['showdate'] = 'mostrar coluna de data';
+$lang['showdate_o_0'] = 'esconder';
+$lang['showdate_o_1'] = 'data de criação';
+$lang['showdate_o_2'] = 'data de modificação';
+$lang['showuser'] = 'mostrar coluna de usuário';
+$lang['showuser_o_0'] = 'esconder';
+$lang['showuser_o_1'] = 'criador';
+$lang['showuser_o_2'] = 'contribuidores';
+$lang['showdesc'] = 'mostrar coluna de descrição';
+$lang['showdesc_o_0'] = 'esconder';
+$lang['showdesc_o_160'] = 'max. 160 caracteres';
+$lang['showdesc_o_500'] = 'max. 500 caracteres';
+$lang['showcomments'] = 'mostrar coluna de comentários (precisa do "Discussion Plugin")';
+$lang['showtags'] = 'mostrar coluna de etiquetas (precisa do "Tag Plugin")';
+
+//Setup VIM: ex: et ts=2 enc=utf-8 :
diff --git a/platform/www/lib/plugins/pagelist/lang/pt/lang.php b/platform/www/lib/plugins/pagelist/lang/pt/lang.php
new file mode 100644
index 0000000..653dbce
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/pt/lang.php
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Portuguese language file
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Fernando Ribeiro <pinguim.ribeiro@gmail.com>
+ */
+
+// custom language strings for the plugin
+$lang['page'] = 'Página';
+$lang['date'] = 'Data';
+$lang['user'] = 'Utilizador';
+$lang['desc'] = 'Descrição';
+
+//Setup VIM: ex: et ts=2 enc=utf-8 : \ No newline at end of file
diff --git a/platform/www/lib/plugins/pagelist/lang/pt/settings.php b/platform/www/lib/plugins/pagelist/lang/pt/settings.php
new file mode 100644
index 0000000..6d1e1ae
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/pt/settings.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Portuguese language file
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Fernando Ribeiro <pinguim.ribeiro@gmail.com>
+ */
+
+// for the configuration manager
+$lang['style'] = 'Estilo da tabela para a lista de páginas';
+$lang['style_o_default'] = 'original';
+$lang['style_o_table'] = 'tabela';
+$lang['style_o_list'] = 'lista';
+
+$lang['showheader'] = 'mostrar cabeçalho';
+$lang['showdate'] = 'mostrar coluna de data';
+$lang['showdate_o_0'] = 'esconder';
+$lang['showdate_o_1'] = 'data de criação';
+$lang['showdate_o_2'] = 'data de modificação';
+$lang['showuser'] = 'mostrar coluna de utilizador';
+$lang['showuser_o_0'] = 'esconder';
+$lang['showuser_o_1'] = 'criador';
+$lang['showuser_o_2'] = 'contribuidores';
+$lang['showdesc'] = 'mostrar coluna de descrição';
+$lang['showdesc_o_0'] = 'esconder';
+$lang['showdesc_o_160'] = 'max. 160 caracteres';
+$lang['showdesc_o_500'] = 'max. 500 caracteres';
+$lang['showcomments'] = 'mostrar coluna de comentários (precisa do "Discussion Plugin")';
+$lang['showlinkbacks'] = 'mostrar coluna de linkbacks (Linkback Plugin needed)';
+$lang['showtags'] = 'mostrar coluna de etiquetas (precisa do "Tag Plugin")';
+$lang['showfirsthl'] = 'mostrar o primeiro cabeçalho en veaz do nome da página';
+$lang['sort'] = 'ordenar páginas pelo nome';
+$lang['rsort'] = 'ordenar páginas inversamente pelo nome';
+
+//Setup VIM: ex: et ts=2 enc=utf-8 :
diff --git a/platform/www/lib/plugins/pagelist/lang/ro/lang.php b/platform/www/lib/plugins/pagelist/lang/ro/lang.php
new file mode 100644
index 0000000..233aa09
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/ro/lang.php
@@ -0,0 +1,12 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Mircea Simion <mircea.simion@gmail.com>
+ */
+$lang['page'] = 'Pagina';
+$lang['date'] = 'Data';
+$lang['user'] = 'Utilizator';
+$lang['desc'] = 'Descriere';
+$lang['diff'] = 'Diferente';
diff --git a/platform/www/lib/plugins/pagelist/lang/ro/settings.php b/platform/www/lib/plugins/pagelist/lang/ro/settings.php
new file mode 100644
index 0000000..4533108
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/ro/settings.php
@@ -0,0 +1,13 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Mircea Simion <mircea.simion@gmail.com>
+ */
+$lang['style_o_default'] = 'implicit';
+$lang['style_o_table'] = 'tabel';
+$lang['style_o_list'] = 'tabel/lista';
+$lang['style_o_simple'] = 'lista simpla';
+$lang['showdate_o_0'] = 'ascunde';
+$lang['showuser_o_0'] = 'ascunde';
diff --git a/platform/www/lib/plugins/pagelist/lang/ru/lang.php b/platform/www/lib/plugins/pagelist/lang/ru/lang.php
new file mode 100644
index 0000000..0653b5b
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/ru/lang.php
@@ -0,0 +1,14 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Aleksandr Selivanov <alexgearbox@gmail.com>
+ */
+$lang['page'] = 'Страница';
+$lang['date'] = 'Дата';
+$lang['user'] = 'Участник';
+$lang['desc'] = 'Описание';
+$lang['diff'] = 'Отличия';
+$lang['diff_title'] = 'Показать отличия от текущей версии';
+$lang['diff_alt'] = 'Показать отличия от текущей версии';
diff --git a/platform/www/lib/plugins/pagelist/lang/ru/settings.php b/platform/www/lib/plugins/pagelist/lang/ru/settings.php
new file mode 100644
index 0000000..9c5af24
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/ru/settings.php
@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Yuriy Skalko <yuriy.skalko@gmail.com>
+ * @author Aleksandr Selivanov <alexgearbox@gmail.com>
+ * @author RainbowSpike <1@2.ru>
+ */
+$lang['style'] = 'Стиль списка страниц';
+$lang['style_o_default'] = 'по умолчанию';
+$lang['style_o_table'] = 'таблицей';
+$lang['style_o_list'] = 'списком в таблице';
+$lang['style_o_simple'] = 'простым списком';
+$lang['showheader'] = 'Отображать заголовок таблицы/списка';
+$lang['showdate'] = 'Столбец дат';
+$lang['showdate_o_0'] = 'скрыть';
+$lang['showdate_o_1'] = 'дата написания';
+$lang['showdate_o_2'] = 'дата редактирования';
+$lang['showuser'] = 'Столбец имён пользователей';
+$lang['showuser_o_0'] = 'скрыть';
+$lang['showuser_o_1'] = 'автор';
+$lang['showuser_o_2'] = 'соавторы';
+$lang['showdesc'] = 'Столбец описания';
+$lang['showdesc_o_0'] = 'скрыть';
+$lang['showdesc_o_160'] = 'Макс. 160 символов';
+$lang['showdesc_o_500'] = 'Макс. 500 символов';
+$lang['showcomments'] = 'Отображать столбец с комментариями (требуется плагин Discussion)';
+$lang['showlinkbacks'] = 'Отображать столбец с обратными ссылками (требуется плагин Linkback)';
+$lang['showtags'] = 'Отображать столбец с тегами (требуется плагин Tag)';
+$lang['showfirsthl'] = 'Отображать заголовок вместо имени страницы';
+$lang['showimage'] = 'показать столбец изображений (требуется плагин Pageimage)';
+$lang['showdiff'] = 'Отображать ссылку на страницу отличий';
+$lang['sort'] = 'Сортировка страниц по имени';
+$lang['rsort'] = 'Обратная сортировка страниц по имени';
diff --git a/platform/www/lib/plugins/pagelist/lang/sv/lang.php b/platform/www/lib/plugins/pagelist/lang/sv/lang.php
new file mode 100644
index 0000000..44515c8
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/sv/lang.php
@@ -0,0 +1,14 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Tor Härnqvist <tor@harnqvist.se>
+ */
+$lang['page'] = 'Sida';
+$lang['date'] = 'Datum';
+$lang['user'] = 'Användare';
+$lang['desc'] = 'Beskrivning';
+$lang['diff'] = 'Skillnader';
+$lang['diff_title'] = 'Visa skillnader mot nuvarande version';
+$lang['diff_alt'] = 'Visa skillnader mot nuvarande version';
diff --git a/platform/www/lib/plugins/pagelist/lang/sv/settings.php b/platform/www/lib/plugins/pagelist/lang/sv/settings.php
new file mode 100644
index 0000000..a778e00
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/sv/settings.php
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Tor Härnqvist <tor@harnqvist.se>
+ */
+$lang['style'] = 'Stil på sidlistning';
+$lang['style_o_default'] = 'standard';
+$lang['style_o_table'] = 'tabell';
+$lang['style_o_list'] = 'tabell/lista';
+$lang['style_o_simple'] = 'enkel lista';
+$lang['showheader'] = 'visa rubrikrad';
+$lang['showdate'] = 'visa datumkolumn';
+$lang['showdate_o_0'] = 'göm';
+$lang['showdate_o_1'] = 'skapandedatum';
+$lang['showdate_o_2'] = 'ändringsdatum';
+$lang['showuser'] = 'visa användarkolumn';
+$lang['showuser_o_0'] = 'göm';
+$lang['showuser_o_1'] = 'skapat av';
+$lang['showuser_o_2'] = 'bidragslämnare';
+$lang['showdesc'] = 'visa kolumn för beskrivning';
+$lang['showdesc_o_0'] = 'göm';
+$lang['showdesc_o_160'] = 'max 160 tecken';
+$lang['showdesc_o_500'] = 'max 500 tecken';
+$lang['showcomments'] = 'visa kolumn för kommentarer (kräver Discussion-plugin)';
+$lang['showlinkbacks'] = 'visa kolumn tillbakalänkingar (kräver Linkback-plugin)';
+$lang['showtags'] = 'visa kolumn för taggar (kräver tagg-plugin)';
+$lang['showfirsthl'] = 'visa den första rubriken istället för sidnamn';
+$lang['showimage'] = 'visa bildkolumn (Pageimage-pluginet krävs)';
+$lang['showdiff'] = 'visa länk till sidan som visar skillnader mellan versioner';
+$lang['sort'] = 'sortera sidor efter sidnamn';
+$lang['rsort'] = 'sortera i omvänd ordning efter sidnamn';
diff --git a/platform/www/lib/plugins/pagelist/lang/tr/lang.php b/platform/www/lib/plugins/pagelist/lang/tr/lang.php
new file mode 100644
index 0000000..ed49103
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/tr/lang.php
@@ -0,0 +1,15 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Esther Brunner <wikidesign@gmail.com>
+ * @author İlker R. Kapaç <irifat@gmail.com>
+ */
+$lang['page'] = 'Sayfa';
+$lang['date'] = 'Tarih';
+$lang['user'] = 'Kullanıcı';
+$lang['desc'] = 'Açıklama';
+$lang['diff'] = 'Farklar';
+$lang['diff_title'] = 'Güncel sürümler ile aradaki farkları göster';
+$lang['diff_alt'] = 'Güncel sürümler ile aradaki farkları göster';
diff --git a/platform/www/lib/plugins/pagelist/lang/tr/settings.php b/platform/www/lib/plugins/pagelist/lang/tr/settings.php
new file mode 100644
index 0000000..d3a9425
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/tr/settings.php
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Esther Brunner <wikidesign@gmail.com>
+ * @author İlker R. Kapaç <irifat@gmail.com>
+ */
+$lang['style'] = 'Pagelist tablolarının biçimi';
+$lang['style_o_default'] = 'varsayılan';
+$lang['style_o_table'] = 'tablo';
+$lang['style_o_list'] = 'liste';
+$lang['style_o_simple'] = 'basit liste';
+$lang['showheader'] = 'Başlık satırını göster';
+$lang['showdate'] = 'Tarih sütununu göster';
+$lang['showdate_o_0'] = 'gizle';
+$lang['showdate_o_1'] = 'oluşturma tarihi';
+$lang['showdate_o_2'] = 'düzenleme tarihi';
+$lang['showuser'] = 'Kullanıcı sütununu göster';
+$lang['showuser_o_0'] = 'gizle';
+$lang['showuser_o_1'] = 'oluşturan';
+$lang['showuser_o_2'] = 'katkıda bulunanlar';
+$lang['showdesc'] = 'Açıklama sütununu göster';
+$lang['showdesc_o_0'] = 'gizle';
+$lang['showdesc_o_160'] = 'en fazla 160 harf';
+$lang['showdesc_o_500'] = 'en fazla 500 harf';
+$lang['showcomments'] = 'Yorumlar sütununu göster (Discussion eklentisi yüklü olmalıdır)';
+$lang['showlinkbacks'] = 'Geri bağlantılar sütununu göster (Linkback eklentisi yüklü olmalıdır)';
+$lang['showtags'] = 'Etiketler sütununu göster (Tag eklentisi yüklü olmalıdır)';
+$lang['showfirsthl'] = 'Sayfa adı yerine ilk başlığı göster';
+$lang['showdiff'] = 'fark sayfası için bağlantı göster';
+$lang['sort'] = 'Sayfaları, adlarına göre sırala';
+$lang['rsort'] = 'Sayfaları, adlarının tersine göre sırala';
diff --git a/platform/www/lib/plugins/pagelist/lang/uk/lang.php b/platform/www/lib/plugins/pagelist/lang/uk/lang.php
new file mode 100644
index 0000000..9224cdf
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/uk/lang.php
@@ -0,0 +1,14 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Олексій <alexey.furashev@gmail.com>
+ */
+$lang['page'] = 'Сторінка';
+$lang['date'] = 'Дата';
+$lang['user'] = 'Користувач';
+$lang['desc'] = 'Опис';
+$lang['diff'] = 'Відмінності';
+$lang['diff_title'] = 'Показати відмінності від поточних змін';
+$lang['diff_alt'] = 'Показати відмінності від поточних змін';
diff --git a/platform/www/lib/plugins/pagelist/lang/uk/settings.php b/platform/www/lib/plugins/pagelist/lang/uk/settings.php
new file mode 100644
index 0000000..888e5c2
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/uk/settings.php
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Олексій <alexey.furashev@gmail.com>
+ */
+$lang['style'] = 'Стиль переліку сторінок';
+$lang['style_o_default'] = 'за замовчення';
+$lang['style_o_table'] = 'таблиця';
+$lang['style_o_list'] = 'таблиця/перелік';
+$lang['style_o_simple'] = 'простий перелік';
+$lang['showheader'] = 'показати заголовок';
+$lang['showdate'] = 'показати колонку з датою';
+$lang['showdate_o_0'] = 'сховати';
+$lang['showdate_o_1'] = 'дата створення';
+$lang['showdate_o_2'] = 'дата редагування';
+$lang['showuser'] = 'показати колонку користувача';
+$lang['showuser_o_0'] = 'сховати';
+$lang['showuser_o_1'] = 'автор';
+$lang['showuser_o_2'] = 'помічники';
+$lang['showdesc'] = 'показати колонку з описом';
+$lang['showdesc_o_0'] = 'сховати';
+$lang['showdesc_o_160'] = 'до 160 символів';
+$lang['showdesc_o_500'] = 'до 500 символів';
+$lang['showcomments'] = 'показати колонку з коментарями (має бути встановлений додаток Discussion)';
+$lang['showlinkbacks'] = 'показати колонку з переліком сторінок, що посилаються на цю сторінку (має бути встановлений додаток Linkback)';
+$lang['showtags'] = 'показати колонку з тегами (має бути встановлений додаток Tag)';
+$lang['showfirsthl'] = 'показувати перший заголовок замість назви сторінки';
+$lang['showimage'] = 'показати колонку із зображенням (має бути встановлений додаток Pageimage)';
+$lang['showdiff'] = 'показати посилання на сторінку відмінностей';
+$lang['sort'] = 'сортувати сторінки за назвою';
+$lang['rsort'] = 'сортувати за назвою в зворотному порядку ';
diff --git a/platform/www/lib/plugins/pagelist/lang/zh-tw/lang.php b/platform/www/lib/plugins/pagelist/lang/zh-tw/lang.php
new file mode 100644
index 0000000..d1c477c
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/zh-tw/lang.php
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Traditional Chinese language file
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Danny Lin <danny0838@gmail.com>
+ */
+
+// custom language strings for the plugin
+$lang['page'] = '頁面';
+$lang['date'] = '日期';
+$lang['user'] = '使用者';
+$lang['desc'] = '描述';
+
+//Setup VIM: ex: et ts=2 enc=utf-8 : \ No newline at end of file
diff --git a/platform/www/lib/plugins/pagelist/lang/zh-tw/settings.php b/platform/www/lib/plugins/pagelist/lang/zh-tw/settings.php
new file mode 100644
index 0000000..50c0b08
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/zh-tw/settings.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Traditional Chinese language file
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Danny Lin <danny0838@gmail.com>
+ */
+
+// for the configuration manager
+$lang['style'] = '頁面列表的格式';
+$lang['style_o_default'] = '預設';
+$lang['style_o_table'] = '表格';
+$lang['style_o_list'] = '列表';
+
+$lang['showheader'] = '顯示標題列';
+$lang['showdate'] = '顯示日期欄';
+$lang['showdate_o_0'] = '隱藏';
+$lang['showdate_o_1'] = '建立日期';
+$lang['showdate_o_2'] = '修改日期';
+$lang['showuser'] = '顯示使用者欄';
+$lang['showuser_o_0'] = '隱藏';
+$lang['showuser_o_1'] = '建立者';
+$lang['showuser_o_2'] = '貢獻者';
+$lang['showdesc'] = '顯示描述欄';
+$lang['showdesc_o_0'] = '隱藏';
+$lang['showdesc_o_160'] = '最多 160 字元';
+$lang['showdesc_o_500'] = '最多 500 字元';
+$lang['showcomments'] = '顯示意見欄 (需要 Discussion 插件)';
+$lang['showlinkbacks'] = '顯示反向連結欄 (需要 Linkback 插件)';
+$lang['showtags'] = '顯示標籤欄 (需要 Tag 插件)';
+$lang['showfirsthl'] = '顯示第一標題而非頁面名稱';
+$lang['sort'] = '按頁面名稱排序';
+$lang['rsort'] = '按頁面名稱反向排序';
+
+//Setup VIM: ex: et ts=2 enc=utf-8 : \ No newline at end of file
diff --git a/platform/www/lib/plugins/pagelist/lang/zh/lang.php b/platform/www/lib/plugins/pagelist/lang/zh/lang.php
new file mode 100644
index 0000000..ddcce5c
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/zh/lang.php
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Simplified Chinese language file
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author haobug <qingxianhao@gmail.com>
+ */
+
+// custom language strings for the plugin
+$lang['page'] = '页面';
+$lang['date'] = '日期';
+$lang['user'] = '用户';
+$lang['desc'] = '描述';
+
+//Setup VIM: ex: et ts=2 enc=utf-8 :
diff --git a/platform/www/lib/plugins/pagelist/lang/zh/settings.php b/platform/www/lib/plugins/pagelist/lang/zh/settings.php
new file mode 100644
index 0000000..9a4a21b
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/lang/zh/settings.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Simplified Chinese language file
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author haobug <qingxianhao@gmail.com>
+ */
+
+// for the configuration manager
+$lang['style'] = '页面列表的样式';
+$lang['style_o_default'] = '默认';
+$lang['style_o_table'] = '表格';
+$lang['style_o_list'] = '列表';
+
+$lang['showheader'] = '显示标题行';
+$lang['showdate'] = '显示日期列';
+$lang['showdate_o_0'] = '隐藏';
+$lang['showdate_o_1'] = '创建日期';
+$lang['showdate_o_2'] = '修改日期';
+$lang['showuser'] = '显示用户列';
+$lang['showuser_o_0'] = '隐藏';
+$lang['showuser_o_1'] = '创建者';
+$lang['showuser_o_2'] = '贡献者';
+$lang['showdesc'] = '显示描述列';
+$lang['showdesc_o_0'] = '隐藏';
+$lang['showdesc_o_160'] = '最多 160 个字符';
+$lang['showdesc_o_500'] = '最多 500 个字符';
+$lang['showcomments'] = '显示评论列 (需要 Discussion 插件)';
+$lang['showlinkbacks'] = '显示反向链接列 (需要 Linkback 插件)';
+$lang['showtags'] = '显示标签列 (需要 Tag 插件)';
+$lang['showfirsthl'] = '显示第一个标题而非页面名称';
+$lang['sort'] = '按页面名称排序';
+$lang['rsort'] = '按页面名称逆序排序';
+
+//Setup VIM: ex: et ts=2 :
diff --git a/platform/www/lib/plugins/pagelist/manager.dat b/platform/www/lib/plugins/pagelist/manager.dat
new file mode 100644
index 0000000..8560890
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/manager.dat
@@ -0,0 +1,2 @@
+downloadurl=https://github.com/dokufreaks/plugin-pagelist/archive/master.zip
+installed=Thu, 17 Mar 2022 13:03:49 +0000
diff --git a/platform/www/lib/plugins/pagelist/plugin.info.txt b/platform/www/lib/plugins/pagelist/plugin.info.txt
new file mode 100644
index 0000000..340001c
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/plugin.info.txt
@@ -0,0 +1,8 @@
+# General Plugin Info do not edit
+base pagelist
+author Matthias Schulte, Michael Hamann, Michael Klier, Gina Haeussge
+email michael@content-space.de
+date 2020-09-27
+name Pagelist Plugin
+desc Lists pages in a nice formatted way
+url http://www.dokuwiki.org/plugin:pagelist
diff --git a/platform/www/lib/plugins/pagelist/style.css b/platform/www/lib/plugins/pagelist/style.css
new file mode 100644
index 0000000..71961d8
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/style.css
@@ -0,0 +1,57 @@
+div.dokuwiki table.pagelist,
+div.dokuwiki table.ul {
+ border: 0;
+ padding: 0;
+ border-spacing: 0;
+ margin-bottom: 1em;
+ border-collapse: collapse;
+}
+
+div.dokuwiki table.pagelist tr {
+ border-top: 1px solid __border__;
+ border-bottom: 1px solid __border__;
+}
+
+div.dokuwiki table.pagelist th,
+div.dokuwiki table.pagelist td {
+ padding: 1px 1em 1px 0;
+ border: 0;
+}
+
+div.dokuwiki table.ul th,
+div.dokuwiki table.ul td {
+ padding: 0 1em 0 0;
+ border: 0;
+}
+
+div.dokuwiki table.ul ul {
+ margin: 0 0 0 1.5em;
+}
+
+div.dokuwiki table.pagelist th,
+div.dokuwiki table.ul th {
+ background-color: __background_alt__;
+}
+
+div.dokuwiki th.page,
+div.dokuwiki th.date,
+div.dokuwiki th.user,
+div.dokuwiki th.desc,
+div.dokuwiki th.comments,
+div.dokuwiki th.linkbacks,
+div.dokuwiki th.tags,
+div.dokuwiki th.diff,
+div.dokuwiki td.date,
+div.dokuwiki td.user,
+div.dokuwiki td.desc,
+div.dokuwiki td.comments,
+div.dokuwiki td.linkbacks,
+div.dokuwiki td.tags,
+div.dokuwiki td.diff {
+ color: __text_neu__;
+ font-size: 80%;
+}
+
+div.dokuwiki td.date {
+ text-align: left;
+}
diff --git a/platform/www/lib/plugins/pagelist/syntax.php b/platform/www/lib/plugins/pagelist/syntax.php
new file mode 100644
index 0000000..a3ea0b2
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/syntax.php
@@ -0,0 +1,106 @@
+<?php
+/**
+ * Pagelist Plugin: lists pages
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Esther Brunner <wikidesign@gmail.com>
+ */
+
+class syntax_plugin_pagelist extends DokuWiki_Syntax_Plugin {
+
+ function getType() { return 'substition';}
+ function getPType() { return 'block';}
+ function getSort() { return 168; }
+
+ /**
+ * Connect pattern to lexer
+ */
+ function connectTo($mode) {
+ $this->Lexer->addSpecialPattern('<pagelist.+?</pagelist>', $mode, 'plugin_pagelist');
+ }
+
+ /**
+ * Handle the match
+ */
+ function handle($match, $state, $pos, Doku_Handler $handler) {
+ global $ID;
+
+ $match = substr($match, 9, -11); // strip markup
+ list($flags, $match) = explode('>', $match, 2);
+ $flags = explode('&', substr($flags, 1));
+ $items = explode('*', $match);
+
+ $pages = array();
+ $c = count($items);
+ for ($i = 0; $i < $c; $i++) {
+ if (!preg_match('/\[\[(.+?)\]\]/', $items[$i], $match)) continue;
+ list($id, $title, $description) = explode('|', $match[1], 3);
+ list($id, $section) = explode('#', $id, 2);
+ if (!$id) $id = $ID;
+ resolve_pageid(getNS($ID), $id, $exists);
+
+ // page has an image title
+ if (($title) && (preg_match('/\{\{(.+?)\}\}/', $title, $match))) {
+ list($image, $title) = explode('|', $match[1], 2);
+ list($ext, $mime) = mimetype($image);
+ if (!substr($mime, 0, 5) == 'image') $image = '';
+ $pages[] = array(
+ 'id' => $id,
+ 'section' => cleanID($section),
+ 'title' => trim($title),
+ 'titleimage' => trim($image),
+ 'description' => trim($description), // Holds the added parameter for own descriptions
+ 'exists' => $exists,
+ );
+
+ // text title (if any)
+ } else {
+ $pages[] = array(
+ 'id' => $id,
+ 'section' => cleanID($section),
+ 'title' => trim($title),
+ 'description' => trim($description), // Holds the added parameter for own descriptions
+ 'exists' => $exists,
+ );
+ }
+ }
+ return array($flags, $pages);
+ }
+
+ /**
+ * Create output
+ */
+ function render($mode, Doku_Renderer $renderer, $data) {
+ list($flags, $pages) = $data;
+
+ // for XHTML output
+ if ($mode == 'xhtml') {
+ if (!$my =& plugin_load('helper', 'pagelist')) return false;
+ $my->setFlags($flags);
+ $my->startList();
+
+ if($my->sort || $my->rsort) { // pages should be sorted by pagename
+ $keys = array();
+ $fnc = create_function('$a, $b', 'return strcmp(noNS($a["id"]), noNS($b["id"])); ');
+ usort($pages, $fnc);
+ // rsort is true - revserse sort the pages
+ if($my->rsort) krsort($pages);
+ }
+
+ foreach($pages as $page) {
+ $my->addPage($page);
+ }
+ $renderer->doc .= $my->finishList();
+ return true;
+
+ // for metadata renderer
+ } elseif ($mode == 'metadata') {
+ foreach ($pages as $page) {
+ $renderer->meta['relation']['references'][$page['id']] = $page['exists'];
+ }
+ return true;
+ }
+ return false;
+ }
+}
+// vim:ts=4:sw=4:et:
diff --git a/platform/www/lib/plugins/tag/COPYING b/platform/www/lib/plugins/tag/COPYING
new file mode 100644
index 0000000..d60c31a
--- /dev/null
+++ b/platform/www/lib/plugins/tag/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/platform/www/lib/plugins/tag/README b/platform/www/lib/plugins/tag/README
new file mode 100644
index 0000000..8b25647
--- /dev/null
+++ b/platform/www/lib/plugins/tag/README
@@ -0,0 +1,10 @@
+====== Tag Plugin for DokuWiki ======
+
+All documentation for the Tag Plugin is available online at:
+
+ * http://dokuwiki.org/plugin:tag
+
+(c) 2005 - 2007 by Esther Brunner <wikidesign@gmail.com>
+(c) 2008 - 2009 by Gina Häußge, Michael Klier <dokuwiki@chimeric.de>
+(c) 2012 - 2013 by Michael Hamann and the tag plugin team <michael@content-space.de>
+See COPYING for license info.
diff --git a/platform/www/lib/plugins/tag/_test/topic_and_tagrefine.test.php b/platform/www/lib/plugins/tag/_test/topic_and_tagrefine.test.php
new file mode 100644
index 0000000..b466eb3
--- /dev/null
+++ b/platform/www/lib/plugins/tag/_test/topic_and_tagrefine.test.php
@@ -0,0 +1,107 @@
+<?php
+
+if (!defined('DOKU_INC')) die();
+
+/**
+ * Tests the tagRefine function of the tag plugin
+ */
+class plugin_tag_topic_and_tagrefine_test extends DokuWikiTest {
+ private $all_pages = array(
+ 'tagged_page' => array('id' => 'tagged_page'),
+ 'negative_page' => array('id' => 'negative_page'),
+ 'third_page' => array('id' => 'third_page')
+ );
+ public function setUp() {
+ $this->pluginsEnabled[] = 'tag';
+ parent::setUp();
+
+ saveWikiText(
+ 'tagged_page',
+ '{{tag>mytag test2tag}}', 'Test'
+ );
+ saveWikiText(
+ 'negative_page',
+ '{{tag>negative_tag mytag}}',
+ 'Test setup'
+ );
+ saveWikiText(
+ 'third_page',
+ '{{tag>third_tag}}',
+ 'Test setup'
+ );
+ idx_addPage('tagged_page');
+ idx_addPage('negative_page');
+ idx_addPage('third_page');
+ }
+
+ public function testEmptyTag() {
+ $this->assertTopicRefine(array('tagged_page', 'negative_page', 'third_page'), '');
+ }
+
+ public function testOnlyNegative() {
+ $this->assertTopicRefine(array('tagged_page', 'third_page'), '-negative_tag');
+ }
+
+ public function testMixed() {
+ $this->assertTopicRefine(array('tagged_page'), 'mytag -negative_tag');
+
+ }
+
+ public function testAnd() {
+ $this->assertTopicRefine(array('tagged_page'), '+mytag +test2tag');
+ }
+
+ public function testAndOr() {
+ $this->assertTopicRefine(array('tagged_page', 'third_page'), '+test2tag third_tag');
+ }
+
+ public function testOrAnd() {
+ $this->assertTopicRefine(array('tagged_page'), 'mytag +test2tag');
+ }
+
+ public function testRefineDoesntAdd() {
+ /** @var helper_plugin_tag $helper */
+ $helper = plugin_load('helper', 'tag');
+ $pages = $helper->tagRefine(array(), 'mytag');
+ $this->hasPages(array(), $pages, 'Refine with empty input array and "mytag" query: ');
+ }
+
+ /**
+ * Test if the getTopic and the tagRefine function with all pages as input both return the expected pages
+ *
+ * @param array $expected expected page ids
+ * @param string $query the query for the tagRefine/getTopic-functions
+ */
+ private function assertTopicRefine($expected, $query) {
+ /** @var helper_plugin_tag $helper */
+ $helper = plugin_load('helper', 'tag');
+ $pages = $helper->tagRefine($this->all_pages, $query);
+ $this->hasPages($expected, $pages, 'Refine: '.$query.': ');
+ $pages = $helper->getTopic('', '', $query);
+ $this->hasPages($expected, $pages, 'Topic: '.$query.': ');
+ }
+
+ /**
+ * Makes sure that all pages were found and not more
+ *
+ * @param array $expected List of page ids
+ * @param array $actual Result list from getTopic/tagRefine
+ * @param string $msg_prefix A prefix that is prepended to all messages
+ */
+ private function hasPages($expected, $actual, $msg_prefix = '') {
+ foreach ($expected as $id) {
+ $found = false;
+ foreach ($actual as $page) {
+ if ($page['id'] === $id) {
+ $found = true;
+ break;
+ }
+ }
+ $this->assertTrue($found, $msg_prefix.'Page '.$id.' expected but not found in the result');
+ }
+
+ foreach ($actual as $page) {
+ $this->assertTrue(in_array($page['id'], $expected), $msg_prefix.'Page '.$page['id'].' is in the result but wasn\'t expected');
+ }
+ }
+}
diff --git a/platform/www/lib/plugins/tag/_test/topic_sort.test.php b/platform/www/lib/plugins/tag/_test/topic_sort.test.php
new file mode 100644
index 0000000..aca59f4
--- /dev/null
+++ b/platform/www/lib/plugins/tag/_test/topic_sort.test.php
@@ -0,0 +1,59 @@
+<?php
+
+if (!defined('DOKU_INC')) die();
+
+/**
+ * Tests the tagRefine function of the tag plugin
+ */
+class plugin_tag_topic_sorting_test extends DokuWikiTest {
+ private $pages = array(
+ 'a',
+ 'aa',
+ 'a:a',
+ 'a:aa',
+ 'a:a:c',
+ 'a:a:b:a',
+ 'a:b:c'
+ );
+ /** @var helper_plugin_tag $helper */
+ private $helper;
+
+ public function setUp() {
+ global $conf;
+ $this->pluginsEnabled[] = 'tag';
+ parent::setUp();
+
+ $conf['plugin']['tag']['sortkey'] = 'ns';
+
+ $this->helper = plugin_load('helper', 'tag');
+
+
+ foreach ($this->pages as $page) {
+ saveWikiText(
+ $page,
+ '{{tag>mytag}}', 'Test'
+ );
+ idx_addPage($page);
+ }
+ }
+
+ public function test_ns_sort() {
+ $this->assertEquals($this->pages, $this->extract_ids($this->helper->getTopic('', null, 'mytag')));
+ }
+
+
+ /**
+ * Extract the id attribute of the supplied pages
+ *
+ * @param array $pages The pages that shall be used
+ * @return array The ids of the pages
+ */
+ private function extract_ids($pages) {
+ $result = array();
+ foreach ($pages as $page) {
+ $result[] = $page['id'];
+ }
+ return $result;
+ }
+
+}
diff --git a/platform/www/lib/plugins/tag/_test/topic_tag.test.php b/platform/www/lib/plugins/tag/_test/topic_tag.test.php
new file mode 100644
index 0000000..63908aa
--- /dev/null
+++ b/platform/www/lib/plugins/tag/_test/topic_tag.test.php
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * Tests the basic functionality of the tag and topic syntax
+ */
+class topic_tag_test extends DokuWikiTest {
+ function setup() {
+ $this->pluginsEnabled[] = 'tag';
+ $this->pluginsEnabled[] = 'pagelist';
+ parent::setup();
+ }
+
+ function test_topic_tag() {
+ saveWikiText(
+ 'tagged_page',
+ '{{tag>mytag test2tag}}', 'Test'
+ );
+ saveWikiText(
+ 'topic_page',
+ '{{topic>mytag}}'.DOKU_LF.DOKU_LF.'{{tag>topictag mytag}}'.DOKU_LF, 'Test'
+ );
+ idx_addPage('topic_page');
+ idx_addPage('tagged_page');
+ $this->assertContains('tag:topictag', p_wiki_xhtml('topic_page'), 'Page with tag syntax doesn\'t contain tag output');
+ $this->assertNotContains('tag:test2tag', p_wiki_xhtml('topic_page'), 'Page with tag and topic syntax tag which is listed in a page that is listed in the topic syntax but not on the page itself');
+ $this->assertContains('topic_page', p_wiki_xhtml('topic_page'), 'Page with topic and tag syntax doesn\'t list itself in the topic syntax');
+ $this->assertContains('tagged_page', p_wiki_xhtml('topic_page'), 'Page with topic syntax doesn\'t list matching page');
+ $this->assertContains('tag:mytag', p_wiki_xhtml('tagged_page'), 'Page with tag syntax doesn\'t contain tag output');
+ $this->assertContains('tag:test2tag', p_wiki_xhtml('tagged_page'), 'Page with tag syntax doesn\'t contain tag output');
+ $this->assertNotContains('tag:topictag', p_wiki_xhtml('tagged_page'), 'Page with tag syntax contains tag from a page in which it is listed in the topic syntax');
+ saveWikiText('tagged_page', '{{tag>test2tag}}', 'Deleted mytag');
+ $this->assertNotContains('tagged_page', p_wiki_xhtml('topic_page'), 'Page that no longer contains the tag is still listed in the topic syntax (caching problems?)');
+ $this->assertNotContains('tag:mytag', p_wiki_xhtml('tagged_page'), 'Removed tag is still listed in XHTML output');
+
+ }
+}
diff --git a/platform/www/lib/plugins/tag/action.php b/platform/www/lib/plugins/tag/action.php
new file mode 100644
index 0000000..d008628
--- /dev/null
+++ b/platform/www/lib/plugins/tag/action.php
@@ -0,0 +1,138 @@
+<?php
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Esther Brunner <wikidesign@gmail.com>
+ */
+
+/**
+ * Action part of the tag plugin, handles tag display and index updates
+ */
+class action_plugin_tag extends DokuWiki_Action_Plugin {
+
+ /**
+ * register the eventhandlers
+ *
+ * @param Doku_Event_Handler $contr
+ */
+ function register(Doku_Event_Handler $contr) {
+ $contr->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, '_handle_act', array());
+ $contr->register_hook('TPL_ACT_UNKNOWN', 'BEFORE', $this, '_handle_tpl_act', array());
+ $contr->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, '_handle_keywords', array());
+ if($this->getConf('toolbar_icon')) $contr->register_hook('TOOLBAR_DEFINE', 'AFTER', $this, 'insert_toolbar_button', array ());
+ $contr->register_hook('INDEXER_VERSION_GET', 'BEFORE', $this, '_indexer_version', array());
+ $contr->register_hook('INDEXER_PAGE_ADD', 'BEFORE', $this, '_indexer_index_tags', array());
+ }
+
+ /**
+ * Add a version string to the index so it is rebuilt
+ * whenever the stored data format changes.
+ */
+ function _indexer_version(Doku_Event $event, $param) {
+ global $conf;
+ $event->data['plugin_tag'] = '0.2.deaccent='.$conf['deaccent'];
+ }
+
+ /**
+ * Add all data of the subject metadata to the metadata index.
+ */
+ function _indexer_index_tags(Doku_Event $event, $param) {
+ /* @var helper_plugin_tag $helper */
+ if ($helper = $this->loadHelper('tag')) {
+ // make sure the tags are cleaned and no duplicate tags are added to the index
+ $tags = p_get_metadata($event->data['page'], 'subject');
+ if (!is_array($tags)) {
+ $event->data['metadata']['subject'] = array();
+ } else {
+ $event->data['metadata']['subject'] = $helper->_cleanTagList($tags);
+ }
+ }
+ }
+
+ /**
+ * catch tag action
+ *
+ * @author Michael Klier <chi@chimeric.de>
+ */
+ function _handle_act(Doku_Event $event, $param) {
+ if($event->data != 'showtag') return;
+ $event->preventDefault();
+ }
+
+ /**
+ * Display the tag page
+ *
+ * @param Doku_Event $event The TPL_ACT_UNKNOWN event
+ * @param array $param optional parameters (unused)
+ */
+ function _handle_tpl_act(Doku_Event $event, $param) {
+ global $lang;
+
+ if($event->data != 'showtag') return;
+ $event->preventDefault();
+
+ $tagns = $this->getConf('namespace');
+ $flags = explode(',', str_replace(" ", "", $this->getConf('pagelist_flags')));
+
+ $tag = trim(str_replace($this->getConf('namespace').':', '', $_REQUEST['tag']));
+ $ns = trim($_REQUEST['ns']);
+
+ /* @var helper_plugin_tag $helper */
+ if ($helper = $this->loadHelper('tag')) $pages = $helper->getTopic($ns, '', $tag);
+
+ if(!empty($pages)) {
+
+ // let Pagelist Plugin do the work for us
+ if ((!$pagelist = $this->loadHelper('pagelist'))) {
+ return false;
+ }
+
+ /* @var helper_plugin_pagelist $pagelist */
+ $pagelist->setFlags($flags);
+ $pagelist->startList();
+ foreach ($pages as $page) {
+ $pagelist->addPage($page);
+ }
+
+ print '<h1>TAG: ' . hsc(str_replace('_', ' ', $_REQUEST['tag'])) . '</h1>' . DOKU_LF;
+ print '<div class="level1">' . DOKU_LF;
+ print $pagelist->finishList();
+ print '</div>' . DOKU_LF;
+
+ } else {
+ print '<div class="level1"><p>' . $lang['nothingfound'] . '</p></div>';
+ }
+ }
+
+ /**
+ * Inserts the tag toolbar button
+ */
+ function insert_toolbar_button(Doku_Event $event, $param) {
+ $event->data[] = array(
+ 'type' => 'format',
+ 'title' => $this->getLang('toolbar_icon'),
+ 'icon' => '../../plugins/tag/images/tag-toolbar.png',
+ 'open' => '{{tag>',
+ 'close' => '}}'
+ );
+ }
+
+ /**
+ * Prevent displaying underscores instead of blanks inside the page keywords
+ */
+ function _handle_keywords(Doku_Event $event) {
+ global $ID;
+
+ // Fetch tags for the page; stop proceeding when no tags specified
+ $tags = p_get_metadata($ID, 'subject', METADATA_DONT_RENDER);
+ if(is_null($tags)) true;
+
+ // Replace underscores with blanks
+ foreach($event->data['meta'] as &$meta) {
+ if($meta['name'] == 'keywords') {
+ $meta['content'] = str_replace('_', ' ', $meta['content']);
+ }
+ }
+ }
+}
+
+// vim:ts=4:sw=4:et:
diff --git a/platform/www/lib/plugins/tag/conf/default.php b/platform/www/lib/plugins/tag/conf/default.php
new file mode 100644
index 0000000..9f0b314
--- /dev/null
+++ b/platform/www/lib/plugins/tag/conf/default.php
@@ -0,0 +1,13 @@
+<?php
+/**
+ * Options for the Tag Plugin
+ */
+$conf['namespace'] = 'tag'; // where should tag links point to? default: 'tag'
+$conf['sortkey'] = 'title'; // sort key for topic lists
+$conf['sortorder'] = 'ascending'; // ascending or descending
+$conf['pagelist_flags'] = 'list'; // formatting options for the page list plugin
+$conf['toolbar_icon'] = 0; // enables/disables the toolbar icon
+$conf['list_tags_of_subns'] = 0; // list also tags in subnamespaces of a specified namespace (count syntax)
+$conf['tags_list_css'] = 'tags'; // wich CSS style to use for tag list?
+
+//Setup VIM: ex: et ts=2 :
diff --git a/platform/www/lib/plugins/tag/conf/metadata.php b/platform/www/lib/plugins/tag/conf/metadata.php
new file mode 100644
index 0000000..8fd97c1
--- /dev/null
+++ b/platform/www/lib/plugins/tag/conf/metadata.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Metadata for configuration manager plugin
+ * Additions for the tag plugin
+ *
+ * @author Esther Brunner <wikidesign@gmail.com>
+ */
+
+$meta['namespace'] = array('string');
+$meta['sortkey'] = array('multichoice',
+ '_choices' => array('cdate', 'mdate', 'pagename', 'id', 'ns', 'title'));
+$meta['sortorder'] = array('multichoice',
+ '_choices' => array('ascending', 'descending'));
+$meta['pagelist_flags'] = array('string');
+$meta['toolbar_icon'] = array('onoff');
+$meta['list_tags_of_subns'] = array('onoff');
+$meta['tags_list_css'] = array('multichoice',
+ '_choices' => array('tags', 'tagstop'));
+
+//Setup VIM: ex: et ts=2 :
diff --git a/platform/www/lib/plugins/tag/helper.php b/platform/www/lib/plugins/tag/helper.php
new file mode 100644
index 0000000..666c5e2
--- /dev/null
+++ b/platform/www/lib/plugins/tag/helper.php
@@ -0,0 +1,513 @@
+<?php
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Esther Brunner <wikidesign@gmail.com>
+ */
+
+/**
+ * Helper part of the tag plugin, allows to query and print tags
+ */
+class helper_plugin_tag extends DokuWiki_Plugin {
+
+ var $namespace = ''; // namespace tag links point to
+
+ var $sort = ''; // sort key
+ var $topic_idx = array();
+
+ /**
+ * Constructor gets default preferences and language strings
+ */
+ function __construct() {
+ global $ID;
+
+ $this->namespace = $this->getConf('namespace');
+ if (!$this->namespace) $this->namespace = getNS($ID);
+ $this->sort = $this->getConf('sortkey');
+ }
+
+ /**
+ * Returns some documentation of the methods provided by this helper part
+ *
+ * @return array Method description
+ */
+ function getMethods() {
+ $result = array();
+ $result[] = array(
+ 'name' => 'th',
+ 'desc' => 'returns the header for the tags column for pagelist',
+ 'return' => array('header' => 'string'),
+ );
+ $result[] = array(
+ 'name' => 'td',
+ 'desc' => 'returns the tag links of a given page',
+ 'params' => array('id' => 'string'),
+ 'return' => array('links' => 'string'),
+ );
+ $result[] = array(
+ 'name' => 'tagLinks',
+ 'desc' => 'generates tag links for given words',
+ 'params' => array('tags' => 'array'),
+ 'return' => array('links' => 'string'),
+ );
+ $result[] = array(
+ 'name' => 'getTopic',
+ 'desc' => 'returns a list of pages tagged with the given keyword',
+ 'params' => array(
+ 'namespace (optional)' => 'string',
+ 'number (not used)' => 'integer',
+ 'tag (required)' => 'string'),
+ 'return' => array('pages' => 'array'),
+ );
+ $result[] = array(
+ 'name' => 'tagRefine',
+ 'desc' => 'refines an array of pages with tags',
+ 'params' => array(
+ 'pages to refine' => 'array',
+ 'refinement tags' => 'string'),
+ 'return' => array('pages' => 'array'),
+ );
+ $result[] = array(
+ 'name' => 'tagOccurrences',
+ 'desc' => 'returns a list of tags with their number of occurrences',
+ 'params' => array(
+ 'list of tags to get the occurrences for' => 'array',
+ 'namespaces to which the search shall be restricted' => 'array',
+ 'if all tags shall be returned (then the first parameter is ignored)' => 'boolean',
+ 'if the namespaces shall be searched recursively' => 'boolean'),
+ 'return' => array('tags' => 'array'),
+ );
+ return $result;
+ }
+
+ /**
+ * Returns the column header for th Pagelist Plugin
+ */
+ function th() {
+ return $this->getLang('tags');
+ }
+
+ /**
+ * Returns the cell data for the Pagelist Plugin
+ */
+ function td($id) {
+ $subject = $this->_getSubjectMetadata($id);
+ return $this->tagLinks($subject);
+ }
+
+ /**
+ * Returns the links for given tags
+ *
+ * @param array $tags an array of tags
+ * @return string HTML link tags
+ */
+ function tagLinks($tags) {
+ if (empty($tags) || ($tags[0] == '')) return '';
+
+ $links = array();
+ foreach ($tags as $tag) {
+ $links[] = $this->tagLink($tag);
+ }
+ return implode(','.DOKU_LF.DOKU_TAB, $links);
+ }
+
+ /**
+ * Returns the link for one given tag
+ *
+ * @param string $tag the tag the link shall point to
+ * @param string $title the title of the link (optional)
+ * @param bool $dynamic if the link class shall be changed if no pages with the specified tag exist
+ * @return string The HTML code of the link
+ */
+ function tagLink($tag, $title = '', $dynamic = false) {
+ global $conf;
+ $svtag = $tag;
+ $tag_title = str_replace('_', ' ', noNS($tag));
+ resolve_pageid($this->namespace, $tag, $exists); // resolve shortcuts
+ if ($exists) {
+ $class = 'wikilink1';
+ $url = wl($tag);
+ if ($conf['useheading']) {
+ // important: set sendond param to false to prevent recursion!
+ $heading = p_get_first_heading($tag, false);
+ if ($heading) $tag_title = $heading;
+ }
+ } else {
+ if ($dynamic) {
+ $pages = $this->getTopic('', 1, $svtag);
+ if (empty($pages)) {
+ $class = 'wikilink2';
+ } else {
+ $class = 'wikilink1';
+ }
+ } else {
+ $class = 'wikilink1';
+ }
+ $url = wl($tag, array('do'=>'showtag', 'tag'=>$svtag));
+ }
+ if (!$title) $title = $tag_title;
+ $link = array(
+ 'href' => $url,
+ 'class' => $class,
+ 'tooltip' => hsc($tag),
+ 'title' => hsc($title)
+ );
+ trigger_event('PLUGIN_TAG_LINK', $link);
+ $link = '<a href="'.$link['href'].'" class="'.$link['class'].'" title="'.$link['tooltip'].'" rel="tag">'.$link['title'].'</a>';
+ return $link;
+ }
+
+ /**
+ * Returns a list of pages with a certain tag; very similar to ft_backlinks()
+ *
+ * @param string $ns A namespace to which all pages need to belong, "." for only the root namespace
+ * @param int $num The maximum number of pages that shall be returned
+ * @param string $tag The tag that shall be searched
+ * @return array The list of pages
+ *
+ * @author Esther Brunner <wikidesign@gmail.com>
+ */
+ function getTopic($ns = '', $num = NULL, $tag = '') {
+ if (!$tag) $tag = $_REQUEST['tag'];
+ $tag = $this->_parseTagList($tag, true);
+ $result = array();
+
+ // find the pages using topic.idx
+ $pages = $this->_tagIndexLookup($tag);
+ if (!count($pages)) return $result;
+
+ foreach ($pages as $page) {
+ // exclude pages depending on ACL and namespace
+ if($this->_notVisible($page, $ns)) continue;
+ $tags = $this->_getSubjectMetadata($page);
+ // don't trust index
+ if (!$this->_checkPageTags($tags, $tag)) continue;
+
+ // get metadata
+ $meta = p_get_metadata($page);
+
+ $perm = auth_quickaclcheck($page);
+
+ // skip drafts unless for users with create privilege
+ $draft = ($meta['type'] == 'draft');
+ if ($draft && ($perm < AUTH_CREATE)) continue;
+
+ $title = $meta['title'];
+ $date = ($this->sort == 'mdate' ? $meta['date']['modified'] : $meta['date']['created'] );
+ $taglinks = $this->tagLinks($tags);
+
+ // determine the sort key
+ if ($this->sort == 'id') $key = $page;
+ elseif ($this->sort == 'ns') {
+ $pos = strrpos($page, ':');
+ if ($pos === false) $key = "\0".$page;
+ else $key = substr_replace($page, "\0\0", $pos, 1);
+ $key = str_replace(':', "\0", $key);
+ } elseif ($this->sort == 'pagename') $key = noNS($page);
+ elseif ($this->sort == 'title') {
+ $key = utf8_strtolower($title);
+ if (empty($key)) $key = str_replace('_', ' ', noNS($page));
+ } else $key = $date;
+ // make sure that the key is unique
+ $key = $this->_uniqueKey($key, $result);
+
+ $result[$key] = array(
+ 'id' => $page,
+ 'title' => $title,
+ 'date' => $date,
+ 'user' => $meta['creator'],
+ 'desc' => $meta['description']['abstract'],
+ 'cat' => $tags[0],
+ 'tags' => $taglinks,
+ 'perm' => $perm,
+ 'exists' => true,
+ 'draft' => $draft, );
+
+ if ($num && count($result) >= $num) break;
+ }
+
+ // finally sort by sort key
+ if ($this->getConf('sortorder') == 'ascending') ksort($result);
+ else krsort($result);
+
+ return $result;
+ }
+
+ /**
+ * Refine found pages with tags (+tag: AND, -tag: (AND) NOT)
+ *
+ * @param array $pages The pages that shall be filtered, each page needs to be an array with a key "id"
+ * @param string $refine The list of tags in the form "tag +tag2 -tag3". The tags will be cleaned.
+ * @return array The filtered list of pages
+ */
+ function tagRefine($pages, $refine) {
+ if (!is_array($pages)) return $pages; // wrong data type
+ $tags = $this->_parseTagList($refine, true);
+ $all_pages = $this->_tagIndexLookup($tags);
+
+ foreach ($pages as $key => $page) {
+ if (!in_array($page['id'], $all_pages)) unset($pages[$key]);
+ }
+
+ return $pages;
+ }
+
+ /**
+ * Get count of occurrences for a list of tags
+ *
+ * @param array $tags array of tags
+ * @param array $namespaces array of namespaces where to count the tags
+ * @param boolean $allTags boolean if all available tags should be counted
+ * @param boolean $recursive boolean if pages in subnamespaces are allowed
+ * @return array
+ */
+ function tagOccurrences($tags, $namespaces = NULL, $allTags = false, $recursive = NULL) {
+ // map with trim here in order to remove newlines from tags
+ if($allTags) $tags = array_map('trim', idx_getIndex('subject', '_w'));
+ $tags = $this->_cleanTagList($tags);
+ $otags = array(); //occurrences
+ if(!$namespaces || $namespaces[0] == '' || !is_array($namespaces)) $namespaces = NULL; // $namespaces not specified
+
+ $indexer = idx_get_indexer();
+ $indexer_pages = $indexer->lookupKey('subject', $tags, array($this, '_tagCompare'));
+
+ $root_allowed = ($namespaces == NULL ? false : in_array('.', $namespaces));
+ if ($recursive === NULL)
+ $recursive = $this->getConf('list_tags_of_subns');
+
+ foreach ($tags as $tag) {
+ if (!isset($indexer_pages[$tag])) continue;
+
+ // just to be sure remove duplicate pages from the list of pages
+ $pages = array_unique($indexer_pages[$tag]);
+
+ // don't count hidden pages or pages the user can't access
+ // for performance reasons this doesn't take drafts into account
+ $pages = array_filter($pages, array($this, '_isVisible'));
+
+ if (empty($pages)) continue;
+
+ if ($namespaces == NULL || ($root_allowed && $recursive)) {
+ // count all pages
+ $otags[$tag] = count($pages);
+ } else if (!$recursive) {
+ // filter by exact namespace
+ $otags[$tag] = 0;
+ foreach ($pages as $page) {
+ $ns = getNS($page);
+ if (($ns == false && $root_allowed) || in_array($ns, $namespaces)) $otags[$tag]++;
+ }
+ } else { // recursive, no root
+ $otags[$tag] = 0;
+ foreach ($pages as $page) {
+ foreach ($namespaces as $ns) {
+ if(strpos($page, $ns.':') === 0 ) {
+ $otags[$tag]++ ;
+ break;
+ }
+ }
+ }
+ }
+ // don't return tags without pages
+ if ($otags[$tag] == 0) unset($otags[$tag]);
+ }
+ return $otags;
+ }
+
+ /**
+ * Get the subject metadata cleaning the result
+ *
+ * @param string $id the page id
+ * @return array
+ */
+ function _getSubjectMetadata($id){
+ $tags = p_get_metadata($id, 'subject');
+ if (!is_array($tags)) $tags = explode(' ', $tags);
+ return array_unique($tags);
+ }
+
+ /**
+ * Tag index lookup
+ *
+ * @param array $tags the tags to filter
+ * @return array the matching page ids
+ */
+ function _tagIndexLookup($tags) {
+ $result = array(); // array of page ids
+
+ $clean_tags = array();
+ foreach ($tags as $i => $tag) {
+ if (($tag[0] == '+') || ($tag[0] == '-'))
+ $clean_tags[$i] = substr($tag, 1);
+ else
+ $clean_tags[$i] = $tag;
+ }
+
+ $indexer = idx_get_indexer();
+ $pages = $indexer->lookupKey('subject', $clean_tags, array($this, '_tagCompare'));
+ // use all pages as basis if the first tag isn't an "or"-tag or if there are no tags given
+ if (empty($tags) || $clean_tags[0] != $tags[0]) $result = $indexer->getPages();
+
+ foreach ($tags as $i => $tag) {
+ $t = $clean_tags[$i];
+ if (!is_array($pages[$t])) $pages[$t] = array();
+
+ if ($tag[0] == '+') { // AND: add only if in both arrays
+ $result = array_intersect($result, $pages[$t]);
+ } elseif ($tag[0] == '-') { // NOT: remove array from docs
+ $result = array_diff($result, $pages[$t]);
+ } else { // OR: add array to docs
+ $result = array_unique(array_merge($result, $pages[$t]));
+ }
+ }
+
+ return $result;
+ }
+
+
+ /**
+ * Splits a string into an array of tags
+ */
+ function _parseTagList($tags, $clean = false) {
+
+ // support for "quoted phrase tags"
+ if (preg_match_all('#".*?"#', $tags, $matches)) {
+ foreach ($matches[0] as $match) {
+ $replace = str_replace(' ', '_', substr($match, 1, -1));
+ $tags = str_replace($match, $replace, $tags);
+ }
+ }
+
+ $tags = preg_split('/ /', $tags, -1, PREG_SPLIT_NO_EMPTY);
+
+ if ($clean) {
+ return $this->_cleanTagList($tags);
+ } else {
+ return $tags;
+ }
+ }
+
+ /**
+ * Clean a list (array) of tags using _cleanTag
+ */
+ function _cleanTagList($tags) {
+ return array_unique(array_map(array($this, '_cleanTag'), $tags));
+ }
+
+ /**
+ * Cleans a tag using cleanID while preserving a possible prefix of + or -
+ */
+ function _cleanTag($tag) {
+ $prefix = substr($tag, 0, 1);
+ $tag = $this->_applyMacro($tag);
+ if ($prefix === '-' || $prefix === '+') {
+ return $prefix.cleanID($tag);
+ } else {
+ return cleanID($tag);
+ }
+ }
+
+ /**
+ * Makes user or date dependent topic lists possible
+ */
+ function _applyMacro($id) {
+ /** @var DokuWiki_Auth_Plugin $auth */
+ global $INFO, $auth;
+
+ $user = $_SERVER['REMOTE_USER'];
+ $group = '';
+ // .htaccess auth doesn't provide the auth object
+ if($auth) {
+ $userdata = $auth->getUserData($user);
+ $group = $userdata['grps'][0];
+ }
+
+ $replace = array(
+ '@USER@' => cleanID($user),
+ '@NAME@' => cleanID($INFO['userinfo']['name']),
+ '@GROUP@' => cleanID($group),
+ '@YEAR@' => date('Y'),
+ '@MONTH@' => date('m'),
+ '@DAY@' => date('d'),
+ );
+ return str_replace(array_keys($replace), array_values($replace), $id);
+ }
+
+ /**
+ * Non-recursive function to check whether an array key is unique
+ *
+ * @author Esther Brunner <wikidesign@gmail.com>
+ * @author Ilya S. Lebedev <ilya@lebedev.net>
+ */
+ function _uniqueKey($key, &$result) {
+
+ // increase numeric keys by one
+ if (is_numeric($key)) {
+ while (array_key_exists($key, $result)) $key++;
+ return $key;
+
+ // append a number to literal keys
+ } else {
+ $num = 0;
+ $testkey = $key;
+ while (array_key_exists($testkey, $result)) {
+ $testkey = $key.$num;
+ $num++;
+ }
+ return $testkey;
+ }
+ }
+
+ /**
+ * Opposite of _notVisible
+ */
+ function _isVisible($id, $ns='') {
+ return !$this->_notVisible($id, $ns);
+ }
+ /**
+ * Check visibility of the page
+ *
+ * @param string $id the page id
+ * @param string $ns the namespace authorized
+ * @return bool if the page is hidden
+ */
+ function _notVisible($id, $ns="") {
+ if (isHiddenPage($id)) return true; // discard hidden pages
+ // discard if user can't read
+ if (auth_quickaclcheck($id) < AUTH_READ) return true;
+ // filter by namespace, root namespace is identified with a dot
+ if($ns == '.') {
+ // root namespace is specified, discard all pages who lay outside the root namespace
+ if(getNS($id) != false) return true;
+ } else {
+ // ("!==0" namespace found at position 0)
+ if ($ns && (strpos(':'.getNS($id).':', ':'.$ns.':') !== 0)) return true;
+ }
+ return !page_exists($id, '', false);
+ }
+
+ /**
+ * Helper function for the indexer in order to avoid interpreting wildcards
+ */
+ function _tagCompare($tag1, $tag2) {
+ return $tag1 === $tag2;
+ }
+
+ /**
+ * Check if the page is a real candidate for the result of the getTopic
+ *
+ * @param array $pagetags tags on the metadata of the page
+ * @param array $tags tags we are looking
+ * @return bool
+ */
+ function _checkPageTags($pagetags, $tags) {
+ $result = false;
+ foreach($tags as $tag) {
+ if ($tag[0] == "+" and !in_array(substr($tag, 1), $pagetags)) $result = false;
+ if ($tag[0] == "-" and in_array(substr($tag, 1), $pagetags)) $result = false;
+ if (in_array($tag, $pagetags)) $result = true;
+ }
+ return $result;
+ }
+
+}
+// vim:ts=4:sw=4:et:
diff --git a/platform/www/lib/plugins/tag/images/tag-toolbar.png b/platform/www/lib/plugins/tag/images/tag-toolbar.png
new file mode 100644
index 0000000..4b274d2
--- /dev/null
+++ b/platform/www/lib/plugins/tag/images/tag-toolbar.png
Binary files differ
diff --git a/platform/www/lib/plugins/tag/images/tag.gif b/platform/www/lib/plugins/tag/images/tag.gif
new file mode 100644
index 0000000..ac445bf
--- /dev/null
+++ b/platform/www/lib/plugins/tag/images/tag.gif
Binary files differ
diff --git a/platform/www/lib/plugins/tag/lang/ar/lang.php b/platform/www/lib/plugins/tag/lang/ar/lang.php
new file mode 100644
index 0000000..d755e37
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/ar/lang.php
@@ -0,0 +1,20 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Muhammad Bashir Al-Noimi <bashir.storm@gmail.com>
+ * @author alhajr <alhajr300@gmail.com>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'العلامة';
+$lang['tags'] = 'العلامات';
+$lang['topic'] = 'الموضوع';
+$lang['count'] = 'العد';
+$lang['toolbar_icon'] = 'إدراج علامة-بناء الجملة';
+$lang['empty_output'] = 'الإخراج فارغة';
+
+$lang['include'] = 'تضمين';
+$lang['exclude'] = 'استبعاد';
+$lang['use_and'] = 'استخدام منطق AND';
+$lang['no_tags'] = 'لم يتم العثور على العلامات ';
diff --git a/platform/www/lib/plugins/tag/lang/ar/settings.php b/platform/www/lib/plugins/tag/lang/ar/settings.php
new file mode 100644
index 0000000..3573cd0
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/ar/settings.php
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Muhammad Bashir Al-Noimi <bashir.storm@gmail.com>
+ * @author alhajr <alhajr300@gmail.com>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['namespace'] = 'فضاء الأسماء الإفتراضي للأقسام';
+$lang['toolbar_icon'] = 'تظهر أيقونة شريط الأدوات (مسح ذاكرة التخزين المؤقت للبيانات//* وذاكرة التخزين المؤقت للمستعرض إذا لم يتم عرض)';
+
+$lang['sortkey'] = 'ترتيب التدوينات حسب:';
+$lang['sortkey_o_cdate'] = 'تاريخ الإنشاء';
+$lang['sortkey_o_mdate'] = 'تاريخ التعديل';
+$lang['sortkey_o_pagename'] = 'إسم الصفحة';
+$lang['sortkey_o_id'] = 'رقم الصفحة';
+$lang['sortkey_o_ns'] = 'نيم سبيس (مساحة الاسم)';
+$lang['sortkey_o_title'] = 'العنوان';
+
+$lang['sortorder'] = 'ترتيب الفرز';
+$lang['sortorder_o_ascending'] = 'ترتيب تصاعدي';
+$lang['sortorder_o_descending'] = 'تنازلي';
+
+$lang['pagelist_flags'] = 'تنسيق إعلام ل taglist (مفصولة بفاصلة، لإعلام المتوفرة راجع وثائق البرنامج المساعد pagelist )';
+
+$lang['list_tags_of_subns'] = 'قائمة أيضا العلامات في مساحات الأسماء الفرعية لمساحة الاسم المحدد (بناء الجملة عدد مرات)';
+
+$lang['tags_list_css'] = 'اختر النمط المطبق على قائمة علامات الصفحات';
+$lang['tags_list_css_o_tags'] = 'أسلوب إفتراضي';
+$lang['tags_list_css_o_tagstop'] = 'الأمثل لقائمة العلامات في أعلى الصفحة';
diff --git a/platform/www/lib/plugins/tag/lang/be/lang.php b/platform/www/lib/plugins/tag/lang/be/lang.php
new file mode 100644
index 0000000..cf61c9e
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/be/lang.php
@@ -0,0 +1,18 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'Тэг';
+$lang['tags'] = 'Тэгі';
+$lang['topic'] = 'Тэмы';
+$lang['count'] = 'Колькасць';
+$lang['toolbar_icon'] = 'Уставіць тэг-сінтаксіс';
+$lang['empty_output'] = 'Пусты вывад';
+
+$lang['include'] = 'Включаць';
+$lang['exclude'] = 'Выключаць';
+$lang['use_and'] = 'Выкарыстоўваць лагічнае AND';
+$lang['no_tags'] = 'Тэгі не знойдзены';
diff --git a/platform/www/lib/plugins/tag/lang/be/settings.php b/platform/www/lib/plugins/tag/lang/be/settings.php
new file mode 100644
index 0000000..4e236dc
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/be/settings.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['namespace'] = 'Прастора імёнаў па змаўчанні для тэгаў';
+$lang['toolbar_icon'] = 'Паказваць кнопку на панэлі інструментаў (калі значок не адлюстроўваецца, ачысціце data/cache/* і кэш браўзэра)';
+
+$lang['sortkey'] = 'Сартаваць спіс старонак па:';
+$lang['sortkey_o_cdate'] = 'даце стварэння';
+$lang['sortkey_o_mdate'] = 'даце рэдагавання';
+$lang['sortkey_o_pagename'] = 'імя старонкі';
+$lang['sortkey_o_id'] = 'ID старонкі';
+$lang['sortkey_o_ns'] = 'прасторы назваў';
+$lang['sortkey_o_title'] = 'загалоўку';
+
+$lang['sortorder'] = 'Парадак сартавання';
+$lang['sortorder_o_ascending'] = 'па ўзрастанні';
+$lang['sortorder_o_descending'] = 'па змяншэнні';
+
+$lang['pagelist_flags'] = 'Прыкметы (flags) фарматавання для спісу тэгаў (коскамі; спіс даступных прыкмет (flags) апісаны ў дакументацыі плагіна Pagelist)';
+
+$lang['list_tags_of_subns'] = 'Таксама паказваць тэгі ў подпространство імёнаў адзначаных прастор імёнаў (сінтаксіс падліку (count))';
+
+$lang['tags_list_css'] = 'Вылучыць стыль для спісу тэгаў на старонках';
+$lang['tags_list_css_o_tags'] = 'стыль па змаўчанні';
+$lang['tags_list_css_o_tagstop'] = 'аптымізацыя для размяшчэння наверсе старонкі';
diff --git a/platform/www/lib/plugins/tag/lang/bg/lang.php b/platform/www/lib/plugins/tag/lang/bg/lang.php
new file mode 100644
index 0000000..89f5be1
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/bg/lang.php
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Kiril <neohidra@gmail.com>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'Етикет';
+$lang['tags'] = 'Етикети';
+$lang['topic'] = 'Тема';
+$lang['count'] = 'Брой';
+$lang['toolbar_icon'] = 'Вмъкване на синтаксис за етикет';
+$lang['empty_output'] = 'Празен изход';
+
+$lang['include'] = 'Включи';
+$lang['exclude'] = 'Изключи';
+$lang['use_and'] = 'Ползван логика AND';
+$lang['no_tags'] = 'Не са открити етикети';
diff --git a/platform/www/lib/plugins/tag/lang/bg/settings.php b/platform/www/lib/plugins/tag/lang/bg/settings.php
new file mode 100644
index 0000000..aba7eb8
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/bg/settings.php
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Kiril <neohidra@gmail.com>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['namespace'] = 'Стандартно именно пространство за етикетите';
+$lang['toolbar_icon'] = 'Показване на икона в лентата с инструменти (ако не виждате бутона изчистете съдържанието на data/cache/* и кеша на браузера ';
+
+$lang['sortkey'] = 'Сортиране на списъците с теми по';
+$lang['sortkey_o_cdate'] = 'дата на създаване';
+$lang['sortkey_o_mdate'] = 'дата на редактиране';
+$lang['sortkey_o_pagename'] = 'име на страница';
+$lang['sortkey_o_id'] = 'ID на страница';
+$lang['sortkey_o_ns'] = 'именно пространство';
+$lang['sortkey_o_title'] = 'заглавие';
+
+$lang['sortorder'] = 'Сортиране';
+$lang['sortorder_o_ascending'] = 'възходящо';
+$lang['sortorder_o_descending'] = 'низходящо';
+
+$lang['pagelist_flags'] = 'Форматиране на флагове за списъка с тагове (разделени със запетая, за наличните флагове вижте документацията на приставката Pagelist)';
+
+$lang['list_tags_of_subns'] = 'Показване и на етикети от подименните пространства (count syntax)';
+
+$lang['tags_list_css'] = 'Изберете стил, който да се прилага към списъка с етикети на страниците';
+$lang['tags_list_css_o_tags'] = 'стандартния';
+$lang['tags_list_css_o_tagstop'] = 'оптимален за списък от етикети над страницата';
diff --git a/platform/www/lib/plugins/tag/lang/ckb/lang.php b/platform/www/lib/plugins/tag/lang/ckb/lang.php
new file mode 100644
index 0000000..0b7f022
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/ckb/lang.php
@@ -0,0 +1,18 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author qezwan <qezwan@gmail.com>
+ */
+
+$lang['tag'] = 'تاگ';
+$lang['tags'] = 'تاگەکان';
+$lang['topic'] = 'بابەت';
+$lang['count'] = '#';
+$lang['toolbar_icon'] = 'دانانی تاگ-ڕستە';
+$lang['empty_output'] = 'دەرچوی بەتاڵ';
+
+$lang['include'] = 'لەخۆدەگرێت';
+$lang['exclude'] = 'دەرکردن';
+$lang['use_and'] = 'بەکارهێنان و';
+$lang['no_tags'] = 'هیچ تاگێک نەدۆزرایەوە';
diff --git a/platform/www/lib/plugins/tag/lang/ckb/settings.php b/platform/www/lib/plugins/tag/lang/ckb/settings.php
new file mode 100644
index 0000000..95c7985
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/ckb/settings.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author qezwan <qezwan@gmail.com>
+ */
+
+$lang['namespace'] = 'بۆشایی ناوی ئاسایی بۆ تاگەکان';
+$lang['toolbar_icon'] = 'پیشاندانی وێنۆکی شریتی ئامڕاز (زانیاری/حەشارگە/* و حەشارگەی وێبگەڕ ئەگەر پیشان نەدرا)';
+
+$lang['sortkey'] = 'پۆلێنکردنی لیستەکانی بابەت بەپێی';
+$lang['sortkey_o_cdate'] = 'بەرواری دروست کردن';
+$lang['sortkey_o_mdate'] = 'دەستکاری بەروار';
+$lang['sortkey_o_pagename'] = 'ناوی پەڕە';
+$lang['sortkey_o_id'] = 'ناسنامەی پەڕە';
+$lang['sortkey_o_ns'] = 'بۆشایی ناو';
+$lang['sortkey_o_title'] = 'ناونیشان';
+
+$lang['sortorder'] = 'ڕیزکردن لە ریزبەند';
+$lang['sortorder_o_ascending'] = 'بەرەو سەرەوە';
+$lang['sortorder_o_descending'] = 'بەرەو خوار';
+
+$lang['pagelist_flags'] = 'فۆرماتکردنی ئاڵاکان بۆ لیستی تاگ (کۆما-جیاکراوە, بۆ ئاڵای بەردەست ببینە دۆکیومێنتەکان لە پیتەلیست پێوەکراو)';
+
+$lang['list_tags_of_subns'] = 'هەروەها پێرستی تاگەکان لە ژێربۆشایی ناوەکانی بۆشایی ناوێکی تایبەت دیاریکراو (ڕستەسازی ژماردن)';
+
+$lang['tags_list_css'] = 'هەڵبژاردنی شێوازی کارپێکراو بۆ لیستی تاگی لاپەڕەکان';
+$lang['tags_list_css_o_tags'] = 'شێوازی بنەڕەت';
+$lang['tags_list_css_o_tagstop'] = 'باشترکراوە بۆ لیستی تاگەکان لە سەرەوەی لاپەڕەکە';
diff --git a/platform/www/lib/plugins/tag/lang/cs/lang.php b/platform/www/lib/plugins/tag/lang/cs/lang.php
new file mode 100644
index 0000000..7aa7353
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/cs/lang.php
@@ -0,0 +1,22 @@
+<?php
+
+/*
+ * Czech language file (UTF-8 encoding)
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Lukas Zapletal <lukas.zapletal@gmail.com>
+ * @author Robert Surý <rsurycz@seznam.cz>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'Tag';
+$lang['tags'] = 'Tagy';
+$lang['topic'] = 'Téma';
+$lang['count'] = 'Počet';
+$lang['toolbar_icon'] = 'Vlož Tag-Syntax';
+$lang['empty_output'] = 'Prázdný výstup';
+
+$lang['include'] = 'Include';
+$lang['exclude'] = 'Exclude';
+$lang['use_and'] = 'Použít logické AND';
+$lang['no_tags'] = 'Nenalezeny žádné tagy';
diff --git a/platform/www/lib/plugins/tag/lang/cs/settings.php b/platform/www/lib/plugins/tag/lang/cs/settings.php
new file mode 100644
index 0000000..4edc9a7
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/cs/settings.php
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ * Czech language file (UTF-8 encoding)
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Lukas Zapletal <lukas.zapletal at gmail dot com>
+ */
+
+$lang['namespace'] = 'Výchozí jmenný prostor pro tagy';
+$lang['toolbar_icon'] = 'Zobrazit toolbar ikonku (pokud se nezobrazuje, smažte data/cache/* a cache prohlížeče)';
+
+$lang['sortkey'] = 'razení zápisků podle';
+$lang['sortkey_o_cdate'] = 'data vytvoření';
+$lang['sortkey_o_mdate'] = 'data modifikace';
+$lang['sortkey_o_pagename'] = 'názvu stránky';
+$lang['sortkey_o_id'] = 'ID stránky';
+$lang['sortkey_o_ns'] = 'jmenný prostor';
+$lang['sortkey_o_title'] = 'nadpis';
+
+$lang['sortorder'] = 'pořadí';
+$lang['sortorder_o_ascending'] = 'vzestupné';
+$lang['sortorder_o_descending'] = 'sestupné';
+
+$lang['pagelist_flags'] = 'Formátovací flags pro list tagů (comma-separated, viz dostupné flags v dokumentaci pluginu pagelist)';
+
+$lang['list_tags_of_subns'] = 'List také tags in podjmenných prostorů daného jmenného prostoru';
+
+$lang['tags_list_css'] = 'Vyber styl aplikovaný na stránku seznam tagů ';
+$lang['tags_list_css_o_tags'] = 'výchozí styl';
+$lang['tags_list_css_o_tagstop'] = 'optimalizováno pro zobrazení seznamu tagů v horní části stránky';
diff --git a/platform/www/lib/plugins/tag/lang/cy/lang.php b/platform/www/lib/plugins/tag/lang/cy/lang.php
new file mode 100644
index 0000000..bf8587d
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/cy/lang.php
@@ -0,0 +1,20 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Alan Davies <ben.brynsadler@gmail.com>
+ * @author diafol <ben.brynsadler@gmail.com>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'Tag';
+$lang['tags'] = 'Tagiau';
+$lang['topic'] = 'Testun';
+$lang['count'] = 'Meintiau';
+$lang['toolbar_icon'] = 'Mewnosod Cystrawen-Tag';
+$lang['empty_output'] = 'Allbwn Gwag';
+
+$lang['include'] = 'Cynnwys';
+$lang['exclude'] = 'Eithrio';
+$lang['use_and'] = 'Defnyddiwch resymeg AND';
+$lang['no_tags'] = 'Dim tagiau wedi\'u darganfod';
diff --git a/platform/www/lib/plugins/tag/lang/cy/settings.php b/platform/www/lib/plugins/tag/lang/cy/settings.php
new file mode 100644
index 0000000..a9b2640
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/cy/settings.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Alan Davies <ben.brynsadler@gmail.com>
+ */
+
+$lang['namespace'] = 'Namespace diofyn ar gyfer tagiau';
+$lang['toolbar_icon'] = 'Dangos eicon y bar offer (cliriwch data/cache/* a storfa eich porwr os \'dyw e ddim yn ymddangos)';
+
+$lang['sortkey'] = 'trefnu rhestr testunau gan';
+$lang['sortkey_o_cdate'] = 'dyddiad creu';
+$lang['sortkey_o_mdate'] = 'dyddiad newid';
+$lang['sortkey_o_pagename'] = 'enw\'r dudalen';
+$lang['sortkey_o_id'] = 'ID tudalen';
+$lang['sortkey_o_ns'] = 'namespace';
+$lang['sortkey_o_title'] = 'teitl';
+
+$lang['sortorder'] = 'trefn';
+$lang['sortorder_o_ascending'] = 'esgyn';
+$lang['sortorder_o_descending'] = 'disgyn';
+
+$lang['pagelist_flags'] = 'Fflagiau fformatio ar gyfer y rhestr tagiau (gwahanu gan goma; ar gyfer fflagiau posib, gwelwch ddogfennaeth yr ategyn \'Pagelist\')';
+
+$lang['list_tags_of_subns'] = 'Rhestrwch dagiau hefyd yn y subnamespaces o\'r namespace penodol (cystrawen cyfri) ';
+
+$lang['tags_list_css'] = 'Dewis arddull i osod ar restr dagiau tudalennau';
+$lang['tags_list_css_o_tags'] = 'arddull ddiofyn';
+$lang['tags_list_css_o_tagstop'] = 'optimeiddiwyd am restr dagiau ar ben y dudalen';
diff --git a/platform/www/lib/plugins/tag/lang/da/lang.php b/platform/www/lib/plugins/tag/lang/da/lang.php
new file mode 100644
index 0000000..add2cb3
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/da/lang.php
@@ -0,0 +1,20 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Søren Birk <soer9648@eucl.dk>
+ * @author Jacob Palm <jacobpalmdk@icloud.com>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'Tag';
+$lang['tags'] = 'Tags';
+$lang['topic'] = 'Emne';
+$lang['count'] = 'Mængde';
+$lang['toolbar_icon'] = 'Indsæt Tag-Syntaks';
+$lang['empty_output'] = 'Tomt Output';
+
+$lang['include'] = 'Inkludér';
+$lang['exclude'] = 'Ekskludér';
+$lang['use_and'] = 'Brug logik AND';
+$lang['no_tags'] = 'Ingen tags fundet';
diff --git a/platform/www/lib/plugins/tag/lang/da/settings.php b/platform/www/lib/plugins/tag/lang/da/settings.php
new file mode 100644
index 0000000..05f475d
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/da/settings.php
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Søren Birk <soer9648@eucl.dk>
+ * @author Jacob Palm <jacobpalmdk@icloud.com>
+ */
+
+$lang['namespace'] = 'Standard navnerum for tags';
+$lang['toolbar_icon'] = 'Vis ikon for værktøjslinje (ryd data/cache/* og browser-cache, hvis den ikke vises)';
+
+$lang['sortkey'] = 'sortér emneliste efter';
+$lang['sortkey_o_cdate'] = 'oprettelsesdato';
+$lang['sortkey_o_mdate'] = 'redigeringsdato';
+$lang['sortkey_o_pagename'] = 'sidenavn';
+$lang['sortkey_o_id'] = 'side-ID';
+$lang['sortkey_o_ns'] = 'navnerum';
+$lang['sortkey_o_title'] = 'titel';
+
+$lang['sortorder'] = 'sorteringsorden';
+$lang['sortorder_o_ascending'] = 'stigende';
+$lang['sortorder_o_descending'] = 'faldende';
+
+$lang['pagelist_flags'] = 'Formateringsflag for tag-listen (kommasepareret - se dokumentationen for pagelist plugin, for tilgængelige flag)';
+
+$lang['list_tags_of_subns'] = 'List også tags i under-navnerum for et specificeret navnerum (tæl syntaks)';
+
+$lang['tags_list_css'] = 'Vælg stil der skal anvendes til tag-listen på sider';
+$lang['tags_list_css_o_tags'] = 'standard stil';
+$lang['tags_list_css_o_tagstop'] = 'optimeret til visning af tag-liste øverst på side';
diff --git a/platform/www/lib/plugins/tag/lang/de-informal/lang.php b/platform/www/lib/plugins/tag/lang/de-informal/lang.php
new file mode 100644
index 0000000..eac3886
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/de-informal/lang.php
@@ -0,0 +1,20 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Sebastian Klemm <sebastian_klemm@freenet.de>
+ * @author rnck <dokuwiki@rnck.de>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'Tag';
+$lang['tags'] = 'Tags';
+$lang['topic'] = 'Thema';
+$lang['count'] = 'Menge';
+$lang['toolbar_icon'] = 'Tag-Syntax einfügen';
+$lang['empty_output'] = 'Leere Ausgabe';
+
+$lang['include'] = 'Einschließen';
+$lang['exclude'] = 'Ausschließen';
+$lang['use_and'] = 'Logisches AND verwenden';
+$lang['no_tags'] = 'Keine Tags gefunden';
diff --git a/platform/www/lib/plugins/tag/lang/de-informal/settings.php b/platform/www/lib/plugins/tag/lang/de-informal/settings.php
new file mode 100644
index 0000000..7b91485
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/de-informal/settings.php
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Sebastian Klemm <sebastian_klemm@freenet.de>
+ * @author rnck <dokuwiki@rnck.de>
+ */
+
+$lang['namespace'] = 'Standard-Namensraum für Tags';
+$lang['toolbar_icon'] = 'Toolbar-Symbol anzeigen (data/cache/* und den Browser-Cache löschen, wenn das Symbol nicht angezeigt wird)';
+
+$lang['sortkey'] = 'Themenlisten sortieren nach:';
+$lang['sortkey_o_cdate'] = 'Erstellungsdatum';
+$lang['sortkey_o_mdate'] = 'Änderungsdatum';
+$lang['sortkey_o_pagename'] = 'Seitenname';
+$lang['sortkey_o_id'] = 'Seiten-ID';
+$lang['sortkey_o_ns'] = 'Namensraum';
+$lang['sortkey_o_title'] = 'Titel';
+
+$lang['sortorder'] = 'Sortierrichtung';
+$lang['sortorder_o_ascending'] = 'aufsteigend';
+$lang['sortorder_o_descending'] = 'absteigend';
+
+$lang['pagelist_flags'] = 'Formatieroptionen für die Tagliste (kommasepariert, für eine Liste der verfügbaren Optionen siehe die Dokumentation des Pagelist Plugins)';
+
+$lang['list_tags_of_subns'] = 'Tags anzeigen, die in Subnamespaces von angegebeben Namespaces liegen (count syntax)';
+
+$lang['tags_list_css'] = 'Wähle ein Aussehen für die Tag-Liste auf der Seite';
+$lang['tags_list_css_o_tags'] = 'Standardaussehen';
+$lang['tags_list_css_o_tagstop'] = 'Optimierte Tag-Liste für Seitenkopf';
diff --git a/platform/www/lib/plugins/tag/lang/de/lang.php b/platform/www/lib/plugins/tag/lang/de/lang.php
new file mode 100644
index 0000000..284e013
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/de/lang.php
@@ -0,0 +1,22 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Esther Brunner <wikidesign@gmail.com>
+ * @author Dominik Eckelmann <deckelmann@gmail.com>
+ * @author Dennis Plöger <develop@dieploegers.de>
+ * @author Dana <dannax3@gmx.de>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'Tag';
+$lang['tags'] = 'Tags';
+$lang['topic'] = 'Thema';
+$lang['count'] = 'Menge';
+$lang['toolbar_icon'] = 'Tag-Syntax einfügen';
+$lang['empty_output'] = 'Leere Ausgabe';
+
+$lang['include'] = 'Einschließen';
+$lang['exclude'] = 'Ausschließen';
+$lang['use_and'] = 'Logisches AND verwenden';
+$lang['no_tags'] = 'Keine Tags gefunden';
diff --git a/platform/www/lib/plugins/tag/lang/de/settings.php b/platform/www/lib/plugins/tag/lang/de/settings.php
new file mode 100644
index 0000000..8b5b079
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/de/settings.php
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Esther Brunner <wikidesign@gmail.com>
+ * @author Padhie <develop@padhie.de>
+ * @author rnck <dokuwiki@rnck.de>
+ */
+
+$lang['namespace'] = 'Standard-Namensraum für Tags';
+$lang['toolbar_icon'] = 'Toolbar-Symbol anzeigen (data/cache/* und den Browser-Cache löschen, wenn das Symbol nicht angezeigt wird)';
+
+$lang['sortkey'] = 'Themenlisten sortieren nach:';
+$lang['sortkey_o_cdate'] = 'Erstellungsdatum';
+$lang['sortkey_o_mdate'] = 'Änderungsdatum';
+$lang['sortkey_o_pagename'] = 'Seitenname';
+$lang['sortkey_o_id'] = 'Seiten-ID';
+$lang['sortkey_o_ns'] = 'Namensraum';
+$lang['sortkey_o_title'] = 'Titel';
+
+$lang['sortorder'] = 'Sortierrichtung';
+$lang['sortorder_o_ascending'] = 'aufsteigend';
+$lang['sortorder_o_descending'] = 'absteigend';
+
+$lang['pagelist_flags'] = 'Formatieroptionen für die Tagliste (kommasepariert, für eine Liste der verfügbaren Optionen siehe die Dokumentation des Pagelist Plugins)';
+
+$lang['list_tags_of_subns'] = 'Tags anzeigen, die in Subnamespaces von angegebeben Namespaces liegen (count syntax)';
+
+$lang['tags_list_css'] = 'Wähle ein Aussehen für die Tag-Liste auf der Seite';
+$lang['tags_list_css_o_tags'] = 'Standardaussehen';
+$lang['tags_list_css_o_tagstop'] = 'Optimierte Tag-Liste für Seitenkopf';
diff --git a/platform/www/lib/plugins/tag/lang/el/lang.php b/platform/www/lib/plugins/tag/lang/el/lang.php
new file mode 100644
index 0000000..8a9637a
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/el/lang.php
@@ -0,0 +1,18 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'Ετικέτα';
+$lang['tags'] = 'Ετικέτες';
+$lang['topic'] = 'Θέμα';
+$lang['count'] = 'Ποσότητα';
+$lang['toolbar_icon'] = 'Εισαγωγή ετικέτας-σύνταξης';
+$lang['empty_output'] = 'Άδεια εξόδου';
+
+$lang['include'] = 'Συμπερίληψη';
+$lang['exclude'] = 'Εξαίρεση';
+$lang['use_and'] = 'Χρήση λογικής AND';
+$lang['no_tags'] = 'Δεν βρέθηκαν ετικέτες';
diff --git a/platform/www/lib/plugins/tag/lang/el/settings.php b/platform/www/lib/plugins/tag/lang/el/settings.php
new file mode 100644
index 0000000..90103f1
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/el/settings.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['namespace'] = 'Προεπιλεγμένος χώρος ονομάτων για ετικέτες';
+$lang['toolbar_icon'] = 'Εμφάνιση εικονιδίου γραμμής εργαλείων (εκκαθάριση "data/cache/*" και προσωρινή μνήμη του προγράμματος περιήγησης εάν δεν εμφανίζεται)';
+
+$lang['sortkey'] = 'ταξινόμηση λιστών θεμάτων κατά';
+$lang['sortkey_o_cdate'] = 'ημερομηνία δημιουργίας';
+$lang['sortkey_o_mdate'] = 'ημερομηνία τροποποίησης';
+$lang['sortkey_o_pagename'] = 'όνομα σελίδας';
+$lang['sortkey_o_id'] = 'αναγνωριστικό σελίδας';
+$lang['sortkey_o_ns'] = 'namespace';
+$lang['sortkey_o_title'] = 'τίτλος';
+
+$lang['sortorder'] = 'ταξινόμηση ταξινόμησης';
+$lang['sortorder_o_ascending'] = 'αύξουσα';
+$lang['sortorder_o_descending'] = 'φθίνουσα';
+
+$lang['pagelist_flags'] = 'Μορφοποίηση σημαιών για τη λίστα ετικετών (διαχωρισμένα με κόμμα, για τις διαθέσιμες σημαίες δείτε την τεκμηρίωση της προσθήκης Pagelist)';
+
+$lang['list_tags_of_subns'] = 'Λίστα επίσης ετικετών σε δευτερεύοντες χώρους ενός καθορισμένου χώρου ονομάτων (σύνταξη μέτρησης)';
+
+$lang['tags_list_css'] = 'Επιλέξτε στυλ που εφαρμόζεται στη σελίδα\' λίστα ετικετών';
+$lang['tags_list_css_o_tags'] = 'προεπιλεγμένο στυλ';
+$lang['tags_list_css_o_tagstop'] = 'βελτιστοποιημένη για λίστα ετικετών στο επάνω μέρος της σελίδας';
diff --git a/platform/www/lib/plugins/tag/lang/en/lang.php b/platform/www/lib/plugins/tag/lang/en/lang.php
new file mode 100644
index 0000000..1764d5b
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/en/lang.php
@@ -0,0 +1,23 @@
+<?php
+
+/*
+ * English language file
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Esther Brunner <wikidesign@gmail.com>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+// custom language strings for the plugin
+$lang['tag'] = 'Tag';
+$lang['tags'] = 'Tags';
+$lang['topic'] = 'Topic';
+$lang['count'] = 'Quantity';
+$lang['toolbar_icon'] = 'Insert Tag-Syntax';
+$lang['empty_output'] = 'Empty Output';
+
+// search form of tagsearch syntax
+$lang['include'] = 'Include';
+$lang['exclude'] = 'Exclude';
+$lang['use_and'] = 'Use logic AND';
+$lang['no_tags'] = 'No tags found';
diff --git a/platform/www/lib/plugins/tag/lang/en/settings.php b/platform/www/lib/plugins/tag/lang/en/settings.php
new file mode 100644
index 0000000..e7d22f2
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/en/settings.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * English language file
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Esther Brunner <wikidesign@gmail.com>
+ */
+
+// for the configuration manager
+$lang['namespace'] = 'Default namespace for tags';
+$lang['toolbar_icon'] = 'Show toolbar icon (clear data/cache/* and browser cache if it\'s not displayed)';
+
+$lang['sortkey'] = 'sort topic lists by';
+$lang['sortkey_o_cdate'] = 'creation date';
+$lang['sortkey_o_mdate'] = 'modification date';
+$lang['sortkey_o_pagename'] = 'page name';
+$lang['sortkey_o_id'] = 'page ID';
+$lang['sortkey_o_ns'] = 'namespace';
+$lang['sortkey_o_title'] = 'title';
+
+$lang['sortorder'] = 'sort order';
+$lang['sortorder_o_ascending'] = 'ascending';
+$lang['sortorder_o_descending'] = 'descending';
+
+$lang['pagelist_flags'] = 'Formatting flags for the taglist (comma-separated, for available flags see the documentation of the Pagelist Plugin)';
+
+$lang['list_tags_of_subns'] = 'List also tags in subnamespaces of a specified namespace (count syntax)';
+
+$lang['tags_list_css'] = 'Choose style applied to pages\' tags list';
+$lang['tags_list_css_o_tags'] = 'default style';
+$lang['tags_list_css_o_tagstop'] = 'optimized for tags list at top of page';
diff --git a/platform/www/lib/plugins/tag/lang/eo/lang.php b/platform/www/lib/plugins/tag/lang/eo/lang.php
new file mode 100644
index 0000000..d9a4eeb
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/eo/lang.php
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Ljosxa <ka2pink@gmail.com>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'Marko';
+$lang['tags'] = 'Markoj';
+$lang['topic'] = 'Temo';
+$lang['count'] = 'Kvanto';
+$lang['toolbar_icon'] = 'Enmeti Marko-sintakson';
+$lang['empty_output'] = 'Malplenigi Eligon';
+
+$lang['include'] = 'Inkluzivi';
+$lang['exclude'] = 'Ekskluzivi';
+$lang['use_and'] = 'Uzi logikon AND';
+$lang['no_tags'] = 'Neniuj markoj trovitaj';
diff --git a/platform/www/lib/plugins/tag/lang/eo/settings.php b/platform/www/lib/plugins/tag/lang/eo/settings.php
new file mode 100644
index 0000000..4d011fc
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/eo/settings.php
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Ljosxa <ka2pink@gmail.com>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['namespace'] = 'Kutima nomospaco por markoj';
+$lang['toolbar_icon'] = 'Vidigi ilaran ikonon (nuligu data/cache/* kaj foliumilan kasxmemoron se gxi ne aperis)';
+
+$lang['sortkey'] = 'ordigi tem-liston laux';
+$lang['sortkey_o_cdate'] = 'dato de kreo';
+$lang['sortkey_o_mdate'] = 'dato de modifo';
+$lang['sortkey_o_pagename'] = 'nomo de pagxo';
+$lang['sortkey_o_id'] = 'pagxa ID';
+$lang['sortkey_o_ns'] = 'nomospaco';
+$lang['sortkey_o_title'] = 'temo';
+
+$lang['sortorder'] = 'ordigo';
+$lang['sortorder_o_ascending'] = 'kreskanta';
+$lang['sortorder_o_descending'] = 'malkreskanta';
+
+$lang['pagelist_flags'] = 'Formatigaj flagoj por marko-listo (perkome disigita, uzataj flagoj vidu en priskribo de kromprogramo "Pagelist")';
+
+$lang['list_tags_of_subns'] = 'Listigi ankaux markoj en subnomospacoj de indikita nomospaco ("count" sintakso)';
+
+$lang['tags_list_css'] = 'Elektu stilon aplikitan al la listo de etikedoj de paĝoj';
+$lang['tags_list_css_o_tags'] = 'defaŭlta stilo';
+$lang['tags_list_css_o_tagstop'] = 'optimumigita por listo de etikedoj supre de paĝo';
diff --git a/platform/www/lib/plugins/tag/lang/es/lang.php b/platform/www/lib/plugins/tag/lang/es/lang.php
new file mode 100644
index 0000000..0aab6dd
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/es/lang.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Domingo Redal <docxml@gmail.com>
+ * @author Digna González Otero <digna.gonzalezotero [at] gmail [dot] com>
+ * @author Camilo Sampedro <sampedro1903@gmail.com>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'Etiqueta';
+$lang['tags'] = 'Etiquetas';
+$lang['topic'] = 'Tema';
+$lang['count'] = 'Cantidad';
+$lang['toolbar_icon'] = 'Insertar sintaxis de etiqueta';
+$lang['empty_output'] = 'Salida vacía';
+
+$lang['include'] = 'Incluir';
+$lang['exclude'] = 'Excluir';
+$lang['use_and'] = 'Use lógica AND';
+$lang['no_tags'] = 'Ninguna etiqueta encontrada';
diff --git a/platform/www/lib/plugins/tag/lang/es/settings.php b/platform/www/lib/plugins/tag/lang/es/settings.php
new file mode 100644
index 0000000..10a012f
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/es/settings.php
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Digna González Otero <digna.gonzalezotero [at] gmail [dot] com>
+ * @author Camilo Sampedro <sampedro1903@gmail.com>
+ * @author Domingo Redal <docxml@gmail.com>
+ */
+
+$lang['namespace'] = 'Espacio de nombres por defecto para las etiquetas';
+$lang['toolbar_icon'] = 'Mostrar el ícono en la barra (borra data/cache/ y el caché del navegador si no es visible)';
+
+$lang['sortkey'] = 'ordenar las listas de temas por';
+$lang['sortkey_o_cdate'] = 'fecha de creación';
+$lang['sortkey_o_mdate'] = 'fecha de modificación';
+$lang['sortkey_o_pagename'] = 'nombre de la página';
+$lang['sortkey_o_id'] = 'ID de la página';
+$lang['sortkey_o_ns'] = 'nombre de espacio';
+$lang['sortkey_o_title'] = 'título';
+
+$lang['sortorder'] = 'tipo de ordenación';
+$lang['sortorder_o_ascending'] = 'ascendente';
+$lang['sortorder_o_descending'] = 'descendente';
+
+$lang['pagelist_flags'] = 'Dándole formato para la lista de etiquetas (separadas por coma, para ver los banderas (flags) consultar la documentación del plugin)';
+
+$lang['list_tags_of_subns'] = 'Listar también etiquetas en subespacios de nombre en un espacio de nombre específico (recuento de sintaxis)';
+
+$lang['tags_list_css'] = 'Elija el estilo aplicado a la página de lista de etiquetas';
+$lang['tags_list_css_o_tags'] = 'estilo por defecto';
+$lang['tags_list_css_o_tagstop'] = 'optimizado para la lista de etiquetas en la parte superior de la página';
diff --git a/platform/www/lib/plugins/tag/lang/fa/lang.php b/platform/www/lib/plugins/tag/lang/fa/lang.php
new file mode 100644
index 0000000..30086c3
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/fa/lang.php
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author sam01 <m.sajad079@gmail.com>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'برچسب';
+$lang['tags'] = 'برچسب‌ها';
+$lang['topic'] = 'موضوع';
+$lang['count'] = 'مقدار';
+$lang['toolbar_icon'] = 'درج نحوهٔ ترکیب برچسب';
+$lang['empty_output'] = 'خروجی خالی';
+
+$lang['include'] = 'عبارتند از';
+$lang['exclude'] = 'محروم کردن';
+$lang['use_and'] = 'از منطق AND استفاده کنید';
+$lang['no_tags'] = 'برچسبی یافت نشد';
diff --git a/platform/www/lib/plugins/tag/lang/fa/settings.php b/platform/www/lib/plugins/tag/lang/fa/settings.php
new file mode 100644
index 0000000..50578e8
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/fa/settings.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author sam01 <m.sajad079@gmail.com>
+ */
+
+$lang['namespace'] = 'فضای نام پیشفرض برای برچسب‌ها';
+$lang['toolbar_icon'] = 'آیکون نمایش نوار ابزار (پاک کردن اطلاعات/کش/ * و کش مرورگر اگر چیزی نمایش داده نمی‌شود)';
+
+$lang['sortkey'] = 'مرتب‌ سازی لیست موضوع توسط';
+$lang['sortkey_o_cdate'] = 'تاریخ ایجاد';
+$lang['sortkey_o_mdate'] = 'تاریخ اصلاح';
+$lang['sortkey_o_pagename'] = 'نام صفحه';
+$lang['sortkey_o_id'] = 'آیدی صفحه';
+$lang['sortkey_o_ns'] = 'فضای نام';
+$lang['sortkey_o_title'] = 'عنوان';
+
+$lang['sortorder'] = 'مرتب سازی سفارشی';
+$lang['sortorder_o_ascending'] = 'صعودی';
+$lang['sortorder_o_descending'] = 'نزولی';
+
+$lang['pagelist_flags'] = 'پرچم قالب بندی برای لیست برچسب‌ها (جداکردن با کاما، برای پرچم‌های موجود اسناد لیست صفحه‌ای پلاگین را ببینید)';
+
+$lang['list_tags_of_subns'] = 'لیست برچسب‌ها در فضاهای فرعی از یک فضای نام خاص (تعداد نحوهٔ ترکیب)';
+
+$lang['tags_list_css'] = 'انتخاب سبک اعمال شده‌ی صفحات \' لیست برچسب‌ها';
+$lang['tags_list_css_o_tags'] = 'سبک پیش‌فرض';
+$lang['tags_list_css_o_tagstop'] = 'بهینه سازی شده برای لیست برچسب‌ها در بالای صفحه';
diff --git a/platform/www/lib/plugins/tag/lang/fi/lang.php b/platform/www/lib/plugins/tag/lang/fi/lang.php
new file mode 100644
index 0000000..6aa382f
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/fi/lang.php
@@ -0,0 +1,18 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'Tunniste';
+$lang['tags'] = 'Tunnisteet';
+$lang['topic'] = 'Aihe';
+$lang['count'] = 'Määrä';
+$lang['toolbar_icon'] = 'Lisää tunniste-syntakse';
+$lang['empty_output'] = 'Tyhjä tulos';
+
+$lang['include'] = 'Sisällytä';
+$lang['exclude'] = 'Sulje pois';
+$lang['use_and'] = 'Käytä logiikkaa JA';
+$lang['no_tags'] = 'Tunnisteita ei löytynyt';
diff --git a/platform/www/lib/plugins/tag/lang/fi/settings.php b/platform/www/lib/plugins/tag/lang/fi/settings.php
new file mode 100644
index 0000000..ba8c9bf
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/fi/settings.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['namespace'] = 'Tunnisteiden oletusnimitila';
+$lang['toolbar_icon'] = 'Näytä työkalurivin kuvake (tyhjennä data/cache/* ja selaimen välimuisti, jos sitä ei näy)';
+
+$lang['sortkey'] = 'lajittele aiheluettelot';
+$lang['sortkey_o_cdate'] = 'luomispäivä';
+$lang['sortkey_o_mdate'] = 'muokkauspäivä';
+$lang['sortkey_o_pagename'] = 'sivun nimi';
+$lang['sortkey_o_id'] = 'sivun tunnus';
+$lang['sortkey_o_ns'] = 'nimitila';
+$lang['sortkey_o_title'] = 'otsikko';
+
+$lang['sortorder'] = 'lajittelujärjestys';
+$lang['sortorder_o_ascending'] = 'nouseva';
+$lang['sortorder_o_descending'] = 'laskeva';
+
+$lang['pagelist_flags'] = 'Tagilistan lippujen muotoilu (pilkuilla erotettu, saatavilla olevat liput katso sivulista-laajennuksen ohjeista)';
+
+$lang['list_tags_of_subns'] = 'Luettele myös tunnisteet määritetyn nimiavaruuden alitunnustiloissa (laskesyntaksi)';
+
+$lang['tags_list_css'] = 'Valitse sivujen tunnisteiden luetteloon käytetty tyyli';
+$lang['tags_list_css_o_tags'] = 'oletustyyli';
+$lang['tags_list_css_o_tagstop'] = 'optimoitu tunnisteiden luetteloon sivun yläosassa';
diff --git a/platform/www/lib/plugins/tag/lang/fr/lang.php b/platform/www/lib/plugins/tag/lang/fr/lang.php
new file mode 100644
index 0000000..553ead4
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/fr/lang.php
@@ -0,0 +1,20 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Nicolas Friedli <nicolas@theologique.ch>
+ * @author Schplurtz le Déboulonné <Schplurtz@laposte.net>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'Étiquette';
+$lang['tags'] = 'Étiquettes';
+$lang['topic'] = 'Sujet';
+$lang['count'] = 'Quantité';
+$lang['toolbar_icon'] = 'Insérer des étiquettes';
+$lang['empty_output'] = 'Pas de résultat';
+
+$lang['include'] = 'Inclure';
+$lang['exclude'] = 'Exclure';
+$lang['use_and'] = 'Utiliser la logique AND';
+$lang['no_tags'] = 'Aucune étiquette trouvée';
diff --git a/platform/www/lib/plugins/tag/lang/fr/settings.php b/platform/www/lib/plugins/tag/lang/fr/settings.php
new file mode 100644
index 0000000..4163860
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/fr/settings.php
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Damien Raude-Morvan <drazzib@drazzib.com>
+ * @author Stanislas Reltgen <stanislas@reltgen.net>
+ * @author NicolasFriedli <nicolas@theologique.ch>
+ * @author Olivier Humbert <trebmuh@tuxfamily.org>
+ * @author Schplurtz le Déboulonné <Schplurtz@laposte.net>
+ */
+
+$lang['namespace'] = 'Dossier par défaut pour les étiquettes';
+$lang['toolbar_icon'] = 'Afficher l\'icône dans la barre d\'outils (purger data/cache/* et le cache du navigateur si il n\'apparait pas)';
+
+$lang['sortkey'] = 'trier par&nbsp;:';
+$lang['sortkey_o_cdate'] = 'date de création';
+$lang['sortkey_o_mdate'] = 'date de modification';
+$lang['sortkey_o_pagename'] = 'nom de la page';
+$lang['sortkey_o_id'] = 'ID de la page';
+$lang['sortkey_o_ns'] = 'catégorie';
+$lang['sortkey_o_title'] = 'titre';
+
+$lang['sortorder'] = 'ordre';
+$lang['sortorder_o_ascending'] = 'croissant';
+$lang['sortorder_o_descending'] = 'décroissant';
+
+$lang['pagelist_flags'] = 'Paramètres d\'affichage pour lister les pages (séparés par des virgules, pour la liste des paramètres voir la documentation du greffon pagelist)';
+
+$lang['list_tags_of_subns'] = 'Lister les étiquettes présentes aussi dans les sous-dossiers (syntaxe count)';
+
+$lang['tags_list_css'] = 'Style appliqué à la liste de étiquettes des pages';
+$lang['tags_list_css_o_tags'] = 'style par défaut';
+$lang['tags_list_css_o_tagstop'] = 'optimisé pour les listes d\'étiquettes en haut de page';
diff --git a/platform/www/lib/plugins/tag/lang/he/lang.php b/platform/www/lib/plugins/tag/lang/he/lang.php
new file mode 100644
index 0000000..d7f5a06
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/he/lang.php
@@ -0,0 +1,18 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'תייג';
+$lang['tags'] = 'תגים';
+$lang['topic'] = 'נושא';
+$lang['count'] = 'כַּמוּת';
+$lang['toolbar_icon'] = 'הוסף תחביר תג';
+$lang['empty_output'] = 'פלט ריק';
+
+$lang['include'] = 'לִכלוֹל';
+$lang['exclude'] = 'אל תכלול';
+$lang['use_and'] = 'השתמש בהיגיון AND';
+$lang['no_tags'] = 'לא נמצאו תגים';
diff --git a/platform/www/lib/plugins/tag/lang/he/settings.php b/platform/www/lib/plugins/tag/lang/he/settings.php
new file mode 100644
index 0000000..f1613ec
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/he/settings.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['namespace'] = 'מרחב שמות ברירת מחדל לתגים';
+$lang['toolbar_icon'] = 'הצג את סמל סרגל הכלים (נקה "data/cache/*" ומטמון הדפדפן אם הוא לא מוצג)';
+
+$lang['sortkey'] = 'מיין רשימות נושאים לפי';
+$lang['sortkey_o_cdate'] = 'תאריך יצירה';
+$lang['sortkey_o_mdate'] = 'תאריך שינוי';
+$lang['sortkey_o_pagename'] = 'שם העמוד';
+$lang['sortkey_o_id'] = 'מזהה דף';
+$lang['sortkey_o_ns'] = 'מרחב שמות';
+$lang['sortkey_o_title'] = 'כותרת';
+
+$lang['sortorder'] = 'סדר מיון';
+$lang['sortorder_o_ascending'] = 'עולה';
+$lang['sortorder_o_descending'] = 'יורד';
+
+$lang['pagelist_flags'] = 'עיצוב דגלים עבור רשימת התגים (מופרדים בפסיקים, לקבלת דגלים זמינים עיין בתיעוד של תוסף ה- Pagelist)';
+
+$lang['list_tags_of_subns'] = 'רשום גם תגים במרחבי משנה של מרחב שמות מוגדר (תחביר ספירה)';
+
+$lang['tags_list_css'] = 'בחר סגנון שהוחל על רשימת התגים של הדפים';
+$lang['tags_list_css_o_tags'] = 'סגנון ברירת מחדל';
+$lang['tags_list_css_o_tagstop'] = 'מותאם לרשימת התגים בראש העמוד';
diff --git a/platform/www/lib/plugins/tag/lang/hi/lang.php b/platform/www/lib/plugins/tag/lang/hi/lang.php
new file mode 100644
index 0000000..e05a061
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/hi/lang.php
@@ -0,0 +1,18 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'टैग';
+$lang['tags'] = 'टैग';
+$lang['topic'] = 'विषय';
+$lang['count'] = 'मात्रा';
+$lang['toolbar_icon'] = 'टैग-सिंटैक्स डालें';
+$lang['empty_output'] = 'खाली आउटपुट';
+
+$lang['include'] = 'शामिल';
+$lang['exclude'] = 'निकालना';
+$lang['use_and'] = 'तर्क का उपयोग करें AND';
+$lang['no_tags'] = 'कोई टैग नहीं मिला';
diff --git a/platform/www/lib/plugins/tag/lang/hi/settings.php b/platform/www/lib/plugins/tag/lang/hi/settings.php
new file mode 100644
index 0000000..f987b42
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/hi/settings.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['namespace'] = 'टैग्स के लिए डिफॉल्ट नेमस्पेस';
+$lang['toolbar_icon'] = 'टूलबार आइकन दिखाएं (स्पष्ट data/cache/* और ब्राउज़र कैश यदि यह प्रदर्शित नहीं है)';
+
+$lang['sortkey'] = 'सॉर्ट टॉपिक लिस्ट बाय';
+$lang['sortkey_o_cdate'] = 'निर्माण तिथि';
+$lang['sortkey_o_mdate'] = 'संशोधन तिथि';
+$lang['sortkey_o_pagename'] = 'पेज नाम';
+$lang['sortkey_o_id'] = 'पेज ID';
+$lang['sortkey_o_ns'] = 'नेमस्पेस';
+$lang['sortkey_o_title'] = 'शीर्षक';
+
+$lang['sortorder'] = 'सॉर्ट ऑर्डर';
+$lang['sortorder_o_ascending'] = 'आरोही';
+$lang['sortorder_o_descending'] = 'अवरोही';
+
+$lang['pagelist_flags'] = 'टैगलिस्ट के लिए झंडे का प्रारूपण (अल्पविराम से अलग किए गए, उपलब्ध झंडे के लिए Pagelist Plugin) का प्रलेखन देखें ';
+
+$lang['list_tags_of_subns'] = 'एक निर्दिष्ट नामस्थान (गिनती सिंटैक्स) के उप-नामों में भी टैग';
+
+$lang['tags_list_css'] = 'पृष्ठों की टैग सूची में लागू शैली चुनें';
+$lang['tags_list_css_o_tags'] = 'डिफ़ॉल्ट शैली';
+$lang['tags_list_css_o_tagstop'] = 'पृष्ठ के शीर्ष पर टैग सूची के लिए अनुकूलित';
diff --git a/platform/www/lib/plugins/tag/lang/hr/lang.php b/platform/www/lib/plugins/tag/lang/hr/lang.php
new file mode 100644
index 0000000..a12f485
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/hr/lang.php
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Davor Turkalj <turki.bsc@gmail.com>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'Oznaka';
+$lang['tags'] = 'Oznake';
+$lang['topic'] = 'Teme';
+$lang['count'] = 'Količina';
+$lang['toolbar_icon'] = 'Ubaci sintaksu oznake';
+$lang['empty_output'] = 'Prazan izlaz';
+
+$lang['include'] = 'Uključi';
+$lang['exclude'] = 'Izuzmi';
+$lang['use_and'] = 'Koristi logiku AND';
+$lang['no_tags'] = 'Nema oznaka';
diff --git a/platform/www/lib/plugins/tag/lang/hr/settings.php b/platform/www/lib/plugins/tag/lang/hr/settings.php
new file mode 100644
index 0000000..03abd93
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/hr/settings.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Davor Turkalj <turki.bsc@gmail.com>
+ */
+
+$lang['namespace'] = 'Podrazumijevani imenski prostor za oznake';
+$lang['toolbar_icon'] = 'Prikaži ikonu na alatnoj traci (očisti data/cache/* i priručnu pohranu preglednika ako se ne prikazuje)';
+
+$lang['sortkey'] = 'poredaj listu tema po';
+$lang['sortkey_o_cdate'] = 'datum kreiranja';
+$lang['sortkey_o_mdate'] = 'datum promjene';
+$lang['sortkey_o_pagename'] = 'ime stranice';
+$lang['sortkey_o_id'] = 'oznaka stranice';
+$lang['sortkey_o_ns'] = 'imenski prostor';
+$lang['sortkey_o_title'] = 'naslov';
+
+$lang['sortorder'] = 'poredak';
+$lang['sortorder_o_ascending'] = 'rastući';
+$lang['sortorder_o_descending'] = 'padajući';
+
+$lang['pagelist_flags'] = 'zastavice oblikovanja za listu oznaka (zarezom odvojene, za listu dostupnih zastavica vidi dokumentaciju dodatka pagelist)';
+
+$lang['list_tags_of_subns'] = 'Prikaži također oznake iz pod-imeničkih prostora specificiranog imeničkog prostora';
+
+$lang['tags_list_css'] = 'Odaberi stil primijenjen na liste oznaka';
+$lang['tags_list_css_o_tags'] = 'podrazumijevani stil';
+$lang['tags_list_css_o_tagstop'] = 'optimirano za listu oznaka na vrhu stranice';
diff --git a/platform/www/lib/plugins/tag/lang/hu/lang.php b/platform/www/lib/plugins/tag/lang/hu/lang.php
new file mode 100644
index 0000000..f6f3518
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/hu/lang.php
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Marina Vladi <deldadam@gmail.com>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'Címké';
+$lang['tags'] = 'Címkék';
+$lang['topic'] = 'Téma';
+$lang['count'] = 'Mennyiség';
+$lang['toolbar_icon'] = 'Címkeszintaxis beillesztése';
+$lang['empty_output'] = 'Üres kimenet';
+
+$lang['include'] = 'Beleértve';
+$lang['exclude'] = 'Kivéve';
+$lang['use_and'] = 'Használja a logikát AND';
+$lang['no_tags'] = 'Nincsenek címkék';
diff --git a/platform/www/lib/plugins/tag/lang/hu/settings.php b/platform/www/lib/plugins/tag/lang/hu/settings.php
new file mode 100644
index 0000000..86886e6
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/hu/settings.php
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Norbert Csík <norbert.csik@gmail.com>
+ * @author Marina Vladi <deldadam@gmail.com>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['namespace'] = 'Címkék alapértelmezett névtere';
+$lang['toolbar_icon'] = 'Ikon megjelenítése eszközsoron (töröljük az adat-* és böngésző gyorsítótárat, ha nem jelenne meg)';
+
+$lang['sortkey'] = 'Témalista rendezési módja';
+$lang['sortkey_o_cdate'] = 'készítés dátuma';
+$lang['sortkey_o_mdate'] = 'módosítás dátuma';
+$lang['sortkey_o_pagename'] = 'oldalnév';
+$lang['sortkey_o_id'] = 'oldalazonosító (ID)';
+$lang['sortkey_o_ns'] = 'névtér';
+$lang['sortkey_o_title'] = 'cím';
+
+$lang['sortorder'] = 'Rendezés iránya';
+$lang['sortorder_o_ascending'] = 'növekvő';
+$lang['sortorder_o_descending'] = 'csökkenő';
+
+$lang['pagelist_flags'] = 'Formátumozó beállítások a címkelistához (vesszővel elválasztva, az elérhető beállításokat nézzük meg a pagelist bővítmény dokumentációjában)';
+
+$lang['list_tags_of_subns'] = 'Adott névtér alnévtereiben szereplő címkék listázása (számláló szintaxis)';
+
+$lang['tags_list_css'] = 'Válassza ki az oldalak címkék listájára alkalmazott stílust';
+$lang['tags_list_css_o_tags'] = 'alapértelmezett stílus';
+$lang['tags_list_css_o_tagstop'] = 'címkékhez optimalizált oldal tetején';
diff --git a/platform/www/lib/plugins/tag/lang/id/lang.php b/platform/www/lib/plugins/tag/lang/id/lang.php
new file mode 100644
index 0000000..363f801
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/id/lang.php
@@ -0,0 +1,18 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'Tag';
+$lang['tags'] = 'Tag';
+$lang['topic'] = 'Topik';
+$lang['count'] = 'Kuantitas';
+$lang['toolbar_icon'] = 'Sisipkan Sintaksis Tag';
+$lang['empty_output'] = 'Output Kosong';
+
+$lang['include'] = 'Sertakan';
+$lang['exclude'] = 'Mengecualikan';
+$lang['use_and'] = 'Gunakan logika AND';
+$lang['no_tags'] = 'Tidak ditemukan tag';
diff --git a/platform/www/lib/plugins/tag/lang/id/settings.php b/platform/www/lib/plugins/tag/lang/id/settings.php
new file mode 100644
index 0000000..5052955
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/id/settings.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['namespace'] = 'Ruang nama default untuk tag';
+$lang['toolbar_icon'] = 'Tampilkan ikon toolbar (hapus data/cache/* dan cache browser jika tidak ditampilkan)';
+
+$lang['sortkey'] = 'urutkan daftar topik berdasarkan';
+$lang['sortkey_o_cdate'] = 'tanggal pembuatan';
+$lang['sortkey_o_mdate'] = 'tanggal modifikasi';
+$lang['sortkey_o_pagename'] = 'nama halaman';
+$lang['sortkey_o_id'] = 'ID halaman';
+$lang['sortkey_o_ns'] = 'ruang nama';
+$lang['sortkey_o_title'] = 'judul';
+
+$lang['sortorder'] = 'tata urutan';
+$lang['sortorder_o_ascending'] = 'naik';
+$lang['sortorder_o_descending'] = 'turun';
+
+$lang['pagelist_flags'] = 'Memformat flag untuk daftar tag (dipisahkan koma, untuk flag yang tersedia lihat dokumentasi dari Plugin Pagelist)';
+
+$lang['list_tags_of_subns'] = 'Daftar juga tag dalam ruang subnama dari ruang nama tertentu (sintaks hitung)';
+
+$lang['tags_list_css'] = 'Pilih gaya yang diterapkan ke halaman\' daftar tag';
+$lang['tags_list_css_o_tags'] = 'gaya standar';
+$lang['tags_list_css_o_tagstop'] = 'dioptimalkan untuk daftar tag di bagian atas halaman';
diff --git a/platform/www/lib/plugins/tag/lang/it/lang.php b/platform/www/lib/plugins/tag/lang/it/lang.php
new file mode 100644
index 0000000..5f4b0a1
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/it/lang.php
@@ -0,0 +1,18 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'Tag';
+$lang['tags'] = 'Tag';
+$lang['topic'] = 'Argomento';
+$lang['count'] = 'Quantità';
+$lang['toolbar_icon'] = 'Inserisci la sintassi tag';
+$lang['empty_output'] = 'Output vuoto';
+
+$lang['include'] = 'Includi';
+$lang['exclude'] = 'Escludi';
+$lang['use_and'] = 'Usa logica AND';
+$lang['no_tags'] = 'Nessun tag trovato';
diff --git a/platform/www/lib/plugins/tag/lang/it/settings.php b/platform/www/lib/plugins/tag/lang/it/settings.php
new file mode 100644
index 0000000..a05c296
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/it/settings.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Roberto Bellingeri <bellingeri@netguru.it>
+ */
+$lang['namespace'] = 'Namespace predefinito per i tag';
+$lang['toolbar_icon'] = 'Mostra l\'icona della barra degli strumenti (cancella dati/cache/* e la cache del browser se non viene visualizzata)';
+
+$lang['sortkey'] = 'ordina gli elenchi di argomenti per';
+$lang['sortkey_o_cdate'] = 'data di creazione';
+$lang['sortkey_o_mdate'] = 'data di modifica';
+$lang['sortkey_o_pagename'] = 'nome della pagina';
+$lang['sortkey_o_id'] = 'ID della pagina';
+$lang['sortkey_o_ns'] = 'namespace';
+$lang['sortkey_o_title'] = 'titolo';
+
+$lang['sortorder'] = 'ordinamento';
+$lang['sortorder_o_ascending'] = 'crescente';
+$lang['sortorder_o_descending'] = 'decrescente';
+
+$lang['pagelist_flags'] = 'Formattazione dei flag per l\'elenco di tag (separati da virgola, per i flag disponibili vedere la documentazione del plug-in Pagelist)';
+
+$lang['list_tags_of_subns'] = 'Elenca anche i tag nei sottomenu di uno spazio dei nomi specificato (sintassi conteggio)';
+
+$lang['tags_list_css'] = 'Scegli lo stile applicato all\'elenco dei tag delle pagine';
+$lang['tags_list_css_o_tags'] = 'stile predefinito';
+$lang['tags_list_css_o_tagstop'] = 'ottimizzato per l\'elenco di tag nella parte superiore della pagina';
diff --git a/platform/www/lib/plugins/tag/lang/ja/lang.php b/platform/www/lib/plugins/tag/lang/ja/lang.php
new file mode 100644
index 0000000..ac2b615
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/ja/lang.php
@@ -0,0 +1,20 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Ikuo Obataya <cxx05051@nifty.com>
+ * @author Hideaki SAWADA <chuno@live.jp>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'タグ';
+$lang['tags'] = 'タグ';
+$lang['topic'] = 'トピック';
+$lang['count'] = '数量';
+$lang['toolbar_icon'] = 'タグ構文の挿入';
+$lang['empty_output'] = '空の出力';
+
+$lang['include'] = '含む';
+$lang['exclude'] = '除外する';
+$lang['use_and'] = 'ロジック AND 検索';
+$lang['no_tags'] = 'タグがありません';
diff --git a/platform/www/lib/plugins/tag/lang/ja/settings.php b/platform/www/lib/plugins/tag/lang/ja/settings.php
new file mode 100644
index 0000000..16851b6
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/ja/settings.php
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Ikuo Obataya <cxx05051@nifty.com>
+ * @author Hideaki SAWADA <chuno@live.jp>
+ */
+
+$lang['namespace'] = 'タグのデフォルト名前空間';
+$lang['toolbar_icon'] = 'ツールバーボタンを表示(表示されない場合、data/cache/* とブラウザキャッシュを削除)';
+
+$lang['sortkey'] = 'topic 一覧のソート基準';
+$lang['sortkey_o_cdate'] = '作成日';
+$lang['sortkey_o_mdate'] = '更新日';
+$lang['sortkey_o_pagename'] = 'ページ名';
+$lang['sortkey_o_id'] = 'ページ ID';
+$lang['sortkey_o_ns'] = '名前空間';
+$lang['sortkey_o_title'] = 'タイトル';
+
+$lang['sortorder'] = 'ソート順';
+$lang['sortorder_o_ascending'] = '昇順';
+$lang['sortorder_o_descending'] = '降順';
+
+$lang['pagelist_flags'] = 'タグリストの表示フラグ(カンマ区切り。使用可能フラグは pagelist プラグインを参照)';
+
+$lang['list_tags_of_subns'] = '指定名前空間の下位の名前空間のタグも一覧に含む(count 構文)';
+
+$lang['tags_list_css'] = 'ページタグ一覧に適用されるスタイルを選択してください。';
+$lang['tags_list_css_o_tags'] = 'デフォルトスタイル';
+$lang['tags_list_css_o_tagstop'] = 'ページ上部配置に最適化';
diff --git a/platform/www/lib/plugins/tag/lang/ko/lang.php b/platform/www/lib/plugins/tag/lang/ko/lang.php
new file mode 100644
index 0000000..9a98a4c
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/ko/lang.php
@@ -0,0 +1,20 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Myeongjin <aranet100@gmail.com>
+ * @author dryoo <dryoo@live.com>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = '태그';
+$lang['tags'] = '태그';
+$lang['topic'] = '주제';
+$lang['count'] = '수량';
+$lang['toolbar_icon'] = '태그 문법 넣기';
+$lang['empty_output'] = '빈 출력';
+
+$lang['include'] = '포함';
+$lang['exclude'] = '제외';
+$lang['use_and'] = '논리 AND 사용';
+$lang['no_tags'] = '찾은 태그 없음';
diff --git a/platform/www/lib/plugins/tag/lang/ko/settings.php b/platform/www/lib/plugins/tag/lang/ko/settings.php
new file mode 100644
index 0000000..8deed83
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/ko/settings.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Myeongjin <aranet100@gmail.com>
+ */
+
+$lang['namespace'] = '태그에 대한 기본 이름공간';
+$lang['toolbar_icon'] = '도구 모음 아이콘 보이기 (표시되지 않으면 data/cache/* 와 브라우저 캐시를 지우세요)';
+
+$lang['sortkey'] = '주제 목록 정렬 기준';
+$lang['sortkey_o_cdate'] = '만든 날짜';
+$lang['sortkey_o_mdate'] = '수정한 날짜';
+$lang['sortkey_o_pagename'] = '문서 이름';
+$lang['sortkey_o_id'] = '문서 ID';
+$lang['sortkey_o_ns'] = '이름공간';
+$lang['sortkey_o_title'] = '제목';
+
+$lang['sortorder'] = '정렬 순서';
+$lang['sortorder_o_ascending'] = '오름차순';
+$lang['sortorder_o_descending'] = '내림차순';
+
+$lang['pagelist_flags'] = '태그 목록에 대한 서식 플래그 (쉼표로 구분, 사용할 수 있는 플래그에 대해서는 Pagelist 플러그인의 설명문서를 보세요)';
+
+$lang['list_tags_of_subns'] = '지정된 이름공간의 하위 이름공간에 있는 태그도 나열 (개수 문법)';
+
+$lang['tags_list_css'] = '문서의 태그 목록에 적용할 스타일 선택';
+$lang['tags_list_css_o_tags'] = '기본 스타일';
+$lang['tags_list_css_o_tagstop'] = '문서 위에 있는 태그 목록에 최적화';
diff --git a/platform/www/lib/plugins/tag/lang/nl/lang.php b/platform/www/lib/plugins/tag/lang/nl/lang.php
new file mode 100644
index 0000000..510829b
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/nl/lang.php
@@ -0,0 +1,20 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Gerrit Uitslag <klapinklapin@gmail.com>
+ * @author Joachim David <joachim.david@teka-infopilots.com>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'Tag';
+$lang['tags'] = 'Tags';
+$lang['topic'] = 'Onderwerp';
+$lang['count'] = 'Hoeveelheid';
+$lang['toolbar_icon'] = 'Tag-syntax invoegen';
+$lang['empty_output'] = 'Uitvoer leegmaken';
+
+$lang['include'] = 'Inclusief';
+$lang['exclude'] = 'Exclusief';
+$lang['use_and'] = 'Gebruik logica AND';
+$lang['no_tags'] = 'Geen tags gevonden';
diff --git a/platform/www/lib/plugins/tag/lang/nl/settings.php b/platform/www/lib/plugins/tag/lang/nl/settings.php
new file mode 100644
index 0000000..25db10d
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/nl/settings.php
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Gerrit Uitslag <klapinklapin@gmail.com>
+ * @author Peter van Diest <peter.van.diest@xs4all.nl>
+ * @author Joachim David <joachim.david@teka-infopilots.com>
+ */
+
+$lang['namespace'] = 'Standaard namespace voor tags';
+$lang['toolbar_icon'] = 'Toon knop in de werkbalk (leeg data/cache/* en browser cache als hij niet wordt getoond)';
+
+$lang['sortkey'] = 'sorteer onderwerpenlijsten op';
+$lang['sortkey_o_cdate'] = 'aanmaakdatum';
+$lang['sortkey_o_mdate'] = 'bewerkdatum';
+$lang['sortkey_o_pagename'] = 'paginanaam';
+$lang['sortkey_o_id'] = 'pagina-id';
+$lang['sortkey_o_ns'] = 'namespace';
+$lang['sortkey_o_title'] = 'titel';
+
+$lang['sortorder'] = 'sorteervolgorde';
+$lang['sortorder_o_ascending'] = 'oplopend';
+$lang['sortorder_o_descending'] = 'aflopend';
+
+$lang['pagelist_flags'] = 'Opmaakvlaggen voor de taglijst (gescheiden door komma\'s, voor beschikbare vlaggen zie documentatie van de Pagelist plugin)';
+
+$lang['list_tags_of_subns'] = 'Als er op een specifieke namespace wordt gezocht, geef dan in de lijst ook tags uit subnamespaces van deze specifieke namespace (count syntax)';
+
+$lang['tags_list_css'] = 'Kies een stijl voor de lijst van tags voor de pagina';
+$lang['tags_list_css_o_tags'] = 'standaardstijl';
+$lang['tags_list_css_o_tagstop'] = 'geoptimaliseerd voor een lijst van tags bovenaan de pagina';
diff --git a/platform/www/lib/plugins/tag/lang/pl/lang.php b/platform/www/lib/plugins/tag/lang/pl/lang.php
new file mode 100644
index 0000000..5708280
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/pl/lang.php
@@ -0,0 +1,18 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'Tag';
+$lang['tags'] = 'Tagi';
+$lang['topic'] = 'Temat';
+$lang['count'] = 'Ilość';
+$lang['toolbar_icon'] = 'Wstaw składnię tagu';
+$lang['empty_output'] = 'Puste wyjście';
+
+$lang['include'] = 'Uwzględnić';
+$lang['exclude'] = 'Wykluczyć';
+$lang['use_and'] = 'Użyj logiki AND';
+$lang['no_tags'] = 'Nie znaleziono tagów';
diff --git a/platform/www/lib/plugins/tag/lang/pl/settings.php b/platform/www/lib/plugins/tag/lang/pl/settings.php
new file mode 100644
index 0000000..6700c5e
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/pl/settings.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Bartek S <sadupl@gmail.com>
+ */
+
+$lang['namespace'] = 'Domyślna przestrzeń nazw dla tagów';
+$lang['toolbar_icon'] = 'Pokaż ikonę paska narzędzi (wyczyść dane / pamięć podręczną / * i pamięć podręczną przeglądarki, jeśli nie są wyświetlane)';
+
+$lang['sortkey'] = 'sortuj listy tematów według';
+$lang['sortkey_o_cdate'] = 'data utworzenia';
+$lang['sortkey_o_mdate'] = 'data modyfikacji';
+$lang['sortkey_o_pagename'] = 'nazwa strony';
+$lang['sortkey_o_id'] = 'ID strony';
+$lang['sortkey_o_ns'] = 'przestrzeń nazw';
+$lang['sortkey_o_title'] = 'tytuł';
+
+$lang['sortorder'] = 'porządek sortowania';
+$lang['sortorder_o_ascending'] = 'rosnąco';
+$lang['sortorder_o_descending'] = 'malejąco';
+
+$lang['pagelist_flags'] = 'Formatowanie flag dla taglist (oddzielone przecinkami, dostępne flagi znajdują się w dokumentacji wtyczki Pagelist)';
+
+$lang['list_tags_of_subns'] = 'Wyświetl także tagi w podprzestrzeniach określonej przestrzeni nazw (składnia licznika)';
+
+$lang['tags_list_css'] = 'Wybierz styl zastosowany do stron \' lista tagów';
+$lang['tags_list_css_o_tags'] = 'domyślny styl';
+$lang['tags_list_css_o_tagstop'] = 'zoptymalizowany pod kątem listy tagów u góry strony';
diff --git a/platform/www/lib/plugins/tag/lang/pt-br/lang.php b/platform/www/lib/plugins/tag/lang/pt-br/lang.php
new file mode 100644
index 0000000..c5313c7
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/pt-br/lang.php
@@ -0,0 +1,18 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'Tag';
+$lang['tags'] = 'Tags';
+$lang['topic'] = 'Tópico';
+$lang['count'] = 'Quantidade';
+$lang['toolbar_icon'] = 'Inserir tag-sintaxe';
+$lang['empty_output'] = 'Saída vazia';
+
+$lang['include'] = 'Incluir';
+$lang['exclude'] = 'Excluir';
+$lang['use_and'] = 'Usar lógica AND';
+$lang['no_tags'] = 'Sem tags encontradas';
diff --git a/platform/www/lib/plugins/tag/lang/pt-br/settings.php b/platform/www/lib/plugins/tag/lang/pt-br/settings.php
new file mode 100644
index 0000000..32c59cb
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/pt-br/settings.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * Portuguese language file
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Flávio Roberto Santos <flavio.barata@gmail.com>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['namespace'] = 'Namespace padrão para as tags';
+$lang['toolbar_icon'] = 'Mostrar ícone de barra de ferramentas (limpar dados/cache/* e cache do navegador se não for exibido)';
+
+$lang['sortkey'] = 'classificar listas de tópicos por';
+$lang['sortkey_o_cdate'] = 'data de criação';
+$lang['sortkey_o_mdate'] = 'data de modificação';
+$lang['sortkey_o_pagename'] = 'nome da página';
+$lang['sortkey_o_id'] = 'ID da página';
+$lang['sortkey_o_ns'] = 'namespace';
+$lang['sortkey_o_title'] = 'título';
+
+$lang['sortorder'] = 'ordem de classificação';
+$lang['sortorder_o_ascending'] = 'crescente';
+$lang['sortorder_o_descending'] = 'descendente';
+
+$lang['pagelist_flags'] = 'Formatação de bandeiras para o taglist (separado por círia, para bandeiras disponíveis, consulte a documentação do Plugin Pagelist)';
+
+$lang['list_tags_of_subns'] = 'Lista também tags em subnamespaces de um namespace especificado (conta sintaxe)';
+
+$lang['tags_list_css'] = 'Escolha o estilo aplicado à lista de tags das páginas';
+$lang['tags_list_css_o_tags'] = 'estilo padrão';
+$lang['tags_list_css_o_tagstop'] = 'otimizado para lista de tags no topo da página';
diff --git a/platform/www/lib/plugins/tag/lang/pt/lang.php b/platform/www/lib/plugins/tag/lang/pt/lang.php
new file mode 100644
index 0000000..3b6d954
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/pt/lang.php
@@ -0,0 +1,18 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'Tag';
+$lang['tags'] = 'Tags';
+$lang['topic'] = 'Tópico';
+$lang['count'] = 'Quantidade';
+$lang['toolbar_icon'] = 'Inserir sintaxe de tag';
+$lang['empty_output'] = 'Saída vazia';
+
+$lang['include'] = 'Incluir';
+$lang['exclude'] = 'Excluir';
+$lang['use_and'] = 'Use lógica AND';
+$lang['no_tags'] = 'Nenhuma tag encontrada';
diff --git a/platform/www/lib/plugins/tag/lang/pt/settings.php b/platform/www/lib/plugins/tag/lang/pt/settings.php
new file mode 100644
index 0000000..7bd1461
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/pt/settings.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['namespace'] = 'Espaço de nome padrão para tags';
+$lang['toolbar_icon'] = 'Mostrar ícone da barra de ferramentas (limpar data/cache/* e o cache do navegador se não estiver exibido)';
+
+$lang['sortkey'] = 'classificar listas de tópicos por';
+$lang['sortkey_o_cdate'] = 'data de criação';
+$lang['sortkey_o_mdate'] = 'data de modificação';
+$lang['sortkey_o_pagename'] = 'nome da página';
+$lang['sortkey_o_id'] = 'ID da página';
+$lang['sortkey_o_ns'] = 'espaço de nome';
+$lang['sortkey_o_title'] = 'título';
+
+$lang['sortorder'] = 'ordem de classificação';
+$lang['sortorder_o_ascending'] = 'ascendente';
+$lang['sortorder_o_descending'] = 'decrescente';
+
+$lang['pagelist_flags'] = 'Sinalizadores de formatação para a lista de tags (separados por vírgulas; para sinalizadores disponíveis, consulte a documentação do plugin Pagelist)';
+
+$lang['list_tags_of_subns'] = 'Listar também tags em subnamespaces de um namespace especificado (sintaxe de contagem)';
+
+$lang['tags_list_css'] = 'Escolha o estilo aplicado à lista de tags das páginas';
+$lang['tags_list_css_o_tags'] = 'estilo padrão';
+$lang['tags_list_css_o_tagstop'] = 'otimizado para lista de tags no topo da página';
diff --git a/platform/www/lib/plugins/tag/lang/ru/lang.php b/platform/www/lib/plugins/tag/lang/ru/lang.php
new file mode 100644
index 0000000..37178e6
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/ru/lang.php
@@ -0,0 +1,20 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Aleksandr Selivanov <alexgearbox@yandex.ru>
+ * @author Vasilyy Balyasnyy <v.balyasnyy@gmail.com>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'Тег';
+$lang['tags'] = 'Теги';
+$lang['topic'] = 'Темы';
+$lang['count'] = 'Количество';
+$lang['toolbar_icon'] = 'Вставить тег-синтаксис';
+$lang['empty_output'] = 'Пустой вывод';
+
+$lang['include'] = 'Включать';
+$lang['exclude'] = 'Исключать';
+$lang['use_and'] = 'Использовать логическое AND';
+$lang['no_tags'] = 'Теги не найдены';
diff --git a/platform/www/lib/plugins/tag/lang/ru/settings.php b/platform/www/lib/plugins/tag/lang/ru/settings.php
new file mode 100644
index 0000000..b2d38b0
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/ru/settings.php
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Aleksandr Selivanov <alexgearbox@yandex.ru>
+ * @author Vasilyy Balyasnyy <v.balyasnyy@gmail.com>
+ */
+
+$lang['namespace'] = 'Пространство имён по умолчанию для тегов';
+$lang['toolbar_icon'] = 'Показывать кнопку на панели инструментов (если значок не отображается, очистите data/cache/* и кэш браузера)';
+
+$lang['sortkey'] = 'Сортировать список страниц по:';
+$lang['sortkey_o_cdate'] = 'дате создания';
+$lang['sortkey_o_mdate'] = 'дате редактирования';
+$lang['sortkey_o_pagename'] = 'имени страницы';
+$lang['sortkey_o_id'] = 'ID страницы';
+$lang['sortkey_o_ns'] = 'пространству имён';
+$lang['sortkey_o_title'] = 'заголовку';
+
+$lang['sortorder'] = 'Порядок сортировки';
+$lang['sortorder_o_ascending'] = 'по возрастанию';
+$lang['sortorder_o_descending'] = 'по убыванию';
+
+$lang['pagelist_flags'] = 'Признаки (flags) форматирования для списка тегов (разделяйте запятыми; список доступных признаков (flags) описан в документации плагина Pagelist)';
+
+$lang['list_tags_of_subns'] = 'Также показывать теги в подпространствах имён отмеченных пространств имён (синтаксис подсчёта (count))';
+
+$lang['tags_list_css'] = 'Выбрать стиль для списка тегов на страницах';
+$lang['tags_list_css_o_tags'] = 'стиль по умолчанию';
+$lang['tags_list_css_o_tagstop'] = 'оптимизация для размещения наверху страницы';
diff --git a/platform/www/lib/plugins/tag/lang/sv/lang.php b/platform/www/lib/plugins/tag/lang/sv/lang.php
new file mode 100644
index 0000000..ecdc545
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/sv/lang.php
@@ -0,0 +1,20 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author hib <hibratt@gmail.com>
+ * @author Tor Härnqvist <tor@harnqvist.se>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'Tagg';
+$lang['tags'] = 'Taggar';
+$lang['topic'] = 'Ämne';
+$lang['count'] = 'Antal';
+$lang['toolbar_icon'] = 'Skriv tagg-syntax';
+$lang['empty_output'] = 'Tom utdata';
+
+$lang['include'] = 'Inkludera';
+$lang['exclude'] = 'Exkludera';
+$lang['use_and'] = 'Använd logik AND';
+$lang['no_tags'] = 'Det finns inga taggar';
diff --git a/platform/www/lib/plugins/tag/lang/sv/settings.php b/platform/www/lib/plugins/tag/lang/sv/settings.php
new file mode 100644
index 0000000..b2e15b8
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/sv/settings.php
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author hib <hibratt@gmail.com>
+ * @author Tor Härnqvist <tor@harnqvist.se>
+ */
+
+$lang['namespace'] = 'Standard namespace för taggar';
+$lang['toolbar_icon'] = 'Via verktygsmenyn (tom data/cache/* och webbläsarens cache om den inte visas)';
+
+$lang['sortkey'] = 'sortera ämnen på';
+$lang['sortkey_o_cdate'] = 'skapandedatum';
+$lang['sortkey_o_mdate'] = 'ändringsdatum';
+$lang['sortkey_o_pagename'] = 'sidnamn';
+$lang['sortkey_o_id'] = 'sid-ID';
+$lang['sortkey_o_ns'] = 'namnrymd';
+$lang['sortkey_o_title'] = 'rubrik';
+
+$lang['sortorder'] = 'sorteringsordning';
+$lang['sortorder_o_ascending'] = 'stigande';
+$lang['sortorder_o_descending'] = 'fallande';
+
+$lang['pagelist_flags'] = 'Formatera flaggor för tagglistan (kommaseparerad, för tillgängliga flaggor, se dokumentationen för pagelist plugin) ';
+
+$lang['list_tags_of_subns'] = 'Lista också taggar i sub-namnrymder inom specificerad namnrymd (count syntax)';
+
+$lang['tags_list_css'] = 'Välj stil att applicera sidornas tagglista';
+$lang['tags_list_css_o_tags'] = 'Standardstil';
+$lang['tags_list_css_o_tagstop'] = 'optimerad för tagglista överst på sidan';
diff --git a/platform/www/lib/plugins/tag/lang/tr/lang.php b/platform/www/lib/plugins/tag/lang/tr/lang.php
new file mode 100644
index 0000000..2abcdaf
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/tr/lang.php
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author İlker R. Kapaç <irifat@gmail.com>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'Etiket';
+$lang['tags'] = 'Etiketler';
+$lang['topic'] = 'Başlık';
+$lang['count'] = 'Miktar';
+$lang['toolbar_icon'] = 'Etiket ekle';
+$lang['empty_output'] = 'Çıktıyı temizle';
+
+$lang['include'] = 'Dahil et';
+$lang['exclude'] = 'Hariç tut';
+$lang['use_and'] = 'Mantık kullan AND';
+$lang['no_tags'] = 'Hiç etiket bulunamadı';
diff --git a/platform/www/lib/plugins/tag/lang/tr/settings.php b/platform/www/lib/plugins/tag/lang/tr/settings.php
new file mode 100644
index 0000000..f2b5914
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/tr/settings.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author İlker R. Kapaç <irifat@gmail.com>
+ */
+
+$lang['namespace'] = 'Etiketler için varsayılan isim alanı (namespace)';
+$lang['toolbar_icon'] = 'Araç çubuğu simgesini göster (Eğer görünmezse data/cache/ klasörünü ve internet gezgini ara belleğini silin)';
+
+$lang['sortkey'] = 'konu listesinin sıralanış şekli';
+$lang['sortkey_o_cdate'] = 'oluşturulma tarihi';
+$lang['sortkey_o_mdate'] = 'değiştirilme tarihi';
+$lang['sortkey_o_pagename'] = 'sayfa adı';
+$lang['sortkey_o_id'] = 'sayfa kimliği (ID)';
+$lang['sortkey_o_ns'] = 'isim alanı (namespace)';
+$lang['sortkey_o_title'] = 'başlık';
+
+$lang['sortorder'] = 'sıralama şekli';
+$lang['sortorder_o_ascending'] = 'artan';
+$lang['sortorder_o_descending'] = 'azalan';
+
+$lang['pagelist_flags'] = 'Etiket listesi için biçimlendirme bayrakları (flags) (Virgül ile ayrılmış olarak yazın. Kullanılabilir bayrak listesi için pagelist eklentisinin belgelerine bakın)';
+
+$lang['list_tags_of_subns'] = 'Tanımlanan isim alanının altındaki isim alanlarını da listele (sözdizimini say)';
+
+$lang['tags_list_css'] = 'Sayfalardaki etiket listesine uygulanacak biçimlendirmeyi seçin';
+$lang['tags_list_css_o_tags'] = 'Varsayılan biçim';
+$lang['tags_list_css_o_tagstop'] = 'Sayfanın üst tarafında etiket listesi göstermek için uygun';
diff --git a/platform/www/lib/plugins/tag/lang/uk/lang.php b/platform/www/lib/plugins/tag/lang/uk/lang.php
new file mode 100644
index 0000000..9b4680a
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/uk/lang.php
@@ -0,0 +1,18 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'Тег';
+$lang['tags'] = 'Теги';
+$lang['topic'] = 'Тема';
+$lang['count'] = 'Кількість';
+$lang['toolbar_icon'] = 'Вставити синтаксис тегів';
+$lang['empty_output'] = 'Порожній вихід';
+
+$lang['include'] = 'Включити';
+$lang['exclude'] = 'Виключити';
+$lang['use_and'] = 'Використовувати логіку І';
+$lang['no_tags'] = 'Тегів не знайдено';
diff --git a/platform/www/lib/plugins/tag/lang/uk/settings.php b/platform/www/lib/plugins/tag/lang/uk/settings.php
new file mode 100644
index 0000000..2b7c7ab
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/uk/settings.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['namespace'] = 'Простір імен за замовчуванням для тегів';
+$lang['toolbar_icon'] = 'Показувати кнопку на панелі інструментів (якщо значок не відображається, очистіть data/cache/* і кеш браузера)';
+
+$lang['sortkey'] = 'Сортувати список сторінок по:';
+$lang['sortkey_o_cdate'] = 'датою створення';
+$lang['sortkey_o_mdate'] = 'датою редагування';
+$lang['sortkey_o_pagename'] = 'імені сторінки';
+$lang['sortkey_o_id'] = 'ID сторінки';
+$lang['sortkey_o_ns'] = 'простору імен';
+$lang['sortkey_o_title'] = 'заголовку';
+
+$lang['sortorder'] = 'Порядок сортування';
+$lang['sortorder_o_ascending'] = 'по зростанню';
+$lang['sortorder_o_descending'] = 'по спаданню';
+
+$lang['pagelist_flags'] = 'Ознаки (flags) форматування для списку тегів (розділяйте комами; список доступних ознак (flags) описаний в документації плагіна Pagelist)';
+
+$lang['list_tags_of_subns'] = 'Також показувати теги в підпросторах імен зазначених просторів імен (синтаксис підрахунку (count))';
+
+$lang['tags_list_css'] = 'Вибрати стиль для списку тегів на сторінках';
+$lang['tags_list_css_o_tags'] = 'стиль за замовчуванням';
+$lang['tags_list_css_o_tagstop'] = 'оптимізація для розміщення нагорі сторінки';
diff --git a/platform/www/lib/plugins/tag/lang/vi/lang.php b/platform/www/lib/plugins/tag/lang/vi/lang.php
new file mode 100644
index 0000000..e038593
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/vi/lang.php
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Thien Hau <thienhau.9a14@gmail.com>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = 'Thẻ';
+$lang['tags'] = 'Thẻ';
+$lang['topic'] = 'Đề tài';
+$lang['count'] = 'Định lượng';
+$lang['toolbar_icon'] = 'Chèn cú pháp thẻ';
+$lang['empty_output'] = 'Đầu ra trống';
+
+$lang['include'] = 'Bao gồm';
+$lang['exclude'] = 'Loại trừ';
+$lang['use_and'] = 'Dụng logic AND';
+$lang['no_tags'] = 'Không tìm thấy thẻ';
diff --git a/platform/www/lib/plugins/tag/lang/vi/settings.php b/platform/www/lib/plugins/tag/lang/vi/settings.php
new file mode 100644
index 0000000..11d22c2
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/vi/settings.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Thien Hau <thienhau.9a14@gmail.com>
+ */
+
+$lang['namespace'] = 'Không gian tên mặc định cho thẻ';
+$lang['toolbar_icon'] = 'Hiện biểu tượng thanh công cụ (xóa data/cache/* và bộ đệm của trình duyệt nếu nó không hiện)';
+
+$lang['sortkey'] = 'sắp xếp danh sách đề tài theo';
+$lang['sortkey_o_cdate'] = 'ngày tạo';
+$lang['sortkey_o_mdate'] = 'ngày sửa đổi';
+$lang['sortkey_o_pagename'] = 'tên trang';
+$lang['sortkey_o_id'] = 'ID trang';
+$lang['sortkey_o_ns'] = 'không gian tên';
+$lang['sortkey_o_title'] = 'tiêu đề';
+
+$lang['sortorder'] = 'thứ tự sắp xếp';
+$lang['sortorder_o_ascending'] = 'tăng dần';
+$lang['sortorder_o_descending'] = 'giảm dần';
+
+$lang['pagelist_flags'] = 'Định dạng cờ cho danh sách thẻ (được phân tách bằng dấu phẩy, để biết các cờ có sẵn, hãy xem tài liệu của Plugin Pagelist)';
+
+$lang['list_tags_of_subns'] = 'Liệt kê thẻ trong các không gian tên con của một không gian tên cụ thể (cú pháp đếm)';
+
+$lang['tags_list_css'] = 'Chọn kiểu áp dụng cho danh sách thẻ của trang';
+$lang['tags_list_css_o_tags'] = 'kiểu mặc định';
+$lang['tags_list_css_o_tagstop'] = 'tối ưu hóa cho danh sách thẻ ở đầu trang';
diff --git a/platform/www/lib/plugins/tag/lang/zh-tw/lang.php b/platform/www/lib/plugins/tag/lang/zh-tw/lang.php
new file mode 100644
index 0000000..7a3db31
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/zh-tw/lang.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ * Traditional Chinese language file
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Danny Lin <danny0838@gmail.com>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = '標籤';
+$lang['tags'] = '標籤';
+$lang['topic'] = '主題';
+$lang['count'] = '數量';
+$lang['toolbar_icon'] = '插入標籤語法';
+$lang['empty_output'] = '清空輸出';
+
+$lang['include'] = '包含';
+$lang['exclude'] = '不含';
+$lang['use_and'] = '使用邏輯AND';
+$lang['no_tags'] = '沒有找到標籤';
diff --git a/platform/www/lib/plugins/tag/lang/zh-tw/settings.php b/platform/www/lib/plugins/tag/lang/zh-tw/settings.php
new file mode 100644
index 0000000..0dedae2
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/zh-tw/settings.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * Traditional Chinese language file
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Danny Lin <danny0838@gmail.com>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['namespace'] = '標籤預設的命名空間';
+$lang['toolbar_icon'] = '顯示工具列圖示 (如未出現請清除 data/cache/* 及瀏覽器快取)';
+
+$lang['sortkey'] = '主題排序方式';
+$lang['sortkey_o_cdate'] = '建立日期';
+$lang['sortkey_o_mdate'] = '修改日期';
+$lang['sortkey_o_pagename'] = '頁面名稱';
+$lang['sortkey_o_id'] = '頁面全名';
+$lang['sortkey_o_ns'] = '命名空間';
+$lang['sortkey_o_title'] = '頁面標題';
+
+$lang['sortorder'] = '排序方式';
+$lang['sortorder_o_ascending'] = '升序';
+$lang['sortorder_o_descending'] = '降序';
+
+$lang['pagelist_flags'] = '標籤列表的格式化參數 (逗號分隔,可用參數詳見 pagelist 附加元件的說明文件)';
+
+$lang['list_tags_of_subns'] = '也將指定命名空間之下子命名空間中的標籤列出 (count 語法)';
+
+$lang['tags_list_css'] = '選擇應用於頁面標籤列表的樣式';
+$lang['tags_list_css_o_tags'] = '默認樣式';
+$lang['tags_list_css_o_tagstop'] = '針對頁面頂部的標籤列表進行了優化';
diff --git a/platform/www/lib/plugins/tag/lang/zh/lang.php b/platform/www/lib/plugins/tag/lang/zh/lang.php
new file mode 100644
index 0000000..85b29a1
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/zh/lang.php
@@ -0,0 +1,20 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author haobug <qingxianhao@gmail.com>
+ * @author Maie <m@maie.name>
+ * @author Rainbow-Spike <rainbow_spike@derpy.ru>
+ */
+
+$lang['tag'] = '标签';
+$lang['tags'] = '标签';
+$lang['topic'] = '主题';
+$lang['count'] = '数量';
+$lang['toolbar_icon'] = '插入标签';
+$lang['empty_output'] = '输出为空';
+
+$lang['include'] = '包括';
+$lang['exclude'] = '排除';
+$lang['use_and'] = '使用逻辑AND';
+$lang['no_tags'] = '没有找到标签';
diff --git a/platform/www/lib/plugins/tag/lang/zh/settings.php b/platform/www/lib/plugins/tag/lang/zh/settings.php
new file mode 100644
index 0000000..1d2e9cf
--- /dev/null
+++ b/platform/www/lib/plugins/tag/lang/zh/settings.php
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author haobug <qingxianhao@gmail.com>
+ * @author Maie <m@maie.name>
+ */
+
+$lang['namespace'] = '标签的默认命名空间';
+$lang['toolbar_icon'] = '显示工具栏图标 (如果没有显示,请清除 data/cache/* 及浏览器缓存)';
+
+$lang['sortkey'] = '按何键值排序';
+$lang['sortkey_o_cdate'] = '创建日期';
+$lang['sortkey_o_mdate'] = '修改日期';
+$lang['sortkey_o_pagename'] = '页面名称';
+$lang['sortkey_o_id'] = '页面 ID';
+$lang['sortkey_o_ns'] = '命名空间';
+$lang['sortkey_o_title'] = '页面标题';
+
+$lang['sortorder'] = '排序方式';
+$lang['sortorder_o_ascending'] = '升序';
+$lang['sortorder_o_descending'] = '降序';
+
+$lang['pagelist_flags'] = '标签列表的格式化标志 (逗号分隔,支持标志参考 Pagelist 插件的文档)';
+
+$lang['list_tags_of_subns'] = '列出指定命名空间的子命名空间的标签 (count 语法)';
+
+$lang['tags_list_css'] = '选择用于网页的标签列表样式';
+$lang['tags_list_css_o_tags'] = '默认样式';
+$lang['tags_list_css_o_tagstop'] = '优化在页面顶部显示的标签列表';
diff --git a/platform/www/lib/plugins/tag/manager.dat b/platform/www/lib/plugins/tag/manager.dat
new file mode 100644
index 0000000..1c0d878
--- /dev/null
+++ b/platform/www/lib/plugins/tag/manager.dat
@@ -0,0 +1,2 @@
+downloadurl=https://github.com/dokufreaks/plugin-tag/tarball/master
+installed=Wed, 16 Mar 2022 22:24:26 +0000
diff --git a/platform/www/lib/plugins/tag/plugin.info.txt b/platform/www/lib/plugins/tag/plugin.info.txt
new file mode 100644
index 0000000..4dd666c
--- /dev/null
+++ b/platform/www/lib/plugins/tag/plugin.info.txt
@@ -0,0 +1,7 @@
+base tag
+author Michael Hamann, Gina Häussge, Christopher Smith, Michael Klier, Esther Brunner
+email michael@content-space.de
+date 2020-12-02
+name Tag Plugin
+desc tag wiki pages
+url https://www.dokuwiki.org/plugin:tag
diff --git a/platform/www/lib/plugins/tag/script.js b/platform/www/lib/plugins/tag/script.js
new file mode 100644
index 0000000..ffa1d45
--- /dev/null
+++ b/platform/www/lib/plugins/tag/script.js
@@ -0,0 +1,16 @@
+/**
+ * For the searchtags syntax: make the checkboxes behave like radio buttons
+ * so the user can't both include and exclude a tag
+ */
+jQuery(function() {
+ jQuery('form.plugin__tag_search table input').change(function() {
+ if (jQuery(this).attr('checked')) { // was this input checked?
+ if (jQuery(this).parent().hasClass('minus')) {
+ // find the other input in the same tr and uncheck it
+ jQuery(this).closest('tr').find('.plus input').attr('checked', false);
+ } else {
+ jQuery(this).closest('tr').find('.minus input').attr('checked', false);
+ }
+ }
+ })
+});
diff --git a/platform/www/lib/plugins/tag/style.css b/platform/www/lib/plugins/tag/style.css
new file mode 100644
index 0000000..39b7f1a
--- /dev/null
+++ b/platform/www/lib/plugins/tag/style.css
@@ -0,0 +1,28 @@
+div.dokuwiki div.tags,
+div.dokuwiki div.tagstop {
+ font-size: 95%;
+ text-align: right;
+}
+
+div.dokuwiki div.tags {
+ border-top: 2px dotted __border__;
+ clear: both;
+ margin-bottom: 1.4em;
+}
+
+div.dokuwiki div.tagstop {
+ border-bottom: 2px dotted __border__;
+ margin-top: -1.3em;
+ margin-bottom: .4em;
+}
+
+div.dokuwiki div.tags span,
+div.dokuwiki div.tagstop span {
+ background: transparent url(images/tag.gif) 0px 2px no-repeat;
+ padding: 1px 0px 1px 17px;
+}
+
+/* make it easier to select the +/- checkboxes in the tagsearch table by making them block elements */
+div.dokuwiki form.plugin__tag_search label.plus, div.dokuwiki form.plugin__tag_search label.minus {
+ display: block;
+}
diff --git a/platform/www/lib/plugins/tag/syntax/count.php b/platform/www/lib/plugins/tag/syntax/count.php
new file mode 100644
index 0000000..f19d342
--- /dev/null
+++ b/platform/www/lib/plugins/tag/syntax/count.php
@@ -0,0 +1,124 @@
+<?php
+/**
+ * Tag Plugin: displays list of keywords with links to categories this page
+ * belongs to. The links are marked as tags for Technorati and other services
+ * using tagging.
+ *
+ * Usage: {{tag>category tags space separated}}
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Matthias Schulte <dokuwiki@lupo49.de>
+ */
+
+/** Count syntax, allows to list tag counts */
+class syntax_plugin_tag_count extends DokuWiki_Syntax_Plugin {
+
+ /**
+ * @return string Syntax type
+ */
+ function getType() { return 'substition'; }
+ /**
+ * @return int Sort order
+ */
+ function getSort() { return 305; }
+ /**
+ * @return string Paragraph type
+ */
+ function getPType() { return 'block';}
+
+ /**
+ * @param string $mode Parser mode
+ */
+ function connectTo($mode) {
+ $this->Lexer->addSpecialPattern('\{\{count>.*?\}\}', $mode, 'plugin_tag_count');
+ }
+
+ /**
+ * Handle matches of the count syntax
+ *
+ * @param string $match The match of the syntax
+ * @param int $state The state of the handler
+ * @param int $pos The position in the document
+ * @param Doku_Handler $handler The handler
+ * @return array Data for the renderer
+ */
+ function handle($match, $state, $pos, Doku_Handler $handler) {
+
+ $dump = trim(substr($match, 8, -2)); // get given tags
+ $dump = explode('&', $dump); // split to tags and allowed namespaces
+ $tags = $dump[0];
+ $allowedNamespaces = explode(' ', $dump[1]); // split given namespaces into an array
+
+ if($allowedNamespaces && $allowedNamespaces[0] == '') {
+ unset($allowedNamespaces[0]); // When exists, remove leading space after the delimiter
+ $allowedNamespaces = array_values($allowedNamespaces);
+ }
+
+ if (empty($allowedNamespaces)) $allowedNamespaces = null;
+
+ if (!$tags) $tags = '+';
+
+ /** @var helper_plugin_tag $my */
+ if(!($my = $this->loadHelper('tag'))) return false;
+
+ return array($my->_parseTagList($tags), $allowedNamespaces);
+ }
+
+ /**
+ * Render xhtml output or metadata
+ *
+ * @param string $mode Renderer mode (supported modes: xhtml and metadata)
+ * @param Doku_Renderer $renderer The renderer
+ * @param array $data The data from the handler function
+ * @return bool If rendering was successful.
+ */
+ function render($mode, Doku_Renderer $renderer, $data) {
+ if ($data == false) return false;
+
+ list($tags, $allowedNamespaces) = $data;
+
+ // deactivate (renderer) cache as long as there is no proper cache handling
+ // implemented for the count syntax
+ $renderer->nocache();
+
+ if($mode == "xhtml") {
+ /** @var helper_plugin_tag $my */
+ if(!($my = $this->loadHelper('tag'))) return false;
+
+ // get tags and their occurrences
+ if($tags[0] == '+') {
+ // no tags given, list all tags for allowed namespaces
+ $occurrences = $my->tagOccurrences($tags, $allowedNamespaces, true);
+ } else {
+ $occurrences = $my->tagOccurrences($tags, $allowedNamespaces);
+ }
+
+ $class = "inline"; // valid: inline, ul, pagelist
+ $col = "page";
+
+ $renderer->doc .= '<table class="'.$class.'">'.DOKU_LF;
+ $renderer->doc .= DOKU_TAB.'<tr>'.DOKU_LF.DOKU_TAB.DOKU_TAB;
+ $renderer->doc .= '<th class="'.$col.'">'.$this->getLang('tag').'</th>';
+ $renderer->doc .= '<th class="'.$col.'">'.$this->getLang('count').'</th>';
+ $renderer->doc .= DOKU_LF.DOKU_TAB.'</tr>'.DOKU_LF;
+
+ if(empty($occurrences)) {
+ // Skip output
+ $renderer->doc .= DOKU_TAB.'<tr>'.DOKU_LF.DOKU_TAB.DOKU_TAB;
+ $renderer->doc .= DOKU_TAB.DOKU_TAB.'<td class="'.$class.'" colspan="2">'.$this->getLang('empty_output').'</td>'.DOKU_LF;
+ $renderer->doc .= DOKU_LF.DOKU_TAB.'</tr>'.DOKU_LF;
+ } else {
+ foreach($occurrences as $tagname => $count) {
+ if($count <= 0) continue; // don't display tags with zero occurrences
+ $renderer->doc .= DOKU_TAB.'<tr>'.DOKU_LF.DOKU_TAB.DOKU_TAB;
+ $renderer->doc .= DOKU_TAB.DOKU_TAB.'<td class="'.$class.'">'.$my->tagLink($tagname).'</td>'.DOKU_LF;
+ $renderer->doc .= DOKU_TAB.DOKU_TAB.'<td class="'.$class.'">'.$count.'</td>'.DOKU_LF;
+ $renderer->doc .= DOKU_LF.DOKU_TAB.'</tr>'.DOKU_LF;
+ }
+ }
+ $renderer->doc .= '</table>'.DOKU_LF;
+ }
+ return true;
+ }
+}
+// vim:ts=4:sw=4:et:
diff --git a/platform/www/lib/plugins/tag/syntax/searchtags.php b/platform/www/lib/plugins/tag/syntax/searchtags.php
new file mode 100644
index 0000000..67d62b3
--- /dev/null
+++ b/platform/www/lib/plugins/tag/syntax/searchtags.php
@@ -0,0 +1,281 @@
+<?php
+/**
+ * Syntax plugin part for displaying a tag search form with results.
+ *
+ * Usage: {{tagsearch[&flags]}}
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Michael Hamann <michael@content-space.de>
+ */
+
+/**
+ * Tagsearch syntax, displays a tag search form with results similar to the topic syntax
+ */
+class syntax_plugin_tag_searchtags extends DokuWiki_Syntax_Plugin {
+ /**
+ * @return string Syntax type
+ */
+ function getType() { return 'substition'; }
+
+ /**
+ * @return string Paragraph type
+ */
+ function getPType() { return 'block'; }
+
+ /**
+ * @return int Sort order
+ */
+ function getSort() { return 295; }
+
+ /**
+ * @param string $mode Parser mode
+ */
+ function connectTo($mode) {
+ $this->Lexer->addSpecialPattern('\{\{searchtags\}\}',$mode,'plugin_tag_searchtags');
+ // make sure that flags really start with & and media files starting with "searchtags" still work
+ $this->Lexer->addSpecialPattern('\{\{searchtags&.*?\}\}',$mode,'plugin_tag_searchtags');
+ }
+
+ /**
+ * Handle matches of the searchtags syntax
+ *
+ * @param string $match The match of the syntax
+ * @param int $state The state of the handler
+ * @param int $pos The position in the document
+ * @param Doku_Handler $handler The handler
+ * @return array Data for the renderer
+ */
+ function handle($match, $state, $pos, Doku_Handler $handler) {
+ $flags = substr($match, 10, -2); // strip {{searchtags from start and }} from end
+ // remove empty flags by using array_filter (removes elements == false)
+ $flags = array_filter(explode('&', $flags));
+
+ return $flags;
+ }
+
+ /**
+ * Render xhtml output or metadata
+ *
+ * @param string $mode Renderer mode (supported modes: xhtml and metadata)
+ * @param Doku_Renderer $renderer The renderer
+ * @param array $data The data from the handler function
+ * @return bool If rendering was successful.
+ */
+ function render($mode, Doku_Renderer $renderer, $data) {
+ global $lang;
+ $flags = $data;
+
+ if ($mode == 'xhtml') {
+ /* @var Doku_Renderer_xhtml $renderer */
+
+ // prevent caching to ensure content is always fresh
+ $renderer->nocache();
+
+ /* @var helper_plugin_pagelist $pagelist */
+ // let Pagelist Plugin do the work for us
+ if ((!$pagelist = $this->loadHelper('pagelist'))) {
+ return false;
+ }
+
+ // Prepare the flags for the pagelist plugin
+ $configflags = explode(',', str_replace(" ", "", $this->getConf('pagelist_flags')));
+ $flags = array_merge($configflags, $flags);
+ foreach($flags as $key => $flag) {
+ if($flag == "") unset($flags[$key]);
+ }
+
+ // print the search form
+ $nonsform = in_array('nonsform', $flags);
+ $renderer->doc .= $this->getForm($nonsform);
+
+ // get the tag input data
+ $tags = $this->getTagSearchString();
+
+ if ($tags != NULL) {
+ /* @var helper_plugin_tag $my */
+ if ($my = $this->loadHelper('tag')) $pages = $my->getTopic($this->getNS(), '', $tags);
+
+ // Display a message when no pages were found
+ if (!isset($pages) || !$pages) {
+ $renderer->p_open();
+ $renderer->cdata($lang['nothingfound']);
+ $renderer->p_close();
+ } else {
+
+ // display the actual search results
+ $pagelist->setFlags($flags);
+ $pagelist->startList();
+ foreach ($pages as $page) {
+ $pagelist->addPage($page);
+ }
+ $renderer->doc .= $pagelist->finishList();
+ }
+ }
+
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Return the search form for the namespace and the tag selection
+ *
+ * @return string the HTML code of the search form
+ */
+ private function getForm($nonsform=false) {
+ global $conf, $lang;
+
+ if (!$nonsform) {
+ // Get the list of all namespaces for the dropdown
+ $namespaces = array();
+ search($namespaces,$conf['datadir'],'search_namespaces',array());
+
+ // build the list in the form value => label from the namespace search result
+ $ns_select = array('' => '');
+ foreach ($namespaces as $ns) {
+ // only display namespaces the user can access when sneaky index is on
+ if ($ns['perm'] > 0 || $conf['sneaky_index'] == 0) {
+ $ns_select[$ns['id']] = $ns['id'];
+ }
+ }
+ }
+
+ $form = new Doku_Form(array('action' => '', 'method' => 'post', 'class' => 'plugin__tag_search'));
+
+ // add a paragraph around the inputs in order to get some margin around the form elements
+ $form->addElement(form_makeOpenTag('p'));
+ // namespace select
+ if (!$nonsform) {
+ $form->addElement(form_makeMenuField('plugin__tag_search_namespace', $ns_select, $this->getNS(), $lang['namespaces']));
+ }
+
+ // checkbox for AND
+ $attr = array();
+ if ($this->useAnd()) $attr['checked'] = 'checked';
+ $form->addElement(form_makeCheckboxField('plugin__tag_search_and', 1, $this->getLang('use_and'), '', '', $attr));
+ $form->addElement(form_makeCloseTag('p'));
+
+ // load the tag list - only tags that actually have pages assigned that the current user can access are listed
+ /* @var helper_plugin_tag $my */
+ if ($my = $this->loadHelper('tag')) $tags = $my->tagOccurrences(array(), NULL, true);
+ // sort tags by name ($tags is in the form $tag => $count)
+ ksort($tags);
+
+ // display error message when no tags were found
+ if (!isset($tags) || $tags == NULL) {
+ $form->addElement(form_makeOpenTag('p'));
+ $form->addElement($this->getLang('no_tags'));
+ $form->addElement(form_makeCloseTag('p'));
+ } else {
+ // the tags table
+ $form->addElement(form_makeOpenTag('div', array('class' => 'table')));
+ $form->addElement(form_makeOpenTag('table', array('class' => 'inline')));
+ // print table header
+ $form->addElement(form_makeOpenTag('tr'));
+ $form->addElement(form_makeOpenTag('th'));
+ $form->addElement($this->getLang('include'));
+ $form->addElement(form_makeCloseTag('th'));
+ $form->addElement(form_makeOpenTag('th'));
+ $form->addElement($this->getLang('exclude'));
+ $form->addElement(form_makeCloseTag('th'));
+ $form->addElement(form_makeOpenTag('th'));
+ $form->addElement($this->getLang('tags'));
+ $form->addElement(form_makeCloseTag('th'));
+ $form->addElement(form_makeCloseTag('tr'));
+
+ // print tag checkboxes
+ foreach ($tags as $tag => $count) {
+ $form->addElement(form_makeOpenTag('tr'));
+ $form->addElement(form_makeOpenTag('td'));
+ $attr = array();
+ if ($this->isSelected($tag)) $attr['checked'] = 'checked';
+ $form->addElement(form_makeCheckboxField('plugin__tag_search_tags[]', $tag, '+', '', 'plus', $attr));
+ $form->addElement(form_makeCloseTag('td'));
+ $form->addElement(form_makeOpenTag('td'));
+ $attr = array();
+ if ($this->isSelected('-'.$tag)) $attr['checked'] = 'checked';
+ $form->addElement(form_makeCheckboxField('plugin__tag_search_tags[]', '-'.$tag, '-', '', 'minus', $attr));
+ $form->addElement(form_makeCloseTag('td'));
+ $form->addElement(form_makeOpenTag('td'));
+ $form->addElement(hsc($tag).' ['.$count.']');
+ $form->addElement(form_makeCloseTag('td'));
+ $form->addElement(form_makeCloseTag('tr'));
+ }
+
+ $form->addElement(form_makeCloseTag('table'));
+ $form->addElement(form_makeCloseTag('div'));
+
+ // submit button (doesn't use the button form element because it always submits an action which is not
+ // recognized for $preact in inc/actions.php and thus always causes a redirect)
+ $form->addElement(form_makeOpenTag('p'));
+ $form->addElement(form_makeTag('input', array('type' => 'submit', 'value' => $lang['btn_search'])));
+ $form->addElement(form_makeCloseTag('p'));
+ }
+
+ return $form->getForm();
+ }
+
+ /**
+ * Returns the currently selected namespace
+ * @return string the cleaned namespace id
+ */
+ private function getNS() {
+ if (isset($_POST['plugin__tag_search_namespace'])) {
+ return cleanID($_POST['plugin__tag_search_namespace']);
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * Returns the tag search string from the selected tags
+ * @return string|NULL the tag search or NULL when no tags were selected
+ */
+ private function getTagSearchString() {
+ if (isset($_POST['plugin__tag_search_tags']) && is_array($_POST['plugin__tag_search_tags'])) {
+ $tags = $_POST['plugin__tag_search_tags'];
+ // wWhen and is set, prepend "+" to each tag
+ $plus = (isset($_POST['plugin__tag_search_and']) ? '+' : '');
+ $positive_tags = '';
+ $negative_tags = '';
+ foreach ($tags as $tag) {
+ $tag = (string)$tag;
+ if ($tag[0] == '-') {
+ $negative_tags .= $tag.' ';
+ } else {
+ if ($positive_tags === '') {
+ $positive_tags = $tag.' ';
+ } else {
+ $positive_tags .= $plus.$tag.' ';
+ }
+ }
+ }
+ return $positive_tags.$negative_tags;
+ } else {
+ return NULL; // return NULL when no tags were selected so no results will be displayed
+ }
+ }
+
+ /**
+ * Check if a tag was selected for search
+ *
+ * @param string $tag The tag to check
+ * @return bool if the tag was checked
+ */
+ private function isSelected($tag) {
+ if (isset($_POST['plugin__tag_search_tags']) && is_array($_POST['plugin__tag_search_tags'])) {
+ return in_array($tag, $_POST['plugin__tag_search_tags'], true);
+ } else {
+ return false; // no tags in the post data - no tag selected
+ }
+ }
+
+ /**
+ * Check if the tag query should use AND (instead of OR)
+ *
+ * @return bool if the query should use AND
+ */
+ private function useAnd() {
+ return isset($_POST['plugin__tag_search_and']);
+ }
+}
+// vim:ts=4:sw=4:et:
diff --git a/platform/www/lib/plugins/tag/syntax/tag.php b/platform/www/lib/plugins/tag/syntax/tag.php
new file mode 100644
index 0000000..dc8bce5
--- /dev/null
+++ b/platform/www/lib/plugins/tag/syntax/tag.php
@@ -0,0 +1,112 @@
+<?php
+/**
+ * Tag Plugin: displays list of keywords with links to categories this page
+ * belongs to. The links are marked as tags for Technorati and other services
+ * using tagging.
+ *
+ * Usage: {{tag>category tags space separated}}
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Esther Brunner <wikidesign@gmail.com>
+ */
+
+/**
+ * Tag syntax plugin, allows to specify tags in a page
+ */
+class syntax_plugin_tag_tag extends DokuWiki_Syntax_Plugin {
+
+ /**
+ * @return string Syntax type
+ */
+ function getType() { return 'substition'; }
+ /**
+ * @return int Sort order
+ */
+ function getSort() { return 305; }
+ /**
+ * @return string Paragraph type
+ */
+ function getPType() { return 'block';}
+
+ /**
+ * @param string $mode Parser mode
+ */
+ function connectTo($mode) {
+ $this->Lexer->addSpecialPattern('\{\{tag>.*?\}\}', $mode, 'plugin_tag_tag');
+ }
+
+ /**
+ * Handle matches of the tag syntax
+ *
+ * @param string $match The match of the syntax
+ * @param int $state The state of the handler
+ * @param int $pos The position in the document
+ * @param Doku_Handler $handler The handler
+ * @return array Data for the renderer
+ */
+ function handle($match, $state, $pos, Doku_Handler $handler) {
+ $tags = trim(substr($match, 6, -2)); // strip markup & whitespace
+ $tags = preg_replace(array('/[[:blank:]]+/', '/\s+/'), " ", $tags); // replace linebreaks and multiple spaces with one space character
+
+ if (!$tags) return false;
+
+ // load the helper_plugin_tag
+ /** @var helper_plugin_tag $my */
+ if (!$my = $this->loadHelper('tag')) return false;
+
+ // split tags and returns for renderer
+ return $my->_parseTagList($tags);
+ }
+
+ /**
+ * Render xhtml output or metadata
+ *
+ * @param string $mode Renderer mode (supported modes: xhtml and metadata)
+ * @param Doku_Renderer $renderer The renderer
+ * @param array $data The data from the handler function
+ * @return bool If rendering was successful.
+ */
+ function render($mode, Doku_Renderer $renderer, $data) {
+ if ($data === false) return false;
+ /** @var helper_plugin_tag $my */
+ if (!$my = $this->loadHelper('tag')) return false;
+
+ // XHTML output
+ if ($mode == 'xhtml') {
+ $tags = $my->tagLinks($data);
+ if (!$tags) return true;
+ $renderer->doc .= '<div class="'.$this->getConf('tags_list_css').'"><span>'.DOKU_LF.
+ DOKU_TAB.$tags.DOKU_LF.
+ '</span></div>'.DOKU_LF;
+ return true;
+
+ // for metadata renderer
+ } elseif ($mode == 'metadata') {
+ /** @var Doku_Renderer_metadata $renderer */
+ // erase tags on persistent metadata no more used
+ if (isset($renderer->persistent['subject'])) {
+ unset($renderer->persistent['subject']);
+ $renderer->meta['subject'] = array();
+ }
+
+ if (!isset($renderer->meta['subject'])) $renderer->meta['subject'] = array();
+
+ // each registered tags in metadata and index should be valid IDs
+ $data = array_map('cleanID', $data);
+ // merge with previous tags and make the values unique
+ $renderer->meta['subject'] = array_unique(array_merge($renderer->meta['subject'], $data));
+
+ if ($renderer->capture) $renderer->doc .= DOKU_LF.implode(' ', $data).DOKU_LF;
+
+ // add references if tag page exists
+ foreach ($data as $tag) {
+ resolve_pageid($my->namespace, $tag, $exists); // resolve shortcuts
+ $renderer->meta['relation']['references'][$tag] = $exists;
+ }
+
+ return true;
+ }
+ return false;
+ }
+}
+// vim:ts=4:sw=4:et:
diff --git a/platform/www/lib/plugins/tag/syntax/tagpage.php b/platform/www/lib/plugins/tag/syntax/tagpage.php
new file mode 100644
index 0000000..bec2e70
--- /dev/null
+++ b/platform/www/lib/plugins/tag/syntax/tagpage.php
@@ -0,0 +1,90 @@
+<?php
+/**
+ * Tag Plugin: Display a link to the listing of all pages with a certain tag.
+ *
+ * Usage: {{tagpage>mytag[&dynamic][|title]}}
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Matthias Schulte <dokuwiki@lupo49.de>
+ */
+
+/** Tagpage syntax, allows to link to a given tag */
+class syntax_plugin_tag_tagpage extends DokuWiki_Syntax_Plugin {
+
+ /**
+ * @return string Syntax type
+ */
+ function getType() {
+ return 'substition';
+ }
+
+ /**
+ * @return int Sort order
+ */
+ function getSort() {
+ return 305;
+ }
+
+ /**
+ * @return string Paragraph type
+ */
+ function getPType() {
+ return 'normal';
+ }
+
+ /**
+ * @param string $mode Parser mode
+ */
+ function connectTo($mode) {
+ $this->Lexer->addSpecialPattern('\{\{tagpage>.*?\}\}', $mode, 'plugin_tag_tagpage');
+ }
+
+ /**
+ * Handle matches of the count syntax
+ *
+ * @param string $match The match of the syntax
+ * @param int $state The state of the handler
+ * @param int $pos The position in the document
+ * @param Doku_Handler $handler The handler
+ * @return array Data for the renderer
+ */
+ function handle($match, $state, $pos, Doku_Handler $handler) {
+ $params = array();
+ $dump = trim(substr($match, 10, -2)); // get given tag
+ $dump = explode('|', $dump, 2); // split to tags, link name and options
+ $params['title'] = $dump[1];
+ $dump = explode('&', $dump[0]);
+ $params['dynamic'] = ($dump[1] == 'dynamic');
+ $params['tag'] = trim($dump[0]);
+
+ return $params;
+ }
+
+ /**
+ * Render xhtml output
+ *
+ * @param string $mode Renderer mode (supported modes: xhtml)
+ * @param Doku_Renderer $renderer The renderer
+ * @param array $data The data from the handler function
+ * @return bool If rendering was successful.
+ */
+ function render($mode, Doku_Renderer $renderer, $data) {
+ if($data == false) return false;
+
+ if($mode == "xhtml") {
+ if($data['dynamic']) {
+ // deactivate (renderer) cache as long as there is no proper cache handling
+ // implemented for the count syntax
+ $renderer->nocache();
+ }
+
+ /** @var helper_plugin_tag $my */
+ if(!($my = $this->loadHelper('tag'))) return false;
+
+ $renderer->doc .= $my->tagLink($data['tag'], $data['title'], $data['dynamic']);
+ return true;
+ }
+ return false;
+ }
+}
+// vim:ts=4:sw=4:et:
diff --git a/platform/www/lib/plugins/tag/syntax/topic.php b/platform/www/lib/plugins/tag/syntax/topic.php
new file mode 100644
index 0000000..a065a94
--- /dev/null
+++ b/platform/www/lib/plugins/tag/syntax/topic.php
@@ -0,0 +1,129 @@
+<?php
+/**
+ * Tag Plugin, topic component: displays links to all wiki pages with a certain tag
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Esther Brunner <wikidesign@gmail.com>
+ */
+
+/**
+ * Topic syntax, displays links to all wiki pages with a certain tag
+ */
+class syntax_plugin_tag_topic extends DokuWiki_Syntax_Plugin {
+
+ /**
+ * @return string Syntax type
+ */
+ function getType() { return 'substition'; }
+
+ /**
+ * @return string Paragraph type
+ */
+ function getPType() { return 'block'; }
+
+ /**
+ * @return int Sort order
+ */
+ function getSort() { return 295; }
+
+ /**
+ * @param string $mode Parser mode
+ */
+ function connectTo($mode) {
+ $this->Lexer->addSpecialPattern('\{\{topic>.+?\}\}',$mode,'plugin_tag_topic');
+ }
+
+ /**
+ * Handle matches of the topic syntax
+ *
+ * @param string $match The match of the syntax
+ * @param int $state The state of the handler
+ * @param int $pos The position in the document
+ * @param Doku_Handler $handler The handler
+ * @return array Data for the renderer
+ */
+ function handle($match, $state, $pos, Doku_Handler $handler) {
+ global $ID;
+
+ $match = substr($match, 8, -2); // strip {{topic> from start and }} from end
+ list($match, $flags) = explode('&', $match, 2);
+ $flags = explode('&', $flags);
+ list($ns, $tag) = explode('?', $match);
+
+ if (!$tag) {
+ $tag = $ns;
+ $ns = '';
+ }
+
+ if (($ns == '*') || ($ns == ':')) $ns = '';
+ elseif ($ns == '.') $ns = getNS($ID);
+ else $ns = cleanID($ns);
+
+ return array($ns, trim($tag), $flags);
+ }
+
+ /**
+ * Render xhtml output or metadata
+ *
+ * @param string $mode Renderer mode (supported modes: xhtml and metadata)
+ * @param Doku_Renderer $renderer The renderer
+ * @param array $data The data from the handler function
+ * @return bool If rendering was successful.
+ */
+ function render($mode, Doku_Renderer $renderer, $data) {
+ list($ns, $tag, $flags) = $data;
+
+ /* @var helper_plugin_tag $my */
+ if ($my = $this->loadHelper('tag')) $pages = $my->getTopic($ns, '', $tag);
+ if (!isset($pages) || !$pages) return true; // nothing to display
+
+ if ($mode == 'xhtml') {
+ /* @var Doku_Renderer_xhtml $renderer */
+
+ // prevent caching to ensure content is always fresh
+ $renderer->nocache();
+
+ /* @var helper_plugin_pagelist $pagelist */
+ // let Pagelist Plugin do the work for us
+ if ((!$pagelist = $this->loadHelper('pagelist'))) {
+ return false;
+ }
+ $pagelist->sort = false;
+ $pagelist->rsort = false;
+
+ $configflags = explode(',', str_replace(" ", "", $this->getConf('pagelist_flags')));
+ $flags = array_merge($configflags, $flags);
+ foreach($flags as $key => $flag) {
+ if($flag == "") unset($flags[$key]);
+ }
+
+ $pagelist->setFlags($flags);
+ $pagelist->startList();
+
+ // Sort pages by pagename if required by flags
+ if($pagelist->sort || $pagelist->rsort) {
+ $keys = array();
+ $fnc = create_function('$a, $b', 'return strcmp(noNS($a["id"]), noNS($b["id"])); ');
+ usort($pages, $fnc);
+ // rsort is true - revserse sort the pages
+ if($pagelist->rsort) krsort($pages);
+ }
+
+ foreach ($pages as $page) {
+ $pagelist->addPage($page);
+ }
+ $renderer->doc .= $pagelist->finishList();
+ return true;
+
+ // for metadata renderer
+/* } elseif ($mode == 'metadata') {
+ foreach ($pages as $page) {
+ $renderer->meta['relation']['references'][$page['id']] = true;
+ }
+
+ return true;*/ // causes issues with backlinks
+ }
+ return false;
+ }
+}
+// vim:ts=4:sw=4:et: