[Pkg-mozext-commits] [sage-extension] 05/54: Context menu for the item list. Bug 7014
David Prévot
taffit at moszumanska.debian.org
Fri May 1 03:10:36 UTC 2015
This is an automated email from the git hooks/post-receive script.
taffit pushed a commit to tag sage_1_3
in repository sage-extension.
commit 0836aa5950ebb5709cc287f83096a095c1523d80
Author: Erik Arvidsson <erik.arvidsson at gmail.com>
Date: Thu Sep 9 21:12:55 2004 +0000
Context menu for the item list. Bug 7014
---
src/sage/content/sage.js | 1337 +++++++++++++++++++--------------
src/sage/content/sage.xul | 266 +++----
src/sage/locale/ca-CA/sage.dtd | 1 +
src/sage/locale/ca-CA/sage.properties | 6 +
src/sage/locale/en-US/sage.dtd | 104 +--
src/sage/locale/en-US/sage.properties | 174 ++---
src/sage/locale/es-ES/sage.dtd | 105 +--
src/sage/locale/es-ES/sage.properties | 174 ++---
src/sage/locale/fr-FR/sage.properties | 6 +-
src/sage/locale/hu-HU/sage.dtd | 105 +--
src/sage/locale/hu-HU/sage.properties | 176 ++---
src/sage/locale/it-IT/sage.dtd | 105 +--
src/sage/locale/it-IT/sage.properties | 174 ++---
src/sage/locale/ja-JP/sage.dtd | 107 +--
src/sage/locale/ja-JP/sage.properties | 176 ++---
src/sage/locale/nl-NL/sage.dtd | 104 +--
src/sage/locale/nl-NL/sage.properties | 174 ++---
src/sage/locale/zh-TW/sage.dtd | 104 +--
src/sage/locale/zh-TW/sage.properties | 174 ++---
19 files changed, 1937 insertions(+), 1635 deletions(-)
diff --git a/src/sage/content/sage.js b/src/sage/content/sage.js
index 0000450..4b0cded 100755
--- a/src/sage/content/sage.js
+++ b/src/sage/content/sage.js
@@ -1,553 +1,784 @@
-const USER_AGENT = CommonFunc.USER_AGENT;
-
-const RESULT_OK = 0;
-const RESULT_PARSE_ERROR = 1;
-const RESULT_NOT_RSS = 2;
-const RESULT_NOT_FOUND = 3;
-const RESULT_NOT_AVAILABLE = 4;
-const RESULT_ERROR_FAILURE = 5;
-
-var resultStrArray = null;
-
- // XUL Object
-var strRes // stringbundle Object
-var bookmarksTree;
-var rssItemListBox;
-var rssStatusImage;
-var rssStatusLabel;
-var rssTitleLabel;
-var rssItemToolTip;
-
-var currentFeed;
-var httpReq;
-var prefObserverSageFolder;
-var responseXML;
-var lastResource;
-var rssLoading = false;
-var sageFolderID = "";
-var enableTooltip = true;
-var popupTimeoutId=0;
-
-
-function init() {
- bookmarksTree = document.getElementById("bookmarksTree");
- rssItemListBox = document.getElementById("rssItemListBox");
- rssStatusImage = document.getElementById("rssStatusImage");
- rssStatusLabel = document.getElementById("rssStatusLabel");
- rssTitleLabel = document.getElementById("rssTitleLabel");
- rssItemToolTip = document.getElementById("rssItemToolTip");
-
- strRes = document.getElementById("strRes");
- resultStrArray = new Array(
- strRes.getString("RESULT_OK_STR"),
- strRes.getString("RESULT_PARSE_ERROR_STR"),
- strRes.getString("RESULT_NOT_RSS_STR"),
- strRes.getString("RESULT_NOT_FOUND_STR"),
- strRes.getString("RESULT_NOT_AVAILABLE_STR"),
- strRes.getString("RESULT_ERROR_FAILURE_STR")
- );
-
- // if feed folder has not been set, assume new user and install default feed folder and demo feeds
- if(!CommonFunc.getPrefValue(CommonFunc.RSS_READER_FOLDER_ID, "str", null)) {
- logMessage("setting default preferences...");
- var new_folder = BMSVC.createFolderInContainer("Sage Feeds", RDF.GetResource("NC:BookmarksRoot"), null);
- CommonFunc.setPrefValue(CommonFunc.RSS_READER_FOLDER_ID, "str", new_folder.Value);
- if(BMSVC.createBookmarkInContainer.length == 7) { // firefox 0.8 and lower
- BMSVC.createBookmarkInContainer("BBC News | News Front Page | World Edition", "http://news.bbc.co.uk/rss/newsonline_world_edition/front_page/rss091.xml", null, "updated", null, new_folder, null);
- BMSVC.createBookmarkInContainer("Yahoo! News - Sports", "http://rss.news.yahoo.com/rss/sports", null, "updated", null, new_folder, null);
- BMSVC.createBookmarkInContainer("Sage Project News", "http://sage.mozdev.org/rss.xml", null, "updated", null, new_folder, null);
- } else {
- BMSVC.createBookmarkInContainer("BBC News | News Front Page | World Edition", "http://news.bbc.co.uk/rss/newsonline_world_edition/front_page/rss091.xml", null, "updated", null, null, new_folder, null);
- BMSVC.createBookmarkInContainer("Yahoo! News - Sports", "http://rss.news.yahoo.com/rss/sports", null, "updated", null, null, new_folder, null);
- BMSVC.createBookmarkInContainer("Sage Project News", "http://sage.mozdev.org/rss.xml", null, "updated", null, null, new_folder, null);
- }
- setCheckbox("chkShowSearchBar", "false");
- setCheckbox("chkShowTooltip", "true");
- setCheckbox("chkShowFeedItemList", "true");
- }
-
- // get feed folder location
- sageFolderID = CommonFunc.getPrefValue(CommonFunc.RSS_READER_FOLDER_ID, "str", "NC:BookmarksRoot");
- // check for changes to the feed folder
- prefObserverSageFolder = CommonFunc.addPrefListener(CommonFunc.RSS_READER_FOLDER_ID, sageFolderChanged);
- // set feed folder location
- bookmarksTree.tree.setAttribute("ref", sageFolderID);
- // select first entry
- bookmarksTree.treeBoxObject.selection.select(0);
-
- FeedSearch.init();
- toggleShowSearchBar();
- toggleShowFeedItemList();
-
- logMessage("initialized");
-}
-
-function discoverFeeds() {
- window.openDialog("chrome://sage/contents/discover_feeds.xul", "sage_discover_feeds", "chrome,modal,close", bookmarksTree);
-}
-
- // �X�V���ꂽRSS�̂ݕ\��
-function showOnlyUpdated() {
- if(getCheckboxCheck("chkOnlyUpdate")) {
- var findURL = "find:datasource=rdf:bookmarks&match=";
- findURL += CommonFunc.BM_DESCRIPTION;
- findURL += "&method=is&text=updated";
- bookmarksTree.tree.setAttribute("ref", findURL);
- } else {
- bookmarksTree.tree.setAttribute("ref", sageFolderID);
- }
-}
-
-function sageFolderChanged(subject, topic, prefName) {
- // observe Preference
- sageFolderID = CommonFunc.getPrefValue(CommonFunc.RSS_READER_FOLDER_ID, "str", "NC:BookmarksRoot");
- bookmarksTree.tree.setAttribute("ref", sageFolderID);
- bookmarksTree.treeBoxObject.selection.select(0);
-}
-
-function done() {
- if(prefObserverSageFolder) {
- CommonFunc.removePrefListener(prefObserverSageFolder);
- }
-
- if(rssLoading) {
- httpReq.abort();
- rssLoading = false;
- }
- UpdateChecker.done();
-
- logMessage("shutdown");
-}
-
-function openOPMLWizard() {
- var dialogURL = "chrome://sage/content/opml/opml.xul";
- window.openDialog(dialogURL, "", "chrome,modal,close");
-}
-
-function openSettingDialog() {
- var dialogURL = "chrome://sage/content/settings/settings.xul";
- window.openDialog(dialogURL, "", "chrome,modal,close");
-}
-
-function openSageProjectFeed() {
- lastResource = null;
- var feedURL = "http://sage.mozdev.org/rss.xml";
- setStatusLoading("Sage Project News");
- httpGet(feedURL);
-}
-
-function manageRSSList() {
- var dialogURL = "chrome://browser/content/bookmarks/bookmarksManager.xul";
- window.openDialog(dialogURL, "", "chrome,all,dialog=no", sageFolderID);
-}
-
-function updateCheck(aCheckFolderId) {
- UpdateChecker.onCheck = function(aName, aURL) {
- rssStatusImage.setAttribute("loading", "true");
- rssStatusLabel.value = strRes.getString("RESULT_CHECKING") + ": " + aName;
- }
- UpdateChecker.onChecked = function(aName, aURL) {
- setStatusDone();
- }
-
- if(aCheckFolderId) {
- UpdateChecker.startCheck(aCheckFolderId);
- } else {
- UpdateChecker.startCheck(sageFolderID);
- }
-}
-
-function BookmarkResource(aRes, aDB){
- this.res = aRes;
- this.db = aDB;
- this.name = BookmarksUtils.getProperty(this.res, NC_NS + "Name", this.db);
- this.url = BookmarksUtils.getProperty(this.res, NC_NS + "URL", this.db);
-}
-
-function bookmarksOpen(){
- lastResource = new BookmarkResource(bookmarksTree.currentResource, bookmarksTree.db);
- setStatusLoading();
- httpGet(lastResource.url);
-}
-
-function createTreeContextMenu2(aEvent) {
- var popup = aEvent.target;
- if(popup.localName != "menupopup") return;
-
- var selection = bookmarksTree._selection;
- var itemId = selection.item[0].Value;
- var cmdSrc = "";
- var tempMenuItem;
-
- if(selection.type == "Bookmark") {
- cmdSrc = "GetRssTitle.getRssTitle('" + itemId + "')";
- tempMenuItem = document.createElement("menuitem");
- tempMenuItem.setAttribute("label", strRes.getString("GET_RSS_TITLE"));
- tempMenuItem.setAttribute("oncommand", cmdSrc);
- popup.appendChild(document.createElement("menuseparator"));
- popup.appendChild(tempMenuItem);
- } else if(selection.type == "Folder") {
- cmdSrc = "updateCheck('" + itemId + "')";
- tempMenuItem = document.createElement("menuitem");
- tempMenuItem.setAttribute("label", strRes.getString("CHECK_UPDATE"));
- tempMenuItem.setAttribute("oncommand", cmdSrc);
- popup.appendChild(document.createElement("menuseparator"));
- popup.appendChild(tempMenuItem);
- }
-}
-
-function bookmarksTreeClick(aEvent){
- if(aEvent.type == "click") {
- if(aEvent.button == 2 || aEvent.originalTarget.localName != "treechildren") {
- return;
- }
- var obj = {};
- bookmarksTree.treeBoxObject.getCellAt(aEvent.clientX, aEvent.clientY, {}, {}, obj);
- if(obj.value == "twisty") return;
- } else if(aEvent.type == "keypress") {
- if(aEvent.originalTarget.localName != "tree") {
- return;
- }
- }
-
- CreateHTML.tabbed = false;
- if(aEvent.button == 1) { CreateHTML.tabbed = true; } // click middle button
- if(aEvent.ctrlKey) { CreateHTML.tabbed = true; } // press Ctrl Key
-
- const BOOKMARK_TYPE = RDF_NS + "type";
- const BOOKMARK_SEPARATOR = NC_NS + "BookmarkSeparator";
- const BOOKMARK_FOLDER = NC_NS + "Folder"
- var bookmarkType = (BookmarksUtils.getProperty(bookmarksTree.currentResource, BOOKMARK_TYPE , bookmarksTree.db))
- if(bookmarkType == BOOKMARK_SEPARATOR || bookmarkType == BOOKMARK_FOLDER) {
- return;
- }
-
- bookmarksOpen();
-}
-
-function rssItemListBoxClick(aEvent) {
- if(aEvent.type == "click") {
- if(aEvent.button == 2 || aEvent.originalTarget.localName != "listitem") {
- return;
- }
- } else if(aEvent.type == "keypress") {
- if(aEvent.originalTarget.localName != "listbox") {
- return;
- }
- }
-
- var feedItemOrder = CommonFunc.getPrefValue(CommonFunc.FEED_ITEM_ORDER, "str", "chrono");
-
- var selectedItem = rssItemListBox.selectedItem;
- var items = currentFeed.getItems(feedItemOrder);
- var link = items[selectedItem.value].getLink();
- var tabbed = false;
-
- if(aEvent.button == 1) { tabbed = true; } // click middle button
- if(aEvent.ctrlKey) { tabbed = true; } // press Ctrl Key
-
- if(tabbed) {
- getContentBrowser().addTab(link);
- } else {
- getContentBrowser().loadURI(link);
- }
- selectedItem.setAttribute("visited", "true");
-}
-
-function rssTitleLabelClick(aNode, aEvent){
- var tabbed = false;
- if(!aNode.hasAttribute("href") || aEvent.button == 2) {
- return;
- }
-
- var link = aNode.getAttribute("href");
- tabbed = false;
-
- if(aEvent.button == 1) { tabbed =true; } // click middle button
- if(aEvent.ctrlKey) { tabbed = true; } // press Ctrl Key
-
- if(tabbed) {
- getContentBrowser().addTab(link);
- } else {
- getContentBrowser().loadURI(link);
- }
-}
-
-function setStatusLoading(label) {
- rssStatusImage.setAttribute("loading", "true");
- if(label) {
- rssStatusLabel.value = strRes.getString("RESULT_LOADING") + ": " + label;
- } else {
- rssStatusLabel.value = strRes.getString("RESULT_LOADING") + ": " + lastResource.name;
- }
-}
-
-function setStatusDone() {
- rssStatusImage.setAttribute("loading", "false");
- rssStatusLabel.value = "";
-
- if(currentFeed) {
- rssTitleLabel.value = htmlToText(currentFeed.getTitle());
- if(currentFeed.getLink()) {
- rssTitleLabel.setAttribute("href", currentFeed.getLink());
- rssTitleLabel.tooltipText = currentFeed.getLink();
- } else {
- rssTitleLabel.removeAttribute("href");
- rssTitleLabel.tooltipText = "";
- }
- }
-}
-
-function setStatusError(aStatus) {
- rssStatusImage.setAttribute("loading", "error");
- rssStatusLabel.value = "Error: " + aStatus;
-}
-
-function getContentBrowser() {
- var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(Components.interfaces.nsIWindowMediator);
- var topWindowOfType = windowManager.getMostRecentWindow("navigator:browser");
- if (topWindowOfType) {
- return topWindowOfType.document.getElementById('content');
- }
- return null;
-}
-
-function toggleShowSearchBar() {
- var showSearchBar = getCheckboxCheck("chkShowSearchBar");
- document.getElementById("barSearch").hidden = !showSearchBar;
-}
-
-function toggleShowFeedItemList() {
- var showFeedItemList = getCheckboxCheck("chkShowFeedItemList");
- document.getElementById("sage-splitter").hidden = !showFeedItemList;
- document.getElementById("rssItemListBoxBox").hidden = !showFeedItemList;
- if(showFeedItemList) setRssItemListBox();
-}
-
-function setRssItemListBox() {
- if(!currentFeed) return;
- if(document.getElementById("rssItemListBoxBox").hidden) return;
-
- while(rssItemListBox.getRowCount() != 0) {
- rssItemListBox.removeItemAt(0);
- }
-
- var feedItemOrder = CommonFunc.getPrefValue(CommonFunc.FEED_ITEM_ORDER, "str", "chrono");
-
- var items = currentFeed.getItems(feedItemOrder);
-
- for(var i = 0; items.length > i; i++) {
- var item = items[i];
- var itemLabel = item.getTitle();
- itemLabel = (i+1) + ". " + itemLabel;
- var listItem = rssItemListBox.appendItem(itemLabel, i);
- if(isVisited(item.getLink())) {
- listItem.setAttribute("visited", "true");
- }
- }
-}
-
-function isVisited(aURL) {
- try {
- var globalHistory = Components.classes["@mozilla.org/browser/global-history;1"].getService(Components.interfaces.nsIGlobalHistory);
- var URI = Components.classes['@mozilla.org/network/standard-url;1'].createInstance(Components.interfaces.nsIURI);
- URI.spec = aURL;
- return globalHistory.isVisited(URI.spec);
- } catch(e) {}
- return false;
-}
-
-function getCheckboxCheck(element_id) {
- var checkboxNode = document.getElementById(element_id);
- return checkboxNode.getAttribute("checked") == "true";
-}
-
-function setCheckbox(element_id, value) {
- var checkboxNode = document.getElementById(element_id);
- checkboxNode.setAttribute("checked", value);
-}
-
-function showRssItemListPopup(aEvent) {
- if(aEvent.originalTarget.localName != "listitem") {
- rssItemListPopup.hidePopup();
- return;
- }
- if(!getCheckboxCheck("chkShowTooltip")) {
- rssItemListPopup.hidePopup();
- return;
- }
-
- var feedItemOrder = CommonFunc.getPrefValue(CommonFunc.FEED_ITEM_ORDER, "str", "chrono");
-
- var items = currentFeed.getItems(feedItemOrder);
-
- var description = htmlToText(items[aEvent.originalTarget.value].getContent());
- if(description.indexOf("/") != -1) {
- description = description.replace(/\//gm, "/\u200B");
- }
- // description ��400�����ȓ�ɂ���
- if(description.length > 400) {
- description = description.substring(0,400) + "...";
- }
-
- var popX = aEvent.screenX + 10;
- var popY = aEvent.screenY + 20;
-
- rssItemListPopup.title = aEvent.originalTarget.label;
- rssItemListPopup.description = description;
- rssItemListPopup.autoPosition = false;
- rssItemListPopup.moveTo(popX, popY);
- popupTimeoutId = setTimeout("rssItemListPopup.showPopup(rssItemListBox)", 150);
-}
-
-function populateToolTip(e) {
- // if setting disabled
- if(!getCheckboxCheck("chkShowTooltip")) {
- e.preventDefault();
- return;
- }
-
- if(document.tooltipNode == rssItemListBox) {
- e.preventDefault();
- return;
- }
- var listItem = document.tooltipNode;
- var feedItemOrder = CommonFunc.getPrefValue(CommonFunc.FEED_ITEM_ORDER, "str", "chrono");
- var items = currentFeed.getItems(feedItemOrder);
- var description = htmlToText(items[listItem.value].getContent());
- if(description.indexOf("/") != -1) {
- description = description.replace(/\//gm, "/\u200B");
- }
- if(description.length > 400) {
- description = description.substring(0,400) + "...";
- }
-
- rssItemToolTip.title = listItem.label;
- rssItemToolTip.description = description;
-}
-
-function hideRssItemListPopup(aEvent) {
- clearTimeout(popupTimeoutId);
- rssItemListPopup.hidePopup();
-}
-
-function htmlToText(aStr) {
- var formatConverter = Components.classes["@mozilla.org/widget/htmlformatconverter;1"].createInstance(Components.interfaces.nsIFormatConverter);
- var fromStr = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
- fromStr.data = aStr;
- var toStr = { value: null };
-
- try {
- formatConverter.convert("text/html", fromStr, fromStr.toString().length, "text/unicode", toStr, {});
- } catch(e) {
- return aStr;
- }
- if(toStr.value) {
- toStr = toStr.value.QueryInterface(Components.interfaces.nsISupportsString);
- return toStr.toString();
- }
- return aStr;
-}
-
-
-
-// ++++++++++ +++++++++ HTTP ++++++++++ +++++++++
-
-function httpGet(aURL) {
- if(rssLoading) {
- httpReq.abort();
- rssLoading = false;
- }
-
- responseXML = null;
-
- httpReq = new XMLHttpRequest();
-
- httpReq.open("GET", aURL);
-
- httpReq.onload = httpLoaded;
- httpReq.onerror = httpError;
- httpReq.onreadystatechange = httpReadyStateChange;
-
- try {
- httpReq.setRequestHeader("User-Agent", USER_AGENT);
- httpReq.overrideMimeType("application/xml");
- } catch(e) {
- httpGetResult(RESULT_ERROR_FAILURE);
- }
-
- try {
- httpReq.send(null);
- rssLoading = true;
- } catch(e) {
- httpGetResult(RESULT_ERROR_FAILURE);
- }
-}
-
-function httpError(e) {
- logMessage("HTTP Error");
-}
-
-function httpReadyStateChange() {
-
- if(httpReq.readyState == 2) {
- try {
- if(httpReq.status == 404) {
- httpGetResult(RESULT_NOT_FOUND);
- }
- } catch(e) {
- httpGetResult(RESULT_NOT_AVAILABLE);
- return;
- }
- } else if(httpReq.readyState == 3) {}
-}
-
-function httpLoaded(e) {
- responseXML = httpReq.responseXML;
- var rootNodeName = responseXML.documentElement.localName.toLowerCase();
-
- switch(rootNodeName) {
- case "parsererror":
- // XML Parse Error
- httpGetResult(RESULT_PARSE_ERROR);
- break;
- case "rss":
- case "rdf":
- case "feed":
- httpGetResult(RESULT_OK);
- break;
- default:
- // Not RSS or ATOM
- httpGetResult(RESULT_NOT_RSS);
- break;
- }
-}
-
-function httpGetResult(aResultCode) {
- httpReq.abort();
- rssLoading = false;
-
- if(aResultCode == RESULT_OK) {
- currentFeed = new Feed(responseXML);
-
- if(lastResource && lastResource.res) {
- if(CommonFunc.getPrefValue(CommonFunc.AUTO_FEED_TITLE, "bool", true)) {
- if(CommonFunc.getBMDSProperty(lastResource.res, CommonFunc.BM_NAME) != currentFeed.getTitle()) {
- CommonFunc.setBMDSProperty(lastResource.res, CommonFunc.BM_NAME, currentFeed.getTitle());
- }
- }
-
- BMSVC.updateLastVisitedDate(lastResource.url, "UTF-8");
- CommonFunc.setBMDSProperty(lastResource.res, CommonFunc.BM_DESCRIPTION, CommonFunc.STATUS_NO_UPDATE + " " + currentFeed.getSignature());
- }
-
- setStatusDone();
- setRssItemListBox();
-
- if(CommonFunc.getPrefValue(CommonFunc.RENDER_FEEDS, "bool", true)) {
- CreateHTML.openHTML(currentFeed);
- }
- } else {
- setStatusError(resultStrArray[aResultCode]);
- }
-}
\ No newline at end of file
+const USER_AGENT = CommonFunc.USER_AGENT;
+
+const RESULT_OK = 0;
+const RESULT_PARSE_ERROR = 1;
+const RESULT_NOT_RSS = 2;
+const RESULT_NOT_FOUND = 3;
+const RESULT_NOT_AVAILABLE = 4;
+const RESULT_ERROR_FAILURE = 5;
+
+var resultStrArray = null;
+
+ // XUL Object
+var strRes, bmStrRes; // stringbundle Object
+var bookmarksTree;
+var rssItemListBox;
+var rssStatusImage;
+var rssStatusLabel;
+var rssTitleLabel;
+var rssItemToolTip;
+
+var currentFeed;
+var httpReq;
+var prefObserverSageFolder;
+var responseXML;
+var lastResource;
+var rssLoading = false;
+var sageFolderID = "";
+var enableTooltip = true;
+var popupTimeoutId=0;
+
+
+function init() {
+ bookmarksTree = document.getElementById("bookmarksTree");
+ rssItemListBox = document.getElementById("rssItemListBox");
+ rssStatusImage = document.getElementById("rssStatusImage");
+ rssStatusLabel = document.getElementById("rssStatusLabel");
+ rssTitleLabel = document.getElementById("rssTitleLabel");
+ rssItemToolTip = document.getElementById("rssItemToolTip");
+
+ strRes = document.getElementById("strRes");
+ bmStrRes = document.getElementById("bmStrRes");
+ resultStrArray = new Array(
+ strRes.getString("RESULT_OK_STR"),
+ strRes.getString("RESULT_PARSE_ERROR_STR"),
+ strRes.getString("RESULT_NOT_RSS_STR"),
+ strRes.getString("RESULT_NOT_FOUND_STR"),
+ strRes.getString("RESULT_NOT_AVAILABLE_STR"),
+ strRes.getString("RESULT_ERROR_FAILURE_STR")
+ );
+
+ // if feed folder has not been set, assume new user and install default feed folder and demo feeds
+ if(!CommonFunc.getPrefValue(CommonFunc.RSS_READER_FOLDER_ID, "str", null)) {
+ logMessage("setting default preferences...");
+ var new_folder = BMSVC.createFolderInContainer("Sage Feeds", RDF.GetResource("NC:BookmarksRoot"), null);
+ CommonFunc.setPrefValue(CommonFunc.RSS_READER_FOLDER_ID, "str", new_folder.Value);
+ if(BMSVC.createBookmarkInContainer.length == 7) { // firefox 0.8 and lower
+ BMSVC.createBookmarkInContainer("BBC News | News Front Page | World Edition", "http://news.bbc.co.uk/rss/newsonline_world_edition/front_page/rss091.xml", null, "updated", null, new_folder, null);
+ BMSVC.createBookmarkInContainer("Yahoo! News - Sports", "http://rss.news.yahoo.com/rss/sports", null, "updated", null, new_folder, null);
+ BMSVC.createBookmarkInContainer("Sage Project News", "http://sage.mozdev.org/rss.xml", null, "updated", null, new_folder, null);
+ } else {
+ BMSVC.createBookmarkInContainer("BBC News | News Front Page | World Edition", "http://news.bbc.co.uk/rss/newsonline_world_edition/front_page/rss091.xml", null, "updated", null, null, new_folder, null);
+ BMSVC.createBookmarkInContainer("Yahoo! News - Sports", "http://rss.news.yahoo.com/rss/sports", null, "updated", null, null, new_folder, null);
+ BMSVC.createBookmarkInContainer("Sage Project News", "http://sage.mozdev.org/rss.xml", null, "updated", null, null, new_folder, null);
+ }
+ setCheckbox("chkShowSearchBar", "false");
+ setCheckbox("chkShowTooltip", "true");
+ setCheckbox("chkShowFeedItemList", "true");
+ }
+
+ // get feed folder location
+ sageFolderID = CommonFunc.getPrefValue(CommonFunc.RSS_READER_FOLDER_ID, "str", "NC:BookmarksRoot");
+ // check for changes to the feed folder
+ prefObserverSageFolder = CommonFunc.addPrefListener(CommonFunc.RSS_READER_FOLDER_ID, sageFolderChanged);
+ // set feed folder location
+ bookmarksTree.tree.setAttribute("ref", sageFolderID);
+ // select first entry
+ bookmarksTree.treeBoxObject.selection.select(0);
+
+ FeedSearch.init();
+ toggleShowSearchBar();
+ toggleShowFeedItemList();
+
+ logMessage("initialized");
+}
+
+function discoverFeeds() {
+ window.openDialog("chrome://sage/contents/discover_feeds.xul", "sage_discover_feeds", "chrome,modal,close", bookmarksTree);
+}
+
+// TODO: This does not work in 0.9.x since the implementation for smart bookmarks
+// has been removed. Too bad because this feature was really nice
+function showOnlyUpdated() {
+ if(getCheckboxCheck("chkOnlyUpdate")) {
+ var findURL = "find:datasource=rdf:bookmarks&match=";
+ findURL += CommonFunc.BM_DESCRIPTION;
+ findURL += "&method=is&text=updated";
+ bookmarksTree.tree.setAttribute("ref", findURL);
+ } else {
+ bookmarksTree.tree.setAttribute("ref", sageFolderID);
+ }
+}
+
+function sageFolderChanged(subject, topic, prefName) {
+ // observe Preference
+ sageFolderID = CommonFunc.getPrefValue(CommonFunc.RSS_READER_FOLDER_ID, "str", "NC:BookmarksRoot");
+ bookmarksTree.tree.setAttribute("ref", sageFolderID);
+ bookmarksTree.treeBoxObject.selection.select(0);
+}
+
+function done() {
+ if(prefObserverSageFolder) {
+ CommonFunc.removePrefListener(prefObserverSageFolder);
+ }
+
+ if(rssLoading) {
+ httpReq.abort();
+ rssLoading = false;
+ }
+ UpdateChecker.done();
+
+ logMessage("shutdown");
+}
+
+function openOPMLWizard() {
+ var dialogURL = "chrome://sage/content/opml/opml.xul";
+ window.openDialog(dialogURL, "", "chrome,modal,close");
+}
+
+function openSettingDialog() {
+ var dialogURL = "chrome://sage/content/settings/settings.xul";
+ window.openDialog(dialogURL, "", "chrome,modal,close");
+}
+
+function openSageProjectFeed() {
+ lastResource = null;
+ var feedURL = "http://sage.mozdev.org/rss.xml";
+ setStatusLoading("Sage Project News");
+ httpGet(feedURL);
+}
+
+function manageRSSList() {
+ var dialogURL = "chrome://browser/content/bookmarks/bookmarksManager.xul";
+ window.openDialog(dialogURL, "", "chrome,all,dialog=no", sageFolderID);
+}
+
+function updateCheck(aCheckFolderId) {
+ UpdateChecker.onCheck = function(aName, aURL) {
+ rssStatusImage.setAttribute("loading", "true");
+ rssStatusLabel.value = strRes.getString("RESULT_CHECKING") + ": " + aName;
+ }
+ UpdateChecker.onChecked = function(aName, aURL) {
+ setStatusDone();
+ }
+
+ if(aCheckFolderId) {
+ UpdateChecker.startCheck(aCheckFolderId);
+ } else {
+ UpdateChecker.startCheck(sageFolderID);
+ }
+}
+
+function BookmarkResource(aRes, aDB){
+ this.res = aRes;
+ this.db = aDB;
+ this.name = BookmarksUtils.getProperty(this.res, NC_NS + "Name", this.db);
+ this.url = BookmarksUtils.getProperty(this.res, NC_NS + "URL", this.db);
+}
+
+function bookmarksOpen(){
+ lastResource = new BookmarkResource(bookmarksTree.currentResource, bookmarksTree.db);
+ setStatusLoading();
+ httpGet(lastResource.url);
+}
+
+function createTreeContextMenu2(aEvent) {
+ var popup = aEvent.target;
+ if(popup.localName != "menupopup") return;
+
+ var selection = bookmarksTree._selection;
+ var itemId = selection.item[0].Value;
+ var cmdSrc = "";
+ var tempMenuItem;
+
+ if(selection.type == "Bookmark") {
+ cmdSrc = "GetRssTitle.getRssTitle('" + itemId + "')";
+ tempMenuItem = document.createElement("menuitem");
+ tempMenuItem.setAttribute("label", strRes.getString("GET_RSS_TITLE"));
+ tempMenuItem.setAttribute("oncommand", cmdSrc);
+ popup.appendChild(document.createElement("menuseparator"));
+ popup.appendChild(tempMenuItem);
+ } else if(selection.type == "Folder") {
+ cmdSrc = "updateCheck('" + itemId + "')";
+ tempMenuItem = document.createElement("menuitem");
+ tempMenuItem.setAttribute("label", strRes.getString("CHECK_UPDATE"));
+ tempMenuItem.setAttribute("oncommand", cmdSrc);
+ popup.appendChild(document.createElement("menuseparator"));
+ popup.appendChild(tempMenuItem);
+ }
+}
+
+function bookmarksTreeClick(aEvent){
+ if(aEvent.type == "click") {
+ if(aEvent.button == 2 || aEvent.originalTarget.localName != "treechildren") {
+ return;
+ }
+ var obj = {};
+ bookmarksTree.treeBoxObject.getCellAt(aEvent.clientX, aEvent.clientY, {}, {}, obj);
+ if(obj.value == "twisty") return;
+ } else if(aEvent.type == "keypress") {
+ if(aEvent.originalTarget.localName != "tree") {
+ return;
+ }
+ }
+
+ CreateHTML.tabbed = false;
+ if(aEvent.button == 1) { CreateHTML.tabbed = true; } // click middle button
+ if(aEvent.ctrlKey) { CreateHTML.tabbed = true; } // press Ctrl Key
+
+ const BOOKMARK_TYPE = RDF_NS + "type";
+ const BOOKMARK_SEPARATOR = NC_NS + "BookmarkSeparator";
+ const BOOKMARK_FOLDER = NC_NS + "Folder"
+ var bookmarkType = (BookmarksUtils.getProperty(bookmarksTree.currentResource, BOOKMARK_TYPE , bookmarksTree.db))
+ if(bookmarkType == BOOKMARK_SEPARATOR || bookmarkType == BOOKMARK_FOLDER) {
+ return;
+ }
+
+ bookmarksOpen();
+}
+
+function rssItemListBoxClick(aEvent) {
+ if(aEvent.type == "click") {
+ if(aEvent.button == 2 || aEvent.originalTarget.localName != "listitem") {
+ return;
+ }
+ } else if(aEvent.type == "keypress") {
+ if(aEvent.originalTarget.localName != "listbox") {
+ return;
+ }
+ }
+
+ var listItem = rssItemListBox.selectedItem;
+ var feedItem = getFeedItemFromListItem( listItem );
+
+ openURI( feedItem.getLink(), aEvent );
+ listItem.setAttribute("visited", "true");
+}
+
+function rssTitleLabelClick(aNode, aEvent){
+ var tabbed = false;
+ if(!aNode.hasAttribute("href") || aEvent.button == 2) {
+ return;
+ }
+
+ var link = aNode.getAttribute("href");
+ openURI( link, aEvent );
+}
+
+function setStatusLoading(label) {
+ rssStatusImage.setAttribute("loading", "true");
+ if(label) {
+ rssStatusLabel.value = strRes.getString("RESULT_LOADING") + ": " + label;
+ } else {
+ rssStatusLabel.value = strRes.getString("RESULT_LOADING") + ": " + lastResource.name;
+ }
+}
+
+function setStatusDone() {
+ rssStatusImage.setAttribute("loading", "false");
+ rssStatusLabel.value = "";
+
+ if(currentFeed) {
+ rssTitleLabel.value = htmlToText(currentFeed.getTitle());
+ if(currentFeed.getLink()) {
+ rssTitleLabel.setAttribute("href", currentFeed.getLink());
+ rssTitleLabel.tooltipText = currentFeed.getLink();
+ } else {
+ rssTitleLabel.removeAttribute("href");
+ rssTitleLabel.tooltipText = "";
+ }
+ }
+}
+
+function setStatusError(aStatus) {
+ rssStatusImage.setAttribute("loading", "error");
+ rssStatusLabel.value = "Error: " + aStatus;
+}
+
+function getContentBrowser() {
+ var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(Components.interfaces.nsIWindowMediator);
+ var topWindowOfType = windowManager.getMostRecentWindow("navigator:browser");
+ if (topWindowOfType) {
+ return topWindowOfType.document.getElementById('content');
+ }
+ return null;
+}
+
+function toggleShowSearchBar() {
+ var showSearchBar = getCheckboxCheck("chkShowSearchBar");
+ document.getElementById("barSearch").hidden = !showSearchBar;
+}
+
+function toggleShowFeedItemList() {
+ var showFeedItemList = getCheckboxCheck("chkShowFeedItemList");
+ document.getElementById("sage-splitter").hidden = !showFeedItemList;
+ document.getElementById("rssItemListBoxBox").hidden = !showFeedItemList;
+ if(showFeedItemList) setRssItemListBox();
+}
+
+function setRssItemListBox() {
+ if(!currentFeed) return;
+ if(document.getElementById("rssItemListBoxBox").hidden) return;
+
+ while(rssItemListBox.getRowCount() != 0) {
+ rssItemListBox.removeItemAt(0);
+ }
+
+ var feedItemOrder = CommonFunc.getPrefValue(CommonFunc.FEED_ITEM_ORDER, "str", "chrono");
+
+ var items = currentFeed.getItems(feedItemOrder);
+
+ for(var i = 0; items.length > i; i++) {
+ var item = items[i];
+ var itemLabel = item.getTitle();
+ itemLabel = (i+1) + ". " + itemLabel;
+ var listItem = rssItemListBox.appendItem(itemLabel, i);
+ if(isVisited(item.getLink())) {
+ listItem.setAttribute("visited", "true");
+ }
+ }
+}
+
+function getCheckboxCheck(element_id) {
+ var checkboxNode = document.getElementById(element_id);
+ return checkboxNode.getAttribute("checked") == "true";
+}
+
+function setCheckbox(element_id, value) {
+ var checkboxNode = document.getElementById(element_id);
+ checkboxNode.setAttribute("checked", value);
+}
+
+// TODO: Is this still used?
+function showRssItemListPopup(aEvent) {
+ if(aEvent.originalTarget.localName != "listitem") {
+ rssItemListPopup.hidePopup();
+ return;
+ }
+ if(!getCheckboxCheck("chkShowTooltip")) {
+ rssItemListPopup.hidePopup();
+ return;
+ }
+
+ var feedItemOrder = CommonFunc.getPrefValue(CommonFunc.FEED_ITEM_ORDER, "str", "chrono");
+
+ var items = currentFeed.getItems(feedItemOrder);
+
+ var description = htmlToText(items[aEvent.originalTarget.value].getContent());
+ if(description.indexOf("/") != -1) {
+ description = description.replace(/\//gm, "/\u200B");
+ }
+ // description 400ȓɂ
+ if(description.length > 400) {
+ description = description.substring(0,400) + "...";
+ }
+
+ var popX = aEvent.screenX + 10;
+ var popY = aEvent.screenY + 20;
+
+ rssItemListPopup.title = aEvent.originalTarget.label;
+ rssItemListPopup.description = description;
+ rssItemListPopup.autoPosition = false;
+ rssItemListPopup.moveTo(popX, popY);
+ popupTimeoutId = setTimeout("rssItemListPopup.showPopup(rssItemListBox)", 150);
+}
+
+function populateToolTip(e) {
+ // if setting disabled
+ if(!getCheckboxCheck("chkShowTooltip")) {
+ e.preventDefault();
+ return;
+ }
+
+ if(document.tooltipNode == rssItemListBox) {
+ e.preventDefault();
+ return;
+ }
+ var listItem = document.tooltipNode;
+ var feedItemOrder = CommonFunc.getPrefValue(CommonFunc.FEED_ITEM_ORDER, "str", "chrono");
+ var items = currentFeed.getItems(feedItemOrder);
+ var description = htmlToText(items[listItem.value].getContent());
+ if(description.indexOf("/") != -1) {
+ description = description.replace(/\//gm, "/\u200B");
+ }
+ if(description.length > 400) {
+ description = description.substring(0,400) + "...";
+ }
+
+ rssItemToolTip.title = listItem.label;
+ rssItemToolTip.description = description;
+}
+
+// TODO: Is this still used?
+function hideRssItemListPopup(aEvent) {
+ clearTimeout(popupTimeoutId);
+ rssItemListPopup.hidePopup();
+}
+
+function htmlToText(aStr) {
+ var formatConverter = Components.classes["@mozilla.org/widget/htmlformatconverter;1"].createInstance(Components.interfaces.nsIFormatConverter);
+ var fromStr = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
+ fromStr.data = aStr;
+ var toStr = { value: null };
+
+ try {
+ formatConverter.convert("text/html", fromStr, fromStr.toString().length, "text/unicode", toStr, {});
+ } catch(e) {
+ return aStr;
+ }
+ if(toStr.value) {
+ toStr = toStr.value.QueryInterface(Components.interfaces.nsISupportsString);
+ return toStr.toString();
+ }
+ return aStr;
+}
+
+
+
+// ++++++++++ +++++++++ HTTP ++++++++++ +++++++++
+
+function httpGet(aURL) {
+ if(rssLoading) {
+ httpReq.abort();
+ rssLoading = false;
+ }
+
+ responseXML = null;
+
+ httpReq = new XMLHttpRequest();
+
+ httpReq.open("GET", aURL);
+
+ httpReq.onload = httpLoaded;
+ httpReq.onerror = httpError;
+ httpReq.onreadystatechange = httpReadyStateChange;
+
+ try {
+ httpReq.setRequestHeader("User-Agent", USER_AGENT);
+ httpReq.overrideMimeType("application/xml");
+ } catch(e) {
+ httpGetResult(RESULT_ERROR_FAILURE);
+ }
+
+ try {
+ httpReq.send(null);
+ rssLoading = true;
+ } catch(e) {
+ httpGetResult(RESULT_ERROR_FAILURE);
+ }
+}
+
+function httpError(e) {
+ logMessage("HTTP Error");
+}
+
+function httpReadyStateChange() {
+
+ if(httpReq.readyState == 2) {
+ try {
+ if(httpReq.status == 404) {
+ httpGetResult(RESULT_NOT_FOUND);
+ }
+ } catch(e) {
+ httpGetResult(RESULT_NOT_AVAILABLE);
+ return;
+ }
+ } else if(httpReq.readyState == 3) {}
+}
+
+function httpLoaded(e) {
+ responseXML = httpReq.responseXML;
+ var rootNodeName = responseXML.documentElement.localName.toLowerCase();
+
+ switch(rootNodeName) {
+ case "parsererror":
+ // XML Parse Error
+ httpGetResult(RESULT_PARSE_ERROR);
+ break;
+ case "rss":
+ case "rdf":
+ case "feed":
+ httpGetResult(RESULT_OK);
+ break;
+ default:
+ // Not RSS or ATOM
+ httpGetResult(RESULT_NOT_RSS);
+ break;
+ }
+}
+
+function httpGetResult(aResultCode) {
+ httpReq.abort();
+ rssLoading = false;
+
+ if(aResultCode == RESULT_OK) {
+ currentFeed = new Feed(responseXML);
+
+ if(lastResource && lastResource.res) {
+ if(CommonFunc.getPrefValue(CommonFunc.AUTO_FEED_TITLE, "bool", true)) {
+ if(CommonFunc.getBMDSProperty(lastResource.res, CommonFunc.BM_NAME) != currentFeed.getTitle()) {
+ CommonFunc.setBMDSProperty(lastResource.res, CommonFunc.BM_NAME, currentFeed.getTitle());
+ }
+ }
+
+ BMSVC.updateLastVisitedDate(lastResource.url, "UTF-8");
+ CommonFunc.setBMDSProperty(lastResource.res, CommonFunc.BM_DESCRIPTION, CommonFunc.STATUS_NO_UPDATE + " " + currentFeed.getSignature());
+ }
+
+ setStatusDone();
+ setRssItemListBox();
+
+ if(CommonFunc.getPrefValue(CommonFunc.RENDER_FEEDS, "bool", true)) {
+ CreateHTML.openHTML(currentFeed);
+ }
+ } else {
+ setStatusError(resultStrArray[aResultCode]);
+ }
+}
+
+
+// link visit code based on LinkVisitor.mozdev.org
+
+
+const _uriFixup = Components.classes["@mozilla.org/docshell/urifixup;1"].getService(Components.interfaces.nsIURIFixup);
+const _globalHistory = Components.classes['@mozilla.org/browser/global-history;2'].getService(Components.interfaces.nsIGlobalHistory2);
+const _browserHistory = Components.classes["@mozilla.org/browser/global-history;2"].getService(Components.interfaces.nsIBrowserHistory);
+
+function markURIAsRead( sURI )
+{
+ markURIReadState( sURI, true );
+}
+
+function markURIAsUnread( sURI )
+{
+ markURIReadState( sURI, false );
+}
+
+function markURIReadState( sURI, bRead )
+{
+ if ( !sURI )
+ return;
+
+ // why do we need to fixup the URI?
+ var fixupURI = _getFixupURI( sURI );
+ var visited = _globalHistory.isVisited( fixupURI );
+ if ( visited == bRead )
+ return;
+
+ if ( bRead )
+ _globalHistory.addURI( fixupURI, false, true );
+ else
+ _browserHistory.removePage( fixupURI.spec );
+}
+
+function _getFixupURI( sURI )
+{
+ try
+ {
+ return _uriFixup.createFixupURI( sURI, 0 );
+ }
+ catch( e )
+ {
+ return null;
+ }
+}
+
+function isVisited( sURI )
+{
+ var fixupURI = _getFixupURI( sURI );
+ return _globalHistory.isVisited( fixupURI );
+}
+
+
+// RSS Item Context Menu
+
+/**
+ * This is called before the context menu for the listbox is shown. Here we enabled/disable
+ * menu items as well as change the text to correctly reflect the read state
+ * @param e : Event
+ * @returns void
+ */
+function updateItemContextMenu( e )
+{
+ var popupNode = document.popupNode;
+
+ var menuItemIds = ["rssOpenItem", "rssOpenNewTabItem", "rssOpenNewWindowItem",
+ "rssMarkAsReadItem", "rssMarkAllAsReadItem", "rssMarkAllAsUnreadItem"];
+ var menuItems = {};
+ for ( var i = 0; i < menuItemIds.length; i++ )
+ {
+ menuItems[ menuItemIds[i] ] = document.getElementById( menuItemIds[i] );
+ }
+
+ // cmd_bm_open
+ // cmd_bm_openinnewwindow
+ // cmd_bm_openinnewtab
+ menuItems.rssOpenItem.label = bmStrRes.getString("cmd_bm_open");
+ menuItems.rssOpenNewTabItem.label = bmStrRes.getString("cmd_bm_openinnewtab");
+ menuItems.rssOpenNewWindowItem.label = bmStrRes.getString("cmd_bm_openinnewwindow");
+
+ menuItems.rssMarkAsReadItem.label = strRes.getString("itemcontext_markasread");
+ menuItems.rssMarkAllAsReadItem.label = strRes.getString("itemcontext_markallasread");
+ menuItems.rssMarkAllAsUnreadItem.label = strRes.getString("itemcontext_markallasunread");
+
+ if ( popupNode.localName == "listbox" )
+ {
+ // only mark all should work
+ for ( var id in menuItems )
+ {
+ if ( (id == "rssMarkAllAsReadItem" || id == "rssMarkAllAsUnreadItem") &&
+ currentFeed && rssItemListBox.getRowCount() > 0 )
+ menuItems[id].removeAttribute( "disabled" );
+ else
+ menuItems[id].setAttribute( "disabled", "true" );;
+ }
+ }
+ else
+ {
+ for ( id in menuItems )
+ menuItems[id].removeAttribute( "disabled" );
+
+ // need to figure out if the current list item is visited
+ var listItem = popupNode;
+ var feedItem = getFeedItemFromListItem( listItem );
+ var visited = isVisited( feedItem.getLink() );
+ menuItems.rssMarkAsReadItem.label =
+ strRes.getString( visited ? "itemcontext_markasunread" : "itemcontext_markasread" );
+
+ // lets make sure the visited flag is correct in the ui
+ if ( visited )
+ listItem.setAttribute( "visited", "true" );
+ else
+ listItem.removeAttribute( "visited" );
+ }
+}
+
+
+/**
+ * This marks the selected items as read/unread. This works with multiple
+ * selection as well if we want to enable that in the future.
+ * @param e : Event
+ * @returns void
+ */
+function toggleMarkAsRead( e )
+{
+ var listItems = rssItemListBox.selectedItems;
+ for ( var i = 0; i < listItems.length; i++ )
+ {
+ var listItem = listItems[i];
+ var feedItem = getFeedItemFromListItem( listItem );
+ var uri = feedItem.getLink();
+ var visited = isVisited( uri );
+ markURIReadState( uri, !visited );
+ if ( !visited )
+ listItem.setAttribute( "visited", "true" );
+ else
+ listItem.removeAttribute( "visited" );
+ }
+}
+
+/**
+ * This called from the context menu.
+ * @param e : Event
+ * @returns void
+ */
+function markAllAsRead( e )
+{
+ markAllReadState( true );
+}
+
+/**
+ * This called from the context menu.
+ * @param e : Event
+ * @returns void
+ */
+function markAllAsUnread( e )
+{
+ markAllReadState( false );
+}
+
+/**
+ * Marks all read or unread
+ * @param bRead : Boolean Whether to mark as read or unread
+ * @returns void
+ */
+function markAllReadState( bRead )
+{
+ if ( currentFeed )
+ {
+ var feedItemOrder = CommonFunc.getPrefValue(CommonFunc.FEED_ITEM_ORDER, "str", "chrono");
+ var feedItems = currentFeed.getItems( feedItemOrder );
+
+ for ( var i = 0; i < feedItems.length; i++ )
+ markURIReadState( feedItems[i].getLink(), bRead );
+
+ var listItem;
+ for ( var y = 0; y < rssItemListBox.getRowCount(); y++ )
+ {
+ listItem = rssItemListBox.getItemAtIndex( y );
+ if ( bRead )
+ listItem.setAttribute( "visited", "true" );
+ else
+ listItem.removeAttribute( "visited" );
+ }
+ }
+}
+
+// This takes a list item from the rss list box and returns the uri it represents
+// this seems a bit inefficient. Shouldn't there be a direct mapping between these?
+
+/**
+ * This takes a listitem element and returns the FeedItem it represents
+ * @param oListItem : XULListItem
+ * @returns FeedItem
+ */
+function getFeedItemFromListItem( oListItem )
+{
+ var feedItemOrder = CommonFunc.getPrefValue(CommonFunc.FEED_ITEM_ORDER, "str", "chrono");
+ var items = currentFeed.getItems( feedItemOrder );
+ return items[ oListItem.value ];
+}
+
+
+
+/**
+ * Opens a link in the same window, a new tab or a new window
+ *
+ * @param sURI : String
+ * @param oType : Object If this is an Event object we check the modifiers.
+ * Otherwise we assume it is a string describing the
+ * window type.
+ * @returns void
+ */
+function openURI( sURI, oType )
+{
+ var windowType;
+ if ( oType instanceof Event )
+ {
+ // figure out what kind of open we want
+ if ( oType.button == 1 || oType.ctrlKey ) // click middle button or ctrl click
+ windowType = "tab";
+ else if ( oType.shiftKey )
+ windowType = "window";
+ }
+ else
+ {
+ windowType = oType;
+ }
+
+ switch ( windowType )
+ {
+ case "tab":
+ getContentBrowser().addTab( sURI );
+ break;
+ case "window":
+ document.commandDispatcher.focusedWindow.open( sURI );
+ break;
+
+ default:
+ getContentBrowser().loadURI( sURI );
+ }
+}
+
+/**
+ * This is called by the context menu
+ * @param oType : String
+ * @returns void
+ */
+function openListItem( oType )
+{
+ var listItem = document.popupNode;
+ var feedItem = getFeedItemFromListItem( listItem );
+ openURI( feedItem.getLink(), oType );
+ listItem.setAttribute( "visited", "true" );
+}
diff --git a/src/sage/content/sage.xul b/src/sage/content/sage.xul
index ed50173..7a83c48 100755
--- a/src/sage/content/sage.xul
+++ b/src/sage/content/sage.xul
@@ -1,126 +1,140 @@
-<?xml version="1.0"?>
-
-<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-<?xml-stylesheet href="chrome://browser/content/bookmarks/bookmarks.css" type="text/css"?>
-<?xml-stylesheet href="chrome://sage/skin/sage.css" type="text/css"?>
-
-<?xul-overlay href="chrome://global/content/editMenuOverlay.xul"?>
-
-<!DOCTYPE page SYSTEM "chrome://sage/locale/sage.dtd">
-<page id="pageSagePanel" title="&sage.label;"
- xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- onload="init();" onunload="done()">
-
-<script type="application/x-javascript" src="chrome://global/content/globalOverlay.js"/>
-<script type="application/x-javascript" src="chrome://browser/content/bookmarks/bookmarks.js"/>
-<script type="application/x-javascript" src="chrome://global/content/nsDragAndDrop.js"/>
-<script type="application/x-javascript" src="chrome://global/content/nsTransferable.js"/>
-
-<script type="application/x-javascript" src="chrome://sage/content/commonfunc.js"/>
-<script type="application/x-javascript" src="chrome://sage/content/feedlib.js"/>
-<script type="application/x-javascript" src="chrome://sage/content/sage.js"/>
-<script type="application/x-javascript" src="chrome://sage/content/updatechecker.js"/>
-<script type="application/x-javascript" src="chrome://sage/content/createhtml.js"/>
-<script type="application/x-javascript" src="chrome://sage/content/getrsstitle.js"/>
-<script type="application/x-javascript" src="chrome://sage/content/search/feedsearch.js"/>
-
- <!-- bookmarks & edit commands -->
-<commandset id="editMenuCommands">
- <command id="cmd_bm_open" oncommand="goDoCommand('cmd_bm_open');"/>
- <command id="cmd_bm_openinnewwindow" disabled="true"/>
- <command id="cmd_bm_openinnewtab" disabled="true"/>
- <command id="cmd_bm_expandfolder" oncommand="goDoCommand('cmd_bm_expandfolder');"/>
- <command id="cmd_bm_openfolder" oncommand="goDoCommand('cmd_bm_openfolder');"/>
- <command id="cmd_bm_managefolder" oncommand="goDoCommand('cmd_bm_managefolder');"/>
- <command id="cmd_bm_newfolder" oncommand="goDoCommand('cmd_bm_newfolder');"/>
- <command id="cmd_bm_newbookmark" oncommand="goDoCommand('cmd_bm_newbookmark');"/>
- <command id="cmd_bm_newseparator" oncommand="goDoCommand('cmd_bm_newseparator');"/>
- <command id="cmd_bm_find" oncommand="goDoCommand('cmd_bm_find');"/>
- <command id="cmd_bm_properties" oncommand="goDoCommand('cmd_bm_properties');"/>
-</commandset>
-
-<stringbundleset>
- <stringbundle id="strRes" src="chrome://sage/locale/sage.properties"/>
-</stringbundleset>
-
-<toolbox class="plain">
- <toolbar class="plain">
- <toolbarbutton id="checkFeeds" class="sage_button" oncommand="updateCheck()" tooltiptext="&menu.checkUpdate;"/>
- <toolbarbutton id="discoverFeeds" class="sage_button" oncommand="discoverFeeds()" tooltiptext="&menu.discoverFeeds;"/>
- <spacer flex="1"/>
- <toolbarbutton type="menu" label="&menu.tools;">
- <menupopup>
- <menuitem id="chkShowSearchBar" type="checkbox" persist="checked" label="&menu.showSearchBar;" oncommand="toggleShowSearchBar()"/>
- <menuitem id="chkShowTooltip" type="checkbox" persist="checked" label="&menu.showDescTooltip;"/>
- <menuitem id="chkShowFeedItemList" type="checkbox" persist="checked" label="&menu.showFeedItemList;" oncommand="toggleShowFeedItemList()"/>
- <menuseparator/>
- <menuitem label="&menu.manageRSSList;" oncommand="manageRSSList()"/>
- <menuitem label="&menu.opmlImportExport;" oncommand="openOPMLWizard()"/>
- <menuseparator/>
- <menuitem label="&menu.sageProjectFeed;" oncommand="openSageProjectFeed()"/>
- <menuseparator/>
- <menuitem label="&menu.setting;" oncommand="openSettingDialog()"/>
- </menupopup>
- </toolbarbutton>
- </toolbar>
- <toolbar id="barSearch" class="plain" align="center">
- <textbox id="txtSearchValue" type="autocomplete" flex="1"
- ontextentered="FeedSearch.search()"
- autocompletesearch="form-history"
- autocompletesearchparam="q"
- searchengine="" persist="searchengine">
- <image id="imgSearchEngine" popup="popSearchEngine"/>
- </textbox>
- <toolbarbutton id="btnSearchSubmit" oncommand="FeedSearch.search()"/>
- </toolbar>
-</toolbox>
-
-<vbox>
- <sidebarheader id="rssStatusBar" align="center">
- <hbox align="center" flex="1">
- <image id="rssStatusImage" loading="false"/>
- <label id="rssStatusLabel" flex="1" crop="end" value=""/>
- </hbox>
- </sidebarheader>
-</vbox>
-
-<vbox flex="1">
-
-<vbox id="bookmarksTreeBox" flex="1" persist="height">
- <bookmarks-tree id="bookmarksTree" type="single-column" flex="1"
- onkeypress="if(event.keyCode == 13) bookmarksTreeClick(event)"
- ondraggesture="if(event.originalTarget.localName == 'treechildren') nsDragAndDrop.startDrag(event, this.DNDObserver);"
- onclick="bookmarksTreeClick(event)"/>
-</vbox>
-
-<splitter id="sage-splitter"/>
-
-<vbox id="rssItemListBoxBox" flex="1" persist="height">
- <sidebarheader id="feedTitleBar" align="center">
- <hbox align="center" flex="1">
- <label id="rssTitleLabel" flex="1" crop="end" value="" onclick="rssTitleLabelClick(this, event)"/>
- </hbox>
- </sidebarheader>
-
- <listbox id="rssItemListBox" class="plain" flex="1"
- tooltip="rssItemToolTip"
- onkeypress="if(event.keyCode == 13) rssItemListBoxClick(event)"
- onclick="rssItemListBoxClick(event)"/>
-</vbox>
-
-</vbox>
-
-<popupset>
- <tooltip id="rssItemToolTip" onpopupshowing="populateToolTip(event)" noautohide="true"/>
- <popup id="popSearchEngine" datasources="rdf:null" ref="urn:rrp:searchengine:root">
- <template>
- <menuitem type="checkbox" uri="..." value="..."
- oncommand="FeedSearch.popSearchEngineClick(event)"
- label="rdf:http://sage.mozdev.org/#name"
- image="rdf:http://sage.mozdev.org/#icon"/>
- </template>
- </popup>
-</popupset>
-
-</page>
\ No newline at end of file
+<?xml version="1.0"?>
+
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="chrome://browser/content/bookmarks/bookmarks.css" type="text/css"?>
+<?xml-stylesheet href="chrome://sage/skin/sage.css" type="text/css"?>
+
+<?xul-overlay href="chrome://global/content/editMenuOverlay.xul"?>
+
+<!DOCTYPE page SYSTEM "chrome://sage/locale/sage.dtd">
+<page id="pageSagePanel" title="&sage.label;"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ onload="init();" onunload="done()">
+
+<script type="application/x-javascript" src="chrome://global/content/globalOverlay.js"/>
+<script type="application/x-javascript" src="chrome://browser/content/bookmarks/bookmarks.js"/>
+<script type="application/x-javascript" src="chrome://global/content/nsDragAndDrop.js"/>
+<script type="application/x-javascript" src="chrome://global/content/nsTransferable.js"/>
+
+<script type="application/x-javascript" src="chrome://sage/content/commonfunc.js"/>
+<script type="application/x-javascript" src="chrome://sage/content/feedlib.js"/>
+<script type="application/x-javascript" src="chrome://sage/content/sage.js"/>
+<script type="application/x-javascript" src="chrome://sage/content/updatechecker.js"/>
+<script type="application/x-javascript" src="chrome://sage/content/createhtml.js"/>
+<script type="application/x-javascript" src="chrome://sage/content/getrsstitle.js"/>
+<script type="application/x-javascript" src="chrome://sage/content/search/feedsearch.js"/>
+
+ <!-- bookmarks & edit commands -->
+<commandset id="editMenuCommands">
+ <command id="cmd_bm_open" oncommand="goDoCommand('cmd_bm_open');"/>
+ <command id="cmd_bm_openinnewwindow" disabled="true"/>
+ <command id="cmd_bm_openinnewtab" disabled="true"/>
+ <command id="cmd_bm_expandfolder" oncommand="goDoCommand('cmd_bm_expandfolder');"/>
+ <command id="cmd_bm_openfolder" oncommand="goDoCommand('cmd_bm_openfolder');"/>
+ <command id="cmd_bm_managefolder" oncommand="goDoCommand('cmd_bm_managefolder');"/>
+ <command id="cmd_bm_newfolder" oncommand="goDoCommand('cmd_bm_newfolder');"/>
+ <command id="cmd_bm_newbookmark" oncommand="goDoCommand('cmd_bm_newbookmark');"/>
+ <command id="cmd_bm_newseparator" oncommand="goDoCommand('cmd_bm_newseparator');"/>
+ <command id="cmd_bm_find" oncommand="goDoCommand('cmd_bm_find');"/>
+ <command id="cmd_bm_properties" oncommand="goDoCommand('cmd_bm_properties');"/>
+</commandset>
+
+<stringbundleset>
+ <stringbundle id="strRes" src="chrome://sage/locale/sage.properties"/>
+ <stringbundle id="bmStrRes" src="chrome://browser/locale/bookmarks/bookmarks.properties"/>
+</stringbundleset>
+
+<toolbox class="plain">
+ <toolbar class="plain">
+ <toolbarbutton id="checkFeeds" class="sage_button" oncommand="updateCheck()" tooltiptext="&menu.checkUpdate;"/>
+ <toolbarbutton id="discoverFeeds" class="sage_button" oncommand="discoverFeeds()" tooltiptext="&menu.discoverFeeds;"/>
+ <spacer flex="1"/>
+ <toolbarbutton type="menu" label="&menu.tools;">
+ <menupopup>
+ <menuitem id="chkShowSearchBar" type="checkbox" persist="checked" label="&menu.showSearchBar;" oncommand="toggleShowSearchBar()"/>
+ <menuitem id="chkShowTooltip" type="checkbox" persist="checked" label="&menu.showDescTooltip;"/>
+ <menuitem id="chkShowFeedItemList" type="checkbox" persist="checked" label="&menu.showFeedItemList;" oncommand="toggleShowFeedItemList()"/>
+ <menuseparator/>
+ <menuitem label="&menu.manageRSSList;" oncommand="manageRSSList()"/>
+ <menuitem label="&menu.opmlImportExport;" oncommand="openOPMLWizard()"/>
+ <menuseparator/>
+ <menuitem label="&menu.sageProjectFeed;" oncommand="openSageProjectFeed()"/>
+ <menuseparator/>
+ <menuitem label="&menu.setting;" oncommand="openSettingDialog()"/>
+ </menupopup>
+ </toolbarbutton>
+ </toolbar>
+ <toolbar id="barSearch" class="plain" align="center">
+ <textbox id="txtSearchValue" type="autocomplete" flex="1"
+ ontextentered="FeedSearch.search()"
+ autocompletesearch="form-history"
+ autocompletesearchparam="q"
+ searchengine="" persist="searchengine">
+ <image id="imgSearchEngine" popup="popSearchEngine"/>
+ </textbox>
+ <toolbarbutton id="btnSearchSubmit" oncommand="FeedSearch.search()"/>
+ </toolbar>
+</toolbox>
+
+<vbox>
+ <sidebarheader id="rssStatusBar" align="center">
+ <hbox align="center" flex="1">
+ <image id="rssStatusImage" loading="false"/>
+ <label id="rssStatusLabel" flex="1" crop="end" value=""/>
+ </hbox>
+ </sidebarheader>
+</vbox>
+
+<vbox flex="1">
+
+<vbox id="bookmarksTreeBox" flex="1" persist="height">
+ <bookmarks-tree id="bookmarksTree" type="single-column" flex="1"
+ onkeypress="if(event.keyCode == 13) bookmarksTreeClick(event)"
+ ondraggesture="if(event.originalTarget.localName == 'treechildren') nsDragAndDrop.startDrag(event, this.DNDObserver);"
+ onclick="bookmarksTreeClick(event)"/>
+</vbox>
+
+<splitter id="sage-splitter"/>
+
+<vbox id="rssItemListBoxBox" flex="1" persist="height">
+ <sidebarheader id="feedTitleBar" align="center">
+ <hbox align="center" flex="1">
+ <label id="rssTitleLabel" flex="1" crop="end" value="" onclick="rssTitleLabelClick(this, event)"/>
+ </hbox>
+ </sidebarheader>
+
+ <listbox id="rssItemListBox" class="plain" flex="1"
+ tooltip="rssItemToolTip"
+ contextmenu="rssItemListBoxContextMenu"
+ onkeypress="if(event.keyCode == 13) rssItemListBoxClick(event)"
+ onclick="rssItemListBoxClick(event)"/>
+</vbox>
+
+</vbox>
+
+<popupset>
+ <tooltip id="rssItemToolTip" onpopupshowing="populateToolTip(event)" noautohide="true"/>
+ <popup id="popSearchEngine" datasources="rdf:null" ref="urn:rrp:searchengine:root">
+ <template>
+ <menuitem type="checkbox" uri="..." value="..."
+ oncommand="FeedSearch.popSearchEngineClick(event)"
+ label="rdf:http://sage.mozdev.org/#name"
+ image="rdf:http://sage.mozdev.org/#icon"/>
+ </template>
+ </popup>
+
+ <popup id="rssItemListBoxContextMenu"
+ onpopupshowing="updateItemContextMenu(event)">
+ <menuitem id="rssOpenItem" default="true" oncommand="openListItem()"/>
+ <menuitem id="rssOpenNewTabItem" oncommand="openListItem('tab')"/>
+ <menuitem id="rssOpenNewWindowItem" oncommand="openListItem('window')"/>
+ <menuseparator/>
+ <menuitem id="rssMarkAsReadItem" oncommand="toggleMarkAsRead(event)"/>
+ <menuitem id="rssMarkAllAsReadItem" oncommand="markAllAsRead(event)"/>
+ <menuitem id="rssMarkAllAsUnreadItem" oncommand="markAllAsUnread(event)"/>
+ </popup>
+
+</popupset>
+
+</page>
diff --git a/src/sage/locale/ca-CA/sage.dtd b/src/sage/locale/ca-CA/sage.dtd
index 56f1e86..3be2dea 100644
--- a/src/sage/locale/ca-CA/sage.dtd
+++ b/src/sage/locale/ca-CA/sage.dtd
@@ -44,3 +44,4 @@
<!ENTITY allowEContent.label "Permet etiquetes HTML">
<!ENTITY openSageSidebar.commandkey "S">
<!ENTITY openSageSidebar.modifiersKey "alt">
+
diff --git a/src/sage/locale/ca-CA/sage.properties b/src/sage/locale/ca-CA/sage.properties
index cd36af6..aa62b20 100644
--- a/src/sage/locale/ca-CA/sage.properties
+++ b/src/sage/locale/ca-CA/sage.properties
@@ -82,3 +82,9 @@ date_november=Novembre
date_november_short=*Nov
date_december=Desembre
date_december_short=Des
+
+# Item context menu
+itemcontext_markasread = Mark as Read
+itemcontext_markasunread = Mark as Unread
+itemcontext_markallasread = Mark All as Read
+itemcontext_markallasunread = Mark All as Unread
diff --git a/src/sage/locale/en-US/sage.dtd b/src/sage/locale/en-US/sage.dtd
index 053b28c..c7b6463 100755
--- a/src/sage/locale/en-US/sage.dtd
+++ b/src/sage/locale/en-US/sage.dtd
@@ -1,52 +1,52 @@
-<!ENTITY sage.label "Sage">
-<!ENTITY sage.version "1.2">
-<!ENTITY sage.version.label "version">
-
-<!ENTITY sage.toolbarLabel "Sage">
-<!ENTITY sage.sidebarTitle "Sage">
-<!ENTITY sage.tooltip "Displays Sage">
-
-<!ENTITY menu.view "View">
-<!ENTITY menu.showSearchBar "Show Feed Search Bar">
-<!ENTITY menu.showFeedItemList "Show Feed Item List">
-<!ENTITY menu.showDescTooltip "Show Description Tooltips">
-<!ENTITY menu.openHTML "Open Feeds In Contents Area">
-<!ENTITY menu.tools "Options">
-<!ENTITY menu.checkUpdate "Check Feeds">
-<!ENTITY menu.manageRSSList "Manage Feed List...">
-<!ENTITY menu.opmlImportExport "OPML Import/Export...">
-<!ENTITY menu.setting "Settings...">
-<!ENTITY menu.sageProjectFeed "Sage Project News">
-<!ENTITY menu.discoverFeeds "Discover Feeds">
-
-<!-- Feed Discovery -->
-<!ENTITY discovery.status.searching "Searching current page">
-<!ENTITY discovery.button.addFeed "Add Feed">
-<!ENTITY discovery.button.close "Close">
-<!ENTITY discovery.header.title "Title">
-<!ENTITY discovery.header.format "Format">
-<!ENTITY discovery.header.lastPubDate "Last Update">
-<!ENTITY discovery.header.itemCount "Items">
-<!ENTITY discovery.header.url "URL">
-
-<!-- Settings Dialog -->
-<!ENTITY settings.general.caption "General">
-<!ENTITY settings.autoFeedTitle.label "Automatically update feed titles">
-<!ENTITY settings.renderFeeds.label "Render feeds in contents area">
-<!ENTITY settings.twelveHourClock.label "Use 12 hour clock">
-<!ENTITY settings.feedItemOrder.label "Feed item order">
-<!ENTITY settings.feedItemOrder.chrono "Chronological">
-<!ENTITY settings.feedItemOrder.source "Source">
-<!ENTITY settings.feedDiscoveryMode.label "Feed discovery mode">
-<!ENTITY settings.feedDiscoveryMode.exhaustive "Exhaustive">
-<!ENTITY settings.feedDiscoveryMode.conservative "Conservative">
-<!ENTITY settingWindow.title "Sage Settings">
-<!ENTITY selectFolder.label "Select Feed Folder">
-<!ENTITY openInContentsArea.caption "Feed Rendering">
-<!ENTITY enableUserCss.label "Use custom CSS">
-<!ENTITY browseCss.label "Browse...">
-<!ENTITY allowEContent.label "Allow HTML tags">
-
-
-<!ENTITY openSageSidebar.commandkey "S">
-<!ENTITY openSageSidebar.modifiersKey "alt">
\ No newline at end of file
+<!ENTITY sage.label "Sage">
+<!ENTITY sage.version "1.2">
+<!ENTITY sage.version.label "version">
+
+<!ENTITY sage.toolbarLabel "Sage">
+<!ENTITY sage.sidebarTitle "Sage">
+<!ENTITY sage.tooltip "Displays Sage">
+
+<!ENTITY menu.view "View">
+<!ENTITY menu.showSearchBar "Show Feed Search Bar">
+<!ENTITY menu.showFeedItemList "Show Feed Item List">
+<!ENTITY menu.showDescTooltip "Show Description Tooltips">
+<!ENTITY menu.openHTML "Open Feeds In Contents Area">
+<!ENTITY menu.tools "Options">
+<!ENTITY menu.checkUpdate "Check Feeds">
+<!ENTITY menu.manageRSSList "Manage Feed List...">
+<!ENTITY menu.opmlImportExport "OPML Import/Export...">
+<!ENTITY menu.setting "Settings...">
+<!ENTITY menu.sageProjectFeed "Sage Project News">
+<!ENTITY menu.discoverFeeds "Discover Feeds">
+
+<!-- Feed Discovery -->
+<!ENTITY discovery.status.searching "Searching current page">
+<!ENTITY discovery.button.addFeed "Add Feed">
+<!ENTITY discovery.button.close "Close">
+<!ENTITY discovery.header.title "Title">
+<!ENTITY discovery.header.format "Format">
+<!ENTITY discovery.header.lastPubDate "Last Update">
+<!ENTITY discovery.header.itemCount "Items">
+<!ENTITY discovery.header.url "URL">
+
+<!-- Settings Dialog -->
+<!ENTITY settings.general.caption "General">
+<!ENTITY settings.autoFeedTitle.label "Automatically update feed titles">
+<!ENTITY settings.renderFeeds.label "Render feeds in contents area">
+<!ENTITY settings.twelveHourClock.label "Use 12 hour clock">
+<!ENTITY settings.feedItemOrder.label "Feed item order">
+<!ENTITY settings.feedItemOrder.chrono "Chronological">
+<!ENTITY settings.feedItemOrder.source "Source">
+<!ENTITY settings.feedDiscoveryMode.label "Feed discovery mode">
+<!ENTITY settings.feedDiscoveryMode.exhaustive "Exhaustive">
+<!ENTITY settings.feedDiscoveryMode.conservative "Conservative">
+<!ENTITY settingWindow.title "Sage Settings">
+<!ENTITY selectFolder.label "Select Feed Folder">
+<!ENTITY openInContentsArea.caption "Feed Rendering">
+<!ENTITY enableUserCss.label "Use custom CSS">
+<!ENTITY browseCss.label "Browse...">
+<!ENTITY allowEContent.label "Allow HTML tags">
+
+
+<!ENTITY openSageSidebar.commandkey "S">
+<!ENTITY openSageSidebar.modifiersKey "alt">
diff --git a/src/sage/locale/en-US/sage.properties b/src/sage/locale/en-US/sage.properties
index 9ec92f7..607a971 100755
--- a/src/sage/locale/en-US/sage.properties
+++ b/src/sage/locale/en-US/sage.properties
@@ -1,84 +1,90 @@
-RESULT_OK_STR = OK
-RESULT_PARSE_ERROR_STR = XML Parse Error
-RESULT_NOT_RSS_STR = Feed Parse Error
-RESULT_NOT_FOUND_STR = File Not Found
-RESULT_NOT_AVAILABLE_STR = URL Not Available
-RESULT_ERROR_FAILURE_STR = Load Failure
-RESULT_LOADING = Loading
-RESULT_CHECKING = Checking
-
-CHECK_UPDATE = Check Feeds
-GET_RSS_TITLE= Get Feed Title
-
-
-# feed discovery messages
-
-discovery_external_feeds_category = External Feeds
-discovery_status_discovered = Discovered
-discovery_status_site_feed = site feed
-discovery_status_site_feeds = site feeds
-discovery_status_and = and
-discovery_status_external_feed = external feed
-discovery_status_external_feeds = external feeds
-discovery_status_none_found = No feeds were discovered
-
-
-# get feed title dialog
-
-get_feed_title = New Feed Title
-
-
-# OPML wizzard
-
-opml_import_done = Import Complete
-opml_export_done = Export Complete
-opml_path_blank = Please choose an OPML file.
-opml_path_nofile = The specified file does not exist.
-opml_path_invalid = Invalid file path.
-opml_import_fail = Load Failure
-opml_import_badfile = This does not appear to be an OPML file.
-opml_export_nocreate = File creation error
-opml_select_file = Select OPML File
-opml_opml_file = OPML File
-
-# Date rendering values
-
-date_sunday = Sunday
-date_sunday_short = Sun
-date_monday = Monday
-date_monday_short = Mon
-date_tuesday = Tuesday
-date_tuesday_short = Tue
-date_wednesday = Wednesday
-date_wednesday_short = Wed
-date_thursday = Thursday
-date_thursday_short = Thu
-date_friday = Friday
-date_friday_short = Fri
-date_saturday = Saturday
-date_saturday_short = Sat
-
-date_january = January
-date_january_short = Jan
-date_february = February
-date_february_short = Feb
-date_march = March
-date_march_short = Mar
-date_april = April
-date_april_short = Apr
-date_may = May
-date_may_short = May
-date_june = June
-date_june_short = Jun
-date_july = July
-date_july_short = Jul
-date_august = August
-date_august_short = Aug
-date_september = September
-date_september_short = Sep
-date_october = October
-date_october_short = Oct
-date_november = November
-date_november_short = Nov
-date_december = December
-date_december_short = Dec
\ No newline at end of file
+RESULT_OK_STR = OK
+RESULT_PARSE_ERROR_STR = XML Parse Error
+RESULT_NOT_RSS_STR = Feed Parse Error
+RESULT_NOT_FOUND_STR = File Not Found
+RESULT_NOT_AVAILABLE_STR = URL Not Available
+RESULT_ERROR_FAILURE_STR = Load Failure
+RESULT_LOADING = Loading
+RESULT_CHECKING = Checking
+
+CHECK_UPDATE = Check Feeds
+GET_RSS_TITLE= Get Feed Title
+
+
+# feed discovery messages
+
+discovery_external_feeds_category = External Feeds
+discovery_status_discovered = Discovered
+discovery_status_site_feed = site feed
+discovery_status_site_feeds = site feeds
+discovery_status_and = and
+discovery_status_external_feed = external feed
+discovery_status_external_feeds = external feeds
+discovery_status_none_found = No feeds were discovered
+
+
+# get feed title dialog
+
+get_feed_title = New Feed Title
+
+
+# OPML wizzard
+
+opml_import_done = Import Complete
+opml_export_done = Export Complete
+opml_path_blank = Please choose an OPML file.
+opml_path_nofile = The specified file does not exist.
+opml_path_invalid = Invalid file path.
+opml_import_fail = Load Failure
+opml_import_badfile = This does not appear to be an OPML file.
+opml_export_nocreate = File creation error
+opml_select_file = Select OPML File
+opml_opml_file = OPML File
+
+# Date rendering values
+
+date_sunday = Sunday
+date_sunday_short = Sun
+date_monday = Monday
+date_monday_short = Mon
+date_tuesday = Tuesday
+date_tuesday_short = Tue
+date_wednesday = Wednesday
+date_wednesday_short = Wed
+date_thursday = Thursday
+date_thursday_short = Thu
+date_friday = Friday
+date_friday_short = Fri
+date_saturday = Saturday
+date_saturday_short = Sat
+
+date_january = January
+date_january_short = Jan
+date_february = February
+date_february_short = Feb
+date_march = March
+date_march_short = Mar
+date_april = April
+date_april_short = Apr
+date_may = May
+date_may_short = May
+date_june = June
+date_june_short = Jun
+date_july = July
+date_july_short = Jul
+date_august = August
+date_august_short = Aug
+date_september = September
+date_september_short = Sep
+date_october = October
+date_october_short = Oct
+date_november = November
+date_november_short = Nov
+date_december = December
+date_december_short = Dec
+
+# Item context menu
+itemcontext_markasread = Mark as Read
+itemcontext_markasunread = Mark as Unread
+itemcontext_markallasread = Mark All as Read
+itemcontext_markallasunread = Mark All as Unread
diff --git a/src/sage/locale/es-ES/sage.dtd b/src/sage/locale/es-ES/sage.dtd
index aabb32c..ab146f9 100644
--- a/src/sage/locale/es-ES/sage.dtd
+++ b/src/sage/locale/es-ES/sage.dtd
@@ -1,52 +1,53 @@
-<!ENTITY sage.label "Sage">
-<!ENTITY sage.version "1.2.2">
-<!ENTITY sage.version.label "versi�n">
-
-<!ENTITY sage.toolbarLabel "Sage">
-<!ENTITY sage.sidebarTitle "Sage">
-<!ENTITY sage.tooltip "Muestra Sage">
-
-<!ENTITY menu.view "Ver">
-<!ENTITY menu.showSearchBar "Mostrar barra de b�squeda de fuentes">
-<!ENTITY menu.showFeedItemList "Mostrar la lista de fuentes ">
-<!ENTITY menu.showDescTooltip "Mostrar sugerencias de descripci�n">
-<!ENTITY menu.openHTML "Abrir fuentes en �rea de contenidos">
-<!ENTITY menu.tools "Opciones">
-<!ENTITY menu.checkUpdate "Comprobar Fuentes">
-<!ENTITY menu.manageRSSList "Gestionar lista de fuentes...">
-<!ENTITY menu.opmlImportExport "Importaci�n/Exportaci�n OPML...">
-<!ENTITY menu.setting "Configuraci�n...">
-<!ENTITY menu.sageProjectFeed "Noticias Projecto Sage">
-<!ENTITY menu.discoverFeeds "Descubrir fuentes">
-
-<!-- Feed Discovery -->
-<!ENTITY discovery.status.searching "Buscando p�gina actual">
-<!ENTITY discovery.button.addFeed "A�adir fuente">
-<!ENTITY discovery.button.close "Cerrar">
-<!ENTITY discovery.header.title "T�tulo">
-<!ENTITY discovery.header.format "Formato">
-<!ENTITY discovery.header.lastPubDate "�ltima actualizaci�n">
-<!ENTITY discovery.header.itemCount "Elementos">
-<!ENTITY discovery.header.url "URL">
-
-<!-- Settings Dialog -->
-<!ENTITY settings.general.caption "General">
-<!ENTITY settings.autoFeedTitle.label "Actualizar autom�ticamente los t�tulos de las fuentes">
-<!ENTITY settings.renderFeeds.label "Representar las fuentes en el �rea de contenidos">
-<!ENTITY settings.twelveHourClock.label "Utilizar reloj de 12 horas">
-<!ENTITY settings.feedItemOrder.label "Orden de la lista de fuentes">
-<!ENTITY settings.feedItemOrder.chrono "Cronol�gicamente">
-<!ENTITY settings.feedItemOrder.source "Fuente">
-<!ENTITY settings.feedDiscoveryMode.label "Modo descubrimiento de fuentes">
-<!ENTITY settings.feedDiscoveryMode.exhaustive "Exhaustivo">
-<!ENTITY settings.feedDiscoveryMode.conservative "Conservador">
-<!ENTITY settingWindow.title "Configurar Sage">
-<!ENTITY selectFolder.label "Seleccionar carpeta de fuentes">
-<!ENTITY openInContentsArea.caption "Representaci�n de las fuentes">
-<!ENTITY enableUserCss.label "Utilizar CSS personalizada">
-<!ENTITY browseCss.label "Examinar...">
-<!ENTITY allowEContent.label "Permitir etiquetas HTML">
-
-
-<!ENTITY openSageSidebar.commandkey "S">
-<!ENTITY openSageSidebar.modifiersKey "alt">
\ No newline at end of file
+<!ENTITY sage.label "Sage">
+<!ENTITY sage.version "1.2.2">
+<!ENTITY sage.version.label "versi�n">
+
+<!ENTITY sage.toolbarLabel "Sage">
+<!ENTITY sage.sidebarTitle "Sage">
+<!ENTITY sage.tooltip "Muestra Sage">
+
+<!ENTITY menu.view "Ver">
+<!ENTITY menu.showSearchBar "Mostrar barra de b�squeda de fuentes">
+<!ENTITY menu.showFeedItemList "Mostrar la lista de fuentes ">
+<!ENTITY menu.showDescTooltip "Mostrar sugerencias de descripci�n">
+<!ENTITY menu.openHTML "Abrir fuentes en �rea de contenidos">
+<!ENTITY menu.tools "Opciones">
+<!ENTITY menu.checkUpdate "Comprobar Fuentes">
+<!ENTITY menu.manageRSSList "Gestionar lista de fuentes...">
+<!ENTITY menu.opmlImportExport "Importaci�n/Exportaci�n OPML...">
+<!ENTITY menu.setting "Configuraci�n...">
+<!ENTITY menu.sageProjectFeed "Noticias Projecto Sage">
+<!ENTITY menu.discoverFeeds "Descubrir fuentes">
+
+<!-- Feed Discovery -->
+<!ENTITY discovery.status.searching "Buscando p�gina actual">
+<!ENTITY discovery.button.addFeed "A�adir fuente">
+<!ENTITY discovery.button.close "Cerrar">
+<!ENTITY discovery.header.title "T�tulo">
+<!ENTITY discovery.header.format "Formato">
+<!ENTITY discovery.header.lastPubDate "�ltima actualizaci�n">
+<!ENTITY discovery.header.itemCount "Elementos">
+<!ENTITY discovery.header.url "URL">
+
+<!-- Settings Dialog -->
+<!ENTITY settings.general.caption "General">
+<!ENTITY settings.autoFeedTitle.label "Actualizar autom�ticamente los t�tulos de las fuentes">
+<!ENTITY settings.renderFeeds.label "Representar las fuentes en el �rea de contenidos">
+<!ENTITY settings.twelveHourClock.label "Utilizar reloj de 12 horas">
+<!ENTITY settings.feedItemOrder.label "Orden de la lista de fuentes">
+<!ENTITY settings.feedItemOrder.chrono "Cronol�gicamente">
+<!ENTITY settings.feedItemOrder.source "Fuente">
+<!ENTITY settings.feedDiscoveryMode.label "Modo descubrimiento de fuentes">
+<!ENTITY settings.feedDiscoveryMode.exhaustive "Exhaustivo">
+<!ENTITY settings.feedDiscoveryMode.conservative "Conservador">
+<!ENTITY settingWindow.title "Configurar Sage">
+<!ENTITY selectFolder.label "Seleccionar carpeta de fuentes">
+<!ENTITY openInContentsArea.caption "Representaci�n de las fuentes">
+<!ENTITY enableUserCss.label "Utilizar CSS personalizada">
+<!ENTITY browseCss.label "Examinar...">
+<!ENTITY allowEContent.label "Permitir etiquetas HTML">
+
+
+<!ENTITY openSageSidebar.commandkey "S">
+<!ENTITY openSageSidebar.modifiersKey "alt">
+
diff --git a/src/sage/locale/es-ES/sage.properties b/src/sage/locale/es-ES/sage.properties
index a691244..6bc6a31 100644
--- a/src/sage/locale/es-ES/sage.properties
+++ b/src/sage/locale/es-ES/sage.properties
@@ -1,84 +1,90 @@
-RESULT_OK_STR = OK
-RESULT_PARSE_ERROR_STR = Error de an�lisis XML
-RESULT_NOT_RSS_STR = error de an�lisis de la fuente
-RESULT_NOT_FOUND_STR = Archivo no encontrado
-RESULT_NOT_AVAILABLE_STR = URL no disponible
-RESULT_ERROR_FAILURE_STR = Error de carga
-RESULT_LOADING = Cargando
-RESULT_CHECKING = Comprobando
-
-CHECK_UPDATE = Comprobar fuentes
-GET_RSS_TITLE= Obtener t�tulo de la fuente
-
-
-# feed discovery messages
-
-discovery_external_feeds_category = Fuentes externas
-discovery_status_discovered = Encontradas
-discovery_status_site_feed = sitio con fuente
-discovery_status_site_feeds = sitio con fuentes
-discovery_status_and = y
-discovery_status_external_feed = fuente externa
-discovery_status_external_feeds = fuentes externas
-discovery_status_none_found = No se han encontrado fuentes
-
-
-# get feed title dialog
-
-get_feed_title = Nuevo t�tulo de fuente
-
-
-# OPML wizzard
-
-opml_import_done = Importaci�n Completa
-opml_export_done = Exportaci�n Completa
-opml_path_blank = Seleccione un archivo OPML, por favor.
-opml_path_nofile = El archivo especificado no existe.
-opml_path_invalid = Ruta de fichero incorrecta.
-opml_import_fail = Error de carga
-opml_import_badfile = Esto no aparenta ser un archivo OPML.
-opml_export_nocreate = Errror al crear el archivo
-opml_select_file = Seleccione un archivo OPML
-opml_opml_file = Archivo OPML
-
-# Date rendering values
-
-date_sunday = Domingo
-date_sunday_short = Dom
-date_monday = Lunes
-date_monday_short = Lun
-date_tuesday = Martes
-date_tuesday_short = Mar
-date_wednesday = Miercoles
-date_wednesday_short = Mie
-date_thursday = Jueves
-date_thursday_short = Jue
-date_friday = Viernes
-date_friday_short = Vie
-date_saturday = Sabado
-date_saturday_short = Sab
-
-date_january = Enero
-date_january_short = Ene
-date_february = Febrero
-date_february_short = Feb
-date_march = Marzo
-date_march_short = Mar
-date_april = Abril
-date_april_short = Abr
-date_may = Mayo
-date_may_short = May
-date_june = Junio
-date_june_short = Jun
-date_july = Julio
-date_july_short = Jul
-date_august = Agosto
-date_august_short = Ago
-date_september = Septiembre
-date_september_short = Sep
-date_october = Octubre
-date_october_short = Oct
-date_november = Noviembre
-date_november_short = Nov
-date_december = Diciembre
-date_december_short = Dic
\ No newline at end of file
+RESULT_OK_STR = OK
+RESULT_PARSE_ERROR_STR = Error de an�lisis XML
+RESULT_NOT_RSS_STR = error de an�lisis de la fuente
+RESULT_NOT_FOUND_STR = Archivo no encontrado
+RESULT_NOT_AVAILABLE_STR = URL no disponible
+RESULT_ERROR_FAILURE_STR = Error de carga
+RESULT_LOADING = Cargando
+RESULT_CHECKING = Comprobando
+
+CHECK_UPDATE = Comprobar fuentes
+GET_RSS_TITLE= Obtener t�tulo de la fuente
+
+
+# feed discovery messages
+
+discovery_external_feeds_category = Fuentes externas
+discovery_status_discovered = Encontradas
+discovery_status_site_feed = sitio con fuente
+discovery_status_site_feeds = sitio con fuentes
+discovery_status_and = y
+discovery_status_external_feed = fuente externa
+discovery_status_external_feeds = fuentes externas
+discovery_status_none_found = No se han encontrado fuentes
+
+
+# get feed title dialog
+
+get_feed_title = Nuevo t�tulo de fuente
+
+
+# OPML wizzard
+
+opml_import_done = Importaci�n Completa
+opml_export_done = Exportaci�n Completa
+opml_path_blank = Seleccione un archivo OPML, por favor.
+opml_path_nofile = El archivo especificado no existe.
+opml_path_invalid = Ruta de fichero incorrecta.
+opml_import_fail = Error de carga
+opml_import_badfile = Esto no aparenta ser un archivo OPML.
+opml_export_nocreate = Errror al crear el archivo
+opml_select_file = Seleccione un archivo OPML
+opml_opml_file = Archivo OPML
+
+# Date rendering values
+
+date_sunday = Domingo
+date_sunday_short = Dom
+date_monday = Lunes
+date_monday_short = Lun
+date_tuesday = Martes
+date_tuesday_short = Mar
+date_wednesday = Miercoles
+date_wednesday_short = Mie
+date_thursday = Jueves
+date_thursday_short = Jue
+date_friday = Viernes
+date_friday_short = Vie
+date_saturday = Sabado
+date_saturday_short = Sab
+
+date_january = Enero
+date_january_short = Ene
+date_february = Febrero
+date_february_short = Feb
+date_march = Marzo
+date_march_short = Mar
+date_april = Abril
+date_april_short = Abr
+date_may = Mayo
+date_may_short = May
+date_june = Junio
+date_june_short = Jun
+date_july = Julio
+date_july_short = Jul
+date_august = Agosto
+date_august_short = Ago
+date_september = Septiembre
+date_september_short = Sep
+date_october = Octubre
+date_october_short = Oct
+date_november = Noviembre
+date_november_short = Nov
+date_december = Diciembre
+date_december_short = Dic
+
+# Item context menu
+itemcontext_markasread = Mark as Read
+itemcontext_markasunread = Mark as Unread
+itemcontext_markallasread = Mark All as Read
+itemcontext_markallasunread = Mark All as Unread
diff --git a/src/sage/locale/fr-FR/sage.properties b/src/sage/locale/fr-FR/sage.properties
index 0273585..1b87af0 100644
--- a/src/sage/locale/fr-FR/sage.properties
+++ b/src/sage/locale/fr-FR/sage.properties
@@ -83,4 +83,8 @@ date_november_short = Nov
date_december = D\u00e9cembre
date_december_short = D\u00e9c
-
+# Item context menu
+itemcontext_markasread = Mark as Read
+itemcontext_markasunread = Mark as Unread
+itemcontext_markallasread = Mark All as Read
+itemcontext_markallasunread = Mark All as Unread
diff --git a/src/sage/locale/hu-HU/sage.dtd b/src/sage/locale/hu-HU/sage.dtd
index 812b4e8..ddf2b0c 100755
--- a/src/sage/locale/hu-HU/sage.dtd
+++ b/src/sage/locale/hu-HU/sage.dtd
@@ -1,52 +1,53 @@
-<!ENTITY sage.label "Sage">
-<!ENTITY sage.version "1.2">
-<!ENTITY sage.version.label "">
-
-<!ENTITY sage.toolbarLabel "Sage">
-<!ENTITY sage.sidebarTitle "Sage">
-<!ENTITY sage.tooltip "Sage megjelen�t�se">
-
-<!ENTITY menu.view "Megn�z">
-<!ENTITY menu.showSearchBar "Keres�mez� mutat�sa">
-<!ENTITY menu.showFeedItemList "Mutassa a let�lt�tt elemek list�j�t">
-<!ENTITY menu.showDescTooltip "Le�r�s-tooltip megjelen�t�se">
-<!ENTITY menu.openHTML "Megnyit�s a tartalmi r�szben">
-<!ENTITY menu.tools "Eszk�z�k">
-<!ENTITY menu.checkUpdate "Friss�l�sek ellen�rz�se">
-<!ENTITY menu.manageRSSList "RSS lista menedzsel�se...">
-<!ENTITY menu.opmlImportExport "OPML import/export...">
-<!ENTITY menu.setting "Be�ll�t�sok...">
-<!ENTITY menu.sageProjectFeed "A Sage projekt h�rei">
-<!ENTITY menu.discoverFeeds "Adagol�k keres�se">
-
-<!-- Feed Discovery -->
-<!ENTITY discovery.status.searching "Keres�s a jelenlegi oldalon">
-<!ENTITY discovery.button.addFeed "Adagol� hozz�ad�sa">
-<!ENTITY discovery.button.close "Bez�r">
-<!ENTITY discovery.header.title "C�m">
-<!ENTITY discovery.header.format "Form�tum">
-<!ENTITY discovery.header.lastPubDate "Utols� friss��s">
-<!ENTITY discovery.header.itemCount "Elemek">
-<!ENTITY discovery.header.url "URL">
-
-<!-- Setting Dialog -->
-<!ENTITY settings.general.caption "�ltal�nos">
-<!ENTITY settings.autoFeedTitle.label "C�mek automatikus friss�t�se">
-<!ENTITY settings.renderFeeds.label "Megnyit�s a tartalmi r�szben">
-<!ENTITY settings.twelveHourClock.label "">
-<!ENTITY settingWindow.title "Az RSS olvas�panel be�ll�t�sai">
-<!ENTITY settings.feedItemOrder.label "Adagol� elemeinek sorrendje">
-<!ENTITY settings.feedItemOrder.chrono "Id�rendben">
-<!ENTITY settings.feedItemOrder.source "Forr�s szerint">
-<!ENTITY settings.feedDiscoveryMode.label "Adagol�k keres�si m�dja">
-<!ENTITY settings.feedDiscoveryMode.exhaustive "Alapos">
-<!ENTITY settings.feedDiscoveryMode.conservative "Hagyom�nyos">
-<!ENTITY selectFolder.label "V�lassza ki az RSS listamapp�t">
-<!ENTITY openInContentsArea.caption "Let�lt�ttek megjelen�t�se">
-<!ENTITY enableUserCss.label "Egy�ni st�luslap enged�lyez�se">
-<!ENTITY browseCss.label "B�ng�sz�s...">
-<!ENTITY allowEContent.label "HTML tagek enged�lyez�se">
-
-
-<!ENTITY openSageSidebar.commandkey "S">
-<!ENTITY openSageSidebar.modifiersKey "alt">
+<!ENTITY sage.label "Sage">
+<!ENTITY sage.version "1.2">
+<!ENTITY sage.version.label "">
+
+<!ENTITY sage.toolbarLabel "Sage">
+<!ENTITY sage.sidebarTitle "Sage">
+<!ENTITY sage.tooltip "Sage megjelen�t�se">
+
+<!ENTITY menu.view "Megn�z">
+<!ENTITY menu.showSearchBar "Keres�mez� mutat�sa">
+<!ENTITY menu.showFeedItemList "Mutassa a let�lt�tt elemek list�j�t">
+<!ENTITY menu.showDescTooltip "Le�r�s-tooltip megjelen�t�se">
+<!ENTITY menu.openHTML "Megnyit�s a tartalmi r�szben">
+<!ENTITY menu.tools "Eszk�z�k">
+<!ENTITY menu.checkUpdate "Friss�l�sek ellen�rz�se">
+<!ENTITY menu.manageRSSList "RSS lista menedzsel�se...">
+<!ENTITY menu.opmlImportExport "OPML import/export...">
+<!ENTITY menu.setting "Be�ll�t�sok...">
+<!ENTITY menu.sageProjectFeed "A Sage projekt h�rei">
+<!ENTITY menu.discoverFeeds "Adagol�k keres�se">
+
+<!-- Feed Discovery -->
+<!ENTITY discovery.status.searching "Keres�s a jelenlegi oldalon">
+<!ENTITY discovery.button.addFeed "Adagol� hozz�ad�sa">
+<!ENTITY discovery.button.close "Bez�r">
+<!ENTITY discovery.header.title "C�m">
+<!ENTITY discovery.header.format "Form�tum">
+<!ENTITY discovery.header.lastPubDate "Utols� friss��s">
+<!ENTITY discovery.header.itemCount "Elemek">
+<!ENTITY discovery.header.url "URL">
+
+<!-- Setting Dialog -->
+<!ENTITY settings.general.caption "�ltal�nos">
+<!ENTITY settings.autoFeedTitle.label "C�mek automatikus friss�t�se">
+<!ENTITY settings.renderFeeds.label "Megnyit�s a tartalmi r�szben">
+<!ENTITY settings.twelveHourClock.label "">
+<!ENTITY settingWindow.title "Az RSS olvas�panel be�ll�t�sai">
+<!ENTITY settings.feedItemOrder.label "Adagol� elemeinek sorrendje">
+<!ENTITY settings.feedItemOrder.chrono "Id�rendben">
+<!ENTITY settings.feedItemOrder.source "Forr�s szerint">
+<!ENTITY settings.feedDiscoveryMode.label "Adagol�k keres�si m�dja">
+<!ENTITY settings.feedDiscoveryMode.exhaustive "Alapos">
+<!ENTITY settings.feedDiscoveryMode.conservative "Hagyom�nyos">
+<!ENTITY selectFolder.label "V�lassza ki az RSS listamapp�t">
+<!ENTITY openInContentsArea.caption "Let�lt�ttek megjelen�t�se">
+<!ENTITY enableUserCss.label "Egy�ni st�luslap enged�lyez�se">
+<!ENTITY browseCss.label "B�ng�sz�s...">
+<!ENTITY allowEContent.label "HTML tagek enged�lyez�se">
+
+
+<!ENTITY openSageSidebar.commandkey "S">
+<!ENTITY openSageSidebar.modifiersKey "alt">
+
diff --git a/src/sage/locale/hu-HU/sage.properties b/src/sage/locale/hu-HU/sage.properties
index ae128e6..9a7664f 100755
--- a/src/sage/locale/hu-HU/sage.properties
+++ b/src/sage/locale/hu-HU/sage.properties
@@ -1,85 +1,91 @@
-RESULT_OK_STR = OK
-RESULT_PARSE_ERROR_STR = XML �rtelmez�si hiba
-RESULT_NOT_RSS_STR = Ez az XML f�jl nem RSS form�tum�
-RESULT_NOT_FOUND_STR = A f�jl nem tal�lhat�
-RESULT_NOT_AVAILABLE_STR = Nem el�rhet� URL
-RESULT_ERROR_FAILURE_STR = Bet�lt�si hiba
-RESULT_LOADING = Loading
-RESULT_CHECKING = Checking
-
-CHECK_UPDATE = Friss�l�sek ellen�rz�se
-GET_RSS_TITLE= RSS c�m let�lt�se
-
-
-# feed discovery messages
-
-discovery_external_feeds_category = K�ls� adagol�
-discovery_status_discovered = Megtal�lva
-discovery_status_site_feed = oldaladagol�
-discovery_status_site_feeds = oldaladagol�k
-discovery_status_and = �s
-discovery_status_external_feed = k�ls� adagol�
-discovery_status_external_feeds = k�ls� adagol�k
-discovery_status_none_found = Nem siker�lt adagol�t tal�lni
-
-
-# get feed title dialog
-
-get_feed_title = Az �j adagol� c�me
-
-
-# OPML wizzard
-
-opml_import_done = Import�l�s befejezve
-opml_export_done = Exportport�l�s befejezve
-opml_path_blank = V�lasszon ki egy OPML f�jlt.
-opml_path_nofile = A megadott f�jl nem l�tezik.
-opml_path_invalid = �rv�nytelen �tvonal.
-opml_import_fail = Bet�lt�si hiba
-opml_import_badfile = �gy t�nik, ez nem egy OPML f�jl.
-opml_export_nocreate = F�jl l�trehoz�si hiba
-opml_select_file = Select OPML File
-opml_opml_file = OPML File
-
-
-# Date rendering values
-
-date_sunday = Vas�rnap
-date_sunday_short = Vas
-date_monday = H�tf�
-date_monday_short = H�t
-date_tuesday = Kedd
-date_tuesday_short = Ked
-date_wednesday = Szerda
-date_wednesday_short = Sze
-date_thursday = Cs�t�rt�k
-date_thursday_short = Cs�
-date_friday = P�ntek
-date_friday_short = P�n
-date_saturday = Szombat
-date_saturday_short = Szo
-
-date_january = Janu�r
-date_january_short = Jan
-date_february = Febru�r
-date_february_short = Feb
-date_march = M�rcius
-date_march_short = M�r
-date_april = �prilis
-date_april_short = �pr
-date_may = M�jus
-date_may_short = M�j
-date_june = J�nius
-date_june_short = J�n
-date_july = J�lius
-date_july_short = J�l
-date_august = Augusztus
-date_august_short = Aug
-date_september = Szeptember
-date_september_short = Sze
-date_october = Okt�ber
-date_october_short = Okt
-date_november = November
-date_november_short = Nov
-date_december = December
-date_december_short = Dec
+RESULT_OK_STR = OK
+RESULT_PARSE_ERROR_STR = XML �rtelmez�si hiba
+RESULT_NOT_RSS_STR = Ez az XML f�jl nem RSS form�tum�
+RESULT_NOT_FOUND_STR = A f�jl nem tal�lhat�
+RESULT_NOT_AVAILABLE_STR = Nem el�rhet� URL
+RESULT_ERROR_FAILURE_STR = Bet�lt�si hiba
+RESULT_LOADING = Loading
+RESULT_CHECKING = Checking
+
+CHECK_UPDATE = Friss�l�sek ellen�rz�se
+GET_RSS_TITLE= RSS c�m let�lt�se
+
+
+# feed discovery messages
+
+discovery_external_feeds_category = K�ls� adagol�
+discovery_status_discovered = Megtal�lva
+discovery_status_site_feed = oldaladagol�
+discovery_status_site_feeds = oldaladagol�k
+discovery_status_and = �s
+discovery_status_external_feed = k�ls� adagol�
+discovery_status_external_feeds = k�ls� adagol�k
+discovery_status_none_found = Nem siker�lt adagol�t tal�lni
+
+
+# get feed title dialog
+
+get_feed_title = Az �j adagol� c�me
+
+
+# OPML wizzard
+
+opml_import_done = Import�l�s befejezve
+opml_export_done = Exportport�l�s befejezve
+opml_path_blank = V�lasszon ki egy OPML f�jlt.
+opml_path_nofile = A megadott f�jl nem l�tezik.
+opml_path_invalid = �rv�nytelen �tvonal.
+opml_import_fail = Bet�lt�si hiba
+opml_import_badfile = �gy t�nik, ez nem egy OPML f�jl.
+opml_export_nocreate = F�jl l�trehoz�si hiba
+opml_select_file = Select OPML File
+opml_opml_file = OPML File
+
+
+# Date rendering values
+
+date_sunday = Vas�rnap
+date_sunday_short = Vas
+date_monday = H�tf�
+date_monday_short = H�t
+date_tuesday = Kedd
+date_tuesday_short = Ked
+date_wednesday = Szerda
+date_wednesday_short = Sze
+date_thursday = Cs�t�rt�k
+date_thursday_short = Cs�
+date_friday = P�ntek
+date_friday_short = P�n
+date_saturday = Szombat
+date_saturday_short = Szo
+
+date_january = Janu�r
+date_january_short = Jan
+date_february = Febru�r
+date_february_short = Feb
+date_march = M�rcius
+date_march_short = M�r
+date_april = �prilis
+date_april_short = �pr
+date_may = M�jus
+date_may_short = M�j
+date_june = J�nius
+date_june_short = J�n
+date_july = J�lius
+date_july_short = J�l
+date_august = Augusztus
+date_august_short = Aug
+date_september = Szeptember
+date_september_short = Sze
+date_october = Okt�ber
+date_october_short = Okt
+date_november = November
+date_november_short = Nov
+date_december = December
+date_december_short = Dec
+
+# Item context menu
+itemcontext_markasread = Mark as Read
+itemcontext_markasunread = Mark as Unread
+itemcontext_markallasread = Mark All as Read
+itemcontext_markallasunread = Mark All as Unread
diff --git a/src/sage/locale/it-IT/sage.dtd b/src/sage/locale/it-IT/sage.dtd
index c514066..d1a6522 100644
--- a/src/sage/locale/it-IT/sage.dtd
+++ b/src/sage/locale/it-IT/sage.dtd
@@ -1,52 +1,53 @@
-<!ENTITY sage.label "Sage">
-<!ENTITY sage.version "1.2">
-<!ENTITY sage.version.label "">
-
-<!ENTITY sage.toolbarLabel "Sage">
-<!ENTITY sage.sidebarTitle "Sage">
-<!ENTITY sage.tooltip "Mostra il pannello laterale di Sage">
-
-<!ENTITY menu.view "Visualizza">
-<!ENTITY menu.showSearchBar "Mostra Barra di Ricerca dei Feed">
-<!ENTITY menu.showFeedItemList "Mostra la Lista dei Feed">
-<!ENTITY menu.showDescTooltip "Mostra Descrizione Suggerimenti">
-<!ENTITY menu.openHTML "Mostra i Feed nel Browser">
-<!ENTITY menu.tools "Opzioni">
-<!ENTITY menu.checkUpdate "Controlla i Feed">
-<!ENTITY menu.manageRSSList "Gestione Lista dei Feed...">
-<!ENTITY menu.opmlImportExport "Importazione/Esportazione File OPML...">
-<!ENTITY menu.setting "Preferenze...">
-<!ENTITY menu.sageProjectFeed "Novita' sul Progetto Sage">
-<!ENTITY menu.discoverFeeds "Ricerca Feed Esterni">
-
-<!-- Feed Discovery -->
-<!ENTITY discovery.status.searching "Ricerca nella Pagina Corrente">
-<!ENTITY discovery.button.addFeed "Aggiungi un Feed">
-<!ENTITY discovery.button.close "Chiudi">
-<!ENTITY discovery.header.title "Titolo">
-<!ENTITY discovery.header.format "Formato">
-<!ENTITY discovery.header.lastPubDate "Ultimo Aggiornamento">
-<!ENTITY discovery.header.itemCount "Elementi">
-<!ENTITY discovery.header.url "URL">
-
-<!-- Settings Dialog -->
-<!ENTITY settings.general.caption "Generale">
-<!ENTITY settings.autoFeedTitle.label "Aggiorna Automaticamente il Titolo dei feed">
-<!ENTITY settings.renderFeeds.label "Mostra i Feed nel Browser">
-<!ENTITY settings.twelveHourClock.label "Usa Modalita' 12 ore">
-<!ENTITY settings.feedItemOrder.label "Ordinamento dei Feed">
-<!ENTITY settings.feedItemOrder.chrono "Cronologico">
-<!ENTITY settings.feedItemOrder.source "Sorgente">
-<!ENTITY settings.feedDiscoveryMode.label "Modalita' di Ricerca Feed">
-<!ENTITY settings.feedDiscoveryMode.exhaustive "Esaustiva">
-<!ENTITY settings.feedDiscoveryMode.conservative "Conservativa">
-<!ENTITY settingWindow.title "Configurazione di Sage">
-<!ENTITY selectFolder.label "Selezionare la Cartella dei Feed">
-<!ENTITY openInContentsArea.caption "Interpretazione dei Feed">
-<!ENTITY enableUserCss.label "Usa CSS Personalizzato">
-<!ENTITY browseCss.label "Sfoglia...">
-<!ENTITY allowEContent.label "Permetti i Tag HTML">
-
-
-<!ENTITY openSageSidebar.commandkey "S">
-<!ENTITY openSageSidebar.modifiersKey "alt">
\ No newline at end of file
+<!ENTITY sage.label "Sage">
+<!ENTITY sage.version "1.2">
+<!ENTITY sage.version.label "">
+
+<!ENTITY sage.toolbarLabel "Sage">
+<!ENTITY sage.sidebarTitle "Sage">
+<!ENTITY sage.tooltip "Mostra il pannello laterale di Sage">
+
+<!ENTITY menu.view "Visualizza">
+<!ENTITY menu.showSearchBar "Mostra Barra di Ricerca dei Feed">
+<!ENTITY menu.showFeedItemList "Mostra la Lista dei Feed">
+<!ENTITY menu.showDescTooltip "Mostra Descrizione Suggerimenti">
+<!ENTITY menu.openHTML "Mostra i Feed nel Browser">
+<!ENTITY menu.tools "Opzioni">
+<!ENTITY menu.checkUpdate "Controlla i Feed">
+<!ENTITY menu.manageRSSList "Gestione Lista dei Feed...">
+<!ENTITY menu.opmlImportExport "Importazione/Esportazione File OPML...">
+<!ENTITY menu.setting "Preferenze...">
+<!ENTITY menu.sageProjectFeed "Novita' sul Progetto Sage">
+<!ENTITY menu.discoverFeeds "Ricerca Feed Esterni">
+
+<!-- Feed Discovery -->
+<!ENTITY discovery.status.searching "Ricerca nella Pagina Corrente">
+<!ENTITY discovery.button.addFeed "Aggiungi un Feed">
+<!ENTITY discovery.button.close "Chiudi">
+<!ENTITY discovery.header.title "Titolo">
+<!ENTITY discovery.header.format "Formato">
+<!ENTITY discovery.header.lastPubDate "Ultimo Aggiornamento">
+<!ENTITY discovery.header.itemCount "Elementi">
+<!ENTITY discovery.header.url "URL">
+
+<!-- Settings Dialog -->
+<!ENTITY settings.general.caption "Generale">
+<!ENTITY settings.autoFeedTitle.label "Aggiorna Automaticamente il Titolo dei feed">
+<!ENTITY settings.renderFeeds.label "Mostra i Feed nel Browser">
+<!ENTITY settings.twelveHourClock.label "Usa Modalita' 12 ore">
+<!ENTITY settings.feedItemOrder.label "Ordinamento dei Feed">
+<!ENTITY settings.feedItemOrder.chrono "Cronologico">
+<!ENTITY settings.feedItemOrder.source "Sorgente">
+<!ENTITY settings.feedDiscoveryMode.label "Modalita' di Ricerca Feed">
+<!ENTITY settings.feedDiscoveryMode.exhaustive "Esaustiva">
+<!ENTITY settings.feedDiscoveryMode.conservative "Conservativa">
+<!ENTITY settingWindow.title "Configurazione di Sage">
+<!ENTITY selectFolder.label "Selezionare la Cartella dei Feed">
+<!ENTITY openInContentsArea.caption "Interpretazione dei Feed">
+<!ENTITY enableUserCss.label "Usa CSS Personalizzato">
+<!ENTITY browseCss.label "Sfoglia...">
+<!ENTITY allowEContent.label "Permetti i Tag HTML">
+
+
+<!ENTITY openSageSidebar.commandkey "S">
+<!ENTITY openSageSidebar.modifiersKey "alt">
+
diff --git a/src/sage/locale/it-IT/sage.properties b/src/sage/locale/it-IT/sage.properties
index bae086c..ea81047 100644
--- a/src/sage/locale/it-IT/sage.properties
+++ b/src/sage/locale/it-IT/sage.properties
@@ -1,84 +1,90 @@
-RESULT_OK_STR = OK
-RESULT_PARSE_ERROR_STR = Errore analisi XML
-RESULT_NOT_RSS_STR = Errore analisi Feed
-RESULT_NOT_FOUND_STR = File non trovato
-RESULT_NOT_AVAILABLE_STR = URL non disponibile
-RESULT_ERROR_FAILURE_STR = Errore di caricamento
-RESULT_LOADING = Caricamento
-RESULT_CHECKING = Controllo di
-
-CHECK_UPDATE = Controlla i Feed
-GET_RSS_TITLE= Ottieni il titolo dei Feed
-
-
-# feed discovery messages
-
-discovery_external_feeds_category = Feed Esterni
-discovery_status_discovered = Trovati
-discovery_status_site_feed = sito con feed
-discovery_status_site_feeds = siti con feed
-discovery_status_and = and
-discovery_status_external_feed = feed esterno
-discovery_status_external_feeds = feed esterni
-discovery_status_none_found = Nessun feed trovato
-
-
-# get feed title dialog
-
-get_feed_title = Nuovo Titolo Feed
-
-
-# OPML wizzard
-
-opml_import_done = Importazione Completa
-opml_export_done = Esportazione Completa
-opml_path_blank = Per favore scegliere un file OPML.
-opml_path_nofile = Il file specificato non esiste.
-opml_path_invalid = Percorso del file non valido.
-opml_import_fail = Errore di caricamento
-opml_import_badfile = Questo non sembra essere un file OPML.
-opml_export_nocreate = Errore creazione file
-opml_select_file = Selezionare un file OPML
-opml_opml_file = File OPML
-
-# Date rendering values
-
-date_sunday = Domenica
-date_sunday_short = Dom
-date_monday = Lunedi
-date_monday_short = Lun
-date_tuesday = Martedi
-date_tuesday_short = Mar
-date_wednesday = Mercoledi
-date_wednesday_short = Mer
-date_thursday = Giovedi
-date_thursday_short = Gio
-date_friday = Venerdi
-date_friday_short = Ven
-date_saturday = Sabato
-date_saturday_short = Sab
-
-date_january = Gennaio
-date_january_short = Gen
-date_february = Febbraio
-date_february_short = Feb
-date_march = Marzo
-date_march_short = Mar
-date_april = Aprile
-date_april_short = Apr
-date_may = Maggio
-date_may_short = Mag
-date_june = Giugno
-date_june_short = Giu
-date_july = Luglio
-date_july_short = Lug
-date_august = Agosto
-date_august_short = Ago
-date_september = Settembre
-date_september_short = Set
-date_october = Ottobre
-date_october_short = Ott
-date_november = Novembre
-date_november_short = Nov
-date_december = Dicembre
-date_december_short = Dic
\ No newline at end of file
+RESULT_OK_STR = OK
+RESULT_PARSE_ERROR_STR = Errore analisi XML
+RESULT_NOT_RSS_STR = Errore analisi Feed
+RESULT_NOT_FOUND_STR = File non trovato
+RESULT_NOT_AVAILABLE_STR = URL non disponibile
+RESULT_ERROR_FAILURE_STR = Errore di caricamento
+RESULT_LOADING = Caricamento
+RESULT_CHECKING = Controllo di
+
+CHECK_UPDATE = Controlla i Feed
+GET_RSS_TITLE= Ottieni il titolo dei Feed
+
+
+# feed discovery messages
+
+discovery_external_feeds_category = Feed Esterni
+discovery_status_discovered = Trovati
+discovery_status_site_feed = sito con feed
+discovery_status_site_feeds = siti con feed
+discovery_status_and = and
+discovery_status_external_feed = feed esterno
+discovery_status_external_feeds = feed esterni
+discovery_status_none_found = Nessun feed trovato
+
+
+# get feed title dialog
+
+get_feed_title = Nuovo Titolo Feed
+
+
+# OPML wizzard
+
+opml_import_done = Importazione Completa
+opml_export_done = Esportazione Completa
+opml_path_blank = Per favore scegliere un file OPML.
+opml_path_nofile = Il file specificato non esiste.
+opml_path_invalid = Percorso del file non valido.
+opml_import_fail = Errore di caricamento
+opml_import_badfile = Questo non sembra essere un file OPML.
+opml_export_nocreate = Errore creazione file
+opml_select_file = Selezionare un file OPML
+opml_opml_file = File OPML
+
+# Date rendering values
+
+date_sunday = Domenica
+date_sunday_short = Dom
+date_monday = Lunedi
+date_monday_short = Lun
+date_tuesday = Martedi
+date_tuesday_short = Mar
+date_wednesday = Mercoledi
+date_wednesday_short = Mer
+date_thursday = Giovedi
+date_thursday_short = Gio
+date_friday = Venerdi
+date_friday_short = Ven
+date_saturday = Sabato
+date_saturday_short = Sab
+
+date_january = Gennaio
+date_january_short = Gen
+date_february = Febbraio
+date_february_short = Feb
+date_march = Marzo
+date_march_short = Mar
+date_april = Aprile
+date_april_short = Apr
+date_may = Maggio
+date_may_short = Mag
+date_june = Giugno
+date_june_short = Giu
+date_july = Luglio
+date_july_short = Lug
+date_august = Agosto
+date_august_short = Ago
+date_september = Settembre
+date_september_short = Set
+date_october = Ottobre
+date_october_short = Ott
+date_november = Novembre
+date_november_short = Nov
+date_december = Dicembre
+date_december_short = Dic
+
+# Item context menu
+itemcontext_markasread = Mark as Read
+itemcontext_markasunread = Mark as Unread
+itemcontext_markallasread = Mark All as Read
+itemcontext_markallasunread = Mark All as Unread
diff --git a/src/sage/locale/ja-JP/sage.dtd b/src/sage/locale/ja-JP/sage.dtd
index 2baedf8..7c33c3a 100755
--- a/src/sage/locale/ja-JP/sage.dtd
+++ b/src/sage/locale/ja-JP/sage.dtd
@@ -1,53 +1,54 @@
-<!ENTITY sage.label "RSS リーダパネル">
-<!ENTITY sage.version "1.2">
-<!ENTITY sage.version.label "">
-
-<!ENTITY sage.toolbarLabel "RSS リーダ">
-<!ENTITY sage.sidebarTitle "RSS リーダ">
-<!ENTITY sage.tooltip "RSS リーダパネルを表示">
-
-
-<!ENTITY menu.view "表示">
-<!ENTITY menu.showSearchBar "Feed 検索バーの表示">
-<!ENTITY menu.showFeedItemList "">
-<!ENTITY menu.showDescTooltip "Description ツールチップの表示">
-<!ENTITY menu.openHTML "コンテンツエリアで開く">
-<!ENTITY menu.tools "ツール">
-<!ENTITY menu.checkUpdate "更新チェック">
-<!ENTITY menu.manageRSSList "RSS リストの管理">
-<!ENTITY menu.opmlImportExport "OPML インポート/エクスポート...">
-<!ENTITY menu.setting "設定...">
-<!ENTITY menu.sageProjectFeed "Sage Project News">
-<!ENTITY menu.discoverFeeds "Discover Feeds">
-
-<!-- Feed Discovery -->
-<!ENTITY discovery.status.searching "Searching current page">
-<!ENTITY discovery.button.addFeed "Add Feed">
-<!ENTITY discovery.button.close "Close">
-<!ENTITY discovery.header.title "Title">
-<!ENTITY discovery.header.format "Format">
-<!ENTITY discovery.header.lastPubDate "Last Update">
-<!ENTITY discovery.header.itemCount "Items">
-<!ENTITY discovery.header.url "URL">
-
-<!-- Setting Dialog -->
-<!ENTITY settings.general.caption "General">
-<!ENTITY settings.autoFeedTitle.label "Automatically update feed titles">
-<!ENTITY settings.renderFeeds.label "Render feeds in contents area">
-<!ENTITY settings.twelveHourClock.label "Use 12 hour clock">
-<!ENTITY settingWindow.title "設定: RSS リーダパネル">
-<!ENTITY selectFolder.label "RSS リストフォルダの選択">
-<!ENTITY settings.feedItemOrder.label "Feed Item Order">
-<!ENTITY settings.feedItemOrder.chrono "Chronological">
-<!ENTITY settings.feedItemOrder.source "Source">
-<!ENTITY settings.feedDiscoveryMode.label "Feed discovery mode">
-<!ENTITY settings.feedDiscoveryMode.exhaustive "Exhaustive">
-<!ENTITY settings.feedDiscoveryMode.conservative "Conservative">
-<!ENTITY openInContentsArea.caption "コンテンツエリアで開く">
-<!ENTITY enableUserCss.label "ユーザー CSS を使う">
-<!ENTITY browseCss.label "参照...">
-<!ENTITY allowEContent.label "HTML タグを許可する">
-
-
-<!ENTITY openSageSidebar.commandkey "S">
-<!ENTITY openSageSidebar.modifiersKey "alt">
\ No newline at end of file
+<!ENTITY sage.label "RSS リーダパネル">
+<!ENTITY sage.version "1.2">
+<!ENTITY sage.version.label "">
+
+<!ENTITY sage.toolbarLabel "RSS リーダ">
+<!ENTITY sage.sidebarTitle "RSS リーダ">
+<!ENTITY sage.tooltip "RSS リーダパネルを表示">
+
+
+<!ENTITY menu.view "表示">
+<!ENTITY menu.showSearchBar "Feed 検索バーの表示">
+<!ENTITY menu.showFeedItemList "">
+<!ENTITY menu.showDescTooltip "Description ツールチップの表示">
+<!ENTITY menu.openHTML "コンテンツエリアで開く">
+<!ENTITY menu.tools "ツール">
+<!ENTITY menu.checkUpdate "更新チェック">
+<!ENTITY menu.manageRSSList "RSS リストの管理">
+<!ENTITY menu.opmlImportExport "OPML インポート/エクスポート...">
+<!ENTITY menu.setting "設定...">
+<!ENTITY menu.sageProjectFeed "Sage Project News">
+<!ENTITY menu.discoverFeeds "Discover Feeds">
+
+<!-- Feed Discovery -->
+<!ENTITY discovery.status.searching "Searching current page">
+<!ENTITY discovery.button.addFeed "Add Feed">
+<!ENTITY discovery.button.close "Close">
+<!ENTITY discovery.header.title "Title">
+<!ENTITY discovery.header.format "Format">
+<!ENTITY discovery.header.lastPubDate "Last Update">
+<!ENTITY discovery.header.itemCount "Items">
+<!ENTITY discovery.header.url "URL">
+
+<!-- Setting Dialog -->
+<!ENTITY settings.general.caption "General">
+<!ENTITY settings.autoFeedTitle.label "Automatically update feed titles">
+<!ENTITY settings.renderFeeds.label "Render feeds in contents area">
+<!ENTITY settings.twelveHourClock.label "Use 12 hour clock">
+<!ENTITY settingWindow.title "設定: RSS リーダパネル">
+<!ENTITY selectFolder.label "RSS リストフォルダの選択">
+<!ENTITY settings.feedItemOrder.label "Feed Item Order">
+<!ENTITY settings.feedItemOrder.chrono "Chronological">
+<!ENTITY settings.feedItemOrder.source "Source">
+<!ENTITY settings.feedDiscoveryMode.label "Feed discovery mode">
+<!ENTITY settings.feedDiscoveryMode.exhaustive "Exhaustive">
+<!ENTITY settings.feedDiscoveryMode.conservative "Conservative">
+<!ENTITY openInContentsArea.caption "コンテンツエリアで開く">
+<!ENTITY enableUserCss.label "ユーザー CSS を使う">
+<!ENTITY browseCss.label "参照...">
+<!ENTITY allowEContent.label "HTML タグを許可する">
+
+
+<!ENTITY openSageSidebar.commandkey "S">
+<!ENTITY openSageSidebar.modifiersKey "alt">
+
diff --git a/src/sage/locale/ja-JP/sage.properties b/src/sage/locale/ja-JP/sage.properties
index c6e6c1c..32de364 100755
--- a/src/sage/locale/ja-JP/sage.properties
+++ b/src/sage/locale/ja-JP/sage.properties
@@ -1,85 +1,91 @@
-RESULT_OK_STR = OK
-RESULT_PARSE_ERROR_STR = XML \u30d1\u30fc\u30b9\u30a8\u30e9\u30fc
-RESULT_NOT_RSS_STR = \u3053\u306e XML \u30d5\u30a1\u30a4\u30eb\u306f RSS \u3067\u306f\u3042\u308a\u307e\u305b\u3093
-RESULT_NOT_FOUND_STR = \u30d5\u30a1\u30a4\u30eb\u304c\u5b58\u5728\u3057\u307e\u305b\u3093
-RESULT_NOT_AVAILABLE_STR = \u5b58\u5728\u3057\u306a\u3044 URL \u3067\u3059
-RESULT_ERROR_FAILURE_STR = \u8aad\u307f\u8fbc\u307f\u306b\u5931\u6557\u3057\u307e\u3057\u305f
-RESULT_LOADING = Loading
-RESULT_CHECKING = Checking
-
-CHECK_UPDATE = \u66f4\u65b0\u30c1\u30a7\u30c3\u30af
-GET_RSS_TITLE= RSS \u30bf\u30a4\u30c8\u30eb\u306e\u53d6\u5f97
-
-
-# feed discovery messages
-
-discovery_external_feeds_category = External Feeds
-discovery_status_discovered = Discovered
-discovery_status_site_feed = site feed
-discovery_status_site_feeds = site feeds
-discovery_status_and = and
-discovery_status_external_feed = external feed
-discovery_status_external_feeds = external feeds
-discovery_status_none_found = No feeds were discovered
-
-
-# get feed title dialog
-
-get_feed_title = New Feed Title
-
-
-# OPML wizzard
-
-opml_import_done = Import Complete
-opml_export_done = Export Complete
-opml_path_blank = Please choose an OPML file.
-opml_path_nofile = The specified file does not exist.
-opml_path_invalid = Invalid file path.
-opml_import_fail = Load Failure
-opml_import_badfile = This does not appear to be an OPML file.
-opml_export_nocreate = File creation error
-opml_select_file = Select OPML File
-opml_opml_file = OPML File
-
-
-# Date rendering values
-
-date_sunday = Sunday
-date_sunday_short = Sun
-date_monday = Monday
-date_monday_short = Mon
-date_tuesday = Tuesday
-date_tuesday_short = Tue
-date_wednesday = Wednesday
-date_wednesday_short = Wed
-date_thursday = Thursday
-date_thursday_short = Thu
-date_friday = Friday
-date_friday_short = Fri
-date_saturday = Saturday
-date_saturday_short = Sat
-
-date_january = January
-date_january_short = Jan
-date_february = February
-date_february_short = Feb
-date_march = March
-date_march_short = Mar
-date_april = April
-date_april_short = Apr
-date_may = May
-date_may_short = May
-date_june = June
-date_june_short = Jun
-date_july = July
-date_july_short = Jul
-date_august = August
-date_august_short = Aug
-date_september = September
-date_september_short = Sep
-date_october = October
-date_october_short = Oct
-date_november = November
-date_november_short = Nov
-date_december = December
-date_december_short = Dec
\ No newline at end of file
+RESULT_OK_STR = OK
+RESULT_PARSE_ERROR_STR = XML \u30d1\u30fc\u30b9\u30a8\u30e9\u30fc
+RESULT_NOT_RSS_STR = \u3053\u306e XML \u30d5\u30a1\u30a4\u30eb\u306f RSS \u3067\u306f\u3042\u308a\u307e\u305b\u3093
+RESULT_NOT_FOUND_STR = \u30d5\u30a1\u30a4\u30eb\u304c\u5b58\u5728\u3057\u307e\u305b\u3093
+RESULT_NOT_AVAILABLE_STR = \u5b58\u5728\u3057\u306a\u3044 URL \u3067\u3059
+RESULT_ERROR_FAILURE_STR = \u8aad\u307f\u8fbc\u307f\u306b\u5931\u6557\u3057\u307e\u3057\u305f
+RESULT_LOADING = Loading
+RESULT_CHECKING = Checking
+
+CHECK_UPDATE = \u66f4\u65b0\u30c1\u30a7\u30c3\u30af
+GET_RSS_TITLE= RSS \u30bf\u30a4\u30c8\u30eb\u306e\u53d6\u5f97
+
+
+# feed discovery messages
+
+discovery_external_feeds_category = External Feeds
+discovery_status_discovered = Discovered
+discovery_status_site_feed = site feed
+discovery_status_site_feeds = site feeds
+discovery_status_and = and
+discovery_status_external_feed = external feed
+discovery_status_external_feeds = external feeds
+discovery_status_none_found = No feeds were discovered
+
+
+# get feed title dialog
+
+get_feed_title = New Feed Title
+
+
+# OPML wizzard
+
+opml_import_done = Import Complete
+opml_export_done = Export Complete
+opml_path_blank = Please choose an OPML file.
+opml_path_nofile = The specified file does not exist.
+opml_path_invalid = Invalid file path.
+opml_import_fail = Load Failure
+opml_import_badfile = This does not appear to be an OPML file.
+opml_export_nocreate = File creation error
+opml_select_file = Select OPML File
+opml_opml_file = OPML File
+
+
+# Date rendering values
+
+date_sunday = Sunday
+date_sunday_short = Sun
+date_monday = Monday
+date_monday_short = Mon
+date_tuesday = Tuesday
+date_tuesday_short = Tue
+date_wednesday = Wednesday
+date_wednesday_short = Wed
+date_thursday = Thursday
+date_thursday_short = Thu
+date_friday = Friday
+date_friday_short = Fri
+date_saturday = Saturday
+date_saturday_short = Sat
+
+date_january = January
+date_january_short = Jan
+date_february = February
+date_february_short = Feb
+date_march = March
+date_march_short = Mar
+date_april = April
+date_april_short = Apr
+date_may = May
+date_may_short = May
+date_june = June
+date_june_short = Jun
+date_july = July
+date_july_short = Jul
+date_august = August
+date_august_short = Aug
+date_september = September
+date_september_short = Sep
+date_october = October
+date_october_short = Oct
+date_november = November
+date_november_short = Nov
+date_december = December
+date_december_short = Dec
+
+# Item context menu
+itemcontext_markasread = Mark as Read
+itemcontext_markasunread = Mark as Unread
+itemcontext_markallasread = Mark All as Read
+itemcontext_markallasunread = Mark All as Unread
diff --git a/src/sage/locale/nl-NL/sage.dtd b/src/sage/locale/nl-NL/sage.dtd
index 532d6c6..9bd5c27 100644
--- a/src/sage/locale/nl-NL/sage.dtd
+++ b/src/sage/locale/nl-NL/sage.dtd
@@ -1,52 +1,52 @@
-<!ENTITY sage.label "Sage">
-<!ENTITY sage.version "1.2">
-<!ENTITY sage.version.label "versie">
-
-<!ENTITY sage.toolbarLabel "Sage">
-<!ENTITY sage.sidebarTitle "Sage">
-<!ENTITY sage.tooltip "Toon Sage">
-
-<!ENTITY menu.view "Beeld">
-<!ENTITY menu.showSearchBar "Toon feed zoekbalk">
-<!ENTITY menu.showFeedItemList "Toon feed itemlijst">
-<!ENTITY menu.showDescTooltip "Toon beschrijvende tooltips">
-<!ENTITY menu.openHTML "Open feeds in Contents Area">
-<!ENTITY menu.tools "Opties">
-<!ENTITY menu.checkUpdate "Controleer feeds">
-<!ENTITY menu.manageRSSList "Beheer feedlijst...">
-<!ENTITY menu.opmlImportExport "OPML Importeren/Exporteren...">
-<!ENTITY menu.setting "Instellingen...">
-<!ENTITY menu.sageProjectFeed "Sage Projectnieuws">
-<!ENTITY menu.discoverFeeds "Ontdek feeds">
-
-<!-- Feed Discovery -->
-<!ENTITY discovery.status.searching "Zoeken op huidige pagina">
-<!ENTITY discovery.button.addFeed "Feed toevoegen">
-<!ENTITY discovery.button.close "Sluiten">
-<!ENTITY discovery.header.title "Titel">
-<!ENTITY discovery.header.format "Formaat">
-<!ENTITY discovery.header.lastPubDate "Laatste update">
-<!ENTITY discovery.header.itemCount "Items">
-<!ENTITY discovery.header.url "URL">
-
-<!-- Settings Dialog -->
-<!ENTITY settings.general.caption "Algemeen">
-<!ENTITY settings.autoFeedTitle.label "Automatisch feedtitels bijwerken">
-<!ENTITY settings.renderFeeds.label "Feeds weergeven in Contents Area">
-<!ENTITY settings.twelveHourClock.label "Gebruik 12-uurs klok">
-<!ENTITY settings.feedItemOrder.label "Volgorde van feeditems">
-<!ENTITY settings.feedItemOrder.chrono "Chronologisch">
-<!ENTITY settings.feedItemOrder.source "Bron">
-<!ENTITY settings.feedDiscoveryMode.label "Feed ontdekkingsmodus">
-<!ENTITY settings.feedDiscoveryMode.exhaustive "Grondig">
-<!ENTITY settings.feedDiscoveryMode.conservative "Conservatief">
-<!ENTITY settingWindow.title "Sage instellingen">
-<!ENTITY selectFolder.label "Selecteer map met feeds">
-<!ENTITY openInContentsArea.caption "Feedweergave">
-<!ENTITY enableUserCss.label "Gebruik aangepaste CSS">
-<!ENTITY browseCss.label "Verkennen...">
-<!ENTITY allowEContent.label "HTML tags toestaan">
-
-
-<!ENTITY openSageSidebar.commandkey "S">
-<!ENTITY openSageSidebar.modifiersKey "alt">
+<!ENTITY sage.label "Sage">
+<!ENTITY sage.version "1.2">
+<!ENTITY sage.version.label "versie">
+
+<!ENTITY sage.toolbarLabel "Sage">
+<!ENTITY sage.sidebarTitle "Sage">
+<!ENTITY sage.tooltip "Toon Sage">
+
+<!ENTITY menu.view "Beeld">
+<!ENTITY menu.showSearchBar "Toon feed zoekbalk">
+<!ENTITY menu.showFeedItemList "Toon feed itemlijst">
+<!ENTITY menu.showDescTooltip "Toon beschrijvende tooltips">
+<!ENTITY menu.openHTML "Open feeds in Contents Area">
+<!ENTITY menu.tools "Opties">
+<!ENTITY menu.checkUpdate "Controleer feeds">
+<!ENTITY menu.manageRSSList "Beheer feedlijst...">
+<!ENTITY menu.opmlImportExport "OPML Importeren/Exporteren...">
+<!ENTITY menu.setting "Instellingen...">
+<!ENTITY menu.sageProjectFeed "Sage Projectnieuws">
+<!ENTITY menu.discoverFeeds "Ontdek feeds">
+
+<!-- Feed Discovery -->
+<!ENTITY discovery.status.searching "Zoeken op huidige pagina">
+<!ENTITY discovery.button.addFeed "Feed toevoegen">
+<!ENTITY discovery.button.close "Sluiten">
+<!ENTITY discovery.header.title "Titel">
+<!ENTITY discovery.header.format "Formaat">
+<!ENTITY discovery.header.lastPubDate "Laatste update">
+<!ENTITY discovery.header.itemCount "Items">
+<!ENTITY discovery.header.url "URL">
+
+<!-- Settings Dialog -->
+<!ENTITY settings.general.caption "Algemeen">
+<!ENTITY settings.autoFeedTitle.label "Automatisch feedtitels bijwerken">
+<!ENTITY settings.renderFeeds.label "Feeds weergeven in Contents Area">
+<!ENTITY settings.twelveHourClock.label "Gebruik 12-uurs klok">
+<!ENTITY settings.feedItemOrder.label "Volgorde van feeditems">
+<!ENTITY settings.feedItemOrder.chrono "Chronologisch">
+<!ENTITY settings.feedItemOrder.source "Bron">
+<!ENTITY settings.feedDiscoveryMode.label "Feed ontdekkingsmodus">
+<!ENTITY settings.feedDiscoveryMode.exhaustive "Grondig">
+<!ENTITY settings.feedDiscoveryMode.conservative "Conservatief">
+<!ENTITY settingWindow.title "Sage instellingen">
+<!ENTITY selectFolder.label "Selecteer map met feeds">
+<!ENTITY openInContentsArea.caption "Feedweergave">
+<!ENTITY enableUserCss.label "Gebruik aangepaste CSS">
+<!ENTITY browseCss.label "Verkennen...">
+<!ENTITY allowEContent.label "HTML tags toestaan">
+
+
+<!ENTITY openSageSidebar.commandkey "S">
+<!ENTITY openSageSidebar.modifiersKey "alt">
diff --git a/src/sage/locale/nl-NL/sage.properties b/src/sage/locale/nl-NL/sage.properties
index 6ab4d17..a8bbb41 100644
--- a/src/sage/locale/nl-NL/sage.properties
+++ b/src/sage/locale/nl-NL/sage.properties
@@ -1,84 +1,90 @@
-RESULT_OK_STR = OK
-RESULT_PARSE_ERROR_STR = XML parse fout
-RESULT_NOT_RSS_STR = Feed parse fout
-RESULT_NOT_FOUND_STR = Bestand niet gevonden
-RESULT_NOT_AVAILABLE_STR = URL niet beschikbaar
-RESULT_ERROR_FAILURE_STR = Laadfout
-RESULT_LOADING = Bezig met laden
-RESULT_CHECKING = Bezig met controleren
-
-CHECK_UPDATE = Controleer feeds
-GET_RSS_TITLE= Feedtitel ophalen
-
-
-# feed discovery messages
-
-discovery_external_feeds_category = Externe feeds
-discovery_status_discovered = Ontdekt
-discovery_status_site_feed = site feed
-discovery_status_site_feeds = site feeds
-discovery_status_and = en
-discovery_status_external_feed = externe feed
-discovery_status_external_feeds = externe feeds
-discovery_status_none_found = Geen feeds ontdekt
-
-
-# get feed title dialog
-
-get_feed_title = Nieuwe feedtitel
-
-
-# OPML wizzard
-
-opml_import_done = Import volledig
-opml_export_done = Export volledig
-opml_path_blank = Kies alstublieft een OPML bestand.
-opml_path_nofile = Het opgegeven bestand bestaat niet.
-opml_path_invalid = Ongeldig bestandspad.
-opml_import_fail = Laadfout
-opml_import_badfile = Dit blijkt geen OPML bestand te zijn.
-opml_export_nocreate = Fout bij aanmaken bestand
-opml_select_file = Selecteer OPML bestand
-opml_opml_file = OPML bestand
-
-# Date rendering values
-
-date_sunday = Zondag
-date_sunday_short = Zo
-date_monday = Maandag
-date_monday_short = Ma
-date_tuesday = Dinsdag
-date_tuesday_short = Di
-date_wednesday = Woensdag
-date_wednesday_short = Woe
-date_thursday = Donderdag
-date_thursday_short = Do
-date_friday = Vrijdag
-date_friday_short = Vrij
-date_saturday = Zaterdag
-date_saturday_short = Za
-
-date_january = Januari
-date_january_short = Jan
-date_february = Februari
-date_february_short = Feb
-date_march = Maart
-date_march_short = Maa
-date_april = April
-date_april_short = Apr
-date_may = Mei
-date_may_short = Mei
-date_june = Juni
-date_june_short = Jun
-date_july = Juli
-date_july_short = Jul
-date_august = Augustus
-date_august_short = Aug
-date_september = September
-date_september_short = Sep
-date_october = Oktober
-date_october_short = Okt
-date_november = November
-date_november_short = Nov
-date_december = December
-date_december_short = Dec
+RESULT_OK_STR = OK
+RESULT_PARSE_ERROR_STR = XML parse fout
+RESULT_NOT_RSS_STR = Feed parse fout
+RESULT_NOT_FOUND_STR = Bestand niet gevonden
+RESULT_NOT_AVAILABLE_STR = URL niet beschikbaar
+RESULT_ERROR_FAILURE_STR = Laadfout
+RESULT_LOADING = Bezig met laden
+RESULT_CHECKING = Bezig met controleren
+
+CHECK_UPDATE = Controleer feeds
+GET_RSS_TITLE= Feedtitel ophalen
+
+
+# feed discovery messages
+
+discovery_external_feeds_category = Externe feeds
+discovery_status_discovered = Ontdekt
+discovery_status_site_feed = site feed
+discovery_status_site_feeds = site feeds
+discovery_status_and = en
+discovery_status_external_feed = externe feed
+discovery_status_external_feeds = externe feeds
+discovery_status_none_found = Geen feeds ontdekt
+
+
+# get feed title dialog
+
+get_feed_title = Nieuwe feedtitel
+
+
+# OPML wizzard
+
+opml_import_done = Import volledig
+opml_export_done = Export volledig
+opml_path_blank = Kies alstublieft een OPML bestand.
+opml_path_nofile = Het opgegeven bestand bestaat niet.
+opml_path_invalid = Ongeldig bestandspad.
+opml_import_fail = Laadfout
+opml_import_badfile = Dit blijkt geen OPML bestand te zijn.
+opml_export_nocreate = Fout bij aanmaken bestand
+opml_select_file = Selecteer OPML bestand
+opml_opml_file = OPML bestand
+
+# Date rendering values
+
+date_sunday = Zondag
+date_sunday_short = Zo
+date_monday = Maandag
+date_monday_short = Ma
+date_tuesday = Dinsdag
+date_tuesday_short = Di
+date_wednesday = Woensdag
+date_wednesday_short = Woe
+date_thursday = Donderdag
+date_thursday_short = Do
+date_friday = Vrijdag
+date_friday_short = Vrij
+date_saturday = Zaterdag
+date_saturday_short = Za
+
+date_january = Januari
+date_january_short = Jan
+date_february = Februari
+date_february_short = Feb
+date_march = Maart
+date_march_short = Maa
+date_april = April
+date_april_short = Apr
+date_may = Mei
+date_may_short = Mei
+date_june = Juni
+date_june_short = Jun
+date_july = Juli
+date_july_short = Jul
+date_august = Augustus
+date_august_short = Aug
+date_september = September
+date_september_short = Sep
+date_october = Oktober
+date_october_short = Okt
+date_november = November
+date_november_short = Nov
+date_december = December
+date_december_short = Dec
+
+# Item context menu
+itemcontext_markasread = Mark as Read
+itemcontext_markasunread = Mark as Unread
+itemcontext_markallasread = Mark All as Read
+itemcontext_markallasunread = Mark All as Unread
diff --git a/src/sage/locale/zh-TW/sage.dtd b/src/sage/locale/zh-TW/sage.dtd
index 2798b10..54b7aef 100644
--- a/src/sage/locale/zh-TW/sage.dtd
+++ b/src/sage/locale/zh-TW/sage.dtd
@@ -1,52 +1,52 @@
-<!ENTITY sage.label "Sage">
-<!ENTITY sage.version "1.2.1">
-<!ENTITY sage.version.label "版本">
-
-<!ENTITY sage.toolbarLabel "Sage">
-<!ENTITY sage.sidebarTitle "Sage">
-<!ENTITY sage.tooltip "Displays Sage">
-
-<!ENTITY menu.view "顯示">
-<!ENTITY menu.showSearchBar "顯示 Feed 搜尋列">
-<!ENTITY menu.showFeedItemList "顯示 Fees 文章列表">
-<!ENTITY menu.showDescTooltip "顯示描述提示">
-<!ENTITY menu.openHTML "在內容區域開啟Feeds">
-<!ENTITY menu.tools "選項">
-<!ENTITY menu.checkUpdate "檢查更新">
-<!ENTITY menu.manageRSSList "管理 Feed 列表...">
-<!ENTITY menu.opmlImportExport "OPML 匯入/匯出...">
-<!ENTITY menu.setting "設置...">
-<!ENTITY menu.sageProjectFeed "Sage Project 新消息">
-<!ENTITY menu.discoverFeeds "發覺 Feeds">
-
-<!-- Feed Discovery -->
-<!ENTITY discovery.status.searching "搜尋目前頁面">
-<!ENTITY discovery.button.addFeed "加入 Feed">
-<!ENTITY discovery.button.close "關閉">
-<!ENTITY discovery.header.title "標題">
-<!ENTITY discovery.header.format "格式">
-<!ENTITY discovery.header.lastPubDate "最後更新日期">
-<!ENTITY discovery.header.itemCount "文章數">
-<!ENTITY discovery.header.url "URL">
-
-<!-- Settings Dialog -->
-<!ENTITY settings.general.caption "一般設定">
-<!ENTITY settings.autoFeedTitle.label "自動更新 Feed 標題">
-<!ENTITY settings.renderFeeds.label "在瀏覽器內容區域表現Feeds">
-<!ENTITY settings.twelveHourClock.label "使用12小時制">
-<!ENTITY settings.feedItemOrder.label "Feed 文章順序">
-<!ENTITY settings.feedItemOrder.chrono "按時間順序排序">
-<!ENTITY settings.feedItemOrder.source "按來源順序排序">
-<!ENTITY settings.feedDiscoveryMode.label "發覺 Feed 模式">
-<!ENTITY settings.feedDiscoveryMode.exhaustive "徹底的">
-<!ENTITY settings.feedDiscoveryMode.conservative "保守的">
-<!ENTITY settingWindow.title "Sage 設定">
-<!ENTITY selectFolder.label "選擇 Feed 的資料夾">
-<!ENTITY openInContentsArea.caption "Feed 表示">
-<!ENTITY enableUserCss.label "使用自訂的 CSS">
-<!ENTITY browseCss.label "瀏覽...">
-<!ENTITY allowEContent.label "允許 HTML 標籤">
-
-
-<!ENTITY openSageSidebar.commandkey "S">
-<!ENTITY openSageSidebar.modifiersKey "alt">
\ No newline at end of file
+<!ENTITY sage.label "Sage">
+<!ENTITY sage.version "1.2.1">
+<!ENTITY sage.version.label "版本">
+
+<!ENTITY sage.toolbarLabel "Sage">
+<!ENTITY sage.sidebarTitle "Sage">
+<!ENTITY sage.tooltip "Displays Sage">
+
+<!ENTITY menu.view "顯示">
+<!ENTITY menu.showSearchBar "顯示 Feed 搜尋列">
+<!ENTITY menu.showFeedItemList "顯示 Fees 文章列表">
+<!ENTITY menu.showDescTooltip "顯示描述提示">
+<!ENTITY menu.openHTML "在內容區域開啟Feeds">
+<!ENTITY menu.tools "選項">
+<!ENTITY menu.checkUpdate "檢查更新">
+<!ENTITY menu.manageRSSList "管理 Feed 列表...">
+<!ENTITY menu.opmlImportExport "OPML 匯入/匯出...">
+<!ENTITY menu.setting "設置...">
+<!ENTITY menu.sageProjectFeed "Sage Project 新消息">
+<!ENTITY menu.discoverFeeds "發覺 Feeds">
+
+<!-- Feed Discovery -->
+<!ENTITY discovery.status.searching "搜尋目前頁面">
+<!ENTITY discovery.button.addFeed "加入 Feed">
+<!ENTITY discovery.button.close "關閉">
+<!ENTITY discovery.header.title "標題">
+<!ENTITY discovery.header.format "格式">
+<!ENTITY discovery.header.lastPubDate "最後更新日期">
+<!ENTITY discovery.header.itemCount "文章數">
+<!ENTITY discovery.header.url "URL">
+
+<!-- Settings Dialog -->
+<!ENTITY settings.general.caption "一般設定">
+<!ENTITY settings.autoFeedTitle.label "自動更新 Feed 標題">
+<!ENTITY settings.renderFeeds.label "在瀏覽器內容區域表現Feeds">
+<!ENTITY settings.twelveHourClock.label "使用12小時制">
+<!ENTITY settings.feedItemOrder.label "Feed 文章順序">
+<!ENTITY settings.feedItemOrder.chrono "按時間順序排序">
+<!ENTITY settings.feedItemOrder.source "按來源順序排序">
+<!ENTITY settings.feedDiscoveryMode.label "發覺 Feed 模式">
+<!ENTITY settings.feedDiscoveryMode.exhaustive "徹底的">
+<!ENTITY settings.feedDiscoveryMode.conservative "保守的">
+<!ENTITY settingWindow.title "Sage 設定">
+<!ENTITY selectFolder.label "選擇 Feed 的資料夾">
+<!ENTITY openInContentsArea.caption "Feed 表示">
+<!ENTITY enableUserCss.label "使用自訂的 CSS">
+<!ENTITY browseCss.label "瀏覽...">
+<!ENTITY allowEContent.label "允許 HTML 標籤">
+
+
+<!ENTITY openSageSidebar.commandkey "S">
+<!ENTITY openSageSidebar.modifiersKey "alt">
diff --git a/src/sage/locale/zh-TW/sage.properties b/src/sage/locale/zh-TW/sage.properties
index b737212..06f8695 100644
--- a/src/sage/locale/zh-TW/sage.properties
+++ b/src/sage/locale/zh-TW/sage.properties
@@ -1,84 +1,90 @@
-RESULT_OK_STR = OK
-RESULT_PARSE_ERROR_STR = XML 分析錯誤
-RESULT_NOT_RSS_STR = Feed 分析發生錯誤
-RESULT_NOT_FOUND_STR = 並未找到檔案
-RESULT_NOT_AVAILABLE_STR = 這個 URL 不允許讀取
-RESULT_ERROR_FAILURE_STR = 載入失敗
-RESULT_LOADING = 正在載入
-RESULT_CHECKING = 正在確認
-
-CHECK_UPDATE = 是否有更新
-GET_RSS_TITLE= 取得 Feed 標題
-
-
-# feed discovery messages
-
-discovery_external_feeds_category = 外部的 Feeds
-discovery_status_discovered = 發覺到的
-discovery_status_site_feed = 網站 feed
-discovery_status_site_feeds = 網站 feeds
-discovery_status_and = 和
-discovery_status_external_feed = 外部的 feed
-discovery_status_external_feeds = 外部的 feeds
-discovery_status_none_found = 沒有發覺到任何 Feed
-
-
-# get feed title dialog
-
-get_feed_title = Feed 標題
-
-
-# OPML wizzard
-
-opml_import_done = OPML 匯入完成
-opml_export_done = OPML 匯出完成
-opml_path_blank = 請選擇一個 OPML 檔案
-opml_path_nofile = 選定的檔案不存在
-opml_path_invalid = 不允許的檔案位置
-opml_import_fail = 匯入失敗
-opml_import_badfile = 在 OPML 檔案中不可以出現
-opml_export_nocreate = OPML 檔案建立失敗
-opml_select_file = 選擇 OPML 檔案
-opml_opml_file = OPML 檔案
-
-# Date rendering values
-
-date_sunday = 週日
-date_sunday_short = Sun
-date_monday = 週一
-date_monday_short = Mon
-date_tuesday = 週二
-date_tuesday_short = Tue
-date_wednesday = 週三
-date_wednesday_short = Wed
-date_thursday = 週四
-date_thursday_short = Thu
-date_friday = 週五
-date_friday_short = Fri
-date_saturday = 週六
-date_saturday_short = Sat
-
-date_january = 一月
-date_january_short = Jan
-date_february = 二月
-date_february_short = Feb
-date_march = 三月
-date_march_short = Mar
-date_april = 四月
-date_april_short = Apr
-date_may = 五月
-date_may_short = May
-date_june = 六月
-date_june_short = Jun
-date_july = 七月
-date_july_short = Jul
-date_august = 八月
-date_august_short = Aug
-date_september = 九月
-date_september_short = Sep
-date_october = 十月
-date_october_short = Oct
-date_november = 十一月
-date_november_short = Nov
-date_december = 十二月
-date_december_short = Dec
\ No newline at end of file
+RESULT_OK_STR = OK
+RESULT_PARSE_ERROR_STR = XML 分析錯誤
+RESULT_NOT_RSS_STR = Feed 分析發生錯誤
+RESULT_NOT_FOUND_STR = 並未找到檔案
+RESULT_NOT_AVAILABLE_STR = 這個 URL 不允許讀取
+RESULT_ERROR_FAILURE_STR = 載入失敗
+RESULT_LOADING = 正在載入
+RESULT_CHECKING = 正在確認
+
+CHECK_UPDATE = 是否有更新
+GET_RSS_TITLE= 取得 Feed 標題
+
+
+# feed discovery messages
+
+discovery_external_feeds_category = 外部的 Feeds
+discovery_status_discovered = 發覺到的
+discovery_status_site_feed = 網站 feed
+discovery_status_site_feeds = 網站 feeds
+discovery_status_and = 和
+discovery_status_external_feed = 外部的 feed
+discovery_status_external_feeds = 外部的 feeds
+discovery_status_none_found = 沒有發覺到任何 Feed
+
+
+# get feed title dialog
+
+get_feed_title = Feed 標題
+
+
+# OPML wizzard
+
+opml_import_done = OPML 匯入完成
+opml_export_done = OPML 匯出完成
+opml_path_blank = 請選擇一個 OPML 檔案
+opml_path_nofile = 選定的檔案不存在
+opml_path_invalid = 不允許的檔案位置
+opml_import_fail = 匯入失敗
+opml_import_badfile = 在 OPML 檔案中不可以出現
+opml_export_nocreate = OPML 檔案建立失敗
+opml_select_file = 選擇 OPML 檔案
+opml_opml_file = OPML 檔案
+
+# Date rendering values
+
+date_sunday = 週日
+date_sunday_short = Sun
+date_monday = 週一
+date_monday_short = Mon
+date_tuesday = 週二
+date_tuesday_short = Tue
+date_wednesday = 週三
+date_wednesday_short = Wed
+date_thursday = 週四
+date_thursday_short = Thu
+date_friday = 週五
+date_friday_short = Fri
+date_saturday = 週六
+date_saturday_short = Sat
+
+date_january = 一月
+date_january_short = Jan
+date_february = 二月
+date_february_short = Feb
+date_march = 三月
+date_march_short = Mar
+date_april = 四月
+date_april_short = Apr
+date_may = 五月
+date_may_short = May
+date_june = 六月
+date_june_short = Jun
+date_july = 七月
+date_july_short = Jul
+date_august = 八月
+date_august_short = Aug
+date_september = 九月
+date_september_short = Sep
+date_october = 十月
+date_october_short = Oct
+date_november = 十一月
+date_november_short = Nov
+date_december = 十二月
+date_december_short = Dec
+
+# Item context menu
+itemcontext_markasread = Mark as Read
+itemcontext_markasunread = Mark as Unread
+itemcontext_markallasread = Mark All as Read
+itemcontext_markallasunread = Mark All as Unread
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-mozext/sage-extension.git
More information about the Pkg-mozext-commits
mailing list