changeset 1366:c3fcddbf0c51

merge with main
author Franz Pletz <fpletz AT franz-pletz DOT org>
date Fri, 18 Aug 2006 11:43:50 +0200
parents 5bf27a0740aa (current diff) c4f6af5ee295 (diff)
children 4c29aeea8bf7
files MoinMoin/formatter/text_html.py docs/CHANGES.config
diffstat 65 files changed, 5420 insertions(+), 2856 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Fri Aug 18 11:42:58 2006 +0200
+++ b/.hgignore	Fri Aug 18 11:43:50 2006 +0200
@@ -4,4 +4,5 @@
 sa
 cover
 testwiki
+wiki/underlay
 
--- a/MoinMoin/Page.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/Page.py	Fri Aug 18 11:43:50 2006 +0200
@@ -636,7 +636,8 @@
 
         return count
 
-    def getPageList(self, user=None, exists=1, filter=None):
+    def getPageList(self, user=None, exists=1, filter=None, include_underlay=True,
+                    return_objects=False):
         """ List user readable pages under current page
 
         Currently only request.rootpage is used to list pages, but if we
@@ -662,6 +663,9 @@
         @param user: the user requesting the pages (MoinMoin.user.User)
         @param filter: filter function
         @param exists: filter existing pages
+        @param include_underlay: determines if underlay pages are returned as well
+        @param return_objects: lets it return a list of Page objects instead of
+            names
         @rtype: list of unicode strings
         @return: user readable wiki page names
         """
@@ -684,7 +688,7 @@
 
                 cache[pagename] = None
 
-        if user or exists or filter:
+        if user or exists or filter or not include_underlay or return_objects:
             # Filter names
             pages = []
             for name in cache:
@@ -693,15 +697,24 @@
                 if filter and not filter(name):
                     continue
 
+                page = Page(request, name)
+
+                # Filter underlay pages
+                if not include_underlay and page.getPageStatus()[0]: # is an underlay page
+                    continue
+
                 # Filter deleted pages
-                if exists and not Page(request, name).exists():
+                if exists and not page.exists():
                     continue
 
                 # Filter out page user may not read.
                 if user and not user.may.read(name):
                     continue
 
-                pages.append(name)
+                if return_objects:
+                    pages.append(page)
+                else:
+                    pages.append(name)
         else:
             pages = cache.keys()
 
@@ -1649,7 +1662,7 @@
         try:
             lastRevision = self.getRevList()[0]
         except IndexError:
-            return security.AccessControlList(self.request)
+            return security.AccessControlList(self.request.cfg)
         body = Page(self.request, self.page_name,
                     rev=lastRevision).get_raw_body()
         return security.parseACL(self.request, body)
--- a/MoinMoin/PageEditor.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/PageEditor.py	Fri Aug 18 11:43:50 2006 +0200
@@ -808,6 +808,9 @@
 
         self.copypage()
 
+        # remember conflict state
+        self.setConflict(wikiutil.containsConflictMarker(text))
+
         # Write always on the standard directory, never change the
         # underlay directory copy!
         pagedir = self.getPagePath(use_underlay=0, check_create=0)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MoinMoin/_tests/test_newlocking.py	Fri Aug 18 11:43:50 2006 +0200
@@ -0,0 +1,74 @@
+# -*- coding: utf-8 -*-
+"""
+    MoinMoin - MoinMoin test for new style "locking" (== mostly avoid locking)
+
+    The idea is to not have to lock files when we just want to read them.
+    When we never overwrite file content with new stuff, locking is not needed.
+    We can just write the new content into a new file (with tmpfname) and then
+    rename it to the original filename. Files that opened the original filename
+    before the rename will still read old content after the rename (until they
+    are closed).
+
+    @copyright: 2006 by Thomas Waldmann (idea: Bastian Blank)
+    @license: GNU GPL, see COPYING for details.
+"""
+
+import unittest, tempfile, os, shutil
+from MoinMoin._tests import TestConfig, TestSkipped
+
+def rename(oldname, newname):
+    """ Multiplatform rename
+
+    Move to MoinMoin.util.filesys when done.
+
+    TODO:
+    Test/Fix win32 stuff.
+    
+    Check: MoveFileEx: If the new filename is None, it deletes the file (needs very recent pywin32 binding).
+           This is documented for the "on reboot" stuff, does this also work when not doing it on next reboot?
+           Maybe we can use this at another place.
+           
+    API doc: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/movefileex.asp
+    
+    Windows 95/98/ME do not implement MoveFileEx().
+    Either have some other working code or document we drop support for less-than-NT.
+    Document pywin32 extension dependency.
+
+    """
+    # this nt specific code should be replaced by better stuff
+    if os.name == 'nt':
+        # uses mark hammond's pywin32 extension
+        # there seems to be also stuff in win32api.MoveFileEx and win32con.MOVEFILE_REPLACE_EXISTING
+        # what's the difference to them in win32file?
+        from win32file import MoveFileEx, MOVEFILE_REPLACE_EXISTING
+        ret = MoveFileEx(oldname, newname, MOVEFILE_REPLACE_EXISTING)
+        # If the function succeeds, the return value is nonzero.
+        # If the function fails, the return value is 0 (zero). To get extended error information, call GetLastError.
+        if ret == 0:
+            raise OSError # emulate os.rename behaviour
+    else:
+        os.rename(oldname, newname) # rename has no return value, but raises OSError in case of failure
+
+
+class NewLockTests(unittest.TestCase):
+
+    def setUp(self):
+        self.test_dir = tempfile.mkdtemp('', 'lock_')
+
+    def tearDown(self):
+        shutil.rmtree(self.test_dir)
+
+    def testNoLockingForReading(self):
+        """ new locking: NoLockingForReading tests if files still work when filename is target of a rename """
+        fname = os.path.join(self.test_dir, 'readtest')
+        tmpfname = os.path.join(self.test_dir, '__readtest')
+        origdata = "precious content"
+        newdata = "new content"
+        f = file(fname, "w") ; f.write(origdata) ; f.close()
+        f = file(fname, "r")
+        ftmp = file(tmpfname, "w") ; ftmp.write(newdata) ; ftmp.close()
+        rename(tmpfname, fname)
+        read1data = f.read() ; f.close() # we should still get origdata here!
+        f = file(fname, "r") ; read2data = f.read() ; f.close() # we should newdata now.
+        self.failUnless(origdata == read1data and newdata == read2data, "got wrong data when reading")
+
--- a/MoinMoin/_tests/test_security.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/_tests/test_security.py	Fri Aug 18 11:43:50 2006 +0200
@@ -204,7 +204,7 @@
             "BadGuy:  "
             "All:read  "
             ]
-        acl = security.AccessControlList(self.request, acl_rights)
+        acl = security.AccessControlList(self.request.cfg, acl_rights)
 
         # Should apply these rights:
         users = (
--- a/MoinMoin/_tests/test_wikisync.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/_tests/test_wikisync.py	Fri Aug 18 11:43:50 2006 +0200
@@ -11,7 +11,7 @@
 from MoinMoin.PageEditor import PageEditor
 from MoinMoin._tests import TestConfig, TestSkipped
 
-from MoinMoin.wikisync import TagStore
+from MoinMoin.wikisync import TagStore, BOTH
 
 
 class UnsafeSyncTestcase(TestCase):
@@ -27,7 +27,7 @@
     def testBasicTagThings(self):
         tags = TagStore(self.page)
         self.assert_(not tags.get_all_tags())
-        tags.add(remote_wiki="foo", remote_rev=1, current_rev=2)
+        tags.add(remote_wiki="foo", remote_rev=1, current_rev=2, direction=BOTH, normalised_name="FrontPage")
         tags = TagStore(self.page) # reload
         self.assert_(tags.get_all_tags()[0].remote_rev == 1)
     
--- a/MoinMoin/action/SpellCheck.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/action/SpellCheck.py	Fri Aug 18 11:43:50 2006 +0200
@@ -99,7 +99,6 @@
 
 
 def _addLocalWords(request):
-    import types
     from MoinMoin.PageEditor import PageEditor
 
     # get the new words as a string (if any are marked at all)
--- a/MoinMoin/action/SyncPages.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/action/SyncPages.py	Fri Aug 18 11:43:50 2006 +0200
@@ -10,9 +10,7 @@
 
 import os
 import re
-import zipfile
 import xmlrpclib
-from datetime import datetime
 
 # Compatiblity to Python 2.3
 try:
@@ -26,238 +24,35 @@
 from MoinMoin.PageEditor import PageEditor, conflict_markers
 from MoinMoin.Page import Page
 from MoinMoin.wikidicts import Dict, Group
-from MoinMoin.wikisync import TagStore
+from MoinMoin.wikisync import TagStore, UnsupportedWikiException, SyncPage
+from MoinMoin.wikisync import MoinLocalWiki, MoinRemoteWiki, UP, DOWN, BOTH, MIMETYPE_MOIN
 from MoinMoin.util.bdiff import decompress, patch, compress, textdiff
 from MoinMoin.util import diff3
 
-# directions
-UP, DOWN, BOTH = range(3)
+
+# map sync directions
 directions_map = {"up": UP, "down": DOWN, "both": BOTH}
 
 
-def normalise_pagename(page_name, prefix):
-    if prefix:
-        if not page_name.startswith(prefix):
-            return None
-        else:
-            return page_name[len(prefix):]
-    else:
-        return page_name
-
-
 class ActionStatus(Exception): pass
 
-class UnsupportedWikiException(Exception): pass
-
-# XXX Move these classes to MoinMoin.wikisync
-class SyncPage(object):
-    """ This class represents a page in one or two wiki(s). """
-    def __init__(self, name, local_rev=None, remote_rev=None, local_name=None, remote_name=None):
-        self.name = name
-        self.local_rev = local_rev
-        self.remote_rev = remote_rev
-        self.local_name = local_name
-        self.remote_name = remote_name
-        assert local_rev or remote_rev
-        assert local_name or remote_name
-
-    def __repr__(self):
-        return repr("<Remote Page %r>" % unicode(self))
-
-    def __unicode__(self):
-        return u"%s<%r:%r>" % (self.name, self.local_rev, self.remote_rev)
-
-    def __lt__(self, other):
-        return self.name < other.name
-
-    def __hash__(self):
-        return hash(self.name)
-
-    def __eq__(self, other):
-        if not isinstance(other, SyncPage):
-            return false
-        return self.name == other.name
-
-    def add_missing_pagename(self, local, remote):
-        if self.local_name is None:
-            n_name = normalise_pagename(self.remote_name, remote.prefix)
-            assert n_name is not None
-            self.local_name = (local.prefix or "") + n_name
-        elif self.remote_name is None:
-            n_name = normalise_pagename(self.local_name, local.prefix)
-            assert n_name is not None
-            self.remote_name = (local.prefix or "") + n_name
-
-        return self # makes using list comps easier
-
-    def filter(cls, sp_list, func):
-        return [x for x in sp_list if func(x.name)]
-    filter = classmethod(filter)
-
-    def merge(cls, local_list, remote_list):
-        # map page names to SyncPage objects :-)
-        d = dict(zip(local_list, local_list))
-        for sp in remote_list:
-            if sp in d:
-                d[sp].remote_rev = sp.remote_rev
-                d[sp].remote_name = sp.remote_name
-            else:
-                d[sp] = sp
-        return d.keys()
-    merge = classmethod(merge)
-
-    def is_only_local(self):
-        return not self.remote_rev
-
-    def is_only_remote(self):
-        return not self.local_rev
-
-    def is_local_and_remote(self):
-        return self.local_rev and self.remote_rev
-
-    def iter_local_only(cls, sp_list):
-        for x in sp_list:
-            if x.is_only_local():
-                yield x
-    iter_local_only = classmethod(iter_local_only)
-
-    def iter_remote_only(cls, sp_list):
-        for x in sp_list:
-            if x.is_only_remote():
-                yield x
-    iter_remote_only = classmethod(iter_remote_only)
-
-    def iter_local_and_remote(cls, sp_list):
-        for x in sp_list:
-            if x.is_local_and_remote():
-                yield x
-    iter_local_and_remote = classmethod(iter_local_and_remote)
-
-class RemoteWiki(object):
-    """ This class should be the base for all implementations of remote wiki
-        classes. """
-
-    def __repr__(self):
-        """ Returns a representation of the instance for debugging purposes. """
-        return NotImplemented
-
-    def get_interwiki_name(self):
-        """ Returns the interwiki name of the other wiki. """
-        return NotImplemented
-
-    def get_iwid(self):
-        """ Returns the InterWiki ID. """
-        return NotImplemented
-
-    def get_pages(self):
-        """ Returns a list of SyncPage instances. """
-        return NotImplemented
-
-
-class MoinRemoteWiki(RemoteWiki):
-    """ Used for MoinMoin wikis reachable via XMLRPC. """
-    def __init__(self, request, interwikiname, prefix):
-        self.request = request
-        self.prefix = prefix
-        _ = self.request.getText
-
-        wikitag, wikiurl, wikitail, wikitag_bad = wikiutil.resolve_wiki(self.request, '%s:""' % (interwikiname, ))
-        self.wiki_url = wikiutil.mapURL(self.request, wikiurl)
-        self.valid = not wikitag_bad
-        self.xmlrpc_url = self.wiki_url + "?action=xmlrpc2"
-        if not self.valid:
-            self.connection = None
-            return
-
-        self.connection = self.createConnection()
-
-        version = self.connection.getMoinVersion()
-        if not isinstance(version, (tuple, list)):
-            raise UnsupportedWikiException(_("The remote version of MoinMoin is too old, the version 1.6 is required at least."))
-
-        remote_interwikiname = self.get_interwiki_name()
-        remote_iwid = self.connection.interwikiName()[1]
-        self.is_anonymous = remote_interwikiname is None
-        if not self.is_anonymous and interwikiname != remote_interwikiname:
-            raise UnsupportedWikiException(_("The remote wiki uses a different InterWiki name (%(remotename)s)"
-                                             " internally than you specified (%(localname)s).") % {
-                "remotename": wikiutil.escape(remote_interwikiname), "localname": wikiutil.escape(interwikiname)})
-
-        if self.is_anonymous:
-            self.iwid_full = packLine([remote_iwid])
-        else:
-            self.iwid_full = packLine([remote_iwid, interwikiname])
-
-    def createConnection(self):
-        return xmlrpclib.ServerProxy(self.xmlrpc_url, allow_none=True, verbose=True)
-
-    # Public methods
-    def get_diff(self, pagename, from_rev, to_rev):
-        return str(self.connection.getDiff(pagename, from_rev, to_rev))
-
-    # Methods implementing the RemoteWiki interface
-    def get_interwiki_name(self):
-        return self.connection.interwikiName()[0]
-
-    def get_iwid(self):
-        return self.connection.interwikiName()[1]
-
-    def get_pages(self):
-        pages = self.connection.getAllPagesEx({"include_revno": True, "include_deleted": True})
-        rpages = []
-        for name, revno in pages:
-            normalised_name = normalise_pagename(name, self.prefix)
-            if normalised_name is None:
-                continue
-            rpages.append(SyncPage(normalised_name, remote_rev=revno, remote_name=name))
-        return rpages
-
-    def __repr__(self):
-        return "<MoinRemoteWiki wiki_url=%r valid=%r>" % (self.wiki_url, self.valid)
-
-
-class MoinLocalWiki(RemoteWiki):
-    """ Used for the current MoinMoin wiki. """
-    def __init__(self, request, prefix):
-        self.request = request
-        self.prefix = prefix
-
-    def getGroupItems(self, group_list):
-        """ Returns all page names that are listed on the page group_list. """
-        pages = []
-        for group_pagename in group_list:
-            pages.extend(Group(self.request, group_pagename).members())
-        return [self.createSyncPage(x) for x in pages]
-
-    def createSyncPage(self, page_name):
-        normalised_name = normalise_pagename(page_name, self.prefix)
-        if normalised_name is None:
-            return None
-        return SyncPage(normalised_name, local_rev=Page(self.request, page_name).get_real_rev(), local_name=page_name)
-
-    # Public methods:
-
-    # Methods implementing the RemoteWiki interface
-    def get_interwiki_name(self):
-        return self.request.cfg.interwikiname
-
-    def get_iwid(self):
-        return self.request.cfg.iwid
-
-    def get_pages(self):
-        return [x for x in [self.createSyncPage(x) for x in self.request.rootpage.getPageList(exists=0)] if x]
-
-    def __repr__(self):
-        return "<MoinLocalWiki>"
-
 
 class ActionClass:
+    INFO, WARN, ERROR = range(3) # used for logging
+
     def __init__(self, pagename, request):
         self.request = request
         self.pagename = pagename
         self.page = Page(request, pagename)
+        self.status = []
+        request.flush()
+
+    def log_status(self, level, message):
+        """ Appends the message with a given importance level to the internal log. """
+        self.status.append((level, message))
 
     def parse_page(self):
+        """ Parses the parameter page and returns the read arguments. """
         options = {
             "remotePrefix": "",
             "localPrefix": "",
@@ -276,7 +71,7 @@
         if options["groupList"] is not None:
             options["groupList"] = unpackLine(options["groupList"], ",")
 
-        options["direction"] = directions_map.get(options["direction"], BOTH)
+        options["direction"] = directions_map.get(options["direction"].lower(), BOTH)
 
         return options
 
@@ -287,7 +82,6 @@
         if params["pageList"] is not None:
             params["pageMatch"] = u'|'.join([r'^%s$' % re.escape(name)
                                              for name in params["pageList"]])
-            del params["pageList"]
 
         if params["pageMatch"] is not None:
             params["pageMatch"] = re.compile(params["pageMatch"], re.U)
@@ -295,6 +89,7 @@
         # we do not support matching or listing pages if there is a group of pages
         if params["groupList"]:
             params["pageMatch"] = None
+            params["pageList"] = None
 
         return params
 
@@ -308,15 +103,18 @@
         params = self.fix_params(self.parse_page())
 
         try:
+            if params["direction"] == UP:
+                raise ActionStatus(_("The only supported directions are BOTH and DOWN."))
+
             if not self.request.cfg.interwikiname:
                 raise ActionStatus(_("Please set an interwikiname in your wikiconfig (see HelpOnConfiguration) to be able to use this action."))
 
             if not params["remoteWiki"]:
                 raise ActionStatus(_("Incorrect parameters. Please supply at least the ''remoteWiki'' parameter."))
 
-            local = MoinLocalWiki(self.request, params["localPrefix"])
+            local = MoinLocalWiki(self.request, params["localPrefix"], params["pageList"])
             try:
-                remote = MoinRemoteWiki(self.request, params["remoteWiki"], params["remotePrefix"])
+                remote = MoinRemoteWiki(self.request, params["remoteWiki"], params["remotePrefix"], params["pageList"])
             except UnsupportedWikiException, (msg, ):
                 raise ActionStatus(msg)
 
@@ -325,15 +123,55 @@
 
             self.sync(params, local, remote)
         except ActionStatus, e:
-            return self.page.send_page(self.request, msg=u'<p class="error">%s</p>\n' % (e.args[0], ))
+            msg = u'<p class="error">%s</p><p>%s</p>\n' % (e.args[0], repr(self.status))
+        else:
+            msg = u"%s<p>%s</p>" % (_("Syncronisation finished."), repr(self.status))
 
-        return self.page.send_page(self.request, msg=_("Syncronisation finished."))
+        # XXX append self.status to the job page
+        return self.page.send_page(self.request, msg=msg)
     
     def sync(self, params, local, remote):
-        """ This method does the syncronisation work. """
+        """ This method does the syncronisation work.
+            Currently, it handles the case where the pages exist on both sides.
+            One of the major missing parts is rename handling.
+            Now there are a few other cases left that have to be implemented:
+                Wiki A    | Wiki B   | Remark
+                ----------+----------+------------------------------
+                exists    | deleted  | In this case, we do a normal merge if there
+                          |          | are no tags. If there were changes in
+                          |          | Wiki A, there is a merge with a conflict.
+                          |          | Otherwise (no changes past last merge),
+                          |          | the page is deleted in Wiki A.
+                          |          | This needs static info that could be
+                          |          | transferred with the pagelist.
+                ----------+----------+-------------------------------
+                exists    | non-     | Now the wiki knows that the page was renamed.
+                with tags | existant | There should be an RPC method that asks
+                          |          | for the new name (which could be recorded
+                          |          | on page rename). Then the page is
+                          |          | renamed in Wiki A as well and the sync
+                          |          | is done normally.
+                          |          | Every wiki retains a dict that maps
+                          |          | (IWID, oldname) => newname and that is
+                          |          | updated on every rename. oldname refers
+                          |          | to the pagename known by the old wiki (can be
+                          |          | gathered from tags).
+                ----------+----------+-------------------------------
+                exists    | any case | Try a rename search first, then
+                          |          | do a sync without considering tags
+                with tags | with non | to ensure data integrity.
+                          | matching | Hmm, how do we detect this
+                          | tags     | case if the unmatching tags are only on the remote side?
+                ----------+----------+-------------------------------
+                exists    | exists   | already handled.
+        """
+        _ = self.request.getText
+        direction = params["direction"]
+        local_full_iwid = packLine([local.get_iwid(), local.get_interwiki_name()])
+        remote_full_iwid = packLine([remote.get_iwid(), remote.get_interwiki_name()])
 
         l_pages = local.get_pages()
-        r_pages = remote.get_pages()
+        r_pages = remote.get_pages(exclude_non_writable=direction != DOWN)
 
         if params["groupList"]:
             pages_from_groupList = set(local.getGroupItems(params["groupList"]))
@@ -342,11 +180,11 @@
 
         m_pages = [elem.add_missing_pagename(local, remote) for elem in SyncPage.merge(l_pages, r_pages)]
 
-        print "Got %i local, %i remote pages, %i merged pages" % (len(l_pages), len(r_pages), len(m_pages))
-        
+        self.log_status(self.INFO, "Got %i local, %i remote pages, %i merged pages" % (len(l_pages), len(r_pages), len(m_pages))) # XXX remove?
+
         if params["pageMatch"]:
             m_pages = SyncPage.filter(m_pages, params["pageMatch"].match)
-        print "After filtering: Got %i merges pages" % (len(m_pages), )
+        self.log_status(self.INFO, "After filtering: Got %i merges pages" % (len(m_pages), )) # XXX remove
 
         on_both_sides = list(SyncPage.iter_local_and_remote(m_pages))
         remote_but_not_local = list(SyncPage.iter_remote_only(m_pages))
@@ -356,62 +194,136 @@
         #r_new_pages = u", ".join([unicode(x) for x in remote_but_not_local])
         #l_new_pages = u", ".join([unicode(x) for x in local_but_not_remote])
         #raise ActionStatus("These pages are in the remote wiki, but not local: " + wikiutil.escape(r_new_pages) + "<br>These pages are in the local wiki, but not in the remote one: " + wikiutil.escape(l_new_pages))
-        #if params["direction"] in (DOWN, BOTH):
-        #    for rp in remote_but_not_local:
 
         # let's do the simple case first, can be refactored later to match all cases
         # XXX handle deleted pages
         for rp in on_both_sides:
             # XXX add locking, acquire read-lock on rp
+            #print "Processing %r" % rp
 
-            current_page = Page(self.request, local_pagename)
+            local_pagename = rp.local_name
+            current_page = PageEditor(self.request, local_pagename) # YYY direct access
             current_rev = current_page.get_real_rev()
-            local_pagename = rp.local_pagename
 
             tags = TagStore(current_page)
-            matching_tags = tags.fetch(iwid_full=remote.iwid_full)
-            matching_tags.sort()
-
-            if not matching_tags:
-                remote_rev = None
-                local_rev = rp.local_rev # merge against the newest version
-                old_contents = ""
+            if direction == BOTH:
+                match_direction = direction
             else:
+                match_direction = None
+            matching_tags = tags.fetch(iwid_full=remote.iwid_full,direction=match_direction)
+            matching_tags.sort()
+            #print "------ TAGS: " + repr(matching_tags) + repr(tags.tags)
+
+            # some default values for non matching tags
+            normalised_name = None
+            remote_rev = None
+            local_rev = rp.local_rev # merge against the newest version
+            old_contents = ""
+
+            if matching_tags:
                 newest_tag = matching_tags[-1]
-                local_rev = newest_tag.current_rev
-                remote_rev = newest_tag.remote_rev
-                if remote_rev == rp.remote_rev and local_rev == current_rev:
+                
+                # handle some cases where we cannot continue for this page
+                if newest_tag.remote_rev == rp.remote_rev and (direction == DOWN or newest_tag.current_rev == current_rev):
                     continue # no changes done, next page
-                old_page = Page(self.request, local_pagename, rev=local_rev)
-                old_contents = old_page.get_raw_body_str()
+                if rp.local_mime_type != MIMETYPE_MOIN and not (newest_tag.remote_rev == rp.remote_rev ^ newest_tag.current_rev == current_rev):
+                    self.log_status(ActionClass.WARN, _("The item %(pagename)s cannot be merged but was changed in both wikis. Please delete it in one of both wikis and try again.") % {"pagename": rp.name})
+                    continue
+                if rp.local_mime_type != rp.remote_mime_type:
+                    self.log_status(ActionClass.WARN, _("The item %(pagename)s has different mime types in both wikis and cannot be merged. Please delete it in one of both wikis or unify the mime type, and try again.") % {"pagename": rp.name})
+                    continue
+                if newest_tag.normalised_name != rp.name:
+                    self.log_status(ActionClass.WARN, _("The item %(pagename)s was renamed locally. This is not implemented yet. Therefore all syncronisation history is lost for this page.") % {"pagename": rp.name}) # XXX implement renames
+                else:
+                    normalised_name = newest_tag.normalised_name
+                    local_rev = newest_tag.current_rev
+                    remote_rev = newest_tag.remote_rev
+                    old_contents = Page(self.request, local_pagename, rev=newest_tag.current_rev).get_raw_body_str() # YYY direct access
+
+            self.log_status(ActionClass.INFO, _("Synchronising page %(pagename)s with remote page %(remotepagename)s ...") % {"pagename": local_pagename, "remotepagename": rp.remote_name})
+
+            if direction == DOWN:
+                remote_rev = None # always fetch the full page, ignore remote conflict check
+                patch_base_contents = ""
+            else:
+                patch_base_contents = old_contents
 
-            diff_result = remote.get_diff(rp.remote_pagename, remote_rev, None)
-            is_remote_conflict = diff_result["conflict"]
-            assert diff_result["diffversion"] == 1
-            diff = diff_result["diff"]
-            current_remote_rev = diff_result["current"]
+            if remote_rev != rp.remote_rev:
+                diff_result = remote.get_diff(rp.remote_name, remote_rev, None, normalised_name)
+                if diff_result is None:
+                    self.log_status(ActionClass.ERROR, _("The page %(pagename)s could not be synced. The remote page was renamed. This is not supported yet. You may want to delete one of the pages to get it synced.") % {"pagename": rp.remote_name})
+                    continue
+                is_remote_conflict = diff_result["conflict"]
+                assert diff_result["diffversion"] == 1
+                diff = diff_result["diff"]
+                current_remote_rev = diff_result["current"]
+            else:
+                current_remote_rev = remote_rev
+                if rp.local_mime_type == MIMETYPE_MOIN:
+                    is_remote_conflict = wikiutil.containsConflictMarker(old_contents.decode("utf-8"))
+                else:
+                    is_remote_conflict = NotImplemented
+                diff = None
 
-            if remote_rev is None: # set the remote_rev for the case without any tags
-                remote_rev = current_remote_rev
+            # do not sync if the conflict is remote and local, or if it is local
+            # and the page has never been syncronised
+            if (rp.local_mime_type == MIMETYPE_MOIN and wikiutil.containsConflictMarker(current_page.get_raw_body())
+                and (remote_rev is None or is_remote_conflict)):
+                self.log_status(ActionClass.WARN, _("Skipped page %(pagename)s because of a locally or remotely unresolved conflict.") % {"pagename": local_pagename})
+                continue
 
-            new_contents = patch(old_contents, decompress(diff)).decode("utf-8")
-            old_contents = old_contents.encode("utf-8")
+            if remote_rev is None and direction == BOTH:
+                self.log_status(ActionClass.INFO, _("This is the first synchronisation between this page and the remote wiki."))
 
-            # here, the actual merge happens
-            verynewtext = diff3.text_merge(old_contents, new_contents, current_page.get_raw_body(), 1, *conflict_markers)
+            if diff is None:
+                new_contents = old_contents
+            else:
+                new_contents = patch(patch_base_contents, decompress(diff))
 
-            new_local_rev = current_rev + 1 # XXX commit first?
-            local_full_iwid = packLine([local.get_iwid(), local.get_interwiki_name()])
-            remote_full_iwid = packLine([remote.get_iwid(), remote.get_interwiki_name()])
-            # XXX add remote conflict handling
-            very_current_remote_rev = remote.merge_diff(rp.remote_pagename, compress(textdiff(new_contents, verynewtext)), new_local_rev, remote_rev, current_remote_rev, local_full_iwid)
-            tags.add(remote_wiki=remote_full_iwid, remote_rev=very_current_remote_rev, current_rev=new_local_rev)
+            if rp.local_mime_type == MIMETYPE_MOIN:
+                new_contents_unicode = new_contents.decode("utf-8")
+                # here, the actual merge happens
+                # XXX print "Merging %r, %r and %r" % (old_contents.decode("utf-8"), new_contents, current_page.get_raw_body())
+                verynewtext = diff3.text_merge(old_contents.decode("utf-8"), new_contents_unicode, current_page.get_raw_body(), 2, *conflict_markers)
+                verynewtext_raw = verynewtext.encode("utf-8")
+            else:
+                if diff is None:
+                    verynewtext_raw = new_contents
+                else:
+                    verynewtext_raw = current_page.get_raw_body_str()
+
+            diff = textdiff(new_contents, verynewtext_raw)
+            #print "Diff against %r" % new_contents.encode("utf-8")
+
             comment = u"Local Merge - %r" % (remote.get_interwiki_name() or remote.get_iwid())
+
+            # XXX upgrade to write lock
             try:
-                current_page.saveText(verynewtext, current_rev, comment=comment)
+                current_page.saveText(verynewtext, current_rev, comment=comment) # YYY direct access
+            except PageEditor.Unchanged:
+                pass
             except PageEditor.EditConflict:
                 assert False, "You stumbled on a problem with the current storage system - I cannot lock pages"
-            # XXX untested
+
+            new_local_rev = current_page.get_real_rev()
+
+            if direction == BOTH:
+                try:
+                    very_current_remote_rev = remote.merge_diff(rp.remote_name, compress(diff), new_local_rev, current_remote_rev, current_remote_rev, local_full_iwid, rp.name)
+                except Exception, e:
+                    raise # XXX rollback locally and do not tag locally
+            else:
+                very_current_remote_rev = current_remote_rev
+
+            tags.add(remote_wiki=remote_full_iwid, remote_rev=very_current_remote_rev, current_rev=new_local_rev, direction=direction, normalised_name=rp.name)
+
+            if rp.local_mime_type != MIMETYPE_MOIN or not wikiutil.containsConflictMarker(verynewtext):
+                self.log_status(ActionClass.INFO, _("Page successfully merged."))
+            else:
+                self.log_status(ActionClass.WARN, _("Page merged with conflicts."))
+
+            # XXX release lock
+
 
 def execute(pagename, request):
     ActionClass(pagename, request).render()
--- a/MoinMoin/action/edit.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/action/edit.py	Fri Aug 18 11:43:50 2006 +0200
@@ -135,8 +135,6 @@
     # Save new text
     else:
         try:
-            still_conflict = wikiutil.containsConflictMarker(savetext)
-            pg.setConflict(still_conflict)
             savemsg = pg.saveText(savetext, rev, trivial=trivial, comment=comment)
         except pg.EditConflict, e:
             msg = e.message
--- a/MoinMoin/action/fckdialog.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/action/fckdialog.py	Fri Aug 18 11:43:50 2006 +0200
@@ -228,7 +228,7 @@
     interwiki_list = wikiutil.load_wikimap(request)
     interwiki = interwiki_list.keys()
     interwiki.sort()
-    iwpreferred = request.cfg.interwiki_preferred
+    iwpreferred = request.cfg.interwiki_preferred[:]
     if not iwpreferred or iwpreferred and iwpreferred[-1] is not None:
         resultlist = iwpreferred
         for iw in interwiki:
--- a/MoinMoin/action/newpage.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/action/newpage.py	Fri Aug 18 11:43:50 2006 +0200
@@ -29,7 +29,7 @@
         @return: error message
         """
         _ = self.request.getText
-        need_replace = self.nametemplate.find('%s') != -1
+        need_replace = '%s' in self.nametemplate
         if not self.pagename and need_replace:
             return _("Cannot create a new page without a page name."
                      "  Please specify a page name.")
@@ -38,7 +38,7 @@
         # template variable
             repl = 'A@'
             i = 0
-            while self.nametemplate.find(repl) != -1:
+            while repl in self.nametemplate:
                 repl += ['#', '&', '$', 'x', 'X', ':', '@'][i]
                 i += 1
                 i = i % 7
--- a/MoinMoin/action/rss_rc.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/action/rss_rc.py	Fri Aug 18 11:43:50 2006 +0200
@@ -54,7 +54,7 @@
     for line in log.reverse():
         if not request.user.may.read(line.pagename):
             continue
-        if ((line.action[:4] != 'SAVE') or
+        if (not line.action.startswith('SAVE') or
             ((line.pagename in pages) and unique)): continue
         #if log.dayChanged() and log.daycount > _MAX_DAYS: break
         line.editor = line.getInterwikiEditorData(request)
--- a/MoinMoin/caching.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/caching.py	Fri Aug 18 11:43:50 2006 +0200
@@ -7,12 +7,14 @@
 """
 
 import os
-from MoinMoin import config
-from MoinMoin.util import filesys
+import warnings
 
-locking = 1
-if locking:
-    from MoinMoin.util import lock
+from MoinMoin import config
+from MoinMoin.util import filesys, lock
+
+# filter the tempname warning because we create the tempfile only in directories
+# where only we should have write access initially
+warnings.filterwarnings("ignore", "tempnam.*security", RuntimeWarning, "MoinMoin.caching")
 
 class CacheEntry:
     def __init__(self, request, arena, key, scope='page_or_wiki', do_locking=True):
@@ -28,6 +30,8 @@
                           'farm' - a cache for the whole farm
         """
         self.request = request
+        self.key = key
+        self.locking = do_locking
         if scope == 'page_or_wiki': # XXX DEPRECATED, remove later
             if isinstance(arena, str):
                 self.arena_dir = os.path.join(request.cfg.cache_dir, request.cfg.siteid, arena)
@@ -43,16 +47,17 @@
         elif scope == 'farm':
             self.arena_dir = os.path.join(request.cfg.cache_dir, '__common__', arena)
             filesys.makeDirs(self.arena_dir)
-        self.key = key
-        self.locking = do_locking and locking
         if self.locking:
             self.lock_dir = os.path.join(self.arena_dir, '__lock__')
-            self.rlock = lock.ReadLock(self.lock_dir, 60.0)
-            self.wlock = lock.WriteLock(self.lock_dir, 60.0)
+            self.rlock = lock.LazyReadLock(self.lock_dir, 60.0)
+            self.wlock = lock.LazyWriteLock(self.lock_dir, 60.0)
 
     def _filename(self):
         return os.path.join(self.arena_dir, self.key)
 
+    def _tmpfilename(self):
+        return os.tempnam(self.arena_dir, self.key)
+
     def exists(self):
         return os.path.exists(self._filename())
 
@@ -85,10 +90,15 @@
         return needsupdate
 
     def copyto(self, filename):
+        # currently unused function
         import shutil
+        tmpfname = self._tmpfilename()
+        fname = self._filename()
         if not self.locking or self.locking and self.wlock.acquire(1.0):
             try:
-                shutil.copyfile(filename, self._filename())
+                shutil.copyfile(filename, tmpfname)
+                # this is either atomic or happening with real locks set:
+                filesys.rename(tmpfname, fname)
                 try:
                     os.chmod(self._filename(), 0666 & config.umask)
                 except OSError:
@@ -100,15 +110,22 @@
             self.request.log("Can't acquire write lock in %s" % self.lock_dir)
 
     def update(self, content, encode=False):
+        tmpfname = self._tmpfilename()
+        fname = self._filename()
         if encode:
             content = content.encode(config.charset)
         if not self.locking or self.locking and self.wlock.acquire(1.0):
             try:
-                f = open(self._filename(), 'wb')
+                # we do not write content to old inode, but to a new file
+                # se we don't need to lock when we just want to read the file
+                # (at least on POSIX, this works)
+                f = open(tmpfname, 'wb')
                 f.write(content)
                 f.close()
+                # this is either atomic or happening with real locks set:
+                filesys.rename(tmpfname, fname)
                 try:
-                    os.chmod(self._filename(), 0666 & config.umask)
+                    os.chmod(fname, 0666 & config.umask)
                 except OSError:
                     pass
             finally:
@@ -118,10 +135,17 @@
             self.request.log("Can't acquire write lock in %s" % self.lock_dir)
 
     def remove(self):
-        try:
-            os.remove(self._filename())
-        except OSError:
-            pass
+        if not self.locking or self.locking and self.wlock.acquire(1.0):
+            try:
+                try:
+                    os.remove(self._filename())
+                except OSError:
+                    pass
+            finally:
+                if self.locking:
+                    self.wlock.release()
+        else:
+            self.request.log("Can't acquire write lock in %s" % self.lock_dir)
 
     def content(self, decode=False):
         if not self.locking or self.locking and self.rlock.acquire(1.0):
--- a/MoinMoin/config/multiconfig.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/config/multiconfig.py	Fri Aug 18 11:43:50 2006 +0200
@@ -15,6 +15,7 @@
 from MoinMoin import error, util, wikiutil
 import MoinMoin.auth as authmodule
 from MoinMoin.packages import packLine
+from MoinMoin.security import AccessControlList
 
 _url_re_cache = None
 _farmconfig_mtime = None
@@ -557,6 +558,10 @@
         # Cache variables for the properties below
         self._iwid = self._iwid_full = self._meta_dict = None
 
+        self._acl_rights_before = AccessControlList(self, [self.acl_rights_before])
+        self._acl_rights_default = AccessControlList(self, [self.acl_rights_default])
+        self._acl_rights_after = AccessControlList(self, [self.acl_rights_after])
+
     def load_meta_dict(self):
         """ The meta_dict contains meta data about the wiki instance. """
         if getattr(self, "_meta_dict", None) is None:
--- a/MoinMoin/filter/EXIF.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/filter/EXIF.py	Fri Aug 18 11:43:50 2006 +0200
@@ -1004,7 +1004,7 @@
             return
 
         # Olympus
-        if make[:7] == 'OLYMPUS':
+        if make.startswith('OLYMPUS'):
             self.dump_IFD(note.field_offset+8, 'MakerNote',
                           dict=MAKERNOTE_OLYMPUS_TAGS)
             return
--- a/MoinMoin/formatter/__init__.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/formatter/__init__.py	Fri Aug 18 11:43:50 2006 +0200
@@ -7,12 +7,13 @@
     @copyright: 2000-2004 by Jrgen Hermann <jh@web.de>
     @license: GNU GPL, see COPYING for details.
 """
+import re
+
 from MoinMoin.util import pysupport
+from MoinMoin import wikiutil
 
 modules = pysupport.getPackageModules(__file__)
 
-from MoinMoin import wikiutil
-import re, types
 
 class FormatterBase:
     """ This defines the output interface used all over the rest of the code.
@@ -37,7 +38,7 @@
         self._base_depth = 0
 
     def set_highlight_re(self, hi_re=None):
-        if type(hi_re) in [types.StringType, types.UnicodeType]:
+        if isinstance(hi_re, (str, unicode)):
             try:
                 self._highlight_re = re.compile(hi_re, re.U + re.IGNORECASE)
             except re.error:
@@ -96,7 +97,7 @@
         """
         wikitag, wikiurl, wikitail, wikitag_bad = wikiutil.resolve_wiki(self.request, '%s:"%s"' % (interwiki, pagename))
         if wikitag == 'Self' or wikitag == self.request.cfg.interwikiname:
-            if wikitail.find('#') > -1:
+            if '#' in wikitail:
                 wikitail, kw['anchor'] = wikitail.split('#', 1)
                 wikitail = wikiutil.url_unquote(wikitail)
             return self.pagelink(on, wikitail, **kw)
@@ -295,7 +296,7 @@
         return macro_obj.execute(name, args)
 
     def _get_bang_args(self, line):
-        if line[:2] == '#!':
+        if line.startswith('#!'):
             try:
                 name, args = line[2:].split(None, 1)
             except ValueError:
--- a/MoinMoin/formatter/dom_xml.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/formatter/dom_xml.py	Fri Aug 18 11:43:50 2006 +0200
@@ -191,7 +191,7 @@
         return self._set_tag('lang', on, value=lang_name)
 
     def pagelink(self, on, pagename='', page=None, **kw):
-        apply(FormatterBase.pagelink, (self, pagename, page), kw)
+        FormatterBase.pagelink(self, pagename, page, **kw)
         if not pagename and page is not None:
             pagename = page.page_name
         kw['pagename'] = pagename
--- a/MoinMoin/formatter/text_gedit.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/formatter/text_gedit.py	Fri Aug 18 11:43:50 2006 +0200
@@ -40,7 +40,7 @@
 
             See wikiutil.link_tag() for possible keyword parameters.
         """
-        apply(FormatterBase.pagelink, (self, on, pagename, page), kw)
+        FormatterBase.pagelink(self, on, pagename, page, **kw)
         if page is None:
             page = Page(self.request, pagename, formatter=self)
         return page.link_to(self.request, on=on, **kw)
--- a/MoinMoin/formatter/text_html.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/formatter/text_html.py	Fri Aug 18 11:43:50 2006 +0200
@@ -178,7 +178,7 @@
     indentspace = ' '
 
     def __init__(self, request, **kw):
-        apply(FormatterBase.__init__, (self, request), kw)
+        FormatterBase.__init__(self, request, **kw)
 
         # inline tags stack. When an inline tag is called, it goes into
         # the stack. When a block element starts, all inline tags in
@@ -489,7 +489,7 @@
 
             See wikiutil.link_tag() for possible keyword parameters.
         """
-        apply(FormatterBase.pagelink, (self, on, pagename, page), kw)
+        FormatterBase.pagelink(self, on, pagename, page, **kw)
         if page is None:
             page = Page(self.request, pagename, formatter=self)
         if self.request.user.show_nonexist_qm and on and not page.exists():
@@ -511,13 +511,13 @@
         wikiurl = wikiutil.mapURL(self.request, wikiurl)
         if wikitag == 'Self': # for own wiki, do simple links
             if on:
-                if wikitail.find('#') > -1:
+                if '#' in wikitail:
                     wikitail, kw['anchor'] = wikitail.split('#', 1)
                 wikitail = wikiutil.url_unquote(wikitail)
                 try: # XXX this is the only place where we access self.page - do we need it? Crashes silently on actions!
-                    return apply(self.pagelink, (on, wikiutil.AbsPageName(self.request, self.page.page_name, wikitail)), kw)
+                    return self.pagelink(on, wikiutil.AbsPageName(self.request, self.page.page_name, wikitail), **kw)
                 except:
-                    return apply(self.pagelink, (on, wikitail), kw)
+                    return self.pagelink(on, wikitail, **kw)
             else:
                 return self.pagelink(0)
         else: # return InterWiki hyperlink
--- a/MoinMoin/formatter/text_plain.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/formatter/text_plain.py	Fri Aug 18 11:43:50 2006 +0200
@@ -16,7 +16,7 @@
     hardspace = u' '
 
     def __init__(self, request, **kw):
-        apply(FormatterBase.__init__, (self, request), kw)
+        FormatterBase.__init__(self, request, **kw)
         self._in_code_area = 0
         self._in_code_line = 0
         self._code_area_state = [0, -1, -1, 0]
@@ -36,7 +36,7 @@
         return (u'\n\n*** ', u' ***\n\n')[not on]
 
     def pagelink(self, on, pagename='', page=None, **kw):
-        apply(FormatterBase.pagelink, (self, on, pagename, page), kw)
+        FormatterBase.pagelink(self, on, pagename, page, **kw)
         return (u">>", u"<<") [not on]
 
     def interwikilink(self, on, interwiki='', pagename='', **kw):
--- a/MoinMoin/formatter/text_xml.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/formatter/text_xml.py	Fri Aug 18 11:43:50 2006 +0200
@@ -19,7 +19,7 @@
     hardspace = '&nbsp;'
 
     def __init__(self, request, **kw):
-        apply(FormatterBase.__init__, (self, request), kw)
+        FormatterBase.__init__(self, request, **kw)
         self._current_depth = 1
         self._base_depth = 0
         self.in_pre = 0
@@ -49,7 +49,7 @@
         return '<![CDATA[' + markup.replace(']]>', ']]>]]&gt;<![CDATA[') + ']]>'
 
     def pagelink(self, on, pagename='', page=None, **kw):
-        apply(FormatterBase.pagelink, (self, on, pagename, page), kw)
+        FormatterBase.pagelink(self, on, pagename, page, **kw)
         if page is None:
             page = Page(self.request, pagename, formatter=self)
         return page.link_to(self.request, on=on, **kw)
@@ -202,7 +202,7 @@
         for key, value in kw.items():
             if key in valid_attrs:
                 attrs[key] = value
-        return apply(FormatterBase.image, (self,), attrs) + '</img>'
+        return FormatterBase.image(self, **attrs) + '</img>'
 
     def code_area(self, on, code_id, code_type='code', show=0, start=-1, step=-1):
         return ('<codearea id="%s">' % code_id, '</codearea')[not on]
--- a/MoinMoin/i18n/MoinMoin.pot	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/i18n/MoinMoin.pot	Fri Aug 18 11:43:50 2006 +0200
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-07-17 12:27+0200\n"
+"POT-Creation-Date: 2006-08-15 20:45+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,37 +17,150 @@
 "Content-Transfer-Encoding: 8bit\n"
 
 msgid ""
-"The backed up content of this page is deprecated and will not be included in "
-"search results!"
+"This wiki is not enabled for mail processing.\n"
+"Contact the owner of the wiki, who can enable email."
+msgstr ""
+
+msgid "Please provide a valid email address!"
 msgstr ""
 
 #, python-format
-msgid "Revision %(rev)d as of %(date)s"
+msgid "Found no account matching the given email address '%(email)s'!"
 msgstr ""
 
-#, python-format
-msgid "Redirected from page \"%(page)s\""
+msgid "Use UserPreferences to change your settings or create an account."
 msgstr ""
 
-#, python-format
-msgid "This page redirects to page \"%(page)s\""
+msgid "Empty user name. Please enter a user name."
 msgstr ""
 
 #, python-format
 msgid ""
-"~-If you submit this form, the submitted values will be displayed.\n"
-"To use this form on other pages, insert a\n"
-"[[BR]][[BR]]'''{{{    [[Form(\"%(pagename)s\")]]}}}'''[[BR]][[BR]]\n"
-"macro call.-~\n"
+"Invalid user name {{{'%s'}}}.\n"
+"Name may contain any Unicode alpha numeric character, with optional one\n"
+"space between words. Group page name is not allowed."
+msgstr ""
+
+msgid "This user name already belongs to somebody else."
+msgstr ""
+
+msgid "Passwords don't match!"
+msgstr ""
+
+msgid "Please specify a password!"
+msgstr ""
+
+msgid ""
+"Please provide your email address. If you lose your login information, you "
+"can get it by email."
+msgstr ""
+
+msgid "This email already belongs to somebody else."
+msgstr ""
+
+msgid "User account created! You can use this account to login now..."
+msgstr ""
+
+msgid "Use UserPreferences to change settings of the selected user account"
+msgstr ""
+
+#, python-format
+msgid "The theme '%(theme_name)s' could not be loaded!"
+msgstr ""
+
+msgid "User preferences saved!"
+msgstr ""
+
+msgid "Default"
+msgstr ""
+
+msgid "<Browser setting>"
+msgstr ""
+
+msgid "the one preferred"
+msgstr ""
+
+msgid "free choice"
+msgstr ""
+
+msgid "Select User"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
+msgid "Preferred theme"
+msgstr ""
+
+msgid "Editor Preference"
 msgstr ""
 
-msgid "Create New Page"
+msgid "Editor shown on UI"
+msgstr ""
+
+msgid "Time zone"
+msgstr ""
+
+msgid "Your time is"
+msgstr ""
+
+msgid "Server time is"
+msgstr ""
+
+msgid "Date format"
+msgstr ""
+
+msgid "Preferred language"
+msgstr ""
+
+msgid "General options"
+msgstr ""
+
+msgid "Quick links"
+msgstr ""
+
+msgid "This list does not work, unless you have entered a valid email address!"
+msgstr ""
+
+msgid "Subscribed wiki pages (one regex per line)"
 msgstr ""
 
-msgid "You are not allowed to view this page."
+msgid "Create Profile"
+msgstr ""
+
+msgid "Mail me my account data"
+msgstr ""
+
+msgid "Email"
+msgstr ""
+
+#, python-format
+msgid ""
+"To create an account or recover a lost password, see the %(userprefslink)s "
+"page."
 msgstr ""
 
-msgid "Your changes are not saved!"
+msgid "Name"
+msgstr ""
+
+msgid "Password"
+msgstr ""
+
+msgid "Login"
+msgstr ""
+
+msgid "Action"
+msgstr ""
+
+#, python-format
+msgid "Expected \"=\" to follow \"%(token)s\""
+msgstr ""
+
+#, python-format
+msgid "Expected a value for key \"%(token)s\""
 msgstr ""
 
 msgid "You are not allowed to edit this page."
@@ -62,9 +175,6 @@
 msgid "The lock you held timed out. Be prepared for editing conflicts!"
 msgstr ""
 
-msgid "Page name is too long, try shorter name."
-msgstr ""
-
 #, python-format
 msgid "Edit \"%(pagename)s\""
 msgstr ""
@@ -118,9 +228,6 @@
 msgid "Save Changes"
 msgstr ""
 
-msgid "Cancel"
-msgstr ""
-
 #, python-format
 msgid ""
 "By hitting '''%(save_button_text)s''' you put your changes under the %"
@@ -132,7 +239,7 @@
 msgid "Preview"
 msgstr ""
 
-msgid "GUI Mode"
+msgid "Text mode"
 msgstr ""
 
 msgid "Comment:"
@@ -151,6 +258,62 @@
 msgid "Remove trailing whitespace from each line"
 msgstr ""
 
+msgid ""
+"The remote version of MoinMoin is too old, the version 1.6 is required at "
+"least."
+msgstr ""
+
+#, python-format
+msgid ""
+"The remote wiki uses a different InterWiki name (%(remotename)s) internally "
+"than you specified (%(localname)s)."
+msgstr ""
+
+#, python-format
+msgid "The package needs a newer version of MoinMoin (at least %s)."
+msgstr ""
+
+msgid "The theme name is not set."
+msgstr ""
+
+msgid "Installing theme files is only supported for standalone type servers."
+msgstr ""
+
+#, python-format
+msgid "Installation of '%(filename)s' failed."
+msgstr ""
+
+#, python-format
+msgid "The file %s is not a MoinMoin package file."
+msgstr ""
+
+#, python-format
+msgid "The page %s does not exist."
+msgstr ""
+
+msgid "Invalid package file header."
+msgstr ""
+
+msgid "Package file format unsupported."
+msgstr ""
+
+#, python-format
+msgid "Unknown function %(func)s in line %(lineno)i."
+msgstr ""
+
+#, python-format
+msgid "The file %s was not found in the package."
+msgstr ""
+
+msgid "Your changes are not saved!"
+msgstr ""
+
+msgid "Page name is too long, try shorter name."
+msgstr ""
+
+msgid "GUI Mode"
+msgstr ""
+
 msgid "Edit was cancelled."
 msgstr ""
 
@@ -287,9 +450,6 @@
 msgid "<unknown>"
 msgstr ""
 
-msgid "Text mode"
-msgstr ""
-
 #, python-format
 msgid ""
 "Login Name: %s\n"
@@ -315,6 +475,665 @@
 msgstr ""
 
 msgid ""
+"The backed up content of this page is deprecated and will not be included in "
+"search results!"
+msgstr ""
+
+#, python-format
+msgid "Revision %(rev)d as of %(date)s"
+msgstr ""
+
+#, python-format
+msgid "Redirected from page \"%(page)s\""
+msgstr ""
+
+#, python-format
+msgid "This page redirects to page \"%(page)s\""
+msgstr ""
+
+#, python-format
+msgid ""
+"~-If you submit this form, the submitted values will be displayed.\n"
+"To use this form on other pages, insert a\n"
+"[[BR]][[BR]]'''{{{    [[Form(\"%(pagename)s\")]]}}}'''[[BR]][[BR]]\n"
+"macro call.-~\n"
+msgstr ""
+
+msgid "Create New Page"
+msgstr ""
+
+msgid "You are not allowed to view this page."
+msgstr ""
+
+#, python-format
+msgid ""
+"Results %(bs)s%(hitsFrom)d - %(hitsTo)d%(be)s of %(aboutHits)s %(bs)s%(hits)d"
+"%(be)s results out ofabout %(pages)d pages."
+msgstr ""
+
+msgid "seconds"
+msgstr ""
+
+msgid "Previous"
+msgstr ""
+
+msgid "Next"
+msgstr ""
+
+msgid "current"
+msgstr ""
+
+msgid "match"
+msgstr ""
+
+msgid "matches"
+msgstr ""
+
+msgid "Go To Page"
+msgstr ""
+
+msgid "Include system pages"
+msgstr ""
+
+msgid "Exclude system pages"
+msgstr ""
+
+#, python-format
+msgid "Please use a more selective search term instead of {{{\"%s\"}}}"
+msgstr ""
+
+#, python-format
+msgid "ERROR in regex '%s'"
+msgstr ""
+
+#, python-format
+msgid "Bad timestamp '%s'"
+msgstr ""
+
+#, python-format
+msgid "Unsupported navigation scheme '%(scheme)s'!"
+msgstr ""
+
+msgid "No parent page found!"
+msgstr ""
+
+msgid "Wiki"
+msgstr ""
+
+msgid "Edit"
+msgstr ""
+
+msgid "Slideshow"
+msgstr ""
+
+msgid "Start"
+msgstr ""
+
+#, python-format
+msgid "Slide %(pos)d of %(size)d"
+msgstr ""
+
+msgid "Search Titles"
+msgstr ""
+
+msgid "Display context of search results"
+msgstr ""
+
+msgid "Case-sensitive searching"
+msgstr ""
+
+msgid "Search Text"
+msgstr ""
+
+#, python-format
+msgid "Upload new attachment \"%(filename)s\""
+msgstr ""
+
+#, python-format
+msgid "Invalid MonthCalendar calparms \"%s\"!"
+msgstr ""
+
+#, python-format
+msgid "Invalid MonthCalendar arguments \"%s\"!"
+msgstr ""
+
+msgid "No orphaned pages in this wiki."
+msgstr ""
+
+msgid "Python Version"
+msgstr ""
+
+msgid "MoinMoin Version"
+msgstr ""
+
+#, python-format
+msgid "Release %s [Revision %s]"
+msgstr ""
+
+msgid "4Suite Version"
+msgstr ""
+
+msgid "Number of pages"
+msgstr ""
+
+msgid "Number of system pages"
+msgstr ""
+
+msgid "Accumulated page sizes"
+msgstr ""
+
+#, python-format
+msgid "Disk usage of %(data_dir)s/pages/"
+msgstr ""
+
+#, python-format
+msgid "Disk usage of %(data_dir)s/"
+msgstr ""
+
+msgid "Entries in edit log"
+msgstr ""
+
+msgid "NONE"
+msgstr ""
+
+msgid "Global extension macros"
+msgstr ""
+
+msgid "Local extension macros"
+msgstr ""
+
+msgid "Global extension actions"
+msgstr ""
+
+msgid "Local extension actions"
+msgstr ""
+
+msgid "Global parsers"
+msgstr ""
+
+msgid "Local extension parsers"
+msgstr ""
+
+msgid "Disabled"
+msgstr ""
+
+msgid "Enabled"
+msgstr ""
+
+msgid "index available"
+msgstr ""
+
+msgid "index unavailable"
+msgstr ""
+
+#, python-format
+msgid "last modified: %s"
+msgstr ""
+
+msgid "N/A"
+msgstr ""
+
+msgid "Xapian search"
+msgstr ""
+
+msgid "Xapian stemming"
+msgstr ""
+
+msgid "Active threads"
+msgstr ""
+
+#, python-format
+msgid "No quotes on %(pagename)s."
+msgstr ""
+
+#, python-format
+msgid "Upload of attachment '%(filename)s'."
+msgstr ""
+
+#, python-format
+msgid "Attachment '%(filename)s' deleted."
+msgstr ""
+
+#, python-format
+msgid "Drawing '%(filename)s' saved."
+msgstr ""
+
+#, python-format
+msgid "Revert to revision %(rev)d."
+msgstr ""
+
+#, python-format
+msgid "%(mins)dm ago"
+msgstr ""
+
+msgid "(no bookmark set)"
+msgstr ""
+
+#, python-format
+msgid "(currently set to %s)"
+msgstr ""
+
+msgid "Delete Bookmark"
+msgstr ""
+
+msgid "Set bookmark"
+msgstr ""
+
+msgid "set bookmark"
+msgstr ""
+
+msgid "[Bookmark reached]"
+msgstr ""
+
+#, python-format
+msgid "Invalid include arguments \"%s\"!"
+msgstr ""
+
+#, python-format
+msgid "Nothing found for \"%s\"!"
+msgstr ""
+
+msgid "edit"
+msgstr ""
+
+msgid "Contents"
+msgstr ""
+
+msgid "You need to provide a chart type!"
+msgstr ""
+
+#, python-format
+msgid "Bad chart type \"%s\"!"
+msgstr ""
+
+msgid "Markup"
+msgstr ""
+
+msgid "Display"
+msgstr ""
+
+msgid "No wanted pages in this wiki."
+msgstr ""
+
+#, python-format
+msgid "Connection to mailserver '%(server)s' failed: %(reason)s"
+msgstr ""
+
+msgid "Mail not sent"
+msgstr ""
+
+msgid "Mail sent OK"
+msgstr ""
+
+msgid "XSLT option disabled, please look at HelpOnConfiguration."
+msgstr ""
+
+msgid "XSLT processing is not available, please install 4suite 1.x."
+msgstr ""
+
+#, python-format
+msgid "%(errortype)s processing error"
+msgstr ""
+
+#, python-format
+msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
+msgstr ""
+
+#, python-format
+msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
+msgstr ""
+
+#, python-format
+msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+#, python-format
+msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+msgid ""
+"Rendering of reStructured text is not possible, please install Docutils."
+msgstr ""
+
+msgid "**Maximum number of allowed includes exceeded**"
+msgstr ""
+
+#, python-format
+msgid "**Could not find the referenced page: %s**"
+msgstr ""
+
+#, python-format
+msgid "Create new drawing \"%(filename)s\""
+msgstr ""
+
+#, python-format
+msgid "Edit drawing %(filename)s"
+msgstr ""
+
+msgid "Toggle line numbers"
+msgstr ""
+
+msgid "Line"
+msgstr ""
+
+msgid "No differences found!"
+msgstr ""
+
+msgid "Deletions are marked like this."
+msgstr ""
+
+msgid "Additions are marked like this."
+msgstr ""
+
+#, python-format
+msgid ""
+"Sorry, can not save page because \"%(content)s\" is not allowed in this wiki."
+msgstr ""
+
+msgid "Page"
+msgstr ""
+
+msgid "User"
+msgstr ""
+
+msgid "Diffs"
+msgstr ""
+
+msgid "Info"
+msgstr ""
+
+msgid "Unsubscribe"
+msgstr ""
+
+msgid "Subscribe"
+msgstr ""
+
+msgid "Raw"
+msgstr ""
+
+msgid "XML"
+msgstr ""
+
+msgid "Print"
+msgstr ""
+
+msgid "View"
+msgstr ""
+
+msgid "Home"
+msgstr ""
+
+msgid "Up"
+msgstr ""
+
+msgid "[RSS]"
+msgstr ""
+
+msgid "[DELETED]"
+msgstr ""
+
+msgid "[UPDATED]"
+msgstr ""
+
+msgid "[NEW]"
+msgstr ""
+
+msgid "[DIFF]"
+msgstr ""
+
+msgid "[BOTTOM]"
+msgstr ""
+
+msgid "[TOP]"
+msgstr ""
+
+msgid "Click to do a full-text search for this title"
+msgstr ""
+
+msgid "Preferences"
+msgstr ""
+
+msgid "Logout"
+msgstr ""
+
+msgid "Clear message"
+msgstr ""
+
+#, python-format
+msgid "last edited %(time)s by %(editor)s"
+msgstr ""
+
+#, python-format
+msgid "last modified %(time)s"
+msgstr ""
+
+msgid "Search:"
+msgstr ""
+
+msgid "Text"
+msgstr ""
+
+msgid "Titles"
+msgstr ""
+
+msgid "Search"
+msgstr ""
+
+msgid "More Actions:"
+msgstr ""
+
+msgid "------------"
+msgstr ""
+
+msgid "Raw Text"
+msgstr ""
+
+msgid "Print View"
+msgstr ""
+
+msgid "Delete Cache"
+msgstr ""
+
+msgid "Rename Page"
+msgstr ""
+
+msgid "Delete Page"
+msgstr ""
+
+msgid "Like Pages"
+msgstr ""
+
+msgid "Local Site Map"
+msgstr ""
+
+msgid "My Pages"
+msgstr ""
+
+msgid "Subscribe User"
+msgstr ""
+
+msgid "Remove Spam"
+msgstr ""
+
+msgid "Package Pages"
+msgstr ""
+
+msgid "Render as Docbook"
+msgstr ""
+
+msgid "Do"
+msgstr ""
+
+msgid "Edit (Text)"
+msgstr ""
+
+msgid "Edit (GUI)"
+msgstr ""
+
+msgid "Immutable Page"
+msgstr ""
+
+msgid "Remove Link"
+msgstr ""
+
+msgid "Add Link"
+msgstr ""
+
+msgid "Attachments"
+msgstr ""
+
+#, python-format
+msgid "Show %s days."
+msgstr ""
+
+msgid "Wiki Markup"
+msgstr ""
+
+msgid "DeleteCache"
+msgstr ""
+
+#, python-format
+msgid "(cached %s)"
+msgstr ""
+
+msgid "Or try one of these actions:"
+msgstr ""
+
+msgid "FrontPage"
+msgstr ""
+
+msgid "RecentChanges"
+msgstr ""
+
+msgid "TitleIndex"
+msgstr ""
+
+msgid "WordIndex"
+msgstr ""
+
+msgid "FindPage"
+msgstr ""
+
+msgid "SiteNavigation"
+msgstr ""
+
+msgid "HelpContents"
+msgstr ""
+
+msgid "HelpOnFormatting"
+msgstr ""
+
+msgid "UserPreferences"
+msgstr ""
+
+msgid "WikiLicense"
+msgstr ""
+
+msgid "MissingPage"
+msgstr ""
+
+msgid "MissingHomePage"
+msgstr ""
+
+msgid "Mon"
+msgstr ""
+
+msgid "Tue"
+msgstr ""
+
+msgid "Wed"
+msgstr ""
+
+msgid "Thu"
+msgstr ""
+
+msgid "Fri"
+msgstr ""
+
+msgid "Sat"
+msgstr ""
+
+msgid "Sun"
+msgstr ""
+
+msgid "AttachFile"
+msgstr ""
+
+msgid "DeletePage"
+msgstr ""
+
+msgid "LikePages"
+msgstr ""
+
+msgid "LocalSiteMap"
+msgstr ""
+
+msgid "RenamePage"
+msgstr ""
+
+msgid "SpellCheck"
+msgstr ""
+
+#, python-format
+msgid "Unknown action %(action_name)s."
+msgstr ""
+
+#, python-format
+msgid "You are not allowed to do %(action_name)s on this page."
+msgstr ""
+
+msgid "Login and try again."
+msgstr ""
+
+msgid "Charts are not available!"
+msgstr ""
+
+msgid "Page Size Distribution"
+msgstr ""
+
+msgid "page size upper bound [bytes]"
+msgstr ""
+
+msgid "# of pages of this size"
+msgstr ""
+
+msgid "User agent"
+msgstr ""
+
+msgid "Others"
+msgstr ""
+
+msgid "Distribution of User-Agent Types"
+msgstr ""
+
+msgid "Date"
+msgstr ""
+
+msgid "Views/day"
+msgstr ""
+
+msgid "Edits/day"
+msgstr ""
+
+msgid "Page hits and edits"
+msgstr ""
+
+#, python-format
+msgid "%(chart_title)s for %(filterpage)s"
+msgstr ""
+
+msgid ""
+"green=view\n"
+"red=edit"
+msgstr ""
+
+msgid "date"
+msgstr ""
+
+msgid "# of hits"
+msgstr ""
+
+msgid ""
 " Emphasis:: [[Verbatim('')]]''italics''[[Verbatim('')]]; [[Verbatim"
 "(''')]]'''bold'''[[Verbatim(''')]]; [[Verbatim(''''')]]'''''bold "
 "italics'''''[[Verbatim(''''')]]; [[Verbatim('')]]''mixed ''[[Verbatim"
@@ -354,36 +1173,9 @@
 "</a>.\n"
 msgstr ""
 
-msgid "Diffs"
-msgstr ""
-
-msgid "Info"
-msgstr ""
-
-msgid "Edit"
-msgstr ""
-
 msgid "UnSubscribe"
 msgstr ""
 
-msgid "Subscribe"
-msgstr ""
-
-msgid "Raw"
-msgstr ""
-
-msgid "XML"
-msgstr ""
-
-msgid "Print"
-msgstr ""
-
-msgid "View"
-msgstr ""
-
-msgid "Up"
-msgstr ""
-
 msgid "Publish my email (not my wiki homepage) in author info"
 msgstr ""
 
@@ -420,27 +1212,18 @@
 msgid "Disable this account forever"
 msgstr ""
 
-msgid "Name"
-msgstr ""
-
 msgid "(Use Firstname''''''Lastname)"
 msgstr ""
 
 msgid "Alias-Name"
 msgstr ""
 
-msgid "Password"
-msgstr ""
-
 msgid "Password repeat"
 msgstr ""
 
 msgid "(Only for password change or new account)"
 msgstr ""
 
-msgid "Email"
-msgstr ""
-
 msgid "User CSS URL"
 msgstr ""
 
@@ -450,175 +1233,42 @@
 msgid "Editor size"
 msgstr ""
 
-#, python-format
-msgid "The package needs a newer version of MoinMoin (at least %s)."
-msgstr ""
-
-msgid "The theme name is not set."
-msgstr ""
-
-msgid "Installing theme files is only supported for standalone type servers."
-msgstr ""
-
-#, python-format
-msgid "Installation of '%(filename)s' failed."
-msgstr ""
-
-#, python-format
-msgid "The file %s is not a MoinMoin package file."
-msgstr ""
-
-#, python-format
-msgid "The page %s does not exist."
-msgstr ""
-
-msgid "Invalid package file header."
-msgstr ""
-
-msgid "Package file format unsupported."
-msgstr ""
-
-#, python-format
-msgid "Unknown function %(func)s in line %(lineno)i."
+msgid "Do it."
 msgstr ""
 
 #, python-format
-msgid "The file %s was not found in the package."
-msgstr ""
-
-msgid ""
-"This wiki is not enabled for mail processing.\n"
-"Contact the owner of the wiki, who can enable email."
-msgstr ""
-
-msgid "Please provide a valid email address!"
-msgstr ""
-
-#, python-format
-msgid "Found no account matching the given email address '%(email)s'!"
-msgstr ""
-
-msgid "Use UserPreferences to change your settings or create an account."
-msgstr ""
-
-msgid "Empty user name. Please enter a user name."
+msgid "Execute action %(actionname)s?"
 msgstr ""
 
 #, python-format
-msgid ""
-"Invalid user name {{{'%s'}}}.\n"
-"Name may contain any Unicode alpha numeric character, with optional one\n"
-"space between words. Group page name is not allowed."
-msgstr ""
-
-msgid "This user name already belongs to somebody else."
-msgstr ""
-
-msgid "Passwords don't match!"
+msgid "Action %(actionname)s is excluded in this wiki!"
 msgstr ""
 
-msgid "Please specify a password!"
-msgstr ""
-
-msgid ""
-"Please provide your email address. If you lose your login information, you "
-"can get it by email."
-msgstr ""
-
-msgid "This email already belongs to somebody else."
-msgstr ""
-
-msgid "User account created! You can use this account to login now..."
-msgstr ""
-
-msgid "Use UserPreferences to change settings of the selected user account"
+#, python-format
+msgid "You are not allowed to use action %(actionname)s on this page!"
 msgstr ""
 
 #, python-format
-msgid "The theme '%(theme_name)s' could not be loaded!"
-msgstr ""
-
-msgid "User preferences saved!"
-msgstr ""
-
-msgid "Default"
-msgstr ""
-
-msgid "<Browser setting>"
-msgstr ""
-
-msgid "the one preferred"
-msgstr ""
-
-msgid "free choice"
-msgstr ""
-
-msgid "Select User"
-msgstr ""
-
-msgid "Save"
-msgstr ""
-
-msgid "Preferred theme"
-msgstr ""
-
-msgid "Editor Preference"
+msgid "Please use the interactive user interface to use action %(actionname)s!"
 msgstr ""
 
-msgid "Editor shown on UI"
-msgstr ""
-
-msgid "Time zone"
-msgstr ""
-
-msgid "Your time is"
-msgstr ""
-
-msgid "Server time is"
-msgstr ""
-
-msgid "Date format"
+msgid "You must login to add a quicklink."
 msgstr ""
 
-msgid "Preferred language"
-msgstr ""
-
-msgid "General options"
-msgstr ""
-
-msgid "Quick links"
+msgid "Your quicklink to this page has been removed."
 msgstr ""
 
-msgid "This list does not work, unless you have entered a valid email address!"
-msgstr ""
-
-msgid "Subscribed wiki pages (one regex per line)"
-msgstr ""
-
-msgid "Create Profile"
-msgstr ""
-
-msgid "Mail me my account data"
+msgid "A quicklink to this page has been added for you."
 msgstr ""
 
 #, python-format
-msgid ""
-"To create an account or recover a lost password, see the %(userprefslink)s "
-"page."
-msgstr ""
-
-msgid "Login"
+msgid "Unknown user name: {{{\"%s\"}}}. Please enter user name and password."
 msgstr ""
 
-msgid "Action"
+msgid "Missing password. Please enter user name and password."
 msgstr ""
 
-#, python-format
-msgid "Expected \"=\" to follow \"%(token)s\""
-msgstr ""
-
-#, python-format
-msgid "Expected a value for key \"%(token)s\""
+msgid "Sorry, login failed."
 msgstr ""
 
 #, python-format
@@ -651,9 +1301,6 @@
 msgid "get"
 msgstr ""
 
-msgid "edit"
-msgstr ""
-
 msgid "view"
 msgstr ""
 
@@ -740,10 +1387,6 @@
 msgstr ""
 
 #, python-format
-msgid "Attachment '%(filename)s' deleted."
-msgstr ""
-
-#, python-format
 msgid "Attachment '%(filename)s' installed."
 msgstr ""
 
@@ -796,16 +1439,17 @@
 msgid "attachment:%(filename)s of %(pagename)s"
 msgstr ""
 
-msgid "Delete"
-msgstr ""
-
 msgid "This page is already deleted or was never created!"
 msgstr ""
 
-msgid "Optional reason for the deletion"
+msgid "New name"
 msgstr ""
 
-msgid "Really delete this page?"
+msgid "Optional reason for the renaming"
+msgstr ""
+
+#, python-format
+msgid "Full Link List for \"%s\""
 msgstr ""
 
 msgid "Editor"
@@ -823,30 +1467,136 @@
 msgid "You are not allowed to use this action."
 msgstr ""
 
-#, python-format
-msgid "No pages like \"%s\"!"
+msgid "The only supported directions are BOTH and DOWN."
+msgstr ""
+
+msgid ""
+"Please set an interwikiname in your wikiconfig (see HelpOnConfiguration) to "
+"be able to use this action."
+msgstr ""
+
+msgid ""
+"Incorrect parameters. Please supply at least the ''remoteWiki'' parameter."
+msgstr ""
+
+msgid "The ''remoteWiki'' is unknown."
+msgstr ""
+
+msgid "Syncronisation finished."
 msgstr ""
 
 #, python-format
-msgid "Exactly one page like \"%s\" found, redirecting to page."
+msgid "Synchronising page %(pagename)s with remote page %(remotepagename)s ..."
+msgstr ""
+
+#, python-format
+msgid ""
+"Skipped page %(pagename)s because of a locally or remotely unresolved "
+"conflict."
+msgstr ""
+
+msgid ""
+"This is the first synchronisation between this page and the remote wiki."
+msgstr ""
+
+msgid "Page successfully merged."
+msgstr ""
+
+msgid "Page merged with conflicts."
+msgstr ""
+
+#, python-format
+msgid "(including %(localwords)d %(pagelink)s)"
 msgstr ""
 
 #, python-format
-msgid "Pages like \"%s\""
+msgid ""
+"The following %(badwords)d words could not be found in the dictionary of %"
+"(totalwords)d words%(localwords)s and are highlighted below:"
+msgstr ""
+
+msgid "Add checked words to dictionary"
+msgstr ""
+
+msgid "No spelling errors found!"
+msgstr ""
+
+msgid "You can't check spelling on a page you can't read."
+msgstr ""
+
+msgid "You are now logged out."
+msgstr ""
+
+msgid "You are not allowed to subscribe to a page you can't read."
+msgstr ""
+
+msgid "This wiki is not enabled for mail processing."
+msgstr ""
+
+msgid "You must log in to use subscribtions."
+msgstr ""
+
+msgid "Add your email address in your UserPreferences to use subscriptions."
+msgstr ""
+
+msgid "Your subscribtion to this page has been removed."
+msgstr ""
+
+msgid "Can't remove regular expression subscription!"
+msgstr ""
+
+msgid "Edit the subscription regular expressions in your UserPreferences."
+msgstr ""
+
+msgid "You have been subscribed to this page."
+msgstr ""
+
+msgid "General Information"
 msgstr ""
 
 #, python-format
-msgid "%(matchcount)d %(matches)s for \"%(title)s\""
+msgid "Page size: %d"
+msgstr ""
+
+msgid "SHA digest of this page's content is:"
+msgstr ""
+
+msgid "The following users subscribed to this page:"
+msgstr ""
+
+msgid "This page links to the following pages:"
+msgstr ""
+
+msgid "Diff"
 msgstr ""
 
-msgid "match"
+msgid "Comment"
+msgstr ""
+
+msgid "raw"
 msgstr ""
 
-msgid "matches"
+msgid "print"
+msgstr ""
+
+msgid "revert"
+msgstr ""
+
+msgid "Revision History"
+msgstr ""
+
+msgid "No log entries found."
 msgstr ""
 
 #, python-format
-msgid "Local Site Map for \"%s\""
+msgid "Info for \"%s\""
+msgstr ""
+
+#, python-format
+msgid "Show \"%(title)s\""
+msgstr ""
+
+msgid "General Page Infos"
 msgstr ""
 
 msgid "Please log in first."
@@ -887,51 +1637,6 @@
 msgstr ""
 
 #, python-format
-msgid "Invalid filename \"%s\"!"
-msgstr ""
-
-#, python-format
-msgid "Created the package %s containing the pages %s."
-msgstr ""
-
-msgid "Package pages"
-msgstr ""
-
-msgid "Package name"
-msgstr ""
-
-msgid "List of page names - separated by a comma"
-msgstr ""
-
-msgid "Rename Page"
-msgstr ""
-
-msgid "New name"
-msgstr ""
-
-msgid "Optional reason for the renaming"
-msgstr ""
-
-#, python-format
-msgid "(including %(localwords)d %(pagelink)s)"
-msgstr ""
-
-#, python-format
-msgid ""
-"The following %(badwords)d words could not be found in the dictionary of %"
-"(totalwords)d words%(localwords)s and are highlighted below:"
-msgstr ""
-
-msgid "Add checked words to dictionary"
-msgstr ""
-
-msgid "No spelling errors found!"
-msgstr ""
-
-msgid "You can't check spelling on a page you can't read."
-msgstr ""
-
-#, python-format
 msgid "Subscribe users to the page %s"
 msgstr ""
 
@@ -945,162 +1650,15 @@
 msgid "You are not allowed to perform this action."
 msgstr ""
 
-msgid "Do it."
-msgstr ""
-
 #, python-format
-msgid "Execute action %(actionname)s?"
-msgstr ""
-
-#, python-format
-msgid "Action %(actionname)s is excluded in this wiki!"
-msgstr ""
-
-#, python-format
-msgid "You are not allowed to use action %(actionname)s on this page!"
-msgstr ""
-
-#, python-format
-msgid "Please use the interactive user interface to use action %(actionname)s!"
-msgstr ""
-
-msgid "You are not allowed to revert this page!"
-msgstr ""
-
-msgid "No older revisions available!"
-msgstr ""
-
-#, python-format
-msgid "Diff for \"%s\""
-msgstr ""
-
-#, python-format
-msgid "Differences between revisions %d and %d"
-msgstr ""
-
-#, python-format
-msgid "(spanning %d versions)"
-msgstr ""
-
-msgid "No differences found!"
-msgstr ""
-
-#, python-format
-msgid "The page was saved %(count)d times, though!"
-msgstr ""
-
-msgid "(ignoring whitespace)"
-msgstr ""
-
-msgid "Ignore changes in the amount of whitespace"
-msgstr ""
-
-msgid "General Information"
+msgid "Title Search: \"%s\""
 msgstr ""
 
 #, python-format
-msgid "Page size: %d"
-msgstr ""
-
-msgid "SHA digest of this page's content is:"
-msgstr ""
-
-msgid "The following users subscribed to this page:"
-msgstr ""
-
-msgid "This page links to the following pages:"
-msgstr ""
-
-msgid "Date"
-msgstr ""
-
-msgid "Diff"
-msgstr ""
-
-msgid "Comment"
-msgstr ""
-
-msgid "raw"
-msgstr ""
-
-msgid "print"
-msgstr ""
-
-msgid "revert"
-msgstr ""
-
-#, python-format
-msgid "Revert to revision %(rev)d."
-msgstr ""
-
-msgid "N/A"
-msgstr ""
-
-msgid "Revision History"
-msgstr ""
-
-msgid "No log entries found."
-msgstr ""
-
-#, python-format
-msgid "Info for \"%s\""
-msgstr ""
-
-#, python-format
-msgid "Show \"%(title)s\""
+msgid "Full Text Search: \"%s\""
 msgstr ""
 
-msgid "General Page Infos"
-msgstr ""
-
-#, python-format
-msgid "Show chart \"%(title)s\""
-msgstr ""
-
-msgid "Page hits and edits"
-msgstr ""
-
-msgid "You must login to add a quicklink."
-msgstr ""
-
-msgid "Your quicklink to this page has been removed."
-msgstr ""
-
-msgid "A quicklink to this page has been added for you."
-msgstr ""
-
-msgid "You are not allowed to subscribe to a page you can't read."
-msgstr ""
-
-msgid "This wiki is not enabled for mail processing."
-msgstr ""
-
-msgid "You must log in to use subscribtions."
-msgstr ""
-
-msgid "Add your email address in your UserPreferences to use subscriptions."
-msgstr ""
-
-msgid "Your subscribtion to this page has been removed."
-msgstr ""
-
-msgid "Can't remove regular expression subscription!"
-msgstr ""
-
-msgid "Edit the subscription regular expressions in your UserPreferences."
-msgstr ""
-
-msgid "You have been subscribed to this page."
-msgstr ""
-
-msgid "Charts are not available!"
-msgstr ""
-
-msgid "You need to provide a chart type!"
-msgstr ""
-
-#, python-format
-msgid "Bad chart type \"%s\"!"
+msgid "Your search query didn't return any results."
 msgstr ""
 
 #, python-format
@@ -1147,563 +1705,80 @@
 msgid "Unknown backup subaction: %s."
 msgstr ""
 
+msgid "You are not allowed to revert this page!"
+msgstr ""
+
 #, python-format
-msgid "Please use a more selective search term instead of {{{\"%s\"}}}"
+msgid "Local Site Map for \"%s\""
+msgstr ""
+
+#, python-format
+msgid "No pages like \"%s\"!"
 msgstr ""
 
 #, python-format
-msgid "Title Search: \"%s\""
+msgid "Invalid filename \"%s\"!"
 msgstr ""
 
 #, python-format
-msgid "Full Text Search: \"%s\""
+msgid "Created the package %s containing the pages %s."
+msgstr ""
+
+msgid "Package pages"
+msgstr ""
+
+msgid "Package name"
+msgstr ""
+
+msgid "List of page names - separated by a comma"
+msgstr ""
+
+msgid "No older revisions available!"
 msgstr ""
 
 #, python-format
-msgid "Full Link List for \"%s\""
+msgid "Diff for \"%s\""
+msgstr ""
+
+#, python-format
+msgid "Differences between revisions %d and %d"
+msgstr ""
+
+#, python-format
+msgid "(spanning %d versions)"
 msgstr ""
 
 #, python-format
-msgid "Unknown user name: {{{\"%s\"}}}. Please enter user name and password."
+msgid "The page was saved %(count)d times, though!"
+msgstr ""
+
+msgid "(ignoring whitespace)"
+msgstr ""
+
+msgid "Ignore changes in the amount of whitespace"
 msgstr ""
 
-msgid "Missing password. Please enter user name and password."
+#, python-format
+msgid "Exactly one page like \"%s\" found, redirecting to page."
 msgstr ""
 
-msgid "Sorry, login failed."
+#, python-format
+msgid "Pages like \"%s\""
 msgstr ""
 
-msgid "You are now logged out."
+#, python-format
+msgid "%(matchcount)d %(matches)s for \"%(title)s\""
 msgstr ""
 
 msgid ""
 "Cannot create a new page without a page name.  Please specify a page name."
 msgstr ""
 
-#, python-format
-msgid "Upload new attachment \"%(filename)s\""
-msgstr ""
-
-#, python-format
-msgid "Create new drawing \"%(filename)s\""
-msgstr ""
-
-#, python-format
-msgid "Edit drawing %(filename)s"
-msgstr ""
-
-msgid "Toggle line numbers"
-msgstr ""
-
-msgid "FrontPage"
-msgstr ""
-
-msgid "RecentChanges"
-msgstr ""
-
-msgid "TitleIndex"
-msgstr ""
-
-msgid "WordIndex"
-msgstr ""
-
-msgid "FindPage"
-msgstr ""
-
-msgid "SiteNavigation"
-msgstr ""
-
-msgid "HelpContents"
-msgstr ""
-
-msgid "HelpOnFormatting"
-msgstr ""
-
-msgid "UserPreferences"
-msgstr ""
-
-msgid "WikiLicense"
-msgstr ""
-
-msgid "MissingPage"
-msgstr ""
-
-msgid "MissingHomePage"
-msgstr ""
-
-msgid "Mon"
-msgstr ""
-
-msgid "Tue"
-msgstr ""
-
-msgid "Wed"
-msgstr ""
-
-msgid "Thu"
-msgstr ""
-
-msgid "Fri"
-msgstr ""
-
-msgid "Sat"
-msgstr ""
-
-msgid "Sun"
-msgstr ""
-
-msgid "AttachFile"
-msgstr ""
-
-msgid "DeletePage"
-msgstr ""
-
-msgid "LikePages"
-msgstr ""
-
-msgid "LocalSiteMap"
-msgstr ""
-
-msgid "RenamePage"
-msgstr ""
-
-msgid "SpellCheck"
-msgstr ""
-
-#, python-format
-msgid "Invalid include arguments \"%s\"!"
-msgstr ""
-
-#, python-format
-msgid "Nothing found for \"%s\"!"
-msgstr ""
-
-#, python-format
-msgid "Invalid MonthCalendar calparms \"%s\"!"
-msgstr ""
-
-#, python-format
-msgid "Invalid MonthCalendar arguments \"%s\"!"
-msgstr ""
-
-#, python-format
-msgid "Unsupported navigation scheme '%(scheme)s'!"
-msgstr ""
-
-msgid "No parent page found!"
-msgstr ""
-
-msgid "Wiki"
-msgstr ""
-
-msgid "Slideshow"
-msgstr ""
-
-msgid "Start"
-msgstr ""
-
-#, python-format
-msgid "Slide %(pos)d of %(size)d"
-msgstr ""
-
-msgid "No orphaned pages in this wiki."
-msgstr ""
-
-#, python-format
-msgid "No quotes on %(pagename)s."
-msgstr ""
-
-#, python-format
-msgid "Upload of attachment '%(filename)s'."
-msgstr ""
-
-#, python-format
-msgid "Drawing '%(filename)s' saved."
-msgstr ""
-
-#, python-format
-msgid "%(mins)dm ago"
-msgstr ""
-
-msgid "(no bookmark set)"
-msgstr ""
-
-#, python-format
-msgid "(currently set to %s)"
-msgstr ""
-
-msgid "Delete Bookmark"
-msgstr ""
-
-msgid "Set bookmark"
-msgstr ""
-
-msgid "set bookmark"
-msgstr ""
-
-msgid "[Bookmark reached]"
-msgstr ""
-
-msgid "Markup"
-msgstr ""
-
-msgid "Display"
-msgstr ""
-
-msgid "Python Version"
-msgstr ""
-
-msgid "MoinMoin Version"
-msgstr ""
-
-#, python-format
-msgid "Release %s [Revision %s]"
-msgstr ""
-
-msgid "4Suite Version"
-msgstr ""
-
-msgid "Number of pages"
-msgstr ""
-
-msgid "Number of system pages"
-msgstr ""
-
-msgid "Accumulated page sizes"
-msgstr ""
-
-#, python-format
-msgid "Disk usage of %(data_dir)s/pages/"
-msgstr ""
-
-#, python-format
-msgid "Disk usage of %(data_dir)s/"
-msgstr ""
-
-msgid "Entries in edit log"
-msgstr ""
-
-msgid "NONE"
-msgstr ""
-
-msgid "Global extension macros"
-msgstr ""
-
-msgid "Local extension macros"
-msgstr ""
-
-msgid "Global extension actions"
-msgstr ""
-
-msgid "Local extension actions"
-msgstr ""
-
-msgid "Global parsers"
-msgstr ""
-
-msgid "Local extension parsers"
-msgstr ""
-
-msgid "Disabled"
-msgstr ""
-
-msgid "Enabled"
-msgstr ""
-
-msgid "Xapian search"
-msgstr ""
-
-msgid "Active threads"
-msgstr ""
-
-msgid "Contents"
-msgstr ""
-
-msgid "Include system pages"
-msgstr ""
-
-msgid "Exclude system pages"
-msgstr ""
-
-msgid "No wanted pages in this wiki."
-msgstr ""
-
-msgid "Search Titles"
-msgstr ""
-
-msgid "Display context of search results"
-msgstr ""
-
-msgid "Case-sensitive searching"
-msgstr ""
-
-msgid "Search Text"
-msgstr ""
-
-msgid "Go To Page"
+msgid "Delete"
 msgstr ""
 
-#, python-format
-msgid "ERROR in regex '%s'"
-msgstr ""
-
-#, python-format
-msgid "Bad timestamp '%s'"
-msgstr ""
-
-#, python-format
-msgid "Connection to mailserver '%(server)s' failed: %(reason)s"
-msgstr ""
-
-msgid "Mail not sent"
-msgstr ""
-
-msgid "Mail sent OK"
-msgstr ""
-
-#, python-format
-msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
-msgstr ""
-
-#, python-format
-msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
-msgstr ""
-
-#, python-format
-msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
-msgstr ""
-
-#, python-format
-msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
-msgstr ""
-
-msgid ""
-"Rendering of reStructured text is not possible, please install Docutils."
-msgstr ""
-
-msgid "**Maximum number of allowed includes exceeded**"
-msgstr ""
-
-#, python-format
-msgid "**Could not find the referenced page: %s**"
-msgstr ""
-
-msgid "XSLT option disabled, please look at HelpOnConfiguration."
-msgstr ""
-
-msgid "XSLT processing is not available, please install 4suite 1.x."
-msgstr ""
-
-#, python-format
-msgid "%(errortype)s processing error"
-msgstr ""
-
-#, python-format
-msgid "You are not allowed to do %s on this page."
-msgstr ""
-
-msgid "Login and try again."
-msgstr ""
-
-#, python-format
-msgid ""
-"Sorry, can not save page because \"%(content)s\" is not allowed in this wiki."
-msgstr ""
-
-msgid "Views/day"
-msgstr ""
-
-msgid "Edits/day"
-msgstr ""
-
-#, python-format
-msgid "%(chart_title)s for %(filterpage)s"
-msgstr ""
-
-msgid ""
-"green=view\n"
-"red=edit"
-msgstr ""
-
-msgid "date"
-msgstr ""
-
-msgid "# of hits"
-msgstr ""
-
-msgid "Page Size Distribution"
-msgstr ""
-
-msgid "page size upper bound [bytes]"
-msgstr ""
-
-msgid "# of pages of this size"
-msgstr ""
-
-msgid "User agent"
-msgstr ""
-
-msgid "Others"
-msgstr ""
-
-msgid "Distribution of User-Agent Types"
-msgstr ""
-
-msgid "Unsubscribe"
-msgstr ""
-
-msgid "Home"
-msgstr ""
-
-msgid "[RSS]"
-msgstr ""
-
-msgid "[DELETED]"
-msgstr ""
-
-msgid "[UPDATED]"
-msgstr ""
-
-msgid "[NEW]"
-msgstr ""
-
-msgid "[DIFF]"
-msgstr ""
-
-msgid "[BOTTOM]"
+msgid "Optional reason for the deletion"
 msgstr ""
 
-msgid "[TOP]"
-msgstr ""
-
-msgid "Click to do a full-text search for this title"
-msgstr ""
-
-msgid "Preferences"
-msgstr ""
-
-msgid "Logout"
-msgstr ""
-
-msgid "Clear message"
-msgstr ""
-
-#, python-format
-msgid "last edited %(time)s by %(editor)s"
-msgstr ""
-
-#, python-format
-msgid "last modified %(time)s"
-msgstr ""
-
-msgid "Search:"
-msgstr ""
-
-msgid "Text"
-msgstr ""
-
-msgid "Titles"
-msgstr ""
-
-msgid "Search"
-msgstr ""
-
-msgid "More Actions:"
-msgstr ""
-
-msgid "------------"
-msgstr ""
-
-msgid "Raw Text"
-msgstr ""
-
-msgid "Print View"
-msgstr ""
-
-msgid "Delete Cache"
-msgstr ""
-
-msgid "Delete Page"
-msgstr ""
-
-msgid "Like Pages"
-msgstr ""
-
-msgid "Local Site Map"
-msgstr ""
-
-msgid "My Pages"
-msgstr ""
-
-msgid "Subscribe User"
-msgstr ""
-
-msgid "Remove Spam"
+msgid "Really delete this page?"
 msgstr ""
-
-msgid "Package Pages"
-msgstr ""
-
-msgid "Render as Docbook"
-msgstr ""
-
-msgid "Do"
-msgstr ""
-
-msgid "Edit (Text)"
-msgstr ""
-
-msgid "Edit (GUI)"
-msgstr ""
-
-msgid "Immutable Page"
-msgstr ""
-
-msgid "Remove Link"
-msgstr ""
-
-msgid "Add Link"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
-#, python-format
-msgid "Show %s days."
-msgstr ""
-
-msgid "Wiki Markup"
-msgstr ""
-
-msgid "DeleteCache"
-msgstr ""
-
-#, python-format
-msgid "(cached %s)"
-msgstr ""
-
-msgid "Or try one of these actions:"
-msgstr ""
-
-msgid "Page"
-msgstr ""
-
-msgid "User"
-msgstr ""
-
-msgid "Line"
-msgstr ""
-
-msgid "Deletions are marked like this."
-msgstr ""
-
-msgid "Additions are marked like this."
-msgstr ""
-
-#, python-format
-msgid "%(hits)d results out of about %(pages)d pages."
-msgstr ""
-
-#, python-format
-msgid "%.2f seconds"
-msgstr ""
--- a/MoinMoin/i18n/ar.MoinMoin.po	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/i18n/ar.MoinMoin.po	Fri Aug 18 11:43:50 2006 +0200
@@ -1,10 +1,19 @@
+## Please edit system and help pages ONLY in the moinmaster wiki! For more
+## information, please see MoinMaster:MoinPagesEditorGroup.
+##master-page:None
+##master-date:None
+#acl MoinPagesEditorGroup:read,write,delete,revert All:read
 #format gettext
+#language ar
 
+#
+# MoinMoin ar system text translation
+#
 msgid ""
 msgstr ""
-"Project-Id-Version: moin\n"
+"Project-Id-Version: moin 1.6\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-05-21 23:16+0200\n"
+"POT-Creation-Date: 2006-07-17 12:27+0200\n"
 "PO-Revision-Date:  2006-05-21 23:16+0200\n"
 "Last-Translator: Alexander Stein <ajs67@georgetown.edu>\n"
 "Language-Team: \n"
@@ -47,6 +56,9 @@
 msgid "You are not allowed to view this page."
 msgstr "لا يسمح لك بنظر هذه الصفحة."
 
+msgid "Your changes are not saved!"
+msgstr ""
+
 msgid "You are not allowed to edit this page."
 msgstr "لا يسمح لك بتحرير هذه الصفحة"
 
@@ -59,6 +71,9 @@
 msgid "The lock you held timed out. Be prepared for editing conflicts!"
 msgstr ""
 
+msgid "Page name is too long, try shorter name."
+msgstr ""
+
 #, python-format
 msgid "Edit \"%(pagename)s\""
 msgstr "تحرير \"%(pagename)s\""
@@ -85,11 +100,9 @@
 msgid "Someone else changed this page while you were editing!"
 msgstr ""
 
-#, python-format
 msgid ""
 "Someone else saved this page while you were editing!\n"
-"Please review the page and save then. Do not save this page as it is!\n"
-"Have a look at the diff of %(difflink)s to see what has been changed."
+"Please review the page and save then. Do not save this page as it is!"
 msgstr ""
 
 #, python-format
@@ -128,7 +141,7 @@
 msgid "Preview"
 msgstr ""
 
-msgid "Text mode"
+msgid "GUI Mode"
 msgstr ""
 
 msgid "Comment:"
@@ -147,23 +160,145 @@
 msgid "Remove trailing whitespace from each line"
 msgstr ""
 
+msgid "Edit was cancelled."
+msgstr ""
+
+msgid "You can't rename to an empty pagename."
+msgstr ""
+
 #, python-format
-msgid "%(hits)d results out of about %(pages)d pages."
+msgid ""
+"'''A page with the name {{{'%s'}}} already exists.'''\n"
+"\n"
+"Try a different name."
+msgstr ""
+
+#, python-format
+msgid "Could not rename page because of file system error: %s."
+msgstr ""
+
+msgid "Thank you for your changes. Your attention to detail is appreciated."
+msgstr ""
+
+#, python-format
+msgid "Page \"%s\" was successfully deleted!"
+msgstr ""
+
+#, python-format
+msgid ""
+"Dear Wiki user,\n"
+"\n"
+"You have subscribed to a wiki page or wiki category on \"%(sitename)s\" for "
+"change notification.\n"
+"\n"
+"The following page has been changed by %(editor)s:\n"
+"%(pagelink)s\n"
+"\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"The comment on the change is:\n"
+"%(comment)s\n"
+"\n"
+msgstr ""
+
+msgid "New page:\n"
+msgstr "صفحة جديدة\n"
+
+msgid "No differences found!\n"
+msgstr "ْلا توجد اختلافات \n"
+
+#, python-format
+msgid "[%(sitename)s] %(trivial)sUpdate of \"%(pagename)s\" by %(username)s"
+msgstr ""
+
+msgid "Trivial "
+msgstr ""
+
+msgid "Status of sending notification mails:"
+msgstr ""
+
+#, python-format
+msgid "[%(lang)s] %(recipients)s: %(status)s"
 msgstr ""
 
 #, python-format
-msgid "%.2f seconds"
-msgstr "%.2f ثانية"
+msgid "## backup of page \"%(pagename)s\" submitted %(date)s"
+msgstr ""
+
+#, python-format
+msgid "Page could not get locked. Unexpected error (errno=%d)."
+msgstr ""
+
+msgid "Page could not get locked. Missing 'current' file?"
+msgstr ""
+
+msgid "You are not allowed to edit this page!"
+msgstr ""
+
+msgid "You cannot save empty pages."
+msgstr ""
 
-msgid "match"
+msgid "You already saved this page!"
+msgstr ""
+
+msgid "You already edited this page! Please do not use the back button."
+msgstr ""
+
+#, python-format
+msgid "A backup of your changes is [%(backup_url)s here]."
+msgstr ""
+
+msgid "You did not change the page content, not saved!"
+msgstr ""
+
+msgid ""
+"You can't change ACLs on this page since you have no admin rights on it!"
 msgstr ""
 
-msgid "matches"
+#, python-format
+msgid ""
+"The lock of %(owner)s timed out %(mins_ago)d minute(s) ago, and you were "
+"granted the lock for this page."
+msgstr ""
+
+#, python-format
+msgid ""
+"Other users will be ''blocked'' from editing this page until %(bumptime)s."
+msgstr ""
+
+#, python-format
+msgid ""
+"Other users will be ''warned'' until %(bumptime)s that you are editing this "
+"page."
+msgstr ""
+
+msgid "Use the Preview button to extend the locking period."
+msgstr ""
+
+#, python-format
+msgid ""
+"This page is currently ''locked'' for editing by %(owner)s until %(timestamp)"
+"s, i.e. for %(mins_valid)d minute(s)."
+msgstr ""
+
+#, python-format
+msgid ""
+"This page was opened for editing or last previewed at %(timestamp)s by %"
+"(owner)s.[[BR]]\n"
+"'''You should ''refrain from editing'' this page for at least another %"
+"(mins_valid)d minute(s),\n"
+"to avoid editing conflicts.'''[[BR]]\n"
+"To leave the editor, press the Cancel button."
 msgstr ""
 
 msgid "<unknown>"
 msgstr "<مغمور>"
 
+msgid "Text mode"
+msgstr ""
+
 #, python-format
 msgid ""
 "Login Name: %s\n"
@@ -189,6 +324,179 @@
 msgstr ""
 
 msgid ""
+" Emphasis:: [[Verbatim('')]]''italics''[[Verbatim('')]]; [[Verbatim"
+"(''')]]'''bold'''[[Verbatim(''')]]; [[Verbatim(''''')]]'''''bold "
+"italics'''''[[Verbatim(''''')]]; [[Verbatim('')]]''mixed ''[[Verbatim"
+"(''')]]'''''bold'''[[Verbatim(''')]] and italics''[[Verbatim('')]]; "
+"[[Verbatim(----)]] horizontal rule.\n"
+" Headings:: [[Verbatim(=)]] Title 1 [[Verbatim(=)]]; [[Verbatim(==)]] Title "
+"2 [[Verbatim(==)]]; [[Verbatim(===)]] Title 3 [[Verbatim(===)]];   [[Verbatim"
+"(====)]] Title 4 [[Verbatim(====)]]; [[Verbatim(=====)]] Title 5 [[Verbatim"
+"(=====)]].\n"
+" Lists:: space and one of: * bullets; 1., a., A., i., I. numbered items; 1."
+"#n start numbering at n; space alone indents.\n"
+" Links:: [[Verbatim(JoinCapitalizedWords)]]; [[Verbatim([\"brackets and "
+"double quotes\"])]]; url; [url]; [url label].\n"
+" Tables:: || cell text |||| cell text spanning 2 columns ||;    no trailing "
+"white space allowed after tables or titles.\n"
+"\n"
+"(!) For more help, see HelpOnEditing or SyntaxReference.\n"
+msgstr ""
+
+msgid ""
+"Emphasis: <i>*italic*</i> <b>**bold**</b> ``monospace``<br/>\n"
+"<br/><pre>\n"
+"Headings: Heading 1  Heading 2  Heading 3\n"
+"          =========  ---------  ~~~~~~~~~\n"
+"\n"
+"Horizontal rule: ---- \n"
+"Links: TrailingUnderscore_ `multi word with backticks`_ external_ \n"
+"\n"
+".. _external: http://external-site.net/foo/\n"
+"\n"
+"Lists: * bullets; 1., a. numbered items.\n"
+"</pre>\n"
+"<br/>\n"
+"(!) For more help, see the \n"
+"<a href=\"http://docutils.sourceforge.net/docs/user/rst/quickref.html\">\n"
+"reStructuredText Quick Reference\n"
+"</a>.\n"
+msgstr ""
+
+msgid "Diffs"
+msgstr ""
+
+msgid "Info"
+msgstr ""
+
+msgid "Edit"
+msgstr ""
+
+msgid "UnSubscribe"
+msgstr ""
+
+msgid "Subscribe"
+msgstr "اشتراك"
+
+msgid "Raw"
+msgstr ""
+
+msgid "XML"
+msgstr "XML"
+
+msgid "Print"
+msgstr "طباعة"
+
+msgid "View"
+msgstr "اظهر"
+
+msgid "Up"
+msgstr "أعلى"
+
+msgid "Publish my email (not my wiki homepage) in author info"
+msgstr ""
+"انشر رسائلي الإلكترونية (ليس صفحتي الشخصية في الويكي ) في معلومات المؤلف"
+
+msgid "Open editor on double click"
+msgstr "افتح المحرر عند النقر المزدوج"
+
+msgid "After login, jump to last visited page"
+msgstr ""
+
+msgid "Show question mark for non-existing pagelinks"
+msgstr ""
+
+msgid "Show page trail"
+msgstr ""
+
+msgid "Show icon toolbar"
+msgstr "اظهر أيقونات شريط الأدوات"
+
+msgid "Show top/bottom links in headings"
+msgstr ""
+
+msgid "Show fancy diffs"
+msgstr ""
+
+msgid "Add spaces to displayed wiki names"
+msgstr ""
+
+msgid "Remember login information"
+msgstr "تذكر معلومات الدخول"
+
+msgid "Subscribe to trivial changes"
+msgstr ""
+
+msgid "Disable this account forever"
+msgstr "عطل هذا الحساب للأبد"
+
+msgid "Name"
+msgstr "اسم"
+
+msgid "(Use Firstname''''''Lastname)"
+msgstr "(استخدم الاسم الأول الاسم الأخير)"
+
+msgid "Alias-Name"
+msgstr "الأسم المستعار"
+
+msgid "Password"
+msgstr "كلمةالسرّ"
+
+msgid "Password repeat"
+msgstr "اعادة كلمة السر"
+
+msgid "(Only for password change or new account)"
+msgstr ""
+
+msgid "Email"
+msgstr "بريد الكتروني"
+
+msgid "User CSS URL"
+msgstr ""
+
+msgid "(Leave it empty for disabling user CSS)"
+msgstr "URL CSS المستخدم"
+
+msgid "Editor size"
+msgstr "حجم المحرر"
+
+#, python-format
+msgid "The package needs a newer version of MoinMoin (at least %s)."
+msgstr ""
+
+msgid "The theme name is not set."
+msgstr ""
+
+msgid "Installing theme files is only supported for standalone type servers."
+msgstr ""
+
+#, python-format
+msgid "Installation of '%(filename)s' failed."
+msgstr ""
+
+#, python-format
+msgid "The file %s is not a MoinMoin package file."
+msgstr ""
+
+#, python-format
+msgid "The page %s does not exist."
+msgstr ""
+
+msgid "Invalid package file header."
+msgstr ""
+
+msgid "Package file format unsupported."
+msgstr ""
+
+#, python-format
+msgid "Unknown function %(func)s in line %(lineno)i."
+msgstr ""
+
+#, python-format
+msgid "The file %s was not found in the package."
+msgstr ""
+
+msgid ""
 "This wiki is not enabled for mail processing.\n"
 "Contact the owner of the wiki, who can enable email."
 msgstr ""
@@ -303,21 +611,12 @@
 msgid "Mail me my account data"
 msgstr ""
 
-msgid "Email"
-msgstr "بريد الكتروني"
-
 #, python-format
 msgid ""
 "To create an account or recover a lost password, see the %(userprefslink)s "
 "page."
 msgstr ""
 
-msgid "Name"
-msgstr "اسم"
-
-msgid "Password"
-msgstr "كلمةالسرّ"
-
 msgid "Login"
 msgstr ""
 
@@ -332,717 +631,6 @@
 msgid "Expected a value for key \"%(token)s\""
 msgstr "تتوقع قيمة للمفتاح \"%(token)s\""
 
-msgid "Your changes are not saved!"
-msgstr ""
-
-msgid "Page name is too long, try shorter name."
-msgstr ""
-
-msgid "GUI Mode"
-msgstr ""
-
-msgid "Edit was cancelled."
-msgstr ""
-
-msgid "You can't rename to an empty pagename."
-msgstr ""
-
-#, python-format
-msgid ""
-"'''A page with the name {{{'%s'}}} already exists.'''\n"
-"\n"
-"Try a different name."
-msgstr ""
-
-#, python-format
-msgid "Could not rename page because of file system error: %s."
-msgstr ""
-
-msgid "Thank you for your changes. Your attention to detail is appreciated."
-msgstr ""
-
-#, python-format
-msgid "Page \"%s\" was successfully deleted!"
-msgstr ""
-
-#, python-format
-msgid ""
-"Dear Wiki user,\n"
-"\n"
-"You have subscribed to a wiki page or wiki category on \"%(sitename)s\" for "
-"change notification.\n"
-"\n"
-"The following page has been changed by %(editor)s:\n"
-"%(pagelink)s\n"
-"\n"
-msgstr ""
-
-#, python-format
-msgid ""
-"The comment on the change is:\n"
-"%(comment)s\n"
-"\n"
-msgstr ""
-
-msgid "New page:\n"
-msgstr "صفحة جديدة\n"
-
-msgid "No differences found!\n"
-msgstr "ْلا توجد اختلافات \n"
-
-#, python-format
-msgid "[%(sitename)s] %(trivial)sUpdate of \"%(pagename)s\" by %(username)s"
-msgstr ""
-
-msgid "Trivial "
-msgstr ""
-
-msgid "Status of sending notification mails:"
-msgstr ""
-
-#, python-format
-msgid "[%(lang)s] %(recipients)s: %(status)s"
-msgstr ""
-
-#, python-format
-msgid "## backup of page \"%(pagename)s\" submitted %(date)s"
-msgstr ""
-
-#, python-format
-msgid "Page could not get locked. Unexpected error (errno=%d)."
-msgstr ""
-
-msgid "Page could not get locked. Missing 'current' file?"
-msgstr ""
-
-msgid "You are not allowed to edit this page!"
-msgstr ""
-
-msgid "You cannot save empty pages."
-msgstr ""
-
-msgid "You already saved this page!"
-msgstr ""
-
-msgid ""
-"Sorry, someone else saved the page while you edited it.\n"
-"\n"
-"Please do the following: Use the back button of your browser, and cut&paste\n"
-"your changes from there. Then go forward to here, and click EditText again.\n"
-"Now re-add your changes to the current page contents.\n"
-"\n"
-"''Do not just replace\n"
-"the content editbox with your version of the page, because that would\n"
-"delete the changes of the other person, which is excessively rude!''\n"
-msgstr ""
-
-#, python-format
-msgid "A backup of your changes is [%(backup_url)s here]."
-msgstr ""
-
-msgid "You did not change the page content, not saved!"
-msgstr ""
-
-msgid ""
-"You can't change ACLs on this page since you have no admin rights on it!"
-msgstr ""
-
-#, python-format
-msgid ""
-"The lock of %(owner)s timed out %(mins_ago)d minute(s) ago, and you were "
-"granted the lock for this page."
-msgstr ""
-
-#, python-format
-msgid ""
-"Other users will be ''blocked'' from editing this page until %(bumptime)s."
-msgstr ""
-
-#, python-format
-msgid ""
-"Other users will be ''warned'' until %(bumptime)s that you are editing this "
-"page."
-msgstr ""
-
-msgid "Use the Preview button to extend the locking period."
-msgstr ""
-
-#, python-format
-msgid ""
-"This page is currently ''locked'' for editing by %(owner)s until %(timestamp)"
-"s, i.e. for %(mins_valid)d minute(s)."
-msgstr ""
-
-#, python-format
-msgid ""
-"This page was opened for editing or last previewed at %(timestamp)s by %"
-"(owner)s.[[BR]]\n"
-"'''You should ''refrain from editing'' this page for at least another %"
-"(mins_valid)d minute(s),\n"
-"to avoid editing conflicts.'''[[BR]]\n"
-"To leave the editor, press the Cancel button."
-msgstr ""
-
-#, python-format
-msgid "The package needs a newer version of MoinMoin (at least %s)."
-msgstr ""
-
-msgid "The theme name is not set."
-msgstr ""
-
-msgid "Installing theme files is only supported for standalone type servers."
-msgstr ""
-
-#, python-format
-msgid "Installation of '%(filename)s' failed."
-msgstr ""
-
-#, python-format
-msgid "The file %s is not a MoinMoin package file."
-msgstr ""
-
-#, python-format
-msgid "The page %s does not exist."
-msgstr ""
-
-msgid "Invalid package file header."
-msgstr ""
-
-msgid "Package file format unsupported."
-msgstr ""
-
-#, python-format
-msgid "Unknown function %(func)s in line %(lineno)i."
-msgstr ""
-
-#, python-format
-msgid "The file %s was not found in the package."
-msgstr ""
-
-msgid ""
-" Emphasis:: [[Verbatim('')]]''italics''[[Verbatim('')]]; [[Verbatim"
-"(''')]]'''bold'''[[Verbatim(''')]]; [[Verbatim(''''')]]'''''bold "
-"italics'''''[[Verbatim(''''')]]; [[Verbatim('')]]''mixed ''[[Verbatim"
-"(''')]]'''''bold'''[[Verbatim(''')]] and italics''[[Verbatim('')]]; "
-"[[Verbatim(----)]] horizontal rule.\n"
-" Headings:: [[Verbatim(=)]] Title 1 [[Verbatim(=)]]; [[Verbatim(==)]] Title "
-"2 [[Verbatim(==)]]; [[Verbatim(===)]] Title 3 [[Verbatim(===)]];   [[Verbatim"
-"(====)]] Title 4 [[Verbatim(====)]]; [[Verbatim(=====)]] Title 5 [[Verbatim"
-"(=====)]].\n"
-" Lists:: space and one of: * bullets; 1., a., A., i., I. numbered items; 1."
-"#n start numbering at n; space alone indents.\n"
-" Links:: [[Verbatim(JoinCapitalizedWords)]]; [[Verbatim([\"brackets and "
-"double quotes\"])]]; url; [url]; [url label].\n"
-" Tables:: || cell text |||| cell text spanning 2 columns ||;    no trailing "
-"white space allowed after tables or titles.\n"
-"\n"
-"(!) For more help, see HelpOnEditing or SyntaxReference.\n"
-msgstr ""
-
-msgid ""
-"Emphasis: <i>*italic*</i> <b>**bold**</b> ``monospace``<br/>\n"
-"<br/><pre>\n"
-"Headings: Heading 1  Heading 2  Heading 3\n"
-"          =========  ---------  ~~~~~~~~~\n"
-"\n"
-"Horizontal rule: ---- \n"
-"Links: TrailingUnderscore_ `multi word with backticks`_ external_ \n"
-"\n"
-".. _external: http://external-site.net/foo/\n"
-"\n"
-"Lists: * bullets; 1., a. numbered items.\n"
-"</pre>\n"
-"<br/>\n"
-"(!) For more help, see the \n"
-"<a href=\"http://docutils.sourceforge.net/docs/user/rst/quickref.html\">\n"
-"reStructuredText Quick Reference\n"
-"</a>.\n"
-msgstr ""
-
-msgid "Diffs"
-msgstr ""
-
-msgid "Info"
-msgstr ""
-
-msgid "Edit"
-msgstr ""
-
-msgid "UnSubscribe"
-msgstr ""
-
-msgid "Subscribe"
-msgstr "اشتراك"
-
-msgid "Raw"
-msgstr ""
-
-msgid "XML"
-msgstr "XML"
-
-msgid "Print"
-msgstr "طباعة"
-
-msgid "View"
-msgstr "اظهر"
-
-msgid "Up"
-msgstr "أعلى"
-
-msgid "Publish my email (not my wiki homepage) in author info"
-msgstr "انشر رسائلي الإلكترونية (ليس صفحتي الشخصية في الويكي ) في معلومات المؤلف"
-
-msgid "Open editor on double click"
-msgstr "افتح المحرر عند النقر المزدوج"
-
-msgid "Jump to last visited page instead of frontpage"
-msgstr ""
-
-msgid "Show question mark for non-existing pagelinks"
-msgstr ""
-
-msgid "Show page trail"
-msgstr ""
-
-msgid "Show icon toolbar"
-msgstr "اظهر أيقونات شريط الأدوات"
-
-msgid "Show top/bottom links in headings"
-msgstr ""
-
-msgid "Show fancy diffs"
-msgstr ""
-
-msgid "Add spaces to displayed wiki names"
-msgstr ""
-
-msgid "Remember login information"
-msgstr "تذكر معلومات الدخول"
-
-msgid "Subscribe to trivial changes"
-msgstr ""
-
-msgid "Disable this account forever"
-msgstr "عطل هذا الحساب للأبد"
-
-msgid "(Use Firstname''''''Lastname)"
-msgstr "(استخدم الاسم الأول الاسم الأخير)"
-
-msgid "Alias-Name"
-msgstr "الأسم المستعار"
-
-msgid "Password repeat"
-msgstr "اعادة كلمة السر"
-
-msgid "(Only when changing passwords)"
-msgstr ""
-
-msgid "User CSS URL"
-msgstr ""
-
-msgid "(Leave it empty for disabling user CSS)"
-msgstr "URL CSS المستخدم"
-
-msgid "Editor size"
-msgstr "حجم المحرر"
-
-msgid "Do it."
-msgstr "نفذ."
-
-#, python-format
-msgid "Execute action %(actionname)s?"
-msgstr "نفذ عملية %(actionname)s?"
-
-#, python-format
-msgid "Action %(actionname)s is excluded in this wiki!"
-msgstr "لا يسمح للويكي بتنفيذ عملية %(actionname)s!"
-
-#, python-format
-msgid "You are not allowed to use action %(actionname)s on this page!"
-msgstr "لا يسمح لك باستخدام عملية %(actionname)s في هذه الصفحة!"
-
-#, python-format
-msgid "Please use the interactive user interface to use action %(actionname)s!"
-msgstr ""
-
-msgid "You are not allowed to revert this page!"
-msgstr "!لا يسمح لك بالعودة إلى هذه الصفحة"
-
-msgid "No older revisions available!"
-msgstr ""
-
-#, python-format
-msgid "Diff for \"%s\""
-msgstr ""
-
-#, python-format
-msgid "Differences between revisions %d and %d"
-msgstr "الاختلافات بين نسخة %d و نسخة %d"
-
-#, python-format
-msgid "(spanning %d versions)"
-msgstr "التمديد ل %d نسخ"
-
-msgid "No differences found!"
-msgstr "لا توجد الاختلافات!"
-
-#, python-format
-msgid "The page was saved %(count)d times, though!"
-msgstr ""
-
-msgid "(ignoring whitespace)"
-msgstr ""
-
-msgid "Ignore changes in the amount of whitespace"
-msgstr ""
-
-msgid "General Information"
-msgstr ""
-
-#, python-format
-msgid "Page size: %d"
-msgstr ""
-
-msgid "SHA digest of this page's content is:"
-msgstr ""
-
-msgid "The following users subscribed to this page:"
-msgstr ""
-
-msgid "This page links to the following pages:"
-msgstr ""
-
-msgid "Date"
-msgstr "التاريخ"
-
-msgid "Size"
-msgstr "الحجم"
-
-msgid "Diff"
-msgstr ""
-
-msgid "Editor"
-msgstr "المحرر"
-
-msgid "Comment"
-msgstr ""
-
-msgid "view"
-msgstr ""
-
-msgid "raw"
-msgstr ""
-
-msgid "print"
-msgstr ""
-
-msgid "revert"
-msgstr ""
-
-#, python-format
-msgid "Revert to revision %(rev)d."
-msgstr ""
-
-msgid "edit"
-msgstr ""
-
-msgid "get"
-msgstr ""
-
-msgid "del"
-msgstr ""
-
-msgid "N/A"
-msgstr ""
-
-msgid "Revision History"
-msgstr ""
-
-msgid "No log entries found."
-msgstr ""
-
-#, python-format
-msgid "Info for \"%s\""
-msgstr ""
-
-#, python-format
-msgid "Show \"%(title)s\""
-msgstr ""
-
-msgid "General Page Infos"
-msgstr ""
-
-#, python-format
-msgid "Show chart \"%(title)s\""
-msgstr ""
-
-msgid "Page hits and edits"
-msgstr ""
-
-msgid "You must login to add a quicklink."
-msgstr ""
-
-msgid "Your quicklink to this page has been removed."
-msgstr ""
-
-msgid "A quicklink to this page has been added for you."
-msgstr ""
-
-msgid "You are not allowed to subscribe to a page you can't read."
-msgstr ""
-
-msgid "This wiki is not enabled for mail processing."
-msgstr ""
-
-msgid "You must log in to use subscribtions."
-msgstr ""
-
-msgid "Add your email address in your UserPreferences to use subscriptions."
-msgstr ""
-
-msgid "Your subscribtion to this page has been removed."
-msgstr ""
-
-msgid "Can't remove regular expression subscription!"
-msgstr ""
-
-msgid "Edit the subscription regular expressions in your UserPreferences."
-msgstr ""
-
-msgid "You have been subscribed to this page."
-msgstr ""
-
-msgid "Charts are not available!"
-msgstr ""
-
-msgid "You need to provide a chart type!"
-msgstr ""
-
-#, python-format
-msgid "Bad chart type \"%s\"!"
-msgstr ""
-
-msgid "This page is already deleted or was never created!"
-msgstr ""
-
-#, python-format
-msgid "No pages like \"%s\"!"
-msgstr ""
-
-#, python-format
-msgid "Invalid filename \"%s\"!"
-msgstr ""
-
-#, python-format
-msgid "Attachment '%(target)s' (remote name '%(filename)s') already exists."
-msgstr ""
-
-#, python-format
-msgid "Created the package %s containing the pages %s."
-msgstr ""
-
-msgid "Package pages"
-msgstr ""
-
-msgid "Package name"
-msgstr ""
-
-msgid "List of page names - separated by a comma"
-msgstr ""
-
-#, python-format
-msgid "Unknown user name: {{{\"%s\"}}}. Please enter user name and password."
-msgstr ""
-
-msgid "Missing password. Please enter user name and password."
-msgstr ""
-
-msgid "Sorry, wrong password."
-msgstr ""
-
-#, python-format
-msgid "Exactly one page like \"%s\" found, redirecting to page."
-msgstr ""
-
-#, python-format
-msgid "Pages like \"%s\""
-msgstr ""
-
-#, python-format
-msgid "%(matchcount)d %(matches)s for \"%(title)s\""
-msgstr ""
-
-#, python-format
-msgid "Local Site Map for \"%s\""
-msgstr ""
-
-msgid "Please log in first."
-msgstr ""
-
-msgid "Please first create a homepage before creating additional pages."
-msgstr ""
-
-#, python-format
-msgid ""
-"You can add some additional sub pages to your already existing homepage "
-"here.\n"
-"\n"
-"You can choose how open to other readers or writers those pages shall be,\n"
-"access is controlled by group membership of the corresponding group page.\n"
-"\n"
-"Just enter the sub page's name and click on the button to create a new "
-"page.\n"
-"\n"
-"Before creating access protected pages, make sure the corresponding group "
-"page\n"
-"exists and has the appropriate members in it. Use HomepageGroupsTemplate for "
-"creating\n"
-"the group pages.\n"
-"\n"
-"||'''Add a new personal page:'''||'''Related access control list "
-"group:'''||\n"
-"||[[NewPage(HomepageReadWritePageTemplate,read-write page,%(username)s)]]||"
-"[\"%(username)s/ReadWriteGroup\"]||\n"
-"||[[NewPage(HomepageReadPageTemplate,read-only page,%(username)s)]]||[\"%"
-"(username)s/ReadGroup\"]||\n"
-"||[[NewPage(HomepagePrivatePageTemplate,private page,%(username)s)]]||%"
-"(username)s only||\n"
-"\n"
-msgstr ""
-
-msgid "MyPages management"
-msgstr ""
-
-msgid "Rename Page"
-msgstr ""
-
-msgid "New name"
-msgstr ""
-
-msgid "Optional reason for the renaming"
-msgstr ""
-
-#, python-format
-msgid "(including %(localwords)d %(pagelink)s)"
-msgstr ""
-
-#, python-format
-msgid ""
-"The following %(badwords)d words could not be found in the dictionary of %"
-"(totalwords)d words%(localwords)s and are highlighted below:"
-msgstr ""
-
-msgid "Add checked words to dictionary"
-msgstr ""
-
-msgid "No spelling errors found!"
-msgstr ""
-
-msgid "You can't check spelling on a page you can't read."
-msgstr ""
-
-#, python-format
-msgid "Please use a more selective search term instead of {{{\"%s\"}}}"
-msgstr ""
-
-#, python-format
-msgid "Title Search: \"%s\""
-msgstr ""
-
-#, python-format
-msgid "Full Text Search: \"%s\""
-msgstr ""
-
-#, python-format
-msgid "Full Link List for \"%s\""
-msgstr ""
-
-msgid ""
-"Cannot create a new page without a page name.  Please specify a page name."
-msgstr ""
-
-msgid "Pages"
-msgstr ""
-
-msgid "Select Author"
-msgstr ""
-
-msgid "Revert all!"
-msgstr ""
-
-msgid "You are not allowed to use this action."
-msgstr ""
-
-#, python-format
-msgid "Subscribe users to the page %s"
-msgstr ""
-
-#, python-format
-msgid "Subscribed for %s:"
-msgstr ""
-
-msgid "Not a user:"
-msgstr ""
-
-msgid "You are not allowed to perform this action."
-msgstr ""
-
-msgid "You are now logged out."
-msgstr ""
-
-msgid "Delete"
-msgstr ""
-
-msgid "Optional reason for the deletion"
-msgstr ""
-
-msgid "Really delete this page?"
-msgstr ""
-
-#, python-format
-msgid ""
-"Restored Backup: %(filename)s to target dir: %(targetdir)s.\n"
-"Files: %(filecount)d, Directories: %(dircount)d"
-msgstr ""
-
-#, python-format
-msgid "Restoring backup: %(filename)s to target dir: %(targetdir)s failed."
-msgstr ""
-
-msgid "Wiki Backup / Restore"
-msgstr ""
-
-msgid ""
-"Some hints:\n"
-" * To restore a backup:\n"
-"  * Restoring a backup will overwrite existing data, so be careful.\n"
-"  * Rename it to <siteid>.tar.<compression> (remove the --date--time--UTC "
-"stuff).\n"
-"  * Put the backup file into the backup_storage_dir (use scp, ftp, ...).\n"
-"  * Hit the [[GetText(Restore)]] button below.\n"
-"\n"
-" * To make a backup, just hit the [[GetText(Backup)]] button and save the "
-"file\n"
-"   you get to a secure place.\n"
-"\n"
-"Please make sure your wiki configuration backup_* values are correct and "
-"complete.\n"
-"\n"
-msgstr ""
-
-msgid "Backup"
-msgstr ""
-
-msgid "Restore"
-msgstr ""
-
-msgid "You are not allowed to do remote backup."
-msgstr ""
-
-#, python-format
-msgid "Unknown backup subaction: %s."
-msgstr ""
-
 #, python-format
 msgid "[%d attachments]"
 msgstr ""
@@ -1067,6 +655,18 @@
 "since this is subject to change and can break easily."
 msgstr ""
 
+msgid "del"
+msgstr ""
+
+msgid "get"
+msgstr ""
+
+msgid "edit"
+msgstr ""
+
+msgid "view"
+msgstr ""
+
 msgid "unzip"
 msgstr ""
 
@@ -1146,6 +746,10 @@
 msgstr ""
 
 #, python-format
+msgid "Attachment '%(target)s' (remote name '%(filename)s') already exists."
+msgstr ""
+
+#, python-format
 msgid "Attachment '%(filename)s' deleted."
 msgstr ""
 
@@ -1192,6 +796,9 @@
 msgid "Modified"
 msgstr ""
 
+msgid "Size"
+msgstr "الحجم"
+
 msgid "Unknown file type, cannot display this attachment inline."
 msgstr ""
 
@@ -1199,6 +806,390 @@
 msgid "attachment:%(filename)s of %(pagename)s"
 msgstr ""
 
+msgid "Delete"
+msgstr ""
+
+msgid "This page is already deleted or was never created!"
+msgstr ""
+
+msgid "Optional reason for the deletion"
+msgstr ""
+
+msgid "Really delete this page?"
+msgstr ""
+
+msgid "Editor"
+msgstr "المحرر"
+
+msgid "Pages"
+msgstr ""
+
+msgid "Select Author"
+msgstr ""
+
+msgid "Revert all!"
+msgstr ""
+
+msgid "You are not allowed to use this action."
+msgstr ""
+
+#, python-format
+msgid "No pages like \"%s\"!"
+msgstr ""
+
+#, python-format
+msgid "Exactly one page like \"%s\" found, redirecting to page."
+msgstr ""
+
+#, python-format
+msgid "Pages like \"%s\""
+msgstr ""
+
+#, python-format
+msgid "%(matchcount)d %(matches)s for \"%(title)s\""
+msgstr ""
+
+msgid "match"
+msgstr ""
+
+msgid "matches"
+msgstr ""
+
+#, python-format
+msgid "Local Site Map for \"%s\""
+msgstr ""
+
+msgid "Please log in first."
+msgstr ""
+
+msgid "Please first create a homepage before creating additional pages."
+msgstr ""
+
+#, python-format
+msgid ""
+"You can add some additional sub pages to your already existing homepage "
+"here.\n"
+"\n"
+"You can choose how open to other readers or writers those pages shall be,\n"
+"access is controlled by group membership of the corresponding group page.\n"
+"\n"
+"Just enter the sub page's name and click on the button to create a new "
+"page.\n"
+"\n"
+"Before creating access protected pages, make sure the corresponding group "
+"page\n"
+"exists and has the appropriate members in it. Use HomepageGroupsTemplate for "
+"creating\n"
+"the group pages.\n"
+"\n"
+"||'''Add a new personal page:'''||'''Related access control list "
+"group:'''||\n"
+"||[[NewPage(HomepageReadWritePageTemplate,read-write page,%(username)s)]]||"
+"[\"%(username)s/ReadWriteGroup\"]||\n"
+"||[[NewPage(HomepageReadPageTemplate,read-only page,%(username)s)]]||[\"%"
+"(username)s/ReadGroup\"]||\n"
+"||[[NewPage(HomepagePrivatePageTemplate,private page,%(username)s)]]||%"
+"(username)s only||\n"
+"\n"
+msgstr ""
+
+msgid "MyPages management"
+msgstr ""
+
+#, python-format
+msgid "Invalid filename \"%s\"!"
+msgstr ""
+
+#, python-format
+msgid "Created the package %s containing the pages %s."
+msgstr ""
+
+msgid "Package pages"
+msgstr ""
+
+msgid "Package name"
+msgstr ""
+
+msgid "List of page names - separated by a comma"
+msgstr ""
+
+msgid "Rename Page"
+msgstr ""
+
+msgid "New name"
+msgstr ""
+
+msgid "Optional reason for the renaming"
+msgstr ""
+
+#, python-format
+msgid "(including %(localwords)d %(pagelink)s)"
+msgstr ""
+
+#, python-format
+msgid ""
+"The following %(badwords)d words could not be found in the dictionary of %"
+"(totalwords)d words%(localwords)s and are highlighted below:"
+msgstr ""
+
+msgid "Add checked words to dictionary"
+msgstr ""
+
+msgid "No spelling errors found!"
+msgstr ""
+
+msgid "You can't check spelling on a page you can't read."
+msgstr ""
+
+#, python-format
+msgid "Subscribe users to the page %s"
+msgstr ""
+
+#, python-format
+msgid "Subscribed for %s:"
+msgstr ""
+
+msgid "Not a user:"
+msgstr ""
+
+msgid "You are not allowed to perform this action."
+msgstr ""
+
+msgid "Do it."
+msgstr "نفذ."
+
+#, python-format
+msgid "Execute action %(actionname)s?"
+msgstr "نفذ عملية %(actionname)s?"
+
+#, python-format
+msgid "Action %(actionname)s is excluded in this wiki!"
+msgstr "لا يسمح للويكي بتنفيذ عملية %(actionname)s!"
+
+#, python-format
+msgid "You are not allowed to use action %(actionname)s on this page!"
+msgstr "لا يسمح لك باستخدام عملية %(actionname)s في هذه الصفحة!"
+
+#, python-format
+msgid "Please use the interactive user interface to use action %(actionname)s!"
+msgstr ""
+
+msgid "You are not allowed to revert this page!"
+msgstr "!لا يسمح لك بالعودة إلى هذه الصفحة"
+
+msgid "No older revisions available!"
+msgstr ""
+
+#, python-format
+msgid "Diff for \"%s\""
+msgstr ""
+
+#, python-format
+msgid "Differences between revisions %d and %d"
+msgstr "الاختلافات بين نسخة %d و نسخة %d"
+
+#, python-format
+msgid "(spanning %d versions)"
+msgstr "التمديد ل %d نسخ"
+
+msgid "No differences found!"
+msgstr "لا توجد الاختلافات!"
+
+#, python-format
+msgid "The page was saved %(count)d times, though!"
+msgstr ""
+
+msgid "(ignoring whitespace)"
+msgstr ""
+
+msgid "Ignore changes in the amount of whitespace"
+msgstr ""
+
+msgid "General Information"
+msgstr ""
+
+#, python-format
+msgid "Page size: %d"
+msgstr ""
+
+msgid "SHA digest of this page's content is:"
+msgstr ""
+
+msgid "The following users subscribed to this page:"
+msgstr ""
+
+msgid "This page links to the following pages:"
+msgstr ""
+
+msgid "Date"
+msgstr "التاريخ"
+
+msgid "Diff"
+msgstr ""
+
+msgid "Comment"
+msgstr ""
+
+msgid "raw"
+msgstr ""
+
+msgid "print"
+msgstr ""
+
+msgid "revert"
+msgstr ""
+
+#, python-format
+msgid "Revert to revision %(rev)d."
+msgstr ""
+
+msgid "N/A"
+msgstr ""
+
+msgid "Revision History"
+msgstr ""
+
+msgid "No log entries found."
+msgstr ""
+
+#, python-format
+msgid "Info for \"%s\""
+msgstr ""
+
+#, python-format
+msgid "Show \"%(title)s\""
+msgstr ""
+
+msgid "General Page Infos"
+msgstr ""
+
+#, python-format
+msgid "Show chart \"%(title)s\""
+msgstr ""
+
+msgid "Page hits and edits"
+msgstr ""
+
+msgid "You must login to add a quicklink."
+msgstr ""
+
+msgid "Your quicklink to this page has been removed."
+msgstr ""
+
+msgid "A quicklink to this page has been added for you."
+msgstr ""
+
+msgid "You are not allowed to subscribe to a page you can't read."
+msgstr ""
+
+msgid "This wiki is not enabled for mail processing."
+msgstr ""
+
+msgid "You must log in to use subscribtions."
+msgstr ""
+
+msgid "Add your email address in your UserPreferences to use subscriptions."
+msgstr ""
+
+msgid "Your subscribtion to this page has been removed."
+msgstr ""
+
+msgid "Can't remove regular expression subscription!"
+msgstr ""
+
+msgid "Edit the subscription regular expressions in your UserPreferences."
+msgstr ""
+
+msgid "You have been subscribed to this page."
+msgstr ""
+
+msgid "Charts are not available!"
+msgstr ""
+
+msgid "You need to provide a chart type!"
+msgstr ""
+
+#, python-format
+msgid "Bad chart type \"%s\"!"
+msgstr ""
+
+#, python-format
+msgid ""
+"Restored Backup: %(filename)s to target dir: %(targetdir)s.\n"
+"Files: %(filecount)d, Directories: %(dircount)d"
+msgstr ""
+
+#, python-format
+msgid "Restoring backup: %(filename)s to target dir: %(targetdir)s failed."
+msgstr ""
+
+msgid "Wiki Backup / Restore"
+msgstr ""
+
+msgid ""
+"Some hints:\n"
+" * To restore a backup:\n"
+"  * Restoring a backup will overwrite existing data, so be careful.\n"
+"  * Rename it to <siteid>.tar.<compression> (remove the --date--time--UTC "
+"stuff).\n"
+"  * Put the backup file into the backup_storage_dir (use scp, ftp, ...).\n"
+"  * Hit the [[GetText(Restore)]] button below.\n"
+"\n"
+" * To make a backup, just hit the [[GetText(Backup)]] button and save the "
+"file\n"
+"   you get to a secure place.\n"
+"\n"
+"Please make sure your wiki configuration backup_* values are correct and "
+"complete.\n"
+"\n"
+msgstr ""
+
+msgid "Backup"
+msgstr ""
+
+msgid "Restore"
+msgstr ""
+
+msgid "You are not allowed to do remote backup."
+msgstr ""
+
+#, python-format
+msgid "Unknown backup subaction: %s."
+msgstr ""
+
+#, python-format
+msgid "Please use a more selective search term instead of {{{\"%s\"}}}"
+msgstr ""
+
+#, python-format
+msgid "Title Search: \"%s\""
+msgstr ""
+
+#, python-format
+msgid "Full Text Search: \"%s\""
+msgstr ""
+
+#, python-format
+msgid "Full Link List for \"%s\""
+msgstr ""
+
+#, python-format
+msgid "Unknown user name: {{{\"%s\"}}}. Please enter user name and password."
+msgstr ""
+
+msgid "Missing password. Please enter user name and password."
+msgstr ""
+
+msgid "Sorry, login failed."
+msgstr ""
+
+msgid "You are now logged out."
+msgstr ""
+
+msgid ""
+"Cannot create a new page without a page name.  Please specify a page name."
+msgstr ""
+
 #, python-format
 msgid "Upload new attachment \"%(filename)s\""
 msgstr ""
@@ -1289,39 +1280,12 @@
 msgid "SpellCheck"
 msgstr ""
 
-msgid "Search Titles"
-msgstr ""
-
-msgid "Display context of search results"
-msgstr ""
-
-msgid "Case-sensitive searching"
-msgstr ""
-
-msgid "Search Text"
-msgstr ""
-
-msgid "Go To Page"
-msgstr ""
-
-msgid "Include system pages"
-msgstr ""
-
-msgid "Exclude system pages"
-msgstr ""
-
-msgid "Plain title index"
-msgstr ""
-
-msgid "XML title index"
+#, python-format
+msgid "Invalid include arguments \"%s\"!"
 msgstr ""
 
 #, python-format
-msgid "ERROR in regex '%s'"
-msgstr ""
-
-#, python-format
-msgid "Bad timestamp '%s'"
+msgid "Nothing found for \"%s\"!"
 msgstr ""
 
 #, python-format
@@ -1390,40 +1354,123 @@
 msgid "[Bookmark reached]"
 msgstr ""
 
-msgid "Contents"
-msgstr ""
-
-msgid "No wanted pages in this wiki."
-msgstr ""
-
-#, python-format
-msgid "Invalid include arguments \"%s\"!"
-msgstr ""
-
-#, python-format
-msgid "Nothing found for \"%s\"!"
-msgstr ""
-
 msgid "Markup"
 msgstr ""
 
 msgid "Display"
 msgstr "العرض"
 
-msgid "Filename"
-msgstr "اسم الملف"
+msgid "Python Version"
+msgstr ""
 
-msgid ""
-"Rendering of reStructured text is not possible, please install docutils."
+msgid "MoinMoin Version"
+msgstr ""
+
+#, python-format
+msgid "Release %s [Revision %s]"
 msgstr ""
 
-msgid "**Maximum number of allowed includes exceeded**"
+msgid "4Suite Version"
+msgstr ""
+
+msgid "Number of pages"
+msgstr ""
+
+msgid "Number of system pages"
+msgstr ""
+
+msgid "Accumulated page sizes"
+msgstr ""
+
+#, python-format
+msgid "Disk usage of %(data_dir)s/pages/"
 msgstr ""
 
 #, python-format
-msgid "**Could not find the referenced page: %s**"
+msgid "Disk usage of %(data_dir)s/"
+msgstr ""
+
+msgid "Entries in edit log"
+msgstr ""
+
+msgid "NONE"
+msgstr ""
+
+msgid "Global extension macros"
+msgstr ""
+
+msgid "Local extension macros"
+msgstr ""
+
+msgid "Global extension actions"
+msgstr ""
+
+msgid "Local extension actions"
+msgstr ""
+
+msgid "Global parsers"
+msgstr ""
+
+msgid "Local extension parsers"
+msgstr ""
+
+msgid "Disabled"
+msgstr ""
+
+msgid "Enabled"
+msgstr ""
+
+msgid "Xapian search"
+msgstr ""
+
+msgid "Active threads"
+msgstr ""
+
+msgid "Contents"
 msgstr ""
 
+msgid "Include system pages"
+msgstr ""
+
+msgid "Exclude system pages"
+msgstr ""
+
+msgid "No wanted pages in this wiki."
+msgstr ""
+
+msgid "Search Titles"
+msgstr ""
+
+msgid "Display context of search results"
+msgstr ""
+
+msgid "Case-sensitive searching"
+msgstr ""
+
+msgid "Search Text"
+msgstr ""
+
+msgid "Go To Page"
+msgstr ""
+
+#, python-format
+msgid "ERROR in regex '%s'"
+msgstr ""
+
+#, python-format
+msgid "Bad timestamp '%s'"
+msgstr ""
+
+#, python-format
+msgid "Connection to mailserver '%(server)s' failed: %(reason)s"
+msgstr ""
+
+msgid "Mail not sent"
+msgstr "لم يتم ارسال البريد"
+
+msgid "Mail sent OK"
+msgstr "تم ارسال البريد "
+
 #, python-format
 msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
 msgstr ""
@@ -1440,6 +1487,17 @@
 msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
 msgstr ""
 
+msgid ""
+"Rendering of reStructured text is not possible, please install Docutils."
+msgstr ""
+
+msgid "**Maximum number of allowed includes exceeded**"
+msgstr ""
+
+#, python-format
+msgid "**Could not find the referenced page: %s**"
+msgstr ""
+
 msgid "XSLT option disabled, please look at HelpOnConfiguration."
 msgstr ""
 
@@ -1450,6 +1508,18 @@
 msgid "%(errortype)s processing error"
 msgstr ""
 
+#, python-format
+msgid "You are not allowed to do %s on this page."
+msgstr ""
+
+msgid "Login and try again."
+msgstr "سجل الدخول و حاول مرة أخرى"
+
+#, python-format
+msgid ""
+"Sorry, can not save page because \"%(content)s\" is not allowed in this wiki."
+msgstr ""
+
 msgid "Views/day"
 msgstr ""
 
@@ -1631,11 +1701,6 @@
 msgid "User"
 msgstr "المستخدم"
 
-#, python-format
-msgid ""
-"Sorry, can not save page because \"%(content)s\" is not allowed in this wiki."
-msgstr ""
-
 msgid "Line"
 msgstr ""
 
@@ -1646,18 +1711,12 @@
 msgstr ""
 
 #, python-format
-msgid "Connection to mailserver '%(server)s' failed: %(reason)s"
+msgid "%(hits)d results out of about %(pages)d pages."
 msgstr ""
 
-msgid "Mail not sent"
-msgstr "لم يتم ارسال البريد"
-
-msgid "Mail sent OK"
-msgstr "تم ارسال البريد "
+#, python-format
+msgid "%.2f seconds"
+msgstr "%.2f ثانية"
 
-#, python-format
-msgid "You are not allowed to do %s on this page."
-msgstr ""
-
-msgid "Login and try again."
-msgstr "سجل الدخول و حاول مرة أخرى"
+#~ msgid "Filename"
+#~ msgstr "اسم الملف"
--- a/MoinMoin/i18n/fa.MoinMoin.po	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/i18n/fa.MoinMoin.po	Fri Aug 18 11:43:50 2006 +0200
@@ -11,7 +11,7 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: 1.5.0\n"
+"Project-Id-Version: 1.6.0\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2006-07-17 12:27+0200\n"
 "PO-Revision-Date: 2005-11-06 17:11+0330\n"
@@ -26,1978 +26,3944 @@
 "X-Language-in-English: Persian\n"
 
 msgid ""
+
 "The backed up content of this page is deprecated and will not be included in "
+
 "search results!"
+
 msgstr "نسخه های پشتیبان گرفته شده از این صفحه در نتایج جستجو نخواهند آمد!"
 
+
+
 #, python-format
+
 msgid "Revision %(rev)d as of %(date)s"
+
 msgstr "ویرایش %(rev)d در تاریخ %(date)s"
 
+
+
 #, python-format
+
 msgid "Redirected from page \"%(page)s\""
+
 msgstr "ارجاع از صفحه \"%(page)s\""
 
+
+
 #, python-format
+
 msgid "This page redirects to page \"%(page)s\""
+
 msgstr "این صفحه به صفحه \"%(page)s\" ارجاع دارد"
 
+
+
 #, python-format
+
 msgid ""
+
 "~-If you submit this form, the submitted values will be displayed.\n"
+
 "To use this form on other pages, insert a\n"
+
 "[[BR]][[BR]]'''{{{    [[Form(\"%(pagename)s\")]]}}}'''[[BR]][[BR]]\n"
+
 "macro call.-~\n"
+
 msgstr ""
+
 "~-در صورتی که این فرم را ثبت نمايید٬ مقادیر ثبت شده قابل رویت خواهند بود.\n"
+
 "برای استفاده از این فرم در صفحات دیگر از نمونه کد زیر استفاده نمايید.·a\n"
+
 "[[BR]][[BR]]'''{{{····[[Form(\"%(pagename)s\")]]}}}'''[[BR]][[BR]]\n"
+
 "-~\n"
 
+
+
 msgid "Create New Page"
+
 msgstr "ایجاد صفحه جدید"
 
+
+
 msgid "You are not allowed to view this page."
+
 msgstr "شما مجاز به مشاهده این صفحه نمی باشید"
 
+
+
 msgid "Your changes are not saved!"
+
 msgstr "تغییرات شما ذخیره نشد!"
 
+
+
 msgid "You are not allowed to edit this page."
+
 msgstr "شما مجاز به ویرایش این صفحه نمی باشید"
 
+
+
 msgid "Page is immutable!"
+
 msgstr "این صفحه غیر قابل ویرایش است!"
 
+
+
 msgid "Cannot edit old revisions!"
+
 msgstr "ویرایش های قبلی قابل ویرایش مجدد نمی باشند!"
 
+
+
 msgid "The lock you held timed out. Be prepared for editing conflicts!"
+
 msgstr "مدت زمان ویرایش شما به پایان رسیده است. آماده ویرایش مجدد باشید!"
 
+
+
 msgid "Page name is too long, try shorter name."
+
 msgstr "نام این صفحه طولانی است٬ لطفا نام کوتاه تری انتخاب نمایید."
 
+
+
 #, python-format
+
 msgid "Edit \"%(pagename)s\""
+
 msgstr "ویرایش \"%(pagename)s\""
 
+
+
 #, python-format
+
 msgid "Preview of \"%(pagename)s\""
+
 msgstr "پیش نمایش \"%(pagename)s\""
 
+
+
 #, python-format
+
 msgid "Your edit lock on %(lock_page)s has expired!"
+
 msgstr "زمان قفل ویرایش شما بر روی %(lock_page)s به پایان رسیده است!"
 
+
+
 #, python-format
+
 msgid "Your edit lock on %(lock_page)s will expire in # minutes."
+
 msgstr ""
+
 "زمان قفل ویرایش شما بر روی %(lock_page)s تا # دقیقه دیگر به پایان میرسد."
 
+
+
 #, python-format
+
 msgid "Your edit lock on %(lock_page)s will expire in # seconds."
+
 msgstr ""
+
 "زمان·قفل·ویرایش·شما·بر·روی·%(lock_page)s·تا·#·ثانیه·دیگر به·پایان·میرسد."
 
+
+
 msgid "Someone else deleted this page while you were editing!"
+
 msgstr "این صفحه در زمان ویرایش شما توسط شخص دیگری حذف شده است!"
 
+
+
 msgid "Someone else changed this page while you were editing!"
+
 msgstr "این صفحه در زمان ویرایش شما توسط شخص دیگری تغییر کرده است!"
 
+
+
 msgid ""
+
 "Someone else saved this page while you were editing!\n"
+
 "Please review the page and save then. Do not save this page as it is!"
+
 msgstr ""
+
 "این صفحه در زمان ویرایش شما توسط شخص دیگری ذخیره شده است!\n"
-"لطفا یک بار صفحه را مرور نموده و سپس ذخیره نمایید. این صفحه را همینگونه که "
-"هست ذخیره ننمایید!"
+
+"لطفا یک بار صفحه را مرور نموده و سپس ذخیره نمایید. این صفحه را همینگونه که هست ذخیره ننمایید!"
+
+
+
+
 
 #, python-format
+
 msgid "[Content of new page loaded from %s]"
+
 msgstr "[محتویات صفحه جدید از %s بارگذاری شد]"
 
+
+
 #, python-format
+
 msgid "[Template %s not found]"
+
 msgstr "[قالب %s یافت نشد]"
 
+
+
 #, python-format
+
 msgid "[You may not read %s]"
+
 msgstr "[شما نمی توانید %s را مطالعه نمایید]"
 
+
+
 #, python-format
+
 msgid "Describe %s here."
+
 msgstr "در مورد %s اینجا توضیح دهید."
 
+
+
 msgid "Check Spelling"
+
 msgstr "تصحیح املایی"
 
+
+
 msgid "Save Changes"
+
 msgstr "تغییرات ذخیره شود"
 
+
+
 msgid "Cancel"
+
 msgstr "لغو"
 
+
+
 #, python-format
+
 msgid ""
+
 "By hitting '''%(save_button_text)s''' you put your changes under the %"
+
 "(license_link)s.\n"
+
 "If you don't want that, hit '''%(cancel_button_text)s''' to cancel your "
+
 "changes."
+
 msgstr ""
+
 "با فشردن کلید '''%(save_button_text)s''' تغییرات شما تحت مجوز %(license_link)"
+
 "s اعمل میشوند.\n"
+
 "در صورت عدم تمایل٬ برای لغو تغییرات خود دکمه '''%(cancel_button_text)s''' را "
+
 "فشار دهید."
 
+
+
 msgid "Preview"
+
 msgstr "پیش نمایش"
 
+
+
 msgid "GUI Mode"
+
 msgstr "ویرایش گرافیکی"
 
+
+
 msgid "Comment:"
+
 msgstr "توضیحات:"
 
+
+
 msgid "<No addition>"
+
 msgstr "<طبقه بندی نشود>"
 
+
+
 #, python-format
+
 msgid "Add to: %(category)s"
+
 msgstr "به طبقه %(category)s اضافه شود"
 
+
+
 msgid "Trivial change"
+
 msgstr "تغییرات جزئی"
 
+
+
 msgid "Remove trailing whitespace from each line"
+
 msgstr "جاهای خالی را از هر خط حذف نما"
 
+
+
 msgid "Edit was cancelled."
+
 msgstr "ویرایش لغو شد."
 
+
+
 msgid "You can't rename to an empty pagename."
+
 msgstr "تغییر نام به یک صفحه بدون نام مجاز نیست."
 
+
+
 #, python-format
+
 msgid ""
+
 "'''A page with the name {{{'%s'}}} already exists.'''\n"
+
 "\n"
+
 "Try a different name."
+
 msgstr ""
+
 "'''صفحه ای با نام {{{'%s'}}} وجود دارد.'''\n"
+
 "\n"
+
 "لطفا نام دیگری انتخاب نمایید."
 
+
+
 #, python-format
+
 msgid "Could not rename page because of file system error: %s."
+
 msgstr "بدلیل ایراد سیستمی %s نام صفحه تغییر نکرد."
 
+
+
 msgid "Thank you for your changes. Your attention to detail is appreciated."
+
 msgstr "تغییرات مورد نظر شما اعمال شد."
 
+
+
 #, python-format
+
 msgid "Page \"%s\" was successfully deleted!"
+
 msgstr "صفحه \"%s\" با موفقیت حذف شد!"
 
+
+
 #, python-format
+
 msgid ""
+
 "Dear Wiki user,\n"
+
 "\n"
+
 "You have subscribed to a wiki page or wiki category on \"%(sitename)s\" for "
+
 "change notification.\n"
+
 "\n"
+
 "The following page has been changed by %(editor)s:\n"
+
 "%(pagelink)s\n"
+
 "\n"
+
 msgstr ""
+
 "کاربر گرامی٬\n"
+
 "\n"
+
 "شما در صفحه یا طبقه بندی \"%(sitename)s\" برای اطلاع از تغییرات صورت گرفته "
+
 "عضو می باشید\n"
+
 "این صفحه توسط %(editor)s ویرایش شده است:\n"
+
 "%(pagelink)s\n"
+
 "\n"
 
+
+
 #, python-format
+
 msgid ""
+
 "The comment on the change is:\n"
+
 "%(comment)s\n"
+
 "\n"
+
 msgstr ""
+
 "نظرات در مورد تغییر صورت گرفته:\n"
+
 "%(comment)s\n"
+
 "\n"
 
+
+
 msgid "New page:\n"
+
 msgstr "صفحه جدید:\n"
 
+
+
 msgid "No differences found!\n"
+
 msgstr "تغییری مشاهده نشد!\n"
 
+
+
 #, python-format
+
 msgid "[%(sitename)s] %(trivial)sUpdate of \"%(pagename)s\" by %(username)s"
+
 msgstr ""
+
 "بروزآوری %(trivial)s های سایت [%(sitename)s] در صفحه \"%(pagename)s\" توسط %"
+
 "(username)s"
 
+
+
 msgid "Trivial "
+
 msgstr "جزئی"
 
+
+
 msgid "Status of sending notification mails:"
+
 msgstr "وضعیت ارسال ایمیل های آگاه سازی:"
 
+
+
 #, python-format
+
 msgid "[%(lang)s] %(recipients)s: %(status)s"
+
 msgstr "[%(lang)s]·%(recipients)s:·%(status)s"
 
+
+
 #, python-format
+
 msgid "## backup of page \"%(pagename)s\" submitted %(date)s"
+
 msgstr "## نسخه پشتیبان صفحه \"%(pagename)s\" در تاریخ %(date)s ثبت شد"
 
+
+
 #, python-format
+
 msgid "Page could not get locked. Unexpected error (errno=%d)."
+
 msgstr "این صفحه قفل ویرایش نشد. خطا (errno=%d)."
 
+
+
 msgid "Page could not get locked. Missing 'current' file?"
+
 msgstr "صفحه قفل ویرایش نشد. فایل جاری از دست رفته است؟"
 
+
+
 msgid "You are not allowed to edit this page!"
+
 msgstr "شما مجاز به ویرایش این صفحه نمی باشید!"
 
+
+
 msgid "You cannot save empty pages."
+
 msgstr "ذخیره صفحات خالی مجاز نیست."
 
+
+
 msgid "You already saved this page!"
+
 msgstr "صفحه ذخیره شده است!"
 
+
+
 msgid "You already edited this page! Please do not use the back button."
-msgstr ""
-"شما هم اکنون این صفحه را ویرایش نموده اید! لطفا از دکمه back استفاده ننمائید."
+
+msgstr "شما هم اکنون این صفحه را ویرایش نموده اید! لطفا از دکمه back استفاده ننمائید."
+
+
 
 #, python-format
+
 msgid "A backup of your changes is [%(backup_url)s here]."
+
 msgstr ""
+
 "نسخه پشتیبان از تغییراتی که شما اعمال نموده اید [%(backup_url)s·اینجا] ذخیره "
+
 "شده است."
 
+
+
 msgid "You did not change the page content, not saved!"
+
 msgstr "تغییری از طرف شما اعمال نشد٬ چیزی ذخیره نشد!"
 
+
+
 msgid ""
+
 "You can't change ACLs on this page since you have no admin rights on it!"
+
 msgstr ""
+
 "شما مجاز به تغییر ACL یا مجوزهای دسترسی در این صفحه نمی باشید. این کار نیاز "
+
 "به سطح دسترسی مدیر دارد!"
 
+
+
 #, python-format
+
 msgid ""
+
 "The lock of %(owner)s timed out %(mins_ago)d minute(s) ago, and you were "
+
 "granted the lock for this page."
+
 msgstr ""
+
 "زمان قفل ویرایش %(owner)s حدود %(mins_ago)d دقیقه پیش منقضی شده و قفل ویرایش "
+
 "این صفحه در اختیار شما می باشد."
 
+
+
 #, python-format
+
 msgid ""
+
 "Other users will be ''blocked'' from editing this page until %(bumptime)s."
+
 msgstr "سایر کاربران تا %(bumptime)s دیگر مجاز به تغییر این صفحه نخواهند بود."
 
+
+
 #, python-format
+
 msgid ""
+
 "Other users will be ''warned'' until %(bumptime)s that you are editing this "
+
 "page."
+
 msgstr ""
+
 "سایر کاربران تا %(bumptime)s دیگر پیغامی مبنی بر اینکه شما در حال ویرایش این "
+
 "صفحه می باشید دریافت خواهند نمود."
 
+
+
 msgid "Use the Preview button to extend the locking period."
+
 msgstr "جهت تمدید مدت زمان قفل ویرایش دکمه پیش نمایش را فشار دهید."
 
+
+
 #, python-format
+
 msgid ""
+
 "This page is currently ''locked'' for editing by %(owner)s until %(timestamp)"
+
 "s, i.e. for %(mins_valid)d minute(s)."
+
 msgstr ""
+
 "این صفحه توسط %(owner)s تا %(timestamp)s دیگر بدلیل در حال ویرایش بودن قفل "
+
 "شده است. مدت قفل %(mins_valid)d دقیقه."
 
+
+
 #, python-format
+
 msgid ""
+
 "This page was opened for editing or last previewed at %(timestamp)s by %"
+
 "(owner)s.[[BR]]\n"
+
 "'''You should ''refrain from editing'' this page for at least another %"
+
 "(mins_valid)d minute(s),\n"
+
 "to avoid editing conflicts.'''[[BR]]\n"
+
 "To leave the editor, press the Cancel button."
+
 msgstr ""
+
 "این صفحه برای پیش نمایش و یا ویرایش در %(timestamp)s توسط %(owner)s.[[BR]]\n"
+
 "باز شده است.برای جلوگیری از ناسازگاریهای ناخواسته٬ از ویرایش این صفحه حداقل "
+
 "تا %(mins_valid)d·دقیقه(s),\n"
+
 "دیگر خودداری نمایید.'''[[BR]]\n"
+
 "برای خروج از محیط ویرایش دکمه لغو را فشار دهید."
 
+
+
 msgid "<unknown>"
+
 msgstr "<نامشخص>"
 
+
+
 msgid "Text mode"
+
 msgstr "ویرایش متنی"
 
+
+
 #, python-format
+
 msgid ""
+
 "Login Name: %s\n"
+
 "\n"
+
 "Login Password: %s\n"
+
 "\n"
+
 "Login URL: %s/%s?action=login\n"
+
 msgstr ""
+
 "نام کاربری: %s\n"
+
 "\n"
+
 "کلمه عبور: %s\n"
+
 "\n"
+
 "آدرس ورود: %s/%s?action=login\n"
 
+
+
 msgid ""
+
 "Somebody has requested to submit your account data to this email address.\n"
+
 "\n"
+
 "If you lost your password, please use the data below and just enter the\n"
+
 "password AS SHOWN into the wiki's password form field (use copy and paste\n"
+
 "for that).\n"
+
 "\n"
+
 "After successfully logging in, it is of course a good idea to set a new and "
+
 "known password.\n"
+
 msgstr ""
+
 "شخصی درخواست نموده است تا اطلاعات کاربری شما به این آدرس ایمیل ارسال شود.\n"
+
 "\n"
+
 "در صورتی که کلمه عبور خود را فراموش نموده اید از اطلاعات زیر استفاده نموده و "
+
 "کلمه عبور را به صورتی که ذکر شده در قسمت کلمه عبور بنویسید.\n"
+
 "\n"
+
 "پس از ورود به سیستم می توانید کلمه عبور خود را تغییر دهید.\n"
 
+
+
 #, python-format
+
 msgid "[%(sitename)s] Your wiki account data"
+
 msgstr "[%(sitename)s] اطلاعات مربوط به حساب کاربری شما"
 
+
+
 msgid ""
+
 " Emphasis:: [[Verbatim('')]]''italics''[[Verbatim('')]]; [[Verbatim"
+
 "(''')]]'''bold'''[[Verbatim(''')]]; [[Verbatim(''''')]]'''''bold "
+
 "italics'''''[[Verbatim(''''')]]; [[Verbatim('')]]''mixed ''[[Verbatim"
+
 "(''')]]'''''bold'''[[Verbatim(''')]] and italics''[[Verbatim('')]]; "
+
 "[[Verbatim(----)]] horizontal rule.\n"
+
 " Headings:: [[Verbatim(=)]] Title 1 [[Verbatim(=)]]; [[Verbatim(==)]] Title "
+
 "2 [[Verbatim(==)]]; [[Verbatim(===)]] Title 3 [[Verbatim(===)]];   [[Verbatim"
+
 "(====)]] Title 4 [[Verbatim(====)]]; [[Verbatim(=====)]] Title 5 [[Verbatim"
+
 "(=====)]].\n"
+
 " Lists:: space and one of: * bullets; 1., a., A., i., I. numbered items; 1."
+
 "#n start numbering at n; space alone indents.\n"
+
 " Links:: [[Verbatim(JoinCapitalizedWords)]]; [[Verbatim([\"brackets and "
+
 "double quotes\"])]]; url; [url]; [url label].\n"
+
 " Tables:: || cell text |||| cell text spanning 2 columns ||;    no trailing "
+
 "white space allowed after tables or titles.\n"
+
 "\n"
+
 "(!) For more help, see HelpOnEditing or SyntaxReference.\n"
+
 msgstr ""
+
 " پررنگ و مورب سازی:: [[Verbatim('')]]''مورب سازی''[[Verbatim('')]]; "
+
 "[[Verbatim(''')]]'''پررنگ'''[[Verbatim(''')]]; [[Verbatim(''''')]]'''''پررنگ "
+
 "و مورب'''''[[Verbatim(''''')]]; [[Verbatim('')]]''مخلوط ''[[Verbatim"
+
 "(''')]]'''''پررنگ'''[[Verbatim(''')]] و مورب''[[Verbatim('')]]; [[Verbatim"
+
 "(----)]] خط افقی زیر پاراگراف.\n"
+
 " عنوان ها:: [[Verbatim(=)]] عنوان ۱ [[Verbatim(=)]]; [[Verbatim(==)]] عنوان "
+
 "۲ [[Verbatim(==)]]; [[Verbatim(===)]] عنوان ۳ [[Verbatim(===)]];   [[Verbatim"
+
 "(====)]] عنوان ۴ [[Verbatim(====)]]; [[Verbatim(=====)]] عنوان ۵ [[Verbatim"
+
 "(=====)]].\n"
+
 " لیستها:: یک فاصله در ابتدای خط و سپس یکی از کاراکترهای: * برای لیست گلوله "
+
 "ای و 1, a, A, i, I برای لیستهای عددی و آیتمی. \n"
+
 " لینکها:: [[Verbatim(آدرس های اینترنتی در این سایت با حروف بزرگ شروع میشوند٬ "
+
 "این کلمات را جدا از هم ننویسید.)]]; [[Verbatim([\"براکت و دو علامت quote"
+
 "\"])]]; آدرس اینترنتی; [آدرس اینترنتی]; [برچسب آدرس اینترنتی].\n"
+
 " جدولها:: || متن درون یک سلول جدول |||| متن درون یک سلول با دو ستون ||;     "
+
 "پس از جدول ها و عنوان ها نباید فاصله خالی بگذارید.\n"
+
 "\n"
+
 "(!) برای راهنمایی بیشتر HelpOnEditing و یا SyntaxReference را ببینید.\n"
 
+
+
 msgid ""
+
 "Emphasis: <i>*italic*</i> <b>**bold**</b> ``monospace``<br/>\n"
+
 "<br/><pre>\n"
+
 "Headings: Heading 1  Heading 2  Heading 3\n"
+
 "          =========  ---------  ~~~~~~~~~\n"
+
 "\n"
+
 "Horizontal rule: ---- \n"
+
 "Links: TrailingUnderscore_ `multi word with backticks`_ external_ \n"
+
 "\n"
+
 ".. _external: http://external-site.net/foo/\n"
+
 "\n"
+
 "Lists: * bullets; 1., a. numbered items.\n"
+
 "</pre>\n"
+
 "<br/>\n"
+
 "(!) For more help, see the \n"
+
 "<a href=\"http://docutils.sourceforge.net/docs/user/rst/quickref.html\">\n"
+
 "reStructuredText Quick Reference\n"
+
 "</a>.\n"
+
 msgstr ""
+
 "پررنگ: <i>*مورب سازی*</i> <b>**پررنگ**</b> ``monospace``<br/>\n"
+
 "<br/><pre>\n"
+
 "سرنویسها: سرنویس ۱  سرنویس ۲  سرنویس ۳\n"
+
 "          =========  ---------  ~~~~~~~~~\n"
+
 "\n"
+
 "خط افقی: ---- \n"
+
 "لینکها: TrailingUnderscore_ `multi word with backticks`_ external_ \n"
+
 "\n"
+
 ".. _external: http://external-site.net/foo/\n"
+
 "\n"
+
 "لیستها: * bullets; 1., a. numbered items.\n"
+
 "</pre>\n"
+
 "<br/>\n"
+
 "(!) برای راهنمایی بیشتر این صفحه را ببینید \n"
+
 "<a href=\"http://docutils.sourceforge.net/docs/user/rst/quickref.html\">\n"
+
 "reStructuredText Quick Reference\n"
+
 "</a>.\n"
 
+
+
 msgid "Diffs"
+
 msgstr "تغییرات"
 
+
+
 msgid "Info"
+
 msgstr "گزارشات"
 
+
+
 msgid "Edit"
+
 msgstr "ویرایش"
 
+
+
 msgid "UnSubscribe"
+
 msgstr "لغو عضویت"
 
+
+
 msgid "Subscribe"
+
 msgstr "عضویت"
 
+
+
 msgid "Raw"
+
 msgstr "متن خام"
 
+
+
 msgid "XML"
+
 msgstr "XML"
 
+
+
 msgid "Print"
+
 msgstr "چاپ"
 
+
+
 msgid "View"
+
 msgstr "مشاهده"
 
+
+
 msgid "Up"
+
 msgstr "بالا"
 
+
+
 msgid "Publish my email (not my wiki homepage) in author info"
+
 msgstr "لطفا در اطلاعات نویسنده آدرس ایمیل من را اصلاح نمایید"
 
+
+
 msgid "Open editor on double click"
+
 msgstr "ویرایشگر با دوبار کلیک باز شود"
 
-msgid "After login, jump to last visited page"
-msgstr "پس از ورود٬ به آخرین صفحه بازدید شده برو"
+msgid "Jump to last visited page instead of frontpage"
+
+msgstr "بجای صفحه اولیه به آخرین صفحه بازدید شده برو"
+
+
 
 msgid "Show question mark for non-existing pagelinks"
+
 msgstr "به جای لینک صفحه هایی که وجود ندارند علامت سوال بگذار"
 
+
+
 msgid "Show page trail"
+
 msgstr "دنبالک صفحه را نشان بده"
 
+
+
 msgid "Show icon toolbar"
+
 msgstr "نوار ابزار آیکونها را نشان بده"
 
+
+
 msgid "Show top/bottom links in headings"
+
 msgstr "لینکهای رفتن به بالا/پایین را در کنار لینکهای اصلی نشان بده"
 
+
+
 msgid "Show fancy diffs"
+
 msgstr "دکمه های تفاوتها را نشان بده"
 
+
+
 msgid "Add spaces to displayed wiki names"
+
 msgstr "بین نام ویکی های نمایش داده شده فاصله اضافه کن"
 
+
+
 msgid "Remember login information"
+
 msgstr "اطلاعات ورودی من را به خاطر بسپار"
 
+
+
 msgid "Subscribe to trivial changes"
+
 msgstr "عضویت در گزارش تغییرات جزئی"
 
+
+
 msgid "Disable this account forever"
+
 msgstr "این حساب کاربری را برای همیشه غیرفعال کن"
 
+
+
 msgid "Name"
+
 msgstr "نام کاربری"
 
+
+
 msgid "(Use Firstname''''''Lastname)"
+
 msgstr ""
+
 "(از نام '''''' و نام خانوادگی به زبان انگلیسی و طبق الگوی صحیح استفاده "
+
 "نمایید)"
 
+
+
 msgid "Alias-Name"
+
 msgstr "نام مستعار"
 
+
+
 msgid "Password"
+
 msgstr "کلمه عبور"
 
+
+
 msgid "Password repeat"
+
 msgstr "تکرار کلمه عبور"
 
+
+
 msgid "(Only for password change or new account)"
+
 msgstr "(فقط جهت تغییر کلمه عبور و یا ایجاد حساب کاربری جدید)"
 
+
+
 msgid "Email"
+
 msgstr "آدرس ایمیل"
 
+
+
 msgid "User CSS URL"
+
 msgstr "آدرس CSS کاربر"
 
+
+
 msgid "(Leave it empty for disabling user CSS)"
+
 msgstr "(جهت غیر فعال نمودن CSS کاربر٬ این قسمت را خالی بگذارید)"
 
+
+
 msgid "Editor size"
+
 msgstr "اندازه ویرایشگر"
 
+
+
 #, python-format
+
 msgid "The package needs a newer version of MoinMoin (at least %s)."
+
 msgstr "این بسته نیاز به MoinMoin نسخه جدیدتری دارد (نسخه %s یا بالاتر)."
 
+
+
 msgid "The theme name is not set."
+
 msgstr "قالب گرافیکی تنظیم نشده است."
 
+
+
 msgid "Installing theme files is only supported for standalone type servers."
+
 msgstr ""
+
 "نصب فایلهای قالب گرافیکی تنها در سرویس دهنده های standalone پشتیبانی میشود."
 
+
+
+#, python-format
+
+msgid "Installation of '%(filename)s' failed."
+
+msgstr "نصب فایل '%(filename)s' با ایراد مواجه شد."
+
+
+
+#, python-format
+
+msgid "The file %s is not a MoinMoin package file."
+
+msgstr "فایل %s از فایلهای  بسته MoinMoin نیست."
+
+
+
 #, python-format
-msgid "Installation of '%(filename)s' failed."
-msgstr "نصب فایل '%(filename)s' با ایراد مواجه شد."
-
-#, python-format
-msgid "The file %s is not a MoinMoin package file."
-msgstr "فایل %s از فایلهای  بسته MoinMoin نیست."
-
-#, python-format
+
 msgid "The page %s does not exist."
+
 msgstr "صفحه %s وجود ندارد."
 
+
+
 msgid "Invalid package file header."
+
 msgstr "بسته غیرمجاز."
 
+
+
 msgid "Package file format unsupported."
+
 msgstr "نوع فایل این بسته پشتیبانی نمیشود."
 
+
+
+#, python-format
+
+msgid "Unknown function %(func)s in line %(lineno)i."
+
+msgstr "تابع غیر مجاز %(func)s در خط %(lineno)i."
+
+
+
 #, python-format
-msgid "Unknown function %(func)s in line %(lineno)i."
-msgstr "تابع غیر مجاز %(func)s در خط %(lineno)i."
+
+msgid "The file %s was not found in the package."
+
+msgstr "فایل %s در بسته یافت نشد."
+
+
+
+#, python-format
+
+msgid "%(hits)d results out of about %(pages)d pages."
+
+msgstr "%(hits)d نتیجه بدست آمده حاصل از جستجوی %(pages)d صفحه"
+
+
 
 #, python-format
-msgid "The file %s was not found in the package."
-msgstr "فایل %s در بسته یافت نشد."
+
+msgid "%.2f seconds"
+
+msgstr "%.2f ثانیه"
+
+
+
+msgid "match"
+
+msgstr "نتیجه"
+
+
+
+msgid "matches"
+
+msgstr "نتایج"
+
+
 
 msgid ""
+
 "This wiki is not enabled for mail processing.\n"
+
 "Contact the owner of the wiki, who can enable email."
+
 msgstr ""
+
 "گزینه جابجایی ایمیل در این ویکی فعال نمی باشد.\n"
+
 "از مدیر ویکی بخواهید تا این امکان را فراهم نماید."
 
+
+
 msgid "Please provide a valid email address!"
+
 msgstr "لطفا یک آدرس ایمیل معتبر وارد نمایید!"
 
+
+
 #, python-format
+
 msgid "Found no account matching the given email address '%(email)s'!"
+
 msgstr "حساب کاربری با آدرس ایمیل '%(email)s' یافت نشد!"
 
+
+
 msgid "Use UserPreferences to change your settings or create an account."
+
 msgstr ""
+
 "جهت تغییر تنظیمات جاری و یا ایجاد یک حساب جدید از مرجع اطلاعات کاربری "
+
 "استفاده نمایید."
 
+
+
 msgid "Empty user name. Please enter a user name."
+
 msgstr "محل نام کاربری خالی است. لطفا یک نام کاربری وارد نمایید."
 
+
+
 #, python-format
+
 msgid ""
+
 "Invalid user name {{{'%s'}}}.\n"
+
 "Name may contain any Unicode alpha numeric character, with optional one\n"
+
 "space between words. Group page name is not allowed."
+
 msgstr ""
+
 "نام کاربری غیر قابل قبول {{{'%s'}}}.\n"
+
 "نام کاربری میتواند شامل کلیه کاراکترهای حرفی عددی Unicode با یک فاصله بین "
+
 "کلمات باشد.\n"
+
 "نام صفحات گروهی قابل قبول نیست."
 
+
+
 msgid "This user name already belongs to somebody else."
+
 msgstr "این نام کاربری توسط شخص دیگری ثبت شده است."
 
+
+
 msgid "Passwords don't match!"
+
 msgstr "کلمات عبور وارد شده یکی نیستند!"
 
+
+
 msgid "Please specify a password!"
+
 msgstr "لطفا یک کلمه عبور وارد نمایید!"
 
+
+
 msgid ""
+
 "Please provide your email address. If you lose your login information, you "
+
 "can get it by email."
+
 msgstr ""
+
 "لطفا آدرس ایمیل خود را وارد نمایید. در صورتی که اطلاعات حساب کاربری خود را "
+
 "فراموش کنید این اطلاعات برای شما ایمیل خواهند شد."
 
+
+
 msgid "This email already belongs to somebody else."
+
 msgstr "این ایمیل توسط شخص دیگری ثبت شده است."
 
+
+
 msgid "User account created! You can use this account to login now..."
+
 msgstr ""
+
 "حساب کاربری شما ایجاد شد! شما می توانید از این حساب کاربری برای ورود به "
+
 "سیستم استفاده نمائید..."
 
+
+
 msgid "Use UserPreferences to change settings of the selected user account"
+
 msgstr ""
+
 "از مرجع اطلاعات کاربری برای تغییر تنظیمات جاری و یا ایجاد یک حساب جدید "
+
 "استفاده نمایید."
 
+
+
 #, python-format
+
 msgid "The theme '%(theme_name)s' could not be loaded!"
+
 msgstr "قالب گرافیکی درخواستی شما '%(theme_name)s' قابل استفاده نمی باشد!"
 
+
+
 msgid "User preferences saved!"
+
 msgstr "اطلاعات کاربری شما ذخیره شد!"
 
+
+
 msgid "Default"
+
 msgstr "پیش گزینه"
 
+
+
 msgid "<Browser setting>"
+
 msgstr "<بر اساس تنظیمات مرورگر>"
 
+
+
 msgid "the one preferred"
+
 msgstr "گزینه ارجح"
 
+
+
 msgid "free choice"
+
 msgstr "گزینه آزاد"
 
+
+
 msgid "Select User"
+
 msgstr "انتخاب کاربر"
 
+
+
 msgid "Save"
+
 msgstr "ثبت"
 
+
+
 msgid "Preferred theme"
+
 msgstr "قالب گرافیکی ارجح"
 
+
+
 msgid "Editor Preference"
+
 msgstr "نوع ویرایشگر"
 
+
+
 msgid "Editor shown on UI"
+
 msgstr "ویرایشگر قابل نمایش در UI"
 
+
+
 msgid "Time zone"
+
 msgstr "موقعیت زمانی"
 
+
+
 msgid "Your time is"
+
 msgstr "ساعت به وقت شما"
 
+
+
 msgid "Server time is"
+
 msgstr "ساعت سرویس دهنده"
 
+
+
 msgid "Date format"
+
 msgstr "الگوی تاریخ"
 
+
+
 msgid "Preferred language"
+
 msgstr "زبان نمایش ویکی"
 
+
+
 msgid "General options"
+
 msgstr "گزینه های عمومی"
 
+
+
 msgid "Quick links"
+
 msgstr "لینکهای دسترسی سریع"
 
+
+
 msgid "This list does not work, unless you have entered a valid email address!"
+
 msgstr ""
+
 "این لیست تا زمانی که شما یک شما یک آدرس ایمیل معتبر وارد ننمایید کار نخواهد "
+
 "کرد!"
 
+
+
 msgid "Subscribed wiki pages (one regex per line)"
+
 msgstr "صفحات ویکی که در آنها عضو می باشید (یک صفحه در هر خط)"
 
+
+
 msgid "Create Profile"
+
 msgstr "ثبت کاربر جدید"
 
+
+
 msgid "Mail me my account data"
+
 msgstr "اطلاعات حساب من را ایمیل کن"
 
+
+
 #, python-format
+
 msgid ""
+
 "To create an account or recover a lost password, see the %(userprefslink)s "
+
 "page."
+
 msgstr ""
+
 "جهت ایجاد حساب کاربری جدید و یا بازیافت کلمه رمز خود صفحه %(userprefslink)s "
+
 "را ببینید."
 
+
+
 msgid "Login"
+
 msgstr "ورود"
 
+
+
 msgid "Action"
+
 msgstr "امکانات"
 
+
+
 #, python-format
+
 msgid "Expected \"=\" to follow \"%(token)s\""
+
 msgstr "به جای علامت \"=\" عبارت \"%(token)s\" مشاهده شد"
 
-#, python-format
-msgid "Expected a value for key \"%(token)s\""
-msgstr "عبارت \"%(token)s\" در اینجا صحیح نیست"
-
-#, python-format
-msgid "[%d attachments]"
-msgstr "[%d·attachments]"
+
 
 #, python-format
-msgid ""
-"There are <a href=\"%(link)s\">%(count)s attachment(s)</a> stored for this "
-"page."
-msgstr "این صفحه  دارای <a·href=\"%(link)s\">%(count)s·ضمیمه</a> می باشد."
-
-msgid "Filename of attachment not specified!"
-msgstr "نام فایل ضمیمه مشخص نشده است!"
+
+msgid "Expected a value for key \"%(token)s\""
+
+msgstr "عبارت \"%(token)s\" در اینجا صحیح نیست"
+
+
 
 #, python-format
-msgid "Attachment '%(filename)s' does not exist!"
-msgstr "ضمیمه '%(filename)s' وجود ندارد!"
+
+msgid "[%d attachments]"
+
+msgstr "[%d·attachments]"
+
+
+
+#, python-format
 
 msgid ""
-"To refer to attachments on a page, use '''{{{attachment:filename}}}''', \n"
-"as shown below in the list of files. \n"
-"Do '''NOT''' use the URL of the {{{[get]}}} link, \n"
-"since this is subject to change and can break easily."
-msgstr ""
-"جهت آدرس دهی به ضمیمه موجود در یک صفحه٬ از عبارت '''{{{ضمیمه:نام فایل}}}''' "
-"استفاده نمایید.\n"
-"همینگونه که در زیر در قسمت لیست فایل ها نشان داده شده است از لینک آدرس "
-"{{{[get]}}} استفاده ننمایید."
-
-msgid "del"
-msgstr "حذف"
-
-msgid "get"
-msgstr "دریافت"
-
-msgid "edit"
-msgstr "ویرایش"
-
-msgid "view"
-msgstr "نمایش"
-
-msgid "unzip"
-msgstr "فایل فشرده بار شود"
-
-msgid "install"
-msgstr "نصب"
+
+"There are <a href=\"%(link)s\">%(count)s attachment(s)</a> stored for this "
+
+"page."
+
+msgstr "این صفحه  دارای <a·href=\"%(link)s\">%(count)s·ضمیمه</a> می باشد."
+
+
+
+msgid "Filename of attachment not specified!"
+
+msgstr "نام فایل ضمیمه مشخص نشده است!"
+
+
 
 #, python-format
-msgid "No attachments stored for %(pagename)s"
-msgstr "صفحه %(pagename)s ضمیمه ندارد"
-
-msgid "Edit drawing"
-msgstr "ویرایش ترسیمات"
-
-msgid "Attached Files"
-msgstr "فایل های ضمیمه شده"
-
-msgid "You are not allowed to attach a file to this page."
-msgstr "شما مجاز نیستید فایلی را به این صفحه ضمیمه نمایید."
-
-msgid "New Attachment"
-msgstr "ضمیمه جدید"
+
+msgid "Attachment '%(filename)s' does not exist!"
+
+msgstr "ضمیمه '%(filename)s' وجود ندارد!"
+
+
 
 msgid ""
-"An upload will never overwrite an existing file. If there is a name\n"
-"conflict, you have to rename the file that you want to upload.\n"
-"Otherwise, if \"Rename to\" is left blank, the original filename will be "
-"used."
+
+"To refer to attachments on a page, use '''{{{attachment:filename}}}''', \n"
+
+"as shown below in the list of files. \n"
+
+"Do '''NOT''' use the URL of the {{{[get]}}} link, \n"
+
+"since this is subject to change and can break easily."
+
 msgstr ""
-"در صورتی که فایل جدید ارسالی تشابه اسمی با ضمایم موجود داشته باشد٬ فایل "
-"ارسالی جدید جایگزین فایل ضمیمه قبلی خواهد شد.\n"
-"شما می توانید از گزینه \"تغییرنام به\" جهت ضمیمه شدن فایل با نامی متفاوت "
-"استفاده نمائید."
-
-msgid "File to upload"
-msgstr "فایل ارسالی"
-
-msgid "Rename to"
-msgstr "تغییر نام به"
-
-msgid "Upload"
-msgstr "ارسال"
-
-msgid "File attachments are not allowed in this wiki!"
-msgstr "ضمیمه کردن فایل دراین ویکی مجاز نمی باشد!"
-
-msgid "You are not allowed to save a drawing on this page."
-msgstr "شما مجاز به ذخیره ترسیمات برای این صفحه نیستید."
+
+"جهت آدرس دهی به ضمیمه موجود در یک صفحه٬ از عبارت '''{{{ضمیمه:نام فایل}}}''' "
+
+"استفاده نمایید.\n"
+
+"همینگونه که در زیر در قسمت لیست فایل ها نشان داده شده است از لینک آدرس "
+
+"{{{[get]}}} استفاده ننمایید."
+
+
+
+msgid "del"
+
+msgstr "حذف"
+
+
+
+msgid "get"
+
+msgstr "دریافت"
+
+
+
+msgid "edit"
+
+msgstr "ویرایش"
+
+
+
+msgid "view"
+
+msgstr "نمایش"
+
+
+
+msgid "unzip"
+
+msgstr "فایل فشرده بار شود"
+
+
+
+msgid "install"
+
+msgstr "نصب"
+
+
+
+#, python-format
+
+msgid "No attachments stored for %(pagename)s"
+
+msgstr "صفحه %(pagename)s ضمیمه ندارد"
+
+
+
+msgid "Edit drawing"
+
+msgstr "ویرایش ترسیمات"
+
+
+
+msgid "Attached Files"
+
+msgstr "فایل های ضمیمه شده"
+
+
+
+msgid "You are not allowed to attach a file to this page."
+
+msgstr "شما مجاز نیستید فایلی را به این صفحه ضمیمه نمایید."
+
+
+
+msgid "New Attachment"
+
+msgstr "ضمیمه جدید"
+
+
 
 msgid ""
-"No file content. Delete non ASCII characters from the file name and try "
-"again."
+
+"An upload will never overwrite an existing file. If there is a name\n"
+
+"conflict, you have to rename the file that you want to upload.\n"
+
+"Otherwise, if \"Rename to\" is left blank, the original filename will be "
+
+"used."
+
 msgstr ""
+
+"در صورتی که فایل جدید ارسالی تشابه اسمی با ضمایم موجود داشته باشد٬ فایل "
+
+"ارسالی جدید جایگزین فایل ضمیمه قبلی خواهد شد.\n"
+
+"شما می توانید از گزینه \"تغییرنام به\" جهت ضمیمه شدن فایل با نامی متفاوت "
+
+"استفاده نمائید."
+
+
+
+msgid "File to upload"
+
+msgstr "فایل ارسالی"
+
+
+
+msgid "Rename to"
+
+msgstr "تغییر نام به"
+
+
+
+msgid "Upload"
+
+msgstr "ارسال"
+
+
+
+msgid "File attachments are not allowed in this wiki!"
+
+msgstr "ضمیمه کردن فایل دراین ویکی مجاز نمی باشد!"
+
+
+
+msgid "You are not allowed to save a drawing on this page."
+
+msgstr "شما مجاز به ذخیره ترسیمات برای این صفحه نیستید."
+
+
+
+msgid ""
+
+"No file content. Delete non ASCII characters from the file name and try "
+
+"again."
+
+msgstr ""
+
 "محتویات فایل یافت نشد. کاراکترهای غیر ASCII را از نام فایل حذف نموده و مجددا "
+
 "سعی نمایید."
 
+
+
 msgid "You are not allowed to delete attachments on this page."
+
 msgstr "شما مجاز به حذف ضمیمه های این صفحه نمی باشید."
 
+
+
 msgid "You are not allowed to get attachments from this page."
+
 msgstr "شما مجاز به دریافت ضمیمه های این صفحه نمی باشید."
 
+
+
 msgid "You are not allowed to unzip attachments of this page."
+
 msgstr "شما مجاز نیستید ضمیمه های فشرده این صفحه را باز کنید."
 
+
+
 msgid "You are not allowed to install files."
+
 msgstr "شما اجازه نصب فایل ندارید."
 
+
+
 msgid "You are not allowed to view attachments of this page."
+
 msgstr "شما مجاز به دیدن ضمیمه های این صفحه نمی باشید."
 
-#, python-format
-msgid "Unsupported upload action: %s"
-msgstr "ارسال غیر مجاز: %s"
+
 
 #, python-format
-msgid "Attachments for \"%(pagename)s\""
-msgstr "ضمیمه های صفحه \"%(pagename)s\""
+
+msgid "Unsupported upload action: %s"
+
+msgstr "ارسال غیر مجاز: %s"
+
+
 
 #, python-format
-msgid ""
-"Attachment '%(target)s' (remote name '%(filename)s') with %(bytes)d bytes "
-"saved."
-msgstr ""
-"ضمیمه '%(target)s' (به نام·'%(filename)s') به حجم %(bytes)d بایت ذخیره شد."
+
+msgid "Attachments for \"%(pagename)s\""
+
+msgstr "ضمیمه های صفحه \"%(pagename)s\""
+
+
 
 #, python-format
-msgid "Attachment '%(target)s' (remote name '%(filename)s') already exists."
-msgstr "ضمیمه '%(target)s' (به نام '%(filename)s') در حال حاضر وجود دارد."
-
-#, python-format
-msgid "Attachment '%(filename)s' deleted."
-msgstr "ضمیمه '%(filename)s' حذف شد."
-
-#, python-format
-msgid "Attachment '%(filename)s' installed."
-msgstr "ضمیمه '%(filename)s' نصب شد."
+
+msgid ""
+
+"Attachment '%(target)s' (remote name '%(filename)s') with %(bytes)d bytes "
+
+"saved."
+
+msgstr ""
+
+"ضمیمه '%(target)s' (به نام·'%(filename)s') به حجم %(bytes)d بایت ذخیره شد."
+
+
 
 #, python-format
-msgid ""
-"Attachment '%(filename)s' could not be unzipped because the resulting files "
-"would be too large (%(space)d kB missing)."
-msgstr ""
-"ضمیمه '%(filename)s' به دلیل اینکه پس از باز شدن حجم زیادی دارد٬ باز نشد (%"
-"(space)d kB missing)."
+
+msgid "Attachment '%(target)s' (remote name '%(filename)s') already exists."
+
+msgstr "ضمیمه '%(target)s' (به نام '%(filename)s') در حال حاضر وجود دارد."
+
+
 
 #, python-format
-msgid ""
-"Attachment '%(filename)s' could not be unzipped because the resulting files "
-"would be too many (%(count)d missing)."
-msgstr ""
-"ضمیمه·'%(filename)s'·به·دلیل·اینکه·پس·از·باز·شدن·تعداد فایلها بسیار زیاد "
-"است٬·باز·نشد.(%(count)d·missing)."
+
+msgid "Attachment '%(filename)s' deleted."
+
+msgstr "ضمیمه '%(filename)s' حذف شد."
+
+
+
+#, python-format
+
+msgid "Attachment '%(filename)s' installed."
+
+msgstr "ضمیمه '%(filename)s' نصب شد."
+
+
 
 #, python-format
-msgid "Attachment '%(filename)s' unzipped."
-msgstr "ضمیمه '%(filename)s' از حالت فشرده خارج شد."
-
-#, python-format
+
 msgid ""
-"Attachment '%(filename)s' not unzipped because the files are too big, .zip "
-"files only, exist already or reside in folders."
-msgstr "ضمیمه '%(filename)s' باز نشد."
-
-#, python-format
-msgid "The file %(target)s is not a .zip file."
-msgstr "فایل %(target)s یک فایل zip نیست."
+
+"Attachment '%(filename)s' could not be unzipped because the resulting files "
+
+"would be too large (%(space)d kB missing)."
+
+msgstr ""
+
+"ضمیمه '%(filename)s' به دلیل اینکه پس از باز شدن حجم زیادی دارد٬ باز نشد (%"
+
+"(space)d kB missing)."
+
+
 
 #, python-format
-msgid "Attachment '%(filename)s'"
-msgstr "فایل ضمیمه '%(filename)s'"
-
-msgid "Package script:"
-msgstr "اسکریپت بسته:"
-
-msgid "File Name"
-msgstr "نام فایل"
-
-msgid "Modified"
-msgstr "اصلاح شده"
-
-msgid "Size"
-msgstr "اندازه"
-
-msgid "Unknown file type, cannot display this attachment inline."
-msgstr "نوع فایل نامشخص است٬ این فایل ضمیمه قابل نمایش نمی باشد."
+
+msgid ""
+
+"Attachment '%(filename)s' could not be unzipped because the resulting files "
+
+"would be too many (%(count)d missing)."
+
+msgstr ""
+
+"ضمیمه·'%(filename)s'·به·دلیل·اینکه·پس·از·باز·شدن·تعداد فایلها بسیار زیاد "
+
+"است٬·باز·نشد.(%(count)d·missing)."
+
+
+
+#, python-format
+
+msgid "Attachment '%(filename)s' unzipped."
+
+msgstr "ضمیمه '%(filename)s' از حالت فشرده خارج شد."
+
+
+
+#, python-format
+
+msgid ""
+
+"Attachment '%(filename)s' not unzipped because the files are too big, .zip "
+
+"files only, exist already or reside in folders."
+
+msgstr "ضمیمه '%(filename)s' باز نشد."
+
+
+
+#, python-format
+
+msgid "The file %(target)s is not a .zip file."
+
+msgstr "فایل %(target)s یک فایل zip نیست."
+
+
 
 #, python-format
-msgid "attachment:%(filename)s of %(pagename)s"
-msgstr "فایل ضمیمه: فایل %(filename)s از صفحه %(pagename)s"
-
-msgid "Delete"
-msgstr "حذف"
-
-msgid "This page is already deleted or was never created!"
-msgstr "این صفحه یا اخیرا حذف شده و یا هرگز وجود نداشته است!"
-
-msgid "Optional reason for the deletion"
-msgstr "توضیحات دلخواه برای این حذف"
-
-msgid "Really delete this page?"
-msgstr "اطمینان دارید که این صفحه می بایست حذف شود؟"
-
-msgid "Editor"
-msgstr "ویرایش توسط"
-
-msgid "Pages"
-msgstr "صفحات"
-
-msgid "Select Author"
-msgstr "انتخاب نویسنده"
-
-msgid "Revert all!"
-msgstr "کلیه ویرایش ها بازگردانی شود!"
-
-msgid "You are not allowed to use this action."
-msgstr "عملیات غیر مجاز"
+
+msgid "Attachment '%(filename)s'"
+
+msgstr "فایل ضمیمه '%(filename)s'"
+
+
+
+msgid "Package script:"
+
+msgstr "اسکریپت بسته:"
+
+
+
+msgid "File Name"
+
+msgstr "نام فایل"
+
+
+
+msgid "Modified"
+
+msgstr "اصلاح شده"
+
+
+
+msgid "Size"
+
+msgstr "اندازه"
+
+
+
+msgid "Unknown file type, cannot display this attachment inline."
+
+msgstr "نوع فایل نامشخص است٬ این فایل ضمیمه قابل نمایش نمی باشد."
+
+
 
 #, python-format
-msgid "No pages like \"%s\"!"
-msgstr "هیچ صفحه ای شبیه \"%s\" یافت نشد!"
-
-#, python-format
-msgid "Exactly one page like \"%s\" found, redirecting to page."
-msgstr "یک صفحه شبیه \"%s\" پیدا شد٬ اکنون به آن صفحه میروید."
-
-#, python-format
-msgid "Pages like \"%s\""
-msgstr "صفحات شبیه \"%s\""
+
+msgid "attachment:%(filename)s of %(pagename)s"
+
+msgstr "فایل ضمیمه: فایل %(filename)s از صفحه %(pagename)s"
+
+
+
+msgid "Delete"
+
+msgstr "حذف"
+
+
+
+msgid "This page is already deleted or was never created!"
+
+msgstr "این صفحه یا اخیرا حذف شده و یا هرگز وجود نداشته است!"
+
+
+
+msgid "Optional reason for the deletion"
+
+msgstr "توضیحات دلخواه برای این حذف"
+
+
+
+msgid "Really delete this page?"
+
+msgstr "اطمینان دارید که این صفحه می بایست حذف شود؟"
+
+
+
+msgid "Editor"
+
+msgstr "ویرایش توسط"
+
+
+
+msgid "Pages"
+
+msgstr "صفحات"
+
+
+
+msgid "Select Author"
+
+msgstr "انتخاب نویسنده"
+
+
+
+msgid "Revert all!"
+
+msgstr "کلیه ویرایش ها بازگردانی شود!"
+
+
+
+msgid "You are not allowed to use this action."
+
+msgstr "عملیات غیر مجاز"
+
+
 
 #, python-format
-msgid "%(matchcount)d %(matches)s for \"%(title)s\""
-msgstr "%(matchcount)d·%(matches)s·برای·\"%(title)s\""
-
-msgid "match"
-msgstr "نتیجه"
-
-msgid "matches"
-msgstr "نتایج"
+
+msgid "No pages like \"%s\"!"
+
+msgstr "هیچ صفحه ای شبیه \"%s\" یافت نشد!"
+
+
+
+#, python-format
+
+msgid "Exactly one page like \"%s\" found, redirecting to page."
+
+msgstr "یک صفحه شبیه \"%s\" پیدا شد٬ اکنون به آن صفحه میروید."
+
+
+
+#, python-format
+
+msgid "Pages like \"%s\""
+
+msgstr "صفحات شبیه \"%s\""
+
+
 
 #, python-format
+
+msgid "%(matchcount)d %(matches)s for \"%(title)s\""
+
+msgstr "%(matchcount)d·%(matches)s·برای·\"%(title)s\""
+
+
+
+#, python-format
+
 msgid "Local Site Map for \"%s\""
+
 msgstr "نقشه سایت محلی برای \"%s\""
 
+
+
 msgid "Please log in first."
+
 msgstr "لطفا وارد سیستم شوید."
 
+
+
 msgid "Please first create a homepage before creating additional pages."
+
 msgstr "لطفا پیش از ساخت صفحات در این سایت٬ یک صفحه خانگی برای خود بسازید."
 
+
+
 #, python-format
+
 msgid ""
+
 "You can add some additional sub pages to your already existing homepage "
+
 "here.\n"
+
 "\n"
+
 "You can choose how open to other readers or writers those pages shall be,\n"
+
 "access is controlled by group membership of the corresponding group page.\n"
+
 "\n"
+
 "Just enter the sub page's name and click on the button to create a new "
+
 "page.\n"
+
 "\n"
+
 "Before creating access protected pages, make sure the corresponding group "
+
 "page\n"
+
 "exists and has the appropriate members in it. Use HomepageGroupsTemplate for "
+
 "creating\n"
+
 "the group pages.\n"
+
 "\n"
+
 "||'''Add a new personal page:'''||'''Related access control list "
+
 "group:'''||\n"
+
 "||[[NewPage(HomepageReadWritePageTemplate,read-write page,%(username)s)]]||"
+
 "[\"%(username)s/ReadWriteGroup\"]||\n"
+
 "||[[NewPage(HomepageReadPageTemplate,read-only page,%(username)s)]]||[\"%"
+
 "(username)s/ReadGroup\"]||\n"
+
 "||[[NewPage(HomepagePrivatePageTemplate,private page,%(username)s)]]||%"
+
 "(username)s only||\n"
+
 "\n"
+
 msgstr ""
+
 "شما میتوانید به صفحه خانگی خود تعدادی زیر صفحه نیز اضافه نمایید.\n"
+
 "\n"
+
 "شما به دلخواه خود میتوانید مجوز خواندن و نوشتن این صفحات توسط کاربران دیگر "
+
 "را تنظیم نمایید,\n"
+
 "این دسترسی ها توسط اعضای گروه نویسندگان این صفحه قابل تنظیم می باشند.\n"
+
 "\n"
+
 "فقط کافیست نام زیر صفحه مورد نظر خود را نوشته و روی ایجاد صفحه جدید کلیک "
+
 "نمایید.\n"
+
 " \n"
+
 "پیش از ایجاد این صفحات٬ صفحه اسامی گروه نویسندگان دارای حق دسترسی به این "
+
 "صفحه را نیز ایجاد نموده و اسامی کاربران دارای حق ویرایش را در ان صفحه ذکر "
+
 "نمایید\n"
+
 " جهت ساخت این صفحات گروهی میتوانید از الگوی HomepageGroupsTemplate استفاده "
+
 "نمایید.\n"
+
 "\n"
+
 "||'''صفحه شخصی جدید:'''||'''حق دسترسی های مربوطه:'''||\n"
+
 "||[[NewPage(HomepageReadWritePageTemplate,read-write page,%(username)s)]]||"
+
 "[\"%(username)s/ReadWriteGroup\"]||\n"
+
 "||[[NewPage(HomepageReadPageTemplate,read-only page,%(username)s)]]||[\"%"
+
 "(username)s/ReadGroup\"]||\n"
+
 "||[[NewPage(HomepagePrivatePageTemplate,private page,%(username)s)]]||%"
+
 "(username)s only||\n"
+
 "\n"
 
+
+
 msgid "MyPages management"
+
 msgstr "مدیریت صفحات من"
 
+
+
 #, python-format
+
 msgid "Invalid filename \"%s\"!"
+
 msgstr "نام فایل \"%s\" نامشخص است !"
 
+
+
 #, python-format
+
 msgid "Created the package %s containing the pages %s."
+
 msgstr "بسته %s شامل صفحات %s ساخته شد."
 
+
+
 msgid "Package pages"
+
 msgstr "بسته صفحات"
 
+
+
 msgid "Package name"
+
 msgstr "نام بسته"
 
+
+
 msgid "List of page names - separated by a comma"
+
 msgstr "لیست نام صفحات - نام صفحات با کاما جدا شوند"
 
+
+
 msgid "Rename Page"
+
 msgstr "تغیر نام صفحه"
 
+
+
 msgid "New name"
+
 msgstr "نام جدید"
 
+
+
 msgid "Optional reason for the renaming"
+
 msgstr "توضیحات اختیاری برای تغببر نام صفحه"
 
+
+
 #, python-format
+
 msgid "(including %(localwords)d %(pagelink)s)"
+
 msgstr "( مرجع لغت %(pagelink)s دارای %(localwords)d لغت )"
 
+
+
 #, python-format
+
 msgid ""
+
 "The following %(badwords)d words could not be found in the dictionary of %"
+
 "(totalwords)d words%(localwords)s and are highlighted below:"
+
 msgstr ""
+
 "این %(badwords)d لغت در مرجع لغات %(totalwords)d لغتی شما %(localwords)s "
+
 "یافت نشدند٬ در صورت تمایل می توانید آنها را به مرجع لغات خود اضافه نمایید:"
 
+
+
 msgid "Add checked words to dictionary"
+
 msgstr "لغات تیک دار را به مرجع لغات اضافه نما"
 
+
+
 msgid "No spelling errors found!"
+
 msgstr "اشتباه املایی یافت نشد!"
 
+
+
 msgid "You can't check spelling on a page you can't read."
+
 msgstr ""
+
 "شما نمی توانید صفحه ای که مجاز به خواندن آن نیستید را تصحیح املایی نمایید."
 
+
+
 #, python-format
+
 msgid "Subscribe users to the page %s"
+
 msgstr "کاربران را عضو این صفحه نما %s"
 
+
+
 #, python-format
+
 msgid "Subscribed for %s:"
+
 msgstr "عضو %s شدند:"
 
+
+
 msgid "Not a user:"
+
 msgstr "کاربر ثبت نشده:"
 
+
+
 msgid "You are not allowed to perform this action."
+
 msgstr "عملیات غیر مجاز"
 
+
+
 msgid "Do it."
+
 msgstr "انجام بده."
 
+
+
 #, python-format
+
 msgid "Execute action %(actionname)s?"
+
 msgstr "عملیات %(actionname)s انجام شود؟"
 
+
+
 #, python-format
+
 msgid "Action %(actionname)s is excluded in this wiki!"
+
 msgstr "عملیات %(actionname)s در این ویکی غیر مجاز است!"
 
+
+
 #, python-format
+
 msgid "You are not allowed to use action %(actionname)s on this page!"
+
 msgstr "عملیات %(actionname)s روی این صفحه مجاز نیست!"
 
+
+
 #, python-format
+
 msgid "Please use the interactive user interface to use action %(actionname)s!"
+
 msgstr ""
+
 "لطفا جهت انجام عملیات %(actionname)s از جلوه های کاربردی استفاده نمایید!"
 
+
+
 msgid "You are not allowed to revert this page!"
+
 msgstr "شما مجاز نیستید این صفحه را ارجاع دهید!"
 
+
+
 msgid "No older revisions available!"
+
 msgstr "ویرایش قدیمی تری موجود نیست!"
 
+
+
 #, python-format
+
 msgid "Diff for \"%s\""
+
 msgstr "تغییرات \"%s\""
 
+
+
 #, python-format
+
 msgid "Differences between revisions %d and %d"
+
 msgstr "تغییرات بین ویرایش های %d و %d"
 
+
+
 #, python-format
+
 msgid "(spanning %d versions)"
+
 msgstr "(spanning %d versions)"
 
+
+
 msgid "No differences found!"
+
 msgstr "هیچ گونه تغییری یافت نشد!"
 
+
+
 #, python-format
+
 msgid "The page was saved %(count)d times, though!"
+
 msgstr "این صفحه %(count)d بار ذخیره شده است!"
 
+
+
 msgid "(ignoring whitespace)"
+
 msgstr "(صرف نظر از فاصله های سفید)"
 
+
+
 msgid "Ignore changes in the amount of whitespace"
+
 msgstr "صرف نظر از تغییرات در تعداد فاصله های سفید"
 
+
+
 msgid "General Information"
+
 msgstr "اطلاعات عمومی"
 
+
+
 #, python-format
+
 msgid "Page size: %d"
+
 msgstr "اندازه صفحه: %d"
 
+
+
 msgid "SHA digest of this page's content is:"
+
 msgstr "نسخه SHA فشرده شده محتویات این صفحه:"
 
+
+
 msgid "The following users subscribed to this page:"
+
 msgstr "کاربران زیر در این صفحه عضو می باشند:"
 
+
+
 msgid "This page links to the following pages:"
+
 msgstr "این صفحه به صفحات زیر لینک دارد:"
 
+
+
 msgid "Date"
+
 msgstr "تاریخ"
 
+
+
 msgid "Diff"
+
 msgstr "تغییرات"
 
+
+
 msgid "Comment"
+
 msgstr "توضیحات"
 
+
+
 msgid "raw"
+
 msgstr "نسخه خام"
 
+
+
 msgid "print"
+
 msgstr "چاپ"
 
+
+
 msgid "revert"
+
 msgstr "بازیابی این نسخه"
 
+
+
 #, python-format
+
 msgid "Revert to revision %(rev)d."
+
 msgstr "نسخه %(rev)d بازیابی شد"
 
+
+
 msgid "N/A"
+
 msgstr "N/A"
 
+
+
 msgid "Revision History"
+
 msgstr "تاریخچه ویرایش"
 
+
+
 msgid "No log entries found."
+
 msgstr "گزارشی دریافت نشد."
 
+
+
 #, python-format
+
 msgid "Info for \"%s\""
+
 msgstr "گزارشات مربوط به \"%s\""
 
+
+
 #, python-format
+
 msgid "Show \"%(title)s\""
+
 msgstr "\"%(title)s\" را نشان بده"
 
+
+
 msgid "General Page Infos"
+
 msgstr "اطلاعات عمومی صفحه"
 
+
+
 #, python-format
+
 msgid "Show chart \"%(title)s\""
+
 msgstr "جدول \"%(title)s\" را نشان بده"
 
+
+
 msgid "Page hits and edits"
+
 msgstr "مشاهدات و ویرایش های صفحه"
 
+
+
 msgid "You must login to add a quicklink."
+
 msgstr "برای اضافه نمودن یک لینک دسترسی سریع باید وارد سیستم شوید."
 
+
+
 msgid "Your quicklink to this page has been removed."
+
 msgstr "لینک دسترسی سریع شما به این صفحه حذف شد."
 
+
+
 msgid "A quicklink to this page has been added for you."
+
 msgstr "یک لینک دسترسی سریع به این صفحه برای شما اضافه شد."
 
+
+
 msgid "You are not allowed to subscribe to a page you can't read."
+
 msgstr "شما مجاز نیستید در صفحه ای عضو شوید که مجوز خواندن آنرا ندارید."
 
+
+
 msgid "This wiki is not enabled for mail processing."
+
 msgstr "گزینه جابجایی ایمیل ها برای این ویکی فعال نشده است."
 
+
+
 msgid "You must log in to use subscribtions."
+
 msgstr "برای استفاده از امکانات اعضا حتما باید وارد سیستم شوید."
 
+
+
 msgid "Add your email address in your UserPreferences to use subscriptions."
+
 msgstr ""
+
 "جهت استفاده از امکانات اعضاء٬ آدرس ایمیل خود را در مرجع اطلاعات کاربری اضافه "
+
 "نمایید."
 
+
+
 msgid "Your subscribtion to this page has been removed."
+
 msgstr "عضویت شما از این صفحه حذف شد."
 
+
+
 msgid "Can't remove regular expression subscription!"
+
 msgstr "عضویت در اصطلاحات عمومی قابل حذف نمی باشد!"
 
+
+
 msgid "Edit the subscription regular expressions in your UserPreferences."
+
 msgstr "اصطلاحات عمومی عضویت را در مرجع اطلاعات کاربری ویرایش نمایید."
 
+
+
 msgid "You have been subscribed to this page."
+
 msgstr "شما در این صفحه عضو شدید."
 
+
+
 msgid "Charts are not available!"
+
 msgstr "چارت ها قابل دسترسی نمی باشند!"
 
+
+
 msgid "You need to provide a chart type!"
+
 msgstr "شما باید نوع چارت را مشخص نمایید!"
 
+
+
 #, python-format
+
 msgid "Bad chart type \"%s\"!"
+
 msgstr "چارت \"%s\" صحیح نمی باشد!"
 
+
+
 #, python-format
+
 msgid ""
+
 "Restored Backup: %(filename)s to target dir: %(targetdir)s.\n"
+
 "Files: %(filecount)d, Directories: %(dircount)d"
+
 msgstr ""
+
 "نسخه پشتیبان بازیابی شد: %(filename)s در پوشه مقصد: %(targetdir)s.\n"
+
 "فایلها: %(filecount)d, پوشه ها: %(dircount)d"
 
+
+
 #, python-format
+
 msgid "Restoring backup: %(filename)s to target dir: %(targetdir)s failed."
+
 msgstr ""
+
 "بازیابی نسخه پشتیبان: %(filename)s در پوشه مقصد: %(targetdir)s موفق نبود."
 
+
+
 msgid "Wiki Backup / Restore"
+
 msgstr "پشتیبان گیری / بازیافت ویکی"
 
+
+
 msgid ""
+
 "Some hints:\n"
+
 " * To restore a backup:\n"
+
 "  * Restoring a backup will overwrite existing data, so be careful.\n"
+
 "  * Rename it to <siteid>.tar.<compression> (remove the --date--time--UTC "
+
 "stuff).\n"
+
 "  * Put the backup file into the backup_storage_dir (use scp, ftp, ...).\n"
+
 "  * Hit the [[GetText(Restore)]] button below.\n"
+
 "\n"
+
 " * To make a backup, just hit the [[GetText(Backup)]] button and save the "
+
 "file\n"
+
 "   you get to a secure place.\n"
+
 "\n"
+
 "Please make sure your wiki configuration backup_* values are correct and "
+
 "complete.\n"
+
 "\n"
+
 msgstr ""
+
 "Some hints:\n"
+
 " * To restore a backup:\n"
+
 "  * Restoring a backup will overwrite existing data, so be careful.\n"
+
 "  * Rename it to <siteid>.tar.<compression> (remove the --date--time--UTC "
+
 "stuff).\n"
+
 "  * Put the backup file into the backup_storage_dir (use scp, ftp, ...).\n"
+
 "  * Hit the [[GetText(Restore)]] button below.\n"
+
 "\n"
+
 " * To make a backup, just hit the [[GetText(Backup)]] button and save the "
+
 "file\n"
+
 "   you get to a secure place.\n"
+
 "\n"
+
 "Please make sure your wiki configuration backup_* values are correct and "
+
 "complete.\n"
+
 "\n"
 
+
+
 msgid "Backup"
+
 msgstr "پشتیبان گیری"
 
+
+
 msgid "Restore"
+
 msgstr "بازیافت"
 
+
+
 msgid "You are not allowed to do remote backup."
+
 msgstr "شما مجاز به پشتیبان گیری از راه دور نیستید."
 
+
+
 #, python-format
+
 msgid "Unknown backup subaction: %s."
+
 msgstr "عملیات ناشناخته %s در پشتیبان گیری."
 
+
+
 #, python-format
+
 msgid "Please use a more selective search term instead of {{{\"%s\"}}}"
+
 msgstr "لطفا به جای {{{\"%s\"}}} جستجوی گزیده تری انجام دهید"
 
+
+
 #, python-format
+
 msgid "Title Search: \"%s\""
+
 msgstr "جستجوی عنوان: \"%s\""
 
+
+
 #, python-format
+
 msgid "Full Text Search: \"%s\""
+
 msgstr "جستجوی کامل متن: \"%s\""
 
+
+
 #, python-format
+
 msgid "Full Link List for \"%s\""
+
 msgstr "لیست کامل لینکها برای \"%s\""
 
+
+
 #, python-format
+
 msgid "Unknown user name: {{{\"%s\"}}}. Please enter user name and password."
+
 msgstr ""
+
 "نام کاربری {{{\"%s\"}}} یافت نشد. لطفا نام کاربری و کلمه عبور را وارد "
+
 "نمایید. "
 
+
+
 msgid "Missing password. Please enter user name and password."
+
 msgstr ""
+
 "کلمه رمز وارد نشده است. لطفا نام کاربری و کلمه عبور صحیح خود را مجددا وارد "
+
 "نمایید."
 
+
+
 msgid "Sorry, login failed."
+
 msgstr "نام کاربری/کلمه عبور صحیح نیست٬ لطفا مجددا سعی نمائید."
 
+
+
 msgid "You are now logged out."
+
 msgstr "شما از سیستم خارج شدید."
 
+
+
 msgid ""
+
 "Cannot create a new page without a page name.  Please specify a page name."
+
 msgstr ""
+
 "سیستم نمی تواند صفحه جدید بدون نام ایجاد کند.  لطفا یک نام صفحه مشخص نمایید."
 
+
+
 #, python-format
+
 msgid "Upload new attachment \"%(filename)s\""
+
 msgstr "ارسال ضمیمه جدید \"%(filename)s\""
 
+
+
 #, python-format
+
 msgid "Create new drawing \"%(filename)s\""
+
 msgstr "ترسیم جدید \"%(filename)s\" را بساز"
 
+
+
 #, python-format
+
 msgid "Edit drawing %(filename)s"
+
 msgstr "ویرایش ترسیم %(filename)s"
 
+
+
 msgid "Toggle line numbers"
+
 msgstr "شماره خطوط حذف شود"
 
+
+
 msgid "FrontPage"
+
 msgstr "صفحه اولیه"
 
+
+
 msgid "RecentChanges"
+
 msgstr "آخرین تغییرات"
 
+
+
 msgid "TitleIndex"
+
 msgstr "فهرست موضوعات"
 
+
+
 msgid "WordIndex"
+
 msgstr "فهرست لغات"
 
+
+
 msgid "FindPage"
+
 msgstr "جستجوی صفحه"
 
+
+
 msgid "SiteNavigation"
+
 msgstr "نوع سایت"
 
+
+
 msgid "HelpContents"
+
 msgstr "فهرست راهنما"
 
+
+
 msgid "HelpOnFormatting"
+
 msgstr "راهنمای فرمت ها"
 
+
+
 msgid "UserPreferences"
+
 msgstr "مرجع اطلاعات کاربری"
 
+
+
 msgid "WikiLicense"
+
 msgstr "اجازه نامه ویکی"
 
+
+
 msgid "MissingPage"
+
 msgstr "صفحه گم شده"
 
+
+
 msgid "MissingHomePage"
+
 msgstr "صفحه خانگی یافت نشد"
 
+
+
 msgid "Mon"
+
 msgstr "دوشنبه"
 
+
+
 msgid "Tue"
+
 msgstr "سه شنبه"
 
+
+
 msgid "Wed"
+
 msgstr "چهارشنبه"
 
+
+
 msgid "Thu"
+
 msgstr "پنج شنبه"
 
+
+
 msgid "Fri"
+
 msgstr "جمعه"
 
+
+
 msgid "Sat"
+
 msgstr "شنبه"
 
+
+
 msgid "Sun"
+
 msgstr "یکشنبه"
 
+
+
 msgid "AttachFile"
+
 msgstr "انضمام فایل"
 
+
+
 msgid "DeletePage"
+
 msgstr "حذف صفحه"
 
+
+
 msgid "LikePages"
+
 msgstr "شبیه صفحات"
 
+
+
 msgid "LocalSiteMap"
+
 msgstr "نقشه سایت محلی"
 
+
+
 msgid "RenamePage"
+
 msgstr "تغییرنام صفحه"
 
+
+
 msgid "SpellCheck"
+
 msgstr "تصحیح املایی"
 
+
+
 #, python-format
+
 msgid "Invalid include arguments \"%s\"!"
+
 msgstr "عبارت \"%s\" غیر مجاز است!"
 
+
+
 #, python-format
+
 msgid "Nothing found for \"%s\"!"
+
 msgstr "برای \"%s\" چیزی یافت نشد!"
 
+
+
 #, python-format
+
 msgid "Invalid MonthCalendar calparms \"%s\"!"
+
 msgstr "پارامترهای غیرمجاز \"%s\" برای تقویم ماهانه !"
 
+
+
 #, python-format
+
 msgid "Invalid MonthCalendar arguments \"%s\"!"
+
 msgstr "آرگومانهای غیرمجاز \"%s\" تقویم ماهانه !"
 
+
+
 #, python-format
+
 msgid "Unsupported navigation scheme '%(scheme)s'!"
+
 msgstr "طرح '%(scheme)s' پشتیبانی نشده است!"
 
+
+
 msgid "No parent page found!"
+
 msgstr "صفحه والد بالاتر یافت نشد!"
 
+
+
 msgid "Wiki"
+
 msgstr "ویکی"
 
+
+
 msgid "Slideshow"
+
 msgstr "نمایش تصاویر پشت سر هم"
 
+
+
 msgid "Start"
+
 msgstr "شروع"
 
+
+
 #, python-format
+
 msgid "Slide %(pos)d of %(size)d"
+
 msgstr "اسلاید %(pos)d با حجم %(size)d"
 
+
+
 msgid "No orphaned pages in this wiki."
+
 msgstr "در این ویکی هیچ صفحه بی والد یافت نشد."
 
+
+
 #, python-format
+
 msgid "No quotes on %(pagename)s."
+
 msgstr "برای صفحه %(pagename)s نظری وجود ندارد."
 
+
+
 #, python-format
+
 msgid "Upload of attachment '%(filename)s'."
+
 msgstr "ارسال ضمیمه '%(filename)s'"
 
+
+
 #, python-format
+
 msgid "Drawing '%(filename)s' saved."
+
 msgstr "ترسیم '%(filename)s' ذخیره شد."
 
+
+
 #, python-format
+
 msgid "%(mins)dm ago"
+
 msgstr "%(mins)dm دقیقه پیش"
 
+
+
 msgid "(no bookmark set)"
+
 msgstr "(بدون نشان bookmark)"
 
+
+
 #, python-format
+
 msgid "(currently set to %s)"
+
 msgstr "(در حال حاضر تنظیم شده روی %s)"
 
+
+
 msgid "Delete Bookmark"
+
 msgstr "حذف نشان bookmark"
 
+
+
 msgid "Set bookmark"
+
 msgstr "نشان bookmark بگذار"
 
+
+
 msgid "set bookmark"
+
 msgstr "نشان·bookmark·بگذار"
 
+
+
 msgid "[Bookmark reached]"
+
 msgstr "[به نشان bookmark رسید]"
 
+
+
 msgid "Markup"
+
 msgstr "علائم نگارشی"
 
+
+
 msgid "Display"
+
 msgstr "نمایش"
 
+
+
 msgid "Python Version"
+
 msgstr "نسخه python"
 
+
+
 msgid "MoinMoin Version"
+
 msgstr "نسخه MoinMoin"
 
+
+
 #, python-format
+
 msgid "Release %s [Revision %s]"
+
 msgstr "انتشار %s·[Revision·%s]"
 
+
+
 msgid "4Suite Version"
+
 msgstr "4Suite Version"
 
+
+
 msgid "Number of pages"
+
 msgstr "تعداد صفحات"
 
+
+
 msgid "Number of system pages"
+
 msgstr "تعداد صفحات سیستمی"
 
+
+
 msgid "Accumulated page sizes"
+
 msgstr "حجم صفحات جمع شده"
 
+
+
 #, python-format
+
 msgid "Disk usage of %(data_dir)s/pages/"
+
 msgstr "فضای اشغال شده روی دیسک توسط صفحات %(data_dir)s/"
 
+
+
 #, python-format
+
 msgid "Disk usage of %(data_dir)s/"
+
 msgstr "فضای اشغال شده روی دیسک توسط %(data_dir)s/"
 
+
+
 msgid "Entries in edit log"
+
 msgstr "محتویات گزارشات ویرایشهای صورت گرفته"
 
+
+
 msgid "NONE"
+
 msgstr "هیچ یک"
 
+
+
 msgid "Global extension macros"
+
 msgstr "Global extension macros"
 
+
+
 msgid "Local extension macros"
+
 msgstr "Local extension macros"
 
+
+
 msgid "Global extension actions"
+
 msgstr "Global extension actions"
 
+
+
 msgid "Local extension actions"
+
 msgstr "Local extension actions"
 
+
+
 msgid "Global parsers"
+
 msgstr "Global parsers"
 
+
+
 msgid "Local extension parsers"
+
 msgstr "Local extension parsers"
 
+
+
 msgid "Disabled"
+
 msgstr "غیرفعال"
 
+
+
 msgid "Enabled"
+
 msgstr "فعال"
 
+
+
 msgid "Xapian search"
+
 msgstr "Xapian search"
 
+
+
 msgid "Active threads"
+
 msgstr "مباحث فعال"
 
+
+
 msgid "Contents"
+
 msgstr "فهرست"
 
+
+
 msgid "Include system pages"
+
 msgstr "با·در·نظر·گرفتن·صفحات·سیستمی"
 
+
+
 msgid "Exclude system pages"
+
 msgstr "بدون در نظر گرفتن صفحات سیستمی"
 
+
+
 msgid "No wanted pages in this wiki."
+
 msgstr "در این ویکی صفحه ای مورد نیاز نیست."
 
+
+
 msgid "Search Titles"
+
 msgstr "جستجو در عناوین"
 
+
+
 msgid "Display context of search results"
+
 msgstr "نتایج جستجو را نشان بده"
 
+
+
 msgid "Case-sensitive searching"
+
 msgstr "جستجوی حساس به حروف بزرگ و کوچک"
 
+
+
 msgid "Search Text"
+
 msgstr "جستجو در متون"
 
+
+
 msgid "Go To Page"
+
 msgstr "برو به صفحه"
 
+
+
 #, python-format
+
 msgid "ERROR in regex '%s'"
+
 msgstr "خطا regex·'%s'"
 
+
+
 #, python-format
+
 msgid "Bad timestamp '%s'"
+
 msgstr "timestamp·'%s' غیر قابل قبول"
 
+
+
 #, python-format
+
 msgid "Connection to mailserver '%(server)s' failed: %(reason)s"
+
 msgstr "ارتباط با سرویس دهنده ایمیل '%(server)s' مقدور نمی باشد: %(reason)s"
 
+
+
 msgid "Mail not sent"
+
 msgstr "پیغام شما فرستاده نشد"
 
+
+
 msgid "Mail sent OK"
+
 msgstr "پیغام با موفقیت ارسال شد"
 
+
+
 #, python-format
+
 msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
+
 msgstr ""
+
 "پس از عبارت \"%(key)s\" می بایست عبارت \"%(wanted)s\" می آمد که به اشتباه \"%"
+
 "(token)s\" آمده است"
 
+
+
 #, python-format
+
 msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
+
 msgstr "پیش از \"%(token)s\" می بایست یک عبارت عددی \"%(key)s\" بیاید"
 
+
+
 #, python-format
+
 msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
+
 msgstr "بعد از \"%(key)s\" باید یک کاراکتر عددی \"%(arg)s\" باشد"
 
+
+
 #, python-format
+
 msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
+
 msgstr "بعد از \"%(key)s\" یک مقدار رنگ \"%(arg)s\" وارد شود"
 
+
+
 msgid ""
+
 "Rendering of reStructured text is not possible, please install Docutils."
+
 msgstr ""
+
 "آماده سازی صفحه تغییر ساختار یافته ممکن نیست٬ لطفا Docutils را نصب نمائید."
 
+
+
 msgid "**Maximum number of allowed includes exceeded**"
+
 msgstr "**حداکثر تعداد ورودی مجاز**"
 
+
+
 #, python-format
+
 msgid "**Could not find the referenced page: %s**"
+
 msgstr "**صفحه ارجاع داده شده: %s یافت نشد**"
 
+
+
 msgid "XSLT option disabled, please look at HelpOnConfiguration."
+
 msgstr ""
+
 "گزینه XSLT غیر فعال است٬ لطفا صفحه راهنمای تنظیمات HelpOnConfiguration را "
+
 "ببینید."
 
+
+
 msgid "XSLT processing is not available, please install 4suite 1.x."
+
 msgstr "پردازش XSLT قابل انجام نیست٬ لطفا بسته 4suite·1.x را نصب نمایید."
 
+
+
 #, python-format
+
 msgid "%(errortype)s processing error"
+
 msgstr "ایراد پردازش %(errortype)s"
 
+
+
 #, python-format
+
 msgid "You are not allowed to do %s on this page."
+
 msgstr "شما مجاز به %s روی این صفحه نمی باشید."
 
+
+
 msgid "Login and try again."
+
 msgstr "لطفا وارد سایت شده و مجددا سعی نمایید."
 
+
+
 #, python-format
+
 msgid ""
+
 "Sorry, can not save page because \"%(content)s\" is not allowed in this wiki."
+
 msgstr ""
+
 "متاسفم! این صفحه بدلیل اینکه عبارت \"%(content)s\" در این ویکی مجاز نمی "
+
 "باشد٬ ذخیره نشد."
 
+
+
 msgid "Views/day"
+
 msgstr "بازدید در روز"
 
+
+
 msgid "Edits/day"
+
 msgstr "ویرایش در روز"
 
+
+
 #, python-format
+
 msgid "%(chart_title)s for %(filterpage)s"
+
 msgstr "%(chart_title)s برای %(filterpage)s"
 
+
+
 msgid ""
+
 "green=view\n"
+
 "red=edit"
+
 msgstr ""
+
 "سبز = بازدید\n"
+
 "قرمز = ویرایش"
 
+
+
 msgid "date"
+
 msgstr "تاریخ"
 
+
+
 msgid "# of hits"
+
 msgstr "تعداد بازدید"
 
+
+
 msgid "Page Size Distribution"
+
 msgstr "توزیع حجم صفحه"
 
+
+
 msgid "page size upper bound [bytes]"
+
 msgstr "حداکثر حجم صفحه [bytes]"
 
+
+
 msgid "# of pages of this size"
+
 msgstr "تعداد صفحات با این حجم"
 
+
+
 msgid "User agent"
+
 msgstr "User·agent"
 
+
+
 msgid "Others"
+
 msgstr "سایر"
 
+
+
 msgid "Distribution of User-Agent Types"
+
 msgstr "انواع User-Agent"
 
+
+
 msgid "Unsubscribe"
+
 msgstr "لغو عضویت"
 
+
+
 msgid "Home"
+
 msgstr "صفحه خانگی"
 
+
+
 msgid "[RSS]"
+
 msgstr "[RSS]"
 
+
+
 msgid "[DELETED]"
+
 msgstr "[حذف شده]"
 
+
+
 msgid "[UPDATED]"
+
 msgstr "[به روزآوری شده]"
 
+
+
 msgid "[NEW]"
+
 msgstr "[جدید]"
 
+
+
 msgid "[DIFF]"
+
 msgstr "[تغییرات]"
 
+
+
 msgid "[BOTTOM]"
+
 msgstr "[انتهای صفحه]"
 
+
+
 msgid "[TOP]"
+
 msgstr "[ابتدای صفحه]"
 
+
+
 msgid "Click to do a full-text search for this title"
+
 msgstr "جهت جستجوی کامل این موضوع در سایت کلیک نمایید"
 
+
+
 msgid "Preferences"
+
 msgstr "اطلاعات کاربری"
 
+
+
 msgid "Logout"
+
 msgstr "خروج"
 
+
+
 msgid "Clear message"
+
 msgstr "پیغام حذف شود"
 
+
+
 #, python-format
+
 msgid "last edited %(time)s by %(editor)s"
+
 msgstr "آخرین بروزآوری %(time)s توسط %(editor)s"
 
+
+
 #, python-format
+
 msgid "last modified %(time)s"
+
 msgstr "آخرین تغییرات %(time)s"
 
+
+
 msgid "Search:"
+
 msgstr "جستجو:"
 
+
+
 msgid "Text"
+
 msgstr "متن"
 
+
+
 msgid "Titles"
+
 msgstr "عنوان"
 
+
+
 msgid "Search"
+
 msgstr "جستجو در"
 
+
+
 msgid "More Actions:"
+
 msgstr "امکانات بیشتر:"
 
+
+
 msgid "------------"
+
 msgstr "------------"
 
+
+
 msgid "Raw Text"
+
 msgstr "متن خام"
 
+
+
 msgid "Print View"
+
 msgstr "مشاهده صفحه قابل چاپ"
 
+
+
 msgid "Delete Cache"
+
 msgstr "حذف حافظه جانبی"
 
+
+
 msgid "Delete Page"
+
 msgstr "حذف صفحه"
 
+
+
 msgid "Like Pages"
+
 msgstr "شبیه صفحات"
 
+
+
 msgid "Local Site Map"
+
 msgstr "نقشه سایت محلی"
 
+
+
 msgid "My Pages"
+
 msgstr "صفحات من"
 
+
+
 msgid "Subscribe User"
+
 msgstr "عضویت کاربران در این صفحه"
 
+
+
 msgid "Remove Spam"
+
 msgstr "حذف هرزصفحه"
 
+
+
 msgid "Package Pages"
+
 msgstr "تهیه بسته صفحات"
 
+
+
 msgid "Render as Docbook"
+
 msgstr "نمایش با ساختار XML"
 
+
+
 msgid "Do"
+
 msgstr "انجام بده"
 
+
+
 msgid "Edit (Text)"
+
 msgstr "ویرایش (متنی)"
 
+
+
 msgid "Edit (GUI)"
+
 msgstr "ویرایش (گرافیکی)"
 
+
+
 msgid "Immutable Page"
+
 msgstr "صفحه غیرقابل تغییر"
 
+
+
 msgid "Remove Link"
+
 msgstr "حذف لینک"
 
+
+
 msgid "Add Link"
+
 msgstr "لینک اضافه نما"
 
+
+
 msgid "Attachments"
+
 msgstr "ضمیمه ها"
 
+
+
 #, python-format
+
 msgid "Show %s days."
+
 msgstr "نمایش %s روز"
 
+
+
 msgid "Wiki Markup"
+
 msgstr "زبان نوشتاری ویکی"
 
+
+
 msgid "DeleteCache"
+
 msgstr "حذف حافظه جانبی"
 
+
+
 #, python-format
+
 msgid "(cached %s)"
+
 msgstr "(در حافظه ذخیره شد·%s)"
 
+
+
 msgid "Or try one of these actions:"
+
 msgstr "و یا یکی از امکانات زیر را انتخاب نمایید:"
 
+
+
 msgid "Page"
+
 msgstr "صفحه"
 
+
+
 msgid "User"
+
 msgstr "کاربر"
 
+
+
 msgid "Line"
+
 msgstr "خط"
 
+
+
 msgid "Deletions are marked like this."
+
 msgstr "حذفیات در این ستون و با این رنگ نمایش داده میشوند."
 
+
+
 msgid "Additions are marked like this."
+
 msgstr "اضافات در این ستون و با این رنگ نمایش داده میشوند."
 
-#, python-format
-msgid "%(hits)d results out of about %(pages)d pages."
-msgstr "%(hits)d نتیجه بدست آمده حاصل از جستجوی %(pages)d صفحه"
-
-#, python-format
-msgid "%.2f seconds"
-msgstr "%.2f ثانیه"
+
 
 #~ msgid "Required attribute \"%(attrname)s\" missing"
+
 #~ msgstr "نسبت های مورد نیاز \"%(attrname)s\" یافت نشد"
 
+
+
 #~ msgid "Submitted form data:"
+
 #~ msgstr "اطلاعات وارد شده:"
 
+
+
 #~ msgid "Plain title index"
+
 #~ msgstr "فهرست عناوین به صورت متن ساده"
 
+
+
 #~ msgid "XML title index"
+
 #~ msgstr "فهرست عنواین بصورت XML"
 
+
+
 #~ msgid "Installed processors (DEPRECATED -- use Parsers instead)"
+
 #~ msgstr "Installed processors (DEPRECATED·--·use·Parsers·instead)"
 
+
+
 #~ msgid ""
+
 #~ "Sorry, someone else saved the page while you edited it.\n"
+
 #~ "\n"
+
 #~ "Please do the following: Use the back button of your browser, and "
+
 #~ "cut&paste\n"
+
 #~ "your changes from there. Then go forward to here, and click EditText "
+
 #~ "again.\n"
+
 #~ "Now re-add your changes to the current page contents.\n"
+
 #~ "\n"
+
 #~ "''Do not just replace\n"
+
 #~ "the content editbox with your version of the page, because that would\n"
+
 #~ "delete the changes of the other person, which is excessively rude!''\n"
+
 #~ msgstr ""
+
 #~ "متاسفانه شخص دیگری در حالی که شما مشغول ویرایش این صفحه بودید٬ صفحه را "
+
 #~ "ذخیره نموده است.\n"
+
 #~ "\n"
+
 #~ "لطفا مراحل زیر را انجام دهید: دکمه back مرورگر خود را فشار داده و روی "
+
 #~ "دکمه ویرایش متنی کلیک نموده و تغییرات خود را در صفحه انجام دهید..\n"
+
 #~ "\n"
+
 #~ "لطفا با توجه به تغییراتی که نفر قبل انجام داده است شما مجددا صفحه را مرور "
+
 #~ "نموده و تغییراتی را که لازم میدانید اعمال نمایید.\n"
 
-#~ msgid "Jump to last visited page instead of frontpage"
-#~ msgstr "بجای صفحه اولیه به آخرین صفحه بازدید شده برو"
-
-#~ msgid "(Only when changing passwords)"
-#~ msgstr "(فقط برای زمانی که میخواهید کلمه عبور خود را تغییر دهید)"
+
+
+
+msgid "(Only when changing passwords)"
+
+msgstr "(فقط برای تغییر کلمه عبور)"
+
+
 
 #~ msgid "Filename"
+
 #~ msgstr "نام فایل"
 
+
+
 #~ msgid "You are not allowed to rename pages in this wiki!"
+
 #~ msgstr "شما مجاز به تغییر نام صفحات این ویکی نمی باشید!"
 
+
+
 #~ msgid "Please use the interactive user interface to rename pages!"
+
 #~ msgstr ""
+
 #~ "لطفا برای تغییر نام صفحات از صفحه کاربری interactive استفاده نمایید!"
 
+
+
 #~ msgid "You are not allowed to delete this page."
+
 #~ msgstr "شما مجاز به حذف این صفحه نمی باشید."
 
+
+
 #~ msgid "%(logcount)s (%(logsize)s bytes)"
+
 #~ msgstr "%(logcount)s·(%(logsize)s·bytes)"
 
+
+
 #~ msgid "User Preferences"
+
 #~ msgstr "مرجع اطلاعات کاربری"
 
+
+
 #~ msgid "Download XML export of this wiki"
+
 #~ msgstr "دریافت خروجی این ویکی با فرمت XML"
 
+
+
 #~ msgid "EditText"
+
 #~ msgstr "ویرایش متن"
 
+
+
 #~ msgid "Immutable page"
+
 #~ msgstr "صفحه·تغییرناپذیر"
 
+
+
 #~ msgid "Account \"%s\" is disabled."
+
 #~ msgstr "حساب کاربری \"%s\" غیر فعال شده است."
 
+
+
 #~ msgid "Bad relogin URL."
+
 #~ msgstr "آدرس ورود مجدد اشتباه است."
 
+
+
 #~ msgid "Unknown user."
+
 #~ msgstr "کاربر غیر ثبت شده"
 
+
+
 #~ msgid "User account created!"
+
 #~ msgstr "حساب کاربری شما ثبت شد!"
 
+
+
 #~ msgid "Remember last page visited"
+
 #~ msgstr "آخرین صفحه ای که میبینم را به خاطر بسپار"
 
+
+
 #~ msgid "Skip to preview"
+
 #~ msgstr "رفتن به پیش نمایش"
 
+
+
 #~ msgid "[current page size '''%(size)d''' bytes]"
+
 #~ msgstr "حجم این صفحه '''%(size)d''' بایت است"
 
+
+
 #~ msgid "Optional comment about this change"
+
 #~ msgstr "توضیحات اختیاری در مورد این صفحه"
 
+
+
 #~ msgid "Make this page belong to category %(category)s"
+
 #~ msgstr "این صفحه را متعلق به دسته %(category)s نمایید"
--- a/MoinMoin/i18n/it.MoinMoin.po	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/i18n/it.MoinMoin.po	Fri Aug 18 11:43:50 2006 +0200
@@ -583,7 +583,7 @@
 
 #, python-format
 msgid "The page %s does not exist."
-msgstr "La pagina %s risulta inesistente."
+msgstr "La pagina %s non esiste."
 
 msgid "Invalid package file header."
 msgstr "Intestazione del pacchetto invalida."
@@ -1155,7 +1155,7 @@
 
 #, python-format
 msgid "Differences between revisions %d and %d"
-msgstr "Differenze tra le versioni del %d e del %d"
+msgstr "Differenze tra le versioni %d e %d"
 
 #, python-format
 msgid "(spanning %d versions)"
@@ -1169,7 +1169,7 @@
 msgstr "La pagina è stata comunque salvata %(count)d volte!"
 
 msgid "(ignoring whitespace)"
-msgstr "(ignorando gli spazi vuoti)"
+msgstr "(ignorando la spaziatura)"
 
 msgid "Ignore changes in the amount of whitespace"
 msgstr "Ignora differenze nella spaziatura"
@@ -1582,11 +1582,11 @@
 
 #, python-format
 msgid "Disk usage of %(data_dir)s/pages/"
-msgstr "Uso della memoria di %(data_dir)s/pages/"
+msgstr "Occupazione disco di %(data_dir)s/pages/"
 
 #, python-format
 msgid "Disk usage of %(data_dir)s/"
-msgstr "Uso della memoria disco di %(data_dir)s/"
+msgstr "Occupazione disco di %(data_dir)s/"
 
 msgid "Entries in edit log"
 msgstr "Voci nel registro delle modifiche"
@@ -1675,11 +1675,11 @@
 
 #, python-format
 msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
-msgstr "Atteso un intero \"%(key)s\" prima di \"%(token)s\""
+msgstr "Atteso un numero intero \"%(key)s\" prima di \"%(token)s\""
 
 #, python-format
 msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
-msgstr "Atteso un intero \"%(arg)s\" dopo di \"%(key)s\""
+msgstr "Atteso un numero intero \"%(arg)s\" dopo di \"%(key)s\""
 
 #, python-format
 msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
@@ -1821,7 +1821,7 @@
 msgstr "Cerca"
 
 msgid "More Actions:"
-msgstr "Altre Azioni:"
+msgstr "Altre azioni:"
 
 msgid "------------"
 msgstr "------------"
--- a/MoinMoin/i18n/ko.MoinMoin.po	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/i18n/ko.MoinMoin.po	Fri Aug 18 11:43:50 2006 +0200
@@ -14,7 +14,7 @@
 "Project-Id-Version: MoinMoin 1.5\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2006-07-17 12:27+0200\n"
-"PO-Revision-Date: 2006-05-26 17:16+0900\n"
+"PO-Revision-Date: 2006-07-24 20:20+0900\n"
 "Last-Translator: Seungik Lee <seungiklee@gmail.com>\n"
 "Language-Team: Korean <moin-devel@lists.sourceforge.net>\n"
 "MIME-Version: 1.0\n"
@@ -107,15 +107,13 @@
 msgid "Someone else changed this page while you were editing!"
 msgstr "이 문서를 수정하는 동안에 다른 사람이 같은 문서를 수정했습니다."
 
-#, fuzzy
 msgid ""
 "Someone else saved this page while you were editing!\n"
 "Please review the page and save then. Do not save this page as it is!"
 msgstr ""
-"이 문서를 수정하는 동안에 다른 사람이 먼저 이 문서를 수정했습니다.\n"
+"이 문서를 수정하는 동안에 다른 사람이 먼저 이 문서를 저장했습니다!\n"
 "문서 내용을 다시 검토한 뒤에 저장하시고, 절대로 지금 그대로 저장하지 마세"
-"요!\n"
-"%(difflink)s에서 어떤 것이 바뀌었는지 살펴보세요."
+"요!"
 
 #, python-format
 msgid "[Content of new page loaded from %s]"
@@ -275,7 +273,7 @@
 msgstr "이 문서는 이미 저장했습니다!"
 
 msgid "You already edited this page! Please do not use the back button."
-msgstr ""
+msgstr "이 문서를 수정하는 중입니다. 브라우저의 뒤로가기 버튼을 누르지 마십시오."
 
 #, python-format
 msgid "A backup of your changes is [%(backup_url)s here]."
@@ -487,7 +485,7 @@
 msgstr "더블 클릭해서 문서를 수정함"
 
 msgid "After login, jump to last visited page"
-msgstr ""
+msgstr "로그인 후 마지막으로 방문한 문서로 바로 가기"
 
 msgid "Show question mark for non-existing pagelinks"
 msgstr "존재하지 않는 문서 링크 옆에 물음표 표시"
@@ -532,7 +530,7 @@
 msgstr "암호 (확인)"
 
 msgid "(Only for password change or new account)"
-msgstr ""
+msgstr "(암호 변경 및 새로운 계정 생성용)"
 
 msgid "Email"
 msgstr "Email"
@@ -1079,15 +1077,15 @@
 msgstr "이 작업을 수행할 수 있는 권한이 없습니다."
 
 msgid "Do it."
-msgstr ""
+msgstr "실행"
 
 #, python-format
 msgid "Execute action %(actionname)s?"
-msgstr ""
+msgstr "%(actionname)s 액션을 수행할까요?"
 
 #, python-format
 msgid "Action %(actionname)s is excluded in this wiki!"
-msgstr ""
+msgstr "%(actionname)s 액션은 이 위키에서 제외되었습니다."
 
 #, python-format
 msgid "You are not allowed to use action %(actionname)s on this page!"
@@ -1326,9 +1324,8 @@
 msgid "Missing password. Please enter user name and password."
 msgstr "비밀번호가 없습니다. 사용자 이름과 비밀번호를 다시 입력하세요."
 
-#, fuzzy
 msgid "Sorry, login failed."
-msgstr "비밀번호가 틀렸습니다."
+msgstr "로그인에 실패하였습니다."
 
 msgid "You are now logged out."
 msgstr "로그아웃 되었습니다."
@@ -1567,9 +1564,8 @@
 msgid "Enabled"
 msgstr "사용 가능"
 
-#, fuzzy
 msgid "Xapian search"
-msgstr "루피 검색"
+msgstr "Xapian 검색"
 
 msgid "Active threads"
 msgstr "사용 중인 쓰레드 개수"
@@ -1638,7 +1634,6 @@
 msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
 msgstr "\"%(key)s\"뒤에는 색상 값 \"%(arg)s\"가(이) 필요합니다."
 
-#, fuzzy
 msgid ""
 "Rendering of reStructured text is not possible, please install Docutils."
 msgstr "ReStructured text를 처리할 수 없습니다. docutils를 설치해주세요."
@@ -1664,9 +1659,8 @@
 msgid "You are not allowed to do %s on this page."
 msgstr "이 문서에 %s 작업을 할 수 있는 권한이 없습니다."
 
-#, fuzzy
 msgid "Login and try again."
-msgstr " %s 하고 다시 시도하세요."
+msgstr "로그인 후 다시 시도하세요."
 
 #, python-format
 msgid ""
--- a/MoinMoin/i18n/lv.MoinMoin.po	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/i18n/lv.MoinMoin.po	Fri Aug 18 11:43:50 2006 +0200
@@ -13,7 +13,7 @@
 msgstr ""
 "Project-Id-Version: MoinMoin 1.6\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-07-17 12:27+0200\n"
+"POT-Creation-Date: 2006-07-24 15:27+0300\n"
 "PO-Revision-Date: 2005-09-07 20:50+0200\n"
 "Last-Translator: Radomirs Cirskis <nad2000@gmail.com>\n"
 "Language-Team: Latvian <r.cirskis@datapro.lv>\n"
@@ -494,7 +494,7 @@
 msgstr "Labot ar dubultklikšķi"
 
 msgid "After login, jump to last visited page"
-msgstr ""
+msgstr "Pēc pieslēgšanās pāriet uz pēdējo apmeklēto lapu"
 
 msgid "Show question mark for non-existing pagelinks"
 msgstr "Rādīt jautājuma zīmi neeksistējošu lapu saitēm"
@@ -539,7 +539,7 @@
 msgstr "Atkārtot paroli"
 
 msgid "(Only for password change or new account)"
-msgstr ""
+msgstr "(Paroles maiņai vai jaunam lietotāja kontam)"
 
 msgid "Email"
 msgstr "E-pasts"
--- a/MoinMoin/i18n/pt_br.MoinMoin.po	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/i18n/pt_br.MoinMoin.po	Fri Aug 18 11:43:50 2006 +0200
@@ -1506,7 +1506,7 @@
 
 #, python-format
 msgid "Release %s [Revision %s]"
-msgstr "Liberar %s [Revisão %s]"
+msgstr "Versão %s [Revisão %s]"
 
 msgid "4Suite Version"
 msgstr "Versão 4Suite"
--- a/MoinMoin/i18n/tools/mk_POTFILES.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/i18n/tools/mk_POTFILES.py	Fri Aug 18 11:43:50 2006 +0200
@@ -30,17 +30,14 @@
             path = os.path.join(d, name)
 
             # Strip the prefix.
-
             if path.startswith(prefix):
                 path = path[len(prefix):]
 
             # Test for exact blacklist matches.
-
             if path in blacklist:
                 continue
 
             # Test for directory blacklist matches.
-
             found = 0
             for blackitem in blacklist:
                 if path.startswith(blackitem):
@@ -51,11 +48,9 @@
                 files.append(path)
 
 def find_files(startdir, blacklist):
-
     "Find files under 'startdir' excluding those in the 'blacklist'."
 
     # Calculate the prefix from the start directory.
-
     prefix = os.path.join(startdir, "")
 
     # Start with an empty list of files.
@@ -67,11 +62,9 @@
 if __name__ == "__main__":
 
     # Find those files using the module defaults.
-
     files = find_files(startdir, blacklist)
 
     # Write the names out.
-
     outfile = open(outname_in, "w")
     try:
         for file in files:
@@ -80,7 +73,6 @@
         outfile.close()
 
     # Write the processed list out, ready for other purposes.
-
     outfile = open(outname_final, "w")
     outfile.write("POTFILES = \\\n")
     try:
--- a/MoinMoin/i18n/tools/po2wiki.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/i18n/tools/po2wiki.py	Fri Aug 18 11:43:50 2006 +0200
@@ -8,7 +8,7 @@
     import sys, os, xmlrpclib
     sys.path.insert(0, '../..')
 
-    excluded = ["en",] # languages managed in repository, not in wiki
+    excluded = ["en", ] # languages managed in repository, not in wiki
 
     lang = sys.argv[1]
     lang = lang.replace('_', '-') # module names use _ instead of -
@@ -20,7 +20,7 @@
         f.write(data)
         f.close()
         sys.exit(0)
-        
+
     data = data.decode('utf-8')
 
     cutpos = data.index(u"msgid")
--- a/MoinMoin/i18n/tools/wiki2po.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/i18n/tools/wiki2po.py	Fri Aug 18 11:43:50 2006 +0200
@@ -8,7 +8,7 @@
     import sys, xmlrpclib
     sys.path.insert(0, '../../..')
 
-    excluded = ["en",] # languages managed in repository, not in wiki
+    excluded = ["en", ] # languages managed in repository, not in wiki
 
     langfname = sys.argv[1]
     lang = langfname.replace('_', '-') # module names use _ instead of -
@@ -18,7 +18,7 @@
 
         pagename = "MoinI18n/%s" % lang
         print pagename
-        pagedata = wiki.getPage(pagename).encode('utf-8').replace("\n","\r\n")
+        pagedata = wiki.getPage(pagename).encode('utf-8').replace("\n", "\r\n")
 
         f = open("%s.%s.po" % (langfname, DOMAIN), "w")
         f.write(pagedata)
--- a/MoinMoin/macro/NewPage.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/macro/NewPage.py	Fri Aug 18 11:43:50 2006 +0200
@@ -79,7 +79,7 @@
         if parent == '@ME' and self.request.user.valid:
             parent = self.request.user.name
 
-        requires_input = nametemplate.find('%s') != -1
+        requires_input = '%s' in nametemplate
 
         if label:
             # Try to get a translation, this will probably not work in
--- a/MoinMoin/macro/RecentChanges.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/macro/RecentChanges.py	Fri Aug 18 11:43:50 2006 +0200
@@ -38,7 +38,7 @@
         elif line.action == 'ATTDRW':
             comment = _("Drawing '%(filename)s' saved.") % {
                 'filename': filename}
-    elif line.action.find('/REVERT') != -1:
+    elif '/REVERT' in line.action:
         rev = int(line.extra)
         comment = _("Revert to revision %(rev)d.") % {'rev': rev}
 
--- a/MoinMoin/macro/TableOfContents.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/macro/TableOfContents.py	Fri Aug 18 11:43:50 2006 +0200
@@ -67,7 +67,7 @@
         if self.include_macro is None:
             self.include_macro = wikiutil.importPlugin(self.macro.request.cfg,
                                                        'macro', "Include")
-        return self.pre_re.sub('', apply(self.include_macro, args, kwargs)).split('\n')
+        return self.pre_re.sub('', self.include_macro(*args, **kwargs)).split('\n')
 
     def run(self):
         _ = self._
--- a/MoinMoin/macro/__init__.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/macro/__init__.py	Fri Aug 18 11:43:50 2006 +0200
@@ -295,7 +295,7 @@
         for tag, url in list:
             buf.write('<dt><tt><a href="%s">%s</a></tt></dt>' % (
                 wikiutil.join_wiki(url, 'RecentChanges'), tag))
-            if url.find('$PAGE') == -1:
+            if '$PAGE' not in url:
                 buf.write('<dd><tt><a href="%s">%s</a></tt></dd>' % (url, url))
             else:
                 buf.write('<dd><tt>%s</tt></dd>' % url)
@@ -415,7 +415,7 @@
         from MoinMoin.mail.sendmail import decodeSpamSafeEmail
 
         args = args or ''
-        if args.find(',') == -1:
+        if ',' not in args:
             email = args
             text = ''
         else:
--- a/MoinMoin/mail/mailimport.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/mail/mailimport.py	Fri Aug 18 11:43:50 2006 +0200
@@ -77,16 +77,16 @@
     html_data = []
     text_data = []
 
-    to_addr = get_addrs(message, 'To')[0]
     from_addr = get_addrs(message, 'From')[0]
+    to_addrs = get_addrs(message, 'To')
     cc_addrs = get_addrs(message, 'Cc')
     bcc_addrs = get_addrs(message, 'Bcc')
-    target_addrs = [to_addr] + cc_addrs + bcc_addrs
+    target_addrs = to_addrs + cc_addrs + bcc_addrs
 
     subject = decode_2044(message['Subject'])
     date = time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime(mktime_tz(parsedate_tz(message['Date']))))
 
-    log("Processing mail:\n To: %r\n From: %r\n Subject: %r" % (to_addr, from_addr, subject))
+    log("Processing mail:\n To: %r\n From: %r\n Subject: %r" % (to_addrs[0], from_addr, subject))
 
     for part in message.walk():
         log(" Part " + repr((part.get_charsets(), part.get_content_charset(), part.get_content_type(), part.is_multipart(), )))
@@ -117,14 +117,13 @@
 
     return {'text': u"".join(text_data), 'html': u"".join(html_data),
             'attachments': attachments,
-            'target_addrs': target_addrs, 'to_addr': to_addr, 'cc_addrs': cc_addrs, 'bcc_addrs': bcc_addrs,
+            'target_addrs': target_addrs, 'to_addrs': to_addrs, 'cc_addrs': cc_addrs, 'bcc_addrs': bcc_addrs,
             'from_addr': from_addr,
             'subject': subject, 'date': date}
 
-def get_pagename_content(msg, email_subpage_template, wiki_address):
+def get_pagename_content(request, msg, email_subpage_template, wiki_address):
     """ Generates pagename and content according to the specification
         that can be found on MoinMoin:FeatureRequests/WikiEmailintegration """
-
     generate_summary = False
     choose_html = True
 
@@ -147,6 +146,10 @@
         if pagename_tpl[-1] == pagename_tpl[0] == "'":
             pagename_tpl = pagename_tpl[1:-1]
 
+    if not msg['subject'].strip():
+        msg['subject'] = '(...)' # we need non-empty subject
+
+    pagename_tpl = pagename_tpl.strip()
     if pagename_tpl.endswith("/"):
         pagename_tpl += email_subpage_template
 
@@ -163,6 +166,8 @@
         generate_summary = True
         pagename = pagename[1:].lstrip()
 
+    pagename = request.normalizePagename(pagename)
+
     if choose_html and msg['html']:
         content = "{{{#!html\n%s\n}}}" % msg['html'].replace("}}}", "} } }")
     else:
@@ -194,7 +199,7 @@
     if not request.user:
         raise ProcessingError("No suitable user found for mail address %r" % (msg['from_addr'][1], ))
 
-    d = get_pagename_content(msg, email_subpage_template, wiki_address)
+    d = get_pagename_content(request, msg, email_subpage_template, wiki_address)
     pagename = d['pagename']
     generate_summary = d['generate_summary']
 
@@ -235,9 +240,14 @@
     # assemble old page content and new mail body together
     old_content = Page(request, pagename).get_raw_body()
     if old_content:
-        new_content = u"%s\n-----\n%s" % (old_content, d['content'], )
+        new_content = u"%s\n-----\n" % old_content
     else:
-        new_content = d['content']
+        new_content = ''
+
+    if not (generate_summary and "/" in pagename):
+        new_content += u"'''Mail: %s (%s, [[DateTime(%s)]])'''\n\n" % (msg['subject'], email_to_markup(request, msg['from_addr']), msg['date'])
+
+    new_content += d['content']
     new_content += "\n" + u"\n * ".join(attachment_links)
 
     try:
@@ -260,17 +270,16 @@
                 break
 
         table_header = (u"\n\n## mail_overview (don't delete this line)\n" +
-                        u"|| '''[[GetText(From)]] ''' || '''[[GetText(To)]] ''' || '''[[GetText(Subject)]] ''' || '''[[GetText(Date)]] ''' || '''[[GetText(Link)]] ''' || '''[[GetText(Attachments)]] ''' ||\n"
+                        u"|| '''[[GetText(From)]] ''' || '''[[GetText(To)]] ''' || '''[[GetText(Content)]] ''' || '''[[GetText(Date)]] ''' || '''[[GetText(Attachments)]] ''' ||\n"
                        )
 
         from_col = email_to_markup(request, msg['from_addr'])
-        to_col = ' '.join([email_to_markup(request, (realname, mailaddr)) for realname, mailaddr in msg['target_addrs'] if mailaddr != wiki_address])
-        subj_col = msg['subject']
+        to_col = ' '.join([email_to_markup(request, (realname, mailaddr))
+                           for realname, mailaddr in msg['target_addrs'] if mailaddr != wiki_address])
+        subj_col = '["%s" %s]' % (pagename, msg['subject'])
         date_col = msg['date']
-        page_col = pagename
         attach_col = " ".join(attachment_links)
-        new_line = u'|| %s || %s || %s || [[DateTime(%s)]] || ["%s"] || %s ||' % (
-                    from_col, to_col, subj_col, date_col, page_col, attach_col)
+        new_line = u'|| %s || %s || %s || [[DateTime(%s)]] || %s ||' % (from_col, to_col, subj_col, date_col, attach_col)
         if found_table is not None:
             content = "\n".join(old_content[:table_ends] + [new_line] + old_content[table_ends:])
         else:
--- a/MoinMoin/parser/text_moin_wiki.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/parser/text_moin_wiki.py	Fri Aug 18 11:43:50 2006 +0200
@@ -30,8 +30,11 @@
 
     # some common strings
     PARENT_PREFIX = wikiutil.PARENT_PREFIX
-    sq_string = ur"('.*?')" # single quoted string
-    dq_string = ur"(\".*?\")" # double quoted string
+    # quoted strings (we require that there is at least one char (that is not the quoting char)
+    # inside to not confuse stuff like '''Contact:''' (just a bold Contact:) with interwiki markup
+    # OtherWiki:'Page with blanks'
+    sq_string = ur"('[^']+?')" # single quoted string
+    dq_string = ur"(\"[^\"]+?\")" # double quoted string
     q_string = ur"(%s|%s)" % (sq_string, dq_string) # quoted string
     attachment_schemas = ["attachment", "inline", "drawing"]
     punct_pattern = re.escape(u'''"\'}]|:,.)?!''')
@@ -758,7 +761,7 @@
     
     def _parser_repl(self, word):
         """Handle parsed code displays."""
-        if word[:3] == '{{{':
+        if word.startswith('{{{'):
             word = word[3:]
 
         self.parser = None
@@ -770,7 +773,7 @@
             word = ''
             self.in_pre = 3
             return self._closeP() + self.formatter.preformatted(1)
-        elif s_word[:2] == '#!':
+        elif s_word.startswith('#!'):
             # First try to find a parser for this (will go away in 2.0)
             parser_name = s_word[2:].split()[0]
             self.setParser(parser_name)
@@ -972,7 +975,7 @@
                 if self.in_pre == 1:
                     self.parser = None
                     parser_name = ''
-                    if (line.strip()[:2] == "#!"):
+                    if line.strip().startswith("#!"):
                         parser_name = line.strip()[2:].split()[0]
                         self.setParser(parser_name)
 
@@ -1054,7 +1057,7 @@
                 # Table mode
                 # TODO: move into function?                
                 if (not self.in_table and line[indlen:indlen + 2] == "||"
-                    and line[-3:] == "|| " and len(line) >= 5 + indlen):
+                    and line.endswith("|| ") and len(line) >= 5 + indlen):
                     # Start table
                     if self.list_types and not self.in_li:
                         self.request.write(self.formatter.listitem(1, style="list-style-type:none"))
@@ -1071,9 +1074,9 @@
                     self.in_table = True # self.lineno
                 elif (self.in_table and not
                       # intra-table comments should not break a table
-                      (line[:2] == "##" or  
+                      (line.startswith("##") or
                        line[indlen:indlen + 2] == "||" and
-                       line[-3:] == "|| " and
+                       line.endswith("|| ") and
                        len(line) >= 5 + indlen)):
                     
                     # Close table
--- a/MoinMoin/parser/text_rst.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/parser/text_rst.py	Fri Aug 18 11:43:50 2006 +0200
@@ -15,7 +15,6 @@
 import __builtin__
 import sys
 
-import types
 import os
 
 # docutils imports are below
@@ -227,7 +226,7 @@
     def append(self, text):
         f = sys._getframe()
         if f.f_back.f_code.co_filename.endswith('html4css1.py'):
-            if isinstance(text, types.StringType) or isinstance(text, types.UnicodeType):
+            if isinstance(text, (str, unicode)):
                 text = self.formatter.rawHTML(text)
         list.append(self, text)
 
@@ -256,7 +255,7 @@
         # Make all internal lists RawHTMLLists, see RawHTMLList class
         # comment for more information.
         for i in self.__dict__:
-            if isinstance(getattr(self, i), types.ListType):
+            if isinstance(getattr(self, i), list):
                 setattr(self, i, RawHTMLList(formatter))
 
     def depart_docinfo(self, node):
@@ -383,7 +382,7 @@
                 # Default case - make a link to a wiki page.
                 pagename = refuri
                 anchor = ''
-                if refuri.find('#') != -1:
+                if '#' in refuri:
                     pagename, anchor = refuri.split('#', 1)
                     anchor = '#' + anchor
                 page = Page(self.request, pagename)
--- a/MoinMoin/request/__init__.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/request/__init__.py	Fri Aug 18 11:43:50 2006 +0200
@@ -220,13 +220,16 @@
 
     def surge_protect(self):
         """ check if someone requesting too much from us """
+        limits = self.cfg.surge_action_limits
+        if not limits:
+            return False
+                                    
         validuser = self.user.valid
         current_id = validuser and self.user.name or self.remote_addr
         if not validuser and current_id.startswith('127.'): # localnet
             return False
         current_action = self.action
 
-        limits = self.cfg.surge_action_limits
         default_limit = self.cfg.surge_action_limits.get('default', (30, 60))
 
         now = int(time.time())
@@ -327,7 +330,7 @@
             accept_charset = accept_charset.lower()
             # Add iso-8859-1 if needed
             if (not '*' in accept_charset and
-                accept_charset.find('iso-8859-1') < 0):
+                'iso-8859-1' not in accept_charset):
                 accept_charset += ',iso-8859-1'
 
             # Make a list, sorted by quality value, using Schwartzian Transform
@@ -433,7 +436,7 @@
         """
         # Fix the script_name when using Apache on Windows.
         server_software = env.get('SERVER_SOFTWARE', '')
-        if os.name == 'nt' and server_software.find('Apache/') != -1:
+        if os.name == 'nt' and 'Apache/' in server_software:
             # Removes elements ending in '.' from the path.
             self.script_name = '/'.join([x for x in self.script_name.split('/')
                                          if not x.endswith('.')])
--- a/MoinMoin/script/account/check.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/script/account/check.py	Fri Aug 18 11:43:50 2006 +0200
@@ -189,12 +189,11 @@
                 self.process(uids)
 
     def make_WikiNames(self):
-        import string
         for uid, u in self.users.items():
             if u.disabled:
                 continue
             if not wikiutil.isStrictWikiname(u.name):
-                newname = string.capwords(u.name).replace(" ", "").replace("-", "")
+                newname = u.name.capwords().replace(" ", "").replace("-", "")
                 if not wikiutil.isStrictWikiname(newname):
                     print " %-20s %-30r - no WikiName, giving up" % (uid, u.name)
                 else:
--- a/MoinMoin/search/queryparser.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/search/queryparser.py	Fri Aug 18 11:43:50 2006 +0200
@@ -10,7 +10,7 @@
     @license: GNU GPL, see COPYING for details
 """
 
-import re, string
+import re
 from MoinMoin import config
 from MoinMoin.search.results import Match, TitleMatch, TextMatch
 
--- a/MoinMoin/security/__init__.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/security/__init__.py	Fri Aug 18 11:43:50 2006 +0200
@@ -169,38 +169,23 @@
 
     special_users = ["All", "Known", "Trusted"] # order is important
 
-    def __init__(self, request, lines=[]):
+    def __init__(self, cfg, lines=[]):
         """Initialize an ACL, starting from <nothing>.
         """
-        self.setLines(request.cfg, lines)
-
-    def setLines(self, cfg, lines=[]):
-        self.clean()
-        self.addBefore(cfg)
-        if not lines:
-            self.addDefault(cfg)
+        self._is_group = {}
+        if lines:
+            self.acl = [] # [ ('User', {"read": 0, ...}), ... ]
+            self.acl_lines = []
+            for line in lines:
+                self._addLine(cfg, line)
         else:
-            for line in lines:
-                self.addLine(cfg, line)
-        self.addAfter(cfg)
+            self.acl = None
+            self.acl_lines = None
 
-    def clean(self):
-        self.acl = [] # [ ('User', {"read": 0, ...}), ... ]
-        self.acl_lines = []
-        self._is_group = {}
-
-    def addBefore(self, cfg):
-        self.addLine(cfg, cfg.acl_rights_before, remember=0)
-    def addDefault(self, cfg):
-        self.addLine(cfg, cfg.acl_rights_default, remember=0)
-    def addAfter(self, cfg):
-        self.addLine(cfg, cfg.acl_rights_after, remember=0)
-
-    def addLine(self, cfg, aclstring, remember=1):
+    def _addLine(self, cfg, aclstring, remember=1):
         """ Add another ACL line
 
-        This can be used in multiple subsequent calls to process longer
-        lists.
+        This can be used in multiple subsequent calls to process longer lists.
 
         @param cfg: current config
         @param aclstring: acl string from page or cfg
@@ -216,26 +201,25 @@
         acliter = ACLStringIterator(cfg.acl_rights_valid, aclstring)
         for modifier, entries, rights in acliter:
             if entries == ['Default']:
-                self.addDefault(cfg)
-                continue
-
-            for entry in entries:
-                if group_re.search(entry):
-                    self._is_group[entry] = 1
-                rightsdict = {}
-                if modifier:
-                    # Only user rights are added to the right dict.
-                    # + add rights with value of 1
-                    # - add right with value of 0
-                    for right in rights:
-                        rightsdict[right] = (modifier == '+')
-                else:
-                    # All rights from acl_rights_valid are added to the
-                    # dict, user rights with value of 1, and other with
-                    # value of 0
-                    for right in cfg.acl_rights_valid:
-                        rightsdict[right] = (right in rights)
-                self.acl.append((entry, rightsdict))
+                self._addLine(cfg, cfg.acl_rights_default, remember=0)
+            else:
+                for entry in entries:
+                    if group_re.search(entry):
+                        self._is_group[entry] = 1
+                    rightsdict = {}
+                    if modifier:
+                        # Only user rights are added to the right dict.
+                        # + add rights with value of 1
+                        # - add right with value of 0
+                        for right in rights:
+                            rightsdict[right] = (modifier == '+')
+                    else:
+                        # All rights from acl_rights_valid are added to the
+                        # dict, user rights with value of 1, and other with
+                        # value of 0
+                        for right in cfg.acl_rights_valid:
+                            rightsdict[right] = (right in rights)
+                    self.acl.append((entry, rightsdict))
 
     def may(self, request, name, dowhat):
         """May <name> <dowhat>?
@@ -243,8 +227,10 @@
         """
         is_group_member = request.dicts.has_member
 
+        acl_page = self.acl or request.cfg._acl_rights_default.acl
+        acl = request.cfg._acl_rights_before.acl + acl_page + request.cfg._acl_rights_after.acl
         allowed = None
-        for entry, rightsdict in self.acl:
+        for entry, rightsdict in acl:
             if entry in self.special_users:
                 handler = getattr(self, "_special_"+entry, None)
                 allowed = handler(request, name, dowhat, rightsdict)
@@ -266,7 +252,11 @@
 
     def getString(self, b='#acl ', e='\n'):
         """print the acl strings we were fed with"""
-        return ''.join(["%s%s%s" % (b, l, e) for l in self.acl_lines])
+        if self.acl_lines:
+            acl_lines = ''.join(["%s%s%s" % (b, l, e) for l in self.acl_lines])
+        else:
+            acl_lines = ''
+        return acl_lines
 
     def _special_All(self, request, name, dowhat, rightsdict):
         return rightsdict.get(dowhat)
@@ -291,6 +281,7 @@
 
     def __eq__(self, other):
         return self.acl_lines == other.acl_lines
+
     def __ne__(self, other):
         return self.acl_lines != other.acl_lines
 
@@ -403,5 +394,5 @@
             else:
                 args = ""
             acl_lines.append(args)
-    return AccessControlList(request, acl_lines)
+    return AccessControlList(request.cfg, acl_lines)
 
--- a/MoinMoin/support/BasicAuthTransport.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/support/BasicAuthTransport.py	Fri Aug 18 11:43:50 2006 +0200
@@ -1,13 +1,13 @@
 # taken from Amos' XML-RPC HowTo:
 
-import string, xmlrpclib, httplib
+import xmlrpclib, httplib
 from base64 import encodestring
 
 class BasicAuthTransport(xmlrpclib.Transport):
     def __init__(self, username=None, password=None):
-        self.username=username
-        self.password=password
-        self.verbose=0
+        self.username = username
+        self.password = password
+        self.verbose = 0
 
     def request(self, host, handler, request_body, **kw):
         # issue XML-RPC request
@@ -21,13 +21,10 @@
         h.putheader("User-Agent", self.user_agent)
         h.putheader("Content-Type", "text/xml")
         h.putheader("Content-Length", str(len(request_body)))
-        #h.putheader("Connection", "close") # TW XXX just trying if that cures twisted ...
 
         # basic auth
         if self.username is not None and self.password is not None:
-            authhdr = "Basic %s" % string.replace(
-                    encodestring("%s:%s" % (self.username, self.password)),
-                    "\012", "")
+            authhdr = "Basic %s" % encodestring("%s:%s" % (self.username, self.password)).replace("\012", "")
             h.putheader("Authorization", authhdr)
         h.endheaders()
 
@@ -43,5 +40,5 @@
                 headers
                 )
 
-        return self.parse_response(h.getfile()) 
+        return self.parse_response(h.getfile())
 
--- a/MoinMoin/support/__init__.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/support/__init__.py	Fri Aug 18 11:43:50 2006 +0200
@@ -4,13 +4,8 @@
 
     This package collects small third party utilities in order
     to reduce the necessary steps in installing MoinMoin. Each
-    source file is copyrighted by its respective author. I've done
-    my best to assure those files are freely redistributable.
-
-    Further details on the modules:
-
-    cgitb
-        from python 2.2 + patches (see XXX)
+    source file is copyrighted by its respective author. We've done
+    our best to assure those files are freely redistributable.
 
     @copyright: 2001-2004 by Jrgen Hermann <jh@web.de>
     @license: GNU GPL, see COPYING for details.
--- a/MoinMoin/support/cgitb.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/support/cgitb.py	Fri Aug 18 11:43:50 2006 +0200
@@ -16,7 +16,7 @@
 
 By default, tracebacks are displayed but not saved, the context is 5 lines
 and the output format is 'html' (for backwards compatibility with the
-original use of this module)
+original use of this module).
 
 Alternatively, if you have caught an exception and want cgitb to display it
 for you, call cgitb.handler().  The optional argument to handler() is a
@@ -30,19 +30,19 @@
  - Refactor html and text functions to View class, HTMLFormatter and
    TextFormatter. No more duplicate formating code.
  - Layout is done with minimal html and css, in a way it can't be
-   effected by souranding code.
- - Built to be easy to subclass and modify without duplicating code
+   affected by surrounding code.
+ - Built to be easy to subclass and modify without duplicating code.
  - Change layout, important details come first.
- - Factor frame analaizing and formatting into separate class
+ - Factor frame analyzing and formatting into separate class.
  - Add debug argument, can be used to change error display e.g. user
-   error view, developer error view
- - Add viewClass argument, make it easy to customize the traceback view
- - Easy to customize system details and application details
+   error view, developer error view.
+ - Add viewClass argument, make it easy to customize the traceback view.
+ - Easy to customize system details and application details.
 
 The main goal of this rewrite was to have a traceback that can render
-few tracebacks combined. Its needed when you wrap an expection and want
+few tracebacks combined. It's needed when you wrap an expection and want
 to print both the traceback up to the wrapper exception, and the
-original traceback. There is no code to support this here, but its easy
+original traceback. There is no code to support this here, but it's easy
 to add by using your own View sub class.
 """
 
@@ -58,14 +58,14 @@
     Return a string that resets the CGI and browser to a known state.
     TODO: probably some of this is not needed any more.
     """
-    return '''<!--: spam
+    return """<!--: spam
 Content-Type: text/html
 
 <body><font style="color: white; font-size: 1px"> -->
 <body><font style="color: white; font-size: 1px"> --> -->
 </font> </font> </font> </script> </object> </blockquote> </pre>
 </table> </table> </table> </table> </table> </font> </font> </font>
-'''
+"""
 
 __UNDEF__ = [] # a special sentinel object
 
@@ -77,17 +77,16 @@
 
 class HTMLFormatter:
     """ Minimal html formatter """
-    
+
     def attributes(self, attributes=None):
         if attributes:
-            result = [' %s="%s"' % (k, v) for k, v in attributes.items()]           
+            result = [' %s="%s"' % (k, v) for k, v in attributes.items()]
             return ''.join(result)
         return ''
-    
+
     def tag(self, name, text, attributes=None):
-        return '<%s%s>%s</%s>\n' % (name, self.attributes(attributes), 
-                                    text, name)
-    
+        return '<%s%s>%s</%s>\n' % (name, self.attributes(attributes), text, name)
+
     def section(self, text, attributes=None):
         return self.tag('div', text, attributes)
 
@@ -114,9 +113,9 @@
         if isinstance(items, (list, tuple)):
             items = '\n' + ''.join([self.listItem(i) for i in items])
         return self.tag(name, items, attributes)
-    
+
     def listItem(self, text, attributes=None):
-        return self.tag('li', text, attributes)        
+        return self.tag('li', text, attributes)
 
     def link(self, href, text, attributes=None):
         if attributes is None:
@@ -125,14 +124,14 @@
         return self.tag('a', text, attributes)
 
     def strong(self, text, attributes=None):
-        return self.tag('strong', text, attributes)        
+        return self.tag('strong', text, attributes)
 
     def em(self, text, attributes=None):
-        return self.tag('em', text, attributes)        
+        return self.tag('em', text, attributes)
 
     def repr(self, object):
         return pydoc.html.repr(object)
-        
+
 
 class TextFormatter:
     """ Plain text formatter """
@@ -170,20 +169,20 @@
         return items
 
     def listItem(self, text, attributes=None):
-        return ' * %s\n' % text       
+        return ' * %s\n' % text
 
     def link(self, href, text, attributes=None):
         return '[[%s]]' % text
 
     def strong(self, text, attributes=None):
         return text
-   
+
     def em(self, text, attributes=None):
         return text
-   
+
     def repr(self, object):
         return repr(object)
-        
+
 
 class Frame:
     """ Analyze and format single frame in a traceback """
@@ -207,19 +206,19 @@
 
     # -----------------------------------------------------------------
     # Private - formatting
-        
+
     def formatCall(self):
         call = '%s in %s%s' % (self.formatFile(),
                                self.formatter.strong(self.func),
                                self.formatArguments(),)
         return self.formatter.paragraph(call, {'class': 'call'})
-    
+
     def formatFile(self):
         """ Return formatted file link """
         if not self.file:
             return '?'
         file = pydoc.html.escape(os.path.abspath(self.file))
-        return self.formatter.link('file://' + file, file)        
+        return self.formatter.link('file://' + file, file)
 
     def formatArguments(self):
         """ Return formated arguments list """
@@ -250,11 +249,11 @@
         return self.formatter.orderedList(context, {'class': 'context'})
 
     def formatVariables(self, vars):
-        """ Return formatted variables """ 
+        """ Return formatted variables """
         done = {}
         dump = []
         for name, where, value in vars:
-            if name in done: 
+            if name in done:
                 continue
             done[name] = 1
             if value is __UNDEF__:
@@ -280,12 +279,12 @@
     def scan(self):
         """ Scan frame for vars while setting highlight line """
         highlight = {}
-        
+
         def reader(lnum=[self.lnum]):
             highlight[lnum[0]] = 1
-            try: 
+            try:
                 return linecache.getline(self.file, lnum[0])
-            finally: 
+            finally:
                 lnum[0] += 1
 
         vars = self.scanVariables(reader)
@@ -295,7 +294,7 @@
         """ Lookup variables in one logical Python line """
         vars, lasttoken, parent, prefix, value = [], None, None, '', __UNDEF__
         for ttype, token, start, end, line in tokenize.generate_tokens(reader):
-            if ttype == tokenize.NEWLINE: 
+            if ttype == tokenize.NEWLINE:
                 break
             if ttype == tokenize.NAME and token not in keyword.kwlist:
                 if lasttoken == '.':
@@ -341,14 +340,14 @@
 
 class View:
     """ Traceback view """
-    
+
     frameClass = Frame # analyze and format a frame
-    
+
     def __init__(self, info=None, debug=0):
         """ Save starting info or current exception info """
         self.info = info or sys.exc_info()
         self.debug = debug
-        
+
     def format(self, formatter, context=5):
         self.formatter = formatter
         self.context = context
@@ -411,20 +410,20 @@
 
     # -----------------------------------------------------------------
     # Head
-    
+
     def formatTitle(self):
         return self.formatter.title(self.exceptionTitle(self.info))
-        
+
     def formatMessage(self):
         return self.formatter.paragraph(self.exceptionMessage(self.info))
-        
+
     # -----------------------------------------------------------------
     # Traceback
 
     def formatTraceback(self):
         """ Return formatted traceback """
         return self.formatOneTraceback(self.info)
-    
+
     def formatOneTraceback(self, info):
         """ Format one traceback
         
@@ -435,7 +434,7 @@
                   self.formatter.orderedList(self.tracebackFrames(info),
                                             {'class': 'frames'}),
                   self.formatter.section(self.formatException(info),
-                                         {'class': 'exception'}),]
+                                         {'class': 'exception'}), ]
         return self.formatter.section(''.join(output), {'class': 'traceback'})
 
     def tracebackFrames(self, info):
@@ -458,12 +457,12 @@
     def formatException(self, info):
         items = [self.formatExceptionTitle(info),
                  self.formatExceptionMessage(info),
-                 self.formatExceptionAttributes(info),]
+                 self.formatExceptionAttributes(info), ]
         return ''.join(items)
 
     def formatExceptionTitle(self, info):
         return self.formatter.subSubTitle(self.exceptionTitle(info))
-        
+
     def formatExceptionMessage(self, info):
         return self.formatter.paragraph(self.exceptionMessage(info))
 
@@ -471,7 +470,7 @@
         attribtues = []
         for name, value in self.exceptionAttributes(info):
             value = self.formatter.repr(value)
-            attribtues.append('%s = %s' % (name, value))           
+            attribtues.append('%s = %s' % (name, value))
         return self.formatter.list(attribtues)
 
     def exceptionAttributes(self, info):
@@ -488,7 +487,7 @@
     def exceptionTitle(self, info):
         type = info[0]
         return getattr(type, '__name__', str(type))
-        
+
     def exceptionMessage(self, info):
         instance = info[1]
         return pydoc.html.escape(str(instance))
@@ -500,15 +499,14 @@
     def formatSystemDetails(self):
         details = ['Date: %s' % self.date(),
                    'Platform: %s' % self.platform(),
-                   'Python: %s' % self.python(),]
+                   'Python: %s' % self.python(), ]
         details += self.applicationDetails()
         return (self.formatter.subTitle('System Details') +
                 self.formatter.list(details, {'class': 'system'}))
 
     def date(self):
         import time
-        rfc2822Date = time.strftime("%a, %d %b %Y %H:%M:%S +0000",
-                                    time.gmtime())
+        rfc2822Date = time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime())
         return rfc2822Date
 
     def platform(self):
@@ -535,7 +533,7 @@
         """ Separate to enable formatting multiple tracebacks. """
         import traceback
         return ''.join(traceback.format_exception(*info))
-    
+
     def textTracebackTemplate(self):
         return '''
     
@@ -593,7 +591,7 @@
 
         if self.logdir is not None:
             import os, tempfile
-            suffix = ['.txt', '.html'][self.format=="html"]
+            suffix = ['.txt', '.html'][self.format == "html"]
             (fd, path) = tempfile.mkstemp(suffix=suffix, dir=self.logdir)
             try:
                 file = os.fdopen(fd, 'w')
@@ -610,8 +608,7 @@
 
 handler = Hook().handle
 
-def enable(display=1, logdir=None, context=5, format="html",
-           viewClass=View, debug=0):
+def enable(display=1, logdir=None, context=5, format="html", viewClass=View, debug=0):
     """Install an exception handler that formats tracebacks as HTML.
 
     The optional argument 'display' can be set to 0 to suppress sending the
@@ -619,3 +616,4 @@
     tracebacks to be written to files there."""
     sys.excepthook = Hook(display=display, logdir=logdir, context=context,
                           format=format, viewClass=viewClass, debug=debug)
+
--- a/MoinMoin/support/thfcgi.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/support/thfcgi.py	Fri Aug 18 11:43:50 2006 +0200
@@ -1,6 +1,5 @@
 # -*- coding: iso-8859-1 -*-
 """
-    
     thfcgi.py - FastCGI communication with thread support
 
     Copyright Peter strand <astrand@lysator.liu.se> 2001
@@ -10,6 +9,10 @@
     Added "external application" support, refactored code
         by Alexander Schremmer <alex AT alexanderweb DOT de>
 
+    Cleanup, fixed typos, PEP-8, support for limiting creation of threads,
+    limited number of requests lifetime, configurable backlog for socket
+    .listen() by Thomas Waldmann <tw AT waldmann-edv DOT de>
+
     For code base see:
     http://cvs.lysator.liu.se/viewcvs/viewcvs.cgi/webkom/thfcgi.py?cvsroot=webkom
 
@@ -33,21 +36,27 @@
 # CONTENT_LENGTH and abort the update if the two numbers are not equal.
 #
 
-# Imports
+debug = False
+
 import os
 import sys
 import select
-import string
 import socket
 import errno
 import cgi
 from cStringIO import StringIO
 import struct
 
+try:
+    import threading as _threading
+except ImportError:
+    import dummy_threading as _threading
+
 # Maximum number of requests that can be handled
 FCGI_MAX_REQS = 50
 FCGI_MAX_CONNS = 50
 FCGI_VERSION_1 = 1
+
 # Can this application multiplex connections?
 FCGI_MPXS_CONNS = 0
 
@@ -90,8 +99,15 @@
 FCGI_UnknownTypeBody = "!B7x"
 FCGI_EndRequestBody = "!IB3x"
 
+LOGFILE = sys.stderr
+
+def log(s):
+    if debug:
+        LOGFILE.write(s)
+        LOGFILE.write('\n')
+
 class SocketErrorOnWrite:
-    """ Is raised if a write fails in the socket code."""
+    """Is raised if a write fails in the socket code."""
     pass
 
 class Record:
@@ -139,7 +155,7 @@
         value = data[pos:pos+valuelen]
         pos += valuelen
 
-        return (name, value, pos)
+        return name, value, pos
 
     def write_pair(self, name, value):
         """Write a FastCGI key-value pair to the server."""
@@ -158,29 +174,27 @@
             data += struct.pack("!I", value | 0x80000000L)
 
         return data + name + value
-        
+
     def readRecord(self, sock):
         """Read a FastCGI record from the server."""
         data = sock.recv(8)
         if not data:
-            # No data recieved. This means EOF. 
+            # No data received. This means EOF. 
             return None
-        
-        fields = struct.unpack(FCGI_Record_header, data)
-        (self.version, self.rec_type, self.req_id,
-         contentLength, paddingLength) = fields
-        
+
+        self.version, self.rec_type, self.req_id, contentLength, paddingLength = \
+            struct.unpack(FCGI_Record_header, data)
+
         self.content = ""
         while len(self.content) < contentLength:
             data = sock.recv(contentLength - len(self.content))
             self.content = self.content + data
         if paddingLength != 0:
             sock.recv(paddingLength)
-        
+
         # Parse the content information
         if self.rec_type == FCGI_BEGIN_REQUEST:
-            (self.role, self.flags) = struct.unpack(FCGI_BeginRequestBody,
-                                                    self.content)
+            self.role, self.flags = struct.unpack(FCGI_BeginRequestBody, self.content)
             self.keep_conn = self.flags & FCGI_KEEP_CONN
 
         elif self.rec_type == FCGI_UNKNOWN_TYPE:
@@ -192,10 +206,9 @@
             while pos < len(self.content):
                 name, value, pos = self.read_pair(self.content, pos)
                 self.values[name] = value
+
         elif self.rec_type == FCGI_END_REQUEST:
-            (self.appStatus,
-             self.protocolStatus) = struct.unpack(FCGI_EndRequestBody,
-                                                  self.content)
+            self.appStatus, self.protocolStatus = struct.unpack(FCGI_EndRequestBody, self.content)
 
         return 1
 
@@ -214,16 +227,14 @@
                 content = content + self.write_pair(i, self.values[i])
 
         elif self.rec_type == FCGI_END_REQUEST:
-            content = struct.pack(FCGI_EndRequestBody, self.appStatus,
-                                  self.protocolStatus)
+            content = struct.pack(FCGI_EndRequestBody, self.appStatus, self.protocolStatus)
 
         # Align to 8-byte boundary
         clen = len(content)
         padlen = ((clen + 7) & 0xfff8) - clen
-        
-        hdr = struct.pack(FCGI_Record_header, self.version, self.rec_type,
-                          self.req_id, clen, padlen)
-        
+
+        hdr = struct.pack(FCGI_Record_header, self.version, self.rec_type, self.req_id, clen, padlen)
+
         try:
             sock.sendall(hdr + content + padlen*"\x00")
         except socket.error:
@@ -234,13 +245,13 @@
 class Request:
     """A request, corresponding to an accept():ed connection and
     a FCGI request."""
-    
-    def __init__(self, conn, req_handler, multi=1):
+
+    def __init__(self, conn, req_handler, inthread=False):
         """Initialize Request container."""
         self.conn = conn
         self.req_handler = req_handler
-        self.multi = multi
-        
+        self.inthread = inthread
+
         self.keep_conn = 0
         self.req_id = None
 
@@ -276,14 +287,13 @@
             else:
                 # EOF, connection closed. Break loop, end thread. 
                 return
-                
+
     def getFieldStorage(self):
         """Return a cgi FieldStorage constructed from the stdin and
         environ read from the server for this request."""
         self.stdin.reset()
         # cgi.FieldStorage will eat the input here...
-        r = cgi.FieldStorage(fp=self.stdin, environ=self.env,
-                             keep_blank_values=1)
+        r = cgi.FieldStorage(fp=self.stdin, environ=self.env, keep_blank_values=1)
         # hence, we reset here so we can obtain
         # the data again...
         self.stdin.reset()
@@ -301,7 +311,7 @@
         if not data:
             # Writing zero bytes would mean stream termination
             return
-        
+
         while data:
             chunk, data = self.getNextChunk(data)
             rec.content = chunk
@@ -362,10 +372,9 @@
         rec.writeRecord(self.conn)
         if not self.keep_conn:
             self.conn.close()
-            if self.multi:
-                import thread
-                thread.exit()
-    
+            if self.inthread:
+                raise SystemExit
+
     #
     # Record handlers
     #
@@ -384,8 +393,7 @@
         if rec_type in KNOWN_MANAGEMENT_TYPES:
             self._handle_known_man_types(rec)
         else:
-            # It's a management record of an unknown
-            # type. Signal the error.
+            # It's a management record of an unknown type. Signal the error.
             rec = Record()
             rec.rec_type = FCGI_UNKNOWN_TYPE
             rec.unknownType = rec_type
@@ -397,9 +405,10 @@
             reply_rec = Record()
             reply_rec.rec_type = FCGI_GET_VALUES_RESULT
 
-            params = {'FCGI_MAX_CONNS' : FCGI_MAX_CONNS,
-                      'FCGI_MAX_REQS' : FCGI_MAX_REQS,
-                      'FCGI_MPXS_CONNS' : FCGI_MPXS_CONNS}
+            params = {'FCGI_MAX_CONNS': FCGI_MAX_CONNS,
+                      'FCGI_MAX_REQS': FCGI_MAX_REQS,
+                      'FCGI_MPXS_CONNS': FCGI_MPXS_CONNS,
+                     }
 
             for name in rec.values.keys():
                 if params.has_key(name):
@@ -416,7 +425,7 @@
             self._handle_begin_request(rec)
             return
         elif rec.req_id != self.req_id:
-            #print >> sys.stderr, "Recieved unknown request ID", rec.req_id
+            log("Received unknown request ID %r" % rec.req_id)
             # Ignore requests that aren't active
             return
         if rec.rec_type == FCGI_ABORT_REQUEST:
@@ -437,7 +446,7 @@
             self._handle_data(rec)
         else:
             # Should never happen. 
-            #print >> sys.stderr, "Recieved unknown FCGI record type", rec.rec_type
+            log("Received unknown FCGI record type %r" % rec.rec_type)
             pass
 
         if self.env_complete and self.stdin_complete:
@@ -461,14 +470,14 @@
 
         self.req_id = rec.req_id
         self.keep_conn = rec.keep_conn
-        
+
     def _handle_params(self, rec):
         """Handle environment."""
         if self.env_complete:
             # Should not happen
-            #print >> sys.stderr, "Recieved FCGI_PARAMS more than once"
+            log("Received FCGI_PARAMS more than once")
             return
-        
+
         if not rec.content:
             self.env_complete = 1
 
@@ -479,9 +488,9 @@
         """Handle stdin."""
         if self.stdin_complete:
             # Should not happen
-            #print >> sys.stderr, "Recieved FCGI_STDIN more than once"
+            log("Received FCGI_STDIN more than once")
             return
-        
+
         if not rec.content:
             self.stdin_complete = 1
             self.stdin.reset()
@@ -493,12 +502,12 @@
         """Handle data."""
         if self.data_complete:
             # Should not happen
-            #print >> sys.stderr, "Recieved FCGI_DATA more than once"
+            log("Received FCGI_DATA more than once")
             return
 
         if not rec.content:
             self.data_complete = 1
-        
+
         self.data.write(rec.content)
 
     def getNextChunk(self, data):
@@ -507,31 +516,30 @@
         data = data[8192:]
         return chunk, data
 
-class FCGIbase:
-    """Base class for FCGI requests."""
-    
-    def __init__(self, req_handler, fd, port):
+class FCGI:
+    """FCGI requests"""
+
+    def __init__(self, req_handler, fd=sys.stdin, port=None, max_requests=-1, backlog=5, max_threads=5):
         """Initialize main loop and set request_handler."""
         self.req_handler = req_handler
         self.fd = fd
         self.__port = port
         self._make_socket()
+        # how many requests we have left before terminating this process, -1 means infinite lifetime:
+        self.requests_left = max_requests
+        # for socket.listen(backlog):
+        self.backlog = backlog
+        # how many threads we have at maximum (including the main program = 1. thread)
+        self.max_threads = max_threads
 
-    def run(self):
-        raise NotImplementedError
-
-    def accept_handler(self, conn, addr):
+    def accept_handler(self, conn, addr, inthread=False):
         """Construct Request and run() it."""
         self._check_good_addrs(addr)
         try:
-            req = Request(conn, self.req_handler, self.multi)
+            req = Request(conn, self.req_handler, inthread)
             req.run()
         except SocketErrorOnWrite:
-            if self.multi:
-                import thread
-                thread.exit()
-            #else:
-            #    raise SystemExit
+            raise SystemExit
 
     def _make_socket(self):
         """Create socket and verify FCGI environment."""
@@ -550,54 +558,45 @@
                     raise ValueError("FastCGI port is not setup correctly")
         except socket.error, (err, errmsg):
             if err != errno.ENOTCONN:
-                raise RuntimeError("No FastCGI environment: %s - %s" % (`err`, errmsg))
+                raise RuntimeError("No FastCGI environment: %s - %s" % (repr(err), errmsg))
 
         self.sock = s
-        
+
     def _check_good_addrs(self, addr):
         """Check if request is done from the right server."""
         # Apaches mod_fastcgi seems not to use FCGI_WEB_SERVER_ADDRS. 
         if os.environ.has_key('FCGI_WEB_SERVER_ADDRS'):
-            good_addrs = string.split(os.environ['FCGI_WEB_SERVER_ADDRS'], ',')
-            good_addrs = map(string.strip, good_addrs) # Remove whitespace
+            good_addrs = os.environ['FCGI_WEB_SERVER_ADDRS'].split(',')
+            good_addrs = [addr.strip() for addr in good_addrs] # Remove whitespace
         else:
             good_addrs = None
-        
+
         # Check if the connection is from a legal address
-        if good_addrs != None and addr not in good_addrs:
+        if good_addrs is not None and addr not in good_addrs:
             raise RuntimeError("Connection from invalid server!")
 
-class THFCGI(FCGIbase):
-    """Multi-threaded main loop to handle FastCGI Requests."""
-    
-    def __init__(self, req_handler, fd=sys.stdin, port=None):
-        """Initialize main loop and set request_handler."""
-        self.multi = 1
-        FCGIbase.__init__(self, req_handler, fd, port)
-
     def run(self):
-        """Wait & serve. Calls request_handler in new
-        thread on every request."""
-        import thread
-        self.sock.listen(50)
-        
-        while 1:
-            (conn, addr) = self.sock.accept()
-            thread.start_new_thread(self.accept_handler, (conn, addr))
-
-class unTHFCGI(FCGIbase):
-    """Single-threaded main loop to handle FastCGI Requests."""
+        """Wait & serve. Calls request_handler on every request."""
+        self.sock.listen(self.backlog)
+        log("Starting Process")
+        running = True
+        while running:
+            if not self.requests_left:
+                # self.sock.shutdown(RDWR) here does NOT help with backlog
+                running = False
+            elif self.requests_left > 0:
+                self.requests_left -= 1
+            if running:
+                conn, addr = self.sock.accept()
+                threadcount = _threading.activeCount()
+                if threadcount < self.max_threads:
+                    log("Accepted connection, starting thread...")
+                    t = _threading.Thread(target=self.accept_handler, args=(conn, addr, True))
+                    t.start()
+                else:
+                    log("Accepted connection, running in main-thread...")
+                    self.accept_handler(conn, addr, False)
+                log("Active Threads: %d" % _threading.activeCount())
+        self.sock.close()
+        log("Ending Process")
 
-    def __init__(self, req_handler, fd=sys.stdin, port=None):
-        """Initialize main loop and set request_handler."""
-        self.multi = 0
-        FCGIbase.__init__(self, req_handler, fd, port)
-    
-    def run(self):
-        """Wait & serve. Calls request handler for every request (blocking)."""
-        self.sock.listen(50)
-        
-        while 1:
-            (conn, addr) = self.sock.accept()
-            self.accept_handler(conn, addr)
-   
--- a/MoinMoin/support/xapwrap/document.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/support/xapwrap/document.py	Fri Aug 18 11:43:50 2006 +0200
@@ -1,7 +1,6 @@
 """
     xapwrap.document - Pythonic wrapper around Xapian's Document API
 """
-import string
 import datetime
 import re
 import cPickle
--- a/MoinMoin/userform.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/userform.py	Fri Aug 18 11:43:50 2006 +0200
@@ -6,7 +6,7 @@
     @license: GNU GPL, see COPYING for details.
 """
 
-import string, time, re
+import time, re
 from MoinMoin import user, util, wikiutil
 from MoinMoin.util import web, timefuncs
 from MoinMoin.widget import html
@@ -359,8 +359,8 @@
                 '%s [%s%s:%s]' % (
                     time.strftime(self.cfg.datetime_fmt, timefuncs.tmtuple(t)),
                     "+-"[offset < 0],
-                    string.zfill("%d" % (abs(offset) / 3600), 2),
-                    string.zfill("%d" % (abs(offset) % 3600 / 60), 2),
+                    "%02d" % (abs(offset) / 3600),
+                    "%02d" % (abs(offset) % 3600 / 60),
                 ),
             ))
 
--- a/MoinMoin/util/__init__.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/util/__init__.py	Fri Aug 18 11:43:50 2006 +0200
@@ -14,9 +14,9 @@
 #############################################################################
 
 g_xmlIllegalCharPattern = re.compile('[\x01-\x08\x0B-\x0D\x0E-\x1F\x80-\xFF]')
-g_undoUtf8Pattern       = re.compile('\xC2([^\xC2])')
-g_cdataCharPattern      = re.compile('[&<\'\"]')
-g_textCharPattern       = re.compile('[&<]')
+g_undoUtf8Pattern = re.compile('\xC2([^\xC2])')
+g_cdataCharPattern = re.compile('[&<\'\"]')
+g_textCharPattern = re.compile('[&<]')
 g_charToEntity = {
     '&': '&amp;',
     '<': '&lt;',
@@ -60,11 +60,11 @@
     for i in range(len(numbers)-1):
         if pattern[-1] == ',':
             pattern = pattern + str(numbers[i])
-            if numbers[i]+1 == numbers[i+1]:
+            if numbers[i] + 1 == numbers[i+1]:
                 pattern = pattern + '-'
             else:
                 pattern = pattern + ','
-        elif numbers[i]+1 != numbers[i+1]:
+        elif numbers[i] + 1 != numbers[i+1]:
             pattern = pattern + str(numbers[i]) + ','
 
     if pattern[-1] in ',-':
@@ -116,3 +116,4 @@
 def random_string(length):
     chars = ''.join([chr(random.randint(0, 255)) for x in xrange(length)])
     return chars
+
--- a/MoinMoin/util/bdiff.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/util/bdiff.py	Fri Aug 18 11:43:50 2006 +0200
@@ -79,8 +79,8 @@
     a = ("foo\n" * 30)
     b = ("  fao" * 30)
 
-    a = file(r"C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Progra\Python\MoinMoin\moin-1.6-sync\MoinMoin\util\test.1").read()
-    b = file(r"C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Progra\Python\MoinMoin\moin-1.6-sync\MoinMoin\util\test.2").read()
+    a = file(r"test.1").read()
+    b = file(r"test.2").read()
     a = a.splitlines(1)
     b = b.splitlines(1)
 
--- a/MoinMoin/util/diff3.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/util/diff3.py	Fri Aug 18 11:43:50 2006 +0200
@@ -6,25 +6,28 @@
     @license: GNU GPL, see COPYING for details.
 """
 
-def text_merge(old, other, new, allow_conflicts=1,
-               marker1='<<<<<<<<<<<<<<<<<<<<<<<<<\n',
-               marker2='=========================\n',
-               marker3='>>>>>>>>>>>>>>>>>>>>>>>>>\n'):
+default_markers = ('<<<<<<<<<<<<<<<<<<<<<<<<<\n',
+                   '=========================\n',
+                   '>>>>>>>>>>>>>>>>>>>>>>>>>\n')
+
+def text_merge(old, other, new, allow_conflicts=1, *markers):
     """ do line by line diff3 merge with three strings """
     result = merge(old.splitlines(1), other.splitlines(1), new.splitlines(1),
-                   allow_conflicts, marker1, marker2, marker3)
+                   allow_conflicts, *markers)
     return ''.join(result)
 
-def merge(old, other, new, allow_conflicts=1,
-          marker1='<<<<<<<<<<<<<<<<<<<<<<<<<\n',
-          marker2='=========================\n',
-          marker3='>>>>>>>>>>>>>>>>>>>>>>>>>\n'):
+def merge(old, other, new, allow_conflicts=1, *markers):
     """ do line by line diff3 merge
         input must be lists containing single lines   
     """
+    if not markers:
+        markers = default_markers
+    marker1, marker2, marker3 = markers
+
     old_nr, other_nr, new_nr = 0, 0, 0
     old_len, other_len, new_len = len(old), len(other), len(new)
     result = []
+
     while old_nr < old_len and other_nr < other_len and new_nr < new_len:
         # unchanged
         if old[old_nr] == other[other_nr] == new[new_nr]:
@@ -33,6 +36,12 @@
             other_nr += 1
             new_nr += 1
         else:
+            if allow_conflicts == 2: # experimental addition to the algorithm
+                if other[other_nr] == new[new_nr]:
+                    result.append(new[new_nr])
+                    other_nr += 1
+                    new_nr += 1
+                    continue
             new_match = find_match(old, new, old_nr, new_nr)
             other_match = find_match(old, other, old_nr, other_nr)
             # new is changed
@@ -100,13 +109,16 @@
         pass
     # conflict
     else:
-        if not allow_conflicts:
-            return None
-        result.append(marker1)
-        result.extend(other[other_nr:])
-        result.append(marker2)
-        result.extend(new[new_nr:])
-        result.append(marker3)
+        if new == other:
+            result.extend(new[new_nr:])
+        else:
+            if not allow_conflicts:
+                return None
+            result.append(marker1)
+            result.extend(other[other_nr:])
+            result.append(marker2)
+            result.extend(new[new_nr:])
+            result.append(marker3)
     return result
 
 def tripple_match(old, other, new, other_match, new_match):
@@ -255,4 +267,3 @@
 
 if __name__ == '__main__':
     main()
-
--- a/MoinMoin/util/filesys.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/util/filesys.py	Fri Aug 18 11:43:50 2006 +0200
@@ -52,7 +52,7 @@
 
 
 def rename(oldname, newname):
-    ''' Multiplatform rename
+    """ Multiplatform rename
 
     Needed because win32 rename is not POSIX compliant, and does not
     remove target file if it exists.
@@ -62,14 +62,14 @@
     FIXME: What about rename locking? we can have a lock file in the
     page directory, named: PageName.lock, and lock this file before we
     rename, then unlock when finished.
-    '''
+    """
     if os.name == 'nt':
         if os.path.isfile(newname):
             try:
                 os.remove(newname)
             except OSError, er:
                 pass # let os.rename give us the error (if any)
-    return os.rename(oldname, newname)
+    os.rename(oldname, newname)
 
 
 def copystat(src, dst):
--- a/MoinMoin/util/lock.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/util/lock.py	Fri Aug 18 11:43:50 2006 +0200
@@ -6,7 +6,7 @@
     @license: GNU GPL, see COPYING for details.
 """
 
-import os, tempfile, time, errno
+import os, sys, tempfile, time, errno
 
 
 # Temporary debugging aid, to be replaced with system wide debuging
@@ -262,7 +262,6 @@
                 return True
         return False
 
-
 class ReadLock(ExclusiveLock):
     """ Read lock
     
@@ -305,3 +304,101 @@
                 self.writeLock.release()
         return False
 
+
+class LazyReadLock(ReadLock):
+    """ Lazy Read lock
+    
+    See ReadLock, but we do an optimization here:
+    If (and ONLY if) the resource protected by this lock is updated in a POSIX
+    style "write new content to tmpfile, rename tmpfile -> origfile", then reading
+    from an open origfile handle will give either the old content (when opened
+    before the rename happens) or the new content (when opened after the rename
+    happened), but never cause any trouble. This means that we don't have to lock
+    at all in that case.
+
+    Of course this doesn't work for us on the win32 platform:
+    * using MoveFileEx requires opening the file with some FILE_SHARE_DELETE
+      mode - we currently don't do that
+    * Win 95/98/ME do not have MoveFileEx
+    We currently solve by using the non-lazy locking code in ReadLock class.
+    """
+    def __init__(self, dir, timeout=None):
+        if sys.platform == 'win32':
+            ReadLock.__init__(self, dir, timeout)
+        else: # POSIX
+            self._locked = False
+
+    def acquire(self, timeout=None):
+        if sys.platform == 'win32':
+            return ReadLock.acquire(self, timeout)
+        else: # POSIX
+            self._locked = True
+            return True
+
+    def release(self):
+        if sys.platform == 'win32':
+            return ReadLock.release(self)
+        else:  # POSIX
+            self._locked = False
+
+    def exists(self):
+        if sys.platform == 'win32':
+            return ReadLock.exists(self)
+        else: # POSIX
+            return True
+
+    def isExpired(self):
+        if sys.platform == 'win32':
+            return ReadLock.isExpired(self)
+        else: # POSIX
+            return True
+
+    def expire(self):
+        if sys.platform == 'win32':
+            return ReadLock.expire(self)
+        else: # POSIX
+            return True
+
+class LazyWriteLock(WriteLock):
+    """ Lazy Write lock
+    
+    See WriteLock and LazyReadLock docs.
+    """
+    def __init__(self, dir, timeout=None):
+        if sys.platform == 'win32':
+            WriteLock.__init__(self, dir, timeout)
+        else: # POSIX
+            self._locked = False
+
+    def acquire(self, timeout=None):
+        if sys.platform == 'win32':
+            return WriteLock.acquire(self, timeout)
+        else: # POSIX
+            self._locked = True
+            return True
+
+    def release(self):
+        if sys.platform == 'win32':
+            return WriteLock.release(self)
+        else:  # POSIX
+            self._locked = False
+
+    def exists(self):
+        if sys.platform == 'win32':
+            return WriteLock.exists(self)
+        else: # POSIX
+            return True
+
+    def isExpired(self):
+        if sys.platform == 'win32':
+            return WriteLock.isExpired(self)
+        else: # POSIX
+            return True
+
+    def expire(self):
+        if sys.platform == 'win32':
+            return WriteLock.expire(self)
+        else: # POSIX
+            return True
+
+
--- a/MoinMoin/util/web.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/util/web.py	Fri Aug 18 11:43:50 2006 +0200
@@ -6,7 +6,7 @@
     @license: GNU GPL, see COPYING for details.
 """
 
-import re, types
+import re
 from MoinMoin import config
 
 def getIntegerInput(request, fieldname, default=None, minval=None, maxval=None):
@@ -224,11 +224,11 @@
             another Color instance, a tuple containing 3 color values, 
             a Netscape color name or a HTML color ("#RRGGBB").
         """
-        if isinstance(color, types.TupleType) and len(color) == 3:
+        if isinstance(color, tuple) and len(color) == 3:
             self.r, self.g, self.b = map(int, color)
         elif isinstance(color, Color):
             self.r, self.g, self.b = color.r, color.g, color.b
-        elif not isinstance(color, types.StringType):
+        elif not isinstance(color, str):
             raise TypeError("Color() expects a Color instance, a RGB triple or a color string")
         elif color[0] == '#':
             color = long(color[1:], 16)
--- a/MoinMoin/wikisync.py	Fri Aug 18 11:42:58 2006 +0200
+++ b/MoinMoin/wikisync.py	Fri Aug 18 11:43:50 2006 +0200
@@ -7,32 +7,338 @@
 """
 
 import os
+import xmlrpclib
 
 try:
     import cPickle as pickle
 except ImportError:
     import pickle
 
+
+from MoinMoin import wikiutil
 from MoinMoin.util import lock
-from MoinMoin.packages import unpackLine
+from MoinMoin.Page import Page
+from MoinMoin.packages import unpackLine, packLine
+
+
+MIMETYPE_MOIN = "text/wiki"
+# sync directions
+UP, DOWN, BOTH = range(3)
+
+
+def normalise_pagename(page_name, prefix):
+    """ Checks if the page_name starts with the prefix.
+        Returns None if it does not, otherwise strips the prefix.
+    """
+    if prefix:
+        if not page_name.startswith(prefix):
+            return None
+        else:
+            return page_name[len(prefix):]
+    else: