diff --git a/CHANGES.md b/CHANGES.md index 8e6a56dcd..e9d57207a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -25,6 +25,16 @@ every AtomPub URI, permission, element and status code, with examples that the test suite checks against the code. +- **Redesigned blogroll page.** A weblog's blogrolls are listed beside + their links, and each blogroll has its own address. + - Drag a link by its handle, or use the arrow keys on the handle, to + change the order themes show links in. + - Select links to move them to another blogroll or delete them. + - Add and edit links in one dialog that starts with the URL, fills in the + name from it, and checks each field. OPML import is back on the page. + - The default blogroll can't be renamed, since themes find it by its + name, and the page works on phones. + ### Bug fixes - **AtomPub fixes found while running a 7.0.0 snapshot.** diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarkEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarkEdit.java index 9dbfec394..395c4c849 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarkEdit.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarkEdit.java @@ -26,6 +26,7 @@ import org.apache.roller.weblogger.business.WebloggerFactory; import org.apache.roller.weblogger.pojos.WeblogBookmark; import org.apache.roller.weblogger.ui.struts2.util.UIAction; +import org.apache.roller.weblogger.util.HTMLSanitizer; import org.apache.roller.weblogger.util.cache.CacheManager; import org.apache.struts2.interceptor.parameter.StrutsParameter; import org.apache.struts2.interceptor.validation.SkipValidation; @@ -131,10 +132,12 @@ public void myValidate() { addError("bookmarkForm.notFound"); return; } - // if name new or changed, check new name doesn't already exist - if ((isAdd() || !getBean().getName().equals(bookmark.getName())) - && bookmark.getFolder().hasBookmarkOfName(getBean().getName())) { - addError("bookmarkForm.error.duplicateName", getBean().getUrl()); + // if name new or changed, check new name doesn't already exist; names are + // stored sanitized, so compare the sanitized form + String name = HTMLSanitizer.conditionallySanitize(getBean().getName()); + if ((isAdd() || !StringUtils.equals(name, bookmark.getName())) + && bookmark.getFolder().hasBookmarkOfName(name)) { + addError("bookmarkForm.error.duplicateName", getBean().getName()); } } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Bookmarks.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Bookmarks.java index c13104b9f..705fd4738 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Bookmarks.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Bookmarks.java @@ -20,7 +20,10 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; @@ -31,18 +34,22 @@ import org.apache.roller.weblogger.pojos.WeblogBookmark; import org.apache.roller.weblogger.pojos.WeblogBookmarkFolder; import org.apache.roller.weblogger.ui.struts2.util.UIAction; +import org.apache.roller.weblogger.util.Utilities; import org.apache.roller.weblogger.util.cache.CacheManager; -import org.apache.struts2.convention.annotation.AllowedMethods; import org.apache.struts2.interceptor.parameter.StrutsParameter; import org.apache.struts2.interceptor.validation.SkipValidation; /** - * List bookmarks and folders and allow for moving them around and deleting them. + * The blogroll page: a weblog's blogrolls (bookmark folders) and the links in + * one of them. Links can be reordered, moved to another blogroll and deleted; + * a blogroll other than the default one can be deleted. */ -// TODO: make this work @AllowedMethods({"execute","delete","deleteFolder","move","view","folderCreated"}) public class Bookmarks extends UIAction { - private static Log log = LogFactory.getLog(Bookmarks.class); + private static final Log log = LogFactory.getLog(Bookmarks.class); + + /** The blogroll that themes show; it can't be renamed or deleted. */ + public static final String DEFAULT_FOLDER = "default"; // the id of folder being viewed private String folderId = null; @@ -50,16 +57,16 @@ public class Bookmarks extends UIAction { // the folder being viewed private WeblogBookmarkFolder folder = null; - // the list of bookmarks to move or delete + // the links to move or delete private String[] selectedBookmarks = null; - // the target folder to move items to + // the folder to move links to private String targetFolderId = null; - // a new folder the user wishes to view - private String viewFolderId = null; + // the links of the folder, in their new order + private List bookmarkIds = new ArrayList<>(); - // all folders from the action weblog + // all folders of the weblog: default first, then by name private List allFolders = Collections.emptyList(); public Bookmarks() { @@ -68,202 +75,222 @@ public Bookmarks() { this.pageTitle = "bookmarksForm.rootTitle"; } + /** + * Loads the requested blogroll. Without one, opens the default blogroll if + * it has links, otherwise the first blogroll that has links, so the page + * doesn't open on an empty list while the links are elsewhere. + */ @Override public void myPrepare() { try { BookmarkManager bmgr = WebloggerFactory.getWeblogger().getBookmarkManager(); - if (!StringUtils.isEmpty(getFolderId())) { - setFolder(bmgr.getFolderById(getActionWeblog(), getFolderId())); - } else { - setFolder(bmgr.getDefaultFolder(getActionWeblog())); - if (getFolder() != null) { - setFolderId(getFolder().getId()); - } + List folders = new ArrayList<>(bmgr.getAllFolders(getActionWeblog())); + folders.sort(Comparator + .comparing((WeblogBookmarkFolder f) -> !DEFAULT_FOLDER.equals(f.getName())) + .thenComparing(f -> StringUtils.defaultString(f.getName()), String.CASE_INSENSITIVE_ORDER)); + allFolders = folders; + + WeblogBookmarkFolder requested = StringUtils.isEmpty(getFolderId()) + ? null : bmgr.getFolderById(getActionWeblog(), getFolderId()); + if (requested == null) { + requested = folders.stream() + .filter(f -> !f.getBookmarks().isEmpty()) + .findFirst() + .orElse(folders.isEmpty() ? null : folders.get(0)); } + setFolder(requested); } catch (WebloggerException ex) { log.error("Error looking up folder", ex); } } /** - * Present the bookmarks available in the folder specified by the request. + * Shows the blogroll. */ + @SkipValidation @Override public String execute() { - - // build list of folders that the user can navigate to - List newFolders = new ArrayList<>(); - - try { - // Build list of all folders, except for current one - BookmarkManager bmgr = WebloggerFactory.getWeblogger().getBookmarkManager(); - List folders = bmgr.getAllFolders(getActionWeblog()); - for (WeblogBookmarkFolder fd : folders) { - if (!fd.getId().equals(getFolderId())) { - newFolders.add(fd); - } - } - - } catch (WebloggerException ex) { - log.error("Error building folders list", ex); - addError("Error building folders list"); - } - - if (!newFolders.isEmpty()) { - setAllFolders(newFolders); - } - return LIST; } /** - * Delete bookmarks. + * Deletes the selected links. */ public String delete() { - - BookmarkManager bmgr = WebloggerFactory.getWeblogger().getBookmarkManager(); - + List links = selectedLinks(); + if (links == null) { + addError("bookmarksForm.error.notFound"); + return execute(); + } try { - WeblogBookmark bookmark; - String bookmarks[] = getSelectedBookmarks(); - if (null != bookmarks && bookmarks.length > 0) { - if (log.isDebugEnabled()) { - log.debug("Processing delete of " + bookmarks.length - + " bookmarks."); - } - for (int j = 0; j < bookmarks.length; j++) { - if (log.isDebugEnabled()) { - log.debug("Deleting bookmark - " + bookmarks[j]); - } - bookmark = bmgr.getBookmark(getActionWeblog(), bookmarks[j]); - if (bookmark != null) { - bmgr.removeBookmark(bookmark); - } - - } + BookmarkManager bmgr = WebloggerFactory.getWeblogger().getBookmarkManager(); + for (WeblogBookmark link : links) { + folder.getBookmarks().remove(link); + bmgr.removeBookmark(link); } - - // flush changes WebloggerFactory.getWeblogger().flush(); - - // notify caches CacheManager.invalidate(getActionWeblog()); - + addMessage(links.size() == 1 ? "bookmarksForm.deletedOne" : "bookmarksForm.deletedMany", + String.valueOf(links.size())); } catch (WebloggerException ex) { - log.error("Error doing bookmark deletes", ex); - addError("Error doing bookmark deletes"); + log.error("Error deleting links", ex); + addError("generic.error.check.logs"); } - return execute(); } + /** + * Deletes the blogroll being viewed and its links, then shows the default blogroll. + */ public String deleteFolder() { - + if (folder == null) { + addError("folderForm.notFound"); + return execute(); + } + if (isDefaultFolder()) { + addError("bookmarksForm.error.deleteDefault"); + return execute(); + } try { BookmarkManager bmgr = WebloggerFactory.getWeblogger().getBookmarkManager(); - WeblogBookmarkFolder fd = bmgr.getFolderById(getActionWeblog(), getFolderId()); - - if (fd != null) { - - if ( "default".equals( fd.getName() ) ) { - addError("Cannot delete default bookmark"); - return execute(); - } - bmgr.removeFolder(fd); - - // flush changes - WebloggerFactory.getWeblogger().flush(); - - // notify caches - CacheManager.invalidate(getActionWeblog()); - - // re-route to default folder - setFolder(bmgr.getDefaultFolder(getActionWeblog())); - setFolderId(getFolder().getId()); - } + String name = folder.getName(); + bmgr.removeFolder(folder); + WebloggerFactory.getWeblogger().flush(); + CacheManager.invalidate(getActionWeblog()); + addMessage("bookmarksForm.folderDeleted", name); + allFolders = new ArrayList<>(allFolders); + allFolders.remove(folder); + setFolder(bmgr.getDefaultFolder(getActionWeblog())); } catch (WebloggerException ex) { log.error("Error deleting folder", ex); + addError("generic.error.check.logs"); } return execute(); } @SkipValidation public String folderCreated() { - // action from FolderEdit upon creation of a new folder, to display - // a success message prior to showing the new folder. - addMessage("folderForm.created"); + // reached by a redirect from FolderEdit after it creates a folder, and + // from BookmarksImport after it imports links into a new one + if (folder != null) { + addMessage("folderForm.created", folder.getName()); + } return execute(); } /** - * View the contents of another bookmark folder. + * Moves the selected links to the end of another blogroll. */ - public String view() { - + public String move() { try { BookmarkManager bmgr = WebloggerFactory.getWeblogger().getBookmarkManager(); - if (!StringUtils.isEmpty(viewFolderId)) { - setFolder(bmgr.getFolderById(getActionWeblog(), viewFolderId)); - setFolderId(viewFolderId); + WeblogBookmarkFolder target = StringUtils.isEmpty(getTargetFolderId()) + ? null : bmgr.getFolderById(getActionWeblog(), getTargetFolderId()); + List links = selectedLinks(); + if (target == null || links == null || target.equals(folder)) { + addError("bookmarksForm.error.move"); + return execute(); } - } catch (WebloggerException ex) { - log.error("Error looking up folder", ex); + for (WeblogBookmark link : links) { + folder.getBookmarks().remove(link); + target.addBookmark(link); + link.setFolder(target); + // recalculated by saveBookmark: after the target's last link + link.setPriority(null); + bmgr.saveBookmark(link); + } + WebloggerFactory.getWeblogger().flush(); + CacheManager.invalidate(getActionWeblog()); + addMessage(links.size() == 1 ? "bookmarksForm.movedOne" : "bookmarksForm.movedMany", + List.of(String.valueOf(links.size()), target.getName())); + } catch (WebloggerException e) { + log.error("Error moving links", e); + addError("bookmarksForm.error.move"); } return execute(); } /** - * Move bookmarks to a new folder. + * Saves a new order for the links of the blogroll. The posted ids must be + * exactly the blogroll's links. */ - public String move() { - + public String reorder() { + if (folder == null) { + addError("folderForm.notFound"); + return execute(); + } + List links = folder.getBookmarks(); + Set ids = new HashSet<>(bookmarkIds); + if (ids.size() != bookmarkIds.size() || ids.size() != links.size() + || links.stream().anyMatch(link -> !ids.contains(link.getId()))) { + addError("bookmarksForm.error.reorder"); + return execute(); + } try { BookmarkManager bmgr = WebloggerFactory.getWeblogger().getBookmarkManager(); - - if (log.isDebugEnabled()) { - log.debug("Moving bookmarks to folder - " + getTargetFolderId()); + for (WeblogBookmark link : links) { + link.setPriority(bookmarkIds.indexOf(link.getId())); + bmgr.saveBookmark(link); } + links.sort(Comparator.comparing(WeblogBookmark::getPriority)); + WebloggerFactory.getWeblogger().flush(); + CacheManager.invalidate(getActionWeblog()); + addMessage("bookmarksForm.orderSaved"); + } catch (WebloggerException ex) { + log.error("Error reordering links", ex); + addError("generic.error.check.logs"); + } + return execute(); + } - // Move bookmarks to new parent folder. - WeblogBookmarkFolder newFolder = bmgr.getFolderById(getActionWeblog(), getTargetFolderId()); - String bookmarks[] = getSelectedBookmarks(); - - if (newFolder == null) { - addError("bookmarksForm.error.move"); - return execute(); + /** + * The selected links, or null if any of them is not in the blogroll being viewed. + */ + private List selectedLinks() { + if (folder == null || selectedBookmarks == null || selectedBookmarks.length == 0) { + return null; + } + List links = new ArrayList<>(); + for (String id : selectedBookmarks) { + WeblogBookmark link = folder.getBookmarks().stream() + .filter(b -> b.getId().equals(id)) + .findFirst().orElse(null); + if (link == null) { + return null; } + links.add(link); + } + return links; + } - if (null != bookmarks && bookmarks.length > 0) { - List bookmarksToMove = new ArrayList<>(); - for (String bookmarkId : bookmarks) { - WeblogBookmark bd = bmgr.getBookmark(getActionWeblog(), bookmarkId); - if (bd == null) { - addError("bookmarksForm.error.move"); - return execute(); - } - bookmarksToMove.add(bd); - } - for (WeblogBookmark bd : bookmarksToMove) { - newFolder.addBookmark(bd); - bd.setFolder(newFolder); - bmgr.saveBookmark(bd); - folder.getBookmarks().remove(bd); - } - } + /** + * The links of the blogroll being viewed, as a plain list: Struts doesn't + * allow the page to call methods on the persistence provider's list. + */ + public List getLinks() { + return folder == null ? Collections.emptyList() : new ArrayList<>(folder.getBookmarks()); + } - // flush changes - WebloggerFactory.getWeblogger().flush(); + public int linkCount(WeblogBookmarkFolder f) { + return f == null ? 0 : f.getBookmarks().size(); + } - // notify caches - CacheManager.invalidate(getActionWeblog()); + /** + * A link's name or description as plain text. They are stored sanitized, + * so may hold markup and entities; the page shows them as themes do. + */ + public String plainText(String text) { + return text == null ? "" : Utilities.unescapeHTML(Utilities.removeHTML(text, false)); + } - } catch (WebloggerException e) { - log.error("Error doing bookmark move", e); - addError("bookmarksForm.error.move"); - } + public boolean isDefaultFolder() { + return folder != null && DEFAULT_FOLDER.equals(folder.getName()); + } - return execute(); + /** The blogrolls the selected links can be moved to: all but the one being viewed. */ + public List getMoveTargets() { + return allFolders.stream().filter(f -> !f.equals(folder)).toList(); } public String getFolderId() { @@ -293,12 +320,17 @@ public void setTargetFolderId(String targetFolderId) { this.targetFolderId = targetFolderId; } - public List getAllFolders() { - return allFolders; + public List getBookmarkIds() { + return bookmarkIds; + } + + @StrutsParameter + public void setBookmarkIds(List bookmarkIds) { + this.bookmarkIds = bookmarkIds == null ? new ArrayList<>() : bookmarkIds; } - public void setAllFolders(List allFolders) { - this.allFolders = allFolders; + public List getAllFolders() { + return allFolders; } public WeblogBookmarkFolder getFolder() { @@ -307,17 +339,8 @@ public WeblogBookmarkFolder getFolder() { private void setFolder(WeblogBookmarkFolder folder) { this.folder = folder; - if ( folder != null ) { + if (folder != null) { this.folderId = folder.getId(); } } - - public String getViewFolderId() { - return viewFolderId; - } - - @StrutsParameter - public void setViewFolderId(String viewFolderId) { - this.viewFolderId = viewFolderId; - } } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarksImport.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarksImport.java index 9ae5900a5..58b39de36 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarksImport.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarksImport.java @@ -30,6 +30,7 @@ import org.apache.roller.util.RollerConstants; import org.apache.roller.weblogger.business.BookmarkManager; import org.apache.roller.weblogger.business.WebloggerFactory; +import org.apache.roller.weblogger.pojos.WeblogBookmarkFolder; import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.roller.weblogger.util.cache.CacheManager; import org.apache.struts2.action.UploadedFilesAware; @@ -49,6 +50,9 @@ public final class BookmarksImport extends UIAction implements UploadedFilesAwar private static final long WRITE_THRESHOLD_IN_MB = 4; private static final long WRITE_THRESHOLD = WRITE_THRESHOLD_IN_MB * 1024000; + // the blogroll the links were imported into, for the redirect to it + private String folderId = null; + // uploaded opml file, injected by the actionFileUpload interceptor private UploadedFile opmlFile = null; @@ -107,8 +111,9 @@ public String save() { // notify caches CacheManager.invalidate(getActionWeblog()); - // message to user - addMessage("bookmarksImport.imported", folderName); + // the blogroll page opens the new blogroll and says it was imported + WeblogBookmarkFolder imported = bm.getFolder(getActionWeblog(), folderName); + folderId = imported == null ? null : imported.getId(); // destroy the temporary file created opmlFile.delete(); @@ -139,4 +144,8 @@ public String save() { return INPUT; } + + public String getFolderId() { + return folderId; + } } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/FolderEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/FolderEdit.java index f67dec1f1..15d897b64 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/FolderEdit.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/FolderEdit.java @@ -157,6 +157,12 @@ public void myValidate() { addError("folderForm.notFound"); return; } + // themes find the default blogroll by its name + if (!isAdd() && Bookmarks.DEFAULT_FOLDER.equals(folder.getName()) + && !Bookmarks.DEFAULT_FOLDER.equals(getBean().getName())) { + addError("folderForm.error.renameDefault"); + return; + } // make sure new name is not a duplicate of an existing folder if ( isAdd() || !getBean().getName().equals(folder.getName()) ) { if (folder.getWeblog().hasBookmarkFolder(getBean().getName())) { diff --git a/app/src/main/resources/ApplicationResources.properties b/app/src/main/resources/ApplicationResources.properties index d2b681ea8..155589471 100644 --- a/app/src/main/resources/ApplicationResources.properties +++ b/app/src/main/resources/ApplicationResources.properties @@ -56,90 +56,103 @@ generic.pagination=Pagination generic.chooseDate=Choose date generic.clearDate=Clear date -# ------------------------------------------------------------- BookmarkForm.jsp +# ------------------------------------------------------------- Bookmarks.jsp (link dialog) -bookmarkForm.add.title=Add New Bookmark -bookmarkForm.add.subtitle=Adding new bookmark in folder: -bookmarkForm.edit.title=Edit Bookmark -bookmarkForm.edit.subtitle=Editing bookmark in folder: +bookmarkForm.add.title=Add Link +bookmarkForm.edit.title=Edit Link bookmarkForm.image=Image URL -bookmarkForm.rssUrl=Newsfeed URL -bookmarkForm.url=Bookmark URL -bookmarkForm.created=Bookmark "{0}" created -bookmarkForm.updated=Bookmark "{0}" updated -bookmarkForm.required=Name and Bookmark URL are required. -bookmarkForm.badUrls=These URLs are invalid: - -bookmarkForm.requiredFields=Name and Bookmark URL are required. +bookmarkForm.imageHelp=Optional. Themes that show link images use this picture. +bookmarkForm.rssUrl=Feed URL +bookmarkForm.feedHelp=Optional. The site''s RSS or Atom feed, for themes that list feeds. +bookmarkForm.url=URL +bookmarkForm.nameHelp=The link text. For a new link it is filled in from the URL. +bookmarkForm.advanced=Feed and image +bookmarkForm.created=Link "{0}" added +bookmarkForm.updated=Link "{0}" updated +bookmarkForm.nameRequired=Name is required. +bookmarkForm.urlRequired=URL is required. +bookmarkForm.badUrl=Enter a full URL that starts with http:// or https://. # errors from validation -Bookmark.error.nameNull=Name is a required field -Bookmark.error.nameSize=Name cannot be more than 255 characters -Bookmark.error.descriptionSize=Description cannot be more than 255 characters -Bookmark.error.urlNull=Bookmark URL is a required field -Bookmark.error.urlBad=The URL you entered is not valid -Bookmark.error.imageBad=The image URL you entered is not valid -Bookmark.error.feedUrlBad=The feed URL you entered is not valid -bookmarkForm.error.duplicateName=Bookmark with that name already exists in folder +Bookmark.error.nameNull=Name is required. +Bookmark.error.nameSize=Name cannot be more than 255 characters. +Bookmark.error.descriptionSize=Description cannot be more than 255 characters. +Bookmark.error.urlNull=URL is required. +Bookmark.error.urlBad=The URL is not valid. +Bookmark.error.imageBad=The image URL is not valid. +Bookmark.error.feedUrlBad=The feed URL is not valid. +bookmarkForm.error.duplicateName=A link named "{0}" is already in this blogroll. -# ----------------------------------------------------------- BookmarksForm.jsp +# ----------------------------------------------------------- Bookmarks.jsp -bookmarksForm.root=root bookmarksForm.rootTitle=Blogroll bookmarksForm.subtitle=Manage blogrolls in weblog {0} -bookmarksForm.rootPrompt=This is your blog''s default blogroll. Most blog themes display these links (previously known as bookmarks) in the sidebar of the blog. You can also define new blogroll, but you will have to edit your theme templates if you wish to display them. -bookmarksForm.otherPrompt=This is a custom blogroll. If you wish to display these links on your blog you will have to edit your blog theme templates. +bookmarksForm.rootPrompt=This is your weblog''s default blogroll. Most themes show its links in the sidebar. Drag a link by its handle, or focus the handle and use the arrow keys, or on a touch screen use the up and down buttons, to change the order. +bookmarksForm.otherPrompt=Themes show only the default blogroll unless you edit their templates to include this one. Drag a link by its handle, or focus the handle and use the arrow keys, or on a touch screen use the up and down buttons, to change the order. -bookmarksForm.path=Blogroll -bookmarksForm.blogrollName=Blogroll name -bookmarksForm.switchTo=Switch to blogroll -bookmarksForm.deleteFolder=Delete current blogroll -bookmarksForm.newBlogroll=New blogroll... +bookmarksForm.folders=Blogrolls +bookmarksForm.blogrollName=Name +bookmarksForm.linkCount={0,choice,0#No links|1#1 link|1<{0} links} +bookmarksForm.defaultNote=Shown by most themes +bookmarksForm.deleteFolder=Delete blogroll -bookmarksForm.addBookmark=Add blogroll link +bookmarksForm.addBookmark=Add link +bookmarksForm.addLink.title=Add link to "{0}" +bookmarksForm.editLink.title=Edit link bookmarksForm.addFolder=New blogroll -bookmarksForm.delete=Delete selected -bookmarksForm.delete.confirm=Confirm Selected Link Delete -bookmarksForm.delete.areYouSure=Are you sure you want to delete the selected blogroll links? -bookmarksForm.url=URL -bookmarksForm.feedurl=Newsfeed URL -bookmarksForm.folder=Blogroll -bookmarksForm.edit.tip=Click to modify this link -bookmarksForm.folder.edit.tip=Click to edit blogroll -bookmarksForm.move=Move selected to -bookmarksForm.move.confirm=Move selected link? -bookmarksForm.selectAllLabel=Select all links -bookmarksForm.selectOneLabel=Select blogroll named {0} -bookmarksForm.visitLink=Visit -bookmarksForm.visitLink.tip=Click to visit this site - -bookmarksForm.error.move=Error performing move, parent to child moves not allowed -bookmarkForm.notFound=The requested bookmark was not found -folderForm.notFound=The requested folder was not found +bookmarksForm.delete=Delete +bookmarksForm.deleteOne.title=Delete link "{0}"? +bookmarksForm.deleteMany.title=Delete {0} links? +bookmarksForm.delete.areYouSure=This can''t be undone. +bookmarksForm.deletedOne=Link deleted +bookmarksForm.deletedMany={0} links deleted +bookmarksForm.feedurl=Feed +bookmarksForm.feedOf=Feed of {0} +bookmarksForm.moveTo=Move to +bookmarksForm.move=Move +bookmarksForm.movedOne=Link moved to "{1}" +bookmarksForm.movedMany={0} links moved to "{1}" +bookmarksForm.moveHandle=Move {0} +bookmarksForm.moveUp=Move {0} up +bookmarksForm.moveDown=Move {0} down +bookmarksForm.orderSaved=Link order saved +bookmarksForm.selectAllLabel=Select all +bookmarksForm.selectedCount={0} selected +bookmarksForm.selectOneLabel=Select {0} +bookmarksForm.visitLink.tip=Opens in a new tab +bookmarksForm.folderDeleted=Blogroll "{0}" deleted + +bookmarksForm.error.move=The links could not be moved. Reload the page and try again. +bookmarksForm.error.notFound=The selected links were not found. Reload the page and try again. +bookmarksForm.error.reorder=The links changed while you were reordering them. Reload the page and try again. +bookmarksForm.error.deleteDefault=The default blogroll can''t be deleted. +bookmarkForm.notFound=The requested link was not found +folderForm.notFound=The requested blogroll was not found categoryForm.notFound=The requested category was not found -bookmarksForm.importBookmarks=Import Blogroll via OPML -bookmarksForm.noresults=There are currently no Blogroll links - -bookmarksForm.addBlogroll.title=Add New Blogroll -bookmarksForm.editBlogroll.title=Edit Blogroll -bookmarksForm.blogroll.requiredFields=You must specify a blogroll name - -blogrollDeleteOK.removeBlogroll=Confirm Blogroll Delete -blogrollDeleteOK.areYouSure=Are you sure you want to delete blogroll and all of its links? - -# --------------------------------------------------------- Bookmarks import.jsp - -bookmarksImport.title=Import OPML Bookmarks -bookmarksImport.subtitle=Import bookmarks in to weblog {0} via OPML -bookmarksImport.prompt=Upload a standard OPML file to your bookmark collection. \ -The bookmarks will be imported into a new bookmark folder with the name \ -imported-[timestamp]. You will then be able to edit them and move them to \ -other bookmark folders if you wish. -bookmarksImport.imported=Imported OPML bookmarks into folder [{0}] -bookmarksImport.error=Error importing bookmarks: {0} +bookmarksForm.importBookmarks=Import OPML +bookmarksForm.noresults=No links in this blogroll yet. + +bookmarksForm.addBlogroll.title=New blogroll +bookmarksForm.editBlogroll.title=Rename blogroll +bookmarksForm.blogroll.requiredFields=Name is required. + +blogrollDeleteOK.removeBlogroll=Delete blogroll "{0}"? +blogrollDeleteOK.areYouSure=The blogroll "{0}" and its {1,choice,1#link|1<{1} links} will be deleted. This can''t be undone. +blogrollDeleteOK.empty=The blogroll "{0}" has no links. This can''t be undone. + +# --------------------------------------------------------- BookmarksImport.jsp + +bookmarksImport.title=Import OPML +bookmarksImport.subtitle=Import links into weblog {0} +bookmarksImport.prompt=Choose an OPML file, such as one exported from a feed reader or another blog. \ +Its links go into a new blogroll named imported- and the date and time. You can then \ +rename it, or move the links to another blogroll. +bookmarksImport.file=OPML file +bookmarksImport.fileHelp=An .opml or .xml file, up to 4 MB. +bookmarksImport.error=Error importing links: {0} bookmarksImport.import=Import # ----------------------------------------------------------------- cacheInfo.jsp @@ -500,22 +513,21 @@ error.unexpected=Unexpected error. If this error occurs again, please contact th errorPage.title=Unexpected Exception errorPage.message=Roller has encountered and logged an unexpected exception. -# --------------------------------------------------------------- FolderForm.jsp - -folderForm.add.title=Add Folder -folderForm.add.subtitle=Adding new bookmark folder +# --------------------------------------------------------------- blogroll dialog -folderForm.edit.title=Edit Folder -folderForm.edit.subtitle=Editing bookmark folder [{0}] +folderForm.add.title=New Blogroll +folderForm.edit.title=Rename Blogroll -folderForm.created=Folder created -folderForm.updated=Folder name updated +folderForm.created=Blogroll "{0}" created +folderForm.updated=Blogroll renamed +folderForm.updatedNamed=Blogroll renamed to "{0}" -folderForm.error.duplicateName=The folder name {0} is already in use, please choose another name +folderForm.error.duplicateName=A blogroll named "{0}" already exists. +folderForm.error.renameDefault=The default blogroll can''t be renamed: themes find it by its name. # errors from validation -Folder.error.nameNull=Name is a required field -Folder.error.nameSize=Name cannot be more than 255 characters +Folder.error.nameNull=Name is required. +Folder.error.nameSize=Name cannot be more than 255 characters. # ---------------------------------------------------------------------- Footer diff --git a/app/src/main/resources/ApplicationResources_de.properties b/app/src/main/resources/ApplicationResources_de.properties index 05c3c67ed..cd00d2d90 100644 --- a/app/src/main/resources/ApplicationResources_de.properties +++ b/app/src/main/resources/ApplicationResources_de.properties @@ -100,10 +100,8 @@ WeblogConfig.error.descriptionSize=Die Beschreibung darf nicht l\u00E4nger als 2 # errors from validation WeblogConfig.error.nameNull=Der Name muss eingegeben werden WeblogConfig.error.nameSize=Der Name darf nicht l\u00E4nger als 255 Zeichen sein -bookmarkForm.add.subtitle=Lesezeichen hinzuf\u00FCgen in Ordner [{0}] # ------------------------------------------------------------- BookmarkForm.jsp bookmarkForm.add.title=Neues Lesezeichen hinzuf\u00FCgen -bookmarkForm.edit.subtitle=Lesezeichen bearbeiten in Ordner [{0}] bookmarkForm.edit.title=Lesezeichen bearbeiten bookmarkForm.image=Bild URL bookmarkForm.rssUrl=Newsfeed URL @@ -112,23 +110,15 @@ bookmarkForm.url=Lesezeichen URL bookmarksForm.addBookmark=Lesezeichen hinzuf\u00FCgen bookmarksForm.addFolder=Ordner hinzuf\u00FCgen bookmarksForm.delete=L\u00F6sche Auswahl -bookmarksForm.delete.confirm=Ausgew\u00E4hlte Lesezeichen l\u00F6schen? -bookmarksForm.edit.tip=Anklicken um das Lesezeichen zu bearbeiten bookmarksForm.error.move=Fehler beim Verschieben, Elternknoten nach Kindknoten zu verschieben ist nicht erlaubt -bookmarksForm.folder=Ordner bookmarksForm.importBookmarks=Lesezeichen via OPML importieren bookmarksForm.move=Verschiebe Auswahl -bookmarksForm.move.confirm=Ausgew\u00E4hlte Lesezeichen verschieben? -bookmarksForm.path=Ordner -bookmarksForm.root=root bookmarksForm.rootPrompt=Die ist Ihr oberster Lesezeichenordner. Die Lesezeichen, die Sie hier anlegen, werden im Blogrollen Bereich Ihres Blogs erscheinen (vorausgesetzt Sie benutzen eines der Standardthemen). Sie k\u00F6nnen Lesezeichenordner anlegen, aber Sie m\u00FCssen entsprechende Lesezeichenanzeigemacros zu Ihren Weblog Schablonen hinzuf\u00FCgen, wenn Sie die Ordnerinhalte anzeigen wollen. bookmarksForm.rootTitle=Blogroll bookmarksForm.subtitle=Lesezeichen verwalten in Weblog {0} -bookmarksForm.visitLink=Besuche bookmarksForm.visitLink.tip=Klicken Sie um die Website zu besuchen bookmarksImport.error=Fehler beim Importieren von Lesezeichen: {0} bookmarksImport.import=Import -bookmarksImport.imported=OPML Lesezeichen wurden importiert in den Ordner [{0}] bookmarksImport.prompt=Laden Sie eine OPML Standarddatei zu Ihrer Lesezeichensammlung. Die Lesezeichen werden in einen neuen Lesezeichenordner mit dem Namen 'imported-[Zeitstempel]'. Danach k\u00F6nnen Sie die Lesezeichen bearbeiten und in andere Ordner verschieben. bookmarksImport.subtitle=Lesezeichen wurden via OPML in Weblog {0} importiert # ------------------------------------------------------ Bookmarks import.jsp @@ -339,10 +329,8 @@ error.upload.forbiddenFile=Es k\u00F6nnen nur Dateien hochgeladen werden, die in errorPage.message=Roller hat eine unerwartete Ausnahmebedingung festgestellt und aufgezeichnet. errorPage.title=Unerwartete Ausnahmebedingung #------------------------------------------------------------ Struts Validator -folderForm.add.subtitle=Neuen Lesezeichenordner hinzuf\u00FCgen # --------------------------------------------------------------- FolderForm.jsp folderForm.add.title=Ordner hinzuf\u00FCgen -folderForm.edit.subtitle=Bearbeite Lesezeichenordner [{0}] folderForm.edit.title=Ordner bearbeiten folderForm.error.duplicateName=Der Ordnername {0} wird bereits verwendet, bitte w\u00E4hlen Sie einen anderen # ---------------------------------------------------------------------- Footer diff --git a/app/src/main/resources/ApplicationResources_es.properties b/app/src/main/resources/ApplicationResources_es.properties index 5093202f0..193934374 100644 --- a/app/src/main/resources/ApplicationResources_es.properties +++ b/app/src/main/resources/ApplicationResources_es.properties @@ -32,24 +32,17 @@ generic.delete=Eliminar bookmarkForm.add.title=A\u00F1adir nuevo marcador -bookmarkForm.add.subtitle=A\u00F1adiendo marcador en la carpeta [{0}] bookmarkForm.edit.title=Editar marcador -bookmarkForm.edit.subtitle=Editando marcador en carpeta [{0}] bookmarkForm.image=URL de la imagen bookmarkForm.rssUrl=URL de la suscripci\u00F3n bookmarkForm.url=URL del marcador -bookmarksForm.root=ra\u00EDz bookmarksForm.rootTitle=Blogroll bookmarksForm.rootPrompt=Esta es la carpeta de marcadores de nivel superior. Los marcadores que ponga aqu\u00ED aparecer\u00E1n en la secci\u00F3n blogroll de su blog (suponiendo que est\u00E9 usando uno de los temas por defecto). Puede crear carpetas de marcadores aqu\u00ED, pero tendr\u00E1 que a\u00F1adir los correspondientes macros de visualizaci\u00F3n a sus plantillas del weblog si desea mostrar sus contenidos. bookmarksForm.subtitle=Administrar marcadores en el weblog {0} bookmarksForm.addBookmark=A\u00F1adir marcador bookmarksForm.addFolder=A\u00F1adir carpeta de marcador bookmarksForm.delete=Borrar seleccionado -bookmarksForm.folder=Carpeta de marcador -bookmarksForm.edit.tip=Haga click para editar esta marcador bookmarksForm.move=Mover el seleccionado -bookmarksForm.path=Carpeta de marcador -bookmarksForm.visitLink=Visitar bookmarksForm.visitLink.tip=Haga click para visitar este sitio bookmarksForm.error.move=Error al mover, no est\u00E1n permitidos los movimientos de padre a hijo. bookmarksImport.title=Importar marcadores OPML @@ -197,9 +190,7 @@ error.permissionDenied.reason3=Su conexi\u00F3n a la base de datos del servidor errorPage.title=Excepci\u00F3n inesperada errorPage.message=Roller ha encontrado y registrado una excepci\u00F3n inesperada. folderForm.add.title=A\u00F1adir carpeta -folderForm.add.subtitle=A\u00F1adir nuevo marcador folderForm.edit.title=Editar carpeta -folderForm.edit.subtitle=Editar carpeta de marcadores [{0}] inviteMember.title=Invitar a un nuevo miembro inviteMember.subtitle=Invitar a un nuevo usuario a que se una a este weblog inviteMember.prompt=Invitar a un usuario a unirse a este weblog seleccionando abajo su direcci\u00F3n de correo electr\u00F3nico, eligiendo un permiso para este y haciendo click en el bot\u00F3n Enviar invitaci\u00F3n. Si el usuario no se muestra en la lista de abajo, escriba las primeras letras del nombre de usuario o direcci\u00F3n de correo electr\u00F3nico para encontrar coincidencias. diff --git a/app/src/main/resources/ApplicationResources_fr.properties b/app/src/main/resources/ApplicationResources_fr.properties index f9fca8499..f9112d257 100644 --- a/app/src/main/resources/ApplicationResources_fr.properties +++ b/app/src/main/resources/ApplicationResources_fr.properties @@ -33,16 +33,13 @@ generic.delete=Effacer # ------------------------------------------------------------- BookmarkForm.jsp bookmarkForm.add.title=Ajouter un signet -bookmarkForm.add.subtitle=Ajouter un signet dans le répertoire [{0}] bookmarkForm.edit.title=Editer un signet -bookmarkForm.edit.subtitle=Editer un signet dans le répertoire [{0}] bookmarkForm.image=Lien de l'image bookmarkForm.rssUrl=Adresse du fil d'information bookmarkForm.url=Lien du signet # ----------------------------------------------------------- BookmarksForm.jsp -bookmarksForm.root=racine bookmarksForm.rootTitle=Signets #FIXME @@ -58,13 +55,7 @@ bookmarksForm.subtitle=Gérer les signets du blog{0} bookmarksForm.addBookmark=Ajouter un signet bookmarksForm.addFolder=Ajouter un répertoire de signets bookmarksForm.delete=Effacer la sélection -bookmarksForm.delete.confirm=Effacer les signets sélectionnés ? -bookmarksForm.folder=Répertoire de signets -bookmarksForm.edit.tip=Cliquez pour éditer ce signet ou répertoire bookmarksForm.move=Déplacer la selection -bookmarksForm.move.confirm=Déplacer les signets sélectionnés ? -bookmarksForm.path=Chemin -bookmarksForm.visitLink=Visiter bookmarksForm.visitLink.tip=Cliquez ici pour visiter ce site bookmarksForm.error.move=Erreur : déplacer un répertoire parent dans un sous-répertoire est interdit @@ -79,7 +70,6 @@ bookmarksImport.prompt=Importer un fichier au standard OPML dans votre collectio Les signets seront importés dans un nouveau répertoire de signets portant le nom \ imported-[date]. Vous pourrez alors les éditer et les déplacer dans d'autres répertoires \ si vous le désirez. -bookmarksImport.imported=Signets OPML importés dans le répertoire [{0}] bookmarksImport.error=Une erreur est survenue durant l'importation de signets : {0} bookmarksImport.import=Importer @@ -380,10 +370,8 @@ Pour résoudre ce problème, veuillez contacter votre administrateur système. # --------------------------------------------------------------- FolderForm.jsp folderForm.add.title=Ajouter un répertoire -folderForm.add.subtitle=Ajoute un répertoire de signets dans le répertoire [{0}] folderForm.edit.title=Editer un répertoire -folderForm.edit.subtitle=Edite le répertoire de signets dans le répertoire [{0}] folderForm.error.duplicateName=Le répertoire '{0}' est en cours d'utilisation. \ Vous devez choisir un autre répertoire. diff --git a/app/src/main/resources/ApplicationResources_ja.properties b/app/src/main/resources/ApplicationResources_ja.properties index 1400360ac..49472f139 100644 --- a/app/src/main/resources/ApplicationResources_ja.properties +++ b/app/src/main/resources/ApplicationResources_ja.properties @@ -32,16 +32,13 @@ generic.delete=\u524A\u9664 # ------------------------------------------------------------- BookmarkForm.jsp bookmarkForm.add.title=\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u8FFD\u52A0\u3059\u308B -bookmarkForm.add.subtitle=\u30D5\u30A9\u30EB\u30C0[{0}]\u306B\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u8FFD\u52A0\u3059\u308B bookmarkForm.edit.title=\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u7DE8\u96C6\u3059\u308B -bookmarkForm.edit.subtitle=\u30D5\u30A9\u30EB\u30C0[{0}]\u306E\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u7DE8\u96C6\u3059\u308B bookmarkForm.image=\u753B\u50CFURL bookmarkForm.rssUrl=\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9\u306EURL bookmarkForm.url=\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u306EURL # ----------------------------------------------------------- BookmarksForm.jsp -bookmarksForm.root=\u30EB\u30FC\u30C8 bookmarksForm.rootTitle=Blogroll bookmarksForm.rootPrompt=\u30E1\u30A4\u30F3\u306E\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u30D5\u30A9\u30EB\u30C0\u3067\u3059\u3002\u3053\u3053\u3067\u8A2D\u5B9A\u3057\u305F\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u306F\u30D6\u30ED\u30B0\u306EBlogroll\u30BB\u30AF\u30B7\u30E7\u30F3\u306B\u8868\u793A\u3055\u308C\u307E\u3059(\u30C7\u30D5\u30A9\u30EB\u30C8\u306E\u30C6\u30FC\u30DE\u3092\u4F7F\u3063\u3066\u3044\u308B\u5834\u5408)\u3002\u8FFD\u52A0\u306E\u30D5\u30A9\u30EB\u30C0\u3092\u4F5C\u308B\u3053\u3068\u3082\u3067\u304D\u307E\u3059\u304C\u3001\u305D\u306E\u30D5\u30A9\u30EB\u30C0\u306E\u5185\u5BB9\u3092\u8868\u793A\u3057\u305F\u3044\u5834\u5408\u306F\u5BFE\u5FDC\u3059\u308B\u30DE\u30AF\u30ED\u3092\u30D6\u30ED\u30B0\u306E\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u306B\u8FFD\u52A0\u3057\u306A\u3051\u308C\u3070\u306A\u308A\u307E\u305B\u3093\u3002 bookmarksForm.subtitle={0}\u306E\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u7BA1\u7406 @@ -49,11 +46,7 @@ bookmarksForm.subtitle={0}\u306E\u30D6\u30C3\u30AF\u30DE\u30FC\u30A bookmarksForm.addBookmark=\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u8FFD\u52A0 bookmarksForm.addFolder=\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u30D5\u30A9\u30EB\u30C0\u8FFD\u52A0 bookmarksForm.delete=\u9078\u629E\u3057\u305F\u3082\u306E\u3092\u524A\u9664 -bookmarksForm.folder=\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u30D5\u30A9\u30EB\u30C0 -bookmarksForm.edit.tip=\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u307E\u305F\u306F\u30D5\u30A9\u30EB\u30C0\u3092\u7DE8\u96C6 bookmarksForm.move=\u9078\u629E\u3057\u305F\u3082\u306E\u3092\u79FB\u52D5 -bookmarksForm.path=\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u30D5\u30A9\u30EB\u30C0 -bookmarksForm.visitLink=\u8A2A\u554F bookmarksForm.visitLink.tip=\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u8A2A\u554F bookmarksForm.error.move=\u89AA\u304B\u3089\u5B50\u3078\u306E\u79FB\u52D5\u306F\u8A31\u53EF\u3055\u308C\u3066\u3044\u306A\u3044\u305F\u3081\u79FB\u52D5\u3067\u304D\u307E\u305B\u3093 @@ -67,7 +60,6 @@ bookmarksImport.prompt=OPML\u5F62\u5F0F\u3067\u8A18\u8FF0\u3055\u308C\u305F\u30D \u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3067\u304D\u307E\u3059\u3002\u30A4\u30F3\u30DD\u30FC\u30C8\u3055\u308C\u305F\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u306F\u300Cimported-[timestamp]\u300D\ \u30D5\u30A9\u30EB\u30C0\u3078\u4FDD\u5B58\u3055\u308C\u307E\u3059\u3002\u3053\u308C\u3089\u306F\u65E2\u5B58\u306E\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3068\u540C\u3058\u3088\u3046\u306B\ \u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u81EA\u4F53\u306E\u7DE8\u96C6\u3084\u30D5\u30A9\u30EB\u30C0\u79FB\u52D5\u306A\u3069\u306E\u7DE8\u96C6\u3092\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002 -bookmarksImport.imported=OPML\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u30D5\u30A9\u30EB\u30C0[{0}]\u3078\u30A4\u30F3\u30DD\u30FC\u30C8\u3057\u307E\u3057\u305F bookmarksImport.error=\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF{0}\u306E\u30A4\u30F3\u30DD\u30FC\u30C8\u30A8\u30E9\u30FC # ----------------------------------------------------------------- cacheInfo.jsp @@ -310,9 +302,7 @@ errorPage.message=Roller\u304C\u4F8B\u5916\u3092\u8A18\u9332\u3057\u307E\u3057\u # --------------------------------------------------------------- FolderForm.jsp folderForm.add.title=\u30D5\u30A9\u30EB\u30C0\u8FFD\u52A0 -folderForm.add.subtitle=\u65B0\u3057\u3044\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u30D5\u30A9\u30EB\u30C0\u3092\u8FFD\u52A0\u3057\u307E\u3059 folderForm.edit.title=\u30D5\u30A9\u30EB\u30C0\u7DE8\u96C6 -folderForm.edit.subtitle=\u30D5\u30A9\u30EB\u30C0[{0}]\u3092\u7DE8\u96C6\u3057\u307E\u3059 # ------------------------------------------------------ index / setup page @@ -900,7 +890,6 @@ comment.validator.bannedwordslistMessage=\u30B3\u30E1\u30F3\u30C8\u306B\u30D6\u3 comment.validator.excessSizeMessage=\u30B3\u30E1\u30F3\u30C8\u304C{0}\u6587\u5B57\u3092\u8D85\u3048\u3066\u3044\u307E\u3059 comment.validator.excessLinksMessage=\u30B3\u30E1\u30F3\u30C8\u306B{0}\u500B\u4EE5\u4E0A\u306E\u30EA\u30F3\u30AF\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059 Entry.error.textNull=\u672C\u6587\u306F\u5FC5\u9808\u9805\u76EE\u3067\u3059 -bookmarksForm.delete.confirm=\u9078\u629E\u3057\u305F\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u524A\u9664\u3057\u307E\u3059\u304B\uFF1F commentManagement.bulkDeletePrompt2=\u3053\u308C\u3089\u3059\u3079\u3066\u3092\u524A\u9664\u3057\u307E\u3059\u304B\uFF1F CreateWeblog.error.descriptionSize=\u8A73\u7D30\u306F255\u6587\u5B57\u4EE5\u5185\u3067\u306A\u3051\u308C\u3070\u3044\u3051\u307E\u305B\u3093 Template.error.descriptionSize=\u8A73\u7D30\u306F255\u6587\u5B57\u4EE5\u5185\u3067\u306A\u3051\u308C\u3070\u3044\u3051\u307E\u305B\u3093 @@ -934,7 +923,6 @@ loginPage.loginOpenID=\u30ED\u30B0\u30A4\u30F3 configForm.pageMaxEntries=\u30DA\u30FC\u30B8\u3042\u305F\u308A\u306E\u6700\u5927\u8868\u793A\u30A8\u30F3\u30C8\u30EA\u6570 yourWebsites.userCount=\u30E1\u30F3\u30D0\u30FC commentServlet.email.thereAreSystemMessages=Roller\u30B7\u30B9\u30C6\u30E0\u30E1\u30C3\u30BB\u30FC\u30B8 -bookmarksForm.move.confirm=\u9078\u629E\u3057\u305F\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u79FB\u52D5\u3057\u307E\u3059\u304B\uFF1F Bookmark.error.nameSize=\u540D\u524D\u306F255\u6587\u5B57\u4EE5\u5185\u3067\u306A\u3051\u308C\u3070\u3044\u3051\u307E\u305B\u3093 CreateWeblog.error.nameSize=\u540D\u524D\u306F255\u6587\u5B57\u4EE5\u5185\u3067\u306A\u3051\u308C\u3070\u3044\u3051\u307E\u305B\u3093 WeblogConfig.error.nameSize=\u540D\u524D\u306F255\u6587\u5B57\u4EE5\u5185\u3067\u306A\u3051\u308C\u3070\u3044\u3051\u307E\u305B\u3093 @@ -1128,7 +1116,6 @@ userRegister.success.ready=\u30D5\u30A9\u30FC\u30E0\u306F\u554F\u984C\u306A\u304 pageForm.tip=\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092\u7DE8\u96C6\u3057\u3066\u3001\u751F\u6210\u3055\u308C\u308B\u30DA\u30FC\u30B8\u3092\u5909\u66F4\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3067\u4F7F\u7528\u3059\u308B\u3053\u3068\u306E\u3067\u304D\u308B\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u304A\u3088\u3073\u30B3\u30FC\u30C9\u306B\u3064\u3044\u3066\u306FRoller\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u30FB\u30AC\u30A4\u30C9\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u3053\u308C\u306F\u4E0A\u7D1A\u30E6\u30FC\u30B6\u30FC\u306E\u305F\u3081\u306E\u3082\u306E\u3067\u3042\u308A\u3001\u3082\u3057\u3042\u306A\u305F\u304CHTML\u306B\u8A73\u3057\u304F\u306A\u3044\u5834\u5408\u306F\u305D\u306E\u307E\u307E\u306B\u3057\u3066\u304A\u3044\u305F\u65B9\u304C\u826F\u3044\u3067\u3057\u3087\u3046\u3002 planetGroupSubs.column.feedUrl=\u30D5\u30A3\u30FC\u30C9URL mediaFileSuccess.createPost=\u65B0\u3057\u304F\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u3092\u4F7F\u3063\u3066\u65B0\u3057\u3044\u30A8\u30F3\u30C8\u30EA\u3092\u4F5C\u6210\u3059\u308B -bookmarkForm.requiredFields={0}\u3068{1}\u306F\u5FC5\u9808\u3067\u3059\u3002 planetGroupSubs.column.title=\u30BF\u30A4\u30C8\u30EB bookmarksForm.deleteFolder.confirm=\u30D5\u30A9\u30EB\u30C0\u3068\u3001\u30D5\u30A9\u30EB\u30C0\u306B\u542B\u307E\u308C\u308B\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u524A\u9664\u3057\u3066\u3088\u308D\u3057\u3044\u3067\u3059\u304B? planetSubscription.error=\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9URL\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044 @@ -1145,7 +1132,6 @@ generic.name=\u540D\u524D mediaFileView.filesTagged=\u30BF\u30B0\u304C {0} \u306E\u30D5\u30A1\u30A4\u30EB weblogEdit.hasComments=\u30B3\u30E1\u30F3\u30C8 [{1}] categoryDeleteOK.title=\u30AB\u30C6\u30B4\u30EA\u306E\u524A\u9664 -bookmarksForm.url=URL mediaFile.move.success=\u30E1\u30C7\u30A3\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB\u306F\u6B63\u5E38\u306B\u79FB\u52D5\u3055\u308C\u307E\u3057\u305F\u3002 mediaFileView.noResults=\u6761\u4EF6\u306B\u5408\u81F4\u3059\u308B\u30D5\u30A1\u30A4\u30EB\u306F\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u4ED6\u306E\u6761\u4EF6\u3092\u8A66\u3057\u3066\u304F\u3060\u3055\u3044\u3002 planetGroups.error.title=\u30BF\u30A4\u30C8\u30EB\u306F\u5FC5\u9808\u9805\u76EE\u3067\u3059 @@ -1327,7 +1313,6 @@ weblogEdit.scheduledEntry=\u30A8\u30F3\u30C8\u30EA\u30FC\u306E\u516C\u958B\u304C frontpageConfig.weblogs.error=\u30D6\u30ED\u30B0\u3078\u306E\u30A2\u30AF\u30BB\u30B9\u4E2D\u306B\u4E88\u671F\u305B\u306C\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F themeEditor.yourCustomStylesheet=\u30AB\u30B9\u30BF\u30E0\u30FB\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u30FB\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u3092\u4F7F\u7528\u3057\u3066\u3044\u307E\u3059\u3002 mediaFileAdd.copyright=\u8457\u4F5C\u6A29\u8868\u793A -bookmarksForm.folder.edit.tip=\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u7DE8\u96C6 installer.aboutTheException=\u4EE5\u4E0A\u306E\u60C5\u5831\u3067\u554F\u984C\u304C\u7279\u5B9A\u3067\u304D\u306A\u3044\u5834\u5408\u3001\u3082\u3046\u5C11\u3057\u8A73\u7D30\u306A\u60C5\u5831\u306F\u3053\u3061\u3089\u3067\u3059\u3002\u6839\u672C\u306E\u539F\u56E0\u306F\u3001\u3053\u306E\u30BF\u30A4\u30D7\u306E\u4F8B\u5916\u3067\u3059 mediaFileEdit.tags=\u30BF\u30B0\uFF08\u30B9\u30DA\u30FC\u30B9\u3067\u5206\u5272\uFF09 macro.weblog.noEntriesForCategory=\u6307\u5B9A\u3055\u308C\u305F\u30AB\u30C6\u30B4\u30EA\u306B\u306F\u30A8\u30F3\u30C8\u30EA\u30FC\u304C\u3042\u308A\u307E\u305B\u3093 diff --git a/app/src/main/resources/ApplicationResources_ko.properties b/app/src/main/resources/ApplicationResources_ko.properties index 423e8f03b..eabfc1a94 100644 --- a/app/src/main/resources/ApplicationResources_ko.properties +++ b/app/src/main/resources/ApplicationResources_ko.properties @@ -32,10 +32,8 @@ generic.delete=\uc0ad\uc81c # ------------------------------------------------------------- BookmarkForm.jsp bookmarkForm.add.title=\uc0c8 \ubd81\ub9c8\ud06c \ucd94\uac00 -bookmarkForm.add.subtitle=[{0}] \ud3f4\ub354\uc5d0 \uc0c8 \ubd81\ub9c8\ud06c \ucd94\uac00 bookmarkForm.edit.title=\ubd81\ub9c8\ud06c \ud3b8\uc9d1 -bookmarkForm.edit.subtitle=[{0}] \ud3f4\ub354\uc758 \ubd81\ub9c8\ud06c \ud3b8\uc9d1 bookmarkForm.image=\uc774\ubbf8\uc9c0 URL bookmarkForm.rssUrl=\ub274\uc2a4 \ud53c\ub4dc URL @@ -53,7 +51,6 @@ Bookmark.error.feedUrlBad=\uc785\ub825\ud558\uc2e0 \ud53c\ub4dc URL\uc774 \uc720 # ----------------------------------------------------------- BookmarksForm.jsp -bookmarksForm.root=\ub8e8\ud2b8 bookmarksForm.rootTitle=\ubd81\ub9c8\ud06c bookmarksForm.rootPrompt=\ @@ -68,13 +65,7 @@ bookmarksForm.subtitle=\uc6f9\ub85c\uadf8 {0} \ub0b4\uc758 \ubd81\u bookmarksForm.addBookmark=\ubd81\ub9c8\ud06c \ucd94\uac00 bookmarksForm.addFolder=\ubd81\ub9c8\ud06c \ud3f4\ub354 \ucd94\uac00 bookmarksForm.delete=\uc120\ud0dd \ud56d\ubaa9 \uc0ad\uc81c -bookmarksForm.delete.confirm=\uc120\ud0dd\ub41c \ubd81\ub9c8\ud06c\ub4e4\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -bookmarksForm.folder=\ubd81\ub9c8\ud06c \ud3f4\ub354 -bookmarksForm.edit.tip=\uc774 \ud3f4\ub354 \ub610\ub294 \ubd81\ub9c8\ud06c\ub97c \ud3b8\uc9d1\ud558\uc2dc\ub824\uba74 \ud074\ub9ad\ud558\uc2ed\uc2dc\uc624. bookmarksForm.move=\uc120\ud0dd \ud56d\ubaa9 \uc774\ub3d9 -bookmarksForm.move.confirm=\uc120\ud0dd\ub41c \ubd81\ub9c8\ud06c\ub4e4\uc744 \uc774\ub3d9\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -bookmarksForm.path=\uacbd\ub85c -bookmarksForm.visitLink=\ubc29\ubb38 bookmarksForm.visitLink.tip=\uc774 \uc0ac\uc774\ud2b8\ub97c \ubc29\ubb38\ud558\uc2dc\ub824\uba74 \ud074\ub9ad\ud558\uc2ed\uc2dc\uc624. bookmarksForm.error.move=\uc774\ub3d9 \uc911 \uc624\ub958\uac00 \ubc1c\uc0dd\ud558\uc600\uc2b5\ub2c8\ub2e4. \ubd80\ubaa8 \ud3f4\ub354\ub294 \uc790\uc2dd \ud3f4\ub354\ub85c \uc774\ub3d9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. @@ -87,7 +78,6 @@ bookmarksImport.subtitle=OPML\uc744 \ud1b5\ud574 \uc6f9\ub85c\uadf8 {0}{0} \u535A\u5BA2\u4E2D\u7684\u4E66\u7B7E @@ -81,27 +75,17 @@ bookmarksForm.subtitle=\u7BA1\u7406 {0} \u535A\u5BA2\u4E2D\u7684\u4 bookmarksForm.rootPrompt=\u8FD9\u662F\u4F60\u7684\u4E3B\u4E66\u7B7E\u5939\u3002\u8FD9\u91CC\u4FDD\u7559\u7684\u4E66\u7B7E\u4F1A\u5728\u535A\u5BA2\u7684\u6536\u85CF\u680F\u4E2D\u663E\u793A\uFF08\u8FD9\u91CC\u5047\u8BBE\u4F60\u4F7F\u7528\u9ED8\u8BA4\u4E3B\u9898\uFF09\u3002\u4F60\u8FD8\u53EF\u4EE5\u5EFA\u7ACB\u65B0\u7684\u4E66\u7B7E\u5939\uFF0C\u4F46\u662F\u5982\u679C\u4F60\u9700\u8981\u663E\u793A\u65B0\u4E66\u7B7E\u5939\u7684\u5185\u5BB9\uFF0C\u5C31\u9700\u8981\u5728\u4F60\u7684\u535A\u5BA2\u6A21\u677F\u4E2D\u5F15\u7528\u76F8\u5E94\u7684\u5B8F\u6765\u4F7F\u7528\u5B83\u3002 bookmarksForm.otherPrompt=\u8FD9\u662F\u4E00\u4E2A\u81EA\u5B9A\u4E49\u535A\u5BA2\u7FA4\u3002\u5982\u679C\u4F60\u60F3\u8981\u5728\u4F60\u7684\u535A\u5BA2\u4E0A\u663E\u793A\u8FD9\u4E9B\u94FE\u63A5\u5219\u5FC5\u987B\u7F16\u8F91\u4F60\u7684\u535A\u5BA2\u4E3B\u9898\u6A21\u677F\u3002 -bookmarksForm.path=\u4E66\u7B7E\u5939 bookmarksForm.blogrollName=\u535A\u5BA2\u7FA4\u540D\u79F0 -bookmarksForm.switchTo=\u5207\u6362\u5230\u535A\u5BA2\u7FA4 bookmarksForm.deleteFolder=\u5220\u9664\u4E66\u7B7E\u5939 -bookmarksForm.newBlogroll=\u65B0\u5EFA\u535A\u5BA2\u7FA4... bookmarksForm.addBookmark=\u6DFB\u52A0\u4E66\u7B7E bookmarksForm.addFolder=\u65B0\u5EFA\u4E66\u7B7E\u5939 bookmarksForm.delete=\u5220\u9664\u9009\u4E2D\u7684 -bookmarksForm.delete.confirm=\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u4E66\u7B7E\u5417\uFF1F bookmarksForm.delete.areYouSure=\u4F60\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u535A\u5BA2\u7FA4\u94FE\u63A5\u5417\uFF1F -bookmarksForm.url=URL bookmarksForm.feedurl=\u65B0\u95FB\u6E90URL -bookmarksForm.folder=\u4E66\u7B7E\u5939 -bookmarksForm.edit.tip=\u70B9\u51FB\u4EE5\u7F16\u8F91\u6B64\u4E66\u7B7E -bookmarksForm.folder.edit.tip=\u70B9\u51FB\u4EE5\u7F16\u8F91\u6B64\u4E66\u7B7E\u5939 bookmarksForm.move=\u79FB\u52A8\u81F3 -bookmarksForm.move.confirm=\u786E\u5B9A\u8981\u79FB\u52A8\u9009\u4E2D\u7684\u4E66\u7B7E\u5417\uFF1F bookmarksForm.selectAllLabel=\u9009\u62E9\u6240\u6709\u4E66\u7B7E bookmarksForm.selectOneLabel=\u9009\u62E9\u4E66\u7B7E {0} -bookmarksForm.visitLink=\u8BBF\u95EE bookmarksForm.visitLink.tip=\u70B9\u51FB\u4EE5\u8BBF\u95EE\u6B64\u7AD9\u70B9 bookmarksForm.error.move=\u79FB\u52A8\u9519\u8BEF\uFF0C\u4E0D\u5141\u8BB8\u5C06\u7236\u6587\u4EF6\u5939\u79FB\u52A8\u5230\u5B83\u7684\u5B50\u6587\u4EF6\u5939\u4E2D @@ -122,7 +106,7 @@ bookmarksImport.subtitle=\u5BFC\u5165OPML\u683C\u5F0F\u4E66\u7B7E\u5230\u535A\u5 bookmarksImport.prompt=\u4E0A\u4F20\u6807\u51C6OPML\u683C\u5F0F\u7684\u4E66\u7B7E\u6587\u4EF6\u3002\u8FD9\u4E9B\u4E66\u7B7E\u5C06\u4F1A\u5BFC\u5165\u5230\u4E00\u4E2A\u65B0\u7684\u4E66\u7B7E\u5939\uFF08\u4E66\u7B7E\u5939\u7684\u540D\u5B57\u4F7F\u7528\u9ED8\u8BA4\u7684\u65F6\u95F4\u6233\uFF09\u3002\u5BFC\u5165\u4E4B\u540E\u4F60\u53EF\u4EE5\u8FDB\u884C\u7F16\u8F91\u6216\u8005\u79FB\u52A8\u5230\u5176\u5B83\u4E66\u7B7E\u5939\u3002 -bookmarksImport.imported=\u5BFC\u5165OPML\u683C\u5F0F\u4E66\u7B7E\u5230\u4E66\u7B7E\u5939 [{0}] + bookmarksImport.error=\u5BFC\u5165\u4E66\u7B7E\u9519\u8BEF: {0} bookmarksImport.import=\u5BFC\u5165 @@ -472,10 +456,8 @@ errorPage.message=\u7CFB\u7EDF\u5DF2\u53D1\u751F\u5E76\u8BB0\u5F55\u4E86\u4E00\u # --------------------------------------------------------------- FolderForm.jsp folderForm.add.title=\u6DFB\u52A0\u4E66\u7B7E\u5939 -folderForm.add.subtitle=\u6DFB\u52A0\u65B0\u7684\u4E66\u7B7E\u5939 folderForm.edit.title=\u7F16\u8F91\u4E66\u7B7E\u5939 -folderForm.edit.subtitle=\u6B63\u5728\u7F16\u8F91\u4E66\u7B7E\u5939 [{0}] folderForm.created=\u5DF2\u521B\u5EFA\u6587\u4EF6\u5939 folderForm.updated=\u5DF2\u66F4\u65B0\u6587\u4EF6\u5939\u540D\u79F0 diff --git a/app/src/main/resources/struts.xml b/app/src/main/resources/struts.xml index d6921947a..84226b6a3 100644 --- a/app/src/main/resources/struts.xml +++ b/app/src/main/resources/struts.xml @@ -480,7 +480,7 @@ .Bookmarks - delete,deleteFolder,execute,folderCreated,move,view + delete,deleteFolder,execute,folderCreated,move,reorder .BookmarksImport - bookmarks + + + bookmarks!folderCreated + ${weblog} + ${folderId} + execute,save diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/Bookmarks.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/Bookmarks.jsp index a2182d0f2..182dcb231 100644 --- a/app/src/main/webapp/WEB-INF/jsps/editor/Bookmarks.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/editor/Bookmarks.jsp @@ -17,838 +17,418 @@ --%> <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %> +<%-- Blogroll: the weblog's blogrolls (bookmark folders) on the left, or in a strip above on a + phone, and the links of one of them. Links are dragged (or moved with the arrow keys or touch-screen buttons on their + handle) to reorder; selected links can be moved or deleted. Dialogs post with AJAX and reload + the page, which then shows a short confirmation. Text the script needs is in data-* attributes. --%> + + + + + +
" + data-msg-link-saved="" + data-msg-folder-added="" + data-msg-folder-renamed="" + data-msg-folder-deleted="" + data-msg-deleted-one="" + data-msg-deleted-many="" + data-msg-moved-one="" + data-msg-moved-many="" + data-msg-order-saved="" + data-msg-error="" + data-msg-name-required="" + data-msg-url-required="" + data-msg-bad-url="" + data-msg-folder-name-required="" + data-msg-selected="" + data-title-add-link="" + data-title-edit-link="" + data-title-add-folder="" + data-title-rename-folder="" + data-title-delete-one="" + data-title-delete-many=""> + +
+

+ + + +

+
+ + + + + +
+
-<%-- -Blogroll link management - -We used to call them Bookmarks and Folders, now we call them Blogroll links and Blogrolls. ---%> - -<%-- ================================================================================================ --%> - -<%-- Main blogroll/folder management interface, a checkbox-table with some buttons --%> - -

- - -

-
- -

-
- - -<%-- table of blogroll links with selection checkboxes, wrapped in a form --%> - - - - - - - <%-- for default blogroll, show page "tip" and read-only folder name --%> - - - -
- -
-
+
+ + <%-- the blogrolls; a GET link each, so a blogroll can be reloaded, bookmarked and reached with Back --%> + + +
+ +
+
+

+ + + + · + +
-
- - - - - - <%-- Blogroll / Folder Name --%> - - <%-- for other blogrolls, show textarea so user can rename it --%> - <%-- don't use Struts tags here so button can be on same line as text input --%> - -
- -
-
- - + + - -
+
-
+

+ + +

- <%-- allow user to select the bookmark folder to view --%> + <%-- carries the salt for the reorder post; the link ids are added by the script --%> + + + + + -
- -
- -
-
+ - - - - - - - - - - - - <%-- Bookmarks --%> - - - - - - - - - - - - - - - + + + + - - - +
+ +

+
+ + + + + +
+
+ + -
- "/> -
- " - value=""/> - - - - - - - " target="_blank"> - - - - + <%-- move and delete the selected links; the ids are added by the script --%> + + + + +
+ + +
+
+ +
+ + + +
+
+ +
+
+ +
- - " - data-bookmark-name="" - data-bookmark-url="" - data-bookmark-feed-url="" - data-bookmark-description="" - data-bookmark-image=""> - - - -
- -
- - <%-- Add new blogroll link --%> - - - - <%-- Move-selected button --%> - - <%-- Move-to combo-box --%> - - - - - <%-- Delete-selected button --%> - " type="button" - class="btn btn-danger" style="float:left;" - onclick="confirmDeleteSelected();return false;"/> - - - - <%-- Delete the whole blogroll --%> - - - - - - - -<%-- -------------------------------------------------------- --%> - -<%-- JavaScript for Main blogroll/folder management interface --%> - - - - -<%-- ================================================================================================ --%> - -<%-- add/edit blogroll / folder form --%> +
-
- - - -<%-- ========================================================================================== --%> - -<%-- delete blogroll confirmation modal --%> - -