diff --git a/.gitignore b/.gitignore index e455d0f..494d4d7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ deploy/ resources/ -.project \ No newline at end of file +.project +.sublime-project diff --git a/_locales/en_US/messages.json b/_locales/en_US/messages.json index 2538bf7..7f917d2 100644 --- a/_locales/en_US/messages.json +++ b/_locales/en_US/messages.json @@ -2,12 +2,12 @@ "just_now": { "message": "just now", "description": "Describe that something just happened." - + }, "a_minute_ago": { "message": "a minute ago", "description": "Describe that something happened a minute ago." - + }, "a_minute_from_now": { "message": "a minute from now", @@ -291,6 +291,12 @@ "button_hide": { "message": "hide this form" }, + "submit_again": { + "message": "submit again" + }, + "cancel_submission": { + "message": "cancel submission" + }, "error_empty": { "message": "There needs to be something here." }, @@ -476,7 +482,7 @@ "content": "Mostly Harmless" } } - + }, "group_orangered_notifications": { "message": "$ORANGERED$ Notifications", diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index 2538bf7..3b60957 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -1,20 +1,20 @@ { "just_now": { - "message": "just now", + "message": "à l'instant", "description": "Describe that something just happened." }, "a_minute_ago": { - "message": "a minute ago", + "message": "Il y a une minute", "description": "Describe that something happened a minute ago." }, "a_minute_from_now": { - "message": "a minute from now", + "message": "Dans une minute", "decription": "Describe that something will happen in a minute." }, "minutes_ago": { - "message": "$NUM$ minutes ago", + "message": "$NUM$ Il y a quelques minutes", "placeholders": { "NUM": { "content": "$1", @@ -23,7 +23,7 @@ } }, "minutes_from_now": { - "message": "$NUM$ minutes from now", + "message": "$NUM$ Dans quelques minutes", "placeholders": { "NUM": { "content": "$1", @@ -32,15 +32,15 @@ } }, "an_hour_ago": { - "message": "an hour ago", + "message": "Il y a une heure", "description": "Describe that something happened an hour ago." }, "an_hour_from_now": { - "message": "an hour from now", + "message": "Dans une heure", "description": "Describe that will happen in an hour." }, "hours_ago": { - "message": "$NUM$ hours ago", + "message": "$NUM$ Il y a quelques heures", "placeholders": { "NUM": { "content": "$1", @@ -49,7 +49,7 @@ } }, "hours_from_now": { - "message": "$NUM$ hours from now", + "message": "$NUM$ Dans quelques heures", "placeholders": { "NUM": { "content": "$1", @@ -58,15 +58,15 @@ } }, "yesterday": { - "message": "yesterday", + "message": "Hier", "description": "The day before today." }, "tomorrow": { - "message": "tomorrow", + "message": "Demain", "description": "The day after today." }, "days_ago": { - "message": "$NUM$ days ago", + "message": "$NUM$ Il y a quelques jours", "placeholders": { "NUM": { "content": "$1", @@ -75,7 +75,7 @@ } }, "days_from_now": { - "message": "$NUM$ days from now", + "message": "$NUM$ Dans quelques jours", "placeholders": { "NUM": { "content": "$1", @@ -84,15 +84,15 @@ } }, "last_week": { - "message": "last week", + "message": "La semaine dernière", "description": "The week before this one." }, "next_week": { - "message": "next week", + "message": "La semaine prochaine", "description": "The week after this one." }, "weeks_ago": { - "message": "$NUM$ weeks ago", + "message": "$NUM$ Il y a quelques semaines", "placeholders": { "NUM": { "content": "$1", @@ -101,7 +101,7 @@ } }, "weeks_from_now": { - "message": "$NUM$ weeks from now", + "message": "$NUM$ Dans quelques semaines", "placeholders": { "NUM": { "content": "$1", @@ -110,15 +110,15 @@ } }, "last_month": { - "message": "last month", + "message": "Le mois dernier", "description": "The month before this one." }, "next_month": { - "message": "next month", + "message": "Le mois prochain", "description": "The month after this one." }, "months_ago": { - "message": "$NUM$ months ago", + "message": "$NUM$ Il y a quelques mois", "placeholders": { "NUM": { "content": "$1", @@ -127,7 +127,7 @@ } }, "months_from_now": { - "message": "$NUM$ months from now", + "message": "$NUM$ Dans quelques mois", "placeholders": { "NUM": { "content": "$1", @@ -136,15 +136,15 @@ } }, "last_year": { - "message": "last year", + "message": "L'année dernière", "description": "The year before this one." }, "next_year": { - "message": "next year", + "message": "L'an prochain", "description": "The year after this one." }, "years_ago": { - "message": "$NUM$ years ago", + "message": "$NUM$ Il y a quelques années", "placeholders": { "NUM": { "content": "$1", @@ -153,7 +153,7 @@ } }, "years_from_now": { - "message": "$NUM$ years from now", + "message": "$NUM$ Il y a quelques années", "placeholders": { "NUM": { "content": "$1", @@ -162,15 +162,15 @@ } }, "last_century": { - "message": "last century", + "message": "Le siècle dernier", "description": "The century before this one." }, "next_century": { - "message": "next century", + "message": "Le siècle prochain", "description": "The century after this one." }, "centuries_ago": { - "message": "$NUM$ centuries ago", + "message": "$NUM$ Il y a quelques siècles", "placeholders": { "NUM": { "content": "$1", @@ -179,7 +179,7 @@ } }, "centuries_from_now": { - "message": "$NUM$ centuries from now", + "message": "$NUM$ Dans quelques siècles", "placeholders": { "NUM": { "content": "$1", @@ -188,7 +188,7 @@ } }, "not_activated": { - "message": "$APPNAME$ is not activated for this page. Click to activate.", + "message": "$APPNAME$ n'est pas activé sur cette page. Cliquez pour activer.", "placeholders": { "APPNAME": { "content": "Mostly Harmless" @@ -196,13 +196,13 @@ } }, "loading": { - "message": "Loading data..." + "message": "Chargement..." }, "viewing_comments": { - "message": "You are currently viewing the comments for this page." + "message": "Voici les commentaires pour cette page." }, "submit_page": { - "message": "Submit this page to $REDDIT$.", + "message": "Poster sur $REDDIT$.", "placeholders": { "REDDIT": { "content": "reddit" @@ -210,7 +210,7 @@ } }, "submitted_num_times": { - "message": "This page has been submitted $NUM$ times.", + "message": "Cette page a été postée $NUM$ fois.", "placeholders": { "NUM": { "content": "$1", @@ -219,7 +219,7 @@ } }, "login": { - "message": "You have to be logged in to do that. $BEGIN_LINK$Click to open the login page.$END_LINK$", + "message": "Vous devez être connecté pour effectuer cette action. $BEGIN_LINK$Cliquez pour ouvrir la page de connexion.$END_LINK$", "placeholders": { "BEGIN_LINK": { "content": "" @@ -248,22 +248,22 @@ } }, "action_unsave": { - "message": "unsave" + "message": "Ne pas sauvegarder" }, "action_save": { - "message": "save" + "message": "Sauvegarder" }, "action_unhide": { - "message": "unhide" + "message": "Ne plus cacher" }, "action_hide": { - "message": "hide" + "message": "Cacher" }, "action_share": { - "message": "share" + "message": "Partager" }, "report_confirm": { - "message": "are you sure? $BEGIN_LINK_YES$yes$END_LINK_YES$/$BEGIN_LINK_NO$no$END_LINK_NO$", + "message": "Êtes vous sûr ? $BEGIN_LINK_YES$oui$END_LINK_YES$/$BEGIN_LINK_NO$non$END_LINK_NO$", "placeholders": { "BEGIN_LINK_YES": { "content": "" @@ -280,25 +280,25 @@ } }, "action_report": { - "message": "report" + "message": "signaler" }, "action_reported": { - "message": "reported!" + "message": "signalé !" }, "button_submit": { - "message": "submit" + "message": "soumettre" }, "button_hide": { - "message": "hide this form" + "message": "cacher ce rapport" }, "error_empty": { - "message": "There needs to be something here." + "message": "Vous devez mettre quelque chose ici." }, "loading_api": { "message": "Loading data from the API..." }, "loading_cache": { - "message": "Loading data from the cache..." + "message": "Chargement du cache..." }, "error_not_cached": { "message": "Cannot create list for a URL that has not been cached." @@ -317,7 +317,7 @@ } }, "view_on_reddit": { - "message": "View this post on $REDDIT$", + "message": "Voir ce poste sur $REDDIT$", "placeholders": { "REDDIT": { "content": "reddit" @@ -325,7 +325,7 @@ } }, "submitted_when": { - "message": "submitted $TIME$", + "message": "Soumis $TIME$", "placeholders": { "TIME": { "content": "$1", @@ -334,13 +334,13 @@ } }, "by": { - "message": "by" + "message": "de" }, "to": { - "message": "to" + "message": "à" }, "add_comment_zero": { - "message": "add a comment" + "message": "Ajouter un commentaire" }, "add_comment_one": { "message": "add to the one comment" @@ -355,7 +355,7 @@ } }, "leave_comment": { - "message": "Leave a comment" + "message": "Laisser un commentaire" }, "stale_posts_hiding": { "message": "Hiding $NUM$ stale posts. $BEGIN_LINK_SHOW$Show them now$END_LINK_SHOW$, or visit the $BEGIN_LINK_OPTIONS$options page$END_LINK_OPTIONS$ to change your Fresh Content preferences.", @@ -390,7 +390,7 @@ } }, "orangered_received": { - "message": "You have an $ORANGERED$!", + "message": "Vous avez une $ORANGERED$!", "placeholders": { "ORANGERED": { "content": "orangered" @@ -398,31 +398,31 @@ } }, "orangered_action": { - "message": "Click here to be taken to your inbox." + "message": "Cliquez ici pour accéder à votre messaerie." }, "url": { "message": "url" }, "popular_choices": { - "message": "popular choices" + "message": "choix populaires" }, "title": { - "message": "title" + "message": "titre" }, "suggest_title": { - "message": "suggest title" + "message": "suggérer un titre" }, "tab_preferences": { - "message": "Preferences" + "message": "Préférences" }, "group_fresh_content": { "message": "Fresh Content" }, "fresh_content_show_one_day": { - "message": "Only show posts from today." + "message": "Montrer seulement les messages datant d'aujourd'hui." }, "fresh_content_show_days": { - "message": "Only show posts less than $NUM$ days old.", + "message": "Montrer seulement les messages datant de moins de $NUM$ jours.", "placeholders": { "NUM": { "content": "$1", @@ -431,7 +431,7 @@ } }, "fresh_content_show_weeks": { - "message": "Only show posts less than $NUM$ weeks old.", + "message": "Montrer seulement les messages datant de moins de $NUM$ semaines.", "placeholders": { "NUM": { "content": "$1", @@ -440,7 +440,7 @@ } }, "fresh_content_show_months": { - "message": "Only show posts less than $NUM$ months old.", + "message": "Montrer seulement les messages datant de moins de $NUM$ mois.", "placeholders": { "NUM": { "content": "$1", @@ -449,22 +449,22 @@ } }, "fresh_content_show_all": { - "message": "Show posts from all time." + "message": "Montrer tous les messages." }, "fresh_content_description": { - "message": "This setting allows you to choose the oldest reddit posts you’d like to see. Anything posted before the value you’ve chosen will be indicated in the browser button’s total, but will not be shown in the popup." + "message": "Cette option vous permet de ne voir les posts de Reddit qu'à partir d'une date donnée. Les post ultérieur à cette date seront inscrits dans le total des posts mais n'apparaîtront pas dans le pop-up." }, "group_popup_width": { - "message": "Popup Width" + "message": "Hauteur du popup" }, "popup_width_description": { - "message": "This setting allows you to set the width of the browser action popup." + "message": "Cette option vous permet de choisir la hauteur du pop-up." }, "group_shameless_plug": { - "message": "Shameless Plug" + "message": "Plug éhonté" }, "shameless_plug_label": { - "message": "Show the shameless plug" + "message": "Montrer le plug éhonté" }, "shameless_plug_description": { "message": "When checked, this will add the following to each commment you post from within $MOSTLY_HARMLESS$:$PLUG_TEXT$", @@ -487,7 +487,7 @@ } }, "orangered_check": { - "message": "Check for $ORANGERED$s", + "message": "Vérifier vos $ORANGERED$s", "placeholders": { "ORANGERED": { "content": "orangered" @@ -495,7 +495,7 @@ } }, "orangered_sound_label": { - "message": "Play a sound when you have an $ORANGERED$", + "message": "Jouer un son lorsque vous recevez un $ORANGERED$", "placeholders": { "ORANGERED": { "content": "orangered" @@ -503,10 +503,10 @@ } }, "orangered_sound_preview": { - "message": "Preview the notification sound" + "message": "Écouter le son de la notification" }, "orangered_interval_minutes": { - "message": "Check every $NUM$ minutes", + "message": "Vérifier toutes les $NUM$ minutes", "placeholders": { "NUM": { "content": "$1", @@ -515,7 +515,7 @@ } }, "orangered_display_time": { - "message": "Display notification for $NUM$ seconds", + "message": "Montrer la notification pendant $NUM$ seconds", "placeholders": { "NUM": { "content": "$1", diff --git a/_locales/hi/messages.json b/_locales/hi/messages.json index 2538bf7..0b2b7a8 100644 --- a/_locales/hi/messages.json +++ b/_locales/hi/messages.json @@ -1,20 +1,20 @@ { "just_now": { - "message": "just now", + "message": "बस अभी", "description": "Describe that something just happened." }, "a_minute_ago": { - "message": "a minute ago", + "message": "एक मिनट पेहले", "description": "Describe that something happened a minute ago." }, "a_minute_from_now": { - "message": "a minute from now", + "message": "अब से एक मिनट बाद", "decription": "Describe that something will happen in a minute." }, "minutes_ago": { - "message": "$NUM$ minutes ago", + "message": "$NUM$ मिनिटों पेहले", "placeholders": { "NUM": { "content": "$1", @@ -23,7 +23,7 @@ } }, "minutes_from_now": { - "message": "$NUM$ minutes from now", + "message": "$NUM$ मिनिटों बाद", "placeholders": { "NUM": { "content": "$1", @@ -32,15 +32,15 @@ } }, "an_hour_ago": { - "message": "an hour ago", + "message": "एक घंटे पेहले", "description": "Describe that something happened an hour ago." }, "an_hour_from_now": { - "message": "an hour from now", + "message": "अब से एक घंटे बाद", "description": "Describe that will happen in an hour." }, "hours_ago": { - "message": "$NUM$ hours ago", + "message": "$NUM$ घंटे पेहले", "placeholders": { "NUM": { "content": "$1", @@ -49,7 +49,7 @@ } }, "hours_from_now": { - "message": "$NUM$ hours from now", + "message": "$NUM$ घंटों बाद", "placeholders": { "NUM": { "content": "$1", @@ -58,15 +58,15 @@ } }, "yesterday": { - "message": "yesterday", + "message": "कल", "description": "The day before today." }, "tomorrow": { - "message": "tomorrow", + "message": "कल", "description": "The day after today." }, "days_ago": { - "message": "$NUM$ days ago", + "message": "$NUM$ दिनों पेहले", "placeholders": { "NUM": { "content": "$1", @@ -75,7 +75,7 @@ } }, "days_from_now": { - "message": "$NUM$ days from now", + "message": "$NUM$ दिनों बाद", "placeholders": { "NUM": { "content": "$1", @@ -84,15 +84,15 @@ } }, "last_week": { - "message": "last week", + "message": "गये हफ्ते", "description": "The week before this one." }, "next_week": { - "message": "next week", + "message": "अगले हफ्ते", "description": "The week after this one." }, "weeks_ago": { - "message": "$NUM$ weeks ago", + "message": "$NUM$ हफ्ते पहले", "placeholders": { "NUM": { "content": "$1", @@ -101,7 +101,7 @@ } }, "weeks_from_now": { - "message": "$NUM$ weeks from now", + "message": "$NUM$ हफ़्तों के बाद", "placeholders": { "NUM": { "content": "$1", @@ -110,15 +110,15 @@ } }, "last_month": { - "message": "last month", + "message": "गये महीने", "description": "The month before this one." }, "next_month": { - "message": "next month", + "message": "अगले महीने", "description": "The month after this one." }, "months_ago": { - "message": "$NUM$ months ago", + "message": "$NUM$ महीनों पेहले", "placeholders": { "NUM": { "content": "$1", @@ -127,7 +127,7 @@ } }, "months_from_now": { - "message": "$NUM$ months from now", + "message": "$NUM$ महीनों बाद", "placeholders": { "NUM": { "content": "$1", @@ -136,15 +136,15 @@ } }, "last_year": { - "message": "last year", + "message": "गये साल", "description": "The year before this one." }, "next_year": { - "message": "next year", + "message": "अगले साल", "description": "The year after this one." }, "years_ago": { - "message": "$NUM$ years ago", + "message": "$NUM$ सालों पेहले", "placeholders": { "NUM": { "content": "$1", @@ -153,7 +153,7 @@ } }, "years_from_now": { - "message": "$NUM$ years from now", + "message": "$NUM$ सालों बाद", "placeholders": { "NUM": { "content": "$1", @@ -162,15 +162,15 @@ } }, "last_century": { - "message": "last century", + "message": "पिछली सदी", "description": "The century before this one." }, "next_century": { - "message": "next century", + "message": "अगली सदी", "description": "The century after this one." }, "centuries_ago": { - "message": "$NUM$ centuries ago", + "message": "$NUM$ सदियों पेहले", "placeholders": { "NUM": { "content": "$1", @@ -179,7 +179,7 @@ } }, "centuries_from_now": { - "message": "$NUM$ centuries from now", + "message": "$NUM$ सदियों बाद", "placeholders": { "NUM": { "content": "$1", @@ -188,7 +188,7 @@ } }, "not_activated": { - "message": "$APPNAME$ is not activated for this page. Click to activate.", + "message": "$APPNAME$ इस पेज के लिए सक्रिय नहीं है | कृपया क्लिक कर के एक्टिवेट करे |", "placeholders": { "APPNAME": { "content": "Mostly Harmless" @@ -196,13 +196,13 @@ } }, "loading": { - "message": "Loading data..." + "message": "जानकारी प्राप्त..." }, "viewing_comments": { - "message": "You are currently viewing the comments for this page." + "message": "आप इस पेज की टिप्पणियां पढ़ रहे है |" }, "submit_page": { - "message": "Submit this page to $REDDIT$.", + "message": "$REDDIT$ पे प्रस्तुत करें |", "placeholders": { "REDDIT": { "content": "reddit" @@ -210,7 +210,7 @@ } }, "submitted_num_times": { - "message": "This page has been submitted $NUM$ times.", + "message": "यह पेज $NUM$ बार प्रस्तुत किये जा चूका है |", "placeholders": { "NUM": { "content": "$1", @@ -219,7 +219,7 @@ } }, "login": { - "message": "You have to be logged in to do that. $BEGIN_LINK$Click to open the login page.$END_LINK$", + "message": "यह काम करने के लिए लोग इन करना ज़रूरी है | $BEGIN_LINK$लोग इन करने के लिए, यहाँ क्लिक करें |$END_LINK$", "placeholders": { "BEGIN_LINK": { "content": "" @@ -230,7 +230,7 @@ } }, "api_error": { - "message": "There was an API error. HTTP Status: $STATUS$. Click to try again.", + "message": "एक API ऐर्रोर हुई है | HTTP की स्तिथि : $STATUS$. दोबारा कोशिश करने के लिए, कृप्या क्लिक करें |", "placeholders": { "STATUS": { "content": "$1", @@ -239,7 +239,7 @@ } }, "api_timeout": { - "message": "The API timed out after $NUM$ seconds. Click to try again.", + "message": "API इतने $NUM$ सेकंड बाद बंद हुई | दोबारा कोशिश करने के लिए, कृप्या क्लिक करें |", "placeholders": { "NUM": { "content": "$1", @@ -248,22 +248,22 @@ } }, "action_unsave": { - "message": "unsave" + "message": "न जमा करे" }, "action_save": { - "message": "save" + "message": "जमा करे" }, "action_unhide": { - "message": "unhide" + "message": "दिखाएँ" }, "action_hide": { - "message": "hide" + "message": "छिपायें" }, "action_share": { - "message": "share" + "message": "दोस्तों के साथ बाटें" }, "report_confirm": { - "message": "are you sure? $BEGIN_LINK_YES$yes$END_LINK_YES$/$BEGIN_LINK_NO$no$END_LINK_NO$", + "message": "क्या आप सच मैं येह करना चाहते हैं $BEGIN_LINK_YES$हाँ$END_LINK_YES$/$BEGIN_LINK_NO$नहीं$END_LINK_NO$", "placeholders": { "BEGIN_LINK_YES": { "content": "" @@ -280,31 +280,31 @@ } }, "action_report": { - "message": "report" + "message": "रिपोर्ट करें" }, "action_reported": { - "message": "reported!" + "message": "रिपोर्ट हो चुकी ! " }, "button_submit": { - "message": "submit" + "message": "प्रस्तुत करें" }, "button_hide": { - "message": "hide this form" + "message": "यह फॉर्म छिपायें " }, "error_empty": { - "message": "There needs to be something here." + "message": "यहाँ कुछ होना चाहिएThere needs to be something here." }, "loading_api": { - "message": "Loading data from the API..." + "message": "API से जानकारी प्राप्त हो रही है..." }, "loading_cache": { - "message": "Loading data from the cache..." + "message": "cache से जानकारी प्राप्त हो रही है..." }, "error_not_cached": { - "message": "Cannot create list for a URL that has not been cached." + "message": "जो URL की cache न हुई हो, उसकी लिस्ट नहीं बन सकती|" }, "score": { - "message": "$UPS$ upvotes, $DOWNS$ downvotes.", + "message": "$UPS$ उप्वोते, $DOWNS$ डाउनवोट", "placeholders": { "UPS": { "content": "$1", @@ -317,7 +317,7 @@ } }, "view_on_reddit": { - "message": "View this post on $REDDIT$", + "message": "$REDDIT$ पर देखे ", "placeholders": { "REDDIT": { "content": "reddit" @@ -325,7 +325,7 @@ } }, "submitted_when": { - "message": "submitted $TIME$", + "message": "प्रस्तुत हुई $TIME$", "placeholders": { "TIME": { "content": "$1", @@ -334,19 +334,19 @@ } }, "by": { - "message": "by" + "message": "द्वारा" }, "to": { - "message": "to" + "message": "से" }, "add_comment_zero": { - "message": "add a comment" + "message": "टिपण्णी दे" }, "add_comment_one": { "message": "add to the one comment" }, "add_comment_many": { - "message": "add to the $NUM$ comments", + "message": "$NUM$ टिप्पणियों मैं शामिल करे |", "placeholders": { "NUM": { "content": "$1", @@ -355,10 +355,10 @@ } }, "leave_comment": { - "message": "Leave a comment" + "message": "टिपण्णी दे" }, "stale_posts_hiding": { - "message": "Hiding $NUM$ stale posts. $BEGIN_LINK_SHOW$Show them now$END_LINK_SHOW$, or visit the $BEGIN_LINK_OPTIONS$options page$END_LINK_OPTIONS$ to change your Fresh Content preferences.", + "message": "$NUM$ पुराणी पोस्ट चिय्पयी गयी है | $BEGIN_LINK_SHOW$अभी दिखाएँ$END_LINK_SHOW$, वरना $BEGIN_LINK_OPTIONS$ओपशंस$END_LINK_OPTIONS$ में जा कर Fresh Content में जा कर की सेट्टिंग चंगे करें |", "placeholders": { "NUM": { "content": "$1", @@ -379,7 +379,7 @@ } }, "stale_posts_showing": { - "message": "Showing stale posts. Visit the $BEGIN_LINK_OPTIONS$options page$END_LINK_OPTIONS$ to change your Fresh Content preferences.", + "message": "पुरानी पोस्ट दिखाई जा रही है |. $BEGIN_LINK_OPTIONS$ओपशंस$END_LINK_OPTIONS$ में जा कर Fresh Content में जा कर की सेट्टिंग चंगे करें |", "placeholders": { "BEGIN_LINK_OPTIONS": { "content": "" @@ -575,51 +575,3 @@ "timeout_length_never": { "message": "Do not timeout; only show an error error when the API is down." }, - "timeout_length_description": { - "message": "If the $REDDIT$ API is slow or down, $MOSTLY_HARMLESS$ can display an error after trying to reach the API for a certain amount of time. Longer timeout lengths mean more time waiting for a result from the $REDDIT$ API. Shorter timeout lengths mean a higher possibility of timing out when $REDDIT$ may only be slow instead of down.", - "placeholders": { - "REDDIT": { - "content": "reddit" - }, - "MOSTLY_HARMLESS": { - "content": "Mostly Harmless" - } - } - }, - "tab_privacy": { - "message": "Privacy" - }, - "group_wait_for_click": { - "message": "Wait for click" - }, - "wait_for_click_description": { - "message": "If this checkbox is selected, $MOSTLY_HARMLESS$ will not activate unless you click its icon.", - "placeholders": { - "MOSTLY_HARMLESS": { - "content": "Mostly Harmless" - } - } - }, - "excluded_domains": { - "message": "Excluded domains" - }, - "excluded_domains_description": { - "message": "Put domains or subdomains, one per line, in the above text box. Any page on the listed domains will not activate $MOSTLY_HARMLESS$.", - "placeholders": { - "MOSTLY_HARMLESS": { - "content": "Mostly Harmless" - } - } - }, - "excluded_regex": { - "message": "Excluded regex" - }, - "excluded_regex_description": { - "message": "Put regular expressions, one per line, in the above text box. Any page that matches these regular expressions will not activate $MOSTLY_HARMLESS$.", - "placeholders": { - "MOSTLY_HARMLESS": { - "content": "Mostly Harmless" - } - } - } -} diff --git a/css/popup.css b/css/popup.css index e90d60e..7a7c478 100644 --- a/css/popup.css +++ b/css/popup.css @@ -178,6 +178,7 @@ ol[data-commentspage="true"] button.cancel { letter-spacing:-1px; line-height:29px; height:29px; + margin: 5px 0 0 62px; } .morelink:hover, .mlh { border-color:#879eb4; @@ -205,6 +206,11 @@ ol[data-commentspage="true"] button.cancel { background-image:url('/pix/sprite.png'); background-position:-4px -43px; } +.close-button { + position: absolute; + right: 8px; + bottom: 10px; +} #submit fieldset { background-color: #CEE3F8; border: 0; @@ -214,14 +220,16 @@ ol[data-commentspage="true"] button.cancel { width:500px; font-size: small; } -#submit input[type="text"] { +#submit input[type="text"], #submit textarea { width: 492px; padding: 3px; margin: 0 0 5px; border: 1px solid gray; height: 22px; + font-family: verdana, arial, helvetica, sans-serif; + max-width: 492px; } -#submit input, #submit label { +#submit input, #submit label, #submit textarea { display: block; font-size: large; margin: 0 0 5px; diff --git a/html/background.html b/html/background.html index bd15bb3..3a136d8 100644 --- a/html/background.html +++ b/html/background.html @@ -12,7 +12,8 @@ background = new Background(); function initBackground() { - background.clearCache(); + cache.removeAll(); + button.setBadgeDefaults(); chrome.tabs.onUpdated.addListener(background.prepareBrowserAction); background.watchMail(); window.setInterval(background.clearCache, (settings.get('cacheTime') * 60 * 1000)); diff --git a/js/common.js b/js/common.js index 10bb8fe..038ef31 100644 --- a/js/common.js +++ b/js/common.js @@ -301,10 +301,10 @@ BrowserAction.prototype.setBadgeError = function (tabId, text) { */ BrowserAction.prototype.setBadgeFor = function (url, tabId) { var cachedPosts; - + cachedPosts = cache.get(url); chrome.browserAction.setIcon({'path': '/pix/alien.png', 'tabId': tabId}); - + if (cachedPosts.isCommentsPage === true) { chrome.browserAction.setBadgeText({'text': '...', 'tabId': tabId}); chrome.browserAction.setTitle({'title': chrome.i18n.getMessage('viewing_comments'), 'tabId': tabId}); @@ -321,7 +321,7 @@ BrowserAction.prototype.setBadgeFor = function (url, tabId) { chrome.browserAction.setBadgeBackgroundColor({'color': [255, 69, 0, 255], 'tabId': tabId}); chrome.browserAction.setPopup({popup: '/html/popup.html', tabId: tabId}); } - + return true; }; @@ -349,24 +349,24 @@ function RedditAPI(domain) { * @param {Object} data If it exists, send this as a FormData() object. * @param {Function} cback If it exists, call this function when the request is complete, passing a parameter: the API's response as an object. * @return {Object} Returns the API's response as an object if there is no callback. - * @method + * @method */ RedditAPI.prototype.apiTransmit = function (type, url, data, cback) { var req, apiTimeout, notificationArea; - + function processResponse () { if (req.readyState === 4) { if (req.status === 200) { if (JSON.parse(req.responseText).jquery && JSON.parse(req.responseText).jquery[3][3][0] === '.error.USER_REQUIRED') { throw chrome.i18n.getMessage('login'); } - + clearTimeout(apiTimeout); - + if (cback) { cback(JSON.parse(req.responseText)); } - + if (notificationArea) { notificationArea.innerHTML = ''; notificationArea.style.display = 'none'; @@ -380,12 +380,12 @@ RedditAPI.prototype.apiTransmit = function (type, url, data, cback) { } } } - + function handleTimeout () { req.abort(); throw chrome.i18n.getMessage('api_timeout', settings.get('timeoutLength').toString()); } - + notificationArea = document.getElementById('notificationArea'); req = new XMLHttpRequest(); req.open(type, url, true); @@ -411,21 +411,21 @@ RedditAPI.prototype.apiTransmit = function (type, url, data, cback) { */ RedditAPI.prototype.getInfo = function (url, tabId) { var apiTimeout, isCommentsPage, reqUrl, req, postsObj, postCount; - + function processResponse () { if (req.readyState === 4) { if (req.status === 200) { var response; - + clearTimeout(apiTimeout); response = JSON.parse(req.responseText); cache.set('modhash', response.data.modhash); postsObj = {}; postCount = 0; - + for (i = 0; i < response.data.children.length; i++) { var child; - + child = response.data.children[i]; postsObj[child.data.name] = { 'url': url, @@ -433,7 +433,7 @@ RedditAPI.prototype.getInfo = function (url, tabId) { }; postCount++; } - + cache.set(url, { 'count': postCount, 'posts': postsObj, @@ -447,24 +447,24 @@ RedditAPI.prototype.getInfo = function (url, tabId) { } } } - + function handleTimeout () { req.abort(); button.setBadgeError(tabId, chrome.i18n.getMessage('api_timeout', settings.get('timeoutLength').toString())); } - + button.setBadgeLoading(tabId); isCommentsPage = this.commentsMatchPattern.test(url); - + if (isCommentsPage) { var matches; - + matches = url.match(this.commentsMatchPattern); reqUrl = 'http://' + this.domain + '/by_id/t3_' + matches[3] + '.json?app=mh'; } else { reqUrl = 'http://' + this.domain + '/api/info.json?app=mh&url=' + encodeURIComponent(url); } - + req = new XMLHttpRequest(); req.open('GET', reqUrl, true); req.onreadystatechange = processResponse; @@ -483,7 +483,7 @@ RedditAPI.prototype.getInfo = function (url, tabId) { */ RedditAPI.prototype.voteUpPost = function (e) { var listItem, fullName, url, reqUrl, oldCache, voteWas, scoreWas, upsWas, downsWas, scoreElem, formData; - + function success () { if (voteWas === '1') { @@ -528,10 +528,10 @@ RedditAPI.prototype.voteUpPost = function (e) { oldCache.posts[fullName].data.downs = downsWas - 1; } - + cache.set(url, oldCache); } - + listItem = e.srcElement.parentNode.parentNode; fullName = listItem.id; voteWas = listItem.getAttribute('data-dir'); @@ -545,7 +545,7 @@ RedditAPI.prototype.voteUpPost = function (e) { formData = new FormData(); formData.append('id', fullName); formData.append('uh', cache.get('modhash')); - + if (voteWas === '1') { formData.append('dir','0'); } else if (voteWas === '0') { @@ -553,7 +553,7 @@ RedditAPI.prototype.voteUpPost = function (e) { } else if (voteWas === '-1') { formData.append('dir','1'); } - + this.apiTransmit('POST', reqUrl, formData, success); }; @@ -566,7 +566,7 @@ RedditAPI.prototype.voteUpPost = function (e) { */ RedditAPI.prototype.voteDownPost = function (e) { var listItem, fullName, url, reqUrl, oldCache, voteWas, scoreWas, upsWas, downsWas, scoreElem, formData; - + function success () { if (voteWas === '1') { @@ -610,10 +610,10 @@ RedditAPI.prototype.voteDownPost = function (e) { oldCache.posts[fullName].data.downs = downsWas - 1; } - + cache.set(url, oldCache); } - + listItem = e.srcElement.parentNode.parentNode; fullName = listItem.id; voteWas = listItem.getAttribute('data-dir'); @@ -627,7 +627,7 @@ RedditAPI.prototype.voteDownPost = function (e) { formData = new FormData(); formData.append('id', fullName); formData.append('uh', cache.get('modhash')); - + if (voteWas === '1') { formData.append('dir','-1'); } else if (voteWas === '0') { @@ -635,7 +635,7 @@ RedditAPI.prototype.voteDownPost = function (e) { } else if (voteWas === '-1') { formData.append('dir','0'); } - + this.apiTransmit('POST', reqUrl, formData, success); }; @@ -648,7 +648,7 @@ RedditAPI.prototype.voteDownPost = function (e) { */ RedditAPI.prototype.savePost = function (e) { var listItem, fullName, url, reqUrl, oldCache, formData; - + function success () { listItem.setAttribute('data-saved', 'true'); listItem.className.replace(/\bsaved\b/,''); @@ -658,7 +658,7 @@ RedditAPI.prototype.savePost = function (e) { oldCache.posts[fullName].data.saved = true; cache.set(url, oldCache); } - + listItem = e.srcElement.parentNode.parentNode.parentNode; fullName = listItem.id; url = listItem.parentNode.getAttribute('data-url'); @@ -679,7 +679,7 @@ RedditAPI.prototype.savePost = function (e) { */ RedditAPI.prototype.unsavePost = function (e) { var listItem, fullName, url, reqUrl, oldCache, formData; - + function success () { listItem.setAttribute('data-saved', 'false'); listItem.className.replace(/\bunsave\b/,''); @@ -689,7 +689,7 @@ RedditAPI.prototype.unsavePost = function (e) { oldCache.posts[fullName].data.saved = false; cache.set(url, oldCache); } - + listItem = e.srcElement.parentNode.parentNode.parentNode; fullName = listItem.id; url = listItem.parentNode.getAttribute('data-url'); @@ -710,7 +710,7 @@ RedditAPI.prototype.unsavePost = function (e) { */ RedditAPI.prototype.hidePost = function (e) { var listItem, fullName, url, reqUrl, oldCache, formData; - + function success () { listItem.setAttribute('data-hidestatus', 'true'); e.srcElement.innerHTML = chrome.i18n.getMessage('action_unhide'); @@ -718,7 +718,7 @@ RedditAPI.prototype.hidePost = function (e) { oldCache.posts[fullName].data.hidden = true; cache.set(url, oldCache); } - + listItem = e.srcElement.parentNode.parentNode.parentNode; fullName = listItem.id; url = listItem.parentNode.getAttribute('data-url'); @@ -739,7 +739,7 @@ RedditAPI.prototype.hidePost = function (e) { */ RedditAPI.prototype.unhidePost = function (e) { var listItem, fullName, url, reqUrl, oldCache, formData; - + function success () { listItem.setAttribute('data-hidestatus', 'false'); e.srcElement.innerHTML = chrome.i18n.getMessage('action_hide'); @@ -747,7 +747,7 @@ RedditAPI.prototype.unhidePost = function (e) { oldCache.posts[fullName].data.hidden = false; cache.set(url, oldCache); } - + listItem = e.srcElement.parentNode.parentNode.parentNode; fullName = listItem.id; url = listItem.parentNode.getAttribute('data-url'); @@ -796,7 +796,7 @@ RedditAPI.prototype.denyReport = function (e) { */ RedditAPI.prototype.reportPost = function (e) { var listItem, fullName, url, reqUrl, oldCache, formData; - + function success () { listItem.setAttribute('data-hidestatus', 'true'); e.srcElement.parentNode.parentNode.childNodes[3].innerHTML = 'unhide'; @@ -806,7 +806,7 @@ RedditAPI.prototype.reportPost = function (e) { listItem.setAttribute('data-reportstatus', 'true'); e.srcElement.parentNode.innerHTML = chrome.i18n.getMessage('action_reported'); } - + listItem = e.srcElement.parentNode.parentNode.parentNode.parentNode; fullName = listItem.id; url = listItem.parentNode.getAttribute('data-url'); @@ -827,10 +827,10 @@ RedditAPI.prototype.reportPost = function (e) { */ RedditAPI.prototype.submitComment = function (e) { var listItem, fullName, status, submitButton, cancelButton, textarea, comment, formData; - + function success (response) { var postedCommentUrl, commentsUrl, url, oldCache; - + postedCommentUrl = response.jquery[18][3][0][0].data.id.split('_')[1]; commentsUrl = document.getElementById(fullName).parentNode.getElementsByClassName('thumblink')[0].getAttribute('href'); status.innerHTML = 'submitted! click to view your comment.'; @@ -844,7 +844,7 @@ RedditAPI.prototype.submitComment = function (e) { oldCache.posts[fullName].savedCommentText = ''; cache.set(url, oldCache); } - + submitButton = e.srcElement; listItem = submitButton.parentNode.parentNode.parentNode; fullName = listItem.id; @@ -852,7 +852,7 @@ RedditAPI.prototype.submitComment = function (e) { cancelButton = submitButton.parentNode.getElementsByClassName('cancel')[0]; textarea = e.srcElement.parentNode.getElementsByTagName('textarea')[0]; comment = settings.get('shamelessPlug') ? textarea.value + '\n\n*Posted from [Mostly Harmless](http://kerrick.github.com/Mostly-Harmless), a Google Chrome extension for awesome redditors.*' : textarea.value; - + if (textarea.value === '') { status.innerHTML = chrome.i18n.getMessage('error_empty'); } else { @@ -878,7 +878,7 @@ RedditAPI.prototype.submitComment = function (e) { */ RedditAPI.prototype.submitLink = function (e, tabId) { var url, title, subreddit, status, submitButton, formData; - + function success (response) { if (typeof response.jquery[16][3][0] !== 'undefined' && response.jquery[16][3][0].substring(0,15) === '.error.NO_LINKS') { status.innerHTML = 'that reddit only allows text posts'; @@ -900,13 +900,13 @@ RedditAPI.prototype.submitLink = function (e, tabId) { status.innerHTML = 'unknown error occured, please try again.' } } - + submitButton = e.srcElement; status = submitButton.parentNode.getElementsByClassName('status')[0]; title = document.getElementById('submit_title'); subreddit = document.getElementById('submit_reddit'); url = document.getElementById('submit_url'); - + if (title.value === '' || subreddit.value === '') { status.innerHTML = chrome.i18n.getMessage('error_empty'); } else { @@ -961,12 +961,22 @@ function Background() { * @method */ Background.prototype.clearCache = function () { - var oldReddits; + var oldCache, newCache; - oldReddits = cache.get('reddits'); - cache.removeAll(); - button.setBadgeDefaults(); - cache.set('reddits', oldReddits) + oldCache = cache.toObject(); + newCache = { + modhash: oldCache.modhash, + reddits: oldCache.reddits + }; + + utils.forEachIn(oldCache, function (cachedUrl, data) { + chrome.tabs.query({url: cachedUrl}, function (results) { + if (results.length > 0) { + newCache[cachedUrl] = oldCache[cachedUrl]; + } + cache.fromObject(newCache); // It's messy to put it here since it'll get called over and over, but chrome.tabs.query is asynch. + }); + }); }; /** @@ -988,30 +998,30 @@ Background.prototype.prepareBrowserAction = function (tabId, info, tab, force) { console.log(chrome.i18n.getMessage('loading_cache')); button.setBadgeFor(tab.url, tabId); } - + return true; } - + if (force === true) { setBadge(); } else if (info.status === 'loading') { try { var excludedRegex, match; - + excludedRegex = settings.get('excludedRegex').split('\n'); excludedDomains = settings.get('excludedDomains').split('\n'); match = false; - + for (var i = 0; i < excludedRegex.length; i++) { if (tab.url.match(new RegExp(excludedRegex[i], "i")) !== null) { match = true; } } - + if (utils.parseURL(tab.url).host in utils.objConvert(excludedDomains)) { match = true; } - + if (settings.get('waitForClick') === false && match === false) { setBadge(); } else { @@ -1031,17 +1041,17 @@ Background.prototype.prepareBrowserAction = function (tabId, info, tab, force) { */ Background.prototype.watchMail = function () { var mailProcess, pop; - + function showNotification (hasMail) { var mailInterval; - + mailInterval = settings.get('mailInterval') * 1000 * 60; - + if (hasMail === true && background.notificationIsShown === false) { if (settings.get('mailSound') === true) { pop.play(); } - + background.notification = webkitNotifications.createNotification( '/pix/mail.png', // icon url - can be relative chrome.i18n.getMessage('orangered_received'), // notification title @@ -1059,22 +1069,22 @@ Background.prototype.watchMail = function () { } else if (hasMail === false && background.notificationIsShown === true) { background.notification.cancel(); } - + window.setTimeout(checkPrefs, mailInterval); } - + function getMail () { reddit.apiTransmit('GET', 'http://' + reddit.domain + '/api/me.json?app=mh', null, function (response) { showNotification(response.data.has_mail); }); } - + function checkPrefs () { if (settings.get('checkMail') === true) { getMail(); } } - + pop = document.createElement('audio'); pop.src = '/pix/pop.ogg'; checkPrefs(); @@ -1100,25 +1110,25 @@ function Popup() { */ Popup.prototype.createListHTML = function (url) { var listHTML, staleCounter; - + if (cache.get(url) === undefined) { throw chrome.i18n.getMessage('error_not_cached'); } - + listHTML = '
'; listHTML += '
    '; staleCounter = 0; - + utils.forEachIn(cache.get(url).posts, function (name, value) { var data, voteDir, hiddenText, hideStatus, hideAction, saveText, saveStatus, saveAction, isFreshEnough, freshText, thumbSrc, commentText; - + data = value.data; if (data.likes === true) voteDir = 1; if (data.likes === null) voteDir = 0; if (data.likes === false) voteDir = -1; hideStatus = data.hidden; hiddenText = hideStatus === true ? 'unhide' : 'hide'; - hideAction = hideStatus === true ? 'reddit.unhidePost(event)' : 'reddit.hidePost(event)'; + hideAction = hideStatus === true ? 'reddit.unhidePost(event)' : 'reddit.hidePost(event)'; saveStatus = data.saved; saveText = saveStatus === true ? 'unsave' : 'save'; saveAction = saveStatus === true ? 'reddit.unsavePost(event)' : 'reddit.savePost(event)'; @@ -1127,7 +1137,7 @@ Popup.prototype.createListHTML = function (url) { if (!isFreshEnough) staleCounter++; freshText = isFreshEnough ? 'fresh' : 'stale'; thumbSrc = data.thumbnail.indexOf('/') === 0 ? 'http://' + reddit.domain + data.thumbnail : data.thumbnail; - + listHTML += '
  1. '; listHTML += '
    '; listHTML += ''; @@ -1174,15 +1184,19 @@ Popup.prototype.createListHTML = function (url) { listHTML += ''; listHTML += '
  2. '; }); - - listHTML += '
' - + + listHTML += ''; + listHTML += ''; + if (staleCounter > 0) { listHTML += '
' + chrome.i18n.getMessage('stale_posts_hiding', staleCounter.toString()) + '
'; } - + return listHTML; - + }; /** @@ -1194,14 +1208,14 @@ Popup.prototype.createListHTML = function (url) { */ Popup.prototype.createSubmitForm = function (tab) { var submitHTML, redditCache; - + redditCache = cache.get('reddits'); submitHTML = '
'; submitHTML += '
'; submitHTML += '

' + chrome.i18n.getMessage('submit_page') + '

'; submitHTML += '
'; submitHTML += ''; - submitHTML += ''; + submitHTML += ''; submitHTML += ''; submitHTML += '
'; submitHTML += '
'; @@ -1223,10 +1237,30 @@ Popup.prototype.createSubmitForm = function (tab) { submitHTML += ''; submitHTML += '' submitHTML += ''; - + return submitHTML; } +/** + * Replace the contents of the popup with a submit form. + * @alias Popup.replaceWithSubmitForm() + * @return {Boolean} Returns true. + * @method + */ +Popup.prototype.replaceWithSubmitForm = function () { + var close; + + chrome.tabs.getSelected(null, function(currTab) { + document.getElementById('body').style.width = ''; + document.getElementById('body').innerHTML = popup.createSubmitForm(currTab); + close = document.createElement('button'); + close = document.body.appendChild(close); + close.innerHTML = chrome.i18n.getMessage('cancel_submission'); + close.className = 'close-button'; + close.setAttribute('onclick', 'window.close()'); + }); +}; + /** * Show stale posts. * @alias Popup.showStalePosts() @@ -1235,10 +1269,10 @@ Popup.prototype.createSubmitForm = function (tab) { */ Popup.prototype.showStalePosts = function () { var stalePosts; - + stalePosts = document.getElementsByClassName('stale'); document.getElementById('information').innerHTML = chrome.i18n.getMessage('stale_posts_showing'); - + while (stalePosts.length > 0) { stalePosts[0].className = 'stale-shown'; } @@ -1265,7 +1299,7 @@ Popup.prototype.showCommentForm = function (postId) { */ Popup.prototype.cacheComment = function (e) { var value, postId, url, oldCache; - + value = e.srcElement.value; postId = e.srcElement.parentNode.parentNode.parentNode.id url = e.srcElement.parentNode.parentNode.parentNode.parentNode.getAttribute('data-url'); diff --git a/manifest.json b/manifest.json index b675cd7..69b4aab 100644 --- a/manifest.json +++ b/manifest.json @@ -1,6 +1,6 @@ { "name": "Mostly Harmless", - "version": "1.4.1", + "version": "1.5.0", "description": "Find, vote on, save, hide, and report links on reddit; submit new links; These and more! http://kerrick.github.com/Mostly-Harmless", "browser_action": { "default_icon": "pix/alien.png", @@ -19,4 +19,4 @@ "background_page": "html/background.html", "options_page": "fancy-settings/index.html", "default_locale": "en_US" -} \ No newline at end of file +}