Merge branch 'release-0.8.2' 0.8.2
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Fri, 13 Jul 2012 22:39:42 +0000 (00:39 +0200)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Fri, 13 Jul 2012 22:39:42 +0000 (00:39 +0200)
214 files changed:
pom.xml
src/main/java/net/pterodactylus/sone/core/Core.java
src/main/java/net/pterodactylus/sone/core/CoreListener.java
src/main/java/net/pterodactylus/sone/core/CoreListenerManager.java
src/main/java/net/pterodactylus/sone/core/FreenetInterface.java
src/main/java/net/pterodactylus/sone/core/ImageInsertListener.java
src/main/java/net/pterodactylus/sone/core/ImageInserter.java
src/main/java/net/pterodactylus/sone/core/Options.java
src/main/java/net/pterodactylus/sone/core/PostProvider.java
src/main/java/net/pterodactylus/sone/core/SoneDownloader.java
src/main/java/net/pterodactylus/sone/core/SoneException.java
src/main/java/net/pterodactylus/sone/core/SoneInsertException.java
src/main/java/net/pterodactylus/sone/core/SoneInsertListener.java
src/main/java/net/pterodactylus/sone/core/SoneInsertListenerManager.java
src/main/java/net/pterodactylus/sone/core/SoneInserter.java
src/main/java/net/pterodactylus/sone/core/SoneProvider.java
src/main/java/net/pterodactylus/sone/core/SoneRescuer.java
src/main/java/net/pterodactylus/sone/core/UpdateChecker.java
src/main/java/net/pterodactylus/sone/core/UpdateListener.java
src/main/java/net/pterodactylus/sone/core/UpdateListenerManager.java
src/main/java/net/pterodactylus/sone/data/Album.java
src/main/java/net/pterodactylus/sone/data/Client.java
src/main/java/net/pterodactylus/sone/data/Fingerprintable.java
src/main/java/net/pterodactylus/sone/data/Image.java
src/main/java/net/pterodactylus/sone/data/Post.java
src/main/java/net/pterodactylus/sone/data/PostReply.java
src/main/java/net/pterodactylus/sone/data/Profile.java
src/main/java/net/pterodactylus/sone/data/Reply.java
src/main/java/net/pterodactylus/sone/data/Sone.java
src/main/java/net/pterodactylus/sone/data/TemporaryImage.java
src/main/java/net/pterodactylus/sone/data/impl/PostImpl.java [new file with mode: 0644]
src/main/java/net/pterodactylus/sone/fcp/AbstractSoneCommand.java
src/main/java/net/pterodactylus/sone/fcp/CreatePostCommand.java
src/main/java/net/pterodactylus/sone/fcp/CreateReplyCommand.java
src/main/java/net/pterodactylus/sone/fcp/DeletePostCommand.java
src/main/java/net/pterodactylus/sone/fcp/DeleteReplyCommand.java
src/main/java/net/pterodactylus/sone/fcp/FcpInterface.java
src/main/java/net/pterodactylus/sone/fcp/GetLocalSonesCommand.java
src/main/java/net/pterodactylus/sone/fcp/GetPostCommand.java
src/main/java/net/pterodactylus/sone/fcp/GetPostFeedCommand.java
src/main/java/net/pterodactylus/sone/fcp/GetPostsCommand.java
src/main/java/net/pterodactylus/sone/fcp/GetSoneCommand.java
src/main/java/net/pterodactylus/sone/fcp/GetSonesCommand.java
src/main/java/net/pterodactylus/sone/fcp/LikePostCommand.java
src/main/java/net/pterodactylus/sone/fcp/LikeReplyCommand.java
src/main/java/net/pterodactylus/sone/fcp/VersionCommand.java
src/main/java/net/pterodactylus/sone/freenet/L10nFilter.java
src/main/java/net/pterodactylus/sone/freenet/PluginStoreConfigurationBackend.java
src/main/java/net/pterodactylus/sone/freenet/SimpleFieldSetBuilder.java
src/main/java/net/pterodactylus/sone/freenet/StringBucket.java
src/main/java/net/pterodactylus/sone/freenet/fcp/AbstractCommand.java
src/main/java/net/pterodactylus/sone/freenet/fcp/Command.java
src/main/java/net/pterodactylus/sone/freenet/fcp/FcpException.java
src/main/java/net/pterodactylus/sone/freenet/plugin/ConnectorListener.java
src/main/java/net/pterodactylus/sone/freenet/plugin/ConnectorListenerManager.java
src/main/java/net/pterodactylus/sone/freenet/plugin/PluginConnector.java
src/main/java/net/pterodactylus/sone/freenet/plugin/PluginException.java
src/main/java/net/pterodactylus/sone/freenet/wot/DefaultIdentity.java
src/main/java/net/pterodactylus/sone/freenet/wot/DefaultOwnIdentity.java
src/main/java/net/pterodactylus/sone/freenet/wot/Identity.java
src/main/java/net/pterodactylus/sone/freenet/wot/IdentityListener.java
src/main/java/net/pterodactylus/sone/freenet/wot/IdentityListenerManager.java
src/main/java/net/pterodactylus/sone/freenet/wot/IdentityManager.java
src/main/java/net/pterodactylus/sone/freenet/wot/OwnIdentity.java
src/main/java/net/pterodactylus/sone/freenet/wot/Trust.java
src/main/java/net/pterodactylus/sone/freenet/wot/WebOfTrustConnector.java
src/main/java/net/pterodactylus/sone/freenet/wot/WebOfTrustException.java
src/main/java/net/pterodactylus/sone/main/SonePlugin.java
src/main/java/net/pterodactylus/sone/notify/ListNotification.java
src/main/java/net/pterodactylus/sone/notify/ListNotificationFilters.java
src/main/java/net/pterodactylus/sone/template/AlbumAccessor.java
src/main/java/net/pterodactylus/sone/template/CollectionAccessor.java
src/main/java/net/pterodactylus/sone/template/CssClassNameFilter.java
src/main/java/net/pterodactylus/sone/template/GetPagePlugin.java
src/main/java/net/pterodactylus/sone/template/HttpRequestAccessor.java
src/main/java/net/pterodactylus/sone/template/IdentityAccessor.java
src/main/java/net/pterodactylus/sone/template/ImageAccessor.java
src/main/java/net/pterodactylus/sone/template/ImageLinkFilter.java
src/main/java/net/pterodactylus/sone/template/JavascriptFilter.java
src/main/java/net/pterodactylus/sone/template/ParserFilter.java
src/main/java/net/pterodactylus/sone/template/PostAccessor.java
src/main/java/net/pterodactylus/sone/template/ProfileAccessor.java
src/main/java/net/pterodactylus/sone/template/ReplyAccessor.java
src/main/java/net/pterodactylus/sone/template/ReplyGroupFilter.java
src/main/java/net/pterodactylus/sone/template/RequestChangeFilter.java
src/main/java/net/pterodactylus/sone/template/SoneAccessor.java
src/main/java/net/pterodactylus/sone/template/SubstringFilter.java
src/main/java/net/pterodactylus/sone/template/TrustAccessor.java
src/main/java/net/pterodactylus/sone/template/UniqueElementFilter.java
src/main/java/net/pterodactylus/sone/template/UnknownDateFilter.java
src/main/java/net/pterodactylus/sone/text/FreenetLinkPart.java
src/main/java/net/pterodactylus/sone/text/LinkPart.java
src/main/java/net/pterodactylus/sone/text/Parser.java
src/main/java/net/pterodactylus/sone/text/ParserContext.java
src/main/java/net/pterodactylus/sone/text/Part.java
src/main/java/net/pterodactylus/sone/text/PartContainer.java
src/main/java/net/pterodactylus/sone/text/PlainTextPart.java
src/main/java/net/pterodactylus/sone/text/PostPart.java
src/main/java/net/pterodactylus/sone/text/SonePart.java
src/main/java/net/pterodactylus/sone/text/SoneTextParser.java
src/main/java/net/pterodactylus/sone/text/SoneTextParserContext.java
src/main/java/net/pterodactylus/sone/text/TextFilter.java
src/main/java/net/pterodactylus/sone/web/AboutPage.java
src/main/java/net/pterodactylus/sone/web/BookmarkPage.java
src/main/java/net/pterodactylus/sone/web/BookmarksPage.java
src/main/java/net/pterodactylus/sone/web/CreateAlbumPage.java
src/main/java/net/pterodactylus/sone/web/CreatePostPage.java
src/main/java/net/pterodactylus/sone/web/CreateReplyPage.java
src/main/java/net/pterodactylus/sone/web/CreateSonePage.java
src/main/java/net/pterodactylus/sone/web/DeleteAlbumPage.java
src/main/java/net/pterodactylus/sone/web/DeleteImagePage.java
src/main/java/net/pterodactylus/sone/web/DeletePostPage.java
src/main/java/net/pterodactylus/sone/web/DeleteProfileFieldPage.java
src/main/java/net/pterodactylus/sone/web/DeleteReplyPage.java
src/main/java/net/pterodactylus/sone/web/DeleteSonePage.java
src/main/java/net/pterodactylus/sone/web/DismissNotificationPage.java
src/main/java/net/pterodactylus/sone/web/DistrustPage.java
src/main/java/net/pterodactylus/sone/web/EditAlbumPage.java
src/main/java/net/pterodactylus/sone/web/EditImagePage.java
src/main/java/net/pterodactylus/sone/web/EditProfileFieldPage.java
src/main/java/net/pterodactylus/sone/web/EditProfilePage.java
src/main/java/net/pterodactylus/sone/web/FollowSonePage.java
src/main/java/net/pterodactylus/sone/web/GetImagePage.java
src/main/java/net/pterodactylus/sone/web/ImageBrowserPage.java
src/main/java/net/pterodactylus/sone/web/IndexPage.java
src/main/java/net/pterodactylus/sone/web/KnownSonesPage.java
src/main/java/net/pterodactylus/sone/web/LikePage.java
src/main/java/net/pterodactylus/sone/web/LockSonePage.java
src/main/java/net/pterodactylus/sone/web/LoginPage.java
src/main/java/net/pterodactylus/sone/web/LogoutPage.java
src/main/java/net/pterodactylus/sone/web/MarkAsKnownPage.java
src/main/java/net/pterodactylus/sone/web/OptionsPage.java
src/main/java/net/pterodactylus/sone/web/RescuePage.java
src/main/java/net/pterodactylus/sone/web/SearchPage.java
src/main/java/net/pterodactylus/sone/web/SoneTemplatePage.java
src/main/java/net/pterodactylus/sone/web/TrustPage.java
src/main/java/net/pterodactylus/sone/web/UnbookmarkPage.java
src/main/java/net/pterodactylus/sone/web/UnfollowSonePage.java
src/main/java/net/pterodactylus/sone/web/UnlikePage.java
src/main/java/net/pterodactylus/sone/web/UnlockSonePage.java
src/main/java/net/pterodactylus/sone/web/UntrustPage.java
src/main/java/net/pterodactylus/sone/web/UploadImagePage.java
src/main/java/net/pterodactylus/sone/web/ViewPostPage.java
src/main/java/net/pterodactylus/sone/web/ViewSonePage.java
src/main/java/net/pterodactylus/sone/web/WebInterface.java
src/main/java/net/pterodactylus/sone/web/ajax/BookmarkAjaxPage.java
src/main/java/net/pterodactylus/sone/web/ajax/CreatePostAjaxPage.java
src/main/java/net/pterodactylus/sone/web/ajax/CreateReplyAjaxPage.java
src/main/java/net/pterodactylus/sone/web/ajax/DeletePostAjaxPage.java
src/main/java/net/pterodactylus/sone/web/ajax/DeleteProfileFieldAjaxPage.java
src/main/java/net/pterodactylus/sone/web/ajax/DeleteReplyAjaxPage.java
src/main/java/net/pterodactylus/sone/web/ajax/DismissNotificationAjaxPage.java
src/main/java/net/pterodactylus/sone/web/ajax/DistrustAjaxPage.java
src/main/java/net/pterodactylus/sone/web/ajax/EditAlbumAjaxPage.java
src/main/java/net/pterodactylus/sone/web/ajax/EditImageAjaxPage.java
src/main/java/net/pterodactylus/sone/web/ajax/EditProfileFieldAjaxPage.java
src/main/java/net/pterodactylus/sone/web/ajax/FollowSoneAjaxPage.java
src/main/java/net/pterodactylus/sone/web/ajax/GetLikesAjaxPage.java
src/main/java/net/pterodactylus/sone/web/ajax/GetNotificationsAjaxPage.java
src/main/java/net/pterodactylus/sone/web/ajax/GetPostAjaxPage.java
src/main/java/net/pterodactylus/sone/web/ajax/GetReplyAjaxPage.java
src/main/java/net/pterodactylus/sone/web/ajax/GetStatusAjaxPage.java
src/main/java/net/pterodactylus/sone/web/ajax/GetTimesAjaxPage.java
src/main/java/net/pterodactylus/sone/web/ajax/GetTranslationPage.java
src/main/java/net/pterodactylus/sone/web/ajax/JsonPage.java
src/main/java/net/pterodactylus/sone/web/ajax/LikeAjaxPage.java
src/main/java/net/pterodactylus/sone/web/ajax/LockSoneAjaxPage.java
src/main/java/net/pterodactylus/sone/web/ajax/MarkAsKnownAjaxPage.java
src/main/java/net/pterodactylus/sone/web/ajax/MoveProfileFieldAjaxPage.java
src/main/java/net/pterodactylus/sone/web/ajax/TrustAjaxPage.java
src/main/java/net/pterodactylus/sone/web/ajax/UnbookmarkAjaxPage.java
src/main/java/net/pterodactylus/sone/web/ajax/UnfollowSoneAjaxPage.java
src/main/java/net/pterodactylus/sone/web/ajax/UnlikeAjaxPage.java
src/main/java/net/pterodactylus/sone/web/ajax/UnlockSoneAjaxPage.java
src/main/java/net/pterodactylus/sone/web/ajax/UntrustAjaxPage.java
src/main/java/net/pterodactylus/sone/web/page/FreenetPage.java
src/main/java/net/pterodactylus/sone/web/page/FreenetRequest.java
src/main/java/net/pterodactylus/sone/web/page/FreenetTemplatePage.java
src/main/java/net/pterodactylus/sone/web/page/PageToadlet.java
src/main/java/net/pterodactylus/sone/web/page/PageToadletFactory.java
src/main/resources/i18n/sone.de.properties
src/main/resources/i18n/sone.en.properties
src/main/resources/i18n/sone.fr.properties
src/main/resources/i18n/sone.no.properties
src/main/resources/i18n/sone.pl.properties [new file with mode: 0644]
src/main/resources/static/css/sone.css
src/main/resources/static/javascript/sone.js
src/main/resources/templates/about.html
src/main/resources/templates/bookmarks.html
src/main/resources/templates/deleteAlbum.html
src/main/resources/templates/deleteImage.html
src/main/resources/templates/deleteSone.html
src/main/resources/templates/editProfile.html
src/main/resources/templates/imageBrowser.html
src/main/resources/templates/include/browseAlbums.html
src/main/resources/templates/include/createSone.html
src/main/resources/templates/include/head.html
src/main/resources/templates/include/pagination.html
src/main/resources/templates/include/soneMenu.html
src/main/resources/templates/include/updateStatus.html
src/main/resources/templates/include/viewPost.html
src/main/resources/templates/include/viewReply.html
src/main/resources/templates/include/viewSone.html
src/main/resources/templates/index.html
src/main/resources/templates/invalid.html
src/main/resources/templates/knownSones.html
src/main/resources/templates/new.html
src/main/resources/templates/notify/newVersionNotification.html
src/main/resources/templates/notify/soneInsertNotification.html
src/main/resources/templates/notify/wotMissingNotification.html
src/main/resources/templates/options.html
src/main/resources/templates/viewPost.html
src/main/resources/templates/viewSone.html
src/test/java/net/pterodactylus/sone/text/SoneTextParserTest.java

diff --git a/pom.xml b/pom.xml
index 4fc785a..9ea02ae 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -2,12 +2,12 @@
        <modelVersion>4.0.0</modelVersion>
        <groupId>net.pterodactylus</groupId>
        <artifactId>sone</artifactId>
-       <version>0.8.1</version>
+       <version>0.8.2</version>
        <dependencies>
                <dependency>
                        <groupId>net.pterodactylus</groupId>
                        <artifactId>utils</artifactId>
-                       <version>0.11.4</version>
+                       <version>0.12</version>
                </dependency>
                <dependency>
                        <groupId>junit</groupId>
index 26d21ed..4001f46 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - Core.java - Copyright © 2010 David Roden
+ * Sone - Core.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -46,6 +46,7 @@ import net.pterodactylus.sone.data.Sone;
 import net.pterodactylus.sone.data.Sone.ShowCustomAvatars;
 import net.pterodactylus.sone.data.Sone.SoneStatus;
 import net.pterodactylus.sone.data.TemporaryImage;
+import net.pterodactylus.sone.data.impl.PostImpl;
 import net.pterodactylus.sone.fcp.FcpInterface;
 import net.pterodactylus.sone.fcp.FcpInterface.FullAccessRequired;
 import net.pterodactylus.sone.freenet.wot.Identity;
@@ -131,45 +132,45 @@ public class Core extends AbstractService implements IdentityListener, UpdateLis
 
        /** All local Sones. */
        /* synchronize access on this on itself. */
-       private Map<String, Sone> localSones = new HashMap<String, Sone>();
+       private final Map<String, Sone> localSones = new HashMap<String, Sone>();
 
        /** All remote Sones. */
        /* synchronize access on this on itself. */
-       private Map<String, Sone> remoteSones = new HashMap<String, Sone>();
+       private final Map<String, Sone> remoteSones = new HashMap<String, Sone>();
 
        /** All known Sones. */
-       private Set<String> knownSones = new HashSet<String>();
+       private final Set<String> knownSones = new HashSet<String>();
 
        /** All posts. */
-       private Map<String, Post> posts = new HashMap<String, Post>();
+       private final Map<String, Post> posts = new HashMap<String, Post>();
 
        /** All known posts. */
-       private Set<String> knownPosts = new HashSet<String>();
+       private final Set<String> knownPosts = new HashSet<String>();
 
        /** All replies. */
-       private Map<String, PostReply> replies = new HashMap<String, PostReply>();
+       private final Map<String, PostReply> replies = new HashMap<String, PostReply>();
 
        /** All known replies. */
-       private Set<String> knownReplies = new HashSet<String>();
+       private final Set<String> knownReplies = new HashSet<String>();
 
        /** All bookmarked posts. */
        /* synchronize access on itself. */
-       private Set<String> bookmarkedPosts = new HashSet<String>();
+       private final Set<String> bookmarkedPosts = new HashSet<String>();
 
        /** Trusted identities, sorted by own identities. */
-       private Map<OwnIdentity, Set<Identity>> trustedIdentities = Collections.synchronizedMap(new HashMap<OwnIdentity, Set<Identity>>());
+       private final Map<OwnIdentity, Set<Identity>> trustedIdentities = Collections.synchronizedMap(new HashMap<OwnIdentity, Set<Identity>>());
 
        /** All known albums. */
-       private Map<String, Album> albums = new HashMap<String, Album>();
+       private final Map<String, Album> albums = new HashMap<String, Album>();
 
        /** All known images. */
-       private Map<String, Image> images = new HashMap<String, Image>();
+       private final Map<String, Image> images = new HashMap<String, Image>();
 
        /** All temporary images. */
-       private Map<String, TemporaryImage> temporaryImages = new HashMap<String, TemporaryImage>();
+       private final Map<String, TemporaryImage> temporaryImages = new HashMap<String, TemporaryImage>();
 
        /** Ticker for threads that mark own elements as known. */
-       private Ticker localElementTicker = new Ticker();
+       private final Ticker localElementTicker = new Ticker();
 
        /** The time the configuration was last touched. */
        private volatile long lastConfigurationUpdate;
@@ -561,7 +562,7 @@ public class Core extends AbstractService implements IdentityListener, UpdateLis
                synchronized (posts) {
                        Post post = posts.get(postId);
                        if ((post == null) && create) {
-                               post = new Post(postId);
+                               post = new PostImpl(postId);
                                posts.put(postId, post);
                        }
                        return post;
@@ -1456,7 +1457,9 @@ public class Core extends AbstractService implements IdentityListener, UpdateLis
                                }
                                parentAlbum.addAlbum(album);
                        } else {
-                               topLevelAlbums.add(album);
+                               if (!topLevelAlbums.contains(album)) {
+                                       topLevelAlbums.add(album);
+                               }
                        }
                }
 
@@ -1597,7 +1600,7 @@ public class Core extends AbstractService implements IdentityListener, UpdateLis
                        logger.log(Level.FINE, String.format("Tried to create post for non-local Sone: %s", sone));
                        return null;
                }
-               final Post post = new Post(sone, time, text);
+               final Post post = new PostImpl(sone, time, text);
                if (recipient != null) {
                        post.setRecipient(recipient);
                }
@@ -2162,6 +2165,7 @@ public class Core extends AbstractService implements IdentityListener, UpdateLis
                        configuration.getIntValue("Option/ConfigurationVersion").setValue(0);
                        configuration.getIntValue("Option/InsertionDelay").setValue(options.getIntegerOption("InsertionDelay").getReal());
                        configuration.getIntValue("Option/PostsPerPage").setValue(options.getIntegerOption("PostsPerPage").getReal());
+                       configuration.getIntValue("Option/ImagesPerPage").setValue(options.getIntegerOption("ImagesPerPage").getReal());
                        configuration.getIntValue("Option/CharactersPerPost").setValue(options.getIntegerOption("CharactersPerPost").getReal());
                        configuration.getIntValue("Option/PostCutOffLength").setValue(options.getIntegerOption("PostCutOffLength").getReal());
                        configuration.getBooleanValue("Option/RequireFullAccess").setValue(options.getBooleanOption("RequireFullAccess").getReal());
@@ -2248,6 +2252,7 @@ public class Core extends AbstractService implements IdentityListener, UpdateLis
 
                }));
                options.addIntegerOption("PostsPerPage", new DefaultOption<Integer>(10, new IntegerRangeValidator(1, Integer.MAX_VALUE)));
+               options.addIntegerOption("ImagesPerPage", new DefaultOption<Integer>(9, new IntegerRangeValidator(1, Integer.MAX_VALUE)));
                options.addIntegerOption("CharactersPerPost", new DefaultOption<Integer>(400, new OrValidator<Integer>(new IntegerRangeValidator(50, Integer.MAX_VALUE), new EqualityValidator<Integer>(-1))));
                options.addIntegerOption("PostCutOffLength", new DefaultOption<Integer>(200, new OrValidator<Integer>(new IntegerRangeValidator(50, Integer.MAX_VALUE), new EqualityValidator<Integer>(-1))));
                options.addBooleanOption("RequireFullAccess", new DefaultOption<Boolean>(false));
@@ -2288,6 +2293,7 @@ public class Core extends AbstractService implements IdentityListener, UpdateLis
 
                loadConfigurationValue("InsertionDelay");
                loadConfigurationValue("PostsPerPage");
+               loadConfigurationValue("ImagesPerPage");
                loadConfigurationValue("CharactersPerPost");
                loadConfigurationValue("PostCutOffLength");
                options.getBooleanOption("RequireFullAccess").set(configuration.getBooleanValue("Option/RequireFullAccess").getValue(null));
@@ -2671,6 +2677,39 @@ public class Core extends AbstractService implements IdentityListener, UpdateLis
                }
 
                /**
+                * Returns the number of images to show per page.
+                *
+                * @return The number of images to show per page
+                */
+               public int getImagesPerPage() {
+                       return options.getIntegerOption("ImagesPerPage").get();
+               }
+
+               /**
+                * Validates the number of images per page.
+                *
+                * @param imagesPerPage
+                *            The number of images per page
+                * @return {@code true} if the number of images per page was valid,
+                *         {@code false} otherwise
+                */
+               public boolean validateImagesPerPage(Integer imagesPerPage) {
+                       return options.getIntegerOption("ImagesPerPage").validate(imagesPerPage);
+               }
+
+               /**
+                * Sets the number of images per page.
+                *
+                * @param imagesPerPage
+                *            The number of images per page
+                * @return This preferences object
+                */
+               public Preferences setImagesPerPage(Integer imagesPerPage) {
+                       options.getIntegerOption("ImagesPerPage").set(imagesPerPage);
+                       return this;
+               }
+
+               /**
                 * Returns the number of characters per post, or <code>-1</code> if the
                 * posts should not be cut off.
                 *
index 2e7b337..b56bff5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - CoreListener.java - Copyright © 2010 David Roden
+ * Sone - CoreListener.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 9951ccd..0385698 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - CoreListenerManager.java - Copyright © 2010 David Roden
+ * Sone - CoreListenerManager.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 3348e88..a8f3efa 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - FreenetInterface.java - Copyright © 2010 David Roden
+ * Sone - FreenetInterface.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index a0e8a56..ca1ab3e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - ImageInsertListener.java - Copyright © 2011 David Roden
+ * Sone - ImageInsertListener.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index b4421ce..4fc7e89 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - ImageInserter.java - Copyright © 2011 David Roden
+ * Sone - ImageInserter.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index bf51e02..af81d0f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - Options.java - Copyright © 2010 David Roden
+ * Sone - Options.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index edede44..6e46326 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - PostProvider.java - Copyright © 2011 David Roden
+ * Sone - PostProvider.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 98337b9..72ff008 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - SoneDownloader.java - Copyright © 2010 David Roden
+ * Sone - SoneDownloader.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 683a148..323fd66 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - SoneException.java - Copyright © 2010 David Roden
+ * Sone - SoneException.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 350c3d8..5cb8669 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - SoneInsertException.java - Copyright © 2011 David Roden
+ * Sone - SoneInsertException.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 6391d8a..6f99fe6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - SoneInsertListener.java - Copyright © 2011 David Roden
+ * Sone - SoneInsertListener.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 9e4ea2a..6841e7f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - SoneInsertListenerManager.java - Copyright © 2011 David Roden
+ * Sone - SoneInsertListenerManager.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 9f45e2e..534985a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - SoneInserter.java - Copyright © 2010 David Roden
+ * Sone - SoneInserter.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index dcf0f61..25f4d8b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - SoneProvider.java - Copyright © 2011 David Roden
+ * Sone - SoneProvider.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 542ec4a..0c1e64e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - SoneRescuer.java - Copyright © 2011 David Roden
+ * Sone - SoneRescuer.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 511f4e1..003e276 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - UpdateChecker.java - Copyright © 2011 David Roden
+ * Sone - UpdateChecker.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 18f4b88..2d52f16 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - UpdateListener.java - Copyright © 2011 David Roden
+ * Sone - UpdateListener.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index cddf8db..31fdbed 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - UpdateListenerManager.java - Copyright © 2011 David Roden
+ * Sone - UpdateListenerManager.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 0bdf3a9..44b37b7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - Album.java - Copyright © 2011 David Roden
+ * Sone - Album.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,8 +24,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
-import net.pterodactylus.util.collection.Mapper;
-import net.pterodactylus.util.collection.Mappers;
+import net.pterodactylus.util.collection.IterableWrapper;
+import net.pterodactylus.util.collection.filter.NotNullFilter;
+import net.pterodactylus.util.collection.mapper.Mapper;
 import net.pterodactylus.util.object.Default;
 import net.pterodactylus.util.validation.Validation;
 
@@ -207,7 +208,7 @@ public class Album implements Fingerprintable {
         * @return The images in this album
         */
        public List<Image> getImages() {
-               return Mappers.mappedList(imageIds, new Mapper<String, Image>() {
+               return IterableWrapper.wrap(imageIds).map(new Mapper<String, Image>() {
 
                        @Override
                        @SuppressWarnings("synthetic-access")
@@ -215,7 +216,7 @@ public class Album implements Fingerprintable {
                                return images.get(imageId);
                        }
 
-               });
+               }).filter(new NotNullFilter()).list();
        }
 
        /**
index 2386124..93b8dbf 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - Client.java - Copyright © 2010 David Roden
+ * Sone - Client.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 013e0b3..96e6bc0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - Fingerprintable.java - Copyright © 2011 David Roden
+ * Sone - Fingerprintable.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 04eb349..25a36e3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - Image.java - Copyright © 2011 David Roden
+ * Sone - Image.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 1a29480..f171475 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - Post.java - Copyright © 2010 David Roden
+ * Sone - Post.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,9 +18,8 @@
 package net.pterodactylus.sone.data;
 
 import java.util.Comparator;
-import java.util.UUID;
 
-import net.pterodactylus.util.filter.Filter;
+import net.pterodactylus.util.collection.filter.Filter;
 
 /**
  * A post is a short message that a user writes in his Sone to let other users
@@ -28,7 +27,7 @@ import net.pterodactylus.util.filter.Filter;
  *
  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
  */
-public class Post {
+public interface Post {
 
        /** Comparator for posts, sorts descending by time. */
        public static final Comparator<Post> TIME_COMPARATOR = new Comparator<Post>() {
@@ -50,79 +49,6 @@ public class Post {
 
        };
 
-       /** The GUID of the post. */
-       private final UUID id;
-
-       /** The Sone this post belongs to. */
-       private volatile Sone sone;
-
-       /** The Sone of the recipient. */
-       private volatile Sone recipient;
-
-       /** The time of the post (in milliseconds since Jan 1, 1970 UTC). */
-       private volatile long time;
-
-       /** The text of the post. */
-       private volatile String text;
-
-       /** Whether the post is known. */
-       private volatile boolean known;
-
-       /**
-        * Creates a new post.
-        *
-        * @param id
-        *            The ID of the post
-        */
-       public Post(String id) {
-               this(id, null, 0, null);
-       }
-
-       /**
-        * Creates a new post.
-        *
-        * @param sone
-        *            The Sone this post belongs to
-        * @param text
-        *            The text of the post
-        */
-       public Post(Sone sone, String text) {
-               this(sone, System.currentTimeMillis(), text);
-       }
-
-       /**
-        * Creates a new post.
-        *
-        * @param sone
-        *            The Sone this post belongs to
-        * @param time
-        *            The time of the post (in milliseconds since Jan 1, 1970 UTC)
-        * @param text
-        *            The text of the post
-        */
-       public Post(Sone sone, long time, String text) {
-               this(UUID.randomUUID().toString(), sone, time, text);
-       }
-
-       /**
-        * Creates a new post.
-        *
-        * @param id
-        *            The ID of the post
-        * @param sone
-        *            The Sone this post belongs to
-        * @param time
-        *            The time of the post (in milliseconds since Jan 1, 1970 UTC)
-        * @param text
-        *            The text of the post
-        */
-       public Post(String id, Sone sone, long time, String text) {
-               this.id = UUID.fromString(id);
-               this.sone = sone;
-               this.time = time;
-               this.text = text;
-       }
-
        //
        // ACCESSORS
        //
@@ -132,18 +58,14 @@ public class Post {
         *
         * @return The ID of the post
         */
-       public String getId() {
-               return id.toString();
-       }
+       public String getId();
 
        /**
         * Returns the Sone this post belongs to.
         *
         * @return The Sone of this post
         */
-       public Sone getSone() {
-               return sone;
-       }
+       public Sone getSone();
 
        /**
         * Sets the Sone of this post.
@@ -152,19 +74,14 @@ public class Post {
         *            The Sone of this post
         * @return This post (for method chaining)
         */
-       public Post setSone(Sone sone) {
-               this.sone = sone;
-               return this;
-       }
+       public Post setSone(Sone sone);
 
        /**
         * Returns the recipient of this post, if any.
         *
         * @return The recipient of this post, or {@code null}
         */
-       public Sone getRecipient() {
-               return recipient;
-       }
+       public Sone getRecipient();
 
        /**
         * Sets the recipient of this post.
@@ -173,21 +90,14 @@ public class Post {
         *            The recipient of this post, or {@code null}
         * @return This post (for method chaining)
         */
-       public Post setRecipient(Sone recipient) {
-               if (!sone.equals(recipient)) {
-                       this.recipient = recipient;
-               }
-               return this;
-       }
+       public Post setRecipient(Sone recipient);
 
        /**
         * Returns the time of the post.
         *
         * @return The time of the post (in milliseconds since Jan 1, 1970 UTC)
         */
-       public long getTime() {
-               return time;
-       }
+       public long getTime();
 
        /**
         * Sets the time of this post.
@@ -196,19 +106,14 @@ public class Post {
         *            The time of this post (in milliseconds since Jan 1, 1970 UTC)
         * @return This post (for method chaining)
         */
-       public Post setTime(long time) {
-               this.time = time;
-               return this;
-       }
+       public Post setTime(long time);
 
        /**
         * Returns the text of the post.
         *
         * @return The text of the post
         */
-       public String getText() {
-               return text;
-       }
+       public String getText();
 
        /**
         * Sets the text of this post.
@@ -217,19 +122,14 @@ public class Post {
         *            The text of this post
         * @return This post (for method chaining)
         */
-       public Post setText(String text) {
-               this.text = text;
-               return this;
-       }
+       public Post setText(String text);
 
        /**
         * Returns whether this post is known.
         *
         * @return {@code true} if this post is known, {@code false} otherwise
         */
-       public boolean isKnown() {
-               return known;
-       }
+       public boolean isKnown();
 
        /**
         * Sets whether this post is known.
@@ -238,41 +138,6 @@ public class Post {
         *            {@code true} if this post is known, {@code false} otherwise
         * @return This post
         */
-       public Post setKnown(boolean known) {
-               this.known = known;
-               return this;
-       }
-
-       //
-       // OBJECT METHODS
-       //
-
-       /**
-        * {@inheritDoc}
-        */
-       @Override
-       public int hashCode() {
-               return id.hashCode();
-       }
-
-       /**
-        * {@inheritDoc}
-        */
-       @Override
-       public boolean equals(Object object) {
-               if (!(object instanceof Post)) {
-                       return false;
-               }
-               Post post = (Post) object;
-               return post.id.equals(id);
-       }
-
-       /**
-        * {@inheritDoc}
-        */
-       @Override
-       public String toString() {
-               return getClass().getName() + "[id=" + id + ",sone=" + sone + ",time=" + time + ",text=" + text + "]";
-       }
+       public Post setKnown(boolean known);
 
 }
index 3222d9d..0f63be1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - PostReply.java - Copyright © 2010–2011 David Roden
+ * Sone - PostReply.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 6c0b435..6936409 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - Profile.java - Copyright © 2010 David Roden
+ * Sone - Profile.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 15d8287..be60b88 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - Reply.java - Copyright © 2011 David Roden
+ * Sone - Reply.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,7 +20,7 @@ package net.pterodactylus.sone.data;
 import java.util.Comparator;
 import java.util.UUID;
 
-import net.pterodactylus.util.filter.Filter;
+import net.pterodactylus.util.collection.filter.Filter;
 
 /**
  * Abstract base class for all replies.
index e5ebcf1..ac6e41a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - Sone.java - Copyright © 2010 David Roden
+ * Sone - Sone.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -33,7 +33,7 @@ import net.pterodactylus.sone.core.Options;
 import net.pterodactylus.sone.freenet.wot.Identity;
 import net.pterodactylus.sone.freenet.wot.OwnIdentity;
 import net.pterodactylus.sone.template.SoneAccessor;
-import net.pterodactylus.util.filter.Filter;
+import net.pterodactylus.util.collection.filter.Filter;
 import net.pterodactylus.util.logging.Logging;
 import net.pterodactylus.util.validation.Validation;
 import freenet.keys.FreenetURI;
index ddac505..5e7c78d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - TemporaryImage.java - Copyright © 2011 David Roden
+ * Sone - TemporaryImage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
diff --git a/src/main/java/net/pterodactylus/sone/data/impl/PostImpl.java b/src/main/java/net/pterodactylus/sone/data/impl/PostImpl.java
new file mode 100644 (file)
index 0000000..2269738
--- /dev/null
@@ -0,0 +1,237 @@
+/*
+ * Sone - PostImpl.java - Copyright © 2010–2012 David Roden
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package net.pterodactylus.sone.data.impl;
+
+import java.util.UUID;
+
+import net.pterodactylus.sone.data.Post;
+import net.pterodactylus.sone.data.Sone;
+
+/**
+ * A post is a short message that a user writes in his Sone to let other users
+ * know what is going on.
+ *
+ * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
+ */
+public class PostImpl implements Post {
+
+       /** The GUID of the post. */
+       private final UUID id;
+
+       /** The Sone this post belongs to. */
+       private volatile Sone sone;
+
+       /** The Sone of the recipient. */
+       private volatile Sone recipient;
+
+       /** The time of the post (in milliseconds since Jan 1, 1970 UTC). */
+       private volatile long time;
+
+       /** The text of the post. */
+       private volatile String text;
+
+       /** Whether the post is known. */
+       private volatile boolean known;
+
+       /**
+        * Creates a new post.
+        *
+        * @param id
+        *            The ID of the post
+        */
+       public PostImpl(String id) {
+               this(id, null, 0, null);
+       }
+
+       /**
+        * Creates a new post.
+        *
+        * @param sone
+        *            The Sone this post belongs to
+        * @param text
+        *            The text of the post
+        */
+       public PostImpl(Sone sone, String text) {
+               this(sone, System.currentTimeMillis(), text);
+       }
+
+       /**
+        * Creates a new post.
+        *
+        * @param sone
+        *            The Sone this post belongs to
+        * @param time
+        *            The time of the post (in milliseconds since Jan 1, 1970 UTC)
+        * @param text
+        *            The text of the post
+        */
+       public PostImpl(Sone sone, long time, String text) {
+               this(UUID.randomUUID().toString(), sone, time, text);
+       }
+
+       /**
+        * Creates a new post.
+        *
+        * @param id
+        *            The ID of the post
+        * @param sone
+        *            The Sone this post belongs to
+        * @param time
+        *            The time of the post (in milliseconds since Jan 1, 1970 UTC)
+        * @param text
+        *            The text of the post
+        */
+       public PostImpl(String id, Sone sone, long time, String text) {
+               this.id = UUID.fromString(id);
+               this.sone = sone;
+               this.time = time;
+               this.text = text;
+       }
+
+       //
+       // ACCESSORS
+       //
+
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public String getId() {
+               return id.toString();
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public Sone getSone() {
+               return sone;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public PostImpl setSone(Sone sone) {
+               this.sone = sone;
+               return this;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public Sone getRecipient() {
+               return recipient;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public PostImpl setRecipient(Sone recipient) {
+               if (!sone.equals(recipient)) {
+                       this.recipient = recipient;
+               }
+               return this;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public long getTime() {
+               return time;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public PostImpl setTime(long time) {
+               this.time = time;
+               return this;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public String getText() {
+               return text;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public PostImpl setText(String text) {
+               this.text = text;
+               return this;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public boolean isKnown() {
+               return known;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public PostImpl setKnown(boolean known) {
+               this.known = known;
+               return this;
+       }
+
+       //
+       // OBJECT METHODS
+       //
+
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public int hashCode() {
+               return id.hashCode();
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public boolean equals(Object object) {
+               if (!(object instanceof PostImpl)) {
+                       return false;
+               }
+               PostImpl post = (PostImpl) object;
+               return post.id.equals(id);
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public String toString() {
+               return getClass().getName() + "[id=" + id + ",sone=" + sone + ",time=" + time + ",text=" + text + "]";
+       }
+
+}
index 3a246c3..490a05c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - FcpInterface.java - Copyright © 2011 David Roden
+ * Sone - FcpInterface.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -32,7 +32,7 @@ import net.pterodactylus.sone.freenet.fcp.AbstractCommand;
 import net.pterodactylus.sone.freenet.fcp.Command;
 import net.pterodactylus.sone.freenet.fcp.FcpException;
 import net.pterodactylus.sone.template.SoneAccessor;
-import net.pterodactylus.util.filter.Filters;
+import net.pterodactylus.util.collection.filter.Filters;
 import freenet.node.FSParseException;
 import freenet.support.SimpleFieldSet;
 
index 4dd0b8e..a37dc46 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - CreatePostCommand.java - Copyright © 2011 David Roden
+ * Sone - CreatePostCommand.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 9fc78d6..84bedc7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - CreateReplyCommand.java - Copyright © 2011 David Roden
+ * Sone - CreateReplyCommand.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 3c8b03a..54f01c8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - DeletePostCommand.java - Copyright © 2011 David Roden
+ * Sone - DeletePostCommand.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 614b23e..daed26d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - DeleteReplyCommand.java - Copyright © 2011 David Roden
+ * Sone - DeleteReplyCommand.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 65d0d87..128d46a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - FcpInterface.java - Copyright © 2011 David Roden
+ * Sone - FcpInterface.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index c4206d5..4619004 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - GetLocalSonesCommand.java - Copyright © 2011 David Roden
+ * Sone - GetLocalSonesCommand.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index bb87407..e15d7d6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - GetPostCommand.java - Copyright © 2011 David Roden
+ * Sone - GetPostCommand.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 4c07359..781bed2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - GetPostFeedCommand.java - Copyright © 2011 David Roden
+ * Sone - GetPostFeedCommand.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -27,7 +27,7 @@ import net.pterodactylus.sone.core.Core;
 import net.pterodactylus.sone.data.Post;
 import net.pterodactylus.sone.data.Sone;
 import net.pterodactylus.sone.freenet.fcp.FcpException;
-import net.pterodactylus.util.filter.Filters;
+import net.pterodactylus.util.collection.filter.Filters;
 import freenet.support.SimpleFieldSet;
 import freenet.support.api.Bucket;
 
index 6a3b07e..36d2912 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - GetPostsCommand.java - Copyright © 2011 David Roden
+ * Sone - GetPostsCommand.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 5ebdc13..c71ea43 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - GetSoneCommand.java - Copyright © 2011 David Roden
+ * Sone - GetSoneCommand.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 1729bb7..5c9c117 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - GetSonesCommand.java - Copyright © 2011 David Roden
+ * Sone - GetSonesCommand.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 37f69ec..d13271a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - LikePostCommand.java - Copyright © 2011 David Roden
+ * Sone - LikePostCommand.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 61257e7..cc989ab 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - LikeReplyCommand.java - Copyright © 2011 David Roden
+ * Sone - LikeReplyCommand.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 1e135b5..bc2adb2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - VersionCommand.java - Copyright © 2011 David Roden
+ * Sone - VersionCommand.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 16dc9fb..7fffd5c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - L10nFilter.java - Copyright © 2010 David Roden
+ * Sone - L10nFilter.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -52,7 +52,7 @@ public class L10nFilter implements Filter {
         * {@inheritDoc}
         */
        @Override
-       public String format(TemplateContext templateContext, Object data, Map<String, String> parameters) {
+       public String format(TemplateContext templateContext, Object data, Map<String, Object> parameters) {
                if (parameters.isEmpty()) {
                        return webInterface.getL10n().getString(String.valueOf(data));
                }
@@ -60,11 +60,6 @@ public class L10nFilter implements Filter {
                int parameterIndex = 0;
                while (parameters.containsKey(String.valueOf(parameterIndex))) {
                        Object value = parameters.get(String.valueOf(parameterIndex));
-                       if (((String) value).startsWith("=")) {
-                               value = ((String) value).substring(1);
-                       } else {
-                               value = templateContext.get((String) value);
-                       }
                        parameterValues.add(value);
                        ++parameterIndex;
                }
index 5aa68cf..94a2690 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - PluginStoreConfigurationBackend.java - Copyright © 2010 David Roden
+ * Sone - PluginStoreConfigurationBackend.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 1d57454..5507b0d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - SimpleFieldSetBuilder.java - Copyright © 2011 David Roden
+ * Sone - SimpleFieldSetBuilder.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 2993b2f..8f6b27f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - StringBucket.java - Copyright © 2010 David Roden
+ * Sone - StringBucket.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 538876a..6e13a32 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - AbstractCommand.java - Copyright © 2011 David Roden
+ * Sone - AbstractCommand.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 46032dd..e3b55a9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - Command.java - Copyright © 2011 David Roden
+ * Sone - Command.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index d194840..22bb269 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - FcpException.java - Copyright © 2011 David Roden
+ * Sone - FcpException.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 3da08f3..76a5497 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - ConnectorListener.java - Copyright © 2010 David Roden
+ * Sone - ConnectorListener.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 7021332..742a514 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - ConnectorListenerManager.java - Copyright © 2010 David Roden
+ * Sone - ConnectorListenerManager.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index e7bf828..9145cf5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - PluginConnector.java - Copyright © 2010 David Roden
+ * Sone - PluginConnector.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 0e1af2b..08810b3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - PluginException.java - Copyright © 2010 David Roden
+ * Sone - PluginException.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 6a16cc5..6fe4101 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - DefaultIdentity.java - Copyright © 2010 David Roden
+ * Sone - DefaultIdentity.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index be2a3e7..c461c8b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - DefaultOwnIdentity.java - Copyright © 2010 David Roden
+ * Sone - DefaultOwnIdentity.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 1cf1644..0a9fb93 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - Identity.java - Copyright © 2010 David Roden
+ * Sone - Identity.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 3721f49..51e1437 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - IdentityListener.java - Copyright © 2010 David Roden
+ * Sone - IdentityListener.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index c6ea783..50808a2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - IdentityListenerManager.java - Copyright © 2010 David Roden
+ * Sone - IdentityListenerManager.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 8b95e1a..32c0d27 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - IdentityManager.java - Copyright © 2010 David Roden
+ * Sone - IdentityManager.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,8 +26,8 @@ import java.util.logging.Level;
 import java.util.logging.Logger;
 
 import net.pterodactylus.sone.freenet.plugin.PluginException;
-import net.pterodactylus.util.collection.Mapper;
-import net.pterodactylus.util.collection.Mappers;
+import net.pterodactylus.util.collection.mapper.Mapper;
+import net.pterodactylus.util.collection.mapper.Mappers;
 import net.pterodactylus.util.logging.Logging;
 import net.pterodactylus.util.service.AbstractService;
 
index 26dc449..6c6224f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - OwnIdentity.java - Copyright © 2010 David Roden
+ * Sone - OwnIdentity.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 5891c04..9b355b5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - Trust.java - Copyright © 2010 David Roden
+ * Sone - Trust.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 5cacb68..a7c6524 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - WebOfTrustConnector.java - Copyright © 2010 David Roden
+ * Sone - WebOfTrustConnector.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -134,7 +134,7 @@ public class WebOfTrustConnector implements ConnectorListener {
         *             if an error occured talking to the Web of Trust plugin
         */
        public Set<Identity> loadTrustedIdentities(OwnIdentity ownIdentity, String context) throws PluginException {
-               Reply reply = performRequest(SimpleFieldSetConstructor.create().put("Message", "GetIdentitiesByScore").put("TreeOwner", ownIdentity.getId()).put("Selection", "+").put("Context", (context == null) ? "" : context).get());
+               Reply reply = performRequest(SimpleFieldSetConstructor.create().put("Message", "GetIdentitiesByScore").put("Truster", ownIdentity.getId()).put("Selection", "+").put("Context", (context == null) ? "" : context).get());
                SimpleFieldSet fields = reply.getFields();
                Set<Identity> identities = new HashSet<Identity>();
                int identityCounter = -1;
index f59b2a3..35d65af 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - WebOfTrustException.java - Copyright © 2010 David Roden
+ * Sone - WebOfTrustException.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 573ed73..cca2c7b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - SonePlugin.java - Copyright © 2010 David Roden
+ * Sone - SonePlugin.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -83,7 +83,7 @@ public class SonePlugin implements FredPlugin, FredPluginFCP, FredPluginL10n, Fr
        }
 
        /** The version. */
-       public static final Version VERSION = new Version(0, 8, 1);
+       public static final Version VERSION = new Version(0, 8, 2);
 
        /** The logger. */
        private static final Logger logger = Logging.getLogger(SonePlugin.class);
index cf658bd..f1343ad 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - ListNotification.java - Copyright © 2010 David Roden
+ * Sone - ListNotification.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index c7b888f..51bb1c0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - ListNotificationFilters.java - Copyright © 2010 David Roden
+ * Sone - ListNotificationFilters.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 2c0a00e..7a5d6d3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - AlbumAccessor.java - Copyright © 2011 David Roden
+ * Sone - AlbumAccessor.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 0fa9129..afa22ec 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - CollectionAccessor.java - Copyright © 2010 David Roden
+ * Sone - CollectionAccessor.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 611c6d1..0282156 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - CssClassNameFilter.java - Copyright © 2010 David Roden
+ * Sone - CssClassNameFilter.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -35,7 +35,7 @@ public class CssClassNameFilter implements Filter {
         * {@inheritDoc}
         */
        @Override
-       public Object format(TemplateContext templateContext, Object data, Map<String, String> parameters) {
+       public Object format(TemplateContext templateContext, Object data, Map<String, Object> parameters) {
                return String.valueOf(data).replaceAll("[^a-zA-Z0-9-]", "_");
        }
 
index b2a4962..dab01cc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - GetPagePlugin.java - Copyright © 2010 David Roden
+ * Sone - GetPagePlugin.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index c5e38df..8fadc6c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - HttpRequestAccessor.java - Copyright © 2011 David Roden
+ * Sone - HttpRequestAccessor.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index eec9347..4602188 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - IdentityAccessor.java - Copyright © 2010 David Roden
+ * Sone - IdentityAccessor.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 1c06d31..ec7f360 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - ImageAccessor.java - Copyright © 2011 David Roden
+ * Sone - ImageAccessor.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index a79cb0b..06a11d7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - ImageLinkFilter.java - Copyright © 2011 David Roden
+ * Sone - ImageLinkFilter.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -65,7 +65,7 @@ public class ImageLinkFilter implements Filter {
         * {@inheritDoc}
         */
        @Override
-       public Object format(TemplateContext templateContext, Object data, Map<String, String> parameters) {
+       public Object format(TemplateContext templateContext, Object data, Map<String, Object> parameters) {
                Image image = null;
                if (data instanceof String) {
                        image = core.getImage((String) data, false);
@@ -75,14 +75,11 @@ public class ImageLinkFilter implements Filter {
                if (image == null) {
                        return null;
                }
-               String imageClass = parameters.get("class");
+               String imageClass = String.valueOf(parameters.get("class"));
                int maxWidth = Numbers.safeParseInteger(parameters.get("max-width"), Integer.MAX_VALUE);
                int maxHeight = Numbers.safeParseInteger(parameters.get("max-height"), Integer.MAX_VALUE);
                String mode = String.valueOf(parameters.get("mode"));
-               String title = parameters.get("title");
-               if ((title != null) && title.startsWith("=")) {
-                       title = String.valueOf(templateContext.get(title.substring(1)));
-               }
+               String title = String.valueOf(parameters.get("title"));
 
                TemplateContext linkTemplateContext = templateContextFactory.createTemplateContext();
                linkTemplateContext.set("class", imageClass);
index f852202..2dc963f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - JavascriptFilter.java - Copyright © 2011 David Roden
+ * Sone - JavascriptFilter.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -36,7 +36,7 @@ public class JavascriptFilter implements Filter {
         * {@inheritDoc}
         */
        @Override
-       public Object format(TemplateContext templateContext, Object data, Map<String, String> parameters) {
+       public Object format(TemplateContext templateContext, Object data, Map<String, Object> parameters) {
                StringBuilder javascriptString = new StringBuilder();
                javascriptString.append('"');
                for (char c : String.valueOf(data).toCharArray()) {
index b53e969..8302369 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - ParserFilter.java - Copyright © 2011 David Roden
+ * Sone - ParserFilter.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -86,20 +86,16 @@ public class ParserFilter implements Filter {
         * {@inheritDoc}
         */
        @Override
-       public Object format(TemplateContext templateContext, Object data, Map<String, String> parameters) {
+       public Object format(TemplateContext templateContext, Object data, Map<String, Object> parameters) {
                String text = String.valueOf(data);
-               int length = Numbers.safeParseInteger(parameters.get("length"), Numbers.safeParseInteger(templateContext.get(parameters.get("length")), -1));
-               int cutOffLength = Numbers.safeParseInteger(parameters.get("cut-off-length"), Numbers.safeParseInteger(templateContext.get(parameters.get("cut-off-length")), length));
-               String soneKey = parameters.get("sone");
-               if (soneKey == null) {
-                       soneKey = "sone";
-               }
-               Sone sone = (Sone) templateContext.get(soneKey);
-               if (sone == null) {
-                       sone = core.getSone(soneKey, false);
+               int length = Numbers.safeParseInteger(parameters.get("length"), Numbers.safeParseInteger(templateContext.get(String.valueOf(parameters.get("length"))), -1));
+               int cutOffLength = Numbers.safeParseInteger(parameters.get("cut-off-length"), Numbers.safeParseInteger(templateContext.get(String.valueOf(parameters.get("cut-off-length"))), length));
+               Object sone = parameters.get("sone");
+               if (sone instanceof String) {
+                       sone = core.getSone((String) sone, false);
                }
                FreenetRequest request = (FreenetRequest) templateContext.get("request");
-               SoneTextParserContext context = new SoneTextParserContext(request, sone);
+               SoneTextParserContext context = new SoneTextParserContext(request, (Sone) sone);
                StringWriter parsedTextWriter = new StringWriter();
                try {
                        Iterable<Part> parts = soneTextParser.parse(context, new StringReader(text));
index 93ff569..d05b074 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - PostAccessor.java - Copyright © 2010 David Roden
+ * Sone - PostAccessor.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,7 +21,7 @@ import net.pterodactylus.sone.core.Core;
 import net.pterodactylus.sone.data.Post;
 import net.pterodactylus.sone.data.Reply;
 import net.pterodactylus.sone.data.Sone;
-import net.pterodactylus.util.filter.Filters;
+import net.pterodactylus.util.collection.filter.Filters;
 import net.pterodactylus.util.template.ReflectionAccessor;
 import net.pterodactylus.util.template.TemplateContext;
 
index 366e071..1f29b65 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - ProfileAccessor.java - Copyright © 2011 David Roden
+ * Sone - ProfileAccessor.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 7b89713..4faa045 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - ReplyAccessor.java - Copyright © 2010 David Roden
+ * Sone - ReplyAccessor.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 8bc17a7..ff4b64e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - ReplyGroupFilter.java - Copyright © 2010 David Roden
+ * Sone - ReplyGroupFilter.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -42,7 +42,7 @@ public class ReplyGroupFilter implements Filter {
         * {@inheritDoc}
         */
        @Override
-       public Object format(TemplateContext templateContext, Object data, Map<String, String> parameters) {
+       public Object format(TemplateContext templateContext, Object data, Map<String, Object> parameters) {
                @SuppressWarnings("unchecked")
                List<PostReply> allReplies = (List<PostReply>) data;
                Map<Post, Set<Sone>> postSones = new HashMap<Post, Set<Sone>>();
index a0d80af..3a89021 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - RequestChangeFilter.java - Copyright © 2010 David Roden
+ * Sone - RequestChangeFilter.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -33,8 +33,7 @@ import net.pterodactylus.util.template.TemplateContext;
 /**
  * This filter expects a {@link FreenetRequest} as input and outputs a
  * {@link URI} that is modified by the parameters. The name of the parameter is
- * handed in as “name”, the value may either be stored in “value”, or in a
- * template variable whose key is stored in “key”.
+ * handed in as “name”, the new value is stored in “value”.
  *
  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
  */
@@ -44,24 +43,10 @@ public class RequestChangeFilter implements Filter {
         * {@inheritDoc}
         */
        @Override
-       public Object format(TemplateContext templateContext, Object data, Map<String, String> parameters) {
+       public Object format(TemplateContext templateContext, Object data, Map<String, Object> parameters) {
                FreenetRequest request = (FreenetRequest) data;
-               String name = parameters.get("name");
-               String nameKey = parameters.get("nameKey");
-               if (nameKey != null) {
-                       name = String.valueOf(templateContext.get(nameKey));
-               }
-               String key = parameters.get("key");
-               String value = null;
-               if (key != null) {
-                       value = String.valueOf(templateContext.get(key));
-               }
-               if (value == null) {
-                       value = parameters.get("value");
-               }
-               if (value == null) {
-                       return request.getUri();
-               }
+               String name = String.valueOf(parameters.get("name"));
+               String value = String.valueOf(parameters.get("value"));
 
                Map<String, String> values = new HashMap<String, String>();
                Collection<String> parameterNames = request.getHttpRequest().getParameterNames();
index f6d3d2d..eac8a93 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - SoneAccessor.java - Copyright © 2010 David Roden
+ * Sone - SoneAccessor.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 857017c..005eb1f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - SubstringFilter.java - Copyright © 2010 David Roden
+ * Sone - SubstringFilter.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -37,9 +37,9 @@ public class SubstringFilter implements Filter {
         * {@inheritDoc}
         */
        @Override
-       public Object format(TemplateContext templateContext, Object data, Map<String, String> parameters) {
-               String startString = parameters.get("start");
-               String lengthString = parameters.get("length");
+       public Object format(TemplateContext templateContext, Object data, Map<String, Object> parameters) {
+               String startString = String.valueOf(parameters.get("start"));
+               String lengthString = String.valueOf(parameters.get("length"));
                int start = 0;
                try {
                        start = Integer.parseInt(startString);
index 4aad3c9..5097cb2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - TrustAccessor.java - Copyright © 2010 David Roden
+ * Sone - TrustAccessor.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 70dae70..e3ddd59 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - UniqueElementFilter.java - Copyright © 2011 David Roden
+ * Sone - UniqueElementFilter.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -36,7 +36,7 @@ public class UniqueElementFilter implements Filter {
         * {@inheritDoc}
         */
        @Override
-       public Object format(TemplateContext templateContext, Object data, Map<String, String> parameters) {
+       public Object format(TemplateContext templateContext, Object data, Map<String, Object> parameters) {
                if (!(data instanceof Collection<?>)) {
                        return data;
                }
index 586e90c..c87a97b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - UnknownDateFilter.java - Copyright © 2011 David Roden
+ * Sone - UnknownDateFilter.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -54,7 +54,7 @@ public class UnknownDateFilter implements Filter {
         * {@inheritDoc}
         */
        @Override
-       public Object format(TemplateContext templateContext, Object data, Map<String, String> parameters) {
+       public Object format(TemplateContext templateContext, Object data, Map<String, Object> parameters) {
                if (data instanceof Long) {
                        if ((Long) data == 0) {
                                return l10nHandler.getString(unknownKey);
index be3aef9..cfd2f63 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - FreenetLinkPart.java - Copyright © 2011 David Roden
+ * Sone - FreenetLinkPart.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index d5da730..1b47080 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - LinkPart.java - Copyright © 2011 David Roden
+ * Sone - LinkPart.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 87cdab5..3a80db8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - Parser.java - Copyright © 2010 David Roden
+ * Sone - Parser.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index ee61b6f..d044d1b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - ParserContext.java - Copyright © 2010 David Roden
+ * Sone - ParserContext.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index e16dfb4..76e80ef 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - Part.java - Copyright © 2010 David Roden
+ * Sone - Part.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 384e8ae..e456cd9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - PartContainer.java - Copyright © 2010 David Roden
+ * Sone - PartContainer.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index a1f2088..09c1fba 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - PlainTextPart.java - Copyright © 2011 David Roden
+ * Sone - PlainTextPart.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 22acd43..c416c57 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - PostLinkPart.java - Copyright © 2011 David Roden
+ * Sone - PostLinkPart.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 5c6a63d..475c091 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - SoneLinkPart.java - Copyright © 2011 David Roden
+ * Sone - SoneLinkPart.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 3362132..dd0da28 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - FreenetLinkParser.java - Copyright © 2010 David Roden
+ * Sone - FreenetLinkParser.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 35b190b..e1a6eb3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - SoneTextParserContext.java - Copyright © 2011 David Roden
+ * Sone - SoneTextParserContext.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 9e3587c..dfd9627 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - TextFilter.java - Copyright © 2011 David Roden
+ * Sone - TextFilter.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index a9698e4..2e9780b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - AboutPage.java - Copyright © 2010 David Roden
+ * Sone - AboutPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 0ebf9d5..0c9bbae 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - BookmarkPage.java - Copyright © 2011 David Roden
+ * Sone - BookmarkPage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 41a3e65..95dfd65 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - BookmarksPage.java - Copyright © 2011 David Roden
+ * Sone - BookmarksPage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,8 +25,8 @@ import java.util.Set;
 import net.pterodactylus.sone.data.Post;
 import net.pterodactylus.sone.web.page.FreenetRequest;
 import net.pterodactylus.util.collection.Pagination;
-import net.pterodactylus.util.filter.Filter;
-import net.pterodactylus.util.filter.Filters;
+import net.pterodactylus.util.collection.filter.Filter;
+import net.pterodactylus.util.collection.filter.Filters;
 import net.pterodactylus.util.number.Numbers;
 import net.pterodactylus.util.template.Template;
 import net.pterodactylus.util.template.TemplateContext;
index 9072ea4..1e83a0e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - CreateAlbumPage.java - Copyright © 2011 David Roden
+ * Sone - CreateAlbumPage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 22f6efa..6b374dc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - CreatePostPage.java - Copyright © 2010 David Roden
+ * Sone - CreatePostPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index f28be35..82e4c51 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - CreateReplyPage.java - Copyright © 2010 David Roden
+ * Sone - CreateReplyPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index fc9f0d1..a4c6379 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - CreateSonePage.java - Copyright © 2010 David Roden
+ * Sone - CreateSonePage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index d03e065..2f2b766 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - DeleteAlbumPage.java - Copyright © 2011 David Roden
+ * Sone - DeleteAlbumPage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 66098ff..3bbaf3d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - DeleteImagePage.java - Copyright © 2011 David Roden
+ * Sone - DeleteImagePage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index c8fd20f..6689061 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - DeletePostPage.java - Copyright © 2010 David Roden
+ * Sone - DeletePostPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 030279b..5754b2f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - DeleteProfileFieldPage.java - Copyright © 2011 David Roden
+ * Sone - DeleteProfileFieldPage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 4502617..900acd9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - DeleteReplyPage.java - Copyright © 2010 David Roden
+ * Sone - DeleteReplyPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index bbf533f..a5bdd2f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - DeleteSonePage.java - Copyright © 2010 David Roden
+ * Sone - DeleteSonePage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 9d79195..763271c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - DismissNotificationPage.java - Copyright © 2010 David Roden
+ * Sone - DismissNotificationPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 473bf1c..e4fd52d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - DistrustPage.java - Copyright © 2011 David Roden
+ * Sone - DistrustPage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index dc5c8fa..d028f8d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - EditAlbumPage.java - Copyright © 2011 David Roden
+ * Sone - EditAlbumPage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index a0939db..b0297a8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * FreenetSone - WebInterface.java - Copyright © 2010 David Roden
+ * FreenetSone - WebInterface.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index a06592a..9958a2d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - EditProfileFieldPage.java - Copyright © 2011 David Roden
+ * Sone - EditProfileFieldPage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 422004b..30c90bc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - EditProfilePage.java - Copyright © 2010 David Roden
+ * Sone - EditProfilePage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 4083b99..661ddd3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - FollowSonePage.java - Copyright © 2010 David Roden
+ * Sone - FollowSonePage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 8f0c474..a16c7db 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - GetImagePage.java - Copyright © 2011 David Roden
+ * Sone - GetImagePage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 5bb75d1..a6d3daf 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - ImageBrowserPage.java - Copyright © 2011 David Roden
+ * Sone - ImageBrowserPage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,6 +26,8 @@ import net.pterodactylus.sone.data.Album;
 import net.pterodactylus.sone.data.Image;
 import net.pterodactylus.sone.data.Sone;
 import net.pterodactylus.sone.web.page.FreenetRequest;
+import net.pterodactylus.util.collection.Pagination;
+import net.pterodactylus.util.number.Numbers;
 import net.pterodactylus.util.template.Template;
 import net.pterodactylus.util.template.TemplateContext;
 
@@ -87,7 +89,9 @@ public class ImageBrowserPage extends SoneTemplatePage {
                                albums.addAll(sone.getAllAlbums());
                        }
                        Collections.sort(albums, Album.TITLE_COMPARATOR);
-                       templateContext.set("albums", albums);
+                       Pagination<Album> albumPagination = new Pagination<Album>(albums, 12).setPage(Numbers.safeParseInteger(request.getHttpRequest().getParam("page"), 0));
+                       templateContext.set("albumPagination", albumPagination);
+                       templateContext.set("albums", albumPagination.getItems());
                        return;
                }
                Sone sone = getCurrentSone(request.getToadletContext(), false);
index 356b4ab..8a5d1b5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - IndexPage.java - Copyright © 2010 David Roden
+ * Sone - IndexPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,8 +26,8 @@ import net.pterodactylus.sone.data.Sone;
 import net.pterodactylus.sone.notify.ListNotificationFilters;
 import net.pterodactylus.sone.web.page.FreenetRequest;
 import net.pterodactylus.util.collection.Pagination;
-import net.pterodactylus.util.filter.Filter;
-import net.pterodactylus.util.filter.Filters;
+import net.pterodactylus.util.collection.filter.Filter;
+import net.pterodactylus.util.collection.filter.Filters;
 import net.pterodactylus.util.number.Numbers;
 import net.pterodactylus.util.template.Template;
 import net.pterodactylus.util.template.TemplateContext;
index f32a47d..b40515a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - KnownSonesPage.java - Copyright © 2010 David Roden
+ * Sone - KnownSonesPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,8 +25,8 @@ import net.pterodactylus.sone.data.Sone;
 import net.pterodactylus.sone.web.page.FreenetRequest;
 import net.pterodactylus.util.collection.Pagination;
 import net.pterodactylus.util.collection.ReverseComparator;
-import net.pterodactylus.util.filter.Filter;
-import net.pterodactylus.util.filter.Filters;
+import net.pterodactylus.util.collection.filter.Filter;
+import net.pterodactylus.util.collection.filter.Filters;
 import net.pterodactylus.util.number.Numbers;
 import net.pterodactylus.util.template.Template;
 import net.pterodactylus.util.template.TemplateContext;
index c5174c6..960f32b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - LikePage.java - Copyright © 2010 David Roden
+ * Sone - LikePage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index a56d263..662e833 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - LockSonePage.java - Copyright © 2010 David Roden
+ * Sone - LockSonePage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 6f43b6f..a2fb9bc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - LoginPage.java - Copyright © 2010 David Roden
+ * Sone - LoginPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index a7f769f..9b712c6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - LogoutPage.java - Copyright © 2010 David Roden
+ * Sone - LogoutPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 8cca4d1..4f8e071 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - MarkAsKnownPage.java - Copyright © 2011 David Roden
+ * Sone - MarkAsKnownPage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 1847b9c..ab962d8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - OptionsPage.java - Copyright © 2010 David Roden
+ * Sone - OptionsPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -90,6 +90,12 @@ public class OptionsPage extends SoneTemplatePage {
                        } else {
                                preferences.setPostsPerPage(postsPerPage);
                        }
+                       Integer imagesPerPage = Numbers.safeParseInteger(request.getHttpRequest().getPartAsStringFailsafe("images-per-page", 4), null);
+                       if (!preferences.validateImagesPerPage(imagesPerPage)) {
+                               fieldErrors.add("images-per-page");
+                       } else {
+                               preferences.setImagesPerPage(imagesPerPage);
+                       }
                        Integer charactersPerPost = Numbers.safeParseInteger(request.getHttpRequest().getPartAsStringFailsafe("characters-per-post", 10), null);
                        if (!preferences.validateCharactersPerPost(charactersPerPost)) {
                                fieldErrors.add("characters-per-post");
@@ -146,6 +152,7 @@ public class OptionsPage extends SoneTemplatePage {
                }
                templateContext.set("insertion-delay", preferences.getInsertionDelay());
                templateContext.set("posts-per-page", preferences.getPostsPerPage());
+               templateContext.set("images-per-page", preferences.getImagesPerPage());
                templateContext.set("characters-per-post", preferences.getCharactersPerPost());
                templateContext.set("post-cut-off-length", preferences.getPostCutOffLength());
                templateContext.set("require-full-access", preferences.isRequireFullAccess());
index f653615..083c68b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - RescuePage.java - Copyright © 2011 David Roden
+ * Sone - RescuePage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 54b6f49..a4da9f4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - SearchPage.java - Copyright © 2010 David Roden
+ * Sone - SearchPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -40,12 +40,12 @@ import net.pterodactylus.util.cache.CacheItem;
 import net.pterodactylus.util.cache.DefaultCacheItem;
 import net.pterodactylus.util.cache.MemoryCache;
 import net.pterodactylus.util.cache.ValueRetriever;
-import net.pterodactylus.util.collection.Mapper;
-import net.pterodactylus.util.collection.Mappers;
 import net.pterodactylus.util.collection.Pagination;
 import net.pterodactylus.util.collection.TimedMap;
-import net.pterodactylus.util.filter.Filter;
-import net.pterodactylus.util.filter.Filters;
+import net.pterodactylus.util.collection.filter.Filter;
+import net.pterodactylus.util.collection.filter.Filters;
+import net.pterodactylus.util.collection.mapper.Mapper;
+import net.pterodactylus.util.collection.mapper.Mappers;
 import net.pterodactylus.util.logging.Logging;
 import net.pterodactylus.util.number.Numbers;
 import net.pterodactylus.util.template.Template;
index b0d31d2..4ef434f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - SoneTemplatePage.java - Copyright © 2010 David Roden
+ * Sone - SoneTemplatePage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index f2cf92e..3723fac 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - TrustPage.java - Copyright © 2011 David Roden
+ * Sone - TrustPage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index def3bf4..5e8a2a8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - UnbookmarkPage.java - Copyright © 2011 David Roden
+ * Sone - UnbookmarkPage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index f07880d..97ba4cd 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - UnfollowSonePage.java - Copyright © 2010 David Roden
+ * Sone - UnfollowSonePage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index f47c4f2..d7e9acb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - UnlikePage.java - Copyright © 2010 David Roden
+ * Sone - UnlikePage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index f527558..3d2370c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - UnlockSonePage.java - Copyright © 2010 David Roden
+ * Sone - UnlockSonePage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index d711525..29e17e7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - UntrustPage.java - Copyright © 2011 David Roden
+ * Sone - UntrustPage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index e160c32..9045cdf 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - UploadImagePage.java - Copyright © 2011 David Roden
+ * Sone - UploadImagePage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index d0ca904..98b2603 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - ViewPostPage.java - Copyright © 2010 David Roden
+ * Sone - ViewPostPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 57d4070..2df911c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - ViewSonePage.java - Copyright © 2010 David Roden
+ * Sone - ViewSonePage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index f8b9c5a..c2bb1c8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - WebInterface.java - Copyright © 2010 David Roden
+ * Sone - WebInterface.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -110,7 +110,7 @@ import net.pterodactylus.util.cache.DefaultCacheItem;
 import net.pterodactylus.util.cache.MemoryCache;
 import net.pterodactylus.util.cache.ValueRetriever;
 import net.pterodactylus.util.collection.SetBuilder;
-import net.pterodactylus.util.filter.Filters;
+import net.pterodactylus.util.collection.filter.Filters;
 import net.pterodactylus.util.logging.Logging;
 import net.pterodactylus.util.notify.Notification;
 import net.pterodactylus.util.notify.NotificationManager;
@@ -122,6 +122,7 @@ import net.pterodactylus.util.template.FormatFilter;
 import net.pterodactylus.util.template.HtmlFilter;
 import net.pterodactylus.util.template.MatchFilter;
 import net.pterodactylus.util.template.ModFilter;
+import net.pterodactylus.util.template.PaginationFilter;
 import net.pterodactylus.util.template.Provider;
 import net.pterodactylus.util.template.ReflectionAccessor;
 import net.pterodactylus.util.template.ReplaceFilter;
@@ -259,6 +260,7 @@ public class WebInterface implements CoreListener {
                templateContextFactory.addFilter("in", new ContainsFilter());
                templateContextFactory.addFilter("unique", new UniqueElementFilter());
                templateContextFactory.addFilter("mod", new ModFilter());
+               templateContextFactory.addFilter("paginate", new PaginationFilter());
                templateContextFactory.addProvider(Provider.TEMPLATE_CONTEXT_PROVIDER);
                templateContextFactory.addProvider(new ClassPathTemplateProvider());
                templateContextFactory.addTemplateObject("webInterface", this);
index 0cf7b01..a684b0f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - BookmarkAjaxPage.java - Copyright © 2011 David Roden
+ * Sone - BookmarkAjaxPage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index c6f4455..53a5a51 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - CreatePostAjaxPage.java - Copyright © 2010 David Roden
+ * Sone - CreatePostAjaxPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 337a238..20857f3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - CreateReplyAjaxPage.java - Copyright © 2010 David Roden
+ * Sone - CreateReplyAjaxPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 37ab040..ea2310c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - DeletePostAjaxPage.java - Copyright © 2010 David Roden
+ * Sone - DeletePostAjaxPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 205fb85..20fe841 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - DeleteProfileFieldAjaxPage.java - Copyright © 2011 David Roden
+ * Sone - DeleteProfileFieldAjaxPage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 76126f4..0442117 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - DeleteReplyAjaxPage.java - Copyright © 2010 David Roden
+ * Sone - DeleteReplyAjaxPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 232cab6..bd5d83c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - DismissNotificationAjaxPage.java - Copyright © 2010 David Roden
+ * Sone - DismissNotificationAjaxPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 4ba3dbb..f25b19c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - DistrustAjaxPage.java - Copyright © 2011 David Roden
+ * Sone - DistrustAjaxPage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 8bc07ef..92e1e48 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - EditAlbumAjaxPage.java - Copyright © 2011 David Roden
+ * Sone - EditAlbumAjaxPage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 3c4de8e..42f4285 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - EditImageAjaxPage.java - Copyright © 2011 David Roden
+ * Sone - EditImageAjaxPage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -80,7 +80,7 @@ public class EditImageAjaxPage extends JsonPage {
                String description = request.getHttpRequest().getParam("description").trim();
                image.setTitle(title).setDescription(TextFilter.filter(request.getHttpRequest().getHeader("host"), description));
                webInterface.getCore().touchConfiguration();
-               return createSuccessJsonObject().put("imageId", image.getId()).put("title", image.getTitle()).put("description", image.getDescription()).put("parsedDescription", (String) parserFilter.format(new TemplateContext(), image.getDescription(), new MapBuilder<String, String>().put("sone", image.getSone().getId()).get()));
+               return createSuccessJsonObject().put("imageId", image.getId()).put("title", image.getTitle()).put("description", image.getDescription()).put("parsedDescription", (String) parserFilter.format(new TemplateContext(), image.getDescription(), new MapBuilder<String, Object>().put("sone", image.getSone()).get()));
        }
 
 }
index 5351281..16572cf 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - EditProfileFieldAjaxPage.java - Copyright © 2011 David Roden
+ * Sone - EditProfileFieldAjaxPage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 764fa28..ce0fd06 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - FollowSoneAjaxPage.java - Copyright © 2010 David Roden
+ * Sone - FollowSoneAjaxPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 12a9e8d..83fa15b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - GetLikesAjaxPage.java - Copyright © 2010 David Roden
+ * Sone - GetLikesAjaxPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index d88aae9..4e9a879 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - GetNotificationsAjaxPage.java - Copyright © 2011 David Roden
+ * Sone - GetNotificationsAjaxPage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 8be816d..3d4633c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - GetPostAjaxPage.java - Copyright © 2010 David Roden
+ * Sone - GetPostAjaxPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index f38e0f2..38bf090 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - GetReplyAjaxPage.java - Copyright © 2010 David Roden
+ * Sone - GetReplyAjaxPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 16bb133..223a79f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - GetStatusAjaxPage.java - Copyright © 2010 David Roden
+ * Sone - GetStatusAjaxPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -32,8 +32,8 @@ import net.pterodactylus.sone.notify.ListNotificationFilters;
 import net.pterodactylus.sone.template.SoneAccessor;
 import net.pterodactylus.sone.web.WebInterface;
 import net.pterodactylus.sone.web.page.FreenetRequest;
-import net.pterodactylus.util.filter.Filter;
-import net.pterodactylus.util.filter.Filters;
+import net.pterodactylus.util.collection.filter.Filter;
+import net.pterodactylus.util.collection.filter.Filters;
 import net.pterodactylus.util.json.JsonArray;
 import net.pterodactylus.util.json.JsonObject;
 import net.pterodactylus.util.notify.Notification;
@@ -91,6 +91,7 @@ public class GetStatusAjaxPage extends JsonPage {
                }
                /* load notifications. */
                List<Notification> notifications = ListNotificationFilters.filterNotifications(webInterface.getNotifications().getNotifications(), currentSone);
+               Collections.sort(notifications, Notification.CREATED_TIME_SORTER);
                int notificationHash = HashCode.hashCode(notifications);
                /* load new posts. */
                Set<Post> newPosts = webInterface.getNewPosts();
index cec9967..84badf2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - GetTimesAjaxPage.java - Copyright © 2010–2011 David Roden
+ * Sone - GetTimesAjaxPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify it under
  * the terms of the GNU General Public License as published by the Free Software
index e0909ca..343359d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - GetTranslationPage.java - Copyright © 2010 David Roden
+ * Sone - GetTranslationPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 7c3abdb..c6b7738 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - JsonPage.java - Copyright © 2010 David Roden
+ * Sone - JsonPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index e4d168f..3f6f8db 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - LikeAjaxPage.java - Copyright © 2010 David Roden
+ * Sone - LikeAjaxPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 1d80905..131d3e1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - LockSoneAjaxPage.java - Copyright © 2010 David Roden
+ * Sone - LockSoneAjaxPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 0e9b6b7..370bacd 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - MarkAsKnownAjaxPage.java - Copyright © 2011 David Roden
+ * Sone - MarkAsKnownAjaxPage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index b932a82..02029ef 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - MoveProfileFieldAjaxPage.java - Copyright © 2011 David Roden
+ * Sone - MoveProfileFieldAjaxPage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index b27bedf..9b86c5e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - TrustAjaxPage.java - Copyright © 2011 David Roden
+ * Sone - TrustAjaxPage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 6a9f8fe..6a1154a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - UnbookmarkAjaxPage.java - Copyright © 2011 David Roden
+ * Sone - UnbookmarkAjaxPage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 5d94d52..6e29cbc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - UnfollowSoneAjaxPage.java - Copyright © 2010 David Roden
+ * Sone - UnfollowSoneAjaxPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 1841806..f961bd5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - UnlikeAjaxPage.java - Copyright © 2010 David Roden
+ * Sone - UnlikeAjaxPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index d7430c1..14cb10d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - UnlockSoneAjaxPage.java - Copyright © 2010 David Roden
+ * Sone - UnlockSoneAjaxPage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 86222e0..932be6c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - UntrustAjaxPage.java - Copyright © 2011 David Roden
+ * Sone - UntrustAjaxPage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index d4bbc82..e68444c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - FreenetPage.java - Copyright © 2011 David Roden
+ * Sone - FreenetPage.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 526f3ed..783c8eb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - FreenetRequest.java - Copyright © 2011 David Roden
+ * Sone - FreenetRequest.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index cd15cbf..30071f5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - FreenetTemplatePage.java - Copyright © 2010 David Roden
+ * Sone - FreenetTemplatePage.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 8245251..1d2a2db 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - PageToadlet.java - Copyright © 2010 David Roden
+ * Sone - PageToadlet.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 0abf3a5..ef5de69 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - PageToadletFactory.java - Copyright © 2010 David Roden
+ * Sone - PageToadletFactory.java - Copyright © 2010–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index d4e4fc3..709b307 100644 (file)
@@ -2,7 +2,7 @@ Navigation.Menu.Sone.Name=Sone
 Navigation.Menu.Sone.Tooltip=Soziales Netzwerk in Freenet
 Navigation.Menu.Sone.Item.Login.Name=Anmelden
 Navigation.Menu.Sone.Item.Login.Tooltip=In Ihre Sone einloggen
-Navigation.Menu.Sone.Item.Index.Name=Ihre Sone
+Navigation.Menu.Sone.Item.Index.Name=Eigene Sone
 Navigation.Menu.Sone.Item.Index.Tooltip=Zeigt Ihre Sone an
 Navigation.Menu.Sone.Item.New.Name=Neue Nachrichten und Antworten
 Navigation.Menu.Sone.Item.New.Tooltip=Zeigt neue Nachrichten und Antworten an
@@ -24,7 +24,7 @@ Navigation.Menu.Sone.Item.Options.Name=Optionen
 Navigation.Menu.Sone.Item.Options.Tooltip=Konfiguriert Sone
 Navigation.Menu.Sone.Item.Rescue.Name=Sonerettung
 Navigation.Menu.Sone.Item.Rescue.Tooltip=Rettet Ihre Sone
-Navigation.Menu.Sone.Item.About.Name=Über
+Navigation.Menu.Sone.Item.About.Name=Über Sone
 Navigation.Menu.Sone.Item.About.Tooltip=Informationen über Sone
 
 Page.About.Title=Über  - Sone
index 3fe965e..8a85604 100644 (file)
@@ -55,6 +55,7 @@ Page.Options.Option.ShowAvatars.Always.Description=Always show custom avatars. B
 Page.Options.Section.RuntimeOptions.Title=Runtime Behaviour
 Page.Options.Option.InsertionDelay.Description=The number of seconds the Sone inserter waits after a modification of a Sone before it is being inserted.
 Page.Options.Option.PostsPerPage.Description=The number of posts to display on a page before pagination controls are being shown.
+Page.Options.Option.ImagesPerPage.Description=The number of images to display on a page before pagination controls are being shown.
 Page.Options.Option.CharactersPerPost.Description=The number of characters to display from a post before cutting it off and showing a link to expand it (-1 to disable). The actual length of the snippet is determined by the option below.
 Page.Options.Option.PostCutOffLength.Description=The number of characters that are displayed if a post is deemed to long (see option above).
 Page.Options.Option.RequireFullAccess.Description=Whether to deny access to Sone to any host that has not been granted full access.
@@ -408,6 +409,7 @@ WebInterface.DefaultText.UploadImage.Description=Image description
 WebInterface.DefaultText.EditImage.Title=Image title
 WebInterface.DefaultText.EditImage.Description=Image description
 WebInterface.DefaultText.Option.PostsPerPage=Number of posts to show on a page
+WebInterface.DefaultText.Option.ImagesPerPage=Number of images to show on a page
 WebInterface.DefaultText.Option.CharactersPerPost=Number of characters a post must have to be shortened
 WebInterface.DefaultText.Option.PostCutOffLength=Number of characters for the snippet of the shortened post
 WebInterface.DefaultText.Option.PositiveTrust=The positive trust to assign
index 269a043..294a483 100644 (file)
@@ -4,8 +4,8 @@ Navigation.Menu.Sone.Item.Login.Name=Connexion
 Navigation.Menu.Sone.Item.Login.Tooltip=Se connecter à son Sone
 Navigation.Menu.Sone.Item.Index.Name=Votre Sone
 Navigation.Menu.Sone.Item.Index.Tooltip=Afficher votre Sone
-Navigation.Menu.Sone.Item.New.Name=New Posts and Replies
-Navigation.Menu.Sone.Item.New.Tooltip=Shows new posts and replies
+Navigation.Menu.Sone.Item.New.Name=Nouveaux messages ety réponses
+Navigation.Menu.Sone.Item.New.Tooltip=Voir les nouveaux messages et réponses
 Navigation.Menu.Sone.Item.CreateSone.Name=Créer Sone
 Navigation.Menu.Sone.Item.CreateSone.Tooltip=Créer un nouveau Sone
 Navigation.Menu.Sone.Item.KnownSones.Name=Sones connus
@@ -15,15 +15,15 @@ Navigation.Menu.Sone.Item.Bookmarks.Tooltip=Affiche les messages dans les marque
 Navigation.Menu.Sone.Item.EditProfile.Name=Editer le profil
 Navigation.Menu.Sone.Item.EditProfile.Tooltip=Editer le profil de votre Sone
 Navigation.Menu.Sone.Item.ImageBrowser.Name=Images
-Navigation.Menu.Sone.Item.ImageBrowser.Tooltip=Manages your Images
+Navigation.Menu.Sone.Item.ImageBrowser.Tooltip=Gérer vos images
 Navigation.Menu.Sone.Item.DeleteSone.Name=Efface Sone
 Navigation.Menu.Sone.Item.DeleteSone.Tooltip=Efface les Sones actuels
 Navigation.Menu.Sone.Item.Logout.Name=Déconnexion
 Navigation.Menu.Sone.Item.Logout.Tooltip=Vous déconnecte de votre Sone actuel
 Navigation.Menu.Sone.Item.Options.Name=Options
 Navigation.Menu.Sone.Item.Options.Tooltip=Options concernant le plugin Sone
-Navigation.Menu.Sone.Item.Rescue.Name=Rescue
-Navigation.Menu.Sone.Item.Rescue.Tooltip=Rescue Sone
+Navigation.Menu.Sone.Item.Rescue.Name=Réparation
+Navigation.Menu.Sone.Item.Rescue.Tooltip=Réparer Sone
 Navigation.Menu.Sone.Item.About.Name=A propos
 Navigation.Menu.Sone.Item.About.Tooltip=Informations à propos de Sone
 
@@ -40,23 +40,23 @@ Page.Options.Page.Description=Ces options influencent le comportement de l'exéc
 Page.Options.Section.SoneSpecificOptions.Title=Options spécifiques à Sone
 Page.Options.Section.SoneSpecificOptions.NotLoggedIn=Ces options sont uniquement disponibles si vous êtes {link}connecté{/link}.
 Page.Options.Section.SoneSpecificOptions.LoggedIn=Ces options sont uniquement disponibles pour le Sone entant que tel vous êtes enregistré.
-Page.Options.Option.AutoFollow.Description=si un nouveau  Sone est découvert, automatiquement le suivre.  Veuillez noter que cela suivra uniquement les Sones qui seront découverts après que cette option soit activée!
-Page.Options.Option.EnableSoneInsertNotifications.Description=If enabled, this will display notifications every time your Sone is being inserted or finishes inserting.
-Page.Options.Option.ShowNotificationNewSones.Description=Show notifications for new Sones.
-Page.Options.Option.ShowNotificationNewPosts.Description=Show notifications for new posts.
-Page.Options.Option.ShowNotificationNewReplies.Description=Show notifications for new replies.
-Page.Options.Section.AvatarOptions.Title=Avatar Options
-Page.Options.Option.ShowAvatars.Description=You can disable custom avatars here, depending on the selected criteria. If an avatar is disabled for a Sone, the automatically generated avatar is shown instead.
-Page.Options.Option.ShowAvatars.Never.Description=Never show custom avatars.
-Page.Options.Option.ShowAvatars.Followed.Description=Only show avatars for Sones that you follow.
-Page.Options.Option.ShowAvatars.ManuallyTrusted.Description=Only show avatars for Sones that you have manually assigned a trust value larger than 0 to.
-Page.Options.Option.ShowAvatars.Trusted.Description=Only show avatars for Sones that have a trust value larger than 0.
-Page.Options.Option.ShowAvatars.Always.Description=Always show custom avatars. Be warned: some avatars might contain disturbing or offensive imagery.
+Page.Options.Option.AutoFollow.Description=si un nouveau Sone est découvert, automatiquement le suivre. Veuillez noter que cela suivra uniquement les Sones qui seront découverts après que cette option soit activée!
+Page.Options.Option.EnableSoneInsertNotifications.Description=Si activé, cela affichera les notifications chaque fois que votre Sone insère un message ou qu'il a fini d'insérer.
+Page.Options.Option.ShowNotificationNewSones.Description=Affiche les notifications des nouveaux Sones.
+Page.Options.Option.ShowNotificationNewPosts.Description=Affiche une notification lors d'un nouveau message.
+Page.Options.Option.ShowNotificationNewReplies.Description=Affiche une notification lors d'une nouvelle réponse.
+Page.Options.Section.AvatarOptions.Title=Options de votre Avatar.
+Page.Options.Option.ShowAvatars.Description=Vous pouvez désactiver votre avatar personnalisé ici, selon le critère sélectionné. L'avatar par défaut sera activé si vous déactivez le votre.
+Page.Options.Option.ShowAvatars.Never.Description=Ne jamais montrer les avatar personnalisés
+Page.Options.Option.ShowAvatars.Followed.Description=Ne montrer que les avatars des Sones que vous suivez
+Page.Options.Option.ShowAvatars.ManuallyTrusted.Description=Ne montrer que les avatars des Sones auxquelles que vous avez assigné manuellement une confiance superieure à 0.
+Page.Options.Option.ShowAvatars.Trusted.Description=Ne montrer que les avatars des Sones qui ont une confiance superieure à 0.
+Page.Options.Option.ShowAvatars.Always.Description=Montre tout le temps les avatars personnalisés.Attention: certains avatars peuvent être offensants !
 Page.Options.Section.RuntimeOptions.Title=Comportement runtime
 Page.Options.Option.InsertionDelay.Description=Le nombre de secondes que l'inserteur de Sone attends après une modification d'un Sone avant qu'elle soit insérée.
 Page.Options.Option.PostsPerPage.Description=Le nombre de message à afficher par page avant que les boutons de contrôle de page sont affichés.
-Page.Options.Option.CharactersPerPost.Description=The number of characters to display from a post before cutting it off and showing a link to expand it (-1 to disable). The actual length of the snippet is determined by the option below.
-Page.Options.Option.PostCutOffLength.Description=The number of characters that are displayed if a post is deemed to long (see option above).
+Page.Options.Option.CharactersPerPost.Description=Le nombre de caractères à afficher par message avant que le lien proposant de voir l'intégralité ne soit proposé (-1 pour désactiver). La taille du composant est determinée par l'option ci-desssous.
+Page.Options.Option.PostCutOffLength.Description=Le nombre de charactère à afficher avant que le message ne soit considéré comme trops long. (voir option du dessus)
 Page.Options.Option.RequireFullAccess.Description=Que ce soit pour refuser l'accès à Sone à tout hôte à qui un accès complet n'a pas été accordé.
 Page.Options.Section.TrustOptions.Title=Réglages de confiance
 Page.Options.Option.PositiveTrust.Description=La quantité de note de confiance positive que vous voulez assigner à d'autres Sones en cochant la case en dessous d'un message ou d'une réponse.
@@ -64,7 +64,7 @@ Page.Options.Option.NegativeTrust.Description=La quantité de note de confiance
 Page.Options.Option.TrustComment.Description=Le commentaire qui sera mis dans le web of trust pour chaque note de confiance que vous assignez de Sone.
 Page.Options.Section.FcpOptions.Title=Réglages de l'Interface FCP
 Page.Options.Option.FcpInterfaceActive.Description=Activer l'interface FCP aafin de permettre à d'autres plugins et clients à distance d'accéder votre plugin Sone.
-Page.Options.Option.FcpFullAccessRequired.Description=Requière une connexion  FCP d'hôtes autorisés (Veuillez voir votre {link}configuration du noeud, section “FCP”{/link})
+Page.Options.Option.FcpFullAccessRequired.Description=Requière une connexion FCP d'hôtes autorisés (Veuillez voir votre {link}configuration du noeud, section “FCP”{/link})
 Page.Options.Option.FcpFullAccessRequired.Value.No=Non
 Page.Options.Option.FcpFullAccessRequired.Value.Writing=Pour accès à l'écriture
 Page.Options.Option.FcpFullAccessRequired.Value.Always=toujours
@@ -96,28 +96,28 @@ Page.Index.Button.Post=Envoyer!
 Page.Index.PostList.Title=Envoyer du contenu
 Page.Index.PostList.Text.NoPostYet=Personne n'a encore écrit de message. vous devriez probablement commencer maintenant!
 
-Page.New.Title=New Posts and Replies - Sone
-Page.New.Page.Title=New Posts and Replies
-Page.New.NothingNew=At the moment there’s nothing new.
+Page.New.Title=Nouveaux messages et réponses - Sone
+Page.New.Page.Title=Nouveaux messages et réponses
+Page.New.NothingNew=Actuellement, ... rien de neuf.
 
 Page.KnownSones.Title=Sones connus - Sone
 Page.KnownSones.Page.Title=Sones connus
 Page.KnownSones.Text.NoKnownSones=Il n'y a pour le moment aucun Sone connu.
-Page.KnownSones.Label.Sort=Sort:
-Page.KnownSones.Label.FilterSones=Filter Sones:
-Page.KnownSones.Sort.Field.Name=Name
-Page.KnownSones.Sort.Field.LastActivity=Last activity
-Page.KnownSones.Sort.Field.Posts=Number of posts
-Page.KnownSones.Sort.Field.Images=Number of images
-Page.KnownSones.Sort.Order.Ascending=Ascending
-Page.KnownSones.Sort.Order.Descending=Descending
-Page.KnownSones.Filter.Followed=Show only followed Sones
-Page.KnownSones.Filter.NotFollowed=Hide followed Sones
-Page.KnownSones.Filter.New=Show only new Sones
-Page.KnownSones.Filter.NotNew=Hide new Sones
-Page.KnownSones.Button.Apply=Apply
-Page.KnownSones.Button.FollowAllSones=Follow all Sones on this page
-Page.KnownSones.Button.UnfollowAllSones=Unfollow all Sones on this page
+Page.KnownSones.Label.Sort=Trier:
+Page.KnownSones.Label.FilterSones=Filtrer les Sones:
+Page.KnownSones.Sort.Field.Name=Nom
+Page.KnownSones.Sort.Field.LastActivity=Dernières activités
+Page.KnownSones.Sort.Field.Posts=Nombre de messages
+Page.KnownSones.Sort.Field.Images=Nombre d'images
+Page.KnownSones.Sort.Order.Ascending=Montant
+Page.KnownSones.Sort.Order.Descending=Descendant
+Page.KnownSones.Filter.Followed=Montrer seulement les Sones suivis
+Page.KnownSones.Filter.NotFollowed=Cacher les Sones suivis
+Page.KnownSones.Filter.New=Montrer seulement les nouveaux Sones
+Page.KnownSones.Filter.NotNew=Cacher les nouveaux Sones
+Page.KnownSones.Button.Apply=Appliquer
+Page.KnownSones.Button.FollowAllSones=Suivre tous les Sones de cette page
+Page.KnownSones.Button.UnfollowAllSones=Ne plus suivre tous les Sones de cette page
 
 Page.EditProfile.Title=Editer le profil - Sone
 Page.EditProfile.Page.Title=Éditer le profil
@@ -131,8 +131,8 @@ Page.EditProfile.Birthday.Label.Day=Jour:
 Page.EditProfile.Birthday.Label.Month=Mois:
 Page.EditProfile.Birthday.Label.Year=Année:
 Page.EditProfile.Avatar.Title=Avatar
-Page.EditProfile.Avatar.Description=You can select one of your uploaded images to be shown as avatar. It should not be larger than 64×64 pixels because that is the largest size shown for other people (80×80 pixels is used for the page header).
-Page.EditProfile.Avatar.Delete=No avatar
+Page.EditProfile.Avatar.Description=Vous pouvez selectionner une de vos images comme avatar. Elle ne doit pas dépasser la taille de 64x64 pixels car c'est la taille la plus grande vue par les autre. (La taille 80x80 est réservée pour l'entête).
+Page.EditProfile.Avatar.Delete=Pas d'avatar
 Page.EditProfile.Fields.Title=Champs personnalisés
 Page.EditProfile.Fields.Description=Vous pouvez ajouter ici des champs personalisés à votre profil. Ces champs peuvent contenir tout ce que vous voulez et être aussi laconique ou aussi long que vous le souhaitez. Veuillez juste vous souvenir que quand on parle d'anonymat, parfois le moins, le mieux.
 Page.EditProfile.Fields.Button.Edit=Éditer
@@ -174,16 +174,16 @@ Page.CreateReply.Button.Post=envoyer une réponse!
 
 Page.ViewSone.Title=Voir Sone - Sone
 Page.ViewSone.Page.TitleWithoutSone=Voir les Sones inconnus
-Page.ViewSone.NoSone.Description=Il n'y a pour le moment aucun Sone avec l'identité {sone}. Si vous cherchiez une identité sone spécifique, veuillez être sûr que cela soit visible dans votre web of trust!
+Page.ViewSone.NoSone.Description=Il n'y a pour le moment aucun Sone avec l'identité {sone}. Si vous cherchiez une identité Sone spécifique, veuillez être sûr que cela soit visible dans votre web of trust!
 Page.ViewSone.UnknownSone.Description=Ce Sone n'a pas encore été récupéré. Veuillez revérifier un peu plus tard.
-Page.ViewSone.UnknownSone.LinkToWebOfTrust=Even though the Sone is still unknown, its Web of Trust profile might already be available:
+Page.ViewSone.UnknownSone.LinkToWebOfTrust=Ce Sone n'est pas connu, son profile WoT doit être disponible.
 Page.ViewSone.WriteAMessage=Vous pouvez écrire un message à ce Sone ici. Veuillez noter que tout le monde sera capable de lire ce message!
 Page.ViewSone.PostList.Title=Messages par {sone}
-Page.ViewSone.PostList.Text.NoPostYet=Ce sone n'as encore rien envoyé.
+Page.ViewSone.PostList.Text.NoPostYet=Ce Sone n'as encore rien envoyé.
 Page.ViewSone.Profile.Title=Profil
 Page.ViewSone.Profile.Label.Name=Nom
 Page.ViewSone.Profile.Label.Albums=Albums
-Page.ViewSone.Profile.Albums.Text.All=All albums
+Page.ViewSone.Profile.Albums.Text.All=All Albums
 Page.ViewSone.Profile.Name.WoTLink=Profil Web of trust
 Page.ViewSone.Replies.Title=Messages {sone} a répondu à
 
@@ -217,52 +217,52 @@ Page.UnfollowSone.Title=Ne plus suivre Sone - Sone
 
 Page.ImageBrowser.Title=Image Browser - Sone
 Page.ImageBrowser.Album.Title=Album “{album}”
-Page.ImageBrowser.Album.Error.NotFound.Text=The requested album could not be found. It is possible that it has not yet been downloaded, or that it has been deleted.
-Page.ImageBrowser.Sone.Title=Albums of {sone}
-Page.ImageBrowser.Sone.Error.NotFound.Text=The requested Sone could not be found. It is possible that it has not yet been downloaded.
+Page.ImageBrowser.Album.Error.NotFound.Text=l'Album recherché n'est pas disponible. Il est possible qu'il ne soit pas encore mis à jour, ou qu'il est été dupprimé.
+Page.ImageBrowser.Sone.Title=Albums de {sone}
+Page.ImageBrowser.Sone.Error.NotFound.Text=Le Sone recherché ne peut pas être trouvé. Il est possible qu'il ne soit pas encore téléchargé.
 Page.ImageBrowser.Header.Albums=Albums
 Page.ImageBrowser.Header.Images=Images
-Page.ImageBrowser.Link.All=All Sones
-Page.ImageBrowser.CreateAlbum.Button.CreateAlbum=Create Album
-Page.ImageBrowser.Album.Edit.Title=Edit Album
-Page.ImageBrowser.Album.Delete.Title=Delete Album
-Page.ImageBrowser.Album.Label.AlbumImage=Album Image:
+Page.ImageBrowser.Link.All=Tous les Sones
+Page.ImageBrowser.CreateAlbum.Button.CreateAlbum=Creer un Album
+Page.ImageBrowser.Album.Edit.Title=Editer l'Album
+Page.ImageBrowser.Album.Delete.Title=Supprimer l'Album
+Page.ImageBrowser.Album.Label.AlbumImage=Album d'Images:
 Page.ImageBrowser.Album.Label.Title=Title:
 Page.ImageBrowser.Album.Label.Description=Description:
-Page.ImageBrowser.Album.AlbumImage.Choose=Choose Album Image
-Page.ImageBrowser.Album.Button.Save=Save Album
-Page.ImageBrowser.Album.Button.Delete=Delete Album
-Page.ImageBrowser.Image.Edit.Title=Edit Image
+Page.ImageBrowser.Album.AlbumImage.Choose=Vhoisissez un Album d'images
+Page.ImageBrowser.Album.Button.Save=Sauver l'Album
+Page.ImageBrowser.Album.Button.Delete=Supprimer l'Album
+Page.ImageBrowser.Image.Edit.Title=Editer l'image
 Page.ImageBrowser.Image.Title.Label=Title:
 Page.ImageBrowser.Image.Description.Label=Description:
 Page.ImageBrowser.Image.Button.MoveLeft=◀
 Page.ImageBrowser.Image.Button.Save=Save Image
 Page.ImageBrowser.Image.Button.MoveRight=►
-Page.ImageBrowser.Image.Delete.Title=Delete Image
-Page.ImageBrowser.Image.Button.Delete=Delete Image
+Page.ImageBrowser.Image.Delete.Title=Supprimer l'Image
+Page.ImageBrowser.Image.Button.Delete=Supprimer l'Image
 
-Page.CreateAlbum.Title=Create Album - Sone
-Page.CreateAlbum.Page.Title=Create Album
-Page.CreateAlbum.Error.NameMissing=You seem to have forgotten to enter a name for your new album.
+Page.CreateAlbum.Title=Créer un Album - Sone
+Page.CreateAlbum.Page.Title=Créer un Album
+Page.CreateAlbum.Error.NameMissing=Vous avez oublié de donner un nom à votre Album.
 
-Page.UploadImage.Title=Upload Image - Sone
-Page.UploadImage.Error.InvalidImage=The image you were trying to upload could not be recognized. Please upload only JPEG (*.jpg or *.jpeg), or PNG (*.png) images.
+Page.UploadImage.Title=Insérer une Image - Sone
+Page.UploadImage.Error.InvalidImage=L'Image qu vous éssayez d'insérer n'est pas reconnue. Merci de n'insérer que des JPEG (*.jpg or *.jpeg), ou des PNG (*.png).
 
-Page.EditImage.Title=Edit Image - Sone
+Page.EditImage.Title=Editer l'Image - Sone
 
-Page.DeleteImage.Title=Delete Image - Sone
-Page.DeleteImage.Page.Title=Delete Image
-Page.DeleteImage.Text.ImageWillBeGone=This will remove the image “{image}” from your album “{album}”. If it has already been inserted into Freenet it can not be removed from there forcefully. Do you want to delete the image?
-Page.DeleteImage.Button.Yes=Yes, delete image.
-Page.DeleteImage.Button.No=No, don’t delete image.
+Page.DeleteImage.Title=Supprimer l'Image - Sone
+Page.DeleteImage.Page.Title=Supprimer l'Image
+Page.DeleteImage.Text.ImageWillBeGone=Ceci supprimera l'image “{image}” de l'Album “{album}”. Si elle a déjà été insérée sur Freenet elle ne pourra pas être supprimée. Voulez-vous supprimer cette Image ?
+Page.DeleteImage.Button.Yes=Oui, supprimer cette image.
+Page.DeleteImage.Button.No=Non, ne pas supprimer cette image.
 
-Page.EditAlbum.Title=Edit Album - Sone
+Page.EditAlbum.Title=Editer l'Album - Sone
 
-Page.DeleteAlbum.Title=Delete Album - Sone
-Page.DeleteAlbum.Page.Title=Delete Album
-Page.DeleteAlbum.Text.AlbumWillBeGone=This will remove your album “{title}”. Do you really want to do that?
-Page.DeleteAlbum.Button.Yes=Yes, delete album.
-Page.DeleteAlbum.Button.No=No, don’t delete album.
+Page.DeleteAlbum.Title=Supprimer l'Album - Sone
+Page.DeleteAlbum.Page.Title=Supprimer l'Album
+Page.DeleteAlbum.Text.AlbumWillBeGone=Vous allez supprimer l'Album “{title}”. Etes vous certain de vouloir faire cela ?
+Page.DeleteAlbum.Button.Yes=Oui, supprimer cet album.
+Page.DeleteAlbum.Button.No=Non, ne pas supprimer cet album.
 
 Page.Trust.Title=Faire confiance à Sone - Sone
 
@@ -274,10 +274,10 @@ Page.MarkAsKnown.Title=Marquer comme connu - Sone
 
 Page.Bookmark.Title=Marque-page - Sone
 Page.Unbookmark.Title=Effacer le marque-page - Sone
-Page.Bookmarks.Title=MArque-pages - Sone
+Page.Bookmarks.Title=Marque-pages - Sone
 Page.Bookmarks.Page.Title=Marque-pages
 Page.Bookmarks.Text.NoBookmarks=Vous n'avez aucun marque-page défini pour le moment. Vous pouvez ajouter des messages à vos marque-pages en cliquant sur l'étoile en dessous du message.
-Page.Bookmarks.Text.PostsNotLoaded=Certains de vos messages dans vos marque-pages ne sont pas affichés car ils n'ont pas pu être chargés. Ceci peut arriver si vous avez redémarré Sone récemment ou si le Sone original a effacé le message. Si vous êtes suffisamment sûr aue ces messages n'existent plus, vous pouvez les {link}retirer de vos marque pages{/link}.
+Page.Bookmarks.Text.PostsNotLoaded=Certains de vos messages dans vos marque-pages ne sont pas affichés car ils n'ont pas pu être chargés. Ceci peut arriver si vous avez redémarré Sone récemment ou si le Sone original a effacé le message. Si vous êtes suffisamment sûr que ces messages n'existent plus, vous pouvez les {link}retirer de vos marque pages{/link}.
 
 Page.Search.Title=Recherche - Sone
 Page.Search.Page.Title=Résultats de recherche
@@ -285,16 +285,16 @@ Page.Search.Text.SoneHits=Les Sones suivants correspondent aux termes de votre r
 Page.Search.Text.PostHits=Les messages suivants correspondent aux termes de votre recherche.
 Page.Search.Text.NoHits=Aucun Sone ou message ne correspond aux termes de votre recherche.
 
-Page.Rescue.Title=Rescue Sone - Sone
-Page.Rescue.Page.Title=Rescue Sone “{0}”
-Page.Rescue.Text.Description=The Rescue Mode lets you restore previous versions of your Sone. This can be necessary if your configuration was lost.
-Page.Rescue.Text.Procedure=The Rescue Mode works by fetching the latest inserted edition of your Sone. If an edition was successfully fetched it will be loaded into your Sone, letting you control your posts, profile, and other settings (you could do that in a second browser tab or window). If the fetched edition is not the one you want to restore, instruct the Rescue Mode to fetch the next older edition below.
-Page.Rescue.Text.Fetching=The Sone Rescuer is currently fetching edition {0} of your Sone.
-Page.Rescue.Text.Fetched=The Sone Rescuer has downloaded edition {0} of your Sone. Please check your posts, replies, and profile. If you like what the current Sone contains, just unlock it.
-Page.Rescue.Text.FetchedLast=The Sone rescuer has downloaded the last available edition. If it did not manage to restore your Sone you are probably out of luck now.
-Page.Rescue.Text.NotFetched=The Sone Rescuer could not download edition {0} of your Sone. Please either try again with edition {0}, or try the next older edition.
-Page.Rescue.Label.NextEdition=Next edition:
-Page.Rescue.Button.Fetch=Fetch edition
+Page.Rescue.Title=Secours Sone - Sone
+Page.Rescue.Page.Title=Secours Sone “{0}”
+Page.Rescue.Text.Description=Le Mode Secours vous permet de restaurer une version précédente de Sone. Cela peut être nécessaire si votre configuration est perdue
+Page.Rescue.Text.Procedure=Le Mode secours fonctionne en récupérant vos dernières insertions. Si une insertion est récupérée elle sera chargé dans votre Sone, vous permettant de reprendre le controle de vos messages, profile, et autres configurations (vous pouvez faire cela dans une seconde fenetre ou tabulation Sone). Si vos messages ne peuvent être récupérés, demandez au Mode Secours de récupérer les anciennes versions ci-dessous.
+Page.Rescue.Text.Fetching=Le Secouriste de Sone est en train de récupérer la version {0} de votre Sone.
+Page.Rescue.Text.Fetched=Le Secouriste de Sone a récupéré la version {0} de votre Sone. Merci de vérifire vos messages, réponses et profile. Si les informations vous conviennent, débloquez la version.
+Page.Rescue.Text.FetchedLast=Le secouriste de Sone a récupéré la dernière version disponible. Si vous ne souhaitiez pas récupérer une ancienne version de Sone. Consiédérez que vous n'avez pas de chance.
+Page.Rescue.Text.NotFetched=Le Secouriste de Sone ne peut pas récupérer la version {0} de votre Sone. Merci de réessayer, ou essayez avec une version plus ancienne.
+Page.Rescue.Label.NextEdition=Prochaine version:
+Page.Rescue.Button.Fetch=Récupérer la version.
 
 Page.NoPermission.Title=Accès non autorisé - Sone
 Page.NoPermission.Page.Title=Accès non autorisé
@@ -315,7 +315,7 @@ View.Search.Button.Search=Recherche
 
 View.CreateSone.Text.WotIdentityRequired=Pour créer un Sone vous avez besoin d'une identité venant du {link}plugin Web of Trust {/link}.
 View.CreateSone.Select.Default=Sélectionner une identité
-View.CreateSone.Text.NoIdentities=Vous n'avez pas d'identité "Web of Trust". Veuillez vous  diriger sur la page du  {link}plugin Web of Trust {/link} et créer une identité.
+View.CreateSone.Text.NoIdentities=Vous n'avez pas d'identité "Web of Trust". Veuillez vous diriger sur la page du {link}plugin Web of Trust {/link} et créer une identité.
 View.CreateSone.Text.NoNonSoneIdentities=Vous n'avez aucune identité "Web of Trust" qui ne sont pas déjà un Sone. Utilisez une des identités "Web of Trust" restantes pour créer un nouveau Sone ou dirigez vous sur la page du {link} plugin "Web of Trust"{/link} pour créer une nouvelle identité.
 View.CreateSone.Button.Create=Créer un Sone
 View.CreateSone.Text.Error.NoIdentity=Vous n'avez pas sélectionné d'identité.
@@ -334,13 +334,13 @@ View.Sone.Button.FollowSone=suivre
 View.Sone.Status.Modified=Ce Sone a été modifié et attends d'être inséré.
 View.Sone.Status.Unknown=Ce Sone n'a pas encore été récupéré.
 View.Sone.Status.Idle=Ce Sone est inactif, c'est à dire qu'il n'est pas en train d'être inséré ou téléchargé.
-View.Sone.Status.Downloading=Ce sone est en train d'être téléchargé.
-View.Sone.Status.Inserting=Ce sone est en train d'être inséré.
+View.Sone.Status.Downloading=Ce Sone est en train d'être téléchargé.
+View.Sone.Status.Inserting=Ce Sone est en train d'être inséré.
 
-View.SoneMenu.Link.AllAlbums=all albums
+View.SoneMenu.Link.AllAlbums=tous les Albums
 
 View.Post.UnknownAuthor=(inconnu)
-View.Post.WebOfTrustLink=web of trust profile
+View.Post.WebOfTrustLink=profile web of trust
 View.Post.Permalink=lier le message
 View.Post.PermalinkAuthor=Lier l'auteur
 View.Post.Bookmarks.PostIsBookmarked=Ce message a été ajouté aux marque-pages, cliquer pour retirer des marque-pages
@@ -350,10 +350,10 @@ View.Post.SendReply=Répondre!
 View.Post.Reply.DeleteLink=Effacer
 View.Post.LikeLink=Aime
 View.Post.UnlikeLink=N'aime pas
-View.Post.ShowSource=Toggle Parser
+View.Post.ShowSource=Activer/Désactiver le parser
 View.Post.NotDownloaded=Ce message n'a pas encore été téléchargé, ou a été effacé.
-View.Post.ShowMore=show more
-View.Post.ShowLess=show less
+View.Post.ShowMore=voir plus
+View.Post.ShowLess=vois moins
 
 View.UpdateStatus.Text.ChooseSenderIdentity=Choisir l'identité de l'expéditeur
 
@@ -361,14 +361,14 @@ View.Trust.Tooltip.Trust=Faire confiance à cette personne
 View.Trust.Tooltip.Distrust=Assigner une note négative en confiance à cette personne
 View.Trust.Tooltip.Untrust=Retirer votre note de confiance de cette personne
 
-View.CreateAlbum.Title=Create Album
-View.CreateAlbum.Label.Name=Name:
+View.CreateAlbum.Title=Créer un Album
+View.CreateAlbum.Label.Name=Nom:
 View.CreateAlbum.Label.Description=Description:
 
-View.UploadImage.Title=Upload Image
-View.UploadImage.Label.Title=Title:
+View.UploadImage.Title=Insérer une Image
+View.UploadImage.Label.Title=Titre:
 View.UploadImage.Label.Description=Description:
-View.UploadImage.Button.UploadImage=Upload Image
+View.UploadImage.Button.UploadImage=Insérer une Image
 
 View.Time.InTheFuture=dans le futur
 View.Time.AFewSecondsAgo=au cours des dernières secondes passées
@@ -440,11 +440,9 @@ Notification.SoneRescued.Text=Les Sones suivants ont été sauvés:
 Notification.SoneRescued.Text.RememberToUnlock=Veuillez vous souvenir de contrôler les messages et réponses que vous avez donnés et n'oubliez ps de déverrouiller vos Sones!
 Notification.LockedSones.Text=Les Sones suivants ont été verrouillés pour plus de 5 minutes. Veuillez vérifier si vous voulez vraiment garder ces Sones bloqués:
 Notification.NewVersion.Text=La version {version} du pluggin Sone a été trouvée. Téléchargez la depuis USK@nwa8lHa271k2QvJ8aa0Ov7IHAV-DFOCFgmDt3X6BpCI,DuQSUZiI~agF8c-6tjsFFGuZ8eICrzWCILB60nT8KKo,AQACAAE/sone/{edition}​!
-Notification.InsertingImages.Text=The following images are being inserted:
-Notification.InsertedImages.Text=The following images have been inserted:
-Notification.ImageInsertFailed.Text=The following images could not be inserted:
+Notification.InsertingImages.Text=Les images suivantes sont en cours d'insertion:
+Notification.InsertedImages.Text=Les images suivantes ont été insérées:
+Notification.ImageInsertFailed.Text=Les images suivantes ne peuvent être insérées:
 Notification.Mention.ShortText=Vous avez été mentionné.
 Notification.Mention.Text=Vous avez été mentionné dans les messages suivants:
 Notification.SoneInsert.Duration={0,number} {0,choice,0#seconds|1#second|1<seconds}
-
-# Updated lines: 7-8, 17-18, 25-26, 44-54, 58-59, 99-101, 106-120, 133-135, 179, 185-186, 218-265, 288-297, 325-327, 340, 343, 355-356, 364-371, 402-409, 411-412, 442-444, 447
index a1868b8..e076250 100644 (file)
@@ -446,5 +446,3 @@ Notification.ImageInsertFailed.Text=De følgende bildene kunne ikke bli innsatt:
 Notification.Mention.ShortText=Du har blitt nevnt:
 Notification.Mention.Text=Du har blitt nevnt i følgende innlegg:
 Notification.SoneInsert.Duration={0,number} {0,choice,0#sekund|1#sekund|1<sekunder}
-
-# Updates: 7-8, 99-101, 238, 240, 267, 269, 271, 416
diff --git a/src/main/resources/i18n/sone.pl.properties b/src/main/resources/i18n/sone.pl.properties
new file mode 100644 (file)
index 0000000..c143cde
--- /dev/null
@@ -0,0 +1,448 @@
+Navigation.Menu.Sone.Name=Sone
+Navigation.Menu.Sone.Tooltip= Wtyczka Sieci Freenet
+Navigation.Menu.Sone.Item.Login.Name=Login
+Navigation.Menu.Sone.Item.Login.Tooltip=Login do twojego Sone
+Navigation.Menu.Sone.Item.Index.Name=Twój Sone
+Navigation.Menu.Sone.Item.Index.Tooltip=Pokaż Twój Sone
+Navigation.Menu.Sone.Item.New.Name=New Posty i odpowiedzi
+Navigation.Menu.Sone.Item.New.Tooltip=Pokazuje nowe posty i odpowiedzi
+Navigation.Menu.Sone.Item.CreateSone.Name=Utwórz Sone
+Navigation.Menu.Sone.Item.CreateSone.Tooltip=Utwórz nowy Sone
+Navigation.Menu.Sone.Item.KnownSones.Name=Znane Sone
+Navigation.Menu.Sone.Item.KnownSones.Tooltip=Pokaż wszystkie znane Sone
+Navigation.Menu.Sone.Item.Bookmarks.Name=Zakładki
+Navigation.Menu.Sone.Item.Bookmarks.Tooltip=Pokaż zaznaczone posty
+Navigation.Menu.Sone.Item.EditProfile.Name=Edytuj Profil
+Navigation.Menu.Sone.Item.EditProfile.Tooltip=Edytuj Profil Swojego Sone
+Navigation.Menu.Sone.Item.ImageBrowser.Name=Grafika
+Navigation.Menu.Sone.Item.ImageBrowser.Tooltip=Zarządzaj Swoimi Obrazami
+Navigation.Menu.Sone.Item.DeleteSone.Name=Usuń Sone
+Navigation.Menu.Sone.Item.DeleteSone.Tooltip=Usuwa bieżący Sone
+Navigation.Menu.Sone.Item.Logout.Name=Wyloguj
+Navigation.Menu.Sone.Item.Logout.Tooltip=Wylogowuje z bieżącego Sone
+Navigation.Menu.Sone.Item.Options.Name=Opcje
+Navigation.Menu.Sone.Item.Options.Tooltip=Opcje dla wtyczki Sone
+Navigation.Menu.Sone.Item.Rescue.Name=Pomoc
+Navigation.Menu.Sone.Item.Rescue.Tooltip=Sone Pomoc
+Navigation.Menu.Sone.Item.About.Name=O Sone
+Navigation.Menu.Sone.Item.About.Tooltip=Informacje o Sone
+
+Page.About.Title=O Sone - Sone
+Page.About.Page.Title=O Sone
+Page.About.Flattr.Description=Jeśli podoba Ci się Sone to możesz wesprzeć moją pracę klikając na przycisk Flattr na dole każdej strony. Flattr to nieanonimowy system małych wpłat, który działa jak internetowy słoik z napiwkami, w którym ilość funduszy wydawanych przez każdego użytkownika jest ograniczona (ale nie mniejsza niż 2 € miesięcznie).Więcej informacji można znaleźć na {link}flattr.com{/link}.
+Page.About.Homepage.Title=Strona główna
+Page.About.Homepage.Description=Więcej informacji na temat kodu zródłowego Sone można znaleźć tu {link}homepage{/link}.
+Page.About.License.Title=Licencja
+
+Page.Options.Title=Opcje - Sone
+Page.Options.Page.Title=Opcje
+Page.Options.Page.Description=Te opcje wpływaja na pracę wtyczki Sone.
+Page.Options.Section.SoneSpecificOptions.Title=Sone-Konkretne Opcje
+Page.Options.Section.SoneSpecificOptions.NotLoggedIn=Opcje dostępne po zalogowaniu {link}zalogowany{/link}.
+Page.Options.Section.SoneSpecificOptions.LoggedIn=Opcje dostępne po zalogowaniu dla aktualnie używanego profilu Sone. 
+Page.Options.Option.AutoFollow.Description=Śledź automatycznie nowych uzytkowników Sone. Śledzeni będą tylko użytkownicy Sone odnalezieni po uruchomieniu tej opcji!
+Page.Options.Option.EnableSoneInsertNotifications.Description=Włączenie tej opcji uruchamia powiadomienia o tym, że twój Sone jest wysyłany lub zakończył wysyłanie na serwer.
+Page.Options.Option.ShowNotificationNewSones.Description=Pokaż powiadomienie o nowych użytkownikach Sone.
+Page.Options.Option.ShowNotificationNewPosts.Description=Pokaż powiadomienia o nowych postach.
+Page.Options.Option.ShowNotificationNewReplies.Description=Pokaż powiadomienia o nowych odpowiedziach.
+Page.Options.Section.AvatarOptions.Title=Opcje Avatara
+Page.Options.Option.ShowAvatars.Description=Tu możesz wyłączyć niestandardowe avatary, w zależności od wybranych kryteriów. Po wyłączeniu avatara zamiast niego pokazuje się avatar generowany automatycznie.
+Page.Options.Option.ShowAvatars.Never.Description=Nigdy nie pokazuj niestandardowych avatarów.
+Page.Options.Option.ShowAvatars.Followed.Description=Pokazuj avatary tylko śledzonych użytkowników Sone.
+Page.Options.Option.ShowAvatars.ManuallyTrusted.Description=Pokazuj avatary tylko tych użytkowników Sone, którym ręcznie przyznałeś ilość punktów zaufania przekraczającą 0.
+Page.Options.Option.ShowAvatars.Trusted.Description=Pokazuj avatary tylko tych użytkowników Sone, którzy mają ilość punktów zaufania większą niż 0. 
+Page.Options.Option.ShowAvatars.Always.Description=Zawsze pokazuj niestandardowe avatary. Uwaga: niektóre avatary mogą zawierać obraźliwe treści. 
+Page.Options.Section.RuntimeOptions.Title=Tryb pracy
+Page.Options.Option.InsertionDelay.Description=Czas oczekiwania użytkownika Sone na modifikację profilu Sone przed jego załadowaniem. 
+Page.Options.Option.PostsPerPage.Description=Ilość postów wyświetlanych na stronie przed pojawieniem się znaków paginacji.
+Page.Options.Option.CharactersPerPost.Description=Ilość znaków pokazywanych w poście zanim zostanie on obcięty i pojawi się link do jego rozszerzenia (-1 powoduje wyłączenie). Długość fragmentu zależy od poniższej opcji. 
+Page.Options.Option.PostCutOffLength.Description=Ilość znaków wyświetlanych w przypadku za długiego postu (zobacz opcję powyżej).
+Page.Options.Option.RequireFullAccess.Description=Opcja odmowy dostępu do Sone hostom bez przyznanego pełnego dostępu. 
+Page.Options.Section.TrustOptions.Title=Ustawienia Zaufania
+Page.Options.Option.PositiveTrust.Description=Punkty pozytywnego zaufania, które chcesz przyznać innym użytkownikom Sone klikając na ikonę pod postem lub odpowiedzią. 
+Page.Options.Option.NegativeTrust.Description=Punkty zaufania, które chcesz przyznać innym użytkownikom Sone klikając na czerwony krzyżyk pod postem lub odpowiedzią. Wartosć powinna być negatywna. 
+Page.Options.Option.TrustComment.Description=Komentarz, który wyświetli się w sieci zaufania w momencie przyznawania punktów zaufania w obrębie Sone. 
+Page.Options.Section.FcpOptions.Title=Ustawienia Interfejsu FCP 
+Page.Options.Option.FcpInterfaceActive.Description=Uruchom interfejs FCP, aby umożliwić innym wtyczkom i klientom zdalnym dostęp do twojej wtyczki Sone. 
+Page.Options.Option.FcpFullAccessRequired.Description=Wymagane połączenie FCP dla hostów z dostępem (patrz twoja {link}konfiguracja Freenet, sekcja “FCP”{/link})
+Page.Options.Option.FcpFullAccessRequired.Value.No=Nie
+Page.Options.Option.FcpFullAccessRequired.Value.Writing=Dostęp z zapisem
+Page.Options.Option.FcpFullAccessRequired.Value.Always=Zawsze
+Page.Options.Section.Cleaning.Title=Wyczyść
+Page.Options.Option.ClearOnNextRestart.Description=Przy kolejnym uruchomieniu zresetuj ustawienia wtyczki Sone. Uwaga!{strong}Wszystkie twoje profile Sone zostaną zniszczone{/strong}upewnij się, że wykonano kopie zapasowe wszystkich niezbędnych danych! Wymagane wybranie odpowiedzi "tak" w następnej opcji.
+Page.Options.Option.ReallyClearOnNextRestart.Description=Wymagane wybranie opcji"tak"jeśli {strong}naprawdę{/strong} jesteś zdecydowany zresetować ustawienia wtyczki konfiguracyjnej przy kolejnym uruchomieniu.
+Page.Options.Warnings.ValueNotChanged=Opcja nie została zmieniona, ponieważ wprowadzono błędną wartość. 
+Page.Options.Button.Save=Zapisz
+
+Page.Login.Title=Login - Sone
+Page.Login.Page.Title=Login
+Page.Login.Label.SelectSone=Wybierz Sone:
+Page.Login.Option.NoSone=wybierz Sone…
+
+Page.Login.CreateSone.Title=Utwórz Sone
+
+Page.CreateSone.Title=Utwórz Sone - Sone
+
+Page.DeleteSone.Title=Usuń Sone - Sone
+Page.DeleteSone.Page.Title=Usuń Sone “{zone}”?
+Page.DeleteSone.Page.Description= Sone nie zostanie usunięte z Freenet (nie ma takiej możliwości), nastąpi jedynie wykluczenie tożsamości z siecii zaufania Sone.
+Page.DeleteSone.Button.Yes=Tak, usuń.
+Page.DeleteSone.Button.No=Nie usuwaj.
+
+Page.Index.Title=Twój Sone - Sone
+Page.Index.Label.Text=Napisz tekst:
+Page.Index.Label.Sender=Autor:
+Page.Index.Button.Post=Napisz!
+Page.Index.PostList.Title=Wątek
+Page.Index.PostList.Text.NoPostYet=Nie ma jeszcze żądnych postów. Można rozpocząć pisanie wątku! 
+
+Page.New.Title=Nowe Posty i Odpowiedzi - Sone
+Page.New.Page.Title=Nowe Posty i Odpowiedzi
+Page.New.NothingNew= Brak nowych postów i odpowiedzi.
+
+Page.KnownSones.Title=Znane Sone - Sone
+Page.KnownSones.Page.Title=Znane Sone
+Page.KnownSones.Text.NoKnownSones=Brak znanych Sone pasujących do wybranego filtru.
+Page.KnownSones.Label.Sort=Rodzaj:
+Page.KnownSones.Label.FilterSones=Filtruj Sone:
+Page.KnownSones.Sort.Field.Name=Nazwa
+Page.KnownSones.Sort.Field.LastActivity=Ostatnia aktywność
+Page.KnownSones.Sort.Field.Posts=Liczba postów
+Page.KnownSones.Sort.Field.Images=Liczba obrazków
+Page.KnownSones.Sort.Order.Ascending=Rosnąco
+Page.KnownSones.Sort.Order.Descending=Malejąco
+Page.KnownSones.Filter.Followed=Pokazuj tylko śledzone Sone
+Page.KnownSones.Filter.NotFollowed=Ukryj śledzone Sone
+Page.KnownSones.Filter.New=Pokazuj tylko nowe Sone
+Page.KnownSones.Filter.NotNew=Ukryj nowe Sone
+Page.KnownSones.Button.Apply=Zastosuj
+Page.KnownSones.Button.FollowAllSones=Śledź wszystkie Sone na tej stronie
+Page.KnownSones.Button.UnfollowAllSones=Przestań śledzić wszystkie Sone na tej stronie 
+
+Page.EditProfile.Title=Edytuj Profil - Sone
+Page.EditProfile.Page.Title=Edytuj Profil 
+Page.EditProfile.Page.Description=Na tej stronie uzyskasz dostęp do swoich danych profilowych.
+Page.EditProfile.Page.Hint.Optionality=Pamiętaj, każde pole w profilu jest opcjonalne! Nie musisz nic wpisywać! Wszystko co wpiszesz będzie bardzo długo przechowywane na Freenet!
+Page.EditProfile.Label.FirstName=Imię:
+Page.EditProfile.Label.MiddleName=Drugie imię:
+Page.EditProfile.Label.LastName=Nazwisko:
+Page.EditProfile.Birthday.Title=Data urodzin:
+Page.EditProfile.Birthday.Label.Day=Dzień:
+Page.EditProfile.Birthday.Label.Month=Miesiąc:
+Page.EditProfile.Birthday.Label.Year=Rok:
+Page.EditProfile.Avatar.Title=Avatar
+Page.EditProfile.Avatar.Description=Możesz ustawić jako avatar jedno z załadowanych zdjęć. Nie może być większe niż 64×64 pikseli, poniważ jest to największy rozmiar zdjęć wyświetlanych u innych osób (80×80 pikseli jest stosowany jako nagłówek strony).
+Page.EditProfile.Avatar.Delete=Brak avataru
+Page.EditProfile.Fields.Title=Pola niestandardowe
+Page.EditProfile.Fields.Description=Tutaj możesz wprowadzać pola nistandardowe do profilu. Pola mogą zawierać dowolne treści oraz dowolą ilość tekstu. Należy pamiętać, że ze względu na anonimowość często mniej znaczy więcej. 
+Page.EditProfile.Fields.Button.Edit=Edytuj
+Page.EditProfile.Fields.Button.MoveUp=Idź do góry
+Page.EditProfile.Fields.Button.MoveDown=Idź na dół
+Page.EditProfile.Fields.Button.Delete=Usuń
+Page.EditProfile.Fields.Button.ReallyDelete=Usuń całkowicie
+Page.EditProfile.Fields.AddField.Title=Dodaj Pole
+Page.EditProfile.Fields.AddField.Label.Name=Nazwa:
+Page.EditProfile.Fields.AddField.Button.AddField=Dodaj Pole
+Page.EditProfile.Button.Save=Zapisz profil
+Page.EditProfile.Error.DuplicateFieldName=Nazwa pola “{fieldName}” już istnieje.
+
+Page.EditProfileField.Title=Edytuj profil - Sone
+Page.EditProfileField.Page.Title=Edytuj profil
+Page.EditProfileField.Text=Wprowadź nową nazwę dla tego profilu 
+Page.EditProfileField.Error.DuplicateFieldName=Wprowadzona nazwa pola już istnieje.
+Page.EditProfileField.Button.Save=Zmień
+Page.EditProfileField.Button.Reset=Wróć do poprzedniej nazwy
+Page.EditProfileField.Button.Cancel=Nie zmieniaj nazwy
+
+Page.DeleteProfileField.Title=Usuń profil - Sone
+Page.DeleteProfileField.Page.Title=Usuń profil
+Page.DeleteProfileField.Text=Czy naprawdę chcesz usunąć ten profil? 
+Page.DeleteProfileField.Button.Yes=Tak, usuń. 
+Page.DeleteProfileField.Button.No=Nie, nie usuwaj.
+
+Page.CreatePost.Title=Napisz post - Sone
+Page.CreatePost.Page.Title=Napisz post
+Page.CreatePost.Label.Text=Treść postu:
+Page.CreatePost.Button.Post=Wyślij!
+Page.CreatePost.Error.EmptyText= Nic nie napisałeś, szkoda. Sprobój napisać coś więcej!
+
+Page.CreateReply.Title=Napisz odpowiedź - Sone
+Page.CreateReply.Page.Title=Napisz odpowiedź
+Page.CreateReply.Error.EmptyText=Nic nie napisaleś, szkoda. Sprobój napisać coś więcej!
+Page.CreateReply.Label.Text=Treść odpowiedzi:
+Page.CreateReply.Button.Post=Wyślij odpowiedź!
+
+Page.ViewSone.Title=Zobacz Sone - Sone
+Page.ViewSone.Page.TitleWithoutSone=Zobacz nieznany Sone
+Page.ViewSone.NoSone.Description= Nie ma obecnie Sone z tym ID {sone}. Jesli szukasz konkretnego użytkownika to upewnij się, że jest widoczny w twojej sieci zaufania. 
+Page.ViewSone.UnknownSone.Description=Ten Sone nie został jeszcze odzyskany. Proszę sprawdzić za chwilę. 
+Page.ViewSone.UnknownSone.LinkToWebOfTrust=Ten Sone nie jest jeszcze znany, ale jego profil w Sieci Zaufania może być już dostępny. 
+Page.ViewSone.WriteAMessage=Tu możesz napisać wiadomość do tego Sone. Każdy będzie mógł zobaczyć tą wiadomość!
+Page.ViewSone.PostList.Title=Posty {sone}
+Page.ViewSone.PostList.Text.NoPostYet=Ten Sone nie ma jeszcze żadnych postów.
+Page.ViewSone.Profile.Title=Profil
+Page.ViewSone.Profile.Label.Name=Nazwa
+Page.ViewSone.Profile.Label.Albums=Album
+Page.ViewSone.Profile.Albums.Text.All=Wszystkie albumy
+Page.ViewSone.Profile.Name.WoTLink=Profil 
+Page.ViewSone.Replies.Title=Posty, na które odpowiedział {sone}
+
+Page.ViewPost.Title=Zobacz Post - Sone
+Page.ViewPost.Page.Title=Zobacz Posty {sone}
+Page.ViewPost.Page.TitleUnknownSone=Zobacz Nieznane Posty
+Page.ViewPost.Text.UnknownPost=Ten post nie został jeszcze sciągnięty.
+
+Page.Like.Title=Lubię ten Post - Sone
+Page.Unlike.Title=Nie lubię tego Postu - Sone
+
+Page.DeletePost.Title=Usuń Sone - Sone
+Page.DeletePost.Page.Title=Usuń Sone
+Page.DeletePost.Text.PostWillBeGone=Usunięty post nie będzie widoczny na twoim Sone. Nie zostanie jednak usunięty z Freenetu, ponieważ nie ma takiej możliwości. Starsze wersje twojego Sone będą zawsze zawierały usunięte posty. 
+Page.DeletePost.Button.Yes=Tak, usuń.
+Page.DeletePost.Button.No=Nie, nie usuwaj.
+
+Page.DeleteReply.Title=Usuń odpowiedź - Sone
+Page.DeleteReply.Page.Title=Usuń odpowiedź
+Page.DeleteReply.Text.PostWillBeGone= Usunięta odpowiedź nie będzie widoczna na twoim Sone. Nie zostanie jednak usunięta z Freenet, ponieważ nie ma takiej możlowość. Starsze wersje twojego Sone zawsze będa zawierały usunięte odpowiedzi. 
+Page.DeleteReply.Button.Yes=Tak, usuń.
+Page.DeleteReply.Button.No=Nie, nie usuwaj.
+
+Page.LockSone.Title=Zablokuj Sone - Sone
+
+Page.UnlockSone.Title=Odblokuj Sone - Sone
+
+Page.FollowSone.Title=Śledź Sone - Sone
+
+Page.UnfollowSone.Title=Przestań śledzić Sone - Sone
+
+Page.ImageBrowser.Title=Wyszukiwarka Obrazów - Sone
+Page.ImageBrowser.Album.Title=Album “{album}”
+Page.ImageBrowser.Album.Error.NotFound.Text=Nie można znaleźć żądanego albumu. Prawdopodobnie nie został jeszcze ściagnięty, albo  został usunięty. 
+Page.ImageBrowser.Sone.Title=Albumy {sone}
+Page.ImageBrowser.Sone.Error.NotFound.Text=Nie można znaleźć żądanego Sone. Prawdopodobnie nie został jeszcze ściągnięty. 
+Page.ImageBrowser.Header.Albums=Albumy
+Page.ImageBrowser.Header.Images=Obrazy
+Page.ImageBrowser.Link.All=Wszystkie Sone
+Page.ImageBrowser.CreateAlbum.Button.CreateAlbum=Utwórz Album
+Page.ImageBrowser.Album.Edit.Title=Edytuj Album
+Page.ImageBrowser.Album.Delete.Title=Usuń Album
+Page.ImageBrowser.Album.Label.AlbumImage=Obraz dla Albumu:
+Page.ImageBrowser.Album.Label.Title=Tytuł:
+Page.ImageBrowser.Album.Label.Description=Opis:
+Page.ImageBrowser.Album.AlbumImage.Choose=Wybierz Obraz dla Albumu
+Page.ImageBrowser.Album.Button.Save=Zapisz Album
+Page.ImageBrowser.Album.Button.Delete=Usuń Album
+Page.ImageBrowser.Image.Edit.Title=Edytuj Obraz
+Page.ImageBrowser.Image.Title.Label=Tytuł:
+Page.ImageBrowser.Image.Description.Label=Opis:
+Page.ImageBrowser.Image.Button.MoveLeft=◀
+Page.ImageBrowser.Image.Button.Save=Zapisz Obraz
+Page.ImageBrowser.Image.Button.MoveRight=►
+Page.ImageBrowser.Image.Delete.Title=Usuń Obraz 
+Page.ImageBrowser.Image.Button.Delete=Usuń Obraz
+
+Page.CreateAlbum.Title=Utwórz Album - Sone
+Page.CreateAlbum.Page.Title=Utwórz Album
+Page.CreateAlbum.Error.NameMissing=Zapomniałeś wpisać nazwę dla swojego nowego albumu.
+
+Page.UploadImage.Title=Załąduj Obraz - Sone
+Page.UploadImage.Error.InvalidImage=Obraz, który chciałeś załadować ma nieznane rozszerzenie. Można załadować tylko obrazy o rozszerzeniu JPEG (*.jpg or *.jpeg), lub PNG (*.png).
+
+Page.EditImage.Title=Edytuj Obraz - Sone
+
+Page.DeleteImage.Title=Usuń Obraz - Sone
+Page.DeleteImage.Page.Title=Usuń Obraz
+Page.DeleteImage.Text.ImageWillBeGone=Obraz “{image}” zostanie usunięty z twojego albumu “{album}”. Jeśli został już umieszczony na Freenet to nie bedzie można go usunąć. Czy chcesz usunąć obraz?
+Page.DeleteImage.Button.Yes=Tak, usuń obraz.
+Page.DeleteImage.Button.No=Nie, nie usuwaj obrazu. 
+
+Page.EditAlbum.Title=Edytuj Album
+
+Page.DeleteAlbum.Title=Usuń Album - Sone
+Page.DeleteAlbum.Page.Title=Usuń Album
+Page.DeleteAlbum.Text.AlbumWillBeGone=Twój album zostanie usunięty “{title}”. Jesteś pewien, że chcesz go usunąć?
+Page.DeleteAlbum.Button.Yes=Tak, usuń album.
+Page.DeleteAlbum.Button.No=Nie, nie usuwaj albumu.
+
+Page.Trust.Title=Zaufaj Sone - Sone
+
+Page.Distrust.Title=Nie ufaj Sone - Sone
+
+Page.Untrust.Title=Przestań ufać Sone - Sone
+
+Page.MarkAsKnown.Title=Oznacz jako znany - Sone
+
+Page.Bookmark.Title=Zakładka - Sone
+Page.Unbookmark.Title=Usuń zakładkę - Sone
+Page.Bookmarks.Title=Zakładka - Sone
+Page.Bookmarks.Page.Title=Zakładki
+Page.Bookmarks.Text.NoBookmarks= Nie masz obecnie żadnych zakładek. Możesz dodać posty do zakładek klikając  gwiazdkę poniżej postu. 
+Page.Bookmarks.Text.PostsNotLoaded=Niektóre z zaznaczonych przez ciebie postów nie zostały wyświetlone, ponieważ wystąpił problem z ich załadowaniem. Dzieje się tak, jeśli Sone było niedawno restartowane, lub gdy posty zostały usunięte. Jeśli jesteś pewien, że posty zostały usunięte, to możesz je {link}odznaczyć{/link}.
+
+Page.Search.Title=Szukaj - Sone
+Page.Search.Page.Title=Szukaj 
+Page.Search.Text.SoneHits=Następujące Sone pasuja do twoich wyników wyszukiwania. 
+Page.Search.Text.PostHits=Następujące posty pasują do twoich wyników wyszukiwania. 
+Page.Search.Text.NoHits=Nie znaleziono żadnych Sone ani postów pasujących do twoich wyników wyszukiwania. 
+
+Page.Rescue.Title=Ratuj Sone
+Page.Rescue.Page.Title=Ratuj Sone “{0}”
+Page.Rescue.Text.Description=Tryb Ratunkowy pozwala przywrócić poprzednią wersję twojego Sone. Może to okazać się niezbędne, jeśli twoje ustawienia zostaną utracone. 
+Page.Rescue.Text.Procedure=Tryb Rarunkowy polega na pobraniu ostatniej wprowadzonej edycji twojego Sone. Jeśli edycja zostanie poprawnie pobrana wówczas zostanie załadowana na twój Sone, co umożliwi zarządzanie twoimi postami, profilem oraz innymi ustawieniami (można to zrobić w nowej zakładce lub oknie przegladarki). Jeśli pobrana edycja różni się od tej, którą chcesz przywrócić, wówczas ustaw Tryb Ratunkowy tak, aby poprał jeszcze wcześniejszą edycję.
+Page.Rescue.Text.Fetching=Tryb Ratunkowy Sone pobiera właśnie edycję {0} twojego Sone. 
+Page.Rescue.Text.Fetched=Tryb Ratunkowy Sone pobrał edycję {0} twojego Sone. Sprawdź swoje posty, odpowiedzi oraz profil. Jeśli podoba ci się zawartość aktualnego Sone, to mozesz go odblokować. 
+Page.Rescue.Text.FetchedLast= Tryb Ratunkowy Sone pobrał ostatnią dostępną edycję. Jeśli nie udało się przywrócić twojego Sone, to nie masz teraz szczęścia.
+Page.Rescue.Text.NotFetched=Tryb Ratunkowy Sone nie mógł sćiągnąć edycji  {0} twojego Sone.  Spróbuj pobrać ponownie edycję {0}, albo pobierz kolejną starszą edycję.
+Page.Rescue.Label.NextEdition=Następna edycja:
+Page.Rescue.Button.Fetch=Pobierz edycję
+
+Page.NoPermission.Title=Nieupoważniony dostęp- Sone
+Page.NoPermission.Page.Title=Nieupoważniony dostęp
+Page.NoPermission.Text.NoPermission=Próbowałeś zrobić coś do czego nie masz wystarczającej autoryzacji. Na przyszłość nie podejmuj tego typu działań, albo będziemy zmuszeni podjać odpowiednie kroki.  
+
+Page.DismissNotification.Title=Odrzuć powiadomienie - Sone
+
+Page.WotPluginMissing.Text.WotRequired=Sieć Zaufania jest integralną częścią Sone. Należy załądować wtyczkę Sieci Zaufania, aby móc korzystać z Sone. 
+Page.WotPluginMissing.Text.LoadPlugin=Załaduj wtyczkę Sieci Zaufania w {link}menadżerze wtyczek{/link}.
+
+Page.Logout.Title=Wyloguj - Sone
+
+Page.Invalid.Title=Niepoprawne działanie
+Page.Invalid.Page.Title=Niepoprawne działanie
+Page.Invalid.Text=Podjęto niepoprawne działanie, lub też działanie było poprawne, ale parametry nie. Wróć do{link}strony głównej{/link} i spróbuj ponownie. Jeśli problem będzie się utrzymywać to najprawdopodobniej znalazłeś błąd. 
+
+View.Search.Button.Search=Szukaj
+
+View.CreateSone.Text.WotIdentityRequired=Żeby utworzyć Sone potrzebujesz tożsamości z {link} wtyczki Sieć Zaufania{/link}.
+View.CreateSone.Select.Default=Wybierz tożsamość
+View.CreateSone.Text.NoIdentities=Nie posiadasz żadnych tożsamości w Sieci Zaufania. Idź do {link}Sieci Zaufania {/link} i utwórz nową tożsamość.
+View.CreateSone.Text.NoNonSoneIdentities=Nie masz żadnej tożsamości w Sieci Zaufania, która nie byłaby już kontem Sone. Użyj jednej z pozostałych tożsamości w sieci zaufania, w celu stworzenia nowego konta Sone, albo idź do {link}Sieci Zaufania{/link}aby stworzyć nową tożsamość.
+View.CreateSone.Button.Create=Utwórz Sone
+View.CreateSone.Text.Error.NoIdentity=Nie wybrałeś żadnej tożamości.
+
+View.Sone.Label.LastUpdate=Ostatnia aktualizacja:
+View.Sone.Text.UnknownDate=nieznana
+View.Sone.Stats.Posts={0,number} {0,choice,0#posts|1#post|1<posts}
+View.Sone.Stats.Replies={0,number} {0,choice,0#replies|1#reply|1<replies}
+View.Sone.Stats.Images={0,number} {0,choice,0#images|1#image|1<images}
+View.Sone.Button.UnlockSone=odblokuj
+View.Sone.Button.UnlockSone.Tooltip=Pozwala na załadowanie Sone
+View.Sone.Button.LockSone=zablokuj
+View.Sone.Button.LockSone.Tooltip=Uniemożliwia załadowanie Sone 
+View.Sone.Button.UnfollowSone=przestań śledzić
+View.Sone.Button.FollowSone=śledź
+View.Sone.Status.Modified=Ten Sone został zmodyfikowany i czeka na załadowanie
+View.Sone.Status.Unknown=Ten Sone nie został jeszcze odzyskany 
+View.Sone.Status.Idle=Ten Sone nie jest używany, t.j. nie jest ani ładowany ani ściągany.
+View.Sone.Status.Downloading=Ten Sone jest właśnie ściągany.
+View.Sone.Status.Inserting=Ten Sone jest właśnie ładowany.
+
+View.SoneMenu.Link.AllAlbums=wszystkie albumy
+
+View.Post.UnknownAuthor=(nieznany)
+View.Post.WebOfTrustLink=Profil sieci zaufania
+View.Post.Permalink=linkuj post
+View.Post.PermalinkAuthor=linkuj autora
+View.Post.Bookmarks.PostIsBookmarked=Post został oznaczony, kliknij, żeby odznaczyć 
+View.Post.Bookmarks.PostIsNotBookmarked=Post nie jest oznaczony, kliknij, żeby dodać do zakładek 
+View.Post.DeleteLink=Usuń
+View.Post.SendReply=Wyślij Odpowiedź!
+View.Post.Reply.DeleteLink=Usuń
+View.Post.LikeLink=Lubię
+View.Post.UnlikeLink=Nie lubię
+View.Post.ShowSource=Parsowanie
+View.Post.NotDownloaded=Ten post albo nie został jeszcze ściągnięty albo  został usunięty. 
+View.Post.ShowMore=pokaż więcej
+View.Post.ShowLess=pokaż mniej
+
+View.UpdateStatus.Text.ChooseSenderIdentity=Wybierz tożsamość nadawcy 
+
+View.Trust.Tooltip.Trust=Zaufaj tej osobie
+View.Trust.Tooltip.Distrust=Przypisz tej osobie nagatywny poziom zaufania
+View.Trust.Tooltip.Untrust=Cofnij swoje zaufanie dla tej osoby
+
+View.CreateAlbum.Title=Utwórz Album
+View.CreateAlbum.Label.Name=Nazwa:
+View.CreateAlbum.Label.Description=Opis:
+
+View.UploadImage.Title=Załaduj Obraz
+View.UploadImage.Label.Title=Tytuł:
+View.UploadImage.Label.Description=Opis:
+View.UploadImage.Button.UploadImage=Załaduj Obraz 
+
+View.Time.InTheFuture=potem
+View.Time.AFewSecondsAgo=kilka sekund temu
+View.Time.HalfAMinuteAgo=około pół godziny temu
+View.Time.AMinuteAgo=około minutę temu
+View.Time.XMinutesAgo=${min}minut temu
+View.Time.HalfAnHourAgo=pół godziny temu
+View.Time.AnHourAgo=około godzinę temu
+View.Time.XHoursAgo=${hour} godzin temu
+View.Time.ADayAgo=około godzinę
+View.Time.XDaysAgo=${day} dni temu
+View.Time.AWeekAgo=około tydzień temu
+View.Time.XWeeksAgo=${week} tygodni temu
+View.Time.AMonthAgo=około miesiąc temu
+View.Time.XMonthsAgo=${month} miesięcy
+View.Time.AYearAgo=około rok temu
+View.Time.XYearsAgo=${year} lat temu
+
+WebInterface.DefaultText.StatusUpdate=O czym teraz myślisz?
+WebInterface.DefaultText.Message=Napisz Wiadomość…
+WebInterface.DefaultText.Reply=Napisz Odpowiedź…
+WebInterface.DefaultText.FirstName=Imię
+WebInterface.DefaultText.MiddleName=Drugie imię 
+WebInterface.DefaultText.LastName=Nazwisko
+WebInterface.DefaultText.BirthDay=Dzień
+WebInterface.DefaultText.BirthMonth=Miesiąc
+WebInterface.DefaultText.BirthYear=Rok
+WebInterface.DefaultText.FieldName=Nazwa Pola
+WebInterface.DefaultText.Option.InsertionDelay=Czas potrzebny na załadowanie Sone po modyfikacji (w sekundach) 
+WebInterface.DefaultText.Search=Czego szukasz?
+WebInterface.DefaultText.CreateAlbum.Name=Tytuł Albumu
+WebInterface.DefaultText.CreateAlbum.Description=Opis Albumu
+WebInterface.DefaultText.EditAlbum.Title=Tytuł Albumu
+WebInterface.DefaultText.EditAlbum.Description=Opis Albumu
+WebInterface.DefaultText.UploadImage.Title=Tytuł Obrazka
+WebInterface.DefaultText.UploadImage.Description=Opis obrazka
+WebInterface.DefaultText.EditImage.Title=Tytuł Obrazka
+WebInterface.DefaultText.EditImage.Description=Opis Obrazka
+WebInterface.DefaultText.Option.PostsPerPage=Ilość postów wyświetlanych na jednej stronie
+WebInterface.DefaultText.Option.CharactersPerPost=Ilość znaków, które ma zawierać post, aby zostać skrócony 
+WebInterface.DefaultText.Option.PostCutOffLength=Ilość znaków w skróconym poście
+WebInterface.DefaultText.Option.PositiveTrust=Pozytywny poziom zaufania 
+WebInterface.DefaultText.Option.NegativeTrust=Negatywny poziom zaufania
+WebInterface.DefaultText.Option.TrustComment=Komentarz, który zostanie ustawiony w Sieci Zaufania
+WebInterface.Button.Comment=Komentuj
+WebInterface.Confirmation.DeletePostButton=Tak, usuń!
+WebInterface.Confirmation.DeleteReplyButton=Tak, usuń!
+WebInterface.SelectBox.Choose=Wybierz…
+WebInterface.SelectBox.Yes=Tak
+WebInterface.SelectBox.No=Nie
+WebInterface.ClickToShow.Replies=Kliknij, żeby pokazać ukryte odpowiedzi. 
+WebInterface.VersionInformation.CurrentVersion=Aktualna wersja:
+WebInterface.VersionInformation.LatestVersion=Najnowsza wersja:
+
+Notification.ClickHereToRead=Kliknij tutaj, żeby przeczytać cały tekst powiadomienia.
+Notification.FirstStart.Text=Po raz pierwszy korzystasz z Sone. Zacznij od wybrania nowego Sone z tożsamości z Sieci Zaufania i zacznij śledzić inne Sone.  
+Notification.Startup.Text=Sone właśnie się włącza. Należy chwilę poczekać zanim wszystkie tożsamości i Sone z sieci zaufania zostaną odzyskane. Jeśli brakuje jakichś elementów, należy być cierpliwym, najprawdopodobniej wkrótce się pojawią. 
+Notification.ConfigNotRead.Text=Plik konfiguracyjny “sone.properties” nie mógł zostać odczytany, prawdopodobnie dlatego, że nie został poprawnie zapisany. Dotyczy to wersji wcześniejszych niż Sone 0.3.3 i nie można nic z tym zrobić. 
+Notification.Button.Dismiss=Odrzuć
+Notification.NewSone.ShortText=Znaleziono nowe Sone:
+Notification.NewSone.Text=Znaleziono nowe Sone:
+Notification.NewPost.ShortText=Znaleziono nowe posty.
+Notification.NewPost.Text=Znaleziono nowe posty napisane przez poniższych użytkowników Sone:
+Notification.NewPost.Button.MarkRead=Oznacz jako przeczytane
+Notification.NewReply.ShortText=Znaleziono nowe odpowiedzi.
+Notification.NewReply.Text=Znaleziono nowe odpowiedzi napisane przez poniższych użytkowników Sone:
+Notification.SoneIsBeingRescued.Text=Następujące Sone są aktualnie odzyskiwane: 
+Notification.SoneRescued.Text=Odzyskano następujące Sone:
+Notification.SoneRescued.Text.RememberToUnlock=Należy pamiętać o zarządzaniu napisanymi postami i odpowiedziami oraz  nie zapomnieć o odblokowaniu swoich Sone!
+Notification.LockedSones.Text=Następujące Sone są zablokowane od ponad 5 minut. Sprawdź czy chcesz, żeby pozostały zablokowane. 
+Notification.NewVersion.Text=Znaleziono wersję {version}wtyczki Sone. Ściągnij ją z  USK@nwa8lHa271k2QvJ8aa0Ov7IHAV-DFOCFgmDt3X6BpCI,DuQSUZiI~agF8c-6tjsFFGuZ8eICrzWCILB60nT8KKo,AQACAAE/sone/{edition}!
+Notification.InsertingImages.Text=Ładowane są następujące obrazy:
+Notification.InsertedImages.Text=Załadowano nastepujące obrazy:
+Notification.ImageInsertFailed.Text=Nie można załadowac następujących obrazów:
+Notification.Mention.ShortText=Zostałeś oznaczony.
+Notification.Mention.Text=Zostałeś oznaczony w następujących postach:
+Notification.SoneInsert.Duration={0,number} {0,choice,0#seconds|1#second|1<seconds}
index 7754528..1767090 100644 (file)
@@ -800,6 +800,10 @@ textarea {
        float: right;
 }
 
+#sone .clear {
+       clear: both;
+}
+
 #sone h1 {
        font-family: inherit;
        font-size: 200%;
index d9c2fb3..49f372f 100644 (file)
@@ -1193,7 +1193,7 @@ function checkForRemovedReplies(oldNotification, newNotification) {
 }
 
 function getStatus() {
-       ajaxGet("getStatus.ajax", isViewSonePage() ? {"soneIds": getShownSoneId() } : {"loadAllSones": isKnownSonesPage()}, function(data, textStatus) {
+       ajaxGet("getStatus.ajax", isViewSonePage() ? {"soneIds": getShownSoneId() } : isKnownSonesPage() ? {"soneIds": getShownSoneIds() } : {}, function(data, textStatus) {
                if ((data != null) && data.success) {
                        /* process Sone information. */
                        $.each(data.sones, function(index, value) {
@@ -1206,15 +1206,15 @@ function getStatus() {
                        if (data.notificationHash != getNotificationHash()) {
                                console.log("Old hash: ", getNotificationHash(), ", new hash: ", data.notificationHash);
                                requestNotifications();
+                               /* process new posts. */
+                               $.each(data.newPosts, function(index, value) {
+                                       loadNewPost(value.id, value.sone, value.recipient, value.time);
+                               });
+                               /* process new replies. */
+                               $.each(data.newReplies, function(index, value) {
+                                       loadNewReply(value.id, value.sone, value.post, value.postSone);
+                               });
                        }
-                       /* process new posts. */
-                       $.each(data.newPosts, function(index, value) {
-                               loadNewPost(value.id, value.sone, value.recipient, value.time);
-                       });
-                       /* process new replies. */
-                       $.each(data.newReplies, function(index, value) {
-                               loadNewReply(value.id, value.sone, value.post, value.postSone);
-                       });
                        /* do it again in 5 seconds. */
                        setTimeout(getStatus, 5000);
                } else {
@@ -1359,6 +1359,20 @@ function getShownSoneId() {
 }
 
 /**
+ * Returns the ID of all currently visible Sones. This is mainly used on the
+ * “Known Sones” page.
+ *
+ * @returns The ID of the currently shown Sones
+ */
+function getShownSoneIds() {
+       var soneIds = new Array();
+       $("#sone #known-sones .sone .id").each(function() {
+               soneIds.push($(this).text());
+       });
+       return soneIds.join(",");
+}
+
+/**
  * Returns whether the current page is a “view post” page.
  *
  * @returns {Boolean} <code>true</code> if the current page is a “view post”
@@ -1865,6 +1879,14 @@ var currentSoneMenuTimeoutHandler;
 
 $(document).ready(function() {
 
+       /* rip out the status update textarea. */
+       $("#sone .rip-out").each(function() {
+               var oldElement = $(this);
+               newElement = $("<input type='text'/>");
+               newElement.attr("class", oldElement.attr("class")).attr("name", oldElement.attr("name"));
+               oldElement.before(newElement).remove();
+       });
+
        /* this initializes the status update input field. */
        getTranslation("WebInterface.DefaultText.StatusUpdate", function(defaultText) {
                registerInputTextareaSwap("#sone #update-status .status-input", defaultText, "text", false, false);
@@ -1949,7 +1971,7 @@ $(document).ready(function() {
                                allReplies = $(this).find(".reply");
                                if (allReplies.length > 2) {
                                        newHidden = false;
-                                       for (replyIndex = 0; !newHidden && (replyIndex < (allReplies.length - 2)); ++replyIndex) {
+                                       for (replyIndex = 0; replyIndex < (allReplies.length - 2); ++replyIndex) {
                                                $(allReplies[replyIndex]).addClass("hidden");
                                                newHidden |= $(allReplies[replyIndex]).hasClass("new");
                                        }
index 7648c43..74ea9f0 100644 (file)
@@ -2,16 +2,16 @@
 
        <h1><%= Page.About.Page.Title|l10n|html></h1>
 
-       <p>Sone – The Freenet Social Network Plugin, Version <% version|html>, © 2010–2011 by David ‘Bombe’ Roden.</p>
+       <p>Sone – The Freenet Social Network Plugin, Version <% version|html>, © 2010–2012 by David ‘Bombe’ Roden.</p>
 
        <p>
-               <%= Page.About.Flattr.Description|l10n|html|replace needle="{link}" replacement='<a href="/?_CHECKED_HTTP_=https://www.flattr.com/" title="Flattr Homepage" target="_blank">'|replace needle="{/link}" replacement='</a>'>
+               <%= Page.About.Flattr.Description|l10n|html|replace needle=="{link}" replacement=='<a href="/?_CHECKED_HTTP_=https://www.flattr.com/" title="Flattr Homepage" target="_blank">'|replace needle=="{/link}" replacement=='</a>'>
        </p>
 
        <h2><%= Page.About.Homepage.Title|l10n|html></h2>
 
        <p>
-               <%= Page.About.Homepage.Description|l10n|html|replace needle="{link}" replacement='<a href="/USK@nwa8lHa271k2QvJ8aa0Ov7IHAV-DFOCFgmDt3X6BpCI,DuQSUZiI~agF8c-6tjsFFGuZ8eICrzWCILB60nT8KKo,AQACAAE/sone/49/">'|replace needle="{/link}" replacement='</a>'>
+               <%= Page.About.Homepage.Description|l10n|html|replace needle=="{link}" replacement=='<a href="/USK@nwa8lHa271k2QvJ8aa0Ov7IHAV-DFOCFgmDt3X6BpCI,DuQSUZiI~agF8c-6tjsFFGuZ8eICrzWCILB60nT8KKo,AQACAAE/sone/49/">'|replace needle=="{/link}" replacement=='</a>'>
        </p>
 
        <h2><%= Page.About.License.Title|l10n|html></h2>
index cf4e7ce..ef2cf68 100644 (file)
@@ -5,14 +5,13 @@
        <h1><%= Page.Bookmarks.Page.Title|l10n|html></h1>
 
        <div id="posts">
-               <%= page|store key=pageParameter>
-               <%include include/pagination.html>
+               <%include include/pagination.html pageParameter==page>
                <%foreach posts post>
                        <%include include/viewPost.html>
                <%/foreach>
-               <%include include/pagination.html>
+               <%include include/pagination.html pageParameter==page>
                <%if postsNotLoaded>
-                       <p><%= Page.Bookmarks.Text.PostsNotLoaded|l10n|html|replace needle='{link}' replacement='<a href="unbookmark.html?post=allNotLoaded">'|replace needle='{/link}' replacement='</a>'></p>
+                       <p><%= Page.Bookmarks.Text.PostsNotLoaded|l10n|html|replace needle=='{link}' replacement=='<a href="unbookmark.html?post=allNotLoaded">'|replace needle=='{/link}' replacement=='</a>'></p>
                <%elseif posts.empty>
                        <p><%= Page.Bookmarks.Text.NoBookmarks|l10n|html></p>
                <%/if>
index cb27c19..ea583fc 100644 (file)
@@ -2,7 +2,7 @@
 
        <h1><%= Page.DeleteAlbum.Page.Title|l10n|html></h1>
 
-       <p><%= Page.DeleteAlbum.Text.AlbumWillBeGone|l10n|replace needle="{title}" replacementKey=album.title|html></p>
+       <p><%= Page.DeleteAlbum.Text.AlbumWillBeGone|l10n|replace needle=="{title}" replacementKey==album.title|html></p>
 
        <form method="post">
                <input type="hidden" name="formPassword" value="<% formPassword|html>" />
index 68b403e..3fb89e3 100644 (file)
@@ -2,7 +2,7 @@
 
        <h1><%= Page.DeleteImage.Page.Title|l10n|html></h1>
 
-       <p><%= Page.DeleteImage.Text.ImageWillBeGone|l10n|replace needle="{image}" replacementKey=image.title|replace needle="{album}" replacementKey=image.album.title|html></p>
+       <p><%= Page.DeleteImage.Text.ImageWillBeGone|l10n|replace needle=="{image}" replacement=image.title|replace needle=="{album}" replacement=image.album.title|html></p>
 
        <form method="post">
                <input type="hidden" name="formPassword" value="<% formPassword|html>" />
index cc6023f..c84aeb0 100644 (file)
@@ -1,6 +1,6 @@
 <%include include/head.html>
 
-       <h1><%= Page.DeleteSone.Page.Title|l10n|replace needle="{sone}" replacementKey=currentSone.name|html></h1>
+       <h1><%= Page.DeleteSone.Page.Title|l10n|replace needle=="{sone}" replacement=currentSone.name|html></h1>
 
        <p><%= Page.DeleteSone.Page.Description|l10n|html></p>
 
index e140ac4..1f03bce 100644 (file)
                        <%foreach currentSone.allImages image>
                                <li>
                                        <input type="radio" name="avatar-id" value="<%image.id|html>"<%if avatar-id|match key=image.id> checked="checked"<%/if>/>
-                                       <div class="post-avatar"><% image|image-link max-width=48 max-height=48 mode=enlarge title==image.title></div>
+                                       <div class="post-avatar"><% image|image-link max-width==48 max-height==48 mode==enlarge title=image.title></div>
                                </li>
                        <%/foreach>
                </ul>
                <h2><%= Page.EditProfile.Fields.AddField.Title|l10n|html></h2>
 
                <%if duplicateFieldName>
-                       <p><%= Page.EditProfile.Error.DuplicateFieldName|l10n|replace needle="{fieldName}" replacementKey="fieldName"|html></p>
+                       <p><%= Page.EditProfile.Error.DuplicateFieldName|l10n|replace needle=="{fieldName}" replacement=fieldName|html></p>
                <%/if>
 
                <div id="new-field">
index 55705e1..a88c48f 100644 (file)
                                </script>
                        <%/if>
 
-                       <h1 class="backlink"><%= Page.ImageBrowser.Album.Title|l10n|replace needle='{album}' replacementKey=album.title|html></h1>
+                       <h1 class="backlink"><%= Page.ImageBrowser.Album.Title|l10n|replace needle=='{album}' replacement=album.title|html></h1>
 
                        <div class="backlinks">
                                <div class="backlink"><a href="imageBrowser.html?mode=gallery"><%= Page.ImageBrowser.Link.All|l10n|html></a></div>
                                                                <select name="album-image">
                                                                        <option disabled="disabled"><%= Page.ImageBrowser.Album.AlbumImage.Choose|l10n|html></option>
                                                                        <%foreach album.images image>
-                                                                               <option value="<% image.id|html>"<%if album.albumImage.id|match key=image.id> selected="selected"<%/if>><% image.title|html></option>
+                                                                               <option value="<% image.id|html>"<%if album.albumImage.id|match value=image.id> selected="selected"<%/if>><% image.title|html></option>
                                                                        <%/foreach>
                                                                </select>
                                                        </div>
                                </div>
                        <%/if>
 
-                       <%foreach album.images image>
-                               <%first><h2><%= Page.ImageBrowser.Header.Images|l10n|html></h2><%/first>
-                               <%if loop.count|mod divisor=3><div class="image-row"><%/if>
+                       <%foreach album.images image|paginate pageSize=core.preferences.imagesPerPage page=request.page>
+                               <%first>
+                                       <h2><%= Page.ImageBrowser.Header.Images|l10n|html></h2>
+                                       <%include include/pagination.html pageParameter=="page">
+                               <%/first>
+                               <%if loop.count|mod divisor==3><div class="image-row"><%/if>
                                <div id="image-<% image.id|html>" class="image">
                                        <div class="image-id hidden"><% image.id|html></div>
                                        <div class="image-container">
-                                               <a href="imageBrowser.html?image=<%image.id|html>"><% image|image-link max-width=250 max-height=250 mode=enlarge title==image.title></a>
+                                               <a href="imageBrowser.html?image=<%image.id|html>"><% image|image-link max-width==250 max-height==250 mode==enlarge title=image.title></a>
                                        </div>
                                        <div class="show-data">
                                                <div class="image-title"><% image.title|html></div>
                                                </form>
                                        <%/if>
                                </div>
-                               <%= false|store key=endRow>
-                               <%if loop.count|mod divisor=3 offset=1><%= true|store key=endRow><%/if>
-                               <%last><%= true|store key=endRow><%/last>
-                               <%if endRow></div><%/if>
+                               <%= false|store key==endRow>
+                               <%if loop.count|mod divisor==3 offset==1><%= true|store key==endRow><%/if>
+                               <%last><%= true|store key==endRow><%/last>
+                               <%if endRow>
+                                       </div>
+                                       <%include include/pagination.html pageParameter=="page">
+                               <%/if>
                        <%/foreach>
 
                        <%if album.sone.local>
-                               <div class="show-upload-image hidden toggle-link"><a class="small-link">» <%= View.UploadImage.Title|l10n|html></a></div>
-                               <div class="hide-upload-image hidden toggle-link"><a class="small-link">« <%= View.UploadImage.Title|l10n|html></a></div>
+                               <div class="clear show-upload-image hidden toggle-link"><a class="small-link">» <%= View.UploadImage.Title|l10n|html></a></div>
+                               <div class="clear hide-upload-image hidden toggle-link"><a class="small-link">« <%= View.UploadImage.Title|l10n|html></a></div>
                                <div class="upload-image">
                                        <%include include/uploadImage.html>
                                </div>
 
                        <div class="single-image">
                                <%ifnull !image.key>
-                                       <a href="/<%image.key|html>"><% image|image-link max-width=640 max-height=480></a>
+                                       <a href="/<%image.key|html>"><% image|image-link max-width==640 max-height==480></a>
                                <%else>
-                                       <a href="imageBrowser.html?image=<%image.id|html>"><% image|image-link max-width=640 max-height=480></a>
+                                       <a href="imageBrowser.html?image=<%image.id|html>"><% image|image-link max-width==640 max-height==480></a>
                                <%/if>
                        </div>
 
 
                <%else>
 
-                       <h1><%= Page.ImageBrowser.Sone.Title|l10n|replace needle='{sone}' replacementKey=sone.niceName|html></h1>
+                       <h1><%= Page.ImageBrowser.Sone.Title|l10n|replace needle=='{sone}' replacement=sone.niceName|html></h1>
 
                        <div class="backlinks">
                                <div class="backlink"><a href="imageBrowser.html?mode=gallery"><%= Page.ImageBrowser.Link.All|l10n|html></a></div>
 
        <%elseif galleryRequested>
 
-               <%foreach albums album>
-                       <%first><h2><%= Page.ImageBrowser.Header.Albums|l10n|html></h2><%/first>
-                       <%if loop.count|mod divisor=3><div class="album-row"><%/if>
+               <%foreach albums album|paginate pageSize=core.preferences.imagesPerPage pageParameter=request.page pagination=albumPagination>
+                       <%first>
+                               <h2><%= Page.ImageBrowser.Header.Albums|l10n|html></h2>
+                               <%include include/pagination.html pagination=albumPagination pageParameter=="page">
+                       <%/first>
+                       <%if loop.count|mod divisor==3><div class="album-row"><%/if>
                        <div id="album-<% album.id|html>" class="album">
                                <div class="album-id hidden"><% album.id|html></div>
                                <div class="album-container">
                                                <%ifnull album.albumImage>
                                                        <img src="images/unknown-image-0.png" width="333" height="250" alt="<% album.title|html> (<%album.sone.niceName|html>)" title="<% album.title|html> (<%album.sone.niceName|html>)" style="position: relative; top: 0px; left: -41px;" />
                                                <%else><!-- TODO -->
-                                                       <% album.albumImage|image-link max-width=250 max-height=250 mode=enlarge title==album.title>
+                                                       <% album.albumImage|image-link max-width==250 max-height==250 mode==enlarge title=album.title>
                                                <%/if>
                                        </a>
                                </div>
                                        <div class="album-description"><% album.description|parse sone=album.sone></div>
                                </div>
                        </div>
-                       <%= false|store key=endRow>
-                       <%if loop.count|mod divisor=3 offset=1><%= true|store key=endRow><%/if>
-                       <%last><%= true|store key=endRow><%/last>
-                       <%if endRow></div><%/if>
+                       <%= false|store key==endRow>
+                       <%if loop.count|mod divisor==3 offset==1><%= true|store key==endRow><%/if>
+                       <%last><%= true|store key==endRow><%/last>
+                       <%if endRow>
+                               </div>
+                       <%/if>
+                       <%last>
+                               <%include include/pagination.html pagination=albumPagination pageParameter=="page">
+                       <%/last>
                <%/foreach>
 
        <%/if>
index cb9abba..9aacad3 100644 (file)
@@ -1,6 +1,6 @@
 <%foreach albums album>
        <%first><h2><%= Page.ImageBrowser.Header.Albums|l10n|html></h2><%/first>
-       <%if loop.count|mod divisor=3><div class="album-row"><%/if>
+       <%if loop.count|mod divisor==3><div class="album-row"><%/if>
        <div id="album-<% album.id|html>" class="album">
                <div class="album-id hidden"><% album.id|html></div>
                <div class="album-container">
@@ -8,7 +8,7 @@
                                <%ifnull album.albumImage>
                                        <img src="images/unknown-image-0.png" width="333" height="250" alt="<% album.title|html>" title="<% album.title|html>" style="position: relative; top: 0px; left: -41px;" />
                                <%else><!-- TODO -->
-                                       <% album.albumImage|image-link max-width=250 max-height=250 mode=enlarge title==album.title>
+                                       <% album.albumImage|image-link max-width==250 max-height==250 mode==enlarge title=album.title>
                                <%/if>
                        </a>
                </div>
@@ -43,8 +43,8 @@
                        </form>
                <%/if>
        </div>
-       <%= false|store key=endRow>
-       <%if loop.count|mod divisor=3 offset=1><%= true|store key=endRow><%/if>
-       <%last><%= true|store key=endRow><%/last>
+       <%= false|store key==endRow>
+       <%if loop.count|mod divisor==3 offset==1><%= true|store key==endRow><%/if>
+       <%last><%= true|store key==endRow><%/last>
        <%if endRow></div><%/if>
 <%/foreach>
index c0df5c0..86543cc 100644 (file)
@@ -1,7 +1,7 @@
 <%if !identitiesWithoutSone.empty>
        <h1><%= Page.Login.CreateSone.Title|l10n|html></h1>
 
-       <p><%= View.CreateSone.Text.WotIdentityRequired|l10n|html|replace needle="{link}" replacement='<a href="/WebOfTrust/">'|replace needle="{/link}" replacement='</a>'></p>
+       <p><%= View.CreateSone.Text.WotIdentityRequired|l10n|html|replace needle=="{link}" replacement=='<a href="/WebOfTrust/">'|replace needle=="{/link}" replacement=='</a>'></p>
 
        <form id="create-sone" action="createSone.html" method="post">
                <input type="hidden" name="formPassword" value="<% formPassword|html>" />
@@ -23,8 +23,8 @@
        </form>
 <%else>
        <%if !sones.empty>
-               <p><%= View.CreateSone.Text.NoNonSoneIdentities|l10n|html|replace needle="{link}" replacement='<a href="/WebOfTrust/OwnIdentities">'|replace needle="{/link}" replacement="</a>"></p>
+               <p><%= View.CreateSone.Text.NoNonSoneIdentities|l10n|html|replace needle=="{link}" replacement=='<a href="/WebOfTrust/OwnIdentities">'|replace needle=="{/link}" replacement=="</a>"></p>
        <%else>
-               <p><%= View.CreateSone.Text.NoIdentities|l10n|html|replace needle="{link}" replacement='<a href="/WebOfTrust/OwnIdentities">'|replace needle="{/link}" replacement="</a>"></p>
+               <p><%= View.CreateSone.Text.NoIdentities|l10n|html|replace needle=="{link}" replacement=='<a href="/WebOfTrust/OwnIdentities">'|replace needle=="{/link}" replacement=="</a>"></p>
        <%/if>
 <%/if>
index 9988e68..13b564d 100644 (file)
@@ -44,7 +44,7 @@
                                <a class="picture" href="index.html">
                                        <%ifnull !currentSone>
                                                <%ifnull !currentSone.profile.avatar>
-                                                       <%currentSone.profile.avatar|image-link max-width=80 max-height=80 mode=enlarge title="Profile Avatar">
+                                                       <%currentSone.profile.avatar|image-link max-width==80 max-height==80 mode==enlarge title=="Profile Avatar">
                                                <%else>
                                                        <img src="/WebOfTrust/GetIdenticon?identity=<% currentSone.id|html>&amp;width=80&amp;height=80" width="80" height="80" alt="Profile Avatar" />
                                                <%/if>
@@ -55,8 +55,7 @@
                        </div>
                        <%ifnull ! currentSone>
                                <div id="home-sone">
-                                       <% currentSone|store key=sone>
-                                       <%include include/viewSone.html>
+                                       <%include include/viewSone.html sone=currentSone>
                                </div>
                        <%/if>
                        <form id="search" action="search.html" method="get">
index f8e6f11..80248d4 100644 (file)
@@ -1,10 +1,10 @@
 <%if pagination.necessary>
        <div class="navigation <%paginationName|html>">
-               <div class="first"><%if ! pagination.first><a href="<% request|change nameKey=pageParameter value=0>">«</a><%else><span>«</span><%/if></div>
-               <div class="previous"><%if ! pagination.first><a href="<% request|change nameKey=pageParameter key=pagination.previousPage>">‹</a><%else><span>‹</span><%/if></div>
+               <div class="first"><%if ! pagination.first><a href="<% request|change name=pageParameter value==0>">«</a><%else><span>«</span><%/if></div>
+               <div class="previous"><%if ! pagination.first><a href="<% request|change name=pageParameter value=pagination.previousPage>">‹</a><%else><span>‹</span><%/if></div>
                <div class="current-page"><% pagination.pageNumber></div>
                <div class="total-pages"><% pagination.pageCount></div>
-               <div class="last"><%if ! pagination.last><a href="<% request|change nameKey=pageParameter key=pagination.lastPage>">»</a><%else><span>»</span><%/if></div>
-               <div class="next"><%if ! pagination.last><a href="<% request|change nameKey=pageParameter key=pagination.nextPage>">›</a><%else><span>›</span><%/if></div>
+               <div class="last"><%if ! pagination.last><a href="<% request|change name=pageParameter value=pagination.lastPage>">»</a><%else><span>»</span><%/if></div>
+               <div class="next"><%if ! pagination.last><a href="<% request|change name=pageParameter value=pagination.nextPage>">›</a><%else><span>›</span><%/if></div>
        </div>
 <%/if>
index 9fa982f..f599eb4 100644 (file)
@@ -2,7 +2,7 @@
        <div class="sone-menu-id hidden"><%sone.id|html></div>
        <div class="avatar menu-avatar">
                <%ifnull !sone.profile.avatar>
-                       <%sone.profile.avatar|image-link max-width=64 max-height=64 mode=enlarge title==sone.niceName>
+                       <%sone.profile.avatar|image-link max-width==64 max-height==64 mode==enlarge title=sone.niceName>
                <%else>
                        <img src="/WebOfTrust/GetIdenticon?identity=<%sone.id|html>&amp;width=64&amp;height=64" width="64" height="64" alt="Avatar Image" />
                <%/if>
@@ -10,7 +10,7 @@
        <div class="inner-menu">
                <div>
                        <a class="author" href="viewSone.html?sone=<%sone.id|html>"><%sone.niceName|html></a>
-                       (<%= View.Sone.Stats.Posts|l10n 0=sone.posts.size>, <%= View.Sone.Stats.Replies|l10n 0=sone.replies.size><%if ! sone.allImages.size|match value=0>, <%= View.Sone.Stats.Images|l10n 0=sone.allImages.size><%/if>)
+                       (<%= View.Sone.Stats.Posts|l10n 0=sone.posts.size>, <%= View.Sone.Stats.Replies|l10n 0=sone.replies.size><%if ! sone.allImages.size|match value==0>, <%= View.Sone.Stats.Images|l10n 0=sone.allImages.size><%/if>)
                </div>
                <div><a href="/WebOfTrust/ShowIdentity?id=<%sone.id|html>">» <% =View.Post.WebOfTrustLink|l10n|html></a></div>
                <%foreach sone.albums album>
index 881aca4..dde0486 100644 (file)
@@ -10,6 +10,6 @@
                </select>
        </div>
        <div class="select-sender"><button type="button" title="<%= View.UpdateStatus.Text.ChooseSenderIdentity|l10n|html>">+</button></div><label for="text"><%= Page.Index.Label.Text|l10n|html></label>
-       <input type="text" class="status-input" name="text" value="" />
+       <textarea class="rip-out status-input" name="text"></textarea>
        <button type="submit"><%= Page.Index.Button.Post|l10n|html></button>
 </form>
index 396fa6e..6a599e1 100644 (file)
@@ -7,7 +7,7 @@
        <div class="avatar post-avatar" >
                <%if post.loaded>
                        <%ifnull !post.sone.profile.avatar>
-                               <%post.sone.profile.avatar|image-link max-width=48 max-height=48 mode=enlarge title="Avatar Image">
+                               <%post.sone.profile.avatar|image-link max-width==48 max-height==48 mode==enlarge title=="Avatar Image">
                        <%else>
                                <img src="/WebOfTrust/GetIdenticon?identity=<% post.sone.id|html>&amp;width=48&height=48" width="48" height="48" alt="Avatar Image" />
                        <%/if>
                                        <div class="recipient profile-link"><a href="viewSone.html?sone=<% post.recipient.id|html>"><% post.recipient.niceName|html></a></div>
                                <%/if>
                        <%/if>
-                       <% post.text|html|store key=originalText text=true>
-                       <% post.text|parse sone=post.sone|store key=parsedText text=true>
-                       <% post.text|parse sone=post.sone length=core.preferences.charactersPerPost cut-off-length=core.preferences.postCutOffLength|store key=shortText text=true>
+                       <% post.text|html|store key==originalText text==true>
+                       <% post.text|parse sone=post.sone|store key==parsedText text==true>
+                       <% post.text|parse sone=post.sone length=core.preferences.charactersPerPost cut-off-length=core.preferences.postCutOffLength|store key==shortText text==true>
                        <div class="post-text raw-text<%if !raw> hidden<%/if>"><% originalText></div>
                        <div class="post-text text<%if raw> hidden<%/if><%if !shortText|match key=parsedText> hidden<%/if>"><% parsedText></div>
                        <div class="post-text short-text<%if raw> hidden<%/if><%if shortText|match key=parsedText> hidden<%/if>"><% shortText></div>
-                       <%if !shortText|match key=parsedText><%if !raw><a class="expand-post-text" href="viewPost.html?post=<% post.id|html>&amp;raw=true"><%= View.Post.ShowMore|l10n|html></a><%/if><%/if>
-                       <%if !shortText|match key=parsedText><%if !raw><a class="shrink-post-text hidden"><%= View.Post.ShowLess|l10n|html></a><%/if><%/if>
+                       <%if !shortText|match value=parsedText><%if !raw><a class="expand-post-text" href="viewPost.html?post=<% post.id|html>&amp;raw=true"><%= View.Post.ShowMore|l10n|html></a><%/if><%/if>
+                       <%if !shortText|match value=parsedText><%if !raw><a class="shrink-post-text hidden"><%= View.Post.ShowLess|l10n|html></a><%/if><%/if>
                </div>
                <div class="post-status-line status-line<%if !post.loaded> hidden<%/if>">
                        <div class="bookmarks">
                                </form>
                        </div>
                        <span class='separator'>·</span>
-                       <div class="time"><a href="viewPost.html?post=<% post.id|html>"><% post.time|date format="MMM d, yyyy, HH:mm:ss"></a></div>
+                       <div class="time"><a href="viewPost.html?post=<% post.id|html>"><% post.time|date format=="MMM d, yyyy, HH:mm:ss"></a></div>
                        <span class='separator'>·</span>
                        <div class="permalink permalink-post"><a href="post://<%post.id|html>">[<%= View.Post.Permalink|l10n|html>]</a></div>
                        <span class='separator'>·</span>
                        <div class="permalink permalink-author"><a href="sone://<%post.sone.id|html>">[<%= View.Post.PermalinkAuthor|l10n|html>]</a></div>
-                       <%if ! originalText|match key=parsedText>
+                       <%if ! originalText|match value=parsedText>
                                <span class='separator'>·</span>
                                <div class="show-source"><a href="viewPost.html?post=<% post.id|html>&amp;raw=<%if raw>false<%else>true<%/if>"><%= View.Post.ShowSource|l10n|html></a></div>
                        <%/if>
-                       <div class="likes<%if post.likes.size|match value=0> hidden<%/if>">
+                       <div class="likes<%if post.likes.size|match value==0> hidden<%/if>">
                                <span class='separator'>·</span>
                                <span title="<% post.likes.soneNames|html>">↑<span class="like-count"><% post.likes.size></span></span>
                        </div>
                                                        </select>
                                                </div>
                                                <div class="select-sender"><button type="button" title="<%= View.UpdateStatus.Text.ChooseSenderIdentity|l10n|html>">+</button></div>
-                                               <input type="text" class="reply-input" name="text" value="" />
+                                               <textarea class="rip-out reply-input" name="text"></textarea>
                                                <button type="submit"><%= View.Post.SendReply|l10n|html></button>
                                        </form>
                                </div>
index ca07cf7..2962dd9 100644 (file)
@@ -6,7 +6,7 @@
        <%include include/soneMenu.html class=="sone-reply-menu" sone=reply.sone>
        <div class="avatar reply-avatar">
                <%ifnull !reply.sone.profile.avatar>
-                       <% reply.sone.profile.avatar|image-link max-width=36 max-height=36 mode=enlarge title="Avatar Image">
+                       <% reply.sone.profile.avatar|image-link max-width==36 max-height==36 mode==enlarge title=="Avatar Image">
                <%else>
                        <img src="/WebOfTrust/GetIdenticon?identity=<% reply.sone.id|html>&amp;width=36&height=36" width="36" height="36" alt="Avatar Image" />
                <%/if>
        <div class="inner-part">
                <div>
                        <div class="author profile-link"><a href="viewSone.html?sone=<% reply.sone.id|html>"><% reply.sone.niceName|html></a></div>
-                       <% reply.text|html|store key=originalText text=true>
-                       <% reply.text|parse sone=reply.sone|store key=parsedText text=true>
-                       <% reply.text|parse sone=reply.sone length=core.preferences.charactersPerPost cut-off-length=core.preferences.postCutOffLength|store key=shortText text=true>
+                       <% reply.text|html|store key==originalText text==true>
+                       <% reply.text|parse sone=reply.sone|store key==parsedText text==true>
+                       <% reply.text|parse sone=reply.sone length=core.preferences.charactersPerPost cut-off-length=core.preferences.postCutOffLength|store key==shortText text==true>
                        <div class="reply-text raw-text<%if !raw> hidden<%/if>"><% originalText></div>
                        <div class="reply-text text<%if raw> hidden<%/if><%if !shortText|match key=parsedText> hidden<%/if>"><% parsedText></div>
                        <div class="reply-text short-text<%if raw> hidden<%/if><%if shortText|match key=parsedText> hidden<%/if>"><% shortText></div>
-                       <%if !shortText|match key=parsedText><%if !raw><a class="expand-reply-text" href="viewPost.html?post=<% reply.post.id|html>&amp;raw=true"><%= View.Post.ShowMore|l10n|html></a><%/if><%/if>
-                       <%if !shortText|match key=parsedText><%if !raw><a class="shrink-reply-text hidden"><%= View.Post.ShowLess|l10n|html></a><%/if><%/if>
+                       <%if !shortText|match value=parsedText><%if !raw><a class="expand-reply-text" href="viewPost.html?post=<% reply.post.id|html>&amp;raw=true"><%= View.Post.ShowMore|l10n|html></a><%/if><%/if>
+                       <%if !shortText|match value=parsedText><%if !raw><a class="shrink-reply-text hidden"><%= View.Post.ShowLess|l10n|html></a><%/if><%/if>
                </div>
                <div class="reply-status-line status-line">
-                       <div class="time"><% reply.time|date format="MMM d, yyyy, HH:mm:ss"></div>
+                       <div class="time"><% reply.time|date format=="MMM d, yyyy, HH:mm:ss"></div>
                        <span class='separator'>·</span>
                        <div class="permalink permalink-author"><a href="sone://<%reply.sone.id|html>">[<%= View.Post.PermalinkAuthor|l10n|html>]</a></div>
-                       <%if ! originalText|match key=parsedText>
+                       <%if ! originalText|match value=parsedText>
                                <span class='separator'>·</span>
                                <div class="show-reply-source"><a href="viewPost.html?post=<% post.id|html>&amp;raw=<%if raw>false<%else>true<%/if>"><%= View.Post.ShowSource|l10n|html></a></div>
                        <%/if>
-                       <div class="likes<%if reply.likes.size|match value=0> hidden<%/if>">
+                       <div class="likes<%if reply.likes.size|match value==0> hidden<%/if>">
                                <span class='separator'>·</span>
                                <span title="<% reply.likes.soneNames|html>">↑<span class="like-count"><% reply.likes.size></span></span>
                        </div>
index 59ba792..1ca0023 100644 (file)
@@ -5,12 +5,12 @@
        <div class="download-marker" title="<%= View.Sone.Status.Downloading|l10n|html>">⬊</div>
        <div class="insert-marker" title="<%= View.Sone.Status.Inserting|l10n|html>">⬈</div>
        <div class="idle-marker" title="<%= View.Sone.Status.Idle|l10n|html>">✔</div>
-       <div class="last-update"><%= View.Sone.Label.LastUpdate|l10n|html> <span class="time" title="<% sone.time|unknown|date format="MMM d, yyyy, HH:mm:ss">"><%sone.lastUpdatedText|html></span></div>
+       <div class="last-update"><%= View.Sone.Label.LastUpdate|l10n|html> <span class="time" title="<% sone.time|unknown|date format=="MMM d, yyyy, HH:mm:ss">"><%sone.lastUpdatedText|html></span></div>
        <div>
                <div class="profile-link"><a href="viewSone.html?sone=<% sone.id|html>" title="<% sone.requestUri|html>"><% sone.niceName|html></a></div>
-               <div class="sone-stats">(<%= View.Sone.Stats.Posts|l10n 0=sone.posts.size>, <%= View.Sone.Stats.Replies|l10n 0=sone.replies.size><%if ! sone.allImages.size|match value=0>, <%= View.Sone.Stats.Images|l10n 0=sone.allImages.size><%/if>)</div>
+               <div class="sone-stats">(<%= View.Sone.Stats.Posts|l10n 0=sone.posts.size>, <%= View.Sone.Stats.Replies|l10n 0=sone.replies.size><%if ! sone.allImages.size|match value==0>, <%= View.Sone.Stats.Images|l10n 0=sone.allImages.size><%/if>)</div>
        </div>
-       <div class="short-request-uri"><% sone.requestUri|substring start=4 length=43|html></div>
+       <div class="short-request-uri"><% sone.requestUri|substring start==4 length==43|html></div>
        <div class="hidden"><% sone.blacklisted></div>
        <%if sone.local>
                <form class="lock<%if sone.locked> hidden<%/if>" action="lockSone.html" method="post">
index f79e52d..482d4d1 100644 (file)
@@ -7,14 +7,13 @@
        <%include include/updateStatus.html>
 
        <div id="posts">
-               <%= page|store key=pageParameter>
-               <%include include/pagination.html paginationName==pagination-index>
+               <%include include/pagination.html pageParameter==page paginationName==pagination-index>
                <%foreach pagination.items post>
                        <%include include/viewPost.html>
                <%foreachelse>
                        <div><%= Page.Index.PostList.Text.NoPostYet|l10n|html></div>
                <%/foreach>
-               <%include include/pagination.html>
+               <%include include/pagination.html pageParameter==page>
        </div>
 
 <%include include/tail.html>
index ea97d00..3ac37cf 100644 (file)
@@ -3,13 +3,13 @@
        <h1><%= Page.Invalid.Page.Title|l10n|html></h1>
 
        <%foreach messages message>
-               <%if message|substring start=0 length=1|match value='!'>
-                       <p class="error"><% message|substring start=1|parse></p>
+               <%if message|substring start==0 length==1|match value=='!'>
+                       <p class="error"><% message|substring start==1|parse></p>
                <%else>
                        <p><% message|parse></p>
                <%/if>
        <%foreachelse>
-               <p><%= Page.Invalid.Text|l10n|html|replace needle="{link}" replacement='<a href="index.html">'|replace needle="{/link}" replacement='</a>'></p>
+               <p><%= Page.Invalid.Text|l10n|html|replace needle=="{link}" replacement=='<a href="index.html">'|replace needle=="{/link}" replacement=='</a>'></p>
        <%/foreach>
 
 <%include include/tail.html>
index afd40df..4ace659 100644 (file)
                        <div>
                                <%= Page.KnownSones.Label.Sort|l10n|html>
                                <select name="sort">
-                                       <option value="name"<%if sort|match value="name"> selected="selected"<%/if>><%= Page.KnownSones.Sort.Field.Name|l10n|html></option>
-                                       <option value="activity"<%if sort|match value="activity"> selected="selected"<%/if>><%= Page.KnownSones.Sort.Field.LastActivity|l10n|html></option>
-                                       <option value="posts"<%if sort|match value="posts"> selected="selected"<%/if>><%= Page.KnownSones.Sort.Field.Posts|l10n|html></option>
-                                       <option value="images"<%if sort|match value="images"> selected="selected"<%/if>><%= Page.KnownSones.Sort.Field.Images|l10n|html></option>
+                                       <option value="name"<%if sort|match value=="name"> selected="selected"<%/if>><%= Page.KnownSones.Sort.Field.Name|l10n|html></option>
+                                       <option value="activity"<%if sort|match value=="activity"> selected="selected"<%/if>><%= Page.KnownSones.Sort.Field.LastActivity|l10n|html></option>
+                                       <option value="posts"<%if sort|match value=="posts"> selected="selected"<%/if>><%= Page.KnownSones.Sort.Field.Posts|l10n|html></option>
+                                       <option value="images"<%if sort|match value=="images"> selected="selected"<%/if>><%= Page.KnownSones.Sort.Field.Images|l10n|html></option>
                                </select>
                                <select name="order">
-                                       <option value="asc"<%if order|match value="asc"> selected="selected"<%/if>><%= Page.KnownSones.Sort.Order.Ascending|l10n|html></option>
-                                       <option value="desc"<%if order|match value="desc"> selected="selected"<%/if>><%= Page.KnownSones.Sort.Order.Descending|l10n|html></option>
+                                       <option value="asc"<%if order|match value=="asc"> selected="selected"<%/if>><%= Page.KnownSones.Sort.Order.Ascending|l10n|html></option>
+                                       <option value="desc"<%if order|match value=="desc"> selected="selected"<%/if>><%= Page.KnownSones.Sort.Order.Descending|l10n|html></option>
                                </select>
                        </div>
                        <%ifnull !currentSone>
                                        <select name="filter">
                                                <option value="none"></option>
                                                <%ifnull !currentSone>
-                                                       <option value="followed"<%if filter|match value="followed"> selected="selected"<%/if>><%= Page.KnownSones.Filter.Followed|l10n|html></option>
-                                                       <option value="not-followed"<%if filter|match value="not-followed"> selected="selected"<%/if>><%= Page.KnownSones.Filter.NotFollowed|l10n|html></option>
+                                                       <option value="followed"<%if filter|match value=="followed"> selected="selected"<%/if>><%= Page.KnownSones.Filter.Followed|l10n|html></option>
+                                                       <option value="not-followed"<%if filter|match value=="not-followed"> selected="selected"<%/if>><%= Page.KnownSones.Filter.NotFollowed|l10n|html></option>
                                                <%/if>
-                                               <option value="new"<%if filter|match value="new"> selected="selected"<%/if>><%= Page.KnownSones.Filter.New|l10n|html></option>
-                                               <option value="not-new"<%if filter|match value="not-new"> selected="selected"<%/if>><%= Page.KnownSones.Filter.NotNew|l10n|html></option>
+                                               <option value="new"<%if filter|match value=="new"> selected="selected"<%/if>><%= Page.KnownSones.Filter.New|l10n|html></option>
+                                               <option value="not-new"<%if filter|match value=="not-new"> selected="selected"<%/if>><%= Page.KnownSones.Filter.NotNew|l10n|html></option>
                                        </select>
                                </div>
                        <%/if>
        <%/if>
 
        <div id="known-sones">
-               <%= page|store key=pageParameter>
-               <%include include/pagination.html>
+               <%include include/pagination.html pageParameter==page>
                <%foreach pagination.items sone>
                        <%include include/viewSone.html>
                <%foreachelse>
                        <div><%= Page.KnownSones.Text.NoKnownSones|l10n|html></div>
                <%/foreach>
-               <%include include/pagination.html>
+               <%include include/pagination.html pageParameter==page>
        </div>
 
 <%include include/tail.html>
index 8e9adf6..d316dca 100644 (file)
@@ -7,14 +7,13 @@
        <%include include/updateStatus.html>
 
        <div id="posts">
-               <%= page|store key=pageParameter>
-               <%include include/pagination.html paginationName==pagination-index>
+               <%include include/pagination.html pageParameter==page paginationName==pagination-index>
                <%foreach pagination.items post>
                        <%include include/viewPost.html>
                <%foreachelse>
                        <div><%= Page.New.NothingNew|l10n|html></div>
                <%/foreach>
-               <%include include/pagination.html>
+               <%include include/pagination.html pageParameter==page>
        </div>
 
 <%include include/tail.html>
index 5dfc25a..599a7e6 100644 (file)
@@ -1 +1 @@
-<div class="text"><%= Notification.NewVersion.Text|l10n|replace needle="{version}" replacementKey=latestVersion|replace needle="{edition}" replacementKey=latestEdition|parse sone="nwa8lHa271k2QvJ8aa0Ov7IHAV-DFOCFgmDt3X6BpCI"></div>
+<div class="text"><%= Notification.NewVersion.Text|l10n|replace needle=="{version}" replacement=latestVersion|replace needle=="{edition}" replacement=latestEdition|parse sone=="nwa8lHa271k2QvJ8aa0Ov7IHAV-DFOCFgmDt3X6BpCI"></div>
index 27374ad..d760191 100644 (file)
@@ -1,7 +1,7 @@
-<%if soneStatus|match value="inserting">
+<%if soneStatus|match value=="inserting">
        Your Sone <a href="viewSone.html?sone=<%insertSone.id|html>"><%insertSone.niceName|html></a> is now being inserted.
-<%elseif soneStatus|match value="inserted">
+<%elseif soneStatus|match value=="inserted">
        Your Sone <a href="viewSone.html?sone=<%insertSone.id|html>"><%insertSone.niceName|html></a> has been inserted in <%= Notification.SoneInsert.Duration|l10n 0=insertDuration>.
-<%elseif soneStatus|match value="insert-aborted">
+<%elseif soneStatus|match value=="insert-aborted">
        Inserting your Sone <a href="viewSone.html?sone=<%insertSone.id|html>"><%insertSone.niceName|html></a> has failed.
 <%/if>
\ No newline at end of file
index 02fc451..ce8c927 100644 (file)
@@ -1,4 +1,4 @@
 <div class="text">
        <%= Page.WotPluginMissing.Text.WotRequired|l10n|html>
-       <%= Page.WotPluginMissing.Text.LoadPlugin|l10n|html|replace needle="{link}" replacement='<a href="/plugins/">'|replace needle="{/link}" replacement='</a>'>
+       <%= Page.WotPluginMissing.Text.LoadPlugin|l10n|html|replace needle=="{link}" replacement=='<a href="/plugins/">'|replace needle=="{/link}" replacement=='</a>'>
 </div>
index 94e01dc..119c8a1 100644 (file)
@@ -8,6 +8,9 @@
                        getTranslation("WebInterface.DefaultText.Option.PostsPerPage", function(postsPerPageText) {
                                registerInputTextareaSwap("#sone #options input[name=posts-per-page]", postsPerPageText, "posts-per-page", true, true);
                        });
+                       getTranslation("WebInterface.DefaultText.Option.ImagesPerPage", function(imagesPerPageText) {
+                               registerInputTextareaSwap("#sone #options input[name=images-per-page]", imagesPerPageText, "images-per-page", true, true);
+                       });
                        getTranslation("WebInterface.DefaultText.Option.CharactersPerPost", function(postsPerPageText) {
                                registerInputTextareaSwap("#sone #options input[name=characters-per-post]", postsPerPageText, "characters-per-post", true, true);
                        });
@@ -36,7 +39,7 @@
                <h2><%= Page.Options.Section.SoneSpecificOptions.Title|l10n|html></h2>
 
                <%ifnull currentSone>
-                       <p><%= Page.Options.Section.SoneSpecificOptions.NotLoggedIn|l10n|html|replace needle="{link}" replacement='<a href="login.html">'|replace needle="{/link}" replacement='</a>'></p>
+                       <p><%= Page.Options.Section.SoneSpecificOptions.NotLoggedIn|l10n|html|replace needle=="{link}" replacement=='<a href="login.html">'|replace needle=="{/link}" replacement=='</a>'></p>
                <%else>
                        <p><%= Page.Options.Section.SoneSpecificOptions.LoggedIn|l10n|html></p>
                <%/if>
                <h2><%= Page.Options.Section.AvatarOptions.Title|l10n|html></h2>
 
                <p><%= Page.Options.Option.ShowAvatars.Description|l10n|html></p>
-               
+
                <ul>
                        <li>
-                               <input type="radio" name="show-custom-avatars" value="NEVER"<%if show-custom-avatars|match value=NEVER> checked="checked"<%/if>/>
+                               <input type="radio" name="show-custom-avatars" value="NEVER"<%if show-custom-avatars|match value==NEVER> checked="checked"<%/if>/>
                                <%=Page.Options.Option.ShowAvatars.Never.Description|l10n|html>
                        </li>
                        <li>
-                               <input type="radio" name="show-custom-avatars" value="FOLLOWED"<%if show-custom-avatars|match value=FOLLOWED> checked="checked"<%/if>/>
+                               <input type="radio" name="show-custom-avatars" value="FOLLOWED"<%if show-custom-avatars|match value==FOLLOWED> checked="checked"<%/if>/>
                                <%=Page.Options.Option.ShowAvatars.Followed.Description|l10n|html>
                        </li>
                        <li>
-                               <input type="radio" name="show-custom-avatars" value="MANUALLY_TRUSTED"<%if show-custom-avatars|match value=MANUALLY_TRUSTED> checked="checked"<%/if>/>
+                               <input type="radio" name="show-custom-avatars" value="MANUALLY_TRUSTED"<%if show-custom-avatars|match value==MANUALLY_TRUSTED> checked="checked"<%/if>/>
                                <%=Page.Options.Option.ShowAvatars.ManuallyTrusted.Description|l10n|html>
                        </li>
                        <li>
-                               <input type="radio" name="show-custom-avatars" value="TRUSTED"<%if show-custom-avatars|match value=TRUSTED> checked="checked"<%/if>/>
+                               <input type="radio" name="show-custom-avatars" value="TRUSTED"<%if show-custom-avatars|match value==TRUSTED> checked="checked"<%/if>/>
                                <%=Page.Options.Option.ShowAvatars.Trusted.Description|l10n|html>
                        </li>
                        <li>
-                               <input type="radio" name="show-custom-avatars" value="ALWAYS"<%if show-custom-avatars|match value=ALWAYS> checked="checked"<%/if>/>
+                               <input type="radio" name="show-custom-avatars" value="ALWAYS"<%if show-custom-avatars|match value==ALWAYS> checked="checked"<%/if>/>
                                <%=Page.Options.Option.ShowAvatars.Always.Description|l10n|html>
                        </li>
                </ul>
                <%/if>
                <p><input type="text" name="posts-per-page" value="<% posts-per-page|html>" /></p>
 
+               <p><%= Page.Options.Option.ImagesPerPage.Description|l10n|html></p>
+               <%if =images-per-page|in collection=fieldErrors>
+                       <p class="warning"><%= Page.Options.Warnings.ValueNotChanged|l10n|html></p>
+               <%/if>
+               <p><input type="text" name="images-per-page" value="<% images-per-page|html>" /></p>
+
                <p><%= Page.Options.Option.CharactersPerPost.Description|l10n|html></p>
                <%if =characters-per-post|in collection=fieldErrors>
                        <p class="warning"><%= Page.Options.Warnings.ValueNotChanged|l10n|html></p>
                <p><input type="checkbox" name="fcp-interface-active"<%if fcp-interface-active> checked="checked"<%/if> /> <%= Page.Options.Option.FcpInterfaceActive.Description|l10n|html></p>
 
                <p>
-                       <%= Page.Options.Option.FcpFullAccessRequired.Description|l10n|html|replace needle="{link}" replacement='<a href="/config/fcp">'|replace needle="{/link}" replacement='</a>'>
+                       <%= Page.Options.Option.FcpFullAccessRequired.Description|l10n|html|replace needle=="{link}" replacement=='<a href="/config/fcp">'|replace needle=="{/link}" replacement=='</a>'>
                        <select name="fcp-full-access-required">
-                               <option value="0"<%if fcp-full-access-required|match value="0"> selected="selected"<%/if>><%= Page.Options.Option.FcpFullAccessRequired.Value.No|l10n|html></option>
-                               <option value="1"<%if fcp-full-access-required|match value="1"> selected="selected"<%/if>><%= Page.Options.Option.FcpFullAccessRequired.Value.Writing|l10n|html></option>
-                               <option value="2"<%if fcp-full-access-required|match value="2"> selected="selected"<%/if>><%= Page.Options.Option.FcpFullAccessRequired.Value.Always|l10n|html></option>
+                               <option value="0"<%if fcp-full-access-required|match value=="0"> selected="selected"<%/if>><%= Page.Options.Option.FcpFullAccessRequired.Value.No|l10n|html></option>
+                               <option value="1"<%if fcp-full-access-required|match value=="1"> selected="selected"<%/if>><%= Page.Options.Option.FcpFullAccessRequired.Value.Writing|l10n|html></option>
+                               <option value="2"<%if fcp-full-access-required|match value=="2"> selected="selected"<%/if>><%= Page.Options.Option.FcpFullAccessRequired.Value.Always|l10n|html></option>
                        </select>
                </p>
 
                <h2><%= Page.Options.Section.Cleaning.Title|l10n|html></h2>
 
-               <p><%= Page.Options.Option.ClearOnNextRestart.Description|l10n|html|replace needle="{strong}" replacement="<strong>"|replace needle="{/strong}" replacement="</strong>"></p>
+               <p><%= Page.Options.Option.ClearOnNextRestart.Description|l10n|html|replace needle=="{strong}" replacement=="<strong>"|replace needle=="{/strong}" replacement=="</strong>"></p>
                <p><select name="clear-on-next-restart"><option disabled="disabled"><%= WebInterface.SelectBox.Choose|l10n|html></option><option value="true"<%if clear-on-next-restart> selected="selected"<%/if>><%= WebInterface.SelectBox.Yes|l10n|html></option><option value="false"<%if ! clear-on-next-restart> selected="selected"<%/if>><%= WebInterface.SelectBox.No|l10n|html></option></select>
 
-               <p><%= Page.Options.Option.ReallyClearOnNextRestart.Description|l10n|html|replace needle="{strong}" replacement="<strong>"|replace needle="{/strong}" replacement="</strong>"></p>
+               <p><%= Page.Options.Option.ReallyClearOnNextRestart.Description|l10n|html|replace needle=="{strong}" replacement=="<strong>"|replace needle=="{/strong}" replacement=="</strong>"></p>
                <p><select name="really-clear-on-next-restart"><option disabled="disabled"><%= WebInterface.SelectBox.Choose|l10n|html></option><option value="true"<%if really-clear-on-next-restart> selected="selected"<%/if>><%= WebInterface.SelectBox.Yes|l10n|html></option><option value="false"<%if ! really-clear-on-next-restart> selected="selected"<%/if>><%= WebInterface.SelectBox.No|l10n|html></option></select>
 
                <p><button type="submit"><%= Page.Options.Button.Save|l10n|html></button></p>
index 836bf62..5269800 100644 (file)
@@ -8,7 +8,7 @@
 
                <p><%= Page.ViewPost.Text.UnknownPost|l10n|html></p>
        <%else>
-               <h1><%= Page.ViewPost.Page.Title|l10n|replace needle="{sone}" replacementKey=post.sone.niceName|html></h1>
+               <h1><%= Page.ViewPost.Page.Title|l10n|replace needle=="{sone}" replacement=post.sone.niceName|html></h1>
 
                <%include include/viewPost.html>
        <%/if>
index 6dd3912..1cca4d0 100644 (file)
@@ -8,8 +8,8 @@
                <h1><%= Page.ViewSone.Page.TitleWithoutSone|l10n|html></h1>
 
                <p>
-                       <%= Page.ViewSone.NoSone.Description|l10n|replace needle="{sone}" replacementKey=soneId|html>
-                       <a href="/WebOfTrust/ShowIdentity?id=<% sone.id|html>"><%= Page.ViewSone.Profile.Name.WoTLink|l10n|html></a>
+                       <%= Page.ViewSone.NoSone.Description|l10n|replace needle=="{sone}" replacement=soneId|html>
+                       <a href="/WebOfTrust/ShowIdentity?id=<% soneId|html>"><%= Page.ViewSone.Profile.Name.WoTLink|l10n|html></a>
                </p>
 
        <%elseifnull sone.name>
@@ -79,7 +79,7 @@
                        <%/if>
                <%/if>
 
-               <h1><%= Page.ViewSone.PostList.Title|l10n|replace needle="{sone}" replacementKey=sone.niceName|html></h1>
+               <h1><%= Page.ViewSone.PostList.Title|l10n|replace needle=="{sone}" replacement=sone.niceName|html></h1>
 
                <%foreach posts post>
                        <%first>
@@ -97,7 +97,7 @@
 
                <%foreach repliedPosts post>
                        <%first>
-                               <h2><%= Page.ViewSone.Replies.Title|l10n|html|replace needle="{sone}" replacementKey=sone.niceName></h2>
+                               <h2><%= Page.ViewSone.Replies.Title|l10n|html|replace needle=="{sone}" replacement=sone.niceName></h2>
                                <div id="replied-posts">
                                        <%include include/pagination.html pagination=repliedPostPagination pageParameter==repliedPostPage paginationName==reply-navigation>
                        <%/first>
index d98d4ec..7de50fb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - SoneTextParserTest.java - Copyright © 2011 David Roden
+ * Sone - SoneTextParserTest.java - Copyright © 2011–2012 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by