From: David ‘Bombe’ Roden Date: Wed, 15 Jul 2015 19:19:20 +0000 (+0200) Subject: Merge branch 'release/0.9' X-Git-Tag: 0.9^0 X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=commitdiff_plain;h=59f2d124406df88153b8c5e05bdb524c9b594116;hp=0e8f7804ce344bdd69f5ecc7febe25a60a53561d Merge branch 'release/0.9' --- diff --git a/pom.xml b/pom.xml index 139d3c1..048b777 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 net.pterodactylus sone - 0.9-rc1 + 0.9 net.pterodactylus diff --git a/src/main/java/net/pterodactylus/sone/core/UpdateChecker.java b/src/main/java/net/pterodactylus/sone/core/UpdateChecker.java index 85c5841..8114118 100644 --- a/src/main/java/net/pterodactylus/sone/core/UpdateChecker.java +++ b/src/main/java/net/pterodactylus/sone/core/UpdateChecker.java @@ -50,12 +50,6 @@ public class UpdateChecker { /** The logger. */ private static final Logger logger = getLogger("Sone.UpdateChecker"); - /** The key of the Sone homepage. */ - private static final String SONE_HOMEPAGE = "USK@nwa8lHa271k2QvJ8aa0Ov7IHAV-DFOCFgmDt3X6BpCI,DuQSUZiI~agF8c-6tjsFFGuZ8eICrzWCILB60nT8KKo,AQACAAE/sone/"; - - /** The current latest known edition. */ - private static final int LATEST_EDITION = 65; - /** The event bus. */ private final EventBus eventBus; @@ -141,7 +135,7 @@ public class UpdateChecker { */ public void start() { try { - currentUri = new FreenetURI(SONE_HOMEPAGE + LATEST_EDITION); + currentUri = new FreenetURI(SonePlugin.getHomepage()); } catch (MalformedURLException mue1) { /* this can not really happen unless I screw up. */ logger.log(Level.SEVERE, "Sone Homepage URI invalid!", mue1); diff --git a/src/main/java/net/pterodactylus/sone/main/SonePlugin.java b/src/main/java/net/pterodactylus/sone/main/SonePlugin.java index 392cc40..c5620f6 100644 --- a/src/main/java/net/pterodactylus/sone/main/SonePlugin.java +++ b/src/main/java/net/pterodactylus/sone/main/SonePlugin.java @@ -116,7 +116,12 @@ public class SonePlugin implements FredPlugin, FredPluginFCP, FredPluginL10n, Fr } /** The version. */ - public static final Version VERSION = new Version("rc1", 0, 9); + public static final Version VERSION = new Version(0, 9); + + /** The current year at time of release. */ + private static final int YEAR = 2015; + private static final String SONE_HOMEPAGE = "USK@nwa8lHa271k2QvJ8aa0Ov7IHAV-DFOCFgmDt3X6BpCI,DuQSUZiI~agF8c-6tjsFFGuZ8eICrzWCILB60nT8KKo,AQACAAE/sone/"; + private static final int LATEST_EDITION = 66; /** The logger. */ private static final Logger logger = getLogger("Sone.Plugin"); @@ -170,6 +175,14 @@ public class SonePlugin implements FredPlugin, FredPluginFCP, FredPluginL10n, Fr return l10n; } + public static int getYear() { + return YEAR; + } + + public static String getHomepage() { + return SONE_HOMEPAGE + LATEST_EDITION; + } + // // FREDPLUGIN METHODS // diff --git a/src/main/java/net/pterodactylus/sone/web/AboutPage.java b/src/main/java/net/pterodactylus/sone/web/AboutPage.java index 6a6bc63..4b54a4b 100644 --- a/src/main/java/net/pterodactylus/sone/web/AboutPage.java +++ b/src/main/java/net/pterodactylus/sone/web/AboutPage.java @@ -29,35 +29,23 @@ import net.pterodactylus.util.version.Version; */ public class AboutPage extends SoneTemplatePage { - /** The version to display. */ private final Version version; + private final int year; + private final String homepage; - /** - * Creates a new “about” page. - * - * @param template - * The template to render - * @param webInterface - * The Sone web interface - * @param version - * The version to display - */ - public AboutPage(Template template, WebInterface webInterface, Version version) { + public AboutPage(Template template, WebInterface webInterface, Version version, int year, String homepage) { super("about.html", template, "Page.About.Title", webInterface, false); this.version = version; + this.year = year; + this.homepage = homepage; } - // - // TEMPLATEPAGE METHODS - // - - /** - * {@inheritDoc} - */ @Override protected void processTemplate(FreenetRequest request, TemplateContext templateContext) throws RedirectException { super.processTemplate(request, templateContext); templateContext.set("version", version); + templateContext.set("year", year); + templateContext.set("homepage", homepage); } } diff --git a/src/main/java/net/pterodactylus/sone/web/WebInterface.java b/src/main/java/net/pterodactylus/sone/web/WebInterface.java index 9fe5bba..1ce8f8e 100644 --- a/src/main/java/net/pterodactylus/sone/web/WebInterface.java +++ b/src/main/java/net/pterodactylus/sone/web/WebInterface.java @@ -692,7 +692,7 @@ public class WebInterface { pageToadlets.add(pageToadletFactory.createPageToadlet(new LogoutPage(emptyTemplate, this), "Logout")); pageToadlets.add(pageToadletFactory.createPageToadlet(new OptionsPage(optionsTemplate, this), "Options")); pageToadlets.add(pageToadletFactory.createPageToadlet(new RescuePage(rescueTemplate, this), "Rescue")); - pageToadlets.add(pageToadletFactory.createPageToadlet(new AboutPage(aboutTemplate, this, SonePlugin.VERSION), "About")); + pageToadlets.add(pageToadletFactory.createPageToadlet(new AboutPage(aboutTemplate, this, SonePlugin.VERSION, SonePlugin.getYear(), SonePlugin.getHomepage()), "About")); pageToadlets.add(pageToadletFactory.createPageToadlet(new SoneTemplatePage("noPermission.html", noPermissionTemplate, "Page.NoPermission.Title", this))); pageToadlets.add(pageToadletFactory.createPageToadlet(new SoneTemplatePage("emptyImageTitle.html", emptyImageTitleTemplate, "Page.EmptyImageTitle.Title", this))); pageToadlets.add(pageToadletFactory.createPageToadlet(new SoneTemplatePage("emptyAlbumTitle.html", emptyAlbumTitleTemplate, "Page.EmptyAlbumTitle.Title", this))); diff --git a/src/main/resources/i18n/sone.es.properties b/src/main/resources/i18n/sone.es.properties new file mode 100644 index 0000000..0c3eaec --- /dev/null +++ b/src/main/resources/i18n/sone.es.properties @@ -0,0 +1,465 @@ +Navigation.Menu.Sone.Name=Sone +Navigation.Menu.Sone.Tooltip=Plugin de red social para FreeNet +Navigation.Menu.Sone.Item.Login.Name=Login +Navigation.Menu.Sone.Item.Login.Tooltip=Entra en Sone +Navigation.Menu.Sone.Item.Index.Name=Tu Sone +Navigation.Menu.Sone.Item.Index.Tooltip=Muestra tu Sone +Navigation.Menu.Sone.Item.New.Name=Nuevas publicaciones y respuestas +Navigation.Menu.Sone.Item.New.Tooltip=Mostrar nuevas publicaciones y respuestas +Navigation.Menu.Sone.Item.CreateSone.Name=Crear Sone +Navigation.Menu.Sone.Item.CreateSone.Tooltip=Crear un nuevo Sone +Navigation.Menu.Sone.Item.KnownSones.Name=Sones conocidos +Navigation.Menu.Sone.Item.KnownSones.Tooltip=Mostrar todos los Sones conocidos +Navigation.Menu.Sone.Item.Bookmarks.Name=Marcadores +Navigation.Menu.Sone.Item.Bookmarks.Tooltip=Mostrar publicaciones marcadas +Navigation.Menu.Sone.Item.EditProfile.Name=Editar perfil +Navigation.Menu.Sone.Item.EditProfile.Tooltip=Editar el perfil de tu Sone +Navigation.Menu.Sone.Item.ImageBrowser.Name=Imágenes +Navigation.Menu.Sone.Item.ImageBrowser.Tooltip=Manejar tus imágenes +Navigation.Menu.Sone.Item.DeleteSone.Name=Eliminar Sone +Navigation.Menu.Sone.Item.DeleteSone.Tooltip=Eliminar el Sone actual +Navigation.Menu.Sone.Item.Logout.Name=Logout +Navigation.Menu.Sone.Item.Logout.Tooltip=Salir del Sone actual +Navigation.Menu.Sone.Item.Options.Name=Opciones +Navigation.Menu.Sone.Item.Options.Tooltip=Opciones para el plugin Sone +Navigation.Menu.Sone.Item.Rescue.Name=Rescate +Navigation.Menu.Sone.Item.Rescue.Tooltip=Rescatar Sone +Navigation.Menu.Sone.Item.About.Name=Información +Navigation.Menu.Sone.Item.About.Tooltip=Información sobre Sone + +Page.About.Title=Información - Sone +Page.About.Page.Title=Información +Page.About.Flattr.Description=Si te gusta Sone y te gustaría recompensarme, puedes usar el botón "Flattr" en el inferior de cada página. Flattr es un micropago no-anónimo que actua como un jarro de propinas donde la cantidad que cada usuario gasta es limitada (El mínimo es 2€ al mes). Puedes encontrar más información en {link}flattr.com{/link}. +Page.About.Homepage.Title=Página de inicio +Page.About.Homepage.Description=Puedes encontrar más información y el código fuente de Sone en la {link}página de inicio{/link}. +Page.About.License.Title=Licencia + +Page.Options.Title=Opciones - Sone +Page.Options.Page.Title=Opciones +Page.Options.Page.Description=Estas opciones influencian en la ejecución del plugin de Sone +Page.Options.Section.SoneSpecificOptions.Title=Opciones específicas de Sone +Page.Options.Section.SoneSpecificOptions.NotLoggedIn=Estas opciones solo están disponibles si has {link}iniciado sesión{/link}. +Page.Options.Section.SoneSpecificOptions.LoggedIn=Estas opciones solo están disponibles mientras hayas iniciado sesión y solo son válidas para el Sone con el que hayas hecho login. +Page.Options.Option.AutoFollow.Description=Si un nuevo Sone es descubierto, seguirlo automáticamente. Ten en cuenta que esto solo se aplicará a los Sone que hayas descubierto tras activar esta opción! +Page.Options.Option.EnableSoneInsertNotifications.Description=Si está activado, mostrará una notificación cada vez que tu Sone está siendo insertado o acaba de insertarse. +Page.Options.Option.ShowNotificationNewSones.Description=Muestra notificaciones para nuevos Sone. +Page.Options.Option.ShowNotificationNewPosts.Description=Muestra notificaciones para nuevas publicaciones. +Page.Options.Option.ShowNotificationNewReplies.Description=Muestra notificaciones para nuevas respuestas. +Page.Options.Section.AvatarOptions.Title=Opciones de avatar. +Page.Options.Option.ShowAvatars.Description=Aquí puedes desactivar los avatares personalizados, dependiendo del criterio de selección. Si un avatar es desactivado para un Sone, se mostrará en su lugar el generado automáticamente. +Page.Options.Option.ShowAvatars.Never.Description=Nunca mostrar avatares personalizados. +Page.Options.Option.ShowAvatars.Followed.Description=Solo mostrar avatares de los Sone que sigues. +Page.Options.Option.ShowAvatars.ManuallyTrusted.Description=Solo mostrar avatares de Sones a los que has asignado manualmente un valor de veracidad mayor que 0. +Page.Options.Option.ShowAvatars.Trusted.Description=Solo mostrar avatares para Sones que tienen un valor de veracidad mayor que 0. +Page.Options.Option.ShowAvatars.Always.Description=Mostrar siempre avatares customizados. Advertencia, algunos avatares pueden contener imágenes perturbadoras o ofensivas. +Page.Options.Section.RuntimeOptions.Title=Comportamiento de la ejecución. +Page.Options.Option.InsertionDelay.Description=Número de segundos que se esperarán para insertar el Sone tras una modificación. +Page.Options.Option.PostsPerPage.Description=Número de publicaciones que se mostrarán en una página antes de que se muestren los controles de navegación. +Page.Options.Option.ImagesPerPage.Description=Número de imágenes a mostrar en una página antes de que se muestren los controles de navegación. +Page.Options.Option.CharactersPerPost.Description=Número de carácteres a mostrar de una publicación antes de acortarla y mostrar un link para expandirla (-1 para deshabilitar esta opción). La longitud de la acortación está determinada por la siguiente opción. +Page.Options.Option.PostCutOffLength.Description=Número de carácteres que son mostrados si una publicación es demasiado larga (Mirar la opción anterior).Ignoralo si "Número de carácteres a mostrar" está desactivado (Valor en -1). +Page.Options.Option.RequireFullAccess.Description=Denegar el acceso a Sone a cualquier host al que no se haya garantizado acceso completo. +Page.Options.Section.TrustOptions.Title=Opciones de veracidad. +Page.Options.Option.PositiveTrust.Description=Cantidad de veracidad positiva que quieres asignar a otros Sone al clicar en el tick tras una publicación o respuesta. +Page.Options.Option.NegativeTrust.Description=Cantidad de veracidad que quieres asignar a otros Sone al clicar la X roja tras una publicación o respuesta. Este valor debería ser negativo. +Page.Options.Option.TrustComment.Description=El comentario que se mostrara en la Web of Trust para cualquier veracidad que asignes desde Sone. +Page.Options.Section.FcpOptions.Title=Opciones de la interfaz FCP +Page.Options.Option.FcpInterfaceActive.Description=Activar la interfaz FCP para permitir a otros plugins y clientes remotos acceder al plugin de Sone. +Page.Options.Option.FcpFullAccessRequired.Description=Requiere conexión FCP de los hosts permitidos (Comprueva tu {link}configuración del nodo, sección “FCP”{/link}) +Page.Options.Option.FcpFullAccessRequired.Value.No=No +Page.Options.Option.FcpFullAccessRequired.Value.Writing=Para acceso de escritura +Page.Options.Option.FcpFullAccessRequired.Value.Always=Siempre +Page.Options.Section.Cleaning.Title=Limpiar +Page.Options.Option.ClearOnNextRestart.Description=Reinicia la configuración del plugin Sone en el siguiente reinicio.Cuidado! {strong}Esto destruirá todos tus Sone{/strong} de modo que asegurate de que has hecho una copia de seguridad de todo lo que necesitas! También tendrás que asignar cierto a la siguiente opción para hacerlo. +Page.Options.Option.ReallyClearOnNextRestart.Description=Esta opción tiene que ser puesta en "yes" si realmente, {strong}realmente{/strong} quieres limpiar la configuración del plugin en el siguiente reinicio. +Page.Options.Warnings.ValueNotChanged=Esta opción no fue cambiada porque el valor que introdujiste no era válido. +Page.Options.Button.Save=Save + +Page.Login.Title=Login - Sone +Page.Login.Page.Title=Login +Page.Login.Label.SelectSone=Sone seleccionado: +Page.Login.Option.NoSone=Selecciona Sone… + +Page.Login.CreateSone.Title=Crear Sone + +Page.CreateSone.Title=Crear Sone - Sone + +Page.DeleteSone.Title=Eliminar Sone - Sone +Page.DeleteSone.Page.Title=Eliminar Sone “{sone}”? +Page.DeleteSone.Page.Description=Esto no eliminará el Sone de Freenet (Porque eso es imposible), simplemente lo desvinculará de tu identidad Web of Trust. +Page.DeleteSone.Button.Yes=Si, eliminar. +Page.DeleteSone.Button.No=No, no eliminar. + +Page.Index.Title=Tu Sone - Sone +Page.Index.Label.Text=Publicar texto: +Page.Index.Label.Sender=Mensajero: +Page.Index.Button.Post=Publicar! +Page.Index.PostList.Title=Publicar Feed +Page.Index.PostList.Text.NoPostYet=Nadie ha escrito ningún post todavía. Probablemente deberías empezar ahora! +Page.Index.PostList.Text.FollowSomeSones=O quizás no estás siguiendo ningún Sone? Echa un vistado a la lista de {link}Sones conocidos{/link} y sigue a quienes te parezcan interesantes +Page.Index.PostList.Text.AutoFollowOption=También tienes la opción de seguir automáticamente cualquier Sone que descubras. Echa un vistado a las {link}opciones{/link} para activar la opción "Seguir automáticamente"! + +Page.New.Title=Nuevas publicaciones y respuestas - Sone +Page.New.Page.Title=Nuevas publicaciones y respuestas. +Page.New.NothingNew=Por el momento no hay nada nuevo. + +Page.KnownSones.Title=Sones conocidos - Sone +Page.KnownSones.Page.Title=Sones conocidos +Page.KnownSones.Text.NoKnownSones=Actualmente no hay Sones conocidos que cumplan con el filtro dado. +Page.KnownSones.Label.Sort=Ordenar por: +Page.KnownSones.Label.FilterSones=Filtrar Sones: +Page.KnownSones.Sort.Field.Name=Nombre +Page.KnownSones.Sort.Field.LastActivity=Última actividad +Page.KnownSones.Sort.Field.Posts=Número de publicaciones +Page.KnownSones.Sort.Field.Images=Número de imágenes +Page.KnownSones.Sort.Order.Ascending=Ascendiente +Page.KnownSones.Sort.Order.Descending=Descendiente +Page.KnownSones.Filter.Followed=Mostrar solo Sones seguidos +Page.KnownSones.Filter.NotFollowed=Ocultar Sones seguidos +Page.KnownSones.Filter.New=Mostrar solo nuevos Sone +Page.KnownSones.Filter.NotNew=Ocultar nuevos Sone +Page.KnownSones.Filter.Own=Mostrar solo Sones locales +Page.KnownSones.Filter.NotOwn=Mostrar solo Sones remotos +Page.KnownSones.Button.Apply=Aplicar +Page.KnownSones.Button.FollowAllSones=Seguir todos los Sones de esta página +Page.KnownSones.Button.UnfollowAllSones=Dejar de seguir todos los Sone de esta página + +Page.EditProfile.Title=Editar perfil - Sone +Page.EditProfile.Page.Title=Editar perfil +Page.EditProfile.Page.Description=En esta página puedes entrar tus datos de perfil. +Page.EditProfile.Page.Hint.Optionality=Y recuerda, cada casilla de este perfil es opcional! No se requiere que introduzcas nada aquí! También, todo lo que introduzcas aquí probablemente será almacenado en FreeNet durante mucho tiempo! +Page.EditProfile.Label.FirstName=Primer nombre: +Page.EditProfile.Label.MiddleName=Segundo nombre/s: +Page.EditProfile.Label.LastName=Apellidos: +Page.EditProfile.Birthday.Title=Cumpleaños +Page.EditProfile.Birthday.Label.Day=Día: +Page.EditProfile.Birthday.Label.Month=Mes: +Page.EditProfile.Birthday.Label.Year=Año: +Page.EditProfile.Avatar.Title=Avatar +Page.EditProfile.Avatar.Description=Puedes seleccionar una de tus imágenes subidas para ser tu avatar. No debería ser mayor de 64x64 porque ese es el tamaño máximo mostrado a los demás (80×80 es usado para el cabezal de la página). +Page.EditProfile.Avatar.Delete=Sin avatar +Page.EditProfile.Fields.Title=Datos personalizados +Page.EditProfile.Fields.Description=Aquí puedes entrar datos personalizados en tu perfil. Estas casillas pueden contenter lo que quieras en la extensión que quieras. Solo recuerda que, cuando pertoca a anonimato, menos es mejor que más. +Page.EditProfile.Fields.Button.Edit=editar +Page.EditProfile.Fields.Button.MoveUp=subir +Page.EditProfile.Fields.Button.MoveDown=bajar +Page.EditProfile.Fields.Button.Delete=eliminar +Page.EditProfile.Fields.Button.ReallyDelete=en serio, eliminar +Page.EditProfile.Fields.AddField.Title=Añadir campo +Page.EditProfile.Fields.AddField.Label.Name=Nombre: +Page.EditProfile.Fields.AddField.Button.AddField=Añadir campo +Page.EditProfile.Button.Save=Guardar perfil +Page.EditProfile.Error.DuplicateFieldName=El nombre del campo “{fieldName}” ya existe. + +Page.EditProfileField.Title=Editar campo del perfil - Sone +Page.EditProfileField.Page.Title=Editar campo del perfil +Page.EditProfileField.Text=Introduce un nuevo nombre para este campo. +Page.EditProfileField.Error.DuplicateFieldName=El nombre que has entrado ya existe. +Page.EditProfileField.Button.Save=Guardar +Page.EditProfileField.Button.Reset=Volver al viejo nombre +Page.EditProfileField.Button.Cancel=No cambiar el nombre + +Page.DeleteProfileField.Title=Eliminar campo del perfil - Sone +Page.DeleteProfileField.Page.Title=Eliminar campo del perfil +Page.DeleteProfileField.Text=Estás seguro de querer eliminar este campo? +Page.DeleteProfileField.Button.Yes=Si, eliminar +Page.DeleteProfileField.Button.No=No, no eliminar + +Page.CreatePost.Title=Publicar - Sone +Page.CreatePost.Page.Title=Publicar +Page.CreatePost.Label.Text=Publicar texto: +Page.CreatePost.Button.Post=Publicar! +Page.CreatePost.Error.EmptyText=No has escrito ningún texto, cosa que es una pena. Quizás tendrías que escribir más! + +Page.CreateReply.Title=Crear respuesta - Sone +Page.CreateReply.Page.Title=Crear respuesta +Page.CreateReply.Error.EmptyText=No has escrito ningún texto, cosa que es una pena. Quizás tendrías que escribir más! +Page.CreateReply.Label.Text=Responder texto: +Page.CreateReply.Button.Post=Publicar respuesta: + +Page.ViewSone.Title=Ver Sone - Sone +Page.ViewSone.Page.TitleWithoutSone=Ver Sone desconocido +Page.ViewSone.NoSone.Description=Actualmente no hay ningún Sone conocido con esta identidad {sone}. Si estás buscando por un Sone específico,asegurate de que es visible en tu Web of Trust: +Page.ViewSone.UnknownSone.Description=Este Sone aún no ha sido recivido. Por favor, compruebalo de nuevo dentro de un rato. +Page.ViewSone.UnknownSone.LinkToWebOfTrust=Incluso si el Sone sigue siendo desconocido, su perfil de Web of Trust podría estar disponible: +Page.ViewSone.WriteAMessage=Puedes escribir un mensaje a este Sone aquí. Ten en cuenta que todo el mundo podrá leer este mensaje! +Page.ViewSone.PostList.Title=Publicaciones de {sone} +Page.ViewSone.PostList.Text.NoPostYet=Este Sone aún no ha publicado nada +Page.ViewSone.Profile.Title=Perfil +Page.ViewSone.Profile.Label.Name=Nombre +Page.ViewSone.Profile.Label.Albums=Álbumes +Page.ViewSone.Profile.Albums.Text.All=Todos los álbumes +Page.ViewSone.Profile.Name.WoTLink=Perfil de Web of Trust +Page.ViewSone.Replies.Title=Publicaciones a las que {sone} ha respondido + +Page.ViewPost.Title=Ver publicación - Sone +Page.ViewPost.Page.Title=Ver publicaciones de {sone} +Page.ViewPost.Page.TitleUnknownSone=Ver publicación desconocida +Page.ViewPost.Text.UnknownPost=Este post aún no ha sido descargado + +Page.Like.Title=Like - Sone +Page.Unlike.Title=Dislike - Sone + +Page.DeletePost.Title=Eliminar Sone - Sone +Page.DeletePost.Page.Title=Eliminar Sone +Page.DeletePost.Text.PostWillBeGone=Eliminar una publicación la quitará de tu Sone. No será eliminada de Freenet porque eso es imposible. Las viejas versiones de tu Sone siempre incluirán la publicación eliminada. +Page.DeletePost.Button.Yes=Si, eliminar. +Page.DeletePost.Button.No=No, no eliminar. + +Page.DeleteReply.Title=Eliminar respuesta - Sone +Page.DeleteReply.Page.Title=Eliminar respuesta +Page.DeleteReply.Text.PostWillBeGone=Eliminar una respuesta la eliminará de tu Sone. No será eliminada de Freenet porque eso es imposible. Las viejas versiones de tu Sone siempre incluirán la respuesta eliminada. +Page.DeleteReply.Button.Yes=Si, eliminar. +Page.DeleteReply.Button.No=No, no eliminar. + +Page.LockSone.Title=Bloquear Sone - Sone + +Page.UnlockSone.Title=Desbloquear Sone - Sone + +Page.FollowSone.Title=Seguir Sone - Sone + +Page.UnfollowSone.Title=Dejar de seguir Sone - Sone + +Page.ImageBrowser.Title=Navegador de imágenes - Sone +Page.ImageBrowser.Album.Title=Álbum “{album}” +Page.ImageBrowser.Album.Error.NotFound.Text=El álbum colicitado no pudo ser encontrado. Es posible que aún no haya sido descargado, o que haya sido eliminado. +Page.ImageBrowser.Sone.Title=Álbumes de {sone} +Page.ImageBrowser.Sone.Error.NotFound.Text=El Sone solicitado no pudo ser encontrado. Es posible que aún no haya sido descargado, o que haya sido eliminado. +Page.ImageBrowser.Header.Albums=Álbumes +Page.ImageBrowser.Header.Images=Imágenes +Page.ImageBrowser.Link.All=Todos los Sone +Page.ImageBrowser.CreateAlbum.Button.CreateAlbum=Crear álbum +Page.ImageBrowser.Album.Edit.Title=Editar álbum +Page.ImageBrowser.Album.Delete.Title=Eliminar álbum +Page.ImageBrowser.Album.Label.AlbumImage=Imagen del álbum. +Page.ImageBrowser.Album.Label.Title=Título: +Page.ImageBrowser.Album.Label.Description=Descripción: +Page.ImageBrowser.Album.AlbumImage.Choose=Elegir imagen del álbum +Page.ImageBrowser.Album.Button.Save=Guardar álbum +Page.ImageBrowser.Album.Button.Delete=Eliminar álbum +Page.ImageBrowser.Image.Edit.Title=Editar imagen +Page.ImageBrowser.Image.Title.Label=Título: +Page.ImageBrowser.Image.Description.Label=Descripción: +Page.ImageBrowser.Image.Button.MoveLeft=◀ +Page.ImageBrowser.Image.Button.Save=Guardar imagen +Page.ImageBrowser.Image.Button.MoveRight=► +Page.ImageBrowser.Image.Delete.Title=Eliminar imagen +Page.ImageBrowser.Image.Button.Delete=Eliminar imagen + +Page.CreateAlbum.Title=Crear álbum - Sone +Page.CreateAlbum.Page.Title=Crear álbum +Page.CreateAlbum.Error.NameMissing=Parece que has olvidado introducir un nombre para tu nuevo álbum. + +Page.UploadImage.Title=Subir imagen - Sone +Page.UploadImage.Error.InvalidImage=La imagen que intentabas subir no pudo ser reconocida. Por favor, sube solo imagenes en JPEG (*.jpg or *.jpeg) o PNG (*.png). + +Page.EditImage.Title=Editar imagen - Sone + +Page.DeleteImage.Title=Eliminar imagen - Sone +Page.DeleteImage.Page.Title=Eliminar imagen +Page.DeleteImage.Text.ImageWillBeGone=Esto eliminará la imagen “{image}” de tu álbum “{album}”. Si ya ha sido insertada en Freenet, no podrá ser eliminada de ahí a la fuerza. Quieres eliminar la imagen? +Page.DeleteImage.Button.Yes=Si, eliminar imagen. +Page.DeleteImage.Button.No=No, no eliminar imagen + +Page.EditAlbum.Title=Editar álbum - Sone + +Page.DeleteAlbum.Title=Eliminar álbum - Sone +Page.DeleteAlbum.Page.Title=Eliminar álbum +Page.DeleteAlbum.Text.AlbumWillBeGone=Esto eliminará tu álbum “{title}”. Realmente quieres hacer eso? +Page.DeleteAlbum.Button.Yes=Si, eliminar álbum. +Page.DeleteAlbum.Button.No=No, no eliminar álbum. + +Page.Trust.Title=Dar veracidad al Sone - Sone + +Page.Distrust.Title=Retirar veracidad al Sone - Sone + +Page.Untrust.Title=Quitar veracidad al Sone - Sone + +Page.MarkAsKnown.Title=Marcar como conocido - Sone + +Page.Bookmark.Title=Marcar - Sone +Page.Unbookmark.Title=Eliminar marcador - Sone +Page.Bookmarks.Title=Marcadores - Sone +Page.Bookmarks.Page.Title=Marcadores +Page.Bookmarks.Text.NoBookmarks=No tienes ningun marcador definido. Puedes marcar publicaciones clicando en la estrella bajo esta. +Page.Bookmarks.Text.PostsNotLoaded=Algunas de tus publicaciones marcadas no han sido mostradas porque no se pueden cargar. Esto puede suceder si reiniciaste Sone recientemente o si el Sone original ha eliminado la publicación. Si estás razonablemente seguro de que las publicaciones ya no existen, puedes {link}desmarcarlas{/link}. + +Page.Search.Title=Buscar - Sone +Page.Search.Page.Title=Buscar resultados +Page.Search.Text.SoneHits=Los siguientes Sones coinciden con tus criterios de búsqueda. +Page.Search.Text.PostHits=Las siguientes publicaciones coinciden con tus criterios de búsqueda. +Page.Search.Text.NoHits=No hay Sones o publicaciones que coincidan con tus criterios de búsqueda. + +Page.Rescue.Title=Rescatar Sone - Sone +Page.Rescue.Page.Title=Rescatar Sone “{0}” +Page.Rescue.Text.Description=El modo rescate te permite restaurar versiones anteriores de tu Sone. Esto puede ser necesario si perdiste tu configuración. +Page.Rescue.Text.Procedure=El modo rescate funciona obteniendo la última versión insertada de tu Sone. Si una edición fue obtenida con éxito, esta será cargada en tu Sone, dejandote controlar tus publicaciones, perfil y otras opciones (Puedes hacer eso en una segunda pestaña o ventana). Si la edición obtenida no es la que quieres rescatar,indica al modo rescate que obtenga la siguiente versión anterior. +Page.Rescue.Text.Fetching=El modo rescate está obteniendo actualmente la edición {0} de tu Sone. +Page.Rescue.Text.Fetched=El modo rescate ha descargado la edición {0} de tu Sone. Por favor, comprueba tus publicaciones, respuestas y perfil. Si te gusta lo que tiene el Sone actual, desbloquealo. +Page.Rescue.Text.FetchedLast=El rescatador de Sone ha descargado la última versión disponibe. Si no ha conseguido restaurar tu Sone probablemente no te queda suerte. +Page.Rescue.Text.NotFetched=El rescatador de Sone no ha podido descargar la edición {0} de tu Sone. Por favor, vuelve ha intentarlo con la edición {0}, o prueba con la siguiente versión antigua. +Page.Rescue.Label.NextEdition=Siguiente edición: +Page.Rescue.Button.Fetch=Obtener edición + +Page.NoPermission.Title=Acceso desautorizado - Sone +Page.NoPermission.Page.Title=Acceso desautorizado +Page.NoPermission.Text.NoPermission=Has intentado hacer algo para lo que no tenías suficiente autorización. Por favor, abstente de dichas acciones en un futuro o nos veremos obligados a tomar contramedidas! + +Page.EmptyImageTitle.Title=El título no puede estar vacío - Sone +Page.EmptyImageTitle.Page.Title=El título no puede estar vacío +Page.EmptyImageTitle.Text.EmptyImageTitle=Tienes que darle a tu imagen un título. Por favor, vuelve a la página anterior y entra un título. + +Page.EmptyAlbumTitle.Title=El título no puede estar vacío - Sone +Page.EmptyAlbumTitle.Page.Title=El título no puede estar vacío +Page.EmptyAlbumTitle.Text.EmptyAlbumTitle=Tienes que darle a tu álbum un título. Por favor, vuelve a la página anterior y entra un título. + +Page.DismissNotification.Title=Eliminar notificación - Sone + +Page.WotPluginMissing.Text.WotRequired=Debido a que Web of Trust es una parte integral de Sone, el plugin Web of Trust debe ser cargado para que Sone funcione. +Page.WotPluginMissing.Text.LoadPlugin=Por favor, carga el plugin Web of Trust en el {link}gestor de plugins{/link}. + +Page.Logout.Title=Cerrar sesión - Sone + +Page.Invalid.Title=Acción invalida realizada - Sone +Page.Invalid.Page.Title=Acción invalida realizada +Page.Invalid.Text=Se ha realizado una acción inválida, o la acción era válida pero los parámetros no. Por favor, vuelve al {link}índice{/link} e intentalo de nuevo. Si el error persiste, probablemente hayas encontrado un bug. + +View.Search.Button.Search=Buscar + +View.CreateSone.Text.WotIdentityRequired=Para crear un Sone necesitas una identidad del {link} plugin Web of Trust{/link}. +View.CreateSone.Select.Default=Selecciona una identidad +View.CreateSone.Text.NoIdentities=No tienes ninguna identidad de Web of Trust. Por favor, ve al {link}plugin Web of Trust{/link} y crea una identidad. +View.CreateSone.Text.NoNonSoneIdentities=No tienes ninguna identidad de Web of Trust que no tenga ya un Sone. Usa alguna de las identidades restantes para crear un nuevo Sone o ve al {link}plugin Web of Trust{/link} para crear una nueva identidad. +View.CreateSone.Button.Create=Crear Sone +View.CreateSone.Text.Error.NoIdentity=No has seleccionado ninguna identidad. + +View.Sone.Label.LastUpdate=Última actualización: +View.Sone.Text.UnknownDate=desconocida +View.Sone.Stats.Posts={0,number} {0,choice,0#publicaciones|1#publicación|1<%= Page.About.Page.Title|l10n|html> -

Sone – The Freenet Social Network Plugin, Version <% version|html>, © 2010–2012 by David ‘Bombe’ Roden.

+

Sone – The Freenet Social Network Plugin, Version <% version|html>, © 2010–<% year|html> by David ‘Bombe’ Roden.

<%= Page.About.Flattr.Description|l10n|html|replace needle=="{link}" replacement==''|replace needle=="{/link}" replacement==''> @@ -11,7 +11,7 @@

<%= Page.About.Homepage.Title|l10n|html>

- <%= Page.About.Homepage.Description|l10n|html|replace needle=="{link}" replacement==''|replace needle=="{/link}" replacement==''> + <%= Page.About.Homepage.Description|l10n|html|replace needle=="{link}" replacement==''|replace needle=="{/link}" replacement==''>

<%= Page.About.License.Title|l10n|html>

diff --git a/src/test/java/net/pterodactylus/sone/text/TextFilterTest.java b/src/test/java/net/pterodactylus/sone/text/TextFilterTest.java new file mode 100644 index 0000000..1076a8a --- /dev/null +++ b/src/test/java/net/pterodactylus/sone/text/TextFilterTest.java @@ -0,0 +1,52 @@ +package net.pterodactylus.sone.text; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +import org.hamcrest.MatcherAssert; +import org.hamcrest.Matchers; +import org.junit.Test; + +/** + * JUnit test for {@link TextFilter}. + * + * @author David ‘Bombe’ Roden + */ +public class TextFilterTest { + + @Test + public void textFilterCanBeCreated() { + new TextFilter(); + } + + @Test + public void textFilterRemovesHttpLinkToSameHost() { + String textWithHttpLink = "Some text with an http://foo.bar/link.html in it."; + assertThat(TextFilter.filter("foo.bar", textWithHttpLink), is("Some text with an link.html in it.")); + } + + @Test + public void textFilterRemovesHttpsLinkToSameHost() { + String textWithHttpLink = "Some text with an https://foo.bar/link.html in it."; + assertThat(TextFilter.filter("foo.bar", textWithHttpLink), is("Some text with an link.html in it.")); + } + + @Test + public void textWithoutALinkIsReturnedUnmodified() { + String textWithHttpLink = "Some text without a link in it."; + assertThat(TextFilter.filter("foo.bar", textWithHttpLink), is("Some text without a link in it.")); + } + + @Test + public void nothingIsRemovedWhenThereIsNoHostHeader() { + String textWithHttpLink = "Some text with an https://foo.bar/link.html in it."; + assertThat(TextFilter.filter(null, textWithHttpLink), is("Some text with an https://foo.bar/link.html in it.")); + } + + @Test + public void textFilterDoesNotRemoveLinksToDifferentHost() { + String textWithHttpLink = "Some text with an https://foo.bar/link.html in it."; + assertThat(TextFilter.filter("bar.baz", textWithHttpLink), is("Some text with an https://foo.bar/link.html in it.")); + } + +}