From a1b3760b4bc744337f498bd47f7bd2426eb24548 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Onur=20Bayka=C5=9F?= Date: Wed, 29 Sep 2010 05:23:40 -0700 Subject: [PATCH 001/135] Full and better translation --- _locales/tr/messages.json | 74 +++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/_locales/tr/messages.json b/_locales/tr/messages.json index 088f31df..e0bf42f8 100644 --- a/_locales/tr/messages.json +++ b/_locales/tr/messages.json @@ -11,7 +11,7 @@ "description": "Text for composing new tweet" }, "tweetit": { - "message": "Tweet" + "message": "Gönder" }, "logout": { "message": "Çıkış", @@ -54,13 +54,13 @@ "message": "Listeler güncelleniyor..." }, "w_Unified": { - "message": "Unified" + "message": "Birleşik" }, "w_Home": { - "message": "Home" + "message": "Anasayfa" }, "w_DM": { - "message": "DMs" + "message": "Mesajlar" }, "w_Favorites": { "message": "Favoriler" @@ -72,16 +72,16 @@ "message": "Ara" }, "fromApp": { - "message": "from" + "message": "istemci:" }, "inReply": { - "message": "in reply to" + "message": "cevap olarak:" }, "retweetedBy": { - "message": "retweeted by" + "message": "tekrar tweetleyen:" }, "retweetedByMe": { - "message": "retweeted by me" + "message": "siz tarafından tekrar tweetlendi" }, "unmarkFavorite": { "message": "Favorilerden kaldır" @@ -123,11 +123,11 @@ "message": "Kısaltmak için bir URL yapıştırın. Aktif sayfayı kısaltmak için sağdaki ikona tıklayın" }, "timelineHome": { - "message": "Home", + "message": "Ana Sayfa", "description": "The home time line tab" }, "timelineDM": { - "message": "DM", + "message": "Mesajlar", "description": "The direct message time line tab" }, "timelineFavorites": { @@ -152,7 +152,7 @@ } }, "preventClosing": { - "message": "Click to prevent closing." + "message": "Kapanmaması için tıklayın." }, "changeNotificationSettings": { "message": "Bildirim seçeneklerini ayarlar sayfasından değiştirebilirsiniz." @@ -170,13 +170,13 @@ "message": "Bir hata oluştu. Lütfen tekrar deneyin." }, "ajaxFailed": { - "message": "AJAX request failed (bad connection?)" + "message": "AJAX isteği başarısız (kötü bağlantı?)" }, "successAuth": { "message": "Tebrikler, kimliğiniz doğrulandı. Chromed Bird'ün tadını çıkarın!" }, "cbAuthorized": { - "message": "Chromed Bird authorized!" + "message": "Chromed Bird yetkili!" }, "cbNotAuthorized": { "message": "Bir hata oluştu. Lütfen Chromed Bird ikonuna tekrar tıklayın." @@ -213,7 +213,7 @@ } }, "queue_retried": { - "message": "retried $retries$ times since $timediff$ ago [$laststatus$]", + "message": "$timediff$ tarihinden beri $retries$ defa gönderilmeye çalıştı [$laststatus$]", "placeholders": { "retries": { "content": "$1" @@ -227,7 +227,7 @@ } }, "ue_fetchingLists": { - "message": "Unexpected error $status$ fetching lists.", + "message": "Listeler alınırken $status$ hatası oluştu.", "placeholders": { "status": { "content": "$1" @@ -235,7 +235,7 @@ } }, "ue_updatingTweets": { - "message": "Unexpected error $baseError$ updating tweets.", + "message": "Tweetler güncellenirken $baseError$ hatası oluştu.", "placeholders": { "baseError": { "content": "$1" @@ -243,10 +243,10 @@ } }, "ue_updatingTweets2": { - "message": " If this timeout error is being shown repeatedly, please try logging out and logging in again." + "message": " Eğer bu hata ile çok sık karşılaşıyorsanız çıkış yapıp tekrar girmeyi deneyin." }, "ue_deletingTweet": { - "message": "Unexpected error $status$ deleting tweet.", + "message": "Tweet silinirken $status$ hatası oluştu.", "placeholders": { "status": { "content": "$1" @@ -254,7 +254,7 @@ } }, "ue_retweeting": { - "message": "Unexpected error $status$ retweeting.", + "message": "Tekrar tweetlerken $status$ hatası oluştu.", "placeholders": { "status": { "content": "$1" @@ -408,10 +408,10 @@ "message": "Bir sonraki Twitter API sıfırlama tarihi: " }, "nerds_link": { - "message": "API Hits stats (for nerds)" + "message": "API kullanım istatistikleri" }, "g_ui": { - "message": "UI" + "message": "Arayüz" }, "l_name_attribute": { "message": "Tweetlerdeki isimler nasıl görünsün?:" @@ -456,7 +456,7 @@ "message": "Font tipi:" }, "l_hover_timeout": { - "message": "Hover to read time (ms):" + "message": "Okunmak için üzerinde bekleme süresi (ms):" }, "l_show_expanded_urls": { "message": "Kısaltılmış adresleri genişlet:" @@ -483,7 +483,7 @@ "message": "Mentions" }, "btn_reset_popup_size": { - "message": "Reset Popup Size" + "message": "Pencere Boyutunu Sıfırla" }, "g_notifications": { "message": "Bildirimler" @@ -498,7 +498,7 @@ "message": "Ikon rengi" }, "notif_home": { - "message": "Home:" + "message": "Ana Sayfa:" }, "notif_mentions": { "message": "Mentions:" @@ -516,7 +516,7 @@ "message": "Bildirim stili:" }, "l_noti_on_page": { - "message": "Notify on Page" + "message": "Tarayıcı bildirimleri" }, "l_noti_desktop": { "message": "Masaüstü bildirimleri" @@ -525,7 +525,7 @@ "message": "Bildirim zaman aşımı(s):" }, "l_notification_max_popups": { - "message": "Notifications at once (-1: all):" + "message": "Maksimum bildirim sayısı (-1: hepsi):" }, "g_shortener": { "message": "Kısaltıcı" @@ -537,10 +537,10 @@ "message": "Kişisel hesap kullan?" }, "l_shortener_login": { - "message": "API Login:" + "message": "API Giriş:" }, "l_shortener_key": { - "message": "API Key:" + "message": "API Anahtarı:" }, "l_share_include_title": { "message": "Sayfa başlığını dahil et:" @@ -549,7 +549,7 @@ "message": "Timelines" }, "notice_api_hits": { - "message": "Saatlik API limiti en fazla olmalıdır!
Eğer birden fazla Twitter istemcisi kullanıyorsanız aşağıdaki değerleri daha da azaltmalısınız." + "message": "Saatlik API limiti en fazla olabilir!
Eğer birden fazla Twitter istemcisi kullanıyorsanız aşağıdaki değerleri daha da azaltmalısınız." }, "l_hits_notice": { "message": "Saatlik API limiti: " @@ -561,13 +561,13 @@ "message": "Yenileme aralığı(s)" }, "l_include_in_unified": { - "message": "Include in unified timeline" + "message": "Birleşik akışa dahil et" }, "l_tabs_count": { "message": "Sekme sayısı" }, "l_unified_timeline": { - "message": "Unified Timeline:" + "message": "Birleşik Akış:" }, "tml_favorites": { "message": "Favoriler:" @@ -594,22 +594,22 @@ "message": "İstek zamanaşımı(ms):" }, "l_base_url": { - "message": "Twitter API URL:" + "message": "Twitter API Adresi:" }, "l_base_oauth_url": { - "message": "OAuth URL:" + "message": "OAuth Adresi:" }, "l_same_signing_urls": { - "message": "Same signing URLs:" + "message": "Aynı Giriş Adresleri:" }, "l_base_signing_url": { - "message": "API Signing URL:" + "message": "API Giriş Adresi:" }, "l_base_oauth_signing_url": { - "message": "OAuth Signing URL:" + "message": "OAuth Giriş Adresi:" }, "l_base_search_url": { - "message": "Search API URL:" + "message": "Arama API Adresi:" }, "btn_save": { "message": "Kaydet" From 7f722b73c4f2324098669c574878df227631bef6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Onur=20Bayka=C5=9F?= Date: Wed, 29 Sep 2010 05:53:41 -0700 Subject: [PATCH 002/135] --- _locales/tr/messages.json | 50 +++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/_locales/tr/messages.json b/_locales/tr/messages.json index e0bf42f8..89f780f7 100644 --- a/_locales/tr/messages.json +++ b/_locales/tr/messages.json @@ -54,7 +54,7 @@ "message": "Listeler güncelleniyor..." }, "w_Unified": { - "message": "Birleşik" + "message": "Tümü" }, "w_Home": { "message": "Anasayfa" @@ -117,10 +117,10 @@ "message": "Tümünü okundu olarak işaretle" }, "newToken": { - "message": "Request another token" + "message": "Başka bir işaretçi iste" }, "shortenerIdleString": { - "message": "Kısaltmak için bir URL yapıştırın. Aktif sayfayı kısaltmak için sağdaki ikona tıklayın" + "message": "Buraya kısaltılacak adresi yazın. Açık sayfayı sağdaki simgeden kısaltın." }, "timelineHome": { "message": "Ana Sayfa", @@ -205,7 +205,7 @@ "message": "Kuyruktaki mesajlar:" }, "queue_trying": { - "message": "trying to send for $timediff$", + "message": "$timediff$ tarihinden beri gönderilmeyi bekliyor", "placeholders": { "timediff": { "content": "$1" @@ -262,7 +262,7 @@ } }, "ue_markFavorite": { - "message": "Unexpected error $status$ marking as favorite.", + "message": "Favorilere eklerken $status$ hatası oluştu.", "placeholders": { "status": { "content": "$1" @@ -270,7 +270,7 @@ } }, "ue_unmarkFavorite": { - "message": "Unexpected error $status$ unmarking as favorite.", + "message": "Favoriden kaldırırken $status$ hatası oluştu.", "placeholders": { "status": { "content": "$1" @@ -289,13 +289,13 @@ } }, "newtweets_singular": { - "message": "new tweet" + "message": "yeni tweet" }, "newtweets_plural": { - "message": "new tweets" + "message": "yeni tweet" }, "btnAuthorize": { - "message": "Authorize!" + "message": "Yetkilendir!" }, "exceededAPIHits": { "message": "Günlük API kullanım limitini aştınız. Lütfen ayarlar sayfasından yenileme aralığını kontrol edin. Chromed Bird $nextResetDate $nextResetTime$ tarihine kadar güncellenmeyecek.", @@ -337,10 +337,10 @@ } }, "justNow": { - "message": "Hemen şimdi" + "message": "Az önce" }, "minuteAgo": { - "message": "1 dakikadan az" + "message": "Saniyeler" }, "minutes": { "message": "$nr_of_minutes$ $minutes$ önce", @@ -402,7 +402,7 @@ "message": "Bazı ayarların aktif olması için eklentinin yeniden başlatılması gerek. Bunu şimdi yapmak ister misiniz?
(Okunmamış tweet sayınız sıfırlanacak)" }, "remaining_api_hits": { - "message": "Remaining Twitter API Hits: " + "message": "Kalan Twitter API Kullanım Sayısı: " }, "rate_limit_reset": { "message": "Bir sonraki Twitter API sıfırlama tarihi: " @@ -438,7 +438,7 @@ "message": "Tema:" }, "l_font_size": { - "message": "Font boyutu:" + "message": "Yazı boyutu:" }, "o_small": { "message": "Küçük" @@ -453,34 +453,34 @@ "message": "Çok büyük" }, "l_font_family": { - "message": "Font tipi:" + "message": "Yazıtipi:" }, "l_hover_timeout": { - "message": "Okunmak için üzerinde bekleme süresi (ms):" + "message": "Okumak için üzerinde bekleme süresi (ms):" }, "l_show_expanded_urls": { "message": "Kısaltılmış adresleri genişlet:" }, "l_reply_all": { - "message": "Reply to all mentioned:" + "message": "Tüm bahsedilenleri cevapla:" }, "l_show_hits_in_popup": { - "message": "Show API hits count:" + "message": "API kullanım sayısını göster:" }, "l_show_user_autocomplete": { "message": "Kullanıcı adlarını otomatik tamamla:" }, "l_icon_color": { - "message": "İkon rengi:" + "message": "Simge rengi:" }, "l_tweets_color_only_unified": { - "message": "Colors only in unified:" + "message": "Sadece birleşik akışta renkler:" }, "l_tweet_color": { "message": "Tweet rengi:" }, "w_Mentions": { - "message": "Mentions" + "message": "Bahsetmeler" }, "btn_reset_popup_size": { "message": "Pencere Boyutunu Sıfırla" @@ -492,16 +492,16 @@ "message": "Tweet bildirimi" }, "l_change_icon": { - "message": "İkonu değiştir" + "message": "Simgeyi değiştir" }, "l_icon_color": { - "message": "Ikon rengi" + "message": "Simge rengi" }, "notif_home": { "message": "Ana Sayfa:" }, "notif_mentions": { - "message": "Mentions:" + "message": "Bahsetmeler:" }, "notif_dms": { "message": "Direkt iletiler:" @@ -546,7 +546,7 @@ "message": "Sayfa başlığını dahil et:" }, "g_timelines": { - "message": "Timelines" + "message": "Akışlar" }, "notice_api_hits": { "message": "Saatlik API limiti en fazla olabilir!
Eğer birden fazla Twitter istemcisi kullanıyorsanız aşağıdaki değerleri daha da azaltmalısınız." @@ -576,7 +576,7 @@ "message": "Engellenen kullanıcılar:" }, "notice_right_click_change": { - "message": "* Hey, now you can use the right-click context menu to change most of this settings directly into the popup window. Just get out of here! :)" + "message": "* Artık pencerede sağ tıklayarak buradaki ayarların çoğunu pencere üzerinden değiştirebilirsiniz." }, "l_tweets_per_page": { "message": "Sayfa başı gösterilecek tweet sayısı:" From 6ccc8e3364e025507ebfde0c21daec45a0f169e2 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Wed, 6 Oct 2010 22:00:40 -0300 Subject: [PATCH 003/135] Improving the way we handle failed status updates, not perfect just a little better. Closes #204 --- _locales/en/messages.json | 3 +++ lib/send_queue.js | 34 +++++++++++++++++++++++------ popup.html | 45 ++++++++++++++++++++++++++++++++++----- 3 files changed, 70 insertions(+), 12 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index d12d247b..dd4516ba 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -625,5 +625,8 @@ }, "shorten_current": { "message": "Share current page" + }, + "tweet_send_error": { + "message": "An error occurred while trying to send your tweet. Maybe Twitter is acting weird? You can try it again but please double check your account to prevent duplicated messages." } } diff --git a/lib/send_queue.js b/lib/send_queue.js index 4aab309a..9b93e443 100644 --- a/lib/send_queue.js +++ b/lib/send_queue.js @@ -6,13 +6,15 @@ function SendQueue(twitterBackend) { this.onQueueEmptyCallback = null; this.onTweetEnqueuedCallback = null; this.onTweetSentCallback = null; + this.onSendFailedCallback = null; + this.abortedQueue = null; } SendQueue.prototype = { - enqueueTweet: function(message, replyId) { + enqueueTweet: function(message, replyId, replyUser) { if(this._isDuplicate(message)) { return; } - var queuedTweet = new QueuedTweet(this.twitterBackend, message, replyId); + var queuedTweet = new QueuedTweet(this.twitterBackend, message, replyId, replyUser); this.queue.push(queuedTweet); this._safeCallbackCall(this.onTweetEnqueuedCallback, queuedTweet, this.queue.length); this._sender(); @@ -22,6 +24,14 @@ SendQueue.prototype = { return this.queue.length; }, + abortedStatus: function() { + if(!this.abortedQueue) + return; + var ret = this.abortedQueue.slice(0); + this.abortedQueue = []; + return ret; + }, + onQueueEmpty: function(onQueueEmptyCallback) { this.onQueueEmptyCallback = onQueueEmptyCallback; }, @@ -34,6 +44,10 @@ SendQueue.prototype = { this.onTweetSentCallback = onTweetSentCallback; }, + onSendFailed: function(onSendFailedCallback) { + this.onSendFailedCallback = onSendFailedCallback; + }, + _safeCallbackCall: function(callbackFunc) { if(callbackFunc) { try { @@ -87,11 +101,16 @@ SendQueue.prototype = { _this._unqueueTweet(); } else { // Too bad, something went wrong. - if(status.match(/timeout/)) { - // If it's a timeout let's wait a few seconds before issuing another request - nextRequestWaitTime = 3000; + if(tweetToSend.retryCount >= 3) { + // Tried too many times, let's abort the whole queue and let the user deal with it. + _this.abortedQueue = _this.queue; + _this.queue = []; + _this._safeCallbackCall(_this.onSendFailedCallback); + } else { + // Keep trying a few more times + nextRequestWaitTime = 10000; + tweetToSend.lastStatus = status; } - tweetToSend.lastStatus = status; } } setTimeout(function() { @@ -101,10 +120,11 @@ SendQueue.prototype = { } }; -function QueuedTweet(twitterBackend, message, replyId) { +function QueuedTweet(twitterBackend, message, replyId, replyUser) { this.twitterBackend = twitterBackend; this.message = message; this.replyId = replyId; + this.replyUser = replyUser; this.createdAt = null; this.lastStatus = null; this.lastRetry = null; diff --git a/popup.html b/popup.html index 9a58ebaf..9b2f52c5 100644 --- a/popup.html +++ b/popup.html @@ -264,14 +264,20 @@ init: function() { if(tweetManager.composerData.isComposing) { - Composer.replyId = tweetManager.composerData.replyId; - Composer.replyUser = tweetManager.composerData.replyUser; - $("#compose_tweet_area textarea").val(tweetManager.composerData.saveMessage || ''); - Composer.showComposeArea(true, true); + Composer.initMessage(tweetManager.composerData.saveMessage, tweetManager.composerData.replyId, + tweetManager.composerData.replyUser, false); } Composer.textareaChanged(); }, + initMessage: function(message, replyId, replyUser, shouldAnimate) { + Composer.replyId = replyId; + Composer.replyUser = replyUser; + $("#compose_tweet_area textarea").val(message || ''); + Composer.showComposeArea(true, !shouldAnimate); + Composer.textareaChanged(); + }, + share: function (node) { Composer.showComposeArea(true); var el = $("#compose_tweet_area textarea"); @@ -477,7 +483,7 @@ sendTweet: function () { var textarea = $("#compose_tweet_area textarea"); - tweetManager.enqueueTweet(textarea.val(), Composer.replyId); + tweetManager.enqueueTweet(textarea.val(), Composer.replyId, Composer.replyUser); textarea.val(""); Composer.replyId = null; @@ -492,6 +498,13 @@ return; } loadTimeline(true); + }, + + isVisible: function() { + var composeArea = $("#compose_tweet_area"); + var textarea = $("textarea", composeArea); + var visible = composeArea.is(':visible'); + return visible && textarea.val().length > 0; } } @@ -515,6 +528,14 @@ } WorkList.tweetEnqueued(); }); + tweetManager.sendQueue.onSendFailed(function() { + if(!window) { + return; + } + WorkList.sendFailed(); + }); + // Just checking + WorkList.sendFailed(); $("#queue_loading").tipsy({ title: function() { @@ -589,6 +610,20 @@ tweetEnqueued: function() { $("#queue_loading").show(); }, + + sendFailed: function() { + var abortedQueue = tweetManager.sendQueue.abortedStatus(); + if(!abortedQueue || abortedQueue.length == 0) { + return; + } + // If we're here that's because something went wrong + if(!Composer.isVisible()) { + // For now let's just show the first enqueued message + var topMessage = abortedQueue[0]; + Composer.initMessage(topMessage.message, topMessage.replyId, topMessage.replyUser, true); + } + Renderer.showError(chrome.i18n.getMessage("tweet_send_error")); + } }; var Shortener = { From f2e556aacea0ee08b6627341bc84b48451a4a5ff Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Thu, 7 Oct 2010 00:01:59 -0300 Subject: [PATCH 004/135] Fixing middle-click inside the popup. We cannot trust that click events will be fired for clicks with the middle button, there are some differences between browsers and apparently this motivated a recent change in the way WebKit used to work (always firing click events regardless of the button used) thus breaking the extension. As a workaround I'm now listening to mousedown and mouseup events directly as they'll always be fired. --- lib/tweets_assembler.js | 107 ++++++++++++++++++++++++++-------------- 1 file changed, 71 insertions(+), 36 deletions(-) diff --git a/lib/tweets_assembler.js b/lib/tweets_assembler.js index 3bd9d5af..0a17770a 100755 --- a/lib/tweets_assembler.js +++ b/lib/tweets_assembler.js @@ -167,7 +167,7 @@ var Renderer = { hrefObj.setAttribute("href", url); hrefObj.appendChild(document.createTextNode(url)); - hrefObj.onclick = function() { openTab(url); }; + ClickEmulator.handleClick(hrefObj, function() { openTab(url); }); hrefObj.onmouseover = function() { Renderer.expandLink(this, url); }; if (hrefObj.captureEvents) { hrefObj.captureEvents(CLICK); @@ -188,7 +188,7 @@ var Renderer = { var url = TwitterLib.URLS.SEARCH + "%23" + term; var link = Renderer.makeElem("a", {href: url}); link.appendChild(Renderer.makeText(label)); - link.onclick = function() { openTab(url); }; + ClickEmulator.handleClick(link, function() { openTab(url); }); var span = Renderer.makeElem("span", {}); span.appendChild(Renderer.makeText(header)); @@ -206,7 +206,7 @@ var Renderer = { var url = TwitterLib.URLS.BASE + username; var span = Renderer.makeElem("span", {}); var link = Renderer.makeElem("a", {href: url}); - link.onclick = function() {openTab(url);}; + ClickEmulator.handleClick(link, function() {openTab(url);}); link.appendChild(Renderer.makeText(username)); span.appendChild(Renderer.makeText("@")); span.appendChild(link); @@ -231,12 +231,15 @@ var Renderer = { return span; }, - makeElem: function(elem, attrs) { - var div = document.createElement(elem); + makeElem: function(elem, attrs, content) { + var el = document.createElement(elem); for (var attrName in attrs) { - div.setAttribute(attrName, attrs[attrName]); + el.setAttribute(attrName, attrs[attrName]); } - return div; + if(content) { + el.innerHTML = content; + } + return el; }, makeDiv: function(attrs) { return Renderer.makeElem("div", attrs); }, @@ -275,19 +278,19 @@ var Renderer = { htmlNode.innerHTML = tweet.source; tweetSource = htmlNode.textContent; } - from = Renderer.makeSpan(tweetSource.replace(/(href=(['"])(.*?)\2)/i, "href='$3' onclick=\"openTab('$3')\"")); + from = Renderer.makeSpan(tweetSource); + var linkElement = from.childNodes[0]; + ClickEmulator.handleClick(linkElement, function() { openTab(linkElement.href); }); } if(tweet.geo) { var href = "http://maps.google.com/maps?q=loc:" + tweet.geo.coordinates[0] + "," + tweet.geo.coordinates[1] + " " href += encodeURI("(" + tweet.user.screen_name + ")"); - geo = " "; - geo += "\"[GEO]\"/"; - - geo = Renderer.makeSpan(geo); + var geo = Renderer.makeElem('a', { + href: href, + onmouseover: "Renderer.geoImage(this, " + tweet.geo.coordinates[0] + "," + tweet.geo.coordinates[1] + ")" + }, "\"[GEO]\"/"); + ClickEmulator.handleClick(geo, function() { openTab(href); }); } var inReply = null; @@ -296,7 +299,7 @@ var Renderer = { inReply = document.createElement("a"); inReply.setAttribute("href", linkDst); inReply.appendChild(Renderer.makeText(chrome.i18n.getMessage("inReply") + ' ' + tweet.in_reply_to_screen_name)); - inReply.onclick = function() { openTab(linkDst); }; + ClickEmulator.handleClick(inReply, function() { openTab(linkDst); }); } var tweetUserName; @@ -332,20 +335,18 @@ var Renderer = { // now in container -> overlay -> first_container if(tweet.retweeted_status) { var img1 = Renderer.makeElem("img", {class:"profile retweet_source", src: user.profile_image_url}); - img1.onclick = openUserProfile; + ClickEmulator.handleClick(img1, openUserProfile); var img2 = Renderer.makeElem('img', {class:'profile retweet_retweeter', src: tweet.user.profile_image_url}); - img2.onclick = function() { - openTab(TwitterLib.URLS.BASE + tweet.user.screen_name); - }; + ClickEmulator.handleClick(img2, function() { openTab(TwitterLib.URLS.BASE + tweet.user.screen_name); }); first_container.appendChild(img1); first_container.appendChild(img2); } else { var img = Renderer.makeElem("img", {class:'profile', src:user.profile_image_url}); - img.onclick = openUserProfile; + ClickEmulator.handleClick(img, openUserProfile); first_container.appendChild(img); } var userName = Renderer.makeElem("a", {href: TwitterLib.URLS.BASE + user.screen_name, class:"user", screen_name: user.screen_name, title: tweetTitleUserName}); - userName.onclick = openUserProfile; + ClickEmulator.handleClick(userName, openUserProfile); userName.appendChild(Renderer.makeText(tweetUserName)); first_container.appendChild(userName); @@ -377,7 +378,7 @@ var Renderer = { statusLinkSpan.appendChild(Renderer.makeText(Renderer.getTimestampText(tweet.created_at))); var statusLink = Renderer.makeElem("a", {href:statusLinkDst}); statusLink.appendChild(statusLinkSpan); - statusLink.onclick = function() {openTab(statusLinkDst);}; + ClickEmulator.handleClick(statusLink, function() {openTab(statusLinkDst);}); footer.appendChild(statusLink); footer.appendChild(Renderer.makeText(" ")); @@ -389,7 +390,7 @@ var Renderer = { footer.appendChild(Renderer.makeText(chrome.i18n.getMessage("retweetedBy") + ' ')); var rtLink = Renderer.makeElem("a", {href:TwitterLib.URLS.BASE + tweet.user.screen_name}); rtLink.appendChild(Renderer.makeText(tweet.user.screen_name)); - rtLink.onclick = function() { opentab(TwitterLib.URLS.BASE + tweet.user.screen_name); }; + ClickEmulator.handleClick(rtLink, function() { openTab(TwitterLib.URLS.BASE + tweet.user.screen_name); }); footer.appendChild(rtLink); footer.appendChild(Renderer.makeText(" ")); } @@ -404,6 +405,7 @@ var Renderer = { } if (geo) { var span = Renderer.makeElem("span", {class:"geo_tag"}); + span.appendChild(Renderer.makeText(" ")); span.appendChild(geo); footer.appendChild(span); } @@ -414,7 +416,7 @@ var Renderer = { (function(path) { footer.appendChild(Renderer.makeText(" (List: ")); var link = Renderer.makeElem("a", {href:TwitterLib.URLS.BASE + path, title:"@"+path}); - link.onclick = function() {openTab(TwitterLib.URLS.BASE + path);}; + ClickEmulator.handleClick(link, function() {openTab(TwitterLib.URLS.BASE + path);}); link.appendChild(Renderer.makeText(list.name)); footer.appendChild(link); footer.appendChild(Renderer.makeText(")")); @@ -536,25 +538,56 @@ var Renderer = { } } -function openTab(tabUrl) { - if(Renderer.isNotification()) { - var el = event.target; - if(el.tagName == 'A' && el.href.charAt(el.href.length - 1) != '#') { - return true; +var ClickEmulator = { + waitingUp: [], + init: function() { + var _this = this; + document.addEventListener('mouseup', function() { + for(var i = 0, len = _this.waitingUp.length; i < len; ++i) { + var el = _this.waitingUp[i].element; + el.removeEventListener('mouseup', _this.waitingUp[i].listener, true); + } + if(len > 0) { + _this.waitingUp = []; + } + }, false); + }, + handleClick: function(el, clickCallback) { + if(Renderer.isNotification()) { + if(el.tagName == 'A' && el.href.charAt(el.href.length - 1) != '#') { + return; + } } + var _this = this; + el.addEventListener('click', function(event) { + if(event.button != 2) { + event.preventDefault(); + } + }, true); + el.addEventListener('mousedown', function() { + var listener = function(event) { + clickCallback(event); + }; + _this.waitingUp.push({element: this, listener: listener}); + el.addEventListener('mouseup', listener, true); + }, true); } - if(tabUrl.match(/^www/i)) { - tabUrl = "http://" + tabUrl; - } +}; + +function openTab(tabUrl) { var background = false; if(event) { - event.preventDefault(); + if(event.button == 2) { + return true; + } if(event.button == 1 || event.metaKey || event.ctrlKey) { background = true; } } - var target = '_blank'; - var obj = window.open(tabUrl, target); + if(tabUrl.match(/^www/i)) { + tabUrl = "http://" + tabUrl; + } + var obj = window.open(tabUrl, '_blank'); if(background && obj) { obj.blur(); } @@ -571,4 +604,6 @@ if(location.protocol != 'chrome-extension:' && document.body.tagName != 'FRAMESE Renderer.assemblyTweetsOnPage(tweets, response.nameAttribute, response.fadeTimeout); } }); +} else { + ClickEmulator.init(); } From cb0b80cc25eb0a0361d81c3bc88947135cf5e857 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Thu, 7 Oct 2010 00:41:42 -0300 Subject: [PATCH 005/135] Style and encoding fixes for localization files. --- _locales/de_DE/messages.json | 86 +-- _locales/en/messages.json | 1264 +++++++++++++++++----------------- _locales/es/messages.json | 1256 ++++++++++++++++----------------- _locales/nl/messages.json | 196 +++--- _locales/pt_BR/messages.json | 1234 ++++++++++++++++----------------- _locales/ru/messages.json | 1254 ++++++++++++++++----------------- 6 files changed, 2645 insertions(+), 2645 deletions(-) diff --git a/_locales/de_DE/messages.json b/_locales/de_DE/messages.json index 3ab062f0..1a4562ea 100644 --- a/_locales/de_DE/messages.json +++ b/_locales/de_DE/messages.json @@ -1,10 +1,10 @@ { "extDescription": { - "message": "Chromed Bird ist eine Erweiterung fr Twitter, die es erlaubt, der Timeline zu folgen und mit Twitter zu interagieren.", + "message": "Chromed Bird ist eine Erweiterung für Twitter, die es erlaubt, der Timeline zu folgen und mit Twitter zu interagieren.", "description": "Beschreibung der Erweiterung" }, "resetSize": { - "message": "Doppelklicken, um die Gre zurck zu setzen" + "message": "Doppelklicken, um die Größe zurück zu setzen" }, "composeTweet": { "message": "Tweet schreiben", @@ -15,19 +15,19 @@ }, "logout": { "message": "Abmelden", - "description": "Text fr den Logout-Link" + "description": "Text für den Logout-Link" }, "options": { "message": "Optionen", - "description": "Verknpfung zu den Optionen" + "description": "Verknüpfung zu den Optionen" }, "refresh": { "message": "Aktualisieren", - "description": "Verknpfung zum Aktualisieren" + "description": "Verknüpfung zum Aktualisieren" }, "suspend": { "message": "Pausieren", - "description": "Verknpfung zum Pausieren" + "description": "Verknüpfung zum Pausieren" }, "autoUpdatesSuspended": { "message": "Automatische Updates pausiert." @@ -45,16 +45,16 @@ "message": "Zeigen" }, "add": { - "message": "Hinzufgen" + "message": "Hinzufügen" }, "selectList": { - "message": "- Whle eine Liste aus -" + "message": "- Wähle eine Liste aus -" }, "updateList": { "message": "Listen aktualisieren..." }, "w_Unified": { - "message": "bersicht" + "message": "Übersicht" }, "w_Home": { "message": "Startseite" @@ -84,16 +84,16 @@ "message": "von mir retweeted" }, "unmarkFavorite": { - "message": "Als Favorit abwhlen" + "message": "Als Favorit abwählen" }, "markFavorite": { "message": "Als Favorit markieren" }, "Delete": { - "message": "Lschen" + "message": "Löschen" }, "deleteConfirm": { - "message": "Nachricht lschen: " + "message": "Nachricht löschen: " }, "Yes": { "message": "Ja" @@ -120,7 +120,7 @@ "message": "Neues Token anfordern" }, "shortenerIdleString": { - "message": "URL zum Krzen eintippen, oder gleich hier klicken \u2192" + "message": "URL zum Kürzen eintippen, oder gleich hier klicken \u2192" }, "timelineHome": { "message": "Startseite", @@ -141,7 +141,7 @@ "message": "Tweets" }, "newTweetsAvailable": { - "message": "$count$ weitere $tweets$ verfgbar. Jetzt aktualisieren.", + "message": "$count$ weitere $tweets$ verfügbar. Jetzt aktualisieren.", "placeholders": { "count": { "content": "$1" @@ -152,10 +152,10 @@ } }, "preventClosing": { - "message": "Klicken, um Schlieen zu verhindern." + "message": "Klicken, um Schließen zu verhindern." }, "changeNotificationSettings": { - "message": "Benachrichtigungseinstellungen knnen in den Optionen gendert werden." + "message": "Benachrichtigungseinstellungen können in den Optionen geändert werden." }, "loadingMap": { "message": "Lade Karte ..." @@ -173,7 +173,7 @@ "message": "AJAX Anfrage fehlgeschlagen. (Schlechte Verbindung?)" }, "successAuth": { - "message": "Glckwunsch, Du wurdest erfolgreich authentifiziert. Viel Spa mit Chromed Bird!" + "message": "Glückwunsch, Du wurdest erfolgreich authentifiziert. Viel Spaß mit Chromed Bird!" }, "cbAuthorized": { "message": "Chromed Bird authorisiert!" @@ -246,7 +246,7 @@ "message": " Wenn dieser Timeout-Fehler wiederholt auftritt, versuch's mit Aus- und wieder Einloggen." }, "ue_deletingTweet": { - "message": "Unerwartete Fehler $status$ beim Lschen eines Tweets.", + "message": "Unerwartete Fehler $status$ beim Löschen eines Tweets.", "placeholders": { "status": { "content": "$1" @@ -270,7 +270,7 @@ } }, "ue_unmarkFavorite": { - "message": "Unerwartete Fehler $status$ beim Lschen eines Favoriten.", + "message": "Unerwartete Fehler $status$ beim Löschen eines Favoriten.", "placeholders": { "status": { "content": "$1" @@ -298,7 +298,7 @@ "message": "Authorisieren!" }, "exceededAPIHits": { - "message": "Du hast die API-Aufrufgrenze berschritten. Bitte berprfe Deine Aktualisierungseinstellungen in den Optionen. Chromed Bird wird bis $nextResetDate $nextResetTime$ nicht mehr aktualisiert.", + "message": "Du hast die API-Aufrufgrenze überschritten. Bitte überprüfe Deine Aktualisierungseinstellungen in den Optionen. Chromed Bird wird bis $nextResetDate $nextResetTime$ nicht mehr aktualisiert.", "placeholders": { "options_url": { "content": "$1" @@ -312,7 +312,7 @@ } }, "warningAPIHits": { - "message": "Hey! Die verbleibende API-Aufrufe werden zu schnell weniger.
Bitte berprfe Deine Aktualisierungseinstellungen in den Optionen. Sei besonders vorsichtig, wenn Du mehrere Twitter-Programme verwendest; sie teilen sich die API-Aufrufe!
Verbleibende Aufrufe: $remainingHits$ - Nchster Reset: $nextResetDate$ $nextResetTime$", + "message": "Hey! Die verbleibende API-Aufrufe werden zu schnell weniger.
Bitte überprüfe Deine Aktualisierungseinstellungen in den Optionen. Sei besonders vorsichtig, wenn Du mehrere Twitter-Programme verwendest; sie teilen sich die API-Aufrufe!
Verbleibende Aufrufe: $remainingHits$ - Nächster Reset: $nextResetDate$ $nextResetTime$", "placeholders": { "options_url": { "content": "$1" @@ -329,7 +329,7 @@ } }, "oAuthError": { - "message": "Der folgende Fehler trat whrend der Authentifizierung auf:: $errorMessage$. Bitte hier klicken zum Neustarten der Authentifizierung.", + "message": "Der folgende Fehler trat während der Authentifizierung auf:: $errorMessage$. Bitte hier klicken zum Neustarten der Authentifizierung.", "placeholders": { "errorMessage": { "content": "$1" @@ -399,16 +399,16 @@ "message": "Die Konfiguration wurde erfolgreich gespeichert!" }, "changes_restart": { - "message": "Einige der nderungen erfordern, dass Chromed Bird neu gestartet werden muss. Jetz neu starten?
(Das wird Deinen Ungelesene Tweets-Zhler zurcksetzen.)" + "message": "Einige der Änderungen erfordern, dass Chromed Bird neu gestartet werden muss. Jetz neu starten?
(Das wird Deinen Ungelesene Tweets-Zähler zurücksetzen.)" }, "remaining_api_hits": { "message": "Verbleibende Twitter-API-Aufrufe: " }, "rate_limit_reset": { - "message": "Aufrufsgrenze wird zurckgesetzt in: " + "message": "Aufrufsgrenze wird zurückgesetzt in: " }, "nerds_link": { - "message": "API-Statistiken (fr Nerds)" + "message": "API-Statistiken (für Nerds)" }, "g_ui": { "message": "UI" @@ -438,7 +438,7 @@ "message": "UI Theme:" }, "l_font_size": { - "message": "Schriftgre:" + "message": "Schriftgröße:" }, "o_small": { "message": "Klein" @@ -447,10 +447,10 @@ "message": "Normal" }, "o_large": { - "message": "Gro" + "message": "Groß" }, "o_extra_large": { - "message": "Extragro" + "message": "Extragroß" }, "l_font_family": { "message": "Schriftfamilie:" @@ -459,7 +459,7 @@ "message": "Als Gelesen markieren nach (ms):" }, "l_show_expanded_urls": { - "message": "Verkrzte URLs auflsen:" + "message": "Verkürzte URLs auflösen:" }, "l_reply_all": { "message": "An alle antworten:" @@ -468,22 +468,22 @@ "message": "API-Aufrufzahl anzeigen:" }, "l_show_user_autocomplete": { - "message": "Benutzernamen vervollstndigen:" + "message": "Benutzernamen vervollständigen:" }, "l_icon_color": { "message": "Icon-Farbe:" }, "l_tweets_color_only_unified": { - "message": "Farben nur in der bersicht:" + "message": "Farben nur in der Übersicht:" }, "l_tweet_color": { "message": "Tweet-Farbe:" }, "w_Mentions": { - "message": "Erwhnungen" + "message": "Erwähnungen" }, "btn_reset_popup_size": { - "message": "Popup-Gre zurcksetzen" + "message": "Popup-Größe zurücksetzen" }, "g_notifications": { "message": "Benachrichtigungen" @@ -492,7 +492,7 @@ "message": "Tweet-Benachrichtigung" }, "l_change_icon": { - "message": "Icon ndern" + "message": "Icon ändern" }, "l_icon_color": { "message": "Icon-Farbe" @@ -501,7 +501,7 @@ "message": "Startseite:" }, "notif_mentions": { - "message": "Erwhnungen:" + "message": "Erwähnungen:" }, "notif_dms": { "message": "DN:" @@ -525,10 +525,10 @@ "message": "Benachrichtigungs-Timeout (s):" }, "g_shortener": { - "message": "Verkrzer" + "message": "Verkürzer" }, "l_url_shortener": { - "message": "URL-Verkrzer:" + "message": "URL-Verkürzer:" }, "l_shortener_acct": { "message": "Privates Konto nutzen?" @@ -546,7 +546,7 @@ "message": "Timelines" }, "notice_api_hits": { - "message": "Die API-Aufrufe pro Stunde sollten unter bleiben! Sonst wird Chromed Bird nicht mehr richtig arbeiten und Timelines werden nicht mehr aktualisiert.
Bedenke, dass die API-Aufrufe noch niedriger liegen mssen, wenn Du mehrere Twitter-Programme einsetzt!" + "message": "Die API-Aufrufe pro Stunde sollten unter bleiben! Sonst wird Chromed Bird nicht mehr richtig arbeiten und Timelines werden nicht mehr aktualisiert.
Bedenke, dass die API-Aufrufe noch niedriger liegen müssen, wenn Du mehrere Twitter-Programme einsetzt!" }, "l_hits_notice": { "message": "API-Aufrufe pro Stunde: " @@ -558,13 +558,13 @@ "message": "Aktualisierungs-Intervall (s)" }, "l_include_in_unified": { - "message": "In bersichts-Timeline anzeigen" + "message": "In Übersichts-Timeline anzeigen" }, "l_tabs_count": { "message": "Anzahl Tabs" }, "l_unified_timeline": { - "message": "berischts-Timeline:" + "message": "Überischts-Timeline:" }, "tml_favorites": { "message": "Favoriten:" @@ -573,7 +573,7 @@ "message": "Gesperrte Nutzer:" }, "notice_right_click_change": { - "message": "* Hey, jetzt kannst Du mit dem Kontextmen (Rechts-Klick) die meisten Einstellungen direkt im Popup-Fenster erledigen. Raus hier! :)" + "message": "* Hey, jetzt kannst Du mit dem Kontextmenü (Rechts-Klick) die meisten Einstellungen direkt im Popup-Fenster erledigen. Raus hier! :)" }, "l_tweets_per_page": { "message": "Tweets pro Setie:" @@ -612,9 +612,9 @@ "message": "Speicheren" }, "btn_reset": { - "message": "Zurcksetzen" + "message": "Zurücksetzen" }, "btn_default": { - "message": "Auf Standards zurcksetzen" + "message": "Auf Standards zurücksetzen" } } \ No newline at end of file diff --git a/_locales/en/messages.json b/_locales/en/messages.json index dd4516ba..c7f85608 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1,632 +1,632 @@ -{ - "extDescription": { - "message": "Chromed Bird is a Twitter extension that allows you to follow your timelines and interact with your Twitter account.", - "description": "Extension description" - }, - "resetSize": { - "message": "Double click to reset size" - }, - "composeTweet": { - "message": "Compose tweet", - "description": "Text for composing new tweet" - }, - "tweetit": { - "message": "Tweet it!" - }, - "logout": { - "message": "Log out", - "description": "The text for the logout link" - }, - "options": { - "message": "Options", - "description": "Options link" - }, - "refresh": { - "message": "Refresh", - "description": "Refresh link" - }, - "suspend": { - "message": "Suspend", - "description": "Suspend link" - }, - "autoUpdatesSuspended": { - "message": "Automatic updates suspended" - }, - "resume": { - "message": "Resume" - }, - "remove": { - "message": "Remove" - }, - "hide": { - "message": "Hide" - }, - "show": { - "message": "Show" - }, - "add": { - "message": "Add" - }, - "selectList": { - "message": "- Select a list -" - }, - "updateList": { - "message": "Update lists..." - }, - "w_Unified": { - "message": "Unified" - }, - "w_Home": { - "message": "Home" - }, - "w_DM": { - "message": "DMs" - }, - "w_Favorites": { - "message": "Favorites" - }, - "w_Lists": { - "message": "Lists" - }, - "w_Search": { - "message": "Search" - }, - "fromApp": { - "message": "from" - }, - "inReply": { - "message": "in reply to" - }, - "retweetedBy": { - "message": "retweeted by" - }, - "retweetedByMe": { - "message": "retweeted by me" - }, - "unmarkFavorite": { - "message": "Unmark as favorite" - }, - "markFavorite": { - "message": "Mark as favorite" - }, - "Delete": { - "message": "Delete" - }, - "deleteConfirm": { - "message": "Delete this message: " - }, - "Yes": { - "message": "Yes" - }, - "No": { - "message": "No" - }, - "Reply": { - "message": "Reply" - }, - "Retweet": { - "message": "Retweet" - }, - "retweetConfirm": { - "message": "Retweet this message: " - }, - "oldRT": { - "message": "Share (old school RT)" - }, - "markAllRead": { - "message": "Mark all as read" - }, - "newToken": { - "message": "Request another token" - }, - "shortenerIdleString": { - "message": "Type a URL to make it shorter, or, click right here \u2192" - }, - "timelineHome": { - "message": "Home", - "description": "The home time line tab" - }, - "timelineDM": { - "message": "DM", - "description": "The direct message time line tab" - }, - "timelineFavorites": { - "message": "Favorites", - "description": "The home time line tab" - }, - "tweet_singular": { - "message": "tweet" - }, - "tweet_plural": { - "message": "tweets" - }, - "newTweetsAvailable": { - "message": "$count$ more $tweets$ available. Update now.", - "placeholders": { - "count": { - "content": "$1" - }, - "tweets": { - "content": "$2" - } - } - }, - "preventClosing": { - "message": "Click to prevent closing." - }, - "changeNotificationSettings": { - "message": "You can change notification settings in the options page" - }, - "loadingMap": { - "message": "Loading map..." - }, - "loadingImage": { - "message": "Loading image..." - }, - "loadingLongUrl": { - "message": "Loading long url..." - }, - "errorExpandingUrl": { - "message": "Sorry, something went wrong, please try again." - }, - "ajaxFailed": { - "message": "AJAX request failed (bad connection?)" - }, - "successAuth": { - "message": "Congratulations, you've been successfully authenticated. Enjoy Chromed Bird!" - }, - "cbAuthorized": { - "message": "Chromed Bird authorized!" - }, - "cbNotAuthorized": { - "message": "Oops... Something went wrong. Please, try clicking Chromed Bird icon again." - }, - "authorizing": { - "message": "Please wait, authorizing Chromed Bird..." - }, - "yourPIN": { - "message": "Your PIN number is: $pin$", - "placeholders": { - "pin":{ - "content": "$1" - } - } - }, - "tryAgain": { - "message": "Try again" - }, - "canceling": { - "message": "Canceling..." - }, - "cancelTweet": { - "message": "Cancel Tweet" - }, - "queued_messages": { - "message": "Queued Messages:" - }, - "queue_trying": { - "message": "trying to send for $timediff$", - "placeholders": { - "timediff": { - "content": "$1" - } - } - }, - "queue_retried": { - "message": "retried $retries$ times since $timediff$ ago [$laststatus$]", - "placeholders": { - "retries": { - "content": "$1" - }, - "timediff": { - "content": "$2" - }, - "laststatus": { - "content": "$3" - } - } - }, - "ue_fetchingLists": { - "message": "Unexpected error $status$ fetching lists.", - "placeholders": { - "status": { - "content": "$1" - } - } - }, - "ue_updatingTweets": { - "message": "Unexpected error $baseError$ updating tweets.", - "placeholders": { - "baseError": { - "content": "$1" - } - } - }, - "ue_updatingTweets2": { - "message": " If this timeout error is being shown repeatedly, please try logging out and logging in again." - }, - "ue_deletingTweet": { - "message": "Unexpected error $status$ deleting tweet.", - "placeholders": { - "status": { - "content": "$1" - } - } - }, - "ue_retweeting": { - "message": "Unexpected error $status$ retweeting.", - "placeholders": { - "status": { - "content": "$1" - } - } - }, - "ue_markFavorite": { - "message": "Unexpected error $status$ marking as favorite.", - "placeholders": { - "status": { - "content": "$1" - } - } - }, - "ue_unmarkFavorite": { - "message": "Unexpected error $status$ unmarking as favorite.", - "placeholders": { - "status": { - "content": "$1" - } - } - }, - "newTweets": { - "message": "$count$ $newtweets$", - "placeholders": { - "count": { - "content": "$1" - }, - "newtweets": { - "content": "$2" - } - } - }, - "newtweets_singular": { - "message": "new tweet" - }, - "newtweets_plural": { - "message": "new tweets" - }, - "btnAuthorize": { - "message": "Authorize!" - }, - "exceededAPIHits": { - "message": "You've exceeded API hits limit. Please review your refresh interval settings in the options page. Chromed Bird won't update until $nextResetDate $nextResetTime$.", - "placeholders": { - "options_url": { - "content": "$1" - }, - "nextResetDate": { - "content": "$2" - }, - "nextResetTime": { - "content": "$3" - } - } - }, - "warningAPIHits": { - "message": "Hey! Your remaining API hits are ending too fast.
Please review your refresh interval settings in the options page. Take special care if you're running multiple Twitter clients, as they all share the same limit.
Available hits left: $remainingHits$ - Next hits reset: $nextResetDate$ $nextResetTime$", - "placeholders": { - "options_url": { - "content": "$1" - }, - "remainingHits": { - "content": "$2" - }, - "nextResetDate": { - "content": "$3" - }, - "nextResetTime": { - "content": "$4" - } - } - }, - "oAuthError": { - "message": "The following error occurred trying to authenticate: $errorMessage$. Please, click here to restart the authentication process", - "placeholders": { - "errorMessage": { - "content": "$1" - } - } - }, - "justNow": { - "message": "just now" - }, - "minuteAgo": { - "message": "less than 1 minute ago" - }, - "minutes": { - "message": "$nr_of_minutes$ $minutes$ ago", - "placeholders": { - "nr_of_minutes":{ - "content": "$1" - }, - "minutes": { - "content": "$2", - "example": "minute or minutes (singular / plural)" - } - } - }, - "minute_singular": { - "message": "minute" - }, - "minute_plural": { - "message": "minutes" - }, - "timeAgo": { - "message": "about $time$ $time_string$ ago", - "placeholders": { - "time": { - "content": "$1" - }, - "time_string": { - "content": "$2" - } - } - }, - "hour_singular": { - "message": "hour" - }, - "hour_plural": { - "message": "hours" - }, - "day_singular": { - "message": "day" - }, - "day_plural": { - "message": "days" - }, - "month_singular": { - "message": "month" - }, - "month_plural": { - "message": "months" - }, - "yearsAgo": { - "message": "years ago" - }, - "options_title": { - "message": "Chromed Bird Options" - }, - "conf_saved": { - "message": "Your configuration has been successfully saved!" - }, - "changes_restart": { - "message": "However, some of your changes require the extension to be restarted. Would you like to do it now?
(This will reset your unread tweets count.)" - }, - "remaining_api_hits": { - "message": "Remaining Twitter API Hits: " - }, - "rate_limit_reset": { - "message": "Rate Limit Reset: " - }, - "nerds_link": { - "message": "API Hits stats (for nerds)" - }, - "g_ui": { - "message": "UI" - }, - "l_name_attribute": { - "message": "Name in tweets:" - }, - "o_screen_name": { - "message": "Screen name (nickname)" - }, - "o_name": { - "message": "Real name" - }, - "o_both": { - "message": "Both names" - }, - "l_compose_position": { - "message": "Compose area position:" - }, - "o_top": { - "message": "Top" - }, - "o_bottom": { - "message": "Bottom" - }, - "l_theme": { - "message": "UI Theme:" - }, - "l_font_size": { - "message": "Font Size:" - }, - "o_small": { - "message": "Small" - }, - "o_normal": { - "message": "Normal" - }, - "o_large": { - "message": "Large" - }, - "o_extra_large": { - "message": "Extra Large" - }, - "l_font_family": { - "message": "Font Family:" - }, - "l_hover_timeout": { - "message": "Hover to read time (ms):" - }, - "l_show_expanded_urls": { - "message": "Expand shortened URLs:" - }, - "l_reply_all": { - "message": "Reply to all mentioned:" - }, - "l_show_hits_in_popup": { - "message": "Show API hits count:" - }, - "l_show_user_autocomplete": { - "message": "Autocomplete usernames:" - }, - "l_icon_color": { - "message": "Icon color:" - }, - "l_tweets_color_only_unified": { - "message": "Colors only in unified:" - }, - "l_tweet_color": { - "message": "Tweet color:" - }, - "w_Mentions": { - "message": "Mentions" - }, - "btn_reset_popup_size": { - "message": "Reset Popup Size" - }, - "g_notifications": { - "message": "Notifications" - }, - "l_tweet_notification": { - "message": "Tweet Notification" - }, - "l_change_icon": { - "message": "Change Icon" - }, - "l_icon_color": { - "message": "Icon Color" - }, - "notif_home": { - "message": "Home:" - }, - "notif_mentions": { - "message": "Mentions:" - }, - "notif_dms": { - "message": "DMs:" - }, - "notif_lists": { - "message": "Lists:" - }, - "notif_search": { - "message": "Search:" - }, - "l_tweets_notification_style": { - "message": "Notification Style:" - }, - "l_noti_on_page": { - "message": "Notify on Page" - }, - "l_noti_desktop": { - "message": "Desktop Notifications" - }, - "l_notification_fade_timeout": { - "message": "Notification Timeout (s):" - }, - "l_notification_max_popups": { - "message": "Notifications at once (-1: all):" - }, - "g_shortener": { - "message": "Shortener" - }, - "l_url_shortener": { - "message": "URL Shortener:" - }, - "l_shortener_acct": { - "message": "Use Personal Account?" - }, - "l_shortener_login": { - "message": "API Login:" - }, - "l_shortener_key": { - "message": "API Key:" - }, - "l_share_include_title": { - "message": "Include page title (sharing):" - }, - "g_timelines": { - "message": "Timelines" - }, - "notice_api_hits": { - "message": "You should keep API hits below ! Otherwise Chromed Bird will stop working properly and timelines won't update anymore.
Remember that if you're using multiple Twitter clients you'll need to keep your API hits even lower." - }, - "l_hits_notice": { - "message": "API hits per hour: " - }, - "l_visible": { - "message": "Visible" - }, - "l_refresh_interval": { - "message": "Refresh Interval (s)" - }, - "l_include_in_unified": { - "message": "Include in unified timeline" - }, - "l_tabs_count": { - "message": "Tabs Count" - }, - "l_unified_timeline": { - "message": "Unified Timeline:" - }, - "tml_favorites": { - "message": "Favorites:" - }, - "l_blocked_users": { - "message": "Blocked Users:" - }, - "notice_right_click_change": { - "message": "* Hey, now you can use the right-click context menu to change most of this settings directly into the popup window. Just get out of here! :)" - }, - "l_tweets_per_page": { - "message": "Tweets per Page:" - }, - "l_max_cached_tweets": { - "message": "Max Shown Tweets:" - }, - "g_microblogging_service": { - "message": "Microblogging Service" - }, - "g_advanced": { - "message": "Advanced" - }, - "l_request_timeout": { - "message": "Request Timeout (ms):" - }, - "l_base_url": { - "message": "Twitter's API URL:" - }, - "l_base_oauth_url": { - "message": "OAuth URL:" - }, - "l_same_signing_urls": { - "message": "Same signing URLs:" - }, - "l_base_signing_url": { - "message": "API Signing URL:" - }, - "l_base_oauth_signing_url": { - "message": "OAuth Signing URL:" - }, - "l_base_search_url": { - "message": "Search API URL:" - }, - "btn_save": { - "message": "Save" - }, - "btn_reset": { - "message": "Reset" - }, - "btn_default": { - "message": "Reset to default" - }, - "shortenIt": { - "message": "Shorten it!" - }, - "shorten_current": { - "message": "Share current page" - }, - "tweet_send_error": { - "message": "An error occurred while trying to send your tweet. Maybe Twitter is acting weird? You can try it again but please double check your account to prevent duplicated messages." - } -} +{ + "extDescription": { + "message": "Chromed Bird is a Twitter extension that allows you to follow your timelines and interact with your Twitter account.", + "description": "Extension description" + }, + "resetSize": { + "message": "Double click to reset size" + }, + "composeTweet": { + "message": "Compose tweet", + "description": "Text for composing new tweet" + }, + "tweetit": { + "message": "Tweet it!" + }, + "logout": { + "message": "Log out", + "description": "The text for the logout link" + }, + "options": { + "message": "Options", + "description": "Options link" + }, + "refresh": { + "message": "Refresh", + "description": "Refresh link" + }, + "suspend": { + "message": "Suspend", + "description": "Suspend link" + }, + "autoUpdatesSuspended": { + "message": "Automatic updates suspended" + }, + "resume": { + "message": "Resume" + }, + "remove": { + "message": "Remove" + }, + "hide": { + "message": "Hide" + }, + "show": { + "message": "Show" + }, + "add": { + "message": "Add" + }, + "selectList": { + "message": "- Select a list -" + }, + "updateList": { + "message": "Update lists..." + }, + "w_Unified": { + "message": "Unified" + }, + "w_Home": { + "message": "Home" + }, + "w_DM": { + "message": "DMs" + }, + "w_Favorites": { + "message": "Favorites" + }, + "w_Lists": { + "message": "Lists" + }, + "w_Search": { + "message": "Search" + }, + "fromApp": { + "message": "from" + }, + "inReply": { + "message": "in reply to" + }, + "retweetedBy": { + "message": "retweeted by" + }, + "retweetedByMe": { + "message": "retweeted by me" + }, + "unmarkFavorite": { + "message": "Unmark as favorite" + }, + "markFavorite": { + "message": "Mark as favorite" + }, + "Delete": { + "message": "Delete" + }, + "deleteConfirm": { + "message": "Delete this message: " + }, + "Yes": { + "message": "Yes" + }, + "No": { + "message": "No" + }, + "Reply": { + "message": "Reply" + }, + "Retweet": { + "message": "Retweet" + }, + "retweetConfirm": { + "message": "Retweet this message: " + }, + "oldRT": { + "message": "Share (old school RT)" + }, + "markAllRead": { + "message": "Mark all as read" + }, + "newToken": { + "message": "Request another token" + }, + "shortenerIdleString": { + "message": "Type a URL to make it shorter, or, click right here \u2192" + }, + "timelineHome": { + "message": "Home", + "description": "The home time line tab" + }, + "timelineDM": { + "message": "DM", + "description": "The direct message time line tab" + }, + "timelineFavorites": { + "message": "Favorites", + "description": "The home time line tab" + }, + "tweet_singular": { + "message": "tweet" + }, + "tweet_plural": { + "message": "tweets" + }, + "newTweetsAvailable": { + "message": "$count$ more $tweets$ available. Update now.", + "placeholders": { + "count": { + "content": "$1" + }, + "tweets": { + "content": "$2" + } + } + }, + "preventClosing": { + "message": "Click to prevent closing." + }, + "changeNotificationSettings": { + "message": "You can change notification settings in the options page" + }, + "loadingMap": { + "message": "Loading map..." + }, + "loadingImage": { + "message": "Loading image..." + }, + "loadingLongUrl": { + "message": "Loading long url..." + }, + "errorExpandingUrl": { + "message": "Sorry, something went wrong, please try again." + }, + "ajaxFailed": { + "message": "AJAX request failed (bad connection?)" + }, + "successAuth": { + "message": "Congratulations, you've been successfully authenticated. Enjoy Chromed Bird!" + }, + "cbAuthorized": { + "message": "Chromed Bird authorized!" + }, + "cbNotAuthorized": { + "message": "Oops... Something went wrong. Please, try clicking Chromed Bird icon again." + }, + "authorizing": { + "message": "Please wait, authorizing Chromed Bird..." + }, + "yourPIN": { + "message": "Your PIN number is: $pin$", + "placeholders": { + "pin":{ + "content": "$1" + } + } + }, + "tryAgain": { + "message": "Try again" + }, + "canceling": { + "message": "Canceling..." + }, + "cancelTweet": { + "message": "Cancel Tweet" + }, + "queued_messages": { + "message": "Queued Messages:" + }, + "queue_trying": { + "message": "trying to send for $timediff$", + "placeholders": { + "timediff": { + "content": "$1" + } + } + }, + "queue_retried": { + "message": "retried $retries$ times since $timediff$ ago [$laststatus$]", + "placeholders": { + "retries": { + "content": "$1" + }, + "timediff": { + "content": "$2" + }, + "laststatus": { + "content": "$3" + } + } + }, + "ue_fetchingLists": { + "message": "Unexpected error $status$ fetching lists.", + "placeholders": { + "status": { + "content": "$1" + } + } + }, + "ue_updatingTweets": { + "message": "Unexpected error $baseError$ updating tweets.", + "placeholders": { + "baseError": { + "content": "$1" + } + } + }, + "ue_updatingTweets2": { + "message": " If this timeout error is being shown repeatedly, please try logging out and logging in again." + }, + "ue_deletingTweet": { + "message": "Unexpected error $status$ deleting tweet.", + "placeholders": { + "status": { + "content": "$1" + } + } + }, + "ue_retweeting": { + "message": "Unexpected error $status$ retweeting.", + "placeholders": { + "status": { + "content": "$1" + } + } + }, + "ue_markFavorite": { + "message": "Unexpected error $status$ marking as favorite.", + "placeholders": { + "status": { + "content": "$1" + } + } + }, + "ue_unmarkFavorite": { + "message": "Unexpected error $status$ unmarking as favorite.", + "placeholders": { + "status": { + "content": "$1" + } + } + }, + "newTweets": { + "message": "$count$ $newtweets$", + "placeholders": { + "count": { + "content": "$1" + }, + "newtweets": { + "content": "$2" + } + } + }, + "newtweets_singular": { + "message": "new tweet" + }, + "newtweets_plural": { + "message": "new tweets" + }, + "btnAuthorize": { + "message": "Authorize!" + }, + "exceededAPIHits": { + "message": "You've exceeded API hits limit. Please review your refresh interval settings in the options page. Chromed Bird won't update until $nextResetDate $nextResetTime$.", + "placeholders": { + "options_url": { + "content": "$1" + }, + "nextResetDate": { + "content": "$2" + }, + "nextResetTime": { + "content": "$3" + } + } + }, + "warningAPIHits": { + "message": "Hey! Your remaining API hits are ending too fast.
Please review your refresh interval settings in the options page. Take special care if you're running multiple Twitter clients, as they all share the same limit.
Available hits left: $remainingHits$ - Next hits reset: $nextResetDate$ $nextResetTime$", + "placeholders": { + "options_url": { + "content": "$1" + }, + "remainingHits": { + "content": "$2" + }, + "nextResetDate": { + "content": "$3" + }, + "nextResetTime": { + "content": "$4" + } + } + }, + "oAuthError": { + "message": "The following error occurred trying to authenticate: $errorMessage$. Please, click here to restart the authentication process", + "placeholders": { + "errorMessage": { + "content": "$1" + } + } + }, + "justNow": { + "message": "just now" + }, + "minuteAgo": { + "message": "less than 1 minute ago" + }, + "minutes": { + "message": "$nr_of_minutes$ $minutes$ ago", + "placeholders": { + "nr_of_minutes":{ + "content": "$1" + }, + "minutes": { + "content": "$2", + "example": "minute or minutes (singular / plural)" + } + } + }, + "minute_singular": { + "message": "minute" + }, + "minute_plural": { + "message": "minutes" + }, + "timeAgo": { + "message": "about $time$ $time_string$ ago", + "placeholders": { + "time": { + "content": "$1" + }, + "time_string": { + "content": "$2" + } + } + }, + "hour_singular": { + "message": "hour" + }, + "hour_plural": { + "message": "hours" + }, + "day_singular": { + "message": "day" + }, + "day_plural": { + "message": "days" + }, + "month_singular": { + "message": "month" + }, + "month_plural": { + "message": "months" + }, + "yearsAgo": { + "message": "years ago" + }, + "options_title": { + "message": "Chromed Bird Options" + }, + "conf_saved": { + "message": "Your configuration has been successfully saved!" + }, + "changes_restart": { + "message": "However, some of your changes require the extension to be restarted. Would you like to do it now?
(This will reset your unread tweets count.)" + }, + "remaining_api_hits": { + "message": "Remaining Twitter API Hits: " + }, + "rate_limit_reset": { + "message": "Rate Limit Reset: " + }, + "nerds_link": { + "message": "API Hits stats (for nerds)" + }, + "g_ui": { + "message": "UI" + }, + "l_name_attribute": { + "message": "Name in tweets:" + }, + "o_screen_name": { + "message": "Screen name (nickname)" + }, + "o_name": { + "message": "Real name" + }, + "o_both": { + "message": "Both names" + }, + "l_compose_position": { + "message": "Compose area position:" + }, + "o_top": { + "message": "Top" + }, + "o_bottom": { + "message": "Bottom" + }, + "l_theme": { + "message": "UI Theme:" + }, + "l_font_size": { + "message": "Font Size:" + }, + "o_small": { + "message": "Small" + }, + "o_normal": { + "message": "Normal" + }, + "o_large": { + "message": "Large" + }, + "o_extra_large": { + "message": "Extra Large" + }, + "l_font_family": { + "message": "Font Family:" + }, + "l_hover_timeout": { + "message": "Hover to read time (ms):" + }, + "l_show_expanded_urls": { + "message": "Expand shortened URLs:" + }, + "l_reply_all": { + "message": "Reply to all mentioned:" + }, + "l_show_hits_in_popup": { + "message": "Show API hits count:" + }, + "l_show_user_autocomplete": { + "message": "Autocomplete usernames:" + }, + "l_icon_color": { + "message": "Icon color:" + }, + "l_tweets_color_only_unified": { + "message": "Colors only in unified:" + }, + "l_tweet_color": { + "message": "Tweet color:" + }, + "w_Mentions": { + "message": "Mentions" + }, + "btn_reset_popup_size": { + "message": "Reset Popup Size" + }, + "g_notifications": { + "message": "Notifications" + }, + "l_tweet_notification": { + "message": "Tweet Notification" + }, + "l_change_icon": { + "message": "Change Icon" + }, + "l_icon_color": { + "message": "Icon Color" + }, + "notif_home": { + "message": "Home:" + }, + "notif_mentions": { + "message": "Mentions:" + }, + "notif_dms": { + "message": "DMs:" + }, + "notif_lists": { + "message": "Lists:" + }, + "notif_search": { + "message": "Search:" + }, + "l_tweets_notification_style": { + "message": "Notification Style:" + }, + "l_noti_on_page": { + "message": "Notify on Page" + }, + "l_noti_desktop": { + "message": "Desktop Notifications" + }, + "l_notification_fade_timeout": { + "message": "Notification Timeout (s):" + }, + "l_notification_max_popups": { + "message": "Notifications at once (-1: all):" + }, + "g_shortener": { + "message": "Shortener" + }, + "l_url_shortener": { + "message": "URL Shortener:" + }, + "l_shortener_acct": { + "message": "Use Personal Account?" + }, + "l_shortener_login": { + "message": "API Login:" + }, + "l_shortener_key": { + "message": "API Key:" + }, + "l_share_include_title": { + "message": "Include page title (sharing):" + }, + "g_timelines": { + "message": "Timelines" + }, + "notice_api_hits": { + "message": "You should keep API hits below ! Otherwise Chromed Bird will stop working properly and timelines won't update anymore.
Remember that if you're using multiple Twitter clients you'll need to keep your API hits even lower." + }, + "l_hits_notice": { + "message": "API hits per hour: " + }, + "l_visible": { + "message": "Visible" + }, + "l_refresh_interval": { + "message": "Refresh Interval (s)" + }, + "l_include_in_unified": { + "message": "Include in unified timeline" + }, + "l_tabs_count": { + "message": "Tabs Count" + }, + "l_unified_timeline": { + "message": "Unified Timeline:" + }, + "tml_favorites": { + "message": "Favorites:" + }, + "l_blocked_users": { + "message": "Blocked Users:" + }, + "notice_right_click_change": { + "message": "* Hey, now you can use the right-click context menu to change most of this settings directly into the popup window. Just get out of here! :)" + }, + "l_tweets_per_page": { + "message": "Tweets per Page:" + }, + "l_max_cached_tweets": { + "message": "Max Shown Tweets:" + }, + "g_microblogging_service": { + "message": "Microblogging Service" + }, + "g_advanced": { + "message": "Advanced" + }, + "l_request_timeout": { + "message": "Request Timeout (ms):" + }, + "l_base_url": { + "message": "Twitter's API URL:" + }, + "l_base_oauth_url": { + "message": "OAuth URL:" + }, + "l_same_signing_urls": { + "message": "Same signing URLs:" + }, + "l_base_signing_url": { + "message": "API Signing URL:" + }, + "l_base_oauth_signing_url": { + "message": "OAuth Signing URL:" + }, + "l_base_search_url": { + "message": "Search API URL:" + }, + "btn_save": { + "message": "Save" + }, + "btn_reset": { + "message": "Reset" + }, + "btn_default": { + "message": "Reset to default" + }, + "shortenIt": { + "message": "Shorten it!" + }, + "shorten_current": { + "message": "Share current page" + }, + "tweet_send_error": { + "message": "An error occurred while trying to send your tweet. Maybe Twitter is acting weird? You can try it again but please double check your account to prevent duplicated messages." + } +} diff --git a/_locales/es/messages.json b/_locales/es/messages.json index e745b0bf..ae94ddce 100644 --- a/_locales/es/messages.json +++ b/_locales/es/messages.json @@ -1,629 +1,629 @@ -{ - "extDescription": { - "message": "Chromed Bird es una extensión para Twitter que te permite seguir tus líneas de tiempo e interactuar con tu cuenta de Twitter.", - "description": "Extension description" - }, - "resetSize": { - "message": "Doble clic para resetar el tamaño" - }, - "composeTweet": { - "message": "Publicar un tweet", - "description": "Text for composing new tweet" - }, - "tweetit": { - "message": "¡Publicar!" - }, - "logout": { - "message": "Cerrar sesión", - "description": "The text for the logout link" - }, - "options": { - "message": "Opciones", - "description": "Options link" - }, - "refresh": { - "message": "Refrescar", - "description": "Refresh link" - }, - "suspend": { - "message": "Suspender", - "description": "Suspend link" - }, - "autoUpdatesSuspended": { - "message": "Actualizaciones automáticas suspendidas" - }, - "resume": { - "message": "Resume" - }, - "remove": { - "message": "Eliminar" - }, - "hide": { - "message": "Ocultar" - }, - "show": { - "message": "Mostrar" - }, - "add": { - "message": "Añadir" - }, - "selectList": { - "message": "- Selecciona una lista -" - }, - "updateLists": { - "message": "Actualizar Listas..." - }, - "w_Unified": { - "message": "Unificada" - }, - "w_Home": { - "message": "Inicio" - }, - "w_DM": { - "message": "MD" - }, - "w_Favorites": { - "message": "Favoritos" - }, - "w_Lists": { - "message": "Listas" - }, - "w_Search": { - "message": "Búsqueda" - }, - "fromApp": { - "message": "via" - }, - "inReply": { - "message": "en respuesta a" - }, - "retweetedBy": { - "message": "retweet de" - }, - "retweetedByMe": { - "message": "retweet mío" - }, - "unmarkFavorite": { - "message": "Desmarcar como favorito" - }, - "markFavorite": { - "message": "Marcar como favorito" - }, - "Delete": { - "message": "Borrar" - }, - "deleteConfirm": { - "message": "Borrar este tweet: " - }, - "Yes": { - "message": "Sí" - }, - "No": { - "message": "No" - }, - "Reply": { - "message": "Responder" - }, - "Retweet": { - "message": "Retwittear" - }, - "retweetConfirm": { - "message": "Retwittear este tweet: " - }, - "oldRT": { - "message": "Compartir (antiguo RT)" - }, - "markAllRead": { - "message": "Marcar todo como leído" - }, - "newToken": { - "message": "Pedir otro token" - }, - "shortenerIdleString": { - "message": "Escribe una URL para acortarla o haz clic justo aquí \u2192" - }, - "timelineHome": { - "message": "Inicio", - "description": "The home time line tab" - }, - "timelineDM": { - "message": "DM", - "description": "The direct message time line tab" - }, - "timelineFavorites": { - "message": "Favoritos", - "description": "The home time line tab" - }, - "tweet_singular": { - "message": "tweet" - }, - "tweet_plural": { - "message": "tweets" - }, - "newTweetsAvailable": { - "message": "$count$ $tweets$ más disponibles. Actualizar ahora.", - "placeholders": { - "count": { - "content": "$1" - }, - "tweets": { - "content": "$2" - } - } - }, - "preventClosing": { - "message": "Clic para evitar que se cierre." - }, - "changeNotificationSettings": { - "message": "Puedes cambiar la configuración de las notificaciones en la página de Opciones" - }, - "loadingMap": { - "message": "Cargando mapa..." - }, - "loadingImage": { - "message": "Cargando imagen..." - }, - "loadingLongUrl": { - "message": "Cargando url larga..." - }, - "errorExpandingUrl": { - "message": "Lo siento, algo fue mal. Por favor, inténtalo de nuevo." - }, - "ajaxFailed": { - "message": "La petición AJAX falló (¿problemas de conexión?)" - }, - "successAuth": { - "message": "Felicidades, te has autentificado satisfactoriamente. ¡Disfruta Chromed Bird!" - }, - "cbAuthorized": { - "message": "Chromed Bird autorizado!" - }, - "cbNotAuthorized": { - "message": "Oops... Algo fue mal. Por favor, inténtalo de nuevo haciendo clic en el icono de Chromed Bird." - }, - "authorizing": { - "message": "Autorizando Chromed Bird, por favor, espera..." - }, - "yourPIN": { - "message": "Tu número PIN es: $pin$", - "placeholders": { - "pin":{ - "content": "$1" - } - } - }, - "tryAgain": { - "message": "Vuelve a intentarlo" - }, - "canceling": { - "message": "Cancelando..." - }, - "cancelTweet": { - "message": "Cancelar Tweet" - }, - "queued_messages": { - "message": "Mensajes encolados:" - }, - "queue_trying": { - "message": "intentando enviarlo en $timediff$", - "placeholders": { - "timediff": { - "content": "$1" - } - } - }, - "queue_retried": { - "message": "reintentado $retries$ veces desde $timediff$ $laststatus$", - "placeholders": { - "retries": { - "content": "$1" - }, - "timediff": { - "content": "$2" - }, - "laststatus": { - "content": "$3" - } - } - }, - "ue_fetchingLists": { - "message": "Error inesperado $status$ actualizando listas.", - "placeholders": { - "status": { - "content": "$1" - } - } - }, - "ue_updatingTweets": { - "message": "Error inesperado $baseError$ actualizando tweets.", - "placeholders": { - "baseError": { - "content": "$1" - } - } - }, - "ue_updatingTweets2": { - "message": " Si este error (timeout) se repite muy a menudo, por favor, intenta cerrando la sesión y volviendo a conectar." - }, - "ue_deletingTweet": { - "message": "Error inesperado $status$ borrando tweet.", - "placeholders": { - "status": { - "content": "$1" - } - } - }, - "ue_retweeting": { - "message": "Error inesperado $status$ retweeteando.", - "placeholders": { - "status": { - "content": "$1" - } - } - }, - "ue_markFavorite": { - "message": "Error inesperado $status$ marcando como favorito.", - "placeholders": { - "status": { - "content": "$1" - } - } - }, - "ue_unmarkFavorite": { - "message": "Error inesperado $status$ desmarcando como favorito.", - "placeholders": { - "status": { - "content": "$1" - } - } - }, - "newTweets": { - "message": "$count$ $newtweets$", - "placeholders": { - "count": { - "content": "$1" - }, - "newtweets": { - "content": "$2" - } - } - }, - "newtweets_singular": { - "message": "nuevo tweet" - }, - "newtweets_plural": { - "message": "nuevos tweets" - }, - "btnAuthorize": { - "message": "¡Autorizar!" - }, - "exceededAPIHits": { - "message": "Has superado el límite de peticiones al API. Por favor, revisa los intervalos de actualización en la página de opciones. Chromed Bird no actualizará hasta $nextResetDate $nextResetTime$.", - "placeholders": { - "options_url": { - "content": "$1" - }, - "nextResetDate": { - "content": "$2" - }, - "nextResetTime": { - "content": "$3" - } - } - }, - "warningAPIHits": { - "message": "Hey! Te estás quedando sin llamadas disponibles al API demasiado rápido.
Por favor, revisa los intervalos de actualización en la página de opciones. Presta especial atención si estás usando más de un cliente de Twitter, ya que todos ellos comparten el mismo límite.
Llamadas disponibles: $remainingHits$ - Próximo reseteo de llamadas: $nextResetDate$ $nextResetTime$", - "placeholders": { - "options_url": { - "content": "$1" - }, - "remainingHits": { - "content": "$2" - }, - "nextResetDate": { - "content": "$3" - }, - "nextResetTime": { - "content": "$4" - } - } - }, - "oAuthError": { - "message": "Mientras te autentificabas, ocurrió el siguiente error: $errorMessage$. Por favor, haz clic aquí para reiniciar el proceso de autenticación", - "placeholders": { - "errorMessage":{ - "content": "$1" - } - } - }, - "justNow": { - "message": "ahora mismo" - }, - "minuteAgo": { - "message": "hace un minuto" - }, - "minutes": { - "message": "hace $nr_of_minutes$ $minutes$", - "placeholders": { - "nr_of_minutes":{ - "content": "$1" - }, - "minutes": { - "content": "$2", - "example": "minute or minutes (singular / plural)" - } - } - }, - "minute_singular": { - "message": "minuto" - }, - "minute_plural": { - "message": "minutos" - }, - "timeAgo": { - "message": "hace alrededor de $time$ $time_string$", - "placeholders": { - "time": { - "content": "$1" - }, - "time_string": { - "content": "$2" - } - } - }, - "hour_singular": { - "message": "hora" - }, - "hour_plural": { - "message": "horas" - }, - "day_singular": { - "message": "día" - }, - "day_plural": { - "message": "días" - }, - "month_singular": { - "message": "mes" - }, - "month_plural": { - "message": "meses" - }, - "yearsAgo": { - "message": "hace años" - }, - "options_title": { - "message": "Opciones de Chromed Bird" - }, - "conf_saved": { - "message": "¡Tu configuración se ha guardado satisfactoriamente!" - }, - "changes_restart": { - "message": "Sin embargo, algunos de tus cambios requieren que la extensión se reinicie. ¿Te gustaría hacerlo ahora?
(Esto reiniciará tu contador de tweets leídos.)" - }, - "remaining_api_hits": { - "message": "Llamadas al API de Twitter disponibles: " - }, - "rate_limit_reset": { - "message": "Reinicio del límite: " - }, - "nerds_link": { - "message": "Estadísticas de llamadas al API (para gafapastas)" - }, - "g_ui": { - "message": "Interfaz de Usuario" - }, - "l_name_attribute": { - "message": "Nombre en los tweets:" - }, - "o_screen_name": { - "message": "Nombre en pantalla (nickname)" - }, - "o_name": { - "message": "Nombre real" - }, - "o_both": { - "message": "Los dos nombres" - }, - "l_compose_position": { - "message": "Posición del área de escritura:" - }, - "o_top": { - "message": "Arriba" - }, - "o_bottom": { - "message": "Abajo" - }, - "l_theme": { - "message": "Tema de IU:" - }, - "l_font_size": { - "message": "Tamaño de Fuente:" - }, - "o_small": { - "message": "Pequeña" - }, - "o_normal": { - "message": "Normal" - }, - "o_large": { - "message": "Grande" - }, - "o_extra_large": { - "message": "Extra Grande" - }, - "l_font_family": { - "message": "Familia de Fuente:" - }, - "l_hover_timeout": { - "message": "Marcar como leído en (ms):" - }, - "l_show_expanded_urls": { - "message": "Expandir URLs acortadas:" - }, - "l_reply_all": { - "message": "Resp. a todos los mencion.:" - }, - "l_show_hits_in_popup": { - "message": "Mostrar cont. de llam. al API:" - }, - "l_show_user_autocomplete": { - "message": "Autocomp. nom. de usuario:" - }, - "l_icon_color": { - "message": "Color de Icono:" - }, - "l_tweets_color_only_unified": { - "message": "Colores sólo en unificado:" - }, - "l_tweet_color": { - "message": "Color de Tweet:" - }, - "w_Mentions": { - "message": "Menciones" - }, - "btn_reset_popup_size": { - "message": "Reiniciar tamaño del Popup" - }, - "g_notifications": { - "message": "Notificaciones" - }, - "l_tweet_notification": { - "message": "Notificaciones de Tweets" - }, - "l_change_icon": { - "message": "Cambiar icono" - }, - "l_icon_color": { - "message": "Color de Icono" - }, - "notif_home": { - "message": "Inicio:" - }, - "notif_mentions": { - "message": "Menciones:" - }, - "notif_dms": { - "message": "MDs:" - }, - "notif_lists": { - "message": "Listas:" - }, - "notif_search": { - "message": "Búsqueda:" - }, - "l_tweets_notification_style": { - "message": "Estilo de notificación:" - }, - "l_noti_on_page": { - "message": "Notificar en la página" - }, - "l_noti_desktop": { - "message": "Notificaciones de Escritorio" - }, - "l_notification_fade_timeout": { - "message": "Timeout de Notificaciones (s):" - }, - "l_notification_max_popups": { - "message": "Notificaciones a la vez (-1: todas):" - }, - "g_shortener": { - "message": "Acortador" - }, - "l_url_shortener": { - "message": "Acortador de URLs:" - }, - "l_shortener_acct": { - "message": "¿Usar cuenta personal?" - }, - "l_shortener_login": { - "message": "Login para API:" - }, - "l_shortener_key": { - "message": "Key para el API:" - }, - "l_share_include_title": { - "message": "Incluir título de página (compartir):" - }, - "g_timelines": { - "message": "Líneas de tiempo" - }, - "notice_api_hits": { - "message": "¡Deberías mantener las peticiones al API por debajo de ! Si no, Chromed Bird dejará de funcionar adecuadamente y las líneas de tiempo no se actualizarán más.
Recuerda que si estás usando más de un cliente de Twitter entonces necesitarás mantener el número de peticiones al API todavía más bajo." - }, - "l_hits_notice": { - "message": "Llamadas al API por hora: " - }, - "l_visible": { - "message": "Visible" - }, - "l_refresh_interval": { - "message": "Intervalo de refresco (s)" - }, - "l_include_in_unified": { - "message": "Incluir en la línea de tiempo Unificada" - }, - "l_tabs_count": { - "message": "Contador de pestañas" - }, - "l_unified_timeline": { - "message": "Línea de tiempo Unificada:" - }, - "tml_favorites": { - "message": "Favoritos:" - }, - "l_blocked_users": { - "message": "Usuarios bloqueados:" - }, - "notice_right_click_change": { - "message": "* Hey, ahora puedes usar el menú contextual que aparece con clic-derecho para cambiar la mayoría de estos ajustes directamente desde la ventana emergente. ¡Sal de aquí anda! :)" - }, - "l_tweets_per_page": { - "message": "Tweets por página:" - }, - "l_max_cached_tweets": { - "message": "Máx. número de tweets mostrados:" - }, - "g_microblogging_service": { - "message": "Servicio de Microblogging" - }, - "g_advanced": { - "message": "Avanzado" - }, - "l_request_timeout": { - "message": "Timeout para las peticiones (ms):" - }, - "l_base_url": { - "message": "URL del API de Twitter:" - }, - "l_base_oauth_url": { - "message": "URL de OAuth:" - }, - "l_same_signing_urls": { - "message": "Same signing URLs:" - }, - "l_base_signing_url": { - "message": "API Signing URL:" - }, - "l_base_oauth_signing_url": { - "message": "OAuth Signing URL:" - }, - "l_base_search_url": { - "message": "URL del API de búsquedas:" - }, - "btn_save": { - "message": "Guardar" - }, - "btn_reset": { - "message": "Reiniciar" - }, - "btn_default": { - "message": "Reiniciar a por defecto" - }, - "shortenIt": { - "message": "¡Acortar!" - }, - "shorten_current": { - "message": "Compartir página actual" - } +{ + "extDescription": { + "message": "Chromed Bird es una extensión para Twitter que te permite seguir tus líneas de tiempo e interactuar con tu cuenta de Twitter.", + "description": "Extension description" + }, + "resetSize": { + "message": "Doble clic para resetar el tamaño" + }, + "composeTweet": { + "message": "Publicar un tweet", + "description": "Text for composing new tweet" + }, + "tweetit": { + "message": "¡Publicar!" + }, + "logout": { + "message": "Cerrar sesión", + "description": "The text for the logout link" + }, + "options": { + "message": "Opciones", + "description": "Options link" + }, + "refresh": { + "message": "Refrescar", + "description": "Refresh link" + }, + "suspend": { + "message": "Suspender", + "description": "Suspend link" + }, + "autoUpdatesSuspended": { + "message": "Actualizaciones automáticas suspendidas" + }, + "resume": { + "message": "Resume" + }, + "remove": { + "message": "Eliminar" + }, + "hide": { + "message": "Ocultar" + }, + "show": { + "message": "Mostrar" + }, + "add": { + "message": "Añadir" + }, + "selectList": { + "message": "- Selecciona una lista -" + }, + "updateLists": { + "message": "Actualizar Listas..." + }, + "w_Unified": { + "message": "Unificada" + }, + "w_Home": { + "message": "Inicio" + }, + "w_DM": { + "message": "MD" + }, + "w_Favorites": { + "message": "Favoritos" + }, + "w_Lists": { + "message": "Listas" + }, + "w_Search": { + "message": "Búsqueda" + }, + "fromApp": { + "message": "via" + }, + "inReply": { + "message": "en respuesta a" + }, + "retweetedBy": { + "message": "retweet de" + }, + "retweetedByMe": { + "message": "retweet mío" + }, + "unmarkFavorite": { + "message": "Desmarcar como favorito" + }, + "markFavorite": { + "message": "Marcar como favorito" + }, + "Delete": { + "message": "Borrar" + }, + "deleteConfirm": { + "message": "Borrar este tweet: " + }, + "Yes": { + "message": "Sí" + }, + "No": { + "message": "No" + }, + "Reply": { + "message": "Responder" + }, + "Retweet": { + "message": "Retwittear" + }, + "retweetConfirm": { + "message": "Retwittear este tweet: " + }, + "oldRT": { + "message": "Compartir (antiguo RT)" + }, + "markAllRead": { + "message": "Marcar todo como leído" + }, + "newToken": { + "message": "Pedir otro token" + }, + "shortenerIdleString": { + "message": "Escribe una URL para acortarla o haz clic justo aquí \u2192" + }, + "timelineHome": { + "message": "Inicio", + "description": "The home time line tab" + }, + "timelineDM": { + "message": "DM", + "description": "The direct message time line tab" + }, + "timelineFavorites": { + "message": "Favoritos", + "description": "The home time line tab" + }, + "tweet_singular": { + "message": "tweet" + }, + "tweet_plural": { + "message": "tweets" + }, + "newTweetsAvailable": { + "message": "$count$ $tweets$ más disponibles. Actualizar ahora.", + "placeholders": { + "count": { + "content": "$1" + }, + "tweets": { + "content": "$2" + } + } + }, + "preventClosing": { + "message": "Clic para evitar que se cierre." + }, + "changeNotificationSettings": { + "message": "Puedes cambiar la configuración de las notificaciones en la página de Opciones" + }, + "loadingMap": { + "message": "Cargando mapa..." + }, + "loadingImage": { + "message": "Cargando imagen..." + }, + "loadingLongUrl": { + "message": "Cargando url larga..." + }, + "errorExpandingUrl": { + "message": "Lo siento, algo fue mal. Por favor, inténtalo de nuevo." + }, + "ajaxFailed": { + "message": "La petición AJAX falló (¿problemas de conexión?)" + }, + "successAuth": { + "message": "Felicidades, te has autentificado satisfactoriamente. ¡Disfruta Chromed Bird!" + }, + "cbAuthorized": { + "message": "Chromed Bird autorizado!" + }, + "cbNotAuthorized": { + "message": "Oops... Algo fue mal. Por favor, inténtalo de nuevo haciendo clic en el icono de Chromed Bird." + }, + "authorizing": { + "message": "Autorizando Chromed Bird, por favor, espera..." + }, + "yourPIN": { + "message": "Tu número PIN es: $pin$", + "placeholders": { + "pin":{ + "content": "$1" + } + } + }, + "tryAgain": { + "message": "Vuelve a intentarlo" + }, + "canceling": { + "message": "Cancelando..." + }, + "cancelTweet": { + "message": "Cancelar Tweet" + }, + "queued_messages": { + "message": "Mensajes encolados:" + }, + "queue_trying": { + "message": "intentando enviarlo en $timediff$", + "placeholders": { + "timediff": { + "content": "$1" + } + } + }, + "queue_retried": { + "message": "reintentado $retries$ veces desde $timediff$ $laststatus$", + "placeholders": { + "retries": { + "content": "$1" + }, + "timediff": { + "content": "$2" + }, + "laststatus": { + "content": "$3" + } + } + }, + "ue_fetchingLists": { + "message": "Error inesperado $status$ actualizando listas.", + "placeholders": { + "status": { + "content": "$1" + } + } + }, + "ue_updatingTweets": { + "message": "Error inesperado $baseError$ actualizando tweets.", + "placeholders": { + "baseError": { + "content": "$1" + } + } + }, + "ue_updatingTweets2": { + "message": " Si este error (timeout) se repite muy a menudo, por favor, intenta cerrando la sesión y volviendo a conectar." + }, + "ue_deletingTweet": { + "message": "Error inesperado $status$ borrando tweet.", + "placeholders": { + "status": { + "content": "$1" + } + } + }, + "ue_retweeting": { + "message": "Error inesperado $status$ retweeteando.", + "placeholders": { + "status": { + "content": "$1" + } + } + }, + "ue_markFavorite": { + "message": "Error inesperado $status$ marcando como favorito.", + "placeholders": { + "status": { + "content": "$1" + } + } + }, + "ue_unmarkFavorite": { + "message": "Error inesperado $status$ desmarcando como favorito.", + "placeholders": { + "status": { + "content": "$1" + } + } + }, + "newTweets": { + "message": "$count$ $newtweets$", + "placeholders": { + "count": { + "content": "$1" + }, + "newtweets": { + "content": "$2" + } + } + }, + "newtweets_singular": { + "message": "nuevo tweet" + }, + "newtweets_plural": { + "message": "nuevos tweets" + }, + "btnAuthorize": { + "message": "¡Autorizar!" + }, + "exceededAPIHits": { + "message": "Has superado el límite de peticiones al API. Por favor, revisa los intervalos de actualización en la página de opciones. Chromed Bird no actualizará hasta $nextResetDate $nextResetTime$.", + "placeholders": { + "options_url": { + "content": "$1" + }, + "nextResetDate": { + "content": "$2" + }, + "nextResetTime": { + "content": "$3" + } + } + }, + "warningAPIHits": { + "message": "Hey! Te estás quedando sin llamadas disponibles al API demasiado rápido.
Por favor, revisa los intervalos de actualización en la página de opciones. Presta especial atención si estás usando más de un cliente de Twitter, ya que todos ellos comparten el mismo límite.
Llamadas disponibles: $remainingHits$ - Próximo reseteo de llamadas: $nextResetDate$ $nextResetTime$", + "placeholders": { + "options_url": { + "content": "$1" + }, + "remainingHits": { + "content": "$2" + }, + "nextResetDate": { + "content": "$3" + }, + "nextResetTime": { + "content": "$4" + } + } + }, + "oAuthError": { + "message": "Mientras te autentificabas, ocurrió el siguiente error: $errorMessage$. Por favor, haz clic aquí para reiniciar el proceso de autenticación", + "placeholders": { + "errorMessage":{ + "content": "$1" + } + } + }, + "justNow": { + "message": "ahora mismo" + }, + "minuteAgo": { + "message": "hace un minuto" + }, + "minutes": { + "message": "hace $nr_of_minutes$ $minutes$", + "placeholders": { + "nr_of_minutes":{ + "content": "$1" + }, + "minutes": { + "content": "$2", + "example": "minute or minutes (singular / plural)" + } + } + }, + "minute_singular": { + "message": "minuto" + }, + "minute_plural": { + "message": "minutos" + }, + "timeAgo": { + "message": "hace alrededor de $time$ $time_string$", + "placeholders": { + "time": { + "content": "$1" + }, + "time_string": { + "content": "$2" + } + } + }, + "hour_singular": { + "message": "hora" + }, + "hour_plural": { + "message": "horas" + }, + "day_singular": { + "message": "día" + }, + "day_plural": { + "message": "días" + }, + "month_singular": { + "message": "mes" + }, + "month_plural": { + "message": "meses" + }, + "yearsAgo": { + "message": "hace años" + }, + "options_title": { + "message": "Opciones de Chromed Bird" + }, + "conf_saved": { + "message": "¡Tu configuración se ha guardado satisfactoriamente!" + }, + "changes_restart": { + "message": "Sin embargo, algunos de tus cambios requieren que la extensión se reinicie. ¿Te gustaría hacerlo ahora?
(Esto reiniciará tu contador de tweets leídos.)" + }, + "remaining_api_hits": { + "message": "Llamadas al API de Twitter disponibles: " + }, + "rate_limit_reset": { + "message": "Reinicio del límite: " + }, + "nerds_link": { + "message": "Estadísticas de llamadas al API (para gafapastas)" + }, + "g_ui": { + "message": "Interfaz de Usuario" + }, + "l_name_attribute": { + "message": "Nombre en los tweets:" + }, + "o_screen_name": { + "message": "Nombre en pantalla (nickname)" + }, + "o_name": { + "message": "Nombre real" + }, + "o_both": { + "message": "Los dos nombres" + }, + "l_compose_position": { + "message": "Posición del área de escritura:" + }, + "o_top": { + "message": "Arriba" + }, + "o_bottom": { + "message": "Abajo" + }, + "l_theme": { + "message": "Tema de IU:" + }, + "l_font_size": { + "message": "Tamaño de Fuente:" + }, + "o_small": { + "message": "Pequeña" + }, + "o_normal": { + "message": "Normal" + }, + "o_large": { + "message": "Grande" + }, + "o_extra_large": { + "message": "Extra Grande" + }, + "l_font_family": { + "message": "Familia de Fuente:" + }, + "l_hover_timeout": { + "message": "Marcar como leído en (ms):" + }, + "l_show_expanded_urls": { + "message": "Expandir URLs acortadas:" + }, + "l_reply_all": { + "message": "Resp. a todos los mencion.:" + }, + "l_show_hits_in_popup": { + "message": "Mostrar cont. de llam. al API:" + }, + "l_show_user_autocomplete": { + "message": "Autocomp. nom. de usuario:" + }, + "l_icon_color": { + "message": "Color de Icono:" + }, + "l_tweets_color_only_unified": { + "message": "Colores sólo en unificado:" + }, + "l_tweet_color": { + "message": "Color de Tweet:" + }, + "w_Mentions": { + "message": "Menciones" + }, + "btn_reset_popup_size": { + "message": "Reiniciar tamaño del Popup" + }, + "g_notifications": { + "message": "Notificaciones" + }, + "l_tweet_notification": { + "message": "Notificaciones de Tweets" + }, + "l_change_icon": { + "message": "Cambiar icono" + }, + "l_icon_color": { + "message": "Color de Icono" + }, + "notif_home": { + "message": "Inicio:" + }, + "notif_mentions": { + "message": "Menciones:" + }, + "notif_dms": { + "message": "MDs:" + }, + "notif_lists": { + "message": "Listas:" + }, + "notif_search": { + "message": "Búsqueda:" + }, + "l_tweets_notification_style": { + "message": "Estilo de notificación:" + }, + "l_noti_on_page": { + "message": "Notificar en la página" + }, + "l_noti_desktop": { + "message": "Notificaciones de Escritorio" + }, + "l_notification_fade_timeout": { + "message": "Timeout de Notificaciones (s):" + }, + "l_notification_max_popups": { + "message": "Notificaciones a la vez (-1: todas):" + }, + "g_shortener": { + "message": "Acortador" + }, + "l_url_shortener": { + "message": "Acortador de URLs:" + }, + "l_shortener_acct": { + "message": "¿Usar cuenta personal?" + }, + "l_shortener_login": { + "message": "Login para API:" + }, + "l_shortener_key": { + "message": "Key para el API:" + }, + "l_share_include_title": { + "message": "Incluir título de página (compartir):" + }, + "g_timelines": { + "message": "Líneas de tiempo" + }, + "notice_api_hits": { + "message": "¡Deberías mantener las peticiones al API por debajo de ! Si no, Chromed Bird dejará de funcionar adecuadamente y las líneas de tiempo no se actualizarán más.
Recuerda que si estás usando más de un cliente de Twitter entonces necesitarás mantener el número de peticiones al API todavía más bajo." + }, + "l_hits_notice": { + "message": "Llamadas al API por hora: " + }, + "l_visible": { + "message": "Visible" + }, + "l_refresh_interval": { + "message": "Intervalo de refresco (s)" + }, + "l_include_in_unified": { + "message": "Incluir en la línea de tiempo Unificada" + }, + "l_tabs_count": { + "message": "Contador de pestañas" + }, + "l_unified_timeline": { + "message": "Línea de tiempo Unificada:" + }, + "tml_favorites": { + "message": "Favoritos:" + }, + "l_blocked_users": { + "message": "Usuarios bloqueados:" + }, + "notice_right_click_change": { + "message": "* Hey, ahora puedes usar el menú contextual que aparece con clic-derecho para cambiar la mayoría de estos ajustes directamente desde la ventana emergente. ¡Sal de aquí anda! :)" + }, + "l_tweets_per_page": { + "message": "Tweets por página:" + }, + "l_max_cached_tweets": { + "message": "Máx. número de tweets mostrados:" + }, + "g_microblogging_service": { + "message": "Servicio de Microblogging" + }, + "g_advanced": { + "message": "Avanzado" + }, + "l_request_timeout": { + "message": "Timeout para las peticiones (ms):" + }, + "l_base_url": { + "message": "URL del API de Twitter:" + }, + "l_base_oauth_url": { + "message": "URL de OAuth:" + }, + "l_same_signing_urls": { + "message": "Same signing URLs:" + }, + "l_base_signing_url": { + "message": "API Signing URL:" + }, + "l_base_oauth_signing_url": { + "message": "OAuth Signing URL:" + }, + "l_base_search_url": { + "message": "URL del API de búsquedas:" + }, + "btn_save": { + "message": "Guardar" + }, + "btn_reset": { + "message": "Reiniciar" + }, + "btn_default": { + "message": "Reiniciar a por defecto" + }, + "shortenIt": { + "message": "¡Acortar!" + }, + "shorten_current": { + "message": "Compartir página actual" + } } \ No newline at end of file diff --git a/_locales/nl/messages.json b/_locales/nl/messages.json index 9f4c104a..d2e969ef 100644 --- a/_locales/nl/messages.json +++ b/_locales/nl/messages.json @@ -1,99 +1,99 @@ -{ - "composeTweet": { - "message": "Tweet samenstellen", - "description": "Text for composing new tweet" - }, - "logout": { - "message": "Uitloggen", - "description": "The text for the logout link" - }, - "options": { - "message": "Opties", - "description": "Options link" - }, - "allRead": { - "message": "Alles als gelezen markeren" - }, - "newToken": { - "message": "Een nieuwe token aanvragen" - }, - "shortenerIdleString": { - "message": "Type een URL om het korter te maken of klik rechts hier \u2192" - }, - "timelineHome": { - "message": "Home", - "description": "The home timeline tab" - }, - "timelineDM": { - "message": "DM", - "description": "The direct message timeline tab" - }, - "timelineFavorites": { - "message": "Favorieten", - "description": "The home timeline tab" - }, - "oAuthError": { - "message": "The following error occurred trying to authenticate: $errorMessage$. Please, click here to restart the authentication process", - "placeholders": { - "errorMessage":{ - "content": "$1" - } - } - }, - "justNow": { - "message": "kort geleden" - }, - "minuteAgo": { - "message": "minder dan een minuut geleden" - }, - "minutes": { - "message": "$nr_of_minutes$ $minute_string$ geleden", - "placeholders": { - "nr_of_minutes":{ - "content": "$1" - }, - "minute_string": { - "content": "$2", - "example": "minute or minutes (singular / plural)" - } - } - }, - "minute_singular": { - "message": "minuut" - }, - "minute_plural": { - "message": "minuten" - }, - "timeAgo": { - "message": "ongeveer $time$ $time_string$ geleden", - "placeholders": { - "time": { - "content": "$1" - }, - "time_string": { - "content": "$2" - } - } - }, - "hour_singular": { - "message": "uur" - }, - "hour_plural": { - "message": "uren" - }, - "day_singular": { - "message": "dag" - }, - "day_plural": { - "message": "dagen" - }, - "month_singular": { - "message": "maand" - }, - "month_plural": { - "message": "maanden" - }, - "yearsAgo": { - "message": "jaren geleden" - } +{ + "composeTweet": { + "message": "Tweet samenstellen", + "description": "Text for composing new tweet" + }, + "logout": { + "message": "Uitloggen", + "description": "The text for the logout link" + }, + "options": { + "message": "Opties", + "description": "Options link" + }, + "allRead": { + "message": "Alles als gelezen markeren" + }, + "newToken": { + "message": "Een nieuwe token aanvragen" + }, + "shortenerIdleString": { + "message": "Type een URL om het korter te maken of klik rechts hier \u2192" + }, + "timelineHome": { + "message": "Home", + "description": "The home timeline tab" + }, + "timelineDM": { + "message": "DM", + "description": "The direct message timeline tab" + }, + "timelineFavorites": { + "message": "Favorieten", + "description": "The home timeline tab" + }, + "oAuthError": { + "message": "The following error occurred trying to authenticate: $errorMessage$. Please, click here to restart the authentication process", + "placeholders": { + "errorMessage":{ + "content": "$1" + } + } + }, + "justNow": { + "message": "kort geleden" + }, + "minuteAgo": { + "message": "minder dan een minuut geleden" + }, + "minutes": { + "message": "$nr_of_minutes$ $minute_string$ geleden", + "placeholders": { + "nr_of_minutes":{ + "content": "$1" + }, + "minute_string": { + "content": "$2", + "example": "minute or minutes (singular / plural)" + } + } + }, + "minute_singular": { + "message": "minuut" + }, + "minute_plural": { + "message": "minuten" + }, + "timeAgo": { + "message": "ongeveer $time$ $time_string$ geleden", + "placeholders": { + "time": { + "content": "$1" + }, + "time_string": { + "content": "$2" + } + } + }, + "hour_singular": { + "message": "uur" + }, + "hour_plural": { + "message": "uren" + }, + "day_singular": { + "message": "dag" + }, + "day_plural": { + "message": "dagen" + }, + "month_singular": { + "message": "maand" + }, + "month_plural": { + "message": "maanden" + }, + "yearsAgo": { + "message": "jaren geleden" + } } \ No newline at end of file diff --git a/_locales/pt_BR/messages.json b/_locales/pt_BR/messages.json index 195bb7a9..eea1333c 100644 --- a/_locales/pt_BR/messages.json +++ b/_locales/pt_BR/messages.json @@ -1,618 +1,618 @@ -{ - "extDescription": { - "message": "Chromed Bird é uma extensão que integra o Chrome ao Twitter e permite que você acompanhe seus amigos e interaja com o seu Twitter.", - "description": "Descrição da extensão" - }, - "resetSize": { - "message": "Duplo clique para resetar o tamanho" - }, - "composeTweet": { - "message": "Criar tweet" - }, - "tweetit": { - "message": "Twittar!" - }, - "logout": { - "message": "Deslogar" - }, - "options": { - "message": "Opções" - }, - "refresh": { - "message": "Atualizar" - }, - "suspend": { - "message": "Suspender" - }, - "autoUpdatesSuspended": { - "message": "Atualizações automáticas suspensas" - }, - "resume": { - "message": "Continuar" - }, - "remove": { - "message": "Remover" - }, - "hide": { - "message": "Esconder" - }, - "show": { - "message": "Mostrar" - }, - "add": { - "message": "Adicionar" - }, - "selectList": { - "message": "- Selecione uma lista -" - }, - "updateList": { - "message": "Atualizar listas..." - }, - "w_Unified": { - "message": "Unificada" - }, - "w_Home": { - "message": "Home" - }, - "w_DM": { - "message": "DMs" - }, - "w_Favorites": { - "message": "Favoritos" - }, - "w_Lists": { - "message": "Listas" - }, - "w_Search": { - "message": "Busca" - }, - "fromApp": { - "message": "de" - }, - "inReply": { - "message": "em resposta para" - }, - "retweetedBy": { - "message": "retwittado por" - }, - "retweetedByMe": { - "message": "retwittado por mim" - }, - "unmarkFavorite": { - "message": "Desmarcar como favorito" - }, - "markFavorite": { - "message": "Marcar como favorito" - }, - "Delete": { - "message": "Deletar" - }, - "deleteConfirm": { - "message": "Deletar essa menssagem: " - }, - "Yes": { - "message": "Sim" - }, - "No": { - "message": "Não" - }, - "Reply": { - "message": "Resposta" - }, - "Retweet": { - "message": "Retweet" - }, - "retweetConfirm": { - "message": "Retwittar essa menssagem: " - }, - "oldRT": { - "message": "Compartilhar (antigo RT)" - }, - "markAllRead": { - "message": "Marcar todas como lidas" - }, - "newToken": { - "message": "Solicitar outro token" - }, - "shortenerIdleString": { - "message": "Digite uma URL para encurtá-la, ou clique aqui \u2192" - }, - "timelineHome": { - "message": "Home", - "description": "The home time line tab" - }, - "timelineDM": { - "message": "DM", - "description": "The direct message time line tab" - }, - "timelineFavorites": { - "message": "Favoritos", - "description": "The home time line tab" - }, - "tweet_singular": { - "message": "tweet" - }, - "tweet_plural": { - "message": "tweets" - }, - "newTweetsAvailable": { - "message": "$count$ $tweets$ disponíveis. Atualizar agora.", - "placeholders": { - "count": { - "content": "$1" - }, - "tweets": { - "content": "$2" - } - } - }, - "preventClosing": { - "message": "Clique para impedir o fechamento." - }, - "changeNotificationSettings": { - "message": "Você pode mudar as configurações de notificação na página de opções" - }, - "loadingMap": { - "message": "Carregando mapa..." - }, - "loadingImage": { - "message": "Carregando imagem..." - }, - "loadingLongUrl": { - "message": "Carregando url real..." - }, - "errorExpandingUrl": { - "message": "Desculpe, aconteceu algo ruim, por favor tente novamente." - }, - "ajaxFailed": { - "message": "Requisição AJAX falhou (conexão ruim?)" - }, - "successAuth": { - "message": "Parabés, você foi autenticado com sucesso. Aproveite o Chromed Bird!" - }, - "cbAuthorized": { - "message": "Chromed Bird autorizado!" - }, - "cbNotAuthorized": { - "message": "Ops... Tem algo errado. Por favor, tente clicar no ícone do Chromed Bird novamente." - }, - "authorizing": { - "message": "Por favor aguarde, autorizando o Chromed Bird..." - }, - "yourPIN": { - "message": "Seu PIN é: $pin$", - "placeholders": { - "pin":{ - "content": "$1" - } - } - }, - "tryAgain": { - "message": "Tentar novamente" - }, - "canceling": { - "message": "Cancelando..." - }, - "cancelTweet": { - "message": "Cancelar Tweet" - }, - "queued_messages": { - "message": "Menssagens enfileiradas:" - }, - "queue_trying": { - "message": "tentando enviar por $timediff$", - "placeholders": { - "timediff": { - "content": "$1" - } - } - }, - "queue_retried": { - "message": "tentadas $retries$ vezes desde $timediff$ atrás [$laststatus$]", - "placeholders": { - "retries": { - "content": "$1" - }, - "timediff": { - "content": "$2" - }, - "laststatus": { - "content": "$3" - } - } - }, - "ue_fetchingLists": { - "message": "Erro inesperado $status$ carregando listas.", - "placeholders": { - "status": { - "content": "$1" - } - } - }, - "ue_updatingTweets": { - "message": "Erro inesperado $baseError$ atualizando tweets.", - "placeholders": { - "baseError": { - "content": "$1" - } - } - }, - "ue_updatingTweets2": { - "message": " Se esse erro de timeout está sendo mostrado repetidamente, por favor, tente deslogar e logar novamente." - }, - "ue_deletingTweet": { - "message": "Erro inesperado $status$ deletando tweet.", - "placeholders": { - "status": { - "content": "$1" - } - } - }, - "ue_retweeting": { - "message": "Erro inesperado $status$ retwittando.", - "placeholders": { - "status": { - "content": "$1" - } - } - }, - "ue_markFavorite": { - "message": "Erro inesperado$status$ marcando como favorito.", - "placeholders": { - "status": { - "content": "$1" - } - } - }, - "ue_unmarkFavorite": { - "message": "Erro inesperado $status$ desmarcando como favorito.", - "placeholders": { - "status": { - "content": "$1" - } - } - }, - "newTweets": { - "message": "$count$ $newtweets$", - "placeholders": { - "count": { - "content": "$1" - }, - "newtweets": { - "content": "$2" - } - } - }, - "newtweets_singular": { - "message": "novo tweet" - }, - "newtweets_plural": { - "message": "novos tweets" - }, - "btnAuthorize": { - "message": "Autorizar!" - }, - "exceededAPIHits": { - "message": "Você excedeu o limite de chamadas à API do Twitter. Por favor reveja as suas configurações de intervalo de atualização na página de opções. O Chromed Bird não irá atualizar até $nextResetDate $nextResetTime$.", - "placeholders": { - "options_url": { - "content": "$1" - }, - "nextResetDate": { - "content": "$2" - }, - "nextResetTime": { - "content": "$3" - } - } - }, - "warningAPIHits": { - "message": "Ei! A quantidade de chamdas à API restantes está diminuindo muito rápido.
Por favor reveja as suas configurações de intervalo de atualização na página de opções. Tome um cuidado especial caso você esteja utilizando multiplos clientes para o Twitter, eles todos irão compartilhar o mesmo limite.
Chamadas restantes disponíveis: $remainingHits$ - Próximo reset: $nextResetDate$ $nextResetTime$", - "placeholders": { - "options_url": { - "content": "$1" - }, - "remainingHits": { - "content": "$2" - }, - "nextResetDate": { - "content": "$3" - }, - "nextResetTime": { - "content": "$4" - } - } - }, - "oAuthError": { - "message": "O seguinte erro ocorreu tentando autenticar: $errorMessage$. Por favor, clique aqui para reiniciar o processo de autenticação", - "placeholders": { - "errorMessage": { - "content": "$1" - } - } - }, - "justNow": { - "message": "agorinha" - }, - "minuteAgo": { - "message": "menos de 1 minuto atrás" - }, - "minutes": { - "message": "$nr_of_minutes$ $minutes$ atrás", - "placeholders": { - "nr_of_minutes":{ - "content": "$1" - }, - "minutes": { - "content": "$2", - "example": "minute or minutes (singular / plural)" - } - } - }, - "minute_singular": { - "message": "minuto" - }, - "minute_plural": { - "message": "minutos" - }, - "timeAgo": { - "message": "aproximadamente $time$ $time_string$ atrás", - "placeholders": { - "time": { - "content": "$1" - }, - "time_string": { - "content": "$2" - } - } - }, - "hour_singular": { - "message": "hora" - }, - "hour_plural": { - "message": "horas" - }, - "day_singular": { - "message": "dia" - }, - "day_plural": { - "message": "dias" - }, - "month_singular": { - "message": "mês" - }, - "month_plural": { - "message": "meses" - }, - "yearsAgo": { - "message": "anos atrás" - }, - "options_title": { - "message": "Opções do Chromed Bird" - }, - "conf_saved": { - "message": "A configuração foi salva com sucesso!" - }, - "changes_restart": { - "message": "No entanto, algumas das alterações exigem o reinicio da extensão. Você gostaria de fazer isso agora?
(Isso irá resetar as mensagens não lidas.)" - }, - "remaining_api_hits": { - "message": "Chamadas à API do Twitter restantes: " - }, - "rate_limit_reset": { - "message": "Reinício do limite: " - }, - "nerds_link": { - "message": "Estatísticas de chamadas (para nerds)" - }, - "g_ui": { - "message": "Interface do Usuário" - }, - "l_name_attribute": { - "message": "Nome nos tweets:" - }, - "o_screen_name": { - "message": "Nome do usuário (apelido)" - }, - "o_name": { - "message": "Nome real" - }, - "o_both": { - "message": "Ambos os nomes" - }, - "l_compose_position": { - "message": "Posição da área de escrita:" - }, - "o_top": { - "message": "Em cima" - }, - "o_bottom": { - "message": "Em baixo" - }, - "l_theme": { - "message": "Tema:" - }, - "l_font_size": { - "message": "Tamanho da Fonte:" - }, - "o_small": { - "message": "Pequena" - }, - "o_normal": { - "message": "Normal" - }, - "o_large": { - "message": "Grande" - }, - "o_extra_large": { - "message": "Muito Grande" - }, - "l_font_family": { - "message": "Família da Fonte:" - }, - "l_hover_timeout": { - "message": "Marcar como lido em (ms):" - }, - "l_show_expanded_urls": { - "message": "Expandir URLs encurtadas:" - }, - "l_reply_all": { - "message": "Responder a todos:" - }, - "l_show_hits_in_popup": { - "message": "Mostrar contador de chamadas:" - }, - "l_show_user_autocomplete": { - "message": "Autocompletar nomes:" - }, - "l_icon_color": { - "message": "Cor do ícone:" - }, - "l_tweets_color_only_unified": { - "message": "Cores somente na unificada:" - }, - "l_tweet_color": { - "message": "Cor da mensagem:" - }, - "w_Mentions": { - "message": "Referências" - }, - "btn_reset_popup_size": { - "message": "Resetar tamanho do Popup" - }, - "g_notifications": { - "message": "Notificações" - }, - "l_tweet_notification": { - "message": "Notificação do Tweet" - }, - "l_change_icon": { - "message": "Mudar Ícone" - }, - "l_icon_color": { - "message": "Cor do Ícone" - }, - "notif_home": { - "message": "Home:" - }, - "notif_mentions": { - "message": "Referências:" - }, - "notif_dms": { - "message": "DMs:" - }, - "notif_lists": { - "message": "Listas:" - }, - "notif_search": { - "message": "Buscas:" - }, - "l_tweets_notification_style": { - "message": "Tipo de Notificação:" - }, - "l_noti_on_page": { - "message": "Notificações na Página" - }, - "l_noti_desktop": { - "message": "Notificações no Desktop" - }, - "l_notification_fade_timeout": { - "message": "Duração das notificações (s):" - }, - "l_notification_max_popups": { - "message": "Notificações ao mesmo tempo (-1: todas):" - }, - "g_shortener": { - "message": "Encurtador" - }, - "l_url_shortener": { - "message": "Encurtador de URL:" - }, - "l_shortener_acct": { - "message": "Usar Conta Pessoal?" - }, - "l_shortener_login": { - "message": "API Login:" - }, - "l_shortener_key": { - "message": "API Key:" - }, - "l_share_include_title": { - "message": "Incluir título da página (compartilhando):" - }, - "g_timelines": { - "message": "Timelines" - }, - "notice_api_hits": { - "message": "Você deverá deixar o número de chamadas ao Twitter abaixo de ! Caso contrário o Chromed Bird irá parar de funcionar corretamente e as timelines não irão mais atualizar.
Lembre-se de que se você está utilizando múltiplos clientes para o Twitter você deverá deixar o número de chamadas ainda menor." - }, - "l_hits_notice": { - "message": "Chamadas ao Twitter por hora: " - }, - "l_visible": { - "message": "Visível" - }, - "l_refresh_interval": { - "message": "Intervalo de atualização (s)" - }, - "l_include_in_unified": { - "message": "Incluir na timeline unificada" - }, - "l_tabs_count": { - "message": "Quantidade de tabs" - }, - "l_unified_timeline": { - "message": "Timeline Unificada:" - }, - "tml_favorites": { - "message": "Favoritos:" - }, - "l_blocked_users": { - "message": "Usuários Bloqueados:" - }, - "notice_right_click_change": { - "message": "* Ei, agora você pode usar um clique com o botão direito para acessar o menu de contexto e mudar essas configurações diretamente no popup. Sai logo daqui! :)" - }, - "l_tweets_per_page": { - "message": "Tweets por Página:" - }, - "l_max_cached_tweets": { - "message": "Maxímo de Tweets Exibidos:" - }, - "g_microblogging_service": { - "message": "Serviço de Microblogging" - }, - "g_advanced": { - "message": "Avançado" - }, - "l_request_timeout": { - "message": "Tempo máximo para chamadas (ms):" - }, - "l_base_url": { - "message": "URL da API do Twitter:" - }, - "l_base_oauth_url": { - "message": "URL para OAuth:" - }, - "l_same_signing_urls": { - "message": "Mesmas URLs para assinatura:" - }, - "l_base_signing_url": { - "message": "URL de assinatura para API:" - }, - "l_base_oauth_signing_url": { - "message": "URL de assinatura para OAuth:" - }, - "l_base_search_url": { - "message": "URL da Search API:" - }, - "btn_save": { - "message": "Salvar" - }, - "btn_reset": { - "message": "Resetar" - }, - "btn_default": { - "message": "Resetar para valores default" - } +{ + "extDescription": { + "message": "Chromed Bird é uma extensão que integra o Chrome ao Twitter e permite que você acompanhe seus amigos e interaja com o seu Twitter.", + "description": "Descrição da extensão" + }, + "resetSize": { + "message": "Duplo clique para resetar o tamanho" + }, + "composeTweet": { + "message": "Criar tweet" + }, + "tweetit": { + "message": "Twittar!" + }, + "logout": { + "message": "Deslogar" + }, + "options": { + "message": "Opções" + }, + "refresh": { + "message": "Atualizar" + }, + "suspend": { + "message": "Suspender" + }, + "autoUpdatesSuspended": { + "message": "Atualizações automáticas suspensas" + }, + "resume": { + "message": "Continuar" + }, + "remove": { + "message": "Remover" + }, + "hide": { + "message": "Esconder" + }, + "show": { + "message": "Mostrar" + }, + "add": { + "message": "Adicionar" + }, + "selectList": { + "message": "- Selecione uma lista -" + }, + "updateList": { + "message": "Atualizar listas..." + }, + "w_Unified": { + "message": "Unificada" + }, + "w_Home": { + "message": "Home" + }, + "w_DM": { + "message": "DMs" + }, + "w_Favorites": { + "message": "Favoritos" + }, + "w_Lists": { + "message": "Listas" + }, + "w_Search": { + "message": "Busca" + }, + "fromApp": { + "message": "de" + }, + "inReply": { + "message": "em resposta para" + }, + "retweetedBy": { + "message": "retwittado por" + }, + "retweetedByMe": { + "message": "retwittado por mim" + }, + "unmarkFavorite": { + "message": "Desmarcar como favorito" + }, + "markFavorite": { + "message": "Marcar como favorito" + }, + "Delete": { + "message": "Deletar" + }, + "deleteConfirm": { + "message": "Deletar essa menssagem: " + }, + "Yes": { + "message": "Sim" + }, + "No": { + "message": "Não" + }, + "Reply": { + "message": "Resposta" + }, + "Retweet": { + "message": "Retweet" + }, + "retweetConfirm": { + "message": "Retwittar essa menssagem: " + }, + "oldRT": { + "message": "Compartilhar (antigo RT)" + }, + "markAllRead": { + "message": "Marcar todas como lidas" + }, + "newToken": { + "message": "Solicitar outro token" + }, + "shortenerIdleString": { + "message": "Digite uma URL para encurtá-la, ou clique aqui \u2192" + }, + "timelineHome": { + "message": "Home", + "description": "The home time line tab" + }, + "timelineDM": { + "message": "DM", + "description": "The direct message time line tab" + }, + "timelineFavorites": { + "message": "Favoritos", + "description": "The home time line tab" + }, + "tweet_singular": { + "message": "tweet" + }, + "tweet_plural": { + "message": "tweets" + }, + "newTweetsAvailable": { + "message": "$count$ $tweets$ disponíveis. Atualizar agora.", + "placeholders": { + "count": { + "content": "$1" + }, + "tweets": { + "content": "$2" + } + } + }, + "preventClosing": { + "message": "Clique para impedir o fechamento." + }, + "changeNotificationSettings": { + "message": "Você pode mudar as configurações de notificação na página de opções" + }, + "loadingMap": { + "message": "Carregando mapa..." + }, + "loadingImage": { + "message": "Carregando imagem..." + }, + "loadingLongUrl": { + "message": "Carregando url real..." + }, + "errorExpandingUrl": { + "message": "Desculpe, aconteceu algo ruim, por favor tente novamente." + }, + "ajaxFailed": { + "message": "Requisição AJAX falhou (conexão ruim?)" + }, + "successAuth": { + "message": "Parabés, você foi autenticado com sucesso. Aproveite o Chromed Bird!" + }, + "cbAuthorized": { + "message": "Chromed Bird autorizado!" + }, + "cbNotAuthorized": { + "message": "Ops... Tem algo errado. Por favor, tente clicar no ícone do Chromed Bird novamente." + }, + "authorizing": { + "message": "Por favor aguarde, autorizando o Chromed Bird..." + }, + "yourPIN": { + "message": "Seu PIN é: $pin$", + "placeholders": { + "pin":{ + "content": "$1" + } + } + }, + "tryAgain": { + "message": "Tentar novamente" + }, + "canceling": { + "message": "Cancelando..." + }, + "cancelTweet": { + "message": "Cancelar Tweet" + }, + "queued_messages": { + "message": "Menssagens enfileiradas:" + }, + "queue_trying": { + "message": "tentando enviar por $timediff$", + "placeholders": { + "timediff": { + "content": "$1" + } + } + }, + "queue_retried": { + "message": "tentadas $retries$ vezes desde $timediff$ atrás [$laststatus$]", + "placeholders": { + "retries": { + "content": "$1" + }, + "timediff": { + "content": "$2" + }, + "laststatus": { + "content": "$3" + } + } + }, + "ue_fetchingLists": { + "message": "Erro inesperado $status$ carregando listas.", + "placeholders": { + "status": { + "content": "$1" + } + } + }, + "ue_updatingTweets": { + "message": "Erro inesperado $baseError$ atualizando tweets.", + "placeholders": { + "baseError": { + "content": "$1" + } + } + }, + "ue_updatingTweets2": { + "message": " Se esse erro de timeout está sendo mostrado repetidamente, por favor, tente deslogar e logar novamente." + }, + "ue_deletingTweet": { + "message": "Erro inesperado $status$ deletando tweet.", + "placeholders": { + "status": { + "content": "$1" + } + } + }, + "ue_retweeting": { + "message": "Erro inesperado $status$ retwittando.", + "placeholders": { + "status": { + "content": "$1" + } + } + }, + "ue_markFavorite": { + "message": "Erro inesperado$status$ marcando como favorito.", + "placeholders": { + "status": { + "content": "$1" + } + } + }, + "ue_unmarkFavorite": { + "message": "Erro inesperado $status$ desmarcando como favorito.", + "placeholders": { + "status": { + "content": "$1" + } + } + }, + "newTweets": { + "message": "$count$ $newtweets$", + "placeholders": { + "count": { + "content": "$1" + }, + "newtweets": { + "content": "$2" + } + } + }, + "newtweets_singular": { + "message": "novo tweet" + }, + "newtweets_plural": { + "message": "novos tweets" + }, + "btnAuthorize": { + "message": "Autorizar!" + }, + "exceededAPIHits": { + "message": "Você excedeu o limite de chamadas à API do Twitter. Por favor reveja as suas configurações de intervalo de atualização na página de opções. O Chromed Bird não irá atualizar até $nextResetDate $nextResetTime$.", + "placeholders": { + "options_url": { + "content": "$1" + }, + "nextResetDate": { + "content": "$2" + }, + "nextResetTime": { + "content": "$3" + } + } + }, + "warningAPIHits": { + "message": "Ei! A quantidade de chamdas à API restantes está diminuindo muito rápido.
Por favor reveja as suas configurações de intervalo de atualização na página de opções. Tome um cuidado especial caso você esteja utilizando multiplos clientes para o Twitter, eles todos irão compartilhar o mesmo limite.
Chamadas restantes disponíveis: $remainingHits$ - Próximo reset: $nextResetDate$ $nextResetTime$", + "placeholders": { + "options_url": { + "content": "$1" + }, + "remainingHits": { + "content": "$2" + }, + "nextResetDate": { + "content": "$3" + }, + "nextResetTime": { + "content": "$4" + } + } + }, + "oAuthError": { + "message": "O seguinte erro ocorreu tentando autenticar: $errorMessage$. Por favor, clique aqui para reiniciar o processo de autenticação", + "placeholders": { + "errorMessage": { + "content": "$1" + } + } + }, + "justNow": { + "message": "agorinha" + }, + "minuteAgo": { + "message": "menos de 1 minuto atrás" + }, + "minutes": { + "message": "$nr_of_minutes$ $minutes$ atrás", + "placeholders": { + "nr_of_minutes":{ + "content": "$1" + }, + "minutes": { + "content": "$2", + "example": "minute or minutes (singular / plural)" + } + } + }, + "minute_singular": { + "message": "minuto" + }, + "minute_plural": { + "message": "minutos" + }, + "timeAgo": { + "message": "aproximadamente $time$ $time_string$ atrás", + "placeholders": { + "time": { + "content": "$1" + }, + "time_string": { + "content": "$2" + } + } + }, + "hour_singular": { + "message": "hora" + }, + "hour_plural": { + "message": "horas" + }, + "day_singular": { + "message": "dia" + }, + "day_plural": { + "message": "dias" + }, + "month_singular": { + "message": "mês" + }, + "month_plural": { + "message": "meses" + }, + "yearsAgo": { + "message": "anos atrás" + }, + "options_title": { + "message": "Opções do Chromed Bird" + }, + "conf_saved": { + "message": "A configuração foi salva com sucesso!" + }, + "changes_restart": { + "message": "No entanto, algumas das alterações exigem o reinicio da extensão. Você gostaria de fazer isso agora?
(Isso irá resetar as mensagens não lidas.)" + }, + "remaining_api_hits": { + "message": "Chamadas à API do Twitter restantes: " + }, + "rate_limit_reset": { + "message": "Reinício do limite: " + }, + "nerds_link": { + "message": "Estatísticas de chamadas (para nerds)" + }, + "g_ui": { + "message": "Interface do Usuário" + }, + "l_name_attribute": { + "message": "Nome nos tweets:" + }, + "o_screen_name": { + "message": "Nome do usuário (apelido)" + }, + "o_name": { + "message": "Nome real" + }, + "o_both": { + "message": "Ambos os nomes" + }, + "l_compose_position": { + "message": "Posição da área de escrita:" + }, + "o_top": { + "message": "Em cima" + }, + "o_bottom": { + "message": "Em baixo" + }, + "l_theme": { + "message": "Tema:" + }, + "l_font_size": { + "message": "Tamanho da Fonte:" + }, + "o_small": { + "message": "Pequena" + }, + "o_normal": { + "message": "Normal" + }, + "o_large": { + "message": "Grande" + }, + "o_extra_large": { + "message": "Muito Grande" + }, + "l_font_family": { + "message": "Família da Fonte:" + }, + "l_hover_timeout": { + "message": "Marcar como lido em (ms):" + }, + "l_show_expanded_urls": { + "message": "Expandir URLs encurtadas:" + }, + "l_reply_all": { + "message": "Responder a todos:" + }, + "l_show_hits_in_popup": { + "message": "Mostrar contador de chamadas:" + }, + "l_show_user_autocomplete": { + "message": "Autocompletar nomes:" + }, + "l_icon_color": { + "message": "Cor do ícone:" + }, + "l_tweets_color_only_unified": { + "message": "Cores somente na unificada:" + }, + "l_tweet_color": { + "message": "Cor da mensagem:" + }, + "w_Mentions": { + "message": "Referências" + }, + "btn_reset_popup_size": { + "message": "Resetar tamanho do Popup" + }, + "g_notifications": { + "message": "Notificações" + }, + "l_tweet_notification": { + "message": "Notificação do Tweet" + }, + "l_change_icon": { + "message": "Mudar Ícone" + }, + "l_icon_color": { + "message": "Cor do Ícone" + }, + "notif_home": { + "message": "Home:" + }, + "notif_mentions": { + "message": "Referências:" + }, + "notif_dms": { + "message": "DMs:" + }, + "notif_lists": { + "message": "Listas:" + }, + "notif_search": { + "message": "Buscas:" + }, + "l_tweets_notification_style": { + "message": "Tipo de Notificação:" + }, + "l_noti_on_page": { + "message": "Notificações na Página" + }, + "l_noti_desktop": { + "message": "Notificações no Desktop" + }, + "l_notification_fade_timeout": { + "message": "Duração das notificações (s):" + }, + "l_notification_max_popups": { + "message": "Notificações ao mesmo tempo (-1: todas):" + }, + "g_shortener": { + "message": "Encurtador" + }, + "l_url_shortener": { + "message": "Encurtador de URL:" + }, + "l_shortener_acct": { + "message": "Usar Conta Pessoal?" + }, + "l_shortener_login": { + "message": "API Login:" + }, + "l_shortener_key": { + "message": "API Key:" + }, + "l_share_include_title": { + "message": "Incluir título da página (compartilhando):" + }, + "g_timelines": { + "message": "Timelines" + }, + "notice_api_hits": { + "message": "Você deverá deixar o número de chamadas ao Twitter abaixo de ! Caso contrário o Chromed Bird irá parar de funcionar corretamente e as timelines não irão mais atualizar.
Lembre-se de que se você está utilizando múltiplos clientes para o Twitter você deverá deixar o número de chamadas ainda menor." + }, + "l_hits_notice": { + "message": "Chamadas ao Twitter por hora: " + }, + "l_visible": { + "message": "Visível" + }, + "l_refresh_interval": { + "message": "Intervalo de atualização (s)" + }, + "l_include_in_unified": { + "message": "Incluir na timeline unificada" + }, + "l_tabs_count": { + "message": "Quantidade de tabs" + }, + "l_unified_timeline": { + "message": "Timeline Unificada:" + }, + "tml_favorites": { + "message": "Favoritos:" + }, + "l_blocked_users": { + "message": "Usuários Bloqueados:" + }, + "notice_right_click_change": { + "message": "* Ei, agora você pode usar um clique com o botão direito para acessar o menu de contexto e mudar essas configurações diretamente no popup. Sai logo daqui! :)" + }, + "l_tweets_per_page": { + "message": "Tweets por Página:" + }, + "l_max_cached_tweets": { + "message": "Maxímo de Tweets Exibidos:" + }, + "g_microblogging_service": { + "message": "Serviço de Microblogging" + }, + "g_advanced": { + "message": "Avançado" + }, + "l_request_timeout": { + "message": "Tempo máximo para chamadas (ms):" + }, + "l_base_url": { + "message": "URL da API do Twitter:" + }, + "l_base_oauth_url": { + "message": "URL para OAuth:" + }, + "l_same_signing_urls": { + "message": "Mesmas URLs para assinatura:" + }, + "l_base_signing_url": { + "message": "URL de assinatura para API:" + }, + "l_base_oauth_signing_url": { + "message": "URL de assinatura para OAuth:" + }, + "l_base_search_url": { + "message": "URL da Search API:" + }, + "btn_save": { + "message": "Salvar" + }, + "btn_reset": { + "message": "Resetar" + }, + "btn_default": { + "message": "Resetar para valores default" + } } \ No newline at end of file diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json index 4382e87d..42e13eee 100644 --- a/_locales/ru/messages.json +++ b/_locales/ru/messages.json @@ -1,627 +1,627 @@ -{ - "extDescription": { - "message": "Chromed Bird это Twitter расширение, которое позволяет читать ленту и взаимодействовать с вашим twitter аккаунтом.", - "description": "Extension description" - }, - "resetSize": { - "message": "Двойной клик для сброса размера" - }, - "composeTweet": { - "message": "Написать Твит", - "description": "Text for composing new tweet" - }, - "tweetit": { - "message": "Затвитить!" - }, - "logout": { - "message": "Выход", - "description": "The text for the logout link" - }, - "options": { - "message": "Настройки", - "description": "Options link" - }, - "refresh": { - "message": "Обновить", - "description": "Refresh link" - }, - "suspend": { - "message": "Приостановить", - "description": "Suspend link" - }, - "autoUpdatesSuspended": { - "message": "Автоматическое обновление приостановлено" - }, - "resume": { - "message": "Продолжить" - }, - "remove": { - "message": "Удалить " - }, - "hide": { - "message": "Скрыть " - }, - "show": { - "message": "Показать " - }, - "add": { - "message": "Добавить" - }, - "selectList": { - "message": "- списки -" - }, - "updateList": { - "message": "Обновляю списки..." - }, - "w_Unified": { - "message": "Общая" - }, - "w_Home": { - "message": "Home" - }, - "w_DM": { - "message": "DMs" - }, - "w_Favorites": { - "message": "Избранные" - }, - "w_Lists": { - "message": "Списки" - }, - "w_Search": { - "message": "Поиск" - }, - "fromApp": { - "message": "через" - }, - "inReply": { - "message": "в ответ на" - }, - "retweetedBy": { - "message": "ретвит от" - }, - "retweetedByMe": { - "message": "мой ретвит" - }, - "unmarkFavorite": { - "message": "Убрать из избранного" - }, - "markFavorite": { - "message": "Пометить как избранное" - }, - "Delete": { - "message": "Удалить" - }, - "deleteConfirm": { - "message": "Удалить это сообщение: " - }, - "Yes": { - "message": "Да" - }, - "No": { - "message": "Нет" - }, - "Reply": { - "message": "Ответить" - }, - "Retweet": { - "message": "Ретвит" - }, - "retweetConfirm": { - "message": "Ретвит этого сообщения: " - }, - "oldRT": { - "message": "Поделиться (старый RT)" - }, - "markAllRead": { - "message": "Пометить все как прочитанное" - }, - "newToken": { - "message": "Запросить другой ключ" - }, - "shortenerIdleString": { - "message": "Наберите ссылку для сокращения, или нажмите сюда \u2192" - }, - "timelineHome": { - "message": "Home", - "description": "The home time line tab" - }, - "timelineDM": { - "message": "DM", - "description": "The direct message time line tab" - }, - "timelineFavorites": { - "message": "Избранное", - "description": "The home time line tab" - }, - "tweet_singular": { - "message": "твит" - }, - "tweet_plural": { - "message": "твиты" - }, - "newTweetsAvailable": { - "message": " Новых твитов: $count$. Обновить сейчас.", - "placeholders": { - "count": { - "content": "$1" - }, - "tweets": { - "content": "$2" - } - } - }, - "preventClosing": { - "message": "Нажмите правой для предотвращения закрытия." - }, - "changeNotificationSettings": { - "message": "Вы можете изменить настройки оповещений на странице настроек" - }, - "loadingMap": { - "message": "Загрузка карты..." - }, - "loadingImage": { - "message": "Загрузка изображения..." - }, - "loadingLongUrl": { - "message": "Загрузка длинной ссылки..." - }, - "errorExpandingUrl": { - "message": "Извините, что-то пошло не так, попробуйте еще раз." - }, - "ajaxFailed": { - "message": "Сбой запрос AJAX (плохое содинение?)" - }, - "successAuth": { - "message": "Поздравляем, вы успешно вошли в систему. Наслаждайтесь Chromed Bird!" - }, - "cbAuthorized": { - "message": "Chromed Bird авторизован!" - }, - "cbNotAuthorized": { - "message": "Упс... Что-то пошло не так. Попробуйте нажать на иконку Chromed Bird снова." - }, - "authorizing": { - "message": "Пожалуйста, подождите, авторизуем Chromed Bird..." - }, - "yourPIN": { - "message": "Ваш PIN: $pin$", - "placeholders": { - "pin":{ - "content": "$1" - } - } - }, - "tryAgain": { - "message": "Попробовать снова" - }, - "canceling": { - "message": "Отмена..." - }, - "cancelTweet": { - "message": "Отменить твит" - }, - "queued_messages": { - "message": "Сообщения в очереди:" - }, - "queue_trying": { - "message": "пытаюсь отправить уже $timediff$", - "placeholders": { - "timediff": { - "content": "$1" - } - } - }, - "queue_retried": { - "message": "$retries$ повторов за $timediff$ [$laststatus$]", - "placeholders": { - "retries": { - "content": "$1" - }, - "timediff": { - "content": "$2" - }, - "laststatus": { - "content": "$3" - } - } - }, - "ue_fetchingLists": { - "message": "Неожиданная ошибка $status$ при получении списка.", - "placeholders": { - "status": { - "content": "$1" - } - } - }, - "ue_updatingTweets": { - "message": "Неожиданная ошибка $baseError$ при обновлении твита.", - "placeholders": { - "baseError": { - "content": "$1" - } - } - }, - "ue_updatingTweets2": { - "message": " Если эта ошибка повторяется, попробуйте выйыти и зайти снова." - }, - "ue_deletingTweet": { - "message": "Неожиданная ошибка $status$ удаления твита.", - "placeholders": { - "status": { - "content": "$1" - } - } - }, - "ue_retweeting": { - "message": "Неожиданная ошибка $status$ ретвита.", - "placeholders": { - "status": { - "content": "$1" - } - } - }, - "ue_markFavorite": { - "message": "Неожиданная ошибка $status$ при добавлении в избранное.", - "placeholders": { - "status": { - "content": "$1" - } - } - }, - "ue_unmarkFavorite": { - "message": "Неожиданная ошибка $status$ при удалении из избранное.", - "placeholders": { - "status": { - "content": "$1" - } - } - }, - "newTweets": { - "message": "$newtweets$: $count$", - "placeholders": { - "count": { - "content": "$1" - }, - "newtweets": { - "content": "$2" - } - } - }, - "newtweets_singular": { - "message": "Новых твитов" - }, - "newtweets_plural": { - "message": "Новых твитов" - }, - "btnAuthorize": { - "message": "Авторизуйся!" - }, - "exceededAPIHits": { - "message": "Вы превысили лимит API. Пожалуйста, пересмотрите настройки интервалов обновления в настройках. Chromed Bird не будет обновлять до $nextResetDate $nextResetTime$.", - "placeholders": { - "options_url": { - "content": "$1" - }, - "nextResetDate": { - "content": "$2" - }, - "nextResetTime": { - "content": "$3" - } - } - }, - "warningAPIHits": { - "message": "Эй! Лимит обращений к API наступает слишком быстро.
Пожалуйста, пересмотрите настройки интервалов обновления в настройках. Обратите внимание, что если вы используете несколько Twitter клиентов они имеют общий лимит.
Осталось обращений: $remainingHits$ - Следующий сброс: $nextResetDate$ $nextResetTime$", - "placeholders": { - "options_url": { - "content": "$1" - }, - "remainingHits": { - "content": "$2" - }, - "nextResetDate": { - "content": "$3" - }, - "nextResetTime": { - "content": "$4" - } - } - }, - "oAuthError": { - "message": "Во время проверки подлинности возникла ошибка: $errorMessage$. Пожалуйста, нажмите чтобы повторить процесс", - "placeholders": { - "errorMessage": { - "content": "$1" - } - } - }, - "justNow": { - "message": "только что" - }, - "minuteAgo": { - "message": "меньше минуты назад" - }, - "minutes": { - "message": "$nr_of_minutes$ $minutes$ назад", - "placeholders": { - "nr_of_minutes":{ - "content": "$1" - }, - "minutes": { - "content": "$2", - "example": "minute or minutes (singular / plural)" - } - } - }, - "minute_singular": { - "message": "минуты" - }, - "minute_plural": { - "message": "минут" - }, - "timeAgo": { - "message": "около $time$ $time_string$ назад", - "placeholders": { - "time": { - "content": "$1" - }, - "time_string": { - "content": "$2" - } - } - }, - "hour_singular": { - "message": "часа" - }, - "hour_plural": { - "message": "часов" - }, - "day_singular": { - "message": "день" - }, - "day_plural": { - "message": "дней" - }, - "month_singular": { - "message": "месяц" - }, - "month_plural": { - "message": "месяцев" - }, - "yearsAgo": { - "message": "лет назад" - }, - "options_title": { - "message": "Настройки Chromed Bird" - }, - "conf_saved": { - "message": "Ваши настройки успешно сохранены!" - }, - "changes_restart": { - "message": "Однако, некоторые изменения требуют перезапуска расширения. Сделать это сейчас?
(Это сбросит счетчик непрочитанных твитов.)" - }, - "remaining_api_hits": { - "message": "Оставшиеся обращения к Twitter API: " - }, - "rate_limit_reset": { - "message": "Сброс лимитов: " - }, - "nerds_link": { - "message": "Статистика обращений к API (для ботанов)" - }, - "g_ui": { - "message": "Интерфейс" - }, - "l_name_attribute": { - "message": "Имя в твитах:" - }, - "o_screen_name": { - "message": "Имя пользователя (nickname)" - }, - "o_name": { - "message": "Настоящее имя" - }, - "o_both": { - "message": "Оба имени" - }, - "l_compose_position": { - "message": "Положение поля ввода:" - }, - "o_top": { - "message": "Сверху" - }, - "o_bottom": { - "message": "Снизу" - }, - "l_theme": { - "message": "Тема:" - }, - "l_font_size": { - "message": "Размер шрифта:" - }, - "o_small": { - "message": "Маленький" - }, - "o_normal": { - "message": "Нормальный" - }, - "o_large": { - "message": "Большой" - }, - "o_extra_large": { - "message": "Очень большой" - }, - "l_font_family": { - "message": "Шрифт:" - }, - "l_hover_timeout": { - "message": "Время чтения (мс):" - }, - "l_show_expanded_urls": { - "message": "Разворачивать короткие ссылки:" - }, - "l_reply_all": { - "message": "Отвечать всем упомянутым:" - }, - "l_show_hits_in_popup": { - "message": "Показывать число обращений к API:" - }, - "l_show_user_autocomplete": { - "message": "Автодополнять имена:" - }, - "l_icon_color": { - "message": "Цвет иконки:" - }, - "l_tweets_color_only_unified": { - "message": "Цвета только в общей ленте:" - }, - "l_tweet_color": { - "message": "Цвет твита:" - }, - "w_Mentions": { - "message": "Упоминания" - }, - "btn_reset_popup_size": { - "message": "Сбросить размер окна" - }, - "g_notifications": { - "message": "Оповещения" - }, - "l_tweet_notification": { - "message": "Оповещения о твитах" - }, - "l_change_icon": { - "message": "Изменить иконку" - }, - "l_icon_color": { - "message": "Цвет иконки" - }, - "notif_home": { - "message": "Главная:" - }, - "notif_mentions": { - "message": "Упоминания:" - }, - "notif_dms": { - "message": "Личные:" - }, - "notif_lists": { - "message": "Списки:" - }, - "notif_search": { - "message": "Поиск:" - }, - "l_tweets_notification_style": { - "message": "Стиль оповещений:" - }, - "l_noti_on_page": { - "message": "Оповещения на странице" - }, - "l_noti_desktop": { - "message": "На рабочем столе" - }, - "l_notification_fade_timeout": { - "message": "Таймаут оповещения (с):" - }, - "g_shortener": { - "message": "Сокращатель" - }, - "l_url_shortener": { - "message": "Сокращатель ссылок:" - }, - "l_shortener_acct": { - "message": "Использовать личный аккаунт?" - }, - "l_shortener_login": { - "message": "API Login:" - }, - "l_shortener_key": { - "message": "API Key:" - }, - "l_share_include_title": { - "message": "Включать название страницы (поделиться):" - }, - "g_timelines": { - "message": "Ленты" - }, - "notice_api_hits": { - "message": "Вы должны держать число обращений к API ниже ! Иначе Chromed Bird перестанет работать и ленты не будут обновляться.
Помните, если вы используете несколько Twitter клиентов, вы должны держать число обращений еще ниже." - }, - "l_hits_notice": { - "message": "Обращений к API в час: " - }, - "l_visible": { - "message": "Показывать" - }, - "l_refresh_interval": { - "message": "Интервал обновления (с)" - }, - "l_include_in_unified": { - "message": "Включать в общую ленту" - }, - "l_tabs_count": { - "message": "Число закладок" - }, - "l_unified_timeline": { - "message": "Общая лента:" - }, - "tml_favorites": { - "message": "Избранное:" - }, - "l_blocked_users": { - "message": "Заблокированые пользователи:" - }, - "notice_right_click_change": { - "message": "* Эй, теперь вы можете нажать правой кнопкой, чтобы изменить большинство этих значений прямо из всплывающего окна. Просто убирайтесь отсюда! :)" - }, - "l_tweets_per_page": { - "message": "Твитов на странице:" - }, - "l_max_cached_tweets": { - "message": "Максимум показанных твитов:" - }, - "g_microblogging_service": { - "message": "Служба микроблогов" - }, - "g_advanced": { - "message": "Продвинутые" - }, - "l_request_timeout": { - "message": "Таймаут запроса (мс):" - }, - "l_base_url": { - "message": "Twitter's API URL:" - }, - "l_base_oauth_url": { - "message": "OAuth URL:" - }, - "l_same_signing_urls": { - "message": "Same signing URLs:" - }, - "l_base_signing_url": { - "message": "API Signing URL:" - }, - "l_base_oauth_signing_url": { - "message": "OAuth Signing URL:" - }, - "l_base_search_url": { - "message": "Search API URL:" - }, - "btn_save": { - "message": "Сохранить" - }, - "btn_reset": { - "message": "Сбросить" - }, - "btn_default": { - "message": "По-умолчанию" - }, - "shortenIt": { - "message": "Сократить!" - }, - "shorten_current": { - "message": "Поделиться текущей страницей" - } - -} +{ + "extDescription": { + "message": "Chromed Bird это Twitter расширение, которое позволяет читать ленту и взаимодействовать с вашим twitter аккаунтом.", + "description": "Extension description" + }, + "resetSize": { + "message": "Двойной клик для сброса размера" + }, + "composeTweet": { + "message": "Написать Твит", + "description": "Text for composing new tweet" + }, + "tweetit": { + "message": "Затвитить!" + }, + "logout": { + "message": "Выход", + "description": "The text for the logout link" + }, + "options": { + "message": "Настройки", + "description": "Options link" + }, + "refresh": { + "message": "Обновить", + "description": "Refresh link" + }, + "suspend": { + "message": "Приостановить", + "description": "Suspend link" + }, + "autoUpdatesSuspended": { + "message": "Автоматическое обновление приостановлено" + }, + "resume": { + "message": "Продолжить" + }, + "remove": { + "message": "Удалить " + }, + "hide": { + "message": "Скрыть " + }, + "show": { + "message": "Показать " + }, + "add": { + "message": "Добавить" + }, + "selectList": { + "message": "- списки -" + }, + "updateList": { + "message": "Обновляю списки..." + }, + "w_Unified": { + "message": "Общая" + }, + "w_Home": { + "message": "Home" + }, + "w_DM": { + "message": "DMs" + }, + "w_Favorites": { + "message": "Избранные" + }, + "w_Lists": { + "message": "Списки" + }, + "w_Search": { + "message": "Поиск" + }, + "fromApp": { + "message": "через" + }, + "inReply": { + "message": "в ответ на" + }, + "retweetedBy": { + "message": "ретвит от" + }, + "retweetedByMe": { + "message": "мой ретвит" + }, + "unmarkFavorite": { + "message": "Убрать из избранного" + }, + "markFavorite": { + "message": "Пометить как избранное" + }, + "Delete": { + "message": "Удалить" + }, + "deleteConfirm": { + "message": "Удалить это сообщение: " + }, + "Yes": { + "message": "Да" + }, + "No": { + "message": "Нет" + }, + "Reply": { + "message": "Ответить" + }, + "Retweet": { + "message": "Ретвит" + }, + "retweetConfirm": { + "message": "Ретвит этого сообщения: " + }, + "oldRT": { + "message": "Поделиться (старый RT)" + }, + "markAllRead": { + "message": "Пометить все как прочитанное" + }, + "newToken": { + "message": "Запросить другой ключ" + }, + "shortenerIdleString": { + "message": "Наберите ссылку для сокращения, или нажмите сюда \u2192" + }, + "timelineHome": { + "message": "Home", + "description": "The home time line tab" + }, + "timelineDM": { + "message": "DM", + "description": "The direct message time line tab" + }, + "timelineFavorites": { + "message": "Избранное", + "description": "The home time line tab" + }, + "tweet_singular": { + "message": "твит" + }, + "tweet_plural": { + "message": "твиты" + }, + "newTweetsAvailable": { + "message": " Новых твитов: $count$. Обновить сейчас.", + "placeholders": { + "count": { + "content": "$1" + }, + "tweets": { + "content": "$2" + } + } + }, + "preventClosing": { + "message": "Нажмите правой для предотвращения закрытия." + }, + "changeNotificationSettings": { + "message": "Вы можете изменить настройки оповещений на странице настроек" + }, + "loadingMap": { + "message": "Загрузка карты..." + }, + "loadingImage": { + "message": "Загрузка изображения..." + }, + "loadingLongUrl": { + "message": "Загрузка длинной ссылки..." + }, + "errorExpandingUrl": { + "message": "Извините, что-то пошло не так, попробуйте еще раз." + }, + "ajaxFailed": { + "message": "Сбой запрос AJAX (плохое содинение?)" + }, + "successAuth": { + "message": "Поздравляем, вы успешно вошли в систему. Наслаждайтесь Chromed Bird!" + }, + "cbAuthorized": { + "message": "Chromed Bird авторизован!" + }, + "cbNotAuthorized": { + "message": "Упс... Что-то пошло не так. Попробуйте нажать на иконку Chromed Bird снова." + }, + "authorizing": { + "message": "Пожалуйста, подождите, авторизуем Chromed Bird..." + }, + "yourPIN": { + "message": "Ваш PIN: $pin$", + "placeholders": { + "pin":{ + "content": "$1" + } + } + }, + "tryAgain": { + "message": "Попробовать снова" + }, + "canceling": { + "message": "Отмена..." + }, + "cancelTweet": { + "message": "Отменить твит" + }, + "queued_messages": { + "message": "Сообщения в очереди:" + }, + "queue_trying": { + "message": "пытаюсь отправить уже $timediff$", + "placeholders": { + "timediff": { + "content": "$1" + } + } + }, + "queue_retried": { + "message": "$retries$ повторов за $timediff$ [$laststatus$]", + "placeholders": { + "retries": { + "content": "$1" + }, + "timediff": { + "content": "$2" + }, + "laststatus": { + "content": "$3" + } + } + }, + "ue_fetchingLists": { + "message": "Неожиданная ошибка $status$ при получении списка.", + "placeholders": { + "status": { + "content": "$1" + } + } + }, + "ue_updatingTweets": { + "message": "Неожиданная ошибка $baseError$ при обновлении твита.", + "placeholders": { + "baseError": { + "content": "$1" + } + } + }, + "ue_updatingTweets2": { + "message": " Если эта ошибка повторяется, попробуйте выйыти и зайти снова." + }, + "ue_deletingTweet": { + "message": "Неожиданная ошибка $status$ удаления твита.", + "placeholders": { + "status": { + "content": "$1" + } + } + }, + "ue_retweeting": { + "message": "Неожиданная ошибка $status$ ретвита.", + "placeholders": { + "status": { + "content": "$1" + } + } + }, + "ue_markFavorite": { + "message": "Неожиданная ошибка $status$ при добавлении в избранное.", + "placeholders": { + "status": { + "content": "$1" + } + } + }, + "ue_unmarkFavorite": { + "message": "Неожиданная ошибка $status$ при удалении из избранное.", + "placeholders": { + "status": { + "content": "$1" + } + } + }, + "newTweets": { + "message": "$newtweets$: $count$", + "placeholders": { + "count": { + "content": "$1" + }, + "newtweets": { + "content": "$2" + } + } + }, + "newtweets_singular": { + "message": "Новых твитов" + }, + "newtweets_plural": { + "message": "Новых твитов" + }, + "btnAuthorize": { + "message": "Авторизуйся!" + }, + "exceededAPIHits": { + "message": "Вы превысили лимит API. Пожалуйста, пересмотрите настройки интервалов обновления в настройках. Chromed Bird не будет обновлять до $nextResetDate $nextResetTime$.", + "placeholders": { + "options_url": { + "content": "$1" + }, + "nextResetDate": { + "content": "$2" + }, + "nextResetTime": { + "content": "$3" + } + } + }, + "warningAPIHits": { + "message": "Эй! Лимит обращений к API наступает слишком быстро.
Пожалуйста, пересмотрите настройки интервалов обновления в настройках. Обратите внимание, что если вы используете несколько Twitter клиентов они имеют общий лимит.
Осталось обращений: $remainingHits$ - Следующий сброс: $nextResetDate$ $nextResetTime$", + "placeholders": { + "options_url": { + "content": "$1" + }, + "remainingHits": { + "content": "$2" + }, + "nextResetDate": { + "content": "$3" + }, + "nextResetTime": { + "content": "$4" + } + } + }, + "oAuthError": { + "message": "Во время проверки подлинности возникла ошибка: $errorMessage$. Пожалуйста, нажмите чтобы повторить процесс", + "placeholders": { + "errorMessage": { + "content": "$1" + } + } + }, + "justNow": { + "message": "только что" + }, + "minuteAgo": { + "message": "меньше минуты назад" + }, + "minutes": { + "message": "$nr_of_minutes$ $minutes$ назад", + "placeholders": { + "nr_of_minutes":{ + "content": "$1" + }, + "minutes": { + "content": "$2", + "example": "minute or minutes (singular / plural)" + } + } + }, + "minute_singular": { + "message": "минуты" + }, + "minute_plural": { + "message": "минут" + }, + "timeAgo": { + "message": "около $time$ $time_string$ назад", + "placeholders": { + "time": { + "content": "$1" + }, + "time_string": { + "content": "$2" + } + } + }, + "hour_singular": { + "message": "часа" + }, + "hour_plural": { + "message": "часов" + }, + "day_singular": { + "message": "день" + }, + "day_plural": { + "message": "дней" + }, + "month_singular": { + "message": "месяц" + }, + "month_plural": { + "message": "месяцев" + }, + "yearsAgo": { + "message": "лет назад" + }, + "options_title": { + "message": "Настройки Chromed Bird" + }, + "conf_saved": { + "message": "Ваши настройки успешно сохранены!" + }, + "changes_restart": { + "message": "Однако, некоторые изменения требуют перезапуска расширения. Сделать это сейчас?
(Это сбросит счетчик непрочитанных твитов.)" + }, + "remaining_api_hits": { + "message": "Оставшиеся обращения к Twitter API: " + }, + "rate_limit_reset": { + "message": "Сброс лимитов: " + }, + "nerds_link": { + "message": "Статистика обращений к API (для ботанов)" + }, + "g_ui": { + "message": "Интерфейс" + }, + "l_name_attribute": { + "message": "Имя в твитах:" + }, + "o_screen_name": { + "message": "Имя пользователя (nickname)" + }, + "o_name": { + "message": "Настоящее имя" + }, + "o_both": { + "message": "Оба имени" + }, + "l_compose_position": { + "message": "Положение поля ввода:" + }, + "o_top": { + "message": "Сверху" + }, + "o_bottom": { + "message": "Снизу" + }, + "l_theme": { + "message": "Тема:" + }, + "l_font_size": { + "message": "Размер шрифта:" + }, + "o_small": { + "message": "Маленький" + }, + "o_normal": { + "message": "Нормальный" + }, + "o_large": { + "message": "Большой" + }, + "o_extra_large": { + "message": "Очень большой" + }, + "l_font_family": { + "message": "Шрифт:" + }, + "l_hover_timeout": { + "message": "Время чтения (мс):" + }, + "l_show_expanded_urls": { + "message": "Разворачивать короткие ссылки:" + }, + "l_reply_all": { + "message": "Отвечать всем упомянутым:" + }, + "l_show_hits_in_popup": { + "message": "Показывать число обращений к API:" + }, + "l_show_user_autocomplete": { + "message": "Автодополнять имена:" + }, + "l_icon_color": { + "message": "Цвет иконки:" + }, + "l_tweets_color_only_unified": { + "message": "Цвета только в общей ленте:" + }, + "l_tweet_color": { + "message": "Цвет твита:" + }, + "w_Mentions": { + "message": "Упоминания" + }, + "btn_reset_popup_size": { + "message": "Сбросить размер окна" + }, + "g_notifications": { + "message": "Оповещения" + }, + "l_tweet_notification": { + "message": "Оповещения о твитах" + }, + "l_change_icon": { + "message": "Изменить иконку" + }, + "l_icon_color": { + "message": "Цвет иконки" + }, + "notif_home": { + "message": "Главная:" + }, + "notif_mentions": { + "message": "Упоминания:" + }, + "notif_dms": { + "message": "Личные:" + }, + "notif_lists": { + "message": "Списки:" + }, + "notif_search": { + "message": "Поиск:" + }, + "l_tweets_notification_style": { + "message": "Стиль оповещений:" + }, + "l_noti_on_page": { + "message": "Оповещения на странице" + }, + "l_noti_desktop": { + "message": "На рабочем столе" + }, + "l_notification_fade_timeout": { + "message": "Таймаут оповещения (с):" + }, + "g_shortener": { + "message": "Сокращатель" + }, + "l_url_shortener": { + "message": "Сокращатель ссылок:" + }, + "l_shortener_acct": { + "message": "Использовать личный аккаунт?" + }, + "l_shortener_login": { + "message": "API Login:" + }, + "l_shortener_key": { + "message": "API Key:" + }, + "l_share_include_title": { + "message": "Включать название страницы (поделиться):" + }, + "g_timelines": { + "message": "Ленты" + }, + "notice_api_hits": { + "message": "Вы должны держать число обращений к API ниже ! Иначе Chromed Bird перестанет работать и ленты не будут обновляться.
Помните, если вы используете несколько Twitter клиентов, вы должны держать число обращений еще ниже." + }, + "l_hits_notice": { + "message": "Обращений к API в час: " + }, + "l_visible": { + "message": "Показывать" + }, + "l_refresh_interval": { + "message": "Интервал обновления (с)" + }, + "l_include_in_unified": { + "message": "Включать в общую ленту" + }, + "l_tabs_count": { + "message": "Число закладок" + }, + "l_unified_timeline": { + "message": "Общая лента:" + }, + "tml_favorites": { + "message": "Избранное:" + }, + "l_blocked_users": { + "message": "Заблокированые пользователи:" + }, + "notice_right_click_change": { + "message": "* Эй, теперь вы можете нажать правой кнопкой, чтобы изменить большинство этих значений прямо из всплывающего окна. Просто убирайтесь отсюда! :)" + }, + "l_tweets_per_page": { + "message": "Твитов на странице:" + }, + "l_max_cached_tweets": { + "message": "Максимум показанных твитов:" + }, + "g_microblogging_service": { + "message": "Служба микроблогов" + }, + "g_advanced": { + "message": "Продвинутые" + }, + "l_request_timeout": { + "message": "Таймаут запроса (мс):" + }, + "l_base_url": { + "message": "Twitter's API URL:" + }, + "l_base_oauth_url": { + "message": "OAuth URL:" + }, + "l_same_signing_urls": { + "message": "Same signing URLs:" + }, + "l_base_signing_url": { + "message": "API Signing URL:" + }, + "l_base_oauth_signing_url": { + "message": "OAuth Signing URL:" + }, + "l_base_search_url": { + "message": "Search API URL:" + }, + "btn_save": { + "message": "Сохранить" + }, + "btn_reset": { + "message": "Сбросить" + }, + "btn_default": { + "message": "По-умолчанию" + }, + "shortenIt": { + "message": "Сократить!" + }, + "shorten_current": { + "message": "Поделиться текущей страницей" + } + +} From b972a3519f6538ab1778d68c3af8ae05278c34f6 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Thu, 7 Oct 2010 22:12:30 -0300 Subject: [PATCH 006/135] Handling empty responses in url expander. --- lib/expander_lib.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/expander_lib.js b/lib/expander_lib.js index 40cdaa16..0512dc6c 100755 --- a/lib/expander_lib.js +++ b/lib/expander_lib.js @@ -142,12 +142,16 @@ Expander.prototype = { var url = result[0], params = result[1]; this.doAjaxRequest(url, params, function success(data, status) { - var success = true; - var longUrl = service.parseExpand(data); - var isShortened = false; - if(shortUrl != longUrl) { - isShortened = true; - _this.urlsCache[shortUrl] = longUrl; + var success = false; + var isShortened = true; + if(data) { + success = true; + var longUrl = service.parseExpand(data); + if(shortUrl == longUrl) { + isShortened = false; + } else { + _this.urlsCache[shortUrl] = longUrl; + } } callback(success, isShortened, longUrl); }, From 3dad673b0cec3fa393b3bb34e10be22c0a8fe0f4 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Thu, 7 Oct 2010 22:14:32 -0300 Subject: [PATCH 007/135] Updating changelog and version numbers --- Changelog | 8 ++++++++ manifest.json | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Changelog b/Changelog index 04333873..90a73ef0 100644 --- a/Changelog +++ b/Changelog @@ -1,3 +1,11 @@ +1.9.1 (2010-10-07) + +* Updated translations (Thanks to Antonio Perez, Onur Baykaş, Vladimir Yakovlev and Dima Mikhailov); +* Better status updates error handling; +* Fixing middle-click behavior for recent Chrome versions; +* Fixing encoding for German translation (Failing installation); +* Fixing small bug in url expanding. + 1.9.0 (2010-09-28) It's awesome to have such a big list of contributors. Thanks a lot guys!!! diff --git a/manifest.json b/manifest.json index 62d920c5..cff82b96 100755 --- a/manifest.json +++ b/manifest.json @@ -1,6 +1,6 @@ { "name": "Chromed Bird", - "version": "1.9.0", + "version": "1.9.1", "description": "__MSG_extDescription__", "default_locale": "en", "browser_action": { From 4e96c73d2f26fce60b31befed821293b6ec291e7 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Fri, 8 Oct 2010 00:16:31 -0300 Subject: [PATCH 008/135] Fixing workspace size when opening in a standalone tab --- manifest.json | 2 +- popup.html | 53 +++++++++++++++++++++++++++++---------------------- 2 files changed, 31 insertions(+), 24 deletions(-) diff --git a/manifest.json b/manifest.json index cff82b96..281279ef 100755 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "browser_action": { "default_icon": "img/icon19.png", "default_title": "Chromed Bird", - "popup": "popup.html" + "popup": "popup.html?popup" }, "background_page": "background.html", "permissions": [ diff --git a/popup.html b/popup.html index 9b2f52c5..40c18d4f 100644 --- a/popup.html +++ b/popup.html @@ -166,9 +166,13 @@ } } } + + ThemeManager.isPopup = location.search == '?popup'; }, + setPopupSize: function(width, height, autoFitWidth) { width = width || 490; + height = height || 400; if(autoFitWidth) { setTimeout(function() { var tabsBarWidth = 0; @@ -181,21 +185,26 @@ } }, 300); } - $(".timeline").width(width + 'px'); - if(height) { + + if(ThemeManager.isPopup) { + $(".timeline").width(width + 'px'); $(".inner_timeline,.timeline").height(height + 'px'); } else { - $(".inner_timeline,.timeline").height('400px'); + var resizeWindowFunc = function() { + var timelineHeight = window.innerHeight - 79; + $('.inner_timeline,.timeline').css('maxHeight', timelineHeight + 'px'); + } + resizeWindowFunc(); + $(window).resize(resizeWindowFunc); } }, + popupSizeData: Persistence.popupSize(), - handleWindowResizing: function () { - var sizeArray = ThemeManager.popupSizeData.val(); - if(sizeArray) { - sizeArray = sizeArray.split('x'); - ThemeManager.setPopupSize(sizeArray[0], sizeArray[1], true); - } else { - ThemeManager.setPopupSize(null, null, true); + + initWindowResizing: function() { + ThemeManager.handleWindowResizing(); + if(!ThemeManager.isPopup) { + return; } $(".timeline").resizable({ handles: 'e, s, se', @@ -216,6 +225,16 @@ }); }, + handleWindowResizing: function() { + var sizeArray = ThemeManager.popupSizeData.val(); + if(sizeArray) { + sizeArray = sizeArray.split('x'); + ThemeManager.setPopupSize(sizeArray[0], sizeArray[1], true); + } else { + ThemeManager.setPopupSize(null, null, true); + } + }, + sortableEl: null, uiTabs: null, handleSortableTabs: function() { @@ -1385,7 +1404,7 @@ //Delay loading, improving responsiveness setTimeout(function() { - ThemeManager.handleWindowResizing(); + ThemeManager.initWindowResizing(); Lists.init(); ContextMenu.init(); @@ -1427,18 +1446,6 @@ } initializeWorkspace(); - - chrome.tabs.getAllInWindow(null, function(tabs) { - //Let's make it fullscreen if we're running it in an exclusive window. - if(tabs.length == 1 && tabs[0].url == chrome.extension.getURL('popup.html')) { - var resizeWindowFunc = function() { - var timelineHeight = window.innerHeight - 79; - $('.timeline').css('maxHeight', timelineHeight + 'px'); - } - resizeWindowFunc(); - $(window).resize(resizeWindowFunc); - } - }); }); From 07f355b5c42a57455d1f159c88e1dd72ca02c2d1 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Fri, 8 Oct 2010 00:29:48 -0300 Subject: [PATCH 009/135] Fixing links for standalone page. --- lib/tweets_assembler.js | 14 +++++++++----- popup.html | 10 +++++++++- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/lib/tweets_assembler.js b/lib/tweets_assembler.js index 0a17770a..428e8ec9 100755 --- a/lib/tweets_assembler.js +++ b/lib/tweets_assembler.js @@ -18,8 +18,12 @@ var Renderer = { return this.context == 'onpage'; }, - isPopup: function() { - return this.context == 'popup'; + isComplete: function() { + return this.context == 'popup' || this.context == 'standalone'; + }, + + isStandalone: function() { + return this.context == 'standalone'; }, isNotification: function() { @@ -318,7 +322,7 @@ var Renderer = { var container = Renderer.makeDiv({timelineid: tweetTimeline, tweetid: tweet.id, class: tweetClass}); var overlayStyle = ''; - if(this.isPopup() && useColors) { + if(this.isComplete() && useColors) { overlayStyle = 'background-color: ' + OptionsBackend.get(templateId + '_tweets_color') + ';'; } var overlay = Renderer.makeDiv({class: "tweet_overlay", style: overlayStyle}); @@ -394,7 +398,7 @@ var Renderer = { footer.appendChild(rtLink); footer.appendChild(Renderer.makeText(" ")); } - if(this.isPopup() && tweetManager.isRetweet(tweet.id)) { + if(this.isComplete() && tweetManager.isRetweet(tweet.id)) { footer.appendChild(Renderer.makeText(chrome.i18n.getMessage("retweetedByMe") + ' ')); } if(from) { @@ -553,7 +557,7 @@ var ClickEmulator = { }, false); }, handleClick: function(el, clickCallback) { - if(Renderer.isNotification()) { + if(Renderer.isNotification() || Renderer.isStandalone()) { if(el.tagName == 'A' && el.href.charAt(el.href.length - 1) != '#') { return; } diff --git a/popup.html b/popup.html index 40c18d4f..993f0496 100644 --- a/popup.html +++ b/popup.html @@ -168,6 +168,9 @@ } ThemeManager.isPopup = location.search == '?popup'; + if(!ThemeManager.isPopup) { + $('').appendTo(document.head); + } }, setPopupSize: function(width, height, autoFitWidth) { @@ -1380,12 +1383,17 @@ tweetManager.registerNewTweetsCallback(null); } }); - Renderer.setContext('popup'); tweetManager.registerNewTweetsCallback(newTweetsAvailable); $("#workspace").show(); ThemeManager.init(); + if(ThemeManager.isPopup) { + Renderer.setContext('popup'); + } else { + Renderer.setContext('standalone'); + } + TimelineTab.init(); tweetManager.orderedEachTimeline(function(timeline) { if(timeline.template.id == TimelineTemplate.SEARCH) { From 51541cb2541da62eec2d7a25dbdcdcea8542231c Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Fri, 8 Oct 2010 00:48:32 -0300 Subject: [PATCH 010/135] Fixing link for the options page in standalone mode. --- lib/tweets_assembler.js | 1 + popup.html | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/tweets_assembler.js b/lib/tweets_assembler.js index 428e8ec9..570f4b47 100755 --- a/lib/tweets_assembler.js +++ b/lib/tweets_assembler.js @@ -570,6 +570,7 @@ var ClickEmulator = { }, true); el.addEventListener('mousedown', function() { var listener = function(event) { + event.preventDefault(); clickCallback(event); }; _this.waitingUp.push({element: this, listener: listener}); diff --git a/popup.html b/popup.html index 993f0496..957dcf36 100644 --- a/popup.html +++ b/popup.html @@ -1433,6 +1433,10 @@ WorkList.init(); Autocomplete.init(); $("#shorten_current").attr("title",chrome.i18n.getMessage("shorten_current")); + + ClickEmulator.handleClick($("#options_page_link")[0], function() { + openTab(chrome.extension.getURL('options.html')); + }); }, 0); } @@ -1488,7 +1492,7 @@ | - | + | | From 567dc996e04c4c6dcbd5ba3bf3784123065c3b46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cezar=20S=C3=A1=20Espinola?= Date: Fri, 8 Oct 2010 04:09:18 -0700 Subject: [PATCH 011/135] The default is to use desktop notifications --- lib/options_backend.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/options_backend.js b/lib/options_backend.js index 3b66e998..7b64bdf4 100644 --- a/lib/options_backend.js +++ b/lib/options_backend.js @@ -31,7 +31,7 @@ OptionsBackend = { base_search_url: 'http://search.twitter.com/search', - tweets_notification_style: 'on_page', + tweets_notification_style: 'desktop', home_on_page: false, home_icon: true, mentions_on_page: true, From 0f5744d7270e2d429db300ff04026ed14d390a9f Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Fri, 8 Oct 2010 15:58:16 -0300 Subject: [PATCH 012/135] Fixing invalid de_DE locale. --- _locales/{de_DE => de}/messages.json | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename _locales/{de_DE => de}/messages.json (100%) diff --git a/_locales/de_DE/messages.json b/_locales/de/messages.json similarity index 100% rename from _locales/de_DE/messages.json rename to _locales/de/messages.json From 15e2b5382d1041f3e07b57e2591a8aec12b35914 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Fri, 8 Oct 2010 16:00:12 -0300 Subject: [PATCH 013/135] Updating version numbers and changelog --- Changelog | 4 ++++ manifest.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Changelog b/Changelog index 90a73ef0..ede96c7f 100644 --- a/Changelog +++ b/Changelog @@ -1,3 +1,7 @@ +1.9.2 (2010-10-08) + +* Arghh, invalid locale name (de_DE) was still causing installation errors. + 1.9.1 (2010-10-07) * Updated translations (Thanks to Antonio Perez, Onur Baykaş, Vladimir Yakovlev and Dima Mikhailov); diff --git a/manifest.json b/manifest.json index 281279ef..6884bee7 100755 --- a/manifest.json +++ b/manifest.json @@ -1,6 +1,6 @@ { "name": "Chromed Bird", - "version": "1.9.1", + "version": "1.9.2", "description": "__MSG_extDescription__", "default_locale": "en", "browser_action": { From 999c978ba19c2b75be0779e426cdc2c59b45a221 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Fri, 8 Oct 2010 16:40:35 -0300 Subject: [PATCH 014/135] Adding mcaf.ee shortener. --- lib/shortener_lib.js | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/lib/shortener_lib.js b/lib/shortener_lib.js index 88e56d8a..3ecd1ab6 100755 --- a/lib/shortener_lib.js +++ b/lib/shortener_lib.js @@ -327,6 +327,35 @@ YourlsShortener = { } } +McafeeShortener = { + shorten: function(longUrl, useAcct, login, apiKey, serviceUrl, callback) { + var url = "http://mcaf.ee/api/shorten"; + var params = { + input_url: longUrl, + format: 'json' + } + $.ajax({ + type: 'GET', + url: url, + data: params, + dataType: 'json', + success: function(data, status) { + if(!data) { + callback(-1, chrome.i18n.getMessage("ajaxFailed")); + } + if(data.status_code == 200 && data.data) { + callback(0, data.data.url); + } else { + callback(data.status_code, data.status_txt); + } + }, + error: function (request, status, error) { + callback(-1, chrome.i18n.getMessage("ajaxFailed")); + } + }); + } +} + SHORTENERS_BACKEND = { bitly: { desc: 'bit.ly', @@ -387,5 +416,10 @@ SHORTENERS_BACKEND = { desc: 'yourls', baseUrl: '', backend: YourlsShortener + }, + mcafee: { + desc: 'mcaf.ee', + baseUrl: '', + backend: McafeeShortener } } From a9a62c0b9a6795bab536e4af142d2d230ad1f091 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Sat, 9 Oct 2010 15:30:56 -0300 Subject: [PATCH 015/135] Allowing users to detach the popup window. --- _locales/en/messages.json | 3 +++ css/base.css | 5 ++++ img/up_detach.png | Bin 0 -> 1170 bytes lib/persistence.js | 35 ++++++++++++++++++++++--- popup.html | 53 +++++++++++++++++++++++++++++++++++--- 5 files changed, 89 insertions(+), 7 deletions(-) create mode 100644 img/up_detach.png diff --git a/_locales/en/messages.json b/_locales/en/messages.json index c7f85608..b9511774 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -628,5 +628,8 @@ }, "tweet_send_error": { "message": "An error occurred while trying to send your tweet. Maybe Twitter is acting weird? You can try it again but please double check your account to prevent duplicated messages." + }, + "detach_window": { + "message": "Detach Window" } } diff --git a/css/base.css b/css/base.css index e810235b..49e2dd87 100755 --- a/css/base.css +++ b/css/base.css @@ -97,6 +97,11 @@ input[type='text'] { margin-top: 4px; } +.header_link_right #detach_img { + margin-left: 2px; + margin-right: 2px; +} + #loading, #queue_loading { float: right; margin: 0px; diff --git a/img/up_detach.png b/img/up_detach.png new file mode 100644 index 0000000000000000000000000000000000000000..f2c36d48b9dbc3095e27530157e7745f30769d91 GIT binary patch literal 1170 zcmV;D1a13?P)4Tx0C)j~RL^S@K@|QrZmG~B2wH0nvUrdpNm;9CMbtL^5n^i$+aIn^?(HA4aZWV5ov6ELTdbo0FI&wK{O>*+w4vx20?>!`FrQsdJlnHR>OPy zcd~b_n$otK2Za4V;76L-DzNVtaSB-y0*E}{p()372;bw_^6ZZ}PI-92wGS&j#91PI zKs7DSe@(bk%_Y-7gGe}(^>I=@oY#w#*Bu9GZf3^F5WP>3rn}7Ut74&?PWBFvy`A)a zPP5)V!Xd&78LdA?xQ(9mjMYElVd13a#D+Z_7&Y|xU=_C-srWU*6kiZcC!$nw*)9$7 zn6CX+@=AhmkT}X@VSsa5NKe;HZuq)~1$`#h6R+ZTR#D-3j}vF!)ZOnz+5)dI4jl{{ z44Mr{P!L4~VVJN`K!!XTF*LGrKO?IK8z<8w`3e3jI8lUGNUta*C8 zn(P`s>{pjD=7Kek#B;Fw@hxAK%$F&Q6vg9J^Xf~4by_hu-=A!MJ3Znq&n~srbFGPs zH&&aMXZ>nO`|hf|ljc?VPhR!${AbO?W8x_>CU%PFA&Hm8F7cAsOREdwU~R_;ot1_u z(ruCYB-LPGn!NQdT|ZlRy+(fw^-+`=%+gee_kY4FWHg<*4sZI8+sFJD270UUORdLHO0nA4V) z%{fwsET5CQ>B?eK%uw4yQc~9?*JVo2}ze(;aRcp*ceL#HUJSllrgm5wQKR zQu+C;QrUh^8rFfA`ftFz{YAidi-`aL010qNS#tmY3ljhU3ljkVnw%H_00Bx#L_t&- z88uHmOT%Cge)B;aLsKY8r=a}-{R0a6BSf4m2>t>m=gy5dwh7XqZsH&cZXsg^3pykQ z5@KUW!bHkIF8NPZ1#x> zr k-s`&l7)8-H#(`A*0n^34Fblhi?*IS*07*qoM6N<$f*QCfKL7v# literal 0 HcmV?d00001 diff --git a/lib/persistence.js b/lib/persistence.js index 437411ad..8142042a 100755 --- a/lib/persistence.js +++ b/lib/persistence.js @@ -4,10 +4,23 @@ Persistence = { return new ValueWrapper(key); }, + isObject: function(key) { + return !!this.objectKeys[key]; + }, + + addObject: function(key) { + this.objectKeys[key] = true; + this.objectKeysVar.save(this.objectKeys); + }, + /* Creating helper methods for each persistence entry (load() shoudn't be used directly) */ init: function() { + this.objectKeys = {'object_keys': true}; + this.objectKeysVar = this.load('object_keys'); + this.objectKeys = this.objectKeysVar.val() || {}; + var existingKeys = ['options', 'selected_lists', 'timeline_order', 'oauth_token_data', - 'oauth_token_service', 'version', 'popup_size']; + 'oauth_token_service', 'version', 'popup_size', 'window_position']; var _this = this; for(var i = 0, len = existingKeys.length; i < len; ++i) { @@ -30,20 +43,34 @@ Persistence = { localStorage.removeItem('currentTheme'); } }; -Persistence.init(); function ValueWrapper(key) { this.key = key; } ValueWrapper.prototype = { save: function(value) { + if((typeof value) != 'string') { + if(!Persistence.isObject(this.key)) { + Persistence.addObject(this.key); + } + value = JSON.stringify(value); + } localStorage[this.key] = value; return value; }, val: function() { - return localStorage[this.key]; + var value = localStorage[this.key]; + if(!value) { + return; + } + if(Persistence.isObject(this.key)) { + value = JSON.parse(value); + } + return value; }, remove: function() { return localStorage.removeItem(this.key); } -}; \ No newline at end of file +}; + +Persistence.init(); \ No newline at end of file diff --git a/popup.html b/popup.html index 957dcf36..f1159d0f 100644 --- a/popup.html +++ b/popup.html @@ -6,7 +6,7 @@ - +Chromed Bird + + +Locales Data + + + + + + + \ No newline at end of file From 9416a5d51d583c82850801902f06fc3df9b143e3 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Sat, 16 Oct 2010 23:08:53 -0300 Subject: [PATCH 029/135] Fixing invalid localization entries --- _locales/es/messages.json | 2 +- _locales/nl/messages.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/_locales/es/messages.json b/_locales/es/messages.json index ae94ddce..42e9ca68 100644 --- a/_locales/es/messages.json +++ b/_locales/es/messages.json @@ -50,7 +50,7 @@ "selectList": { "message": "- Selecciona una lista -" }, - "updateLists": { + "updateList": { "message": "Actualizar Listas..." }, "w_Unified": { diff --git a/_locales/nl/messages.json b/_locales/nl/messages.json index d2e969ef..ca03439a 100644 --- a/_locales/nl/messages.json +++ b/_locales/nl/messages.json @@ -11,7 +11,7 @@ "message": "Opties", "description": "Options link" }, - "allRead": { + "markAllRead": { "message": "Alles als gelezen markeren" }, "newToken": { From 26365c1df8130128fb4956184de60e85530dc61a Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Sat, 16 Oct 2010 23:41:46 -0300 Subject: [PATCH 030/135] Making the locales report even more awesome. --- locales.html | 65 +++++++++++++------ .../nl/messages.json | 0 2 files changed, 45 insertions(+), 20 deletions(-) rename {_locales => unfinished_locales}/nl/messages.json (100%) diff --git a/locales.html b/locales.html index 21c7ef70..2e7b2936 100644 --- a/locales.html +++ b/locales.html @@ -39,50 +39,54 @@ this.prepareLocaleData(); this.tableEl.empty(); - var titleRowEl = $('').append($('')); - for(var k = 0, len3 = this.orderedLocaleCodes.length; k < len3; ++k) { - var code = this.orderedLocaleCodes[k]; - var localeCellEl = $('').html(code); - titleRowEl.append(localeCellEl); - } - this.tableEl.append(titleRowEl); - + var emptyCount = {}; for(var i = 0, len = this.orderedKeywords.length; i < len; ++i) { var keyword = this.orderedKeywords[i]; var rowEl = $(''); var titleCellEl = $('').html(keyword); rowEl.append(titleCellEl); + var isKeywordComplete = true; for(var j = 0, len2 = this.orderedLocaleCodes.length; j < len2; ++j) { var localeCode = this.orderedLocaleCodes[j]; var localeData = this.locales[localeCode]; var message = localeData.hasOwnProperty(keyword) ? localeData[keyword].message : '-'; - var className = '' + var className = ''; if(message == '-') { className = 'empty'; + emptyCount[localeCode] = emptyCount[localeCode] ? emptyCount[localeCode] + 1 : 1; + isKeywordComplete = false; } var cellEl = $('').addClass(className).html(message); rowEl.append(cellEl); } - var isPropertyInDefault = this.locales[this.defaultLocale].hasOwnProperty(keyword); + var isPropertyInDefault = this.locales[this.defaultLocale] && this.locales[this.defaultLocale].hasOwnProperty(keyword); if(!isPropertyInDefault) { rowEl.addClass('invalid'); + } else if(!isKeywordComplete) { + rowEl.addClass('incomplete'); } - this.tableEl.append(rowEl); } - }, - addLocale: function(localeCode, data) { - this.locales[localeCode] = data; - this.drawTable(); + var titleRowEl = $('').append($('')); + for(var k = 0, len3 = this.orderedLocaleCodes.length; k < len3; ++k) { + var code = this.orderedLocaleCodes[k]; + var localeCellEl = $('').html(code); + if(emptyCount[code]) { + localeCellEl.append($('').addClass('empty_count').html(' (' + emptyCount[code] + ')')) + } + titleRowEl.append(localeCellEl); + } + this.tableEl.prepend(titleRowEl); }, loadData: function() { var _this = this; this.loadDefaultLocale(function(defaultLocale) { _this.defaultLocale = defaultLocale; - _this.loadLocaleMessages(function(localeCode, localeData) { - _this.addLocale(localeCode, localeData); + _this.loadLocaleMessages(function(locales) { + _this.locales = locales; + _this.drawTable(); }); }) }, @@ -103,6 +107,20 @@ }, loadLocaleMessages: function(callback) { + var remainingLocalesMap = {}; + $.each(LocaleTable.availableLocaleCodes, function() { + remainingLocalesMap[this] = true; + }); + var locales = {}; + var updateLocaleCallback = function(localeCode, data) { + delete remainingLocalesMap[localeCode]; + if(data) { + locales[localeCode] = data; + } + if($.isEmptyObject(remainingLocalesMap)) { + callback(locales); + } + }; for(var i = 0, len = LocaleTable.availableLocaleCodes.length; i < len; ++i) { var localeCode = LocaleTable.availableLocaleCodes[i]; (function(localeCode) { @@ -113,9 +131,10 @@ dataType: 'json', timeout: 5000, success: function(data, status, xhr) { - if(data) { - callback(localeCode, data); - } + updateLocaleCallback(localeCode, data); + }, + error: function() { + updateLocaleCallback(localeCode, null); } }); })(localeCode); @@ -148,6 +167,12 @@ #localeTable tr.invalid td, #localeTable tr.invalid th { background-color: #ff0; } +#localeTable tr.incomplete th { + color: red; +} +span.empty_count { + color: red; +} diff --git a/_locales/nl/messages.json b/unfinished_locales/nl/messages.json similarity index 100% rename from _locales/nl/messages.json rename to unfinished_locales/nl/messages.json From d8744bf96a6212f2a282a333f8b83cb40fc0884e Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Sun, 17 Oct 2010 00:00:49 -0300 Subject: [PATCH 031/135] Locales report link in the options page --- css/options.css | 4 ++++ options.html | 1 + 2 files changed, 5 insertions(+) diff --git a/css/options.css b/css/options.css index 085860b6..c04e774a 100755 --- a/css/options.css +++ b/css/options.css @@ -158,4 +158,8 @@ div.checkerboard { canvas#nerds { display: block; +} + +a.locales_report { + color: black; } \ No newline at end of file diff --git a/options.html b/options.html index 1947e343..26f4c39a 100755 --- a/options.html +++ b/options.html @@ -565,5 +565,6 @@

Chromed Bird Options

+Locales Report From 5dd65469defd57b8e6182ede4269b7c38f544852 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Sun, 17 Oct 2010 03:13:02 -0300 Subject: [PATCH 032/135] Performance issue with action menus --- lib/action_menu.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/action_menu.js b/lib/action_menu.js index a3b8a667..d0e37b83 100644 --- a/lib/action_menu.js +++ b/lib/action_menu.js @@ -48,6 +48,9 @@ $('#trigger').actionMenu({ }; $.actionMenu.init = function() { + if(initialized) { + return; + } initialized = true; document.addEventListener('mouseup', function() { for(var i = 0, len = existingActionMenus.length; i < len; ++i) { From 40d1b383eaae5d6bc64026bb84a0a6c952136f40 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Sun, 17 Oct 2010 03:30:02 -0300 Subject: [PATCH 033/135] Fixing 'up' action menu not firing action events. --- lib/action_menu.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/action_menu.js b/lib/action_menu.js index d0e37b83..b02301ab 100644 --- a/lib/action_menu.js +++ b/lib/action_menu.js @@ -156,10 +156,10 @@ $('#trigger').actionMenu({ // For up menus we have to reverse the order of the dom elements. if(direction == 'up') { if(this.lastDirection != 'up') { - this.actionAreaEl.replaceWith(this.balloon).insertBefore(this.balloon); + this.balloon.insertAfter(this.actionAreaEl); } } else if(this.lastDirection == 'up') { - this.actionAreaEl.replaceWith(this.balloon).insertAfter(this.balloon); + this.balloon.insertBefore(this.actionAreaEl); } this.lastDirection = direction; this.visible = true; From 787a134632ee720ca61475eb8ce610387a142a17 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Sun, 17 Oct 2010 15:31:10 -0300 Subject: [PATCH 034/135] Fixing the way we handle middle clicks in action menus and some other performance improvements. --- lib/action_menu.js | 25 ++++++++++++--------- lib/any_click.js | 50 +++++++++++++++++++++++++++++++++++++++++ lib/tweets_assembler.js | 27 ++++++++++------------ popup.html | 3 ++- 4 files changed, 78 insertions(+), 27 deletions(-) create mode 100644 lib/any_click.js diff --git a/lib/action_menu.js b/lib/action_menu.js index b02301ab..8e73dc72 100644 --- a/lib/action_menu.js +++ b/lib/action_menu.js @@ -16,7 +16,7 @@ $('#trigger').actionMenu({ */ (function($) { var initialized = false; - var existingActionMenus = []; + var activeActionMenu = null; $.fn.actionMenu = function(options) { $.actionMenu.init(); @@ -25,7 +25,6 @@ $('#trigger').actionMenu({ if(!actionMenu) { actionMenu = new $.actionMenu(this, options); $(this).data('actionMenu', actionMenu); - existingActionMenus.push(actionMenu); } actionMenu.setOptions(options); }); @@ -41,8 +40,7 @@ $('#trigger').actionMenu({ this.optionsChanged = false; var _this = this; - this.triggerEl.click(function(event) { - event.preventDefault(); + this.triggerEl.anyClick(function(event) { _this.showActionMenu(); }); }; @@ -52,10 +50,9 @@ $('#trigger').actionMenu({ return; } initialized = true; - document.addEventListener('mouseup', function() { - for(var i = 0, len = existingActionMenus.length; i < len; ++i) { - var actionMenu = existingActionMenus[i]; - actionMenu.close(); + document.addEventListener('mouseup', function(event) { + if(activeActionMenu && activeActionMenu.triggerEl[0] != event.target) { + activeActionMenu.close(); } }, false); }; @@ -63,6 +60,7 @@ $('#trigger').actionMenu({ $.actionMenu.prototype = { close: function() { if(this.visible && !this.closing) { + activeActionMenu = null; this.closing = true; var _this = this; this.actionMenuEl.stop(true, true).effect('puff', {}, 150, function() { @@ -75,9 +73,15 @@ $('#trigger').actionMenu({ showActionMenu: function() { if(this.visible) { + this.close(); return; } + if(activeActionMenu) { + activeActionMenu.close(); + } + activeActionMenu = this; + if(this.optionsChanged) { this.reloadOptions(); } @@ -199,15 +203,14 @@ $('#trigger').actionMenu({ for(var i = 0, len = this.actions.length; i < len; ++i) { with({action: this.actions[i]}) { action.actionEl = $('
').addClass('action'); - action.actionEl.click(function(event) { - event.preventDefault(); + action.actionEl.anyClick(function(event) { return action.action(event); }); if(action.icon) { var iconEl = $('').attr('src', action.icon).attr('title', action.name); action.actionEl.append(iconEl); } else { - var nameEl = $('').attr('href', '#').html(action.name); + var nameEl = $('').attr('href', 'javascript:').html(action.name); action.actionEl.append(nameEl); } this.actionAreaEl.append(action.actionEl); diff --git a/lib/any_click.js b/lib/any_click.js new file mode 100644 index 00000000..c4bd8cfc --- /dev/null +++ b/lib/any_click.js @@ -0,0 +1,50 @@ +var AnyClick = { + waitingUp: [], + initiated: false, + init: function(options) { + this.initiated = true; + var _this = this; + document.addEventListener('mouseup', function() { + _this.clearEventListeners(); + }, false); + }, + clearEventListeners: function() { + for(var i = 0, len = this.waitingUp.length; i < len; ++i) { + var el = this.waitingUp[i].element; + el.removeEventListener('mouseup', this.waitingUp[i].listener, true); + } + if(len > 0) { + this.waitingUp = []; + } + }, + anyClick: function(el, clickCallback) { + if(!this.initiated) { + this.init(); + } + var _this = this; + el.addEventListener('click', function(event) { + if(event.button != 2) { + event.preventDefault(); + } + }, true); + el.addEventListener('mousedown', function() { + var listener = function(event) { + event.preventDefault(); + event.isAlternateClick = event.button == 1 || event.metaKey || event.ctrlKey; + clickCallback(event); + _this.clearEventListeners(); + }; + _this.waitingUp.push({element: this, listener: listener}); + el.addEventListener('mouseup', listener, true); + }, true); + } +}; + +// JQuery Helper +(function($) { + $.fn.anyClick = function(callback) { + return this.each(function() { + AnyClick.anyClick(this, callback); + }); + }; +})(jQuery); \ No newline at end of file diff --git a/lib/tweets_assembler.js b/lib/tweets_assembler.js index fd13c5aa..c30f991b 100755 --- a/lib/tweets_assembler.js +++ b/lib/tweets_assembler.js @@ -171,7 +171,7 @@ var Renderer = { hrefObj.setAttribute("href", url); hrefObj.appendChild(document.createTextNode(url)); - ClickEmulator.handleClick(hrefObj, function() { openTab(url); }); + AnyClick.anyClick(hrefObj, function() { openTab(url); }); hrefObj.onmouseover = function() { Renderer.expandLink(this, url); }; if (hrefObj.captureEvents) { hrefObj.captureEvents(CLICK); @@ -191,13 +191,12 @@ var Renderer = { var link = Renderer.makeElem("a", {href: '#'}); link.appendChild(Renderer.makeText(label)); - ClickEmulator.handleClick(link, function(event) { + AnyClick.anyClick(link, function(event) { if(Renderer.isNotification() || !OptionsBackend.get('open_searches_internally')) { var url = TwitterLib.URLS.SEARCH + "%23" + term; openTab(url); } else { - var isAlternateClick = event.button == 1 || event.metaKey || event.ctrlKey; - TimelineTab.addNewSearchTab('#' + term, isAlternateClick); + TimelineTab.addNewSearchTab('#' + term, event.isAlternateClick); } }); @@ -290,7 +289,7 @@ var Renderer = { } from = Renderer.makeSpan(tweetSource); var linkElement = from.childNodes[0]; - ClickEmulator.handleClick(linkElement, function() { openTab(linkElement.href); }); + AnyClick.anyClick(linkElement, function() { openTab(linkElement.href); }); } if(tweet.geo) { var href = "http://maps.google.com/maps?q=loc:" + tweet.geo.coordinates[0] + "," + tweet.geo.coordinates[1] + " "; @@ -300,7 +299,7 @@ var Renderer = { href: href, onmouseover: "Renderer.geoImage(this, " + tweet.geo.coordinates[0] + "," + tweet.geo.coordinates[1] + ")" }, "\"[GEO]\"/"); - ClickEmulator.handleClick(geo, function() { openTab(href); }); + AnyClick.anyClick(geo, function() { openTab(href); }); } var tweetSpace = Renderer.makeDiv({class: "tweet_space"}); @@ -324,7 +323,7 @@ var Renderer = { Renderer.toggleInReply(tweet, tweetSpace); }; } - ClickEmulator.handleClick(inReply, replyAction); + AnyClick.anyClick(inReply, replyAction); Renderer.expandInReply(tweet, tweetSpace, true); } @@ -398,7 +397,7 @@ var Renderer = { statusLinkSpan.appendChild(Renderer.makeText(Renderer.getTimestampText(tweet.created_at))); var statusLink = Renderer.makeElem("a", {href:statusLinkDst}); statusLink.appendChild(statusLinkSpan); - ClickEmulator.handleClick(statusLink, function() {openTab(statusLinkDst);}); + AnyClick.anyClick(statusLink, function() {openTab(statusLinkDst);}); footer.appendChild(statusLink); footer.appendChild(Renderer.makeText(" ")); @@ -410,7 +409,7 @@ var Renderer = { footer.appendChild(Renderer.makeText(chrome.i18n.getMessage("retweetedBy") + ' ')); var rtLink = Renderer.makeElem("a", {href:TwitterLib.URLS.BASE + tweet.user.screen_name}); rtLink.appendChild(Renderer.makeText(tweet.user.screen_name)); - ClickEmulator.handleClick(rtLink, function() { openTab(TwitterLib.URLS.BASE + tweet.user.screen_name); }); + AnyClick.anyClick(rtLink, function() { openTab(TwitterLib.URLS.BASE + tweet.user.screen_name); }); footer.appendChild(rtLink); footer.appendChild(Renderer.makeText(" ")); } @@ -436,7 +435,7 @@ var Renderer = { (function(path) { footer.appendChild(Renderer.makeText(" (List: ")); var link = Renderer.makeElem("a", {href:TwitterLib.URLS.BASE + path, title:"@"+path}); - ClickEmulator.handleClick(link, function() {openTab(TwitterLib.URLS.BASE + path);}); + AnyClick.anyClick(link, function() {openTab(TwitterLib.URLS.BASE + path);}); link.appendChild(Renderer.makeText(list.name)); footer.appendChild(link); footer.appendChild(Renderer.makeText(")")); @@ -508,7 +507,7 @@ var Renderer = { createUserActionMenu: function(element, username) { if(Renderer.isNotification()) { - ClickEmulator.handleClick(element, function(event) { + AnyClick.anyClick(element, function(event) { openTab(TwitterLib.URLS.BASE + username); }); return; @@ -553,9 +552,9 @@ var Renderer = { }, { name: chrome.i18n.getMessage("tweets_action"), - action: function() { + action: function(event) { var searchQuery = 'from:' + username; - TimelineTab.addNewSearchTab(searchQuery, false); + TimelineTab.addNewSearchTab(searchQuery, event.isAlternateClick); } }, { @@ -739,6 +738,4 @@ if(location.protocol != 'chrome-extension:' && document.body.tagName != 'FRAMESE Renderer.assemblyTweetsOnPage(tweets, response.nameAttribute, response.fadeTimeout); } }); -} else { - ClickEmulator.init(); } diff --git a/popup.html b/popup.html index 6c9e769e..d40fcc80 100644 --- a/popup.html +++ b/popup.html @@ -49,6 +49,7 @@ + @@ -1514,7 +1515,7 @@ $("#shorten_current").attr("title", chrome.i18n.getMessage("shorten_current")); $("#detach_img").attr("title", chrome.i18n.getMessage("detach_window")); - ClickEmulator.handleClick($("#options_page_link")[0], function() { + $("#options_page_link").anyClick(function() { openTab(chrome.extension.getURL('options.html')); }); }, 0); From 6e476241b1634d1be8ceb951196768ae48ba98e9 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Sun, 17 Oct 2010 15:45:29 -0300 Subject: [PATCH 035/135] Adding an action to add a mention to the user in the current tweet. --- _locales/en/messages.json | 3 +++ lib/tweets_assembler.js | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index bfabde22..c91b01f6 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -643,5 +643,8 @@ }, "profile_action": { "message": "Profile" + }, + "add_mention_action": { + "message": "Mention" } } diff --git a/lib/tweets_assembler.js b/lib/tweets_assembler.js index c30f991b..6f4bb877 100755 --- a/lib/tweets_assembler.js +++ b/lib/tweets_assembler.js @@ -562,6 +562,15 @@ var Renderer = { action: function() { openTab(TwitterLib.URLS.BASE + username); } + }, + { + name: chrome.i18n.getMessage("add_mention_action"), + action: function() { + Composer.addUser(username); + }, + condition: function() { + return $("#compose_tweet_area").is(':visible'); + } } ], parentContainer: '.inner_timeline' @@ -725,6 +734,7 @@ function openTab(tabUrl) { if(background && obj) { obj.blur(); } + return true; } if(location.protocol != 'chrome-extension:' && document.body.tagName != 'FRAMESET') { From 87aa52b1126c1156c79993c5f04b71fc81a00575 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Sun, 17 Oct 2010 15:45:54 -0300 Subject: [PATCH 036/135] Removing some dead code. --- lib/tweets_assembler.js | 64 ----------------------------------------- 1 file changed, 64 deletions(-) diff --git a/lib/tweets_assembler.js b/lib/tweets_assembler.js index 6f4bb877..624a8423 100755 --- a/lib/tweets_assembler.js +++ b/lib/tweets_assembler.js @@ -614,33 +614,6 @@ var Renderer = { Renderer.expandInReply(tweet, target); }, - handleUserClick: function (user, url) { - // There are 3 possible actions: - // 1 - If the composer area is visible, add the user to the current message - // 2 - If we're not in a notification and we should open searches internally and we're - // not already in a search tab, open a new tab with tweets from the current user. - // 3 - If none of this is true, let's just open user's profile page. - var composeAreaVisible = $("#compose_tweet_area").is(':visible'); - var isAlternateClick = event.button == 1 || event.metaKey || event.ctrlKey; - - // Action #1, only applies to main click. - if(composeAreaVisible && !isAlternateClick) { - Composer.addUser(user); - return; - } - // Action #2. - if(!Renderer.isNotification() && OptionsBackend.get('open_searches_internally')) { - var currentTimeline = tweetManager.getCurrentTimeline(); - var searchQuery = 'from:' + user; - if(currentTimeline.template.id != TimelineTemplate.SEARCH || currentTimeline.getSearchQuery() != searchQuery) { - TimelineTab.addNewSearchTab(searchQuery, isAlternateClick); - return; - } - } - // If we're still here, that means action #3. - openTab(url); - }, - assemblyTweetsOnPage: function (tweets, nameAttribute, fadeTimeout) { var tweetsArray = []; for(var i = 0; i < tweets.length; ++i) { @@ -678,43 +651,6 @@ var Renderer = { }); } } -} - -var ClickEmulator = { - waitingUp: [], - init: function() { - var _this = this; - document.addEventListener('mouseup', function() { - for(var i = 0, len = _this.waitingUp.length; i < len; ++i) { - var el = _this.waitingUp[i].element; - el.removeEventListener('mouseup', _this.waitingUp[i].listener, true); - } - if(len > 0) { - _this.waitingUp = []; - } - }, false); - }, - handleClick: function(el, clickCallback) { - if(Renderer.isNotification() || Renderer.isStandalone()) { - if(el.tagName == 'A' && el.href.charAt(el.href.length - 1) != '#') { - return; - } - } - var _this = this; - el.addEventListener('click', function(event) { - if(event.button != 2) { - event.preventDefault(); - } - }, true); - el.addEventListener('mousedown', function() { - var listener = function(event) { - event.preventDefault(); - clickCallback(event); - }; - _this.waitingUp.push({element: this, listener: listener}); - el.addEventListener('mouseup', listener, true); - }, true); - } }; function openTab(tabUrl) { From 99cfa8c25486c64b1735a007bc6b07ec1085676e Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Sun, 17 Oct 2010 16:22:46 -0300 Subject: [PATCH 037/135] Dropping jQuery dependency for locales.html --- locales.html | 124 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 74 insertions(+), 50 deletions(-) diff --git a/locales.html b/locales.html index 2e7b2936..419165c7 100644 --- a/locales.html +++ b/locales.html @@ -1,14 +1,13 @@ - - Locales Data + \ No newline at end of file From d103063edbc6c2df245c368d7bc10079161f263e Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Sun, 17 Oct 2010 17:36:14 -0300 Subject: [PATCH 038/135] Fixing desktop notifications. --- tweets_notifier.html | 1 + 1 file changed, 1 insertion(+) diff --git a/tweets_notifier.html b/tweets_notifier.html index 26382913..54dffe8a 100755 --- a/tweets_notifier.html +++ b/tweets_notifier.html @@ -4,6 +4,7 @@ + From 32048556c6310ce7de5611f8772a97adec1bc599 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Sun, 17 Oct 2010 17:40:08 -0300 Subject: [PATCH 039/135] Fixing on page notifications. --- background.html | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/background.html b/background.html index 84ee131d..4969fd98 100644 --- a/background.html +++ b/background.html @@ -473,9 +473,11 @@ }; injectHelper('script', 'lib/3rdparty/jquery.js', true, function() { injectHelper('css', 'css/injectedTweets.css', true, function() { - injectHelper('script', 'lib/tweet_transforms.js', true, function() { - injectHelper('script', 'lib/timeline_template.js', true, function() { - injectHelper('script', 'lib/tweets_assembler.js', true); + injectHelper('script', 'lib/any_click.js', true, function() { + injectHelper('script', 'lib/tweet_transforms.js', true, function() { + injectHelper('script', 'lib/timeline_template.js', true, function() { + injectHelper('script', 'lib/tweets_assembler.js', true); + }); }); }); }); From 6b4f367cdad567057ab8eb99c24a4cd154019461 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Thu, 21 Oct 2010 19:41:34 -0300 Subject: [PATCH 040/135] Making jslint happier. --- lib/tweets_assembler.js | 60 ++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/lib/tweets_assembler.js b/lib/tweets_assembler.js index 624a8423..44cf71a6 100755 --- a/lib/tweets_assembler.js +++ b/lib/tweets_assembler.js @@ -302,8 +302,8 @@ var Renderer = { AnyClick.anyClick(geo, function() { openTab(href); }); } - var tweetSpace = Renderer.makeDiv({class: "tweet_space"}); - var container = Renderer.makeDiv({timelineid: tweetTimeline, tweetid: tweet.id, class: tweetClass}); + var tweetSpace = Renderer.makeDiv({'class': "tweet_space"}); + var container = Renderer.makeDiv({timelineid: tweetTimeline, tweetid: tweet.id, 'class': tweetClass}); tweetSpace.appendChild(container); @@ -344,56 +344,56 @@ var Renderer = { if(this.isComplete() && useColors) { overlayStyle = 'background-color: ' + OptionsBackend.get(templateId + '_tweets_color') + ';'; } - var overlay = Renderer.makeDiv({class: "tweet_overlay", style: overlayStyle}); + var overlay = Renderer.makeDiv({'class': "tweet_overlay", style: overlayStyle}); container.appendChild(overlay); // Now in container -> overlay - var first_container = Renderer.makeDiv({class:"first_container"}); + var first_container = Renderer.makeDiv({'class':"first_container"}); overlay.appendChild(first_container); // now in container -> overlay -> first_container if(tweet.retweeted_status) { - var img1 = Renderer.makeElem("img", {class:"profile retweet_source", src: user.profile_image_url}); - var img2 = Renderer.makeElem('img', {class:'profile retweet_retweeter', src: tweet.user.profile_image_url}); + var img1 = Renderer.makeElem("img", {'class':"profile retweet_source", src: user.profile_image_url}); + var img2 = Renderer.makeElem('img', {'class':'profile retweet_retweeter', src: tweet.user.profile_image_url}); first_container.appendChild(img1); first_container.appendChild(img2); Renderer.createUserActionMenu(img1, user.screen_name); Renderer.createUserActionMenu(img2, tweet.user.screen_name); } else { - var img = Renderer.makeElem("img", {class:'profile', src:user.profile_image_url}); + var img = Renderer.makeElem("img", {'class':'profile', src:user.profile_image_url}); first_container.appendChild(img); Renderer.createUserActionMenu(img, user.screen_name); } - var userName = Renderer.makeElem("a", {href: '#', class:"user", screen_name: user.screen_name, title: tweetTitleUserName}); + var userName = Renderer.makeElem("a", {href: '#', 'class':"user", screen_name: user.screen_name, title: tweetTitleUserName}); Renderer.createUserActionMenu(userName, user.screen_name); userName.appendChild(Renderer.makeText(tweetUserName)); first_container.appendChild(userName); if(user.verified) { first_container.appendChild(Renderer.makeText(" ")); - first_container.appendChild(Renderer.makeElem("img", {class:'verified', src:'img/verified.png', alt:'verified'})); + first_container.appendChild(Renderer.makeElem("img", {'class':'verified', src:'img/verified.png', alt:'verified'})); } - if(user.protected) { + if(user['protected']) { first_container.appendChild(Renderer.makeText(" ")); - first_container.appendChild(Renderer.makeElem("img", {class:'protected', src:'img/lock.png', alt:'protected'})); + first_container.appendChild(Renderer.makeElem("img", {'class':'protected', src:'img/lock.png', alt:'protected'})); } - var textDiv = Renderer.makeDiv({class:'text'}); + var textDiv = Renderer.makeDiv({'class':'text'}); first_container.appendChild(textDiv); // now in: container -> overlay -> first_container -> textDiv if(tweet.retweeted_status) { - textDiv.appendChild(Renderer.makeElem("img", {class:"retweet", src:'img/retweet.png'})); + textDiv.appendChild(Renderer.makeElem("img", {'class':"retweet", src:'img/retweet.png'})); } textDiv.appendChild(content); // exiting textDiv, now container -> overlay -> first_container - var footer = Renderer.makeDiv({class:'footer'}); + var footer = Renderer.makeDiv({'class':'footer'}); first_container.appendChild(footer); // now in container -> overlay -> footer var statusLinkDst = TwitterLib.URLS.BASE + user.screen_name + '/status/' + tweetId; - var statusLinkSpan = Renderer.makeElem("span", {class:'timestamp', title: Renderer.getTimestampAltText(tweet.created_at)}); + var statusLinkSpan = Renderer.makeElem("span", {'class':'timestamp', title: Renderer.getTimestampAltText(tweet.created_at)}); statusLinkSpan.appendChild(Renderer.makeText(Renderer.getTimestampText(tweet.created_at))); var statusLink = Renderer.makeElem("a", {href:statusLinkDst}); statusLink.appendChild(statusLinkSpan); @@ -417,20 +417,20 @@ var Renderer = { footer.appendChild(Renderer.makeText(chrome.i18n.getMessage("retweetedByMe") + ' ')); } if(from) { - var span = Renderer.makeElem("span", {class:"from_app"}); - span.appendChild(Renderer.makeText(chrome.i18n.getMessage("fromApp") + ' ')); - span.appendChild(from); - footer.appendChild(span); + var fromSpan = Renderer.makeElem("span", {'class':"from_app"}); + fromSpan.appendChild(Renderer.makeText(chrome.i18n.getMessage("fromApp") + ' ')); + fromSpan.appendChild(from); + footer.appendChild(fromSpan); } if(geo) { - var span = Renderer.makeElem("span", {class:"geo_tag"}); - span.appendChild(Renderer.makeText(" ")); - span.appendChild(geo); - footer.appendChild(span); + var geoSpan = Renderer.makeElem("span", {'class':"geo_tag"}); + geoSpan.appendChild(Renderer.makeText(" ")); + geoSpan.appendChild(geo); + footer.appendChild(geoSpan); } if(templateId == TimelineTemplate.LISTS && (this.isNotification() || tweetManager.currentTimelineId != tweetTimeline)) { var list = tweetManager.getList(tweetTimeline); - if(list != null) { + if(list !== null) { var path_ = list.uri.substr(1); (function(path) { footer.appendChild(Renderer.makeText(" (List: ")); @@ -445,7 +445,7 @@ var Renderer = { // exit footer, first_container, now in container -> overlay if(!this.isNotification()) { - var actions = Renderer.makeDiv({class:"new_actions"}); + var actions = Renderer.makeDiv({'class':"new_actions"}); var str = ""; if(templateId != TimelineTemplate.DMS) { if(tweet.favorited) { @@ -477,7 +477,7 @@ var Renderer = { if(tweetManager.isRetweet(tweet.id)) { //TODO: undo retweet } else { - if(templateId != TimelineTemplate.DMS && !user.protected) { + if(templateId != TimelineTemplate.DMS && !user['protected']) { str += '
'; @@ -490,7 +490,7 @@ var Renderer = { '
'; } } - if(!user.protected) { + if(!user['protected']) { str += '
'; @@ -588,7 +588,7 @@ var Renderer = { tweet.replyVisible = true; var renderedTweet = Renderer.renderTweet(data, false, OptionsBackend.get('name_attribute')); target.appendChild(renderedTweet); - var separator = Renderer.makeDiv({class: 'reply_separator'}, "\u2193"); + var separator = Renderer.makeDiv({'class': 'reply_separator'}, "\u2193"); renderedTweet.insertBefore(separator, renderedTweet.childNodes[0]); separator.onclick = function() { Renderer.toggleInReply(tweet, target); @@ -628,7 +628,7 @@ var Renderer = { var controlBar = '
'; controlBar += ' ' + chrome.i18n.getMessage("changeNotificationSettings"); - controlBar += 'Close' + controlBar += 'Close'; controlBar += '
'; destination.append(controlBar).append(tweetsArray); @@ -637,7 +637,7 @@ var Renderer = { var removeElement = function() { destination.remove(); - } + }; destination.slideDown('fast', function(){ $(this).fadeOut(fadeTimeout, removeElement).hover( From d186b8f8ba85710ab0ac311336cfe9c59c2258a8 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Thu, 21 Oct 2010 19:42:07 -0300 Subject: [PATCH 041/135] Fixing opening link in background using middle click. --- lib/tweets_assembler.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/tweets_assembler.js b/lib/tweets_assembler.js index 44cf71a6..dbd4e4d6 100755 --- a/lib/tweets_assembler.js +++ b/lib/tweets_assembler.js @@ -666,9 +666,16 @@ function openTab(tabUrl) { if(tabUrl.match(/^www/i)) { tabUrl = "http://" + tabUrl; } - var obj = window.open(tabUrl, '_blank'); - if(background && obj) { - obj.blur(); + if(Renderer.isNotification()) { + var obj = window.open(tabUrl, '_blank'); + if(background && obj) { + obj.blur(); + } + } else { + chrome.tabs.create({ + url: tabUrl, + selected: !background + }); } return true; } From 91a86cacc0e1073438b80a2f61733a32a904ba1a Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Thu, 21 Oct 2010 23:33:36 -0300 Subject: [PATCH 042/135] Fixing popup not closing when opening links with left click --- lib/tweets_assembler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tweets_assembler.js b/lib/tweets_assembler.js index dbd4e4d6..2bbe8540 100755 --- a/lib/tweets_assembler.js +++ b/lib/tweets_assembler.js @@ -666,7 +666,7 @@ function openTab(tabUrl) { if(tabUrl.match(/^www/i)) { tabUrl = "http://" + tabUrl; } - if(Renderer.isNotification()) { + if(!background || Renderer.isNotification()) { var obj = window.open(tabUrl, '_blank'); if(background && obj) { obj.blur(); From 436b570e0686cdd7cf7d7d3c30d5a8ea4c803a82 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Fri, 22 Oct 2010 00:18:53 -0300 Subject: [PATCH 043/135] Better aligning the reply separator --- css/base.css | 1 + 1 file changed, 1 insertion(+) diff --git a/css/base.css b/css/base.css index 74200999..33cd8411 100755 --- a/css/base.css +++ b/css/base.css @@ -341,6 +341,7 @@ div.reply_separator { left: 50%; right: 50%; margin-top: -10px; + margin-left: 11px; /* Half of the padding used for the actions */ cursor: pointer; } From af9bd417eec755e5786fe0de450274eb786ac010 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Fri, 22 Oct 2010 00:19:08 -0300 Subject: [PATCH 044/135] Adding the minify shortener --- lib/shortener_lib.js | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/lib/shortener_lib.js b/lib/shortener_lib.js index aeca457a..7c5b398d 100755 --- a/lib/shortener_lib.js +++ b/lib/shortener_lib.js @@ -381,6 +381,31 @@ RodGsShortener = { } }; +MinifyShortener = { + shorten: function(longUrl, useAcct, login, apiKey, serviceUrl, callback) { + var url = "http://minify.us/api.php"; + var params = { + u: longUrl + }; + $.ajax({ + type: 'GET', + url: url, + data: params, + dataType: 'text', + success: function(data, status) { + if(data.match(/^ERROR/i)) { + callback(-1, data); + return; + } + callback(0, data); + }, + error: function (request, status, error) { + callback(-1, chrome.i18n.getMessage("ajaxFailed")); + } + }); + } +}; + SHORTENERS_BACKEND = { bitly: { desc: 'bit.ly', @@ -451,5 +476,10 @@ SHORTENERS_BACKEND = { desc: 'rod.gs', baseUrl: '', backend: RodGsShortener + }, + minify: { + desc: 'minify', + baseUrl: '', + backend: MinifyShortener } }; From 8d60144050acc361e3bda1afa2d9f14053a6557c Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Fri, 22 Oct 2010 00:31:22 -0300 Subject: [PATCH 045/135] Changing the order of action menu actions. Preventing accidental follows/unfollows. --- lib/tweets_assembler.js | 44 ++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/lib/tweets_assembler.js b/lib/tweets_assembler.js index 2bbe8540..ae4fead9 100755 --- a/lib/tweets_assembler.js +++ b/lib/tweets_assembler.js @@ -514,6 +514,28 @@ var Renderer = { } $(element).actionMenu({ actions: [ + { + name: chrome.i18n.getMessage("tweets_action"), + action: function(event) { + var searchQuery = 'from:' + username; + TimelineTab.addNewSearchTab(searchQuery, event.isAlternateClick); + } + }, + { + name: chrome.i18n.getMessage("profile_action"), + action: function() { + openTab(TwitterLib.URLS.BASE + username); + } + }, + { + name: chrome.i18n.getMessage("add_mention_action"), + action: function() { + Composer.addUser(username); + }, + condition: function() { + return $("#compose_tweet_area").is(':visible'); + } + }, { name: chrome.i18n.getMessage("follow_action"), action: function() { @@ -549,28 +571,6 @@ var Renderer = { var followingUsers = tweetManager.getFollowingUsersMap(); return !$.isEmptyObject(followingUsers) && followingUsers.hasOwnProperty(username); } - }, - { - name: chrome.i18n.getMessage("tweets_action"), - action: function(event) { - var searchQuery = 'from:' + username; - TimelineTab.addNewSearchTab(searchQuery, event.isAlternateClick); - } - }, - { - name: chrome.i18n.getMessage("profile_action"), - action: function() { - openTab(TwitterLib.URLS.BASE + username); - } - }, - { - name: chrome.i18n.getMessage("add_mention_action"), - action: function() { - Composer.addUser(username); - }, - condition: function() { - return $("#compose_tweet_area").is(':visible'); - } } ], parentContainer: '.inner_timeline' From 0603b32cc5fd92bdbf1497f7177a03b91a70ce1a Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Fri, 22 Oct 2010 00:43:44 -0300 Subject: [PATCH 046/135] Updating version to 1.9.5 --- Changelog | 14 ++++++++++++++ manifest.json | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Changelog b/Changelog index ede96c7f..f4f95cb6 100644 --- a/Changelog +++ b/Changelog @@ -1,3 +1,17 @@ +1.9.5 (2010-10-21) + +* Showing a inline menu with different actions after clicking user's names or avatars + This will allow you to follow/unfollow users, create a new search tab with messages from + this user or open the user's profile page (previous default behavior). +* Expanding original messages for replies (when clicking the 'in reply to' link). (Thanks Yuki!); +* Optimized autocompletion (Thanks again Yuki); +* Opening hashtags inside Chromed Bird itself as a new search tab; +* Allowing users to detach the popup windows (still needs some improvement); +* Introduced a report showing the state of each one of the existing translations (bottom of the options page); +* Fixed the behavior of middle-click and ctrl-click in links, correctly leaving the popup still opened. +* Added mcaf.ee, rod.gs and minify shorteners; +* Cleaning and fixing up the code after running it through JavasScript Lint. + 1.9.2 (2010-10-08) * Arghh, invalid locale name (de_DE) was still causing installation errors. diff --git a/manifest.json b/manifest.json index 6884bee7..46ee573e 100755 --- a/manifest.json +++ b/manifest.json @@ -1,6 +1,6 @@ { "name": "Chromed Bird", - "version": "1.9.2", + "version": "1.9.5", "description": "__MSG_extDescription__", "default_locale": "en", "browser_action": { From 4a15d460542ebb8a17f39b79d56bc989e6655255 Mon Sep 17 00:00:00 2001 From: Onur Baykal Date: Fri, 22 Oct 2010 07:46:15 -0700 Subject: [PATCH 047/135] new popup strings are translated --- _locales/tr/messages.json | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/_locales/tr/messages.json b/_locales/tr/messages.json index 57f4aadf..6a385872 100644 --- a/_locales/tr/messages.json +++ b/_locales/tr/messages.json @@ -626,4 +626,25 @@ "shorten_current": { "message": "Aktif sayfayı paylaş" } + "tweet_send_error": { + "message": "Tweetinizi gönderirken bir hata oluştu. Twitter garip davranıyor olabilir mi? Tekrar deneyebilirsiniz ama aynı mesajı göndermediğinizden emin olun." + }, + "detach_window": { + "message": "Pencereyi Ayır" + }, + "follow_action": { + "message": "Takip Et" + }, + "unfollow_action": { + "message": "Takip Etmeyi Bırak" + }, + "tweets_action": { + "message": "Tweetler" + }, + "profile_action": { + "message": "Profil" + }, + "add_mention_action": { + "message": "Bahset" + } } From 5f1800d6a7bef16207f832687f1bf1a14e1f2323 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Sat, 23 Oct 2010 10:13:54 -0300 Subject: [PATCH 048/135] Fixing missing comma in tr/messages.json --- _locales/tr/messages.json | 2 +- locales.html | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/_locales/tr/messages.json b/_locales/tr/messages.json index 6a385872..b62f087b 100644 --- a/_locales/tr/messages.json +++ b/_locales/tr/messages.json @@ -625,7 +625,7 @@ }, "shorten_current": { "message": "Aktif sayfayı paylaş" - } + }, "tweet_send_error": { "message": "Tweetinizi gönderirken bir hata oluştu. Twitter garip davranıyor olabilir mi? Tekrar deneyebilirsiniz ama aynı mesajı göndermediğinizden emin olun." }, diff --git a/locales.html b/locales.html index 419165c7..8f64f67c 100644 --- a/locales.html +++ b/locales.html @@ -100,6 +100,10 @@ }, 'manifest.json'); }, + showError: function(message) { + document.body.appendChild(Util.makeElem('h2', {}, message)); + }, + loadLocaleMessages: function(callback) { var remainingLocalesMap = {}; for(var k = 0, codesLen = LocaleTable.availableLocaleCodes.length; k < codesLen; ++k) { @@ -115,12 +119,19 @@ callback(locales); } }; + var _this = this; for(var i = 0, len = LocaleTable.availableLocaleCodes.length; i < len; ++i) { var localeCode = LocaleTable.availableLocaleCodes[i]; (function(localeCode) { Util.ajax(function(status, data) { if(data) { - data = JSON.parse(data); + try { + data = JSON.parse(data); + } catch(e) { + _this.showError('Invalid JSON file for "' + localeCode + '", check console.'); + console.log('Invalid JSON', data, e); + throw e; + } } updateLocaleCallback(localeCode, data); }, '_locales/' + localeCode + '/messages.json'); From 02e37da2106775d7582749c4ba9e860d3461ffd5 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Sat, 23 Oct 2010 11:25:05 -0300 Subject: [PATCH 049/135] Fixing weird resizing issues (too small or too large popups). --- css/base.css | 2 +- popup.html | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/css/base.css b/css/base.css index 33cd8411..11e68880 100755 --- a/css/base.css +++ b/css/base.css @@ -341,7 +341,7 @@ div.reply_separator { left: 50%; right: 50%; margin-top: -10px; - margin-left: 11px; /* Half of the padding used for the actions */ + margin-left: 13px; /* Half of the padding used for the actions */ cursor: pointer; } diff --git a/popup.html b/popup.html index d40fcc80..4e27421e 100644 --- a/popup.html +++ b/popup.html @@ -238,11 +238,27 @@ popupSizeData: Persistence.popupSize(), + setMinMaxWidth: function(width, height) { + var minWidth = 450; + var maxWidth = window.innerWidth - 14; + if(width > maxWidth) { + width = maxWidth; + } + if(width < minWidth) { + width = minWidth; + } + ThemeManager.setPopupSize(width, height); + }, + initWindowResizing: function() { ThemeManager.handleWindowResizing(); if(!ThemeManager.isPopup) { return; } + setTimeout(function() { + // Delay the execution of this code to allow the window to resize first. + ThemeManager.setMinMaxWidth($(".timeline").width(), $(".timeline").height()); + }, 1000); $(".timeline").resizable({ handles: 'e, s, se', minWidth: 450, @@ -252,6 +268,7 @@ }, stop: function(e, ui) { var $this = $(this); + ThemeManager.setMinMaxWidth($this.width(), $this.height()); ThemeManager.popupSizeData.save($this.width() + 'x' + $this.height()); } }); From 57a30eea137768e06cbe076bd6b6f2c568e6b854 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Sat, 23 Oct 2010 12:54:30 -0300 Subject: [PATCH 050/135] More consistent behavior for middle-clicks on users. Just open their profile page in the background. --- lib/action_menu.js | 18 ++++++++++++------ lib/tweets_assembler.js | 7 +++++++ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/lib/action_menu.js b/lib/action_menu.js index 8e73dc72..f755157b 100644 --- a/lib/action_menu.js +++ b/lib/action_menu.js @@ -41,7 +41,7 @@ $('#trigger').actionMenu({ var _this = this; this.triggerEl.anyClick(function(event) { - _this.showActionMenu(); + _this.showActionMenu(event); }); }; @@ -71,7 +71,16 @@ $('#trigger').actionMenu({ } }, - showActionMenu: function() { + showActionMenu: function(event) { + if(this.optionsChanged) { + this.reloadOptions(); + } + + if(!this.showMenu(event)) { + this.close(); + return; + } + if(this.visible) { this.close(); return; @@ -82,10 +91,6 @@ $('#trigger').actionMenu({ } activeActionMenu = this; - if(this.optionsChanged) { - this.reloadOptions(); - } - if(this.firstRun) { this.container = this.triggerEl.parents(this.parentContainer); this.container.append(this.actionMenuEl); @@ -189,6 +194,7 @@ $('#trigger').actionMenu({ reloadOptions: function() { this.optionsChanged = false; + this.showMenu = this.options.showMenu || function() { return true; }; this.actions = this.options.actions; this.parentContainer = this.options.parentContainer; this.actionMenuEl.empty(); diff --git a/lib/tweets_assembler.js b/lib/tweets_assembler.js index ae4fead9..282872be 100755 --- a/lib/tweets_assembler.js +++ b/lib/tweets_assembler.js @@ -513,6 +513,13 @@ var Renderer = { return; } $(element).actionMenu({ + showMenu: function(event) { + if(event.isAlternateClick) { + openTab(TwitterLib.URLS.BASE + username); + return false; + } + return true; + }, actions: [ { name: chrome.i18n.getMessage("tweets_action"), From 8036bb69f1f0f5b2867a0b96f820b1e3e779639f Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Sat, 23 Oct 2010 16:50:30 -0300 Subject: [PATCH 051/135] Avoid event listeners leak when resizing detached windows. --- popup.html | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/popup.html b/popup.html index 4e27421e..6f3453c7 100644 --- a/popup.html +++ b/popup.html @@ -208,6 +208,9 @@ }, setPopupSize: function(width, height, autoFitWidth) { + if(!ThemeManager.isPopup) { + return; + } width = width || 490; height = height || 400; if(autoFitWidth) { @@ -223,17 +226,8 @@ }, 300); } - if(ThemeManager.isPopup) { - $(".timeline").width(width + 'px'); - $(".inner_timeline,.timeline").height(height + 'px'); - } else { - var resizeWindowFunc = function() { - var timelineHeight = window.innerHeight - 79; - $('.inner_timeline,.timeline').css('maxHeight', timelineHeight + 'px'); - }; - resizeWindowFunc(); - $(window).resize(resizeWindowFunc); - } + $(".timeline").width(width + 'px'); + $(".inner_timeline,.timeline").height(height + 'px'); }, popupSizeData: Persistence.popupSize(), @@ -253,6 +247,12 @@ initWindowResizing: function() { ThemeManager.handleWindowResizing(); if(!ThemeManager.isPopup) { + var resizeFunc = function() { + var timelineHeight = window.innerHeight - 79; + $('.inner_timeline,.timeline').css('maxHeight', timelineHeight + 'px'); + }; + $(window).resize(resizeFunc); + resizeFunc(); return; } setTimeout(function() { From fc658e5dbc866e4fe3ebb527a378fc4a58a84993 Mon Sep 17 00:00:00 2001 From: usercard Date: Sat, 23 Oct 2010 22:50:31 +0300 Subject: [PATCH 052/135] Ukrainian language added --- _locales/ua/messages.json | 533 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 533 insertions(+) create mode 100644 _locales/ua/messages.json diff --git a/_locales/ua/messages.json b/_locales/ua/messages.json new file mode 100644 index 00000000..1d489f5f --- /dev/null +++ b/_locales/ua/messages.json @@ -0,0 +1,533 @@ +{ + "extDescription": { + "message": "Chromed Bird це Twitter розширення, яке дозволяє читати стрічку і взаємодіє з вашим twitter аккаунтом.", + "description": "Extension description" + }, + "resetSize": { + "message": "Подвійний клік для скидання розміру" + }, + "composeTweet": { + "message": "Написати Твіт", + "description": "Text for composing new tweet" + }, + "tweetit": { + "message": "Затвітувати!" + }, + "logout": { + "message": "Вихід", + "description": "The text for the logout link" + }, + "options": { + "message": "Налаштування", + "description": "Options link" + }, + "refresh": { + "message": "Оновити", + "description": "Refresh link" + }, + "suspend": { + "message": "Призупинити", + "description": "Suspend link" + }, + "autoUpdatesSuspended": { + "message": "Автоматичне оновлення призупинено" + }, + "resume": { + "message": "Продовжити" + }, + "remove": { + "message": "Видалити" + }, + "hide": { + "message": "Приховати" + }, + "show": { + "message": "Показати" + }, + "add": { + "message": "Додати" + }, + "selectList": { + "message": "- списки -" + }, + "updateList": { + "message": "Поновлюю списки..." + }, + "w_Unified": { + "message": "Загальна" + }, + "w_Home": { + "message": "Home" + }, + "w_DM": { + "message": "DMs" + }, + "w_Favorites": { + "message": "Обране" + }, + "w_Lists": { + "message": "Списки" + }, + "w_Search": { + "message": "Пошук" + }, + "fromApp": { + "message": "через" + }, + "inReply": { + "message": "у відповідь на" + }, + "retweetedBy": { + "message": "ретвіт від" + }, + "retweetedByMe": { + "message": "мій ретвіт" + }, + "unmarkFavorite": { + "message": "Видалити з обраного" + }, + "markFavorite": { + "message": "Помітити як обране" + }, + "Delete": { + "message": "Видалити" + }, + "deleteConfirm": { + "message": "Видалити це повідомлення:" + }, + "Yes": { + "message": "Так" + }, + "No": { + "message": "Ні" + }, + "Reply": { + "message": "Відповісти" + }, + "Retweet": { + "message": "Ретвіт" + }, + "retweetConfirm": { + "message": "Ретвіт цього повідомлення:" + }, + "oldRT": { + "message": "Поділитися (старий RT)" + }, + "markAllRead": { + "message": "Помітити всі як прочитане" + }, + "newToken": { + "message": "Запросити інший ключ" + }, + "shortenerIdleString": { + "message": "Наберіть посилання для скорочення, або натисніть сюди →" + }, + "timelineHome": { + "message": "Home", + "description": "The home time line tab" + }, + "timelineDM": { + "message": "DM", + "description": "The direct message time line tab" + }, + "timelineFavorites": { + "message": "Вибране", + "description": "The home time line tab" + }, + "tweet_singular": { + "message": "твіт" + }, + "tweet_plural": { + "message": "твіти" + }, + "newTweetsAvailable": { + "message": "Нових твітів: $count$. Оновити зараз.", + "placeholders": {"count":{"content":"$1"},"tweets":{"content":"$2"}} + }, + "preventClosing": { + "message": "Клацніть правою для запобігання закриття." + }, + "changeNotificationSettings": { + "message": "Ви можете змінити налаштування сповіщень на сторінці налаштувань" + }, + "loadingMap": { + "message": "Завантаження карти ..." + }, + "loadingImage": { + "message": "Завантаження зображення ..." + }, + "loadingLongUrl": { + "message": "Завантаження довгого посилання ..." + }, + "errorExpandingUrl": { + "message": "Вибачте, щось вийшло не так, спробуйте ще раз." + }, + "ajaxFailed": { + "message": "Збій запиту AJAX (погане з'єднання?)" + }, + "successAuth": { + "message": "Вітаємо, ви успішно увійшли в систему. Насолоджуйтесь Chromed Bird!" + }, + "cbAuthorized": { + "message": "Chromed Bird авторизований!" + }, + "cbNotAuthorized": { + "message": "Упс... Щось пішло не так. Спробуйте натиснути на іконку Chromed Bird знову." + }, + "authorizing": { + "message": "Будь ласка, почекайте, авторизації Chromed Bird..." + }, + "yourPIN": { + "message": "Ваш PIN: $pin$", + "placeholders": {"pin":{"content":"$1"}} + }, + "tryAgain": { + "message": "Спробувати знову" + }, + "canceling": { + "message": "Скасування..." + }, + "cancelTweet": { + "message": "Скасувати твіт" + }, + "queued_messages": { + "message": "Повідомлення в черзі:" + }, + "queue_trying": { + "message": "намагаюся відправити вже $timediff$", + "placeholders": {"timediff":{"content":"$1"}} + }, + "queue_retried": { + "message": "$retries$ повторів за $timediff$ [$laststatus$]", + "placeholders": {"retries":{"content":"$1"},"timediff":{"content":"$2"},"laststatus":{"content":"$3"}} + }, + "ue_fetchingLists": { + "message": "Несподівана помилка $status$ при отриманні списку.", + "placeholders": {"status":{"content":"$1"}} + }, + "ue_updatingTweets": { + "message": "Несподівана помилка $baseError$ при оновленні твіту.", + "placeholders": {"baseError":{"content":"$1"}} + }, + "ue_updatingTweets2": { + "message": "Якщо ця помилка повторюється, спробуйте вийти та зайти знову." + }, + "ue_deletingTweet": { + "message": "Несподівана помилка $status$ видалення твіту.", + "placeholders": {"status":{"content":"$1"}} + }, + "ue_retweeting": { + "message": "Несподівана помилка $status$ ретвіту.", + "placeholders": {"status":{"content":"$1"}} + }, + "ue_markFavorite": { + "message": "Несподівана помилка $status$ при додаванні в вибране.", + "placeholders": {"status":{"content":"$1"}} + }, + "ue_unmarkFavorite": { + "message": "Несподівана помилка $status$ при видаленні з обраного.", + "placeholders": {"status":{"content":"$1"}} + }, + "newTweets": { + "message": "$newtweets$: $count$", + "placeholders": {"count":{"content":"$1"},"newtweets":{"content":"$2"}} + }, + "newtweets_singular": { + "message": "Нових твітів" + }, + "newtweets_plural": { + "message": "Нових твітів" + }, + "btnAuthorize": { + "message": "Авторизуйтесь!" + }, + "exceededAPIHits": { + "message": "Ви перевищили ліміт API. Будь ласка, перегляньте налаштування інтервалів оновлення в налаштуваннях. Chromed Bird не буде оновлювати до $nextResetDate$ $nextResetTime$.", + "placeholders": {"options_url":{"content":"$1"},"nextResetDate":{"content":"$2"},"nextResetTime":{"content":"$3"}} + }, + "warningAPIHits": { + "message": "Гей! Ліміт звернень до API настає дуже швидко.
Будь ласка, перегляньте налаштування інтервалів оновлення в налаштуваннях. Зверніть увагу, що якщо ви використовуєте кілька Twitter клієнтів вони мають загальний ліміт.
Залишилося звернень: $remainingHits$ - Наступний скидання: $nextResetDate$ $nextResetTime$", + "placeholders": {"options_url":{"content":"$1"},"remainingHits":{"content":"$2"},"nextResetDate":{"content":"$3"},"nextResetTime":{"content":"$4"}} + }, + "oAuthError": { + "message": "Під час перевірки автентичності виникла помилка: $errorMessage$. Будь ласка, натисніть щоб повторити процес", + "placeholders": {"errorMessage":{"content":"$1"}} + }, + "justNow": { + "message": "тільки що" + }, + "minuteAgo": { + "message": "менше хвилини тому" + }, + "minutes": { + "message": "$nr_of_minutes$ $minutes$ тому", + "placeholders": {"nr_of_minutes":{"content":"$1"},"minutes":{"content":"$2","example":"minute or minutes (singular / plural)"}} + }, + "minute_singular": { + "message": "хвилини" + }, + "minute_plural": { + "message": "хвилин" + }, + "timeAgo": { + "message": "близько $time$ $time_string$ тому", + "placeholders": {"time":{"content":"$1"},"time_string":{"content":"$2"}} + }, + "hour_singular": { + "message": "години" + }, + "hour_plural": { + "message": "годин" + }, + "day_singular": { + "message": "день" + }, + "day_plural": { + "message": "днів" + }, + "month_singular": { + "message": "місяць" + }, + "month_plural": { + "message": "місяців" + }, + "yearsAgo": { + "message": "років тому" + }, + "options_title": { + "message": "Налаштування Chromed Bird" + }, + "conf_saved": { + "message": "Ваші налаштування успішно збережені!" + }, + "changes_restart": { + "message": "Однак, деякі зміни вимагають перезапуску розширення. Зробити це зараз?
(Це скине лічильник непрочитаних твітів.)" + }, + "remaining_api_hits": { + "message": "Залишилося звернень до Twitter API:" + }, + "rate_limit_reset": { + "message": "Скидання лімітів:" + }, + "nerds_link": { + "message": "Статистика звернень до API (для ботанів)" + }, + "g_ui": { + "message": "Інтерфейс" + }, + "l_name_attribute": { + "message": "Ім'я в твіти:" + }, + "o_screen_name": { + "message": "Ім'я користувача (nickname)" + }, + "o_name": { + "message": "Справжнє ім'я" + }, + "o_both": { + "message": "Обидва імені" + }, + "l_compose_position": { + "message": "Положення поля вводу:" + }, + "o_top": { + "message": "Зверху" + }, + "o_bottom": { + "message": "Знизу" + }, + "l_theme": { + "message": "Тема:" + }, + "l_font_size": { + "message": "Розмір шрифту:" + }, + "o_small": { + "message": "Маленький" + }, + "o_normal": { + "message": "Нормальний" + }, + "o_large": { + "message": "Великий" + }, + "o_extra_large": { + "message": "Дуже великий" + }, + "l_font_family": { + "message": "Шрифт:" + }, + "l_hover_timeout": { + "message": "Час читання (мс):" + }, + "l_show_expanded_urls": { + "message": "Розгортати короткі посилання:" + }, + "l_reply_all": { + "message": "Відповідати всім згаданим:" + }, + "l_show_hits_in_popup": { + "message": "Показувати кількість звернень до API:" + }, + "l_show_user_autocomplete": { + "message": "Автодополнять імена:" + }, + "l_icon_color": { + "message": "Колір іконки" + }, + "l_tweets_color_only_unified": { + "message": "Кольори тільки в загальній стрічці:" + }, + "l_tweet_color": { + "message": "Колір твіту:" + }, + "w_Mentions": { + "message": "Згадки" + }, + "btn_reset_popup_size": { + "message": "Скинути розмір вікна" + }, + "g_notifications": { + "message": "Закладки" + }, + "l_tweet_notification": { + "message": "Повідомлення про твіти" + }, + "l_change_icon": { + "message": "Змінити іконку" + }, + "notif_home": { + "message": "Головна:" + }, + "notif_mentions": { + "message": "Згадки:" + }, + "notif_dms": { + "message": "Приватні:" + }, + "notif_lists": { + "message": "Списки:" + }, + "notif_search": { + "message": "Пошук:" + }, + "l_tweets_notification_style": { + "message": "Стиль оповіщень:" + }, + "l_noti_on_page": { + "message": "Закладки на сторінці" + }, + "l_noti_desktop": { + "message": "На робочому столі" + }, + "l_notification_fade_timeout": { + "message": "Таймаут оповіщення (с):" + }, + "g_shortener": { + "message": "Сокращатель" + }, + "l_url_shortener": { + "message": "Сокращатель посилань:" + }, + "l_shortener_acct": { + "message": "Використовувати особистий аккаунт?" + }, + "l_shortener_login": { + "message": "API Login:" + }, + "l_shortener_key": { + "message": "API Key:" + }, + "l_share_include_title": { + "message": "Включати назву сторінки (поділитися):" + }, + "g_timelines": { + "message": "Стрічки" + }, + "notice_api_hits": { + "message": "Ви повинні тримати число звернень до API нижче ! Інакше Chromed Bird перестане працювати і стрічки не будуть оновлюватися.
Пам'ятайте, якщо ви використовуєте кілька Twitter клієнтів, ви повинні тримати число звернень ще нижче." + }, + "l_hits_notice": { + "message": "Звернень до API на годину:" + }, + "l_visible": { + "message": "Показувати" + }, + "l_refresh_interval": { + "message": "Інтервал оновлення (с)" + }, + "l_include_in_unified": { + "message": "Включати в загальну стрічку" + }, + "l_tabs_count": { + "message": "Число закладок" + }, + "l_unified_timeline": { + "message": "Загальна стрічка:" + }, + "tml_favorites": { + "message": "Вибране:" + }, + "l_blocked_users": { + "message": "Заблоковані користувачі:" + }, + "notice_right_click_change": { + "message": "* Гей, тепер ви можете натиснути правою кнопкою, щоб змінити більшість цих значень прямо зі спливаючого вікна. Просто забирайтеся звідси! :)" + }, + "l_tweets_per_page": { + "message": "Твітів на сторінці:" + }, + "l_max_cached_tweets": { + "message": "Максимум показаних твітів:" + }, + "g_microblogging_service": { + "message": "Служба мікроблогів" + }, + "g_advanced": { + "message": "Додаткові" + }, + "l_request_timeout": { + "message": "Таймаут запиту (мс):" + }, + "l_base_url": { + "message": "Twitter's API URL:" + }, + "l_base_oauth_url": { + "message": "OAuth URL:" + }, + "l_same_signing_urls": { + "message": "Same signing URLs:" + }, + "l_base_signing_url": { + "message": "API Signing URL:" + }, + "l_base_oauth_signing_url": { + "message": "OAuth Signing URL:" + }, + "l_base_search_url": { + "message": "Search API URL:" + }, + "btn_save": { + "message": "Зберегти" + }, + "btn_reset": { + "message": "Скинути" + }, + "btn_default": { + "message": "По-замовчуванню" + }, + "shortenIt": { + "message": "Скоротити!" + }, + "shorten_current": { + "message": "Поділитися поточною сторінкою" + }, + "_inf": { + "message": "", + "description": "Author" + }, + "_gen": { + "message": "Localizer, http://www.mixesoft.com/localizer.html", + "description": "Editor" + } +} \ No newline at end of file From 7bd2a8b3c40c6d4838534af03eb507ee0f6e0a89 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Sat, 23 Oct 2010 17:16:08 -0300 Subject: [PATCH 053/135] Fixing locale code folder and some escaping issues for Ukrainian translation. --- _locales/{ua => uk}/messages.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename _locales/{ua => uk}/messages.json (93%) diff --git a/_locales/ua/messages.json b/_locales/uk/messages.json similarity index 93% rename from _locales/ua/messages.json rename to _locales/uk/messages.json index 1d489f5f..7d87c22b 100644 --- a/_locales/ua/messages.json +++ b/_locales/uk/messages.json @@ -242,15 +242,15 @@ "message": "Авторизуйтесь!" }, "exceededAPIHits": { - "message": "Ви перевищили ліміт API. Будь ласка, перегляньте налаштування інтервалів оновлення в налаштуваннях. Chromed Bird не буде оновлювати до $nextResetDate$ $nextResetTime$.", + "message": "Ви перевищили ліміт API. Будь ласка, перегляньте налаштування інтервалів оновлення в налаштуваннях. Chromed Bird не буде оновлювати до $nextResetDate$ $nextResetTime$.", "placeholders": {"options_url":{"content":"$1"},"nextResetDate":{"content":"$2"},"nextResetTime":{"content":"$3"}} }, "warningAPIHits": { - "message": "Гей! Ліміт звернень до API настає дуже швидко.
Будь ласка, перегляньте налаштування інтервалів оновлення в налаштуваннях. Зверніть увагу, що якщо ви використовуєте кілька Twitter клієнтів вони мають загальний ліміт.
Залишилося звернень: $remainingHits$ - Наступний скидання: $nextResetDate$ $nextResetTime$", + "message": "Гей! Ліміт звернень до API настає дуже швидко.
Будь ласка, перегляньте налаштування інтервалів оновлення в налаштуваннях. Зверніть увагу, що якщо ви використовуєте кілька Twitter клієнтів вони мають загальний ліміт.
Залишилося звернень: $remainingHits$ - Наступний скидання: $nextResetDate$ $nextResetTime$", "placeholders": {"options_url":{"content":"$1"},"remainingHits":{"content":"$2"},"nextResetDate":{"content":"$3"},"nextResetTime":{"content":"$4"}} }, "oAuthError": { - "message": "Під час перевірки автентичності виникла помилка: $errorMessage$. Будь ласка, натисніть щоб повторити процес", + "message": "Під час перевірки автентичності виникла помилка: $errorMessage$. Будь ласка, натисніть щоб повторити процес", "placeholders": {"errorMessage":{"content":"$1"}} }, "justNow": { @@ -445,7 +445,7 @@ "message": "Стрічки" }, "notice_api_hits": { - "message": "Ви повинні тримати число звернень до API нижче ! Інакше Chromed Bird перестане працювати і стрічки не будуть оновлюватися.
Пам'ятайте, якщо ви використовуєте кілька Twitter клієнтів, ви повинні тримати число звернень ще нижче." + "message": "Ви повинні тримати число звернень до API нижче ! Інакше Chromed Bird перестане працювати і стрічки не будуть оновлюватися.
Пам'ятайте, якщо ви використовуєте кілька Twitter клієнтів, ви повинні тримати число звернень ще нижче." }, "l_hits_notice": { "message": "Звернень до API на годину:" From 5e033325611d55f9dd641d552ebf620e5d110929 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Sat, 23 Oct 2010 18:32:25 -0300 Subject: [PATCH 054/135] Getting ready for Snowflake --- lib/twitter_lib.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/lib/twitter_lib.js b/lib/twitter_lib.js index bd29078b..f8cad038 100755 --- a/lib/twitter_lib.js +++ b/lib/twitter_lib.js @@ -142,6 +142,21 @@ TwitterLib.prototype = { normalizeTweets: function(tweets) { for(var i = 0, len = tweets.length; i < len; ++i) { var ti = tweets[i]; + + // Damn Snowflake... Damn 53 bits precision limit... + if(ti.id_str) { + ti.id = ti.id_str; + } + if(ti.in_reply_to_status_id_str) { + ti.in_reply_to_status_id = ti.in_reply_to_status_id_str; + } + if(ti.in_reply_to_user_id_str) { + ti.in_reply_to_user_id = ti.in_reply_to_user_id_str; + } + if(ti.current_user_retweet_id_str) { + ti.current_user_retweet_id = ti.current_user_retweet_id_str; + } + if(!ti.user) { // DMs ti.user = ti.sender; From fd04d79a3db38feb7005bb5fe4316dfefcaafb95 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Wed, 27 Oct 2010 00:16:38 -0300 Subject: [PATCH 055/135] Hardcoding maximum popup width. --- popup.html | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/popup.html b/popup.html index 6f3453c7..7f2c97b4 100644 --- a/popup.html +++ b/popup.html @@ -213,6 +213,14 @@ } width = width || 490; height = height || 400; + var minWidth = 450; + var maxWidth = 800 - 14; + if(width > maxWidth) { + width = maxWidth; + } + if(width < minWidth) { + width = minWidth; + } if(autoFitWidth) { setTimeout(function() { var tabsBarWidth = 0; @@ -232,18 +240,6 @@ popupSizeData: Persistence.popupSize(), - setMinMaxWidth: function(width, height) { - var minWidth = 450; - var maxWidth = window.innerWidth - 14; - if(width > maxWidth) { - width = maxWidth; - } - if(width < minWidth) { - width = minWidth; - } - ThemeManager.setPopupSize(width, height); - }, - initWindowResizing: function() { ThemeManager.handleWindowResizing(); if(!ThemeManager.isPopup) { @@ -255,10 +251,6 @@ resizeFunc(); return; } - setTimeout(function() { - // Delay the execution of this code to allow the window to resize first. - ThemeManager.setMinMaxWidth($(".timeline").width(), $(".timeline").height()); - }, 1000); $(".timeline").resizable({ handles: 'e, s, se', minWidth: 450, @@ -268,7 +260,6 @@ }, stop: function(e, ui) { var $this = $(this); - ThemeManager.setMinMaxWidth($this.width(), $this.height()); ThemeManager.popupSizeData.save($this.width() + 'x' + $this.height()); } }); @@ -1539,7 +1530,6 @@ } $(function() { - $("input.i18n").each(function() { $(this).val(chrome.i18n.getMessage(this.id)); }); From 5a007b16b4d3e6b6ac48cf8cdc19baab67339640 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Wed, 27 Oct 2010 00:55:41 -0300 Subject: [PATCH 056/135] Updating version to 1.9.5.1 --- Changelog | 10 ++++++++++ manifest.json | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Changelog b/Changelog index f4f95cb6..b9517e55 100644 --- a/Changelog +++ b/Changelog @@ -1,3 +1,13 @@ +1.9.5.1 (2010-10-26) + +* New Ukrainian translation (Thanks usercard!); +* Improved Turkish translation (Thanks Onur Baykaş!); +* Fixed some resizing bugs that caused the layout to go insane; +* Changed the behavior of middle clicks in users to just open their profile + (Left clicks or right clicks still open the action menu.); +* Fixed a memory leak caused by adding listeners to the same event multiple times; +* Getting ready to Snowflake (Twitter's new id generator) by using _str ids. + 1.9.5 (2010-10-21) * Showing a inline menu with different actions after clicking user's names or avatars diff --git a/manifest.json b/manifest.json index 46ee573e..d468f7e9 100755 --- a/manifest.json +++ b/manifest.json @@ -1,6 +1,6 @@ { "name": "Chromed Bird", - "version": "1.9.5", + "version": "1.9.5.1", "description": "__MSG_extDescription__", "default_locale": "en", "browser_action": { From a335c5f655b235994d26e6b7b7479eb48c252fe2 Mon Sep 17 00:00:00 2001 From: usercard Date: Wed, 27 Oct 2010 21:52:48 +0300 Subject: [PATCH 057/135] Polished Ukrainian translation as for today --- _locales/uk/messages.json | 239 +++++++++++++++++++++++++++++--------- 1 file changed, 182 insertions(+), 57 deletions(-) diff --git a/_locales/uk/messages.json b/_locales/uk/messages.json index 7d87c22b..8f60d855 100644 --- a/_locales/uk/messages.json +++ b/_locales/uk/messages.json @@ -48,22 +48,22 @@ "message": "Додати" }, "selectList": { - "message": "- списки -" + "message": "Виберіть список" }, "updateList": { - "message": "Поновлюю списки..." + "message": "Оновлюю списки..." }, "w_Unified": { "message": "Загальна" }, "w_Home": { - "message": "Home" + "message": "Домашня" }, "w_DM": { - "message": "DMs" + "message": "Приватні" }, "w_Favorites": { - "message": "Обране" + "message": "Обрані" }, "w_Lists": { "message": "Списки" @@ -120,15 +120,15 @@ "message": "Запросити інший ключ" }, "shortenerIdleString": { - "message": "Наберіть посилання для скорочення, або натисніть сюди →" + "message": "Наберіть посилання для скорочення, або натисніть сюди \u2192" }, "timelineHome": { - "message": "Home", - "description": "The home time line tab" + "message": "Домашня", + "description": "Головна закладка повідомлень" }, "timelineDM": { - "message": "DM", - "description": "The direct message time line tab" + "message": "Приватні", + "description": "Закладка прямих приватних повідомлень" }, "timelineFavorites": { "message": "Вибране", @@ -142,10 +142,17 @@ }, "newTweetsAvailable": { "message": "Нових твітів: $count$. Оновити зараз.", - "placeholders": {"count":{"content":"$1"},"tweets":{"content":"$2"}} + "placeholders":{ + "count": { + "content": "$1" + }, + "tweets": { + "content": "$2" + } + } }, "preventClosing": { - "message": "Клацніть правою для запобігання закриття." + "message": "Клацніть для запобігання закриття." }, "changeNotificationSettings": { "message": "Ви можете змінити налаштування сповіщень на сторінці налаштувань" @@ -163,7 +170,7 @@ "message": "Вибачте, щось вийшло не так, спробуйте ще раз." }, "ajaxFailed": { - "message": "Збій запиту AJAX (погане з'єднання?)" + "message": "Зрив запиту AJAX (погане з'єднання?)" }, "successAuth": { "message": "Вітаємо, ви успішно увійшли в систему. Насолоджуйтесь Chromed Bird!" @@ -172,17 +179,21 @@ "message": "Chromed Bird авторизований!" }, "cbNotAuthorized": { - "message": "Упс... Щось пішло не так. Спробуйте натиснути на іконку Chromed Bird знову." + "message": "Гей... Щось пішло не так. Спробуйте натиснути на іконку Chromed Bird знову." }, "authorizing": { "message": "Будь ласка, почекайте, авторизації Chromed Bird..." }, "yourPIN": { "message": "Ваш PIN: $pin$", - "placeholders": {"pin":{"content":"$1"}} + "placeholders": { + "pin":{ + "content": "$1" + } + } }, "tryAgain": { - "message": "Спробувати знову" + "message": "Спробуйте знову" }, "canceling": { "message": "Скасування..." @@ -195,63 +206,135 @@ }, "queue_trying": { "message": "намагаюся відправити вже $timediff$", - "placeholders": {"timediff":{"content":"$1"}} + "placeholders": { + "timediff": { + "content": "$1" + } + } }, "queue_retried": { "message": "$retries$ повторів за $timediff$ [$laststatus$]", - "placeholders": {"retries":{"content":"$1"},"timediff":{"content":"$2"},"laststatus":{"content":"$3"}} + "placeholders":{ + "retries": { + "content": "$1" + }, + "timediff": { + "content": "$2" + }, + "laststatus": { + "content": "$3" + } + } }, "ue_fetchingLists": { "message": "Несподівана помилка $status$ при отриманні списку.", - "placeholders": {"status":{"content":"$1"}} + "placeholders": { + "status": { + "content": "$1" + } + } }, "ue_updatingTweets": { "message": "Несподівана помилка $baseError$ при оновленні твіту.", - "placeholders": {"baseError":{"content":"$1"}} + "placeholders": { + "baseError": { + "content": "$1" + } + } }, "ue_updatingTweets2": { "message": "Якщо ця помилка повторюється, спробуйте вийти та зайти знову." }, "ue_deletingTweet": { "message": "Несподівана помилка $status$ видалення твіту.", - "placeholders": {"status":{"content":"$1"}} + "placeholders": { + "status": { + "content": "$1" + } + } }, "ue_retweeting": { "message": "Несподівана помилка $status$ ретвіту.", - "placeholders": {"status":{"content":"$1"}} + "placeholders": { + "status": { + "content": "$1" + } + } }, "ue_markFavorite": { - "message": "Несподівана помилка $status$ при додаванні в вибране.", - "placeholders": {"status":{"content":"$1"}} + "message": "Несподівана помилка $status$ при додаванні в обране.", + "placeholders": { + "status": { + "content": "$1" + } + } }, "ue_unmarkFavorite": { "message": "Несподівана помилка $status$ при видаленні з обраного.", - "placeholders": {"status":{"content":"$1"}} + "placeholders": { + "status": { + "content": "$1" + } + } }, "newTweets": { "message": "$newtweets$: $count$", - "placeholders": {"count":{"content":"$1"},"newtweets":{"content":"$2"}} + "placeholders":{ + "count": { + "content": "$1" + }, + "newtweets": { + "content": "$2" + } + } }, "newtweets_singular": { - "message": "Нових твітів" + "message": "Новий твіт" }, "newtweets_plural": { "message": "Нових твітів" }, "btnAuthorize": { - "message": "Авторизуйтесь!" + "message": "Завторизуйтеся!" }, "exceededAPIHits": { "message": "Ви перевищили ліміт API. Будь ласка, перегляньте налаштування інтервалів оновлення в налаштуваннях. Chromed Bird не буде оновлювати до $nextResetDate$ $nextResetTime$.", - "placeholders": {"options_url":{"content":"$1"},"nextResetDate":{"content":"$2"},"nextResetTime":{"content":"$3"}} + "placeholders": { + "options_url": { + "content": "$1" + }, + "nextResetDate": { + "content": "$2" + }, + "nextResetTime": { + "content": "$3" + } + } }, "warningAPIHits": { - "message": "Гей! Ліміт звернень до API настає дуже швидко.
Будь ласка, перегляньте налаштування інтервалів оновлення в налаштуваннях. Зверніть увагу, що якщо ви використовуєте кілька Twitter клієнтів вони мають загальний ліміт.
Залишилося звернень: $remainingHits$ - Наступний скидання: $nextResetDate$ $nextResetTime$", - "placeholders": {"options_url":{"content":"$1"},"remainingHits":{"content":"$2"},"nextResetDate":{"content":"$3"},"nextResetTime":{"content":"$4"}} + "message": "Гей! Ліміт звернень до API настає дуже швидко.
Будь ласка, перегляньте налаштування інтервалів оновлення в налаштуваннях. Зверніть увагу, що якщо ви використовуєте кілька Twitter клієнтів вони мають загальний ліміт.
Залишилося звернень: $remainingHits$ - Наступне скидання оновлень: $nextResetDate$ $nextResetTime$", + "placeholders": { + "options_url": { + "content": "$1" + }, + "remainingHits": { + "content": "$2" + }, + "nextResetDate": { + "content": "$3" + }, + "nextResetTime": { + "content": "$4" + } + } }, "oAuthError": { "message": "Під час перевірки автентичності виникла помилка: $errorMessage$. Будь ласка, натисніть щоб повторити процес", - "placeholders": {"errorMessage":{"content":"$1"}} + "placeholders": { + "errorMessage": { + "content": "$1" + } + } }, "justNow": { "message": "тільки що" @@ -261,23 +344,38 @@ }, "minutes": { "message": "$nr_of_minutes$ $minutes$ тому", - "placeholders": {"nr_of_minutes":{"content":"$1"},"minutes":{"content":"$2","example":"minute or minutes (singular / plural)"}} + "placeholders": { + "nr_of_minutes":{ + "content": "$1" + }, + "minutes": { + "content": "$2", + "example": "хвилина або хвилини (єдиного і множинного числа)" + } + } }, "minute_singular": { - "message": "хвилини" + "message": "хвилин" }, "minute_plural": { - "message": "хвилин" + "message": "хвилини" }, "timeAgo": { "message": "близько $time$ $time_string$ тому", - "placeholders": {"time":{"content":"$1"},"time_string":{"content":"$2"}} + "placeholders": { + "time": { + "content": "$1" + }, + "time_string": { + "content": "$2" + } + } }, "hour_singular": { - "message": "години" + "message": "година" }, "hour_plural": { - "message": "годин" + "message": "години" }, "day_singular": { "message": "день" @@ -307,10 +405,10 @@ "message": "Залишилося звернень до Twitter API:" }, "rate_limit_reset": { - "message": "Скидання лімітів:" + "message": "Скидання лімітів оновлення:" }, "nerds_link": { - "message": "Статистика звернень до API (для ботанів)" + "message": "Статистика звернень до API (для заучок)" }, "g_ui": { "message": "Інтерфейс" @@ -337,7 +435,7 @@ "message": "Знизу" }, "l_theme": { - "message": "Тема:" + "message": "Тема інтерфейсу:" }, "l_font_size": { "message": "Розмір шрифту:" @@ -370,10 +468,10 @@ "message": "Показувати кількість звернень до API:" }, "l_show_user_autocomplete": { - "message": "Автодополнять імена:" + "message": "Автоматичне доповнення імен:" }, "l_icon_color": { - "message": "Колір іконки" + "message": "Колір іконки:" }, "l_tweets_color_only_unified": { "message": "Кольори тільки в загальній стрічці:" @@ -388,7 +486,7 @@ "message": "Скинути розмір вікна" }, "g_notifications": { - "message": "Закладки" + "message": "Сповіщення" }, "l_tweet_notification": { "message": "Повідомлення про твіти" @@ -396,6 +494,9 @@ "l_change_icon": { "message": "Змінити іконку" }, + "l_icon_color": { + "message": "Колір іконки" + }, "notif_home": { "message": "Головна:" }, @@ -412,22 +513,25 @@ "message": "Пошук:" }, "l_tweets_notification_style": { - "message": "Стиль оповіщень:" + "message": "Стиль сповіщень:" }, "l_noti_on_page": { - "message": "Закладки на сторінці" + "message": "Сповіщення на сторінці" }, "l_noti_desktop": { - "message": "На робочому столі" + "message": "Сповіщення на робочому столі" }, "l_notification_fade_timeout": { - "message": "Таймаут оповіщення (с):" + "message": "Таймаут сповіщення (сек):" + }, + "l_notification_max_popups": { + "message": "Сповіщень одразу (-1: всі):" }, "g_shortener": { - "message": "Сокращатель" + "message": "Скорочувач" }, "l_url_shortener": { - "message": "Сокращатель посилань:" + "message": "Скорочувач посилань:" }, "l_shortener_acct": { "message": "Використовувати особистий аккаунт?" @@ -466,7 +570,7 @@ "message": "Загальна стрічка:" }, "tml_favorites": { - "message": "Вибране:" + "message": "Обране:" }, "l_blocked_users": { "message": "Заблоковані користувачі:" @@ -481,10 +585,10 @@ "message": "Максимум показаних твітів:" }, "g_microblogging_service": { - "message": "Служба мікроблогів" + "message": "Сервіси мікроблогів" }, "g_advanced": { - "message": "Додаткові" + "message": "Додаткові налаштування" }, "l_request_timeout": { "message": "Таймаут запиту (мс):" @@ -514,7 +618,7 @@ "message": "Скинути" }, "btn_default": { - "message": "По-замовчуванню" + "message": "За-замовчуванням" }, "shortenIt": { "message": "Скоротити!" @@ -522,12 +626,33 @@ "shorten_current": { "message": "Поділитися поточною сторінкою" }, + "tweet_send_error": { + "message": "Сталася помилка при спробі відправити твіт. Можливо Twitter перевантажений? Спробуйте знову, але будь ласка, перевірте ваш акаунт, щоб запобігти дубльованню повідомлень." + }, + "detach_window": { + "message": "Відкріпити вікно" + }, + "follow_action": { + "message": "Слідувати" + }, + "unfollow_action": { + "message": "Не слідувати" + }, + "tweets_action": { + "message": "Твіти" + }, + "profile_action": { + "message": "Профайл" + }, + "add_mention_action": { + "message": "Згадка" + } "_inf": { - "message": "", - "description": "Author" + "message": "Translated by Denis aka usercard", + "description": "" }, "_gen": { "message": "Localizer, http://www.mixesoft.com/localizer.html", - "description": "Editor" + "description": "Editor, Akelpad and WinMerge" } } \ No newline at end of file From a5e8c4f06094f229ba111d7ba863cdded860a0f1 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Thu, 28 Oct 2010 18:50:49 -0200 Subject: [PATCH 058/135] Missing comma in uk messages.json --- _locales/uk/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_locales/uk/messages.json b/_locales/uk/messages.json index 8f60d855..22d1672a 100644 --- a/_locales/uk/messages.json +++ b/_locales/uk/messages.json @@ -646,7 +646,7 @@ }, "add_mention_action": { "message": "Згадка" - } + }, "_inf": { "message": "Translated by Denis aka usercard", "description": "" From 73bf00c4623911cf7ba311c8cdcd2df926dbe39a Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Mon, 1 Nov 2010 23:17:03 -0300 Subject: [PATCH 059/135] Refactoring image preview code and adding pict.mobi preview. --- background.html | 1 + lib/image_services.js | 46 +++++++++++++++++++++++++++++++++++++++++ lib/tweets_assembler.js | 20 +++--------------- popup.html | 1 + tweets_notifier.html | 1 + 5 files changed, 52 insertions(+), 17 deletions(-) create mode 100644 lib/image_services.js diff --git a/background.html b/background.html index 4969fd98..ebebf601 100644 --- a/background.html +++ b/background.html @@ -25,6 +25,7 @@ + + @@ -170,7 +171,7 @@ createdTimelines = template.createTimelines(); } } - for(var i in createdTimelines) { + for(var i = 0, len = createdTimelines.length; i < len; ++i) { var timeline = createdTimelines[i]; this.timelines[timeline.timelineId] = timeline; if(this.authenticated) { @@ -260,7 +261,7 @@ eachTimeline: function(callback, includeHidden) { for(var tId in this.timelines) { var timeline = this.timelines[tId]; - if(!includeHidden && !timeline.template.visible) { + if(!includeHidden && (!timeline.template.visible || timeline.template.hiddenTemplate)) { continue; } if(callback.call(tId, timeline) === false) { @@ -291,7 +292,7 @@ tId = retList[i]; if(tId) { timeline = this.timelines[tId]; - if(timeline.template.visible) { + if(timeline.template.visible && !timeline.template.hiddenTemplate) { var ret = callback.call(tId, timeline); if(ret === false) { break; @@ -561,7 +562,7 @@ } callback(success, data, status); }; - if(tweetTimelineId == TimelineTemplate.DMS) { + if(tweetTimelineId == TimelineTemplate.RECEIVED_DMS || tweetTimelineId == TimelineTemplate.SENT_DMS) { return this.twitterBackend.destroyDM(firstCallback, id); } else { return this.twitterBackend.destroy(firstCallback, id); diff --git a/lib/timeline_factory.js b/lib/timeline_factory.js index 5ed95ba4..b1b8751a 100644 --- a/lib/timeline_factory.js +++ b/lib/timeline_factory.js @@ -30,6 +30,21 @@ DefaultTimelineFactory.prototype = $.extend({}, TimelineFactory.prototype, { } }); +/* + Regular DM Timeline Factory +*/ +function DMTimelineFactory(template) { + TimelineFactory.call(this, template); +} +DMTimelineFactory.prototype = $.extend({}, TimelineFactory.prototype, { + create: function() { + if(this.template.visible || this.template.includeInUnified || TimelineTemplate.getTemplate(TimelineTemplate.DMS).visible) { + return [new TweetsTimeline(this.template.id, this.tweetManager, this.template)]; + } + return []; + } +}); + /* Favorites Timeline Factory */ @@ -54,7 +69,22 @@ function UnifiedTimelineFactory(template) { UnifiedTimelineFactory.prototype = $.extend({}, TimelineFactory.prototype, { create: function() { if(this.template.visible) { - return [new UnifiedTweetsTimeline(this.template.id, this.tweetManager, this.template)]; + return [new UnifiedTweetsTimeline(this.template.id, this.tweetManager, this.template, this.tweetManager.timelines)]; + } + return []; + } +}); + +/* + DMs Unified Timeline Factory +*/ +function UnifiedDMsTimelineFactory(template) { + TimelineFactory.call(this, template); +} +UnifiedDMsTimelineFactory.prototype = $.extend({}, TimelineFactory.prototype, { + create: function() { + if(this.template.visible || this.template.includeInUnified) { + return [new UnifiedDMsTweetsTimeline(this.template.id, this.tweetManager, this.template, this.tweetManager.timelines)]; } return []; } diff --git a/lib/timeline_template.js b/lib/timeline_template.js index 290d7c42..c9cc57ae 100644 --- a/lib/timeline_template.js +++ b/lib/timeline_template.js @@ -1,22 +1,22 @@ function TimelineTemplate(timelineTemplateId, tweetManager) { this.setVisible = function(visible) { this.visible = visible; - OptionsBackend.saveOption(this.id + '_visible', this.visible); + OptionsBackend.saveOption(this.optionsPrefix + '_visible', this.visible); }; this.setIncludeInUnified = function(includeInUnified) { this.includeInUnified = includeInUnified; - OptionsBackend.saveOption(this.id + '_include_unified', this.includeInUnified); + OptionsBackend.saveOption(this.optionsPrefix + '_include_unified', this.includeInUnified); }; this.setShowOnPageNotification = function(showNotification) { this.showOnPageNotification = showNotification; - OptionsBackend.saveOption(this.id + '_on_page', this.showOnPageNotification); + OptionsBackend.saveOption(this.optionsPrefix + '_on_page', this.showOnPageNotification); }; this.setShowIconNotification = function(showIconChange) { this.showIconNotification = showIconChange; - OptionsBackend.saveOption(this.id + '_icon', this.showIconNotification); + OptionsBackend.saveOption(this.optionsPrefix + '_icon', this.showIconNotification); }; this.getUserData = function() { @@ -28,23 +28,25 @@ function TimelineTemplate(timelineTemplateId, tweetManager) { this.setUserData = function(data) { this.userData = JSON.stringify(data); - OptionsBackend.saveOption(this.id + '_user_data', this.userData); + OptionsBackend.saveOption(this.optionsPrefix + '_user_data', this.userData); }; this.loadOptions = function() { - this.visible = OptionsBackend.get(this.id + '_visible'); - this.refreshInterval = OptionsBackend.get(this.id + '_refresh_interval'); - this.includeInUnified = OptionsBackend.get(this.id + '_include_unified') && OptionsBackend.get('unified_visible'); + this.visible = OptionsBackend.get(this.optionsPrefix + '_visible'); + this.refreshInterval = OptionsBackend.get(this.optionsPrefix + '_refresh_interval'); + this.includeInUnified = OptionsBackend.get(this.optionsPrefix + '_include_unified') && OptionsBackend.get('unified_visible'); - this.showIconNotification = OptionsBackend.get(this.id + '_icon'); - this.iconNotificationColor = OptionsBackend.get(this.id + '_color'); - this.showOnPageNotification = OptionsBackend.get(this.id + '_on_page'); - this.userData = OptionsBackend.get(this.id + '_user_data'); + this.showIconNotification = OptionsBackend.get(this.optionsPrefix + '_icon'); + this.iconNotificationColor = OptionsBackend.get(this.optionsPrefix + '_color'); + this.showOnPageNotification = OptionsBackend.get(this.optionsPrefix + '_on_page'); + this.userData = OptionsBackend.get(this.optionsPrefix + '_user_data'); + this.overlayColor = OptionsBackend.get(this.optionsPrefix + '_tweets_color'); }; this.initTemplate = function() { this.loadOptions(); this.multipleTimelines = false; + this.hiddenTemplate = false; switch(this.id) { case TimelineTemplate.UNIFIED: @@ -63,8 +65,19 @@ function TimelineTemplate(timelineTemplateId, tweetManager) { break; case TimelineTemplate.DMS: this.timelineName = chrome.i18n.getMessage("w_DM"); + this.factory = new UnifiedDMsTimelineFactory(this); + break; + case TimelineTemplate.SENT_DMS: + this.hiddenTemplate = true; + this.timelineName = chrome.i18n.getMessage("w_SentDM"); + this.templatePath = 'direct_messages/sent'; + this.factory = new DMTimelineFactory(this); + break; + case TimelineTemplate.RECEIVED_DMS: + this.hiddenTemplate = true; + this.timelineName = chrome.i18n.getMessage("w_ReceivedDM"); this.templatePath = 'direct_messages'; - this.factory = new DefaultTimelineFactory(this); + this.factory = new DMTimelineFactory(this); break; case TimelineTemplate.FAVORITES: this.timelineName = chrome.i18n.getMessage("w_Favorites"); @@ -100,6 +113,11 @@ function TimelineTemplate(timelineTemplateId, tweetManager) { }; this.id = timelineTemplateId; + this.optionsPrefix = this.id; + if(this.id == TimelineTemplate.SENT_DMS || this.id == TimelineTemplate.RECEIVED_DMS) { + this.optionsPrefix = TimelineTemplate.DMS; + } + this.tweetManager = tweetManager; this._templateUniqueId = 0; @@ -110,6 +128,8 @@ $.extend(TimelineTemplate, { HOME: 'home', MENTIONS: 'mentions', DMS: 'dms', + SENT_DMS: 'sentdms', + RECEIVED_DMS: 'receiveddms', FAVORITES: 'favorites', LISTS: 'lists', SEARCH: 'search' @@ -118,8 +138,8 @@ $.extend(TimelineTemplate, { /* 'Class' methods */ TimelineTemplate.initTemplates = function(tweetManager) { this.timelineNames = [TimelineTemplate.UNIFIED, TimelineTemplate.HOME, TimelineTemplate.MENTIONS, - TimelineTemplate.DMS, TimelineTemplate.FAVORITES, TimelineTemplate.LISTS, - TimelineTemplate.SEARCH]; + TimelineTemplate.DMS, TimelineTemplate.SENT_DMS, TimelineTemplate.RECEIVED_DMS, + TimelineTemplate.FAVORITES, TimelineTemplate.LISTS, TimelineTemplate.SEARCH]; this.timelineTemplates = {}; this.tweetManager = tweetManager; for(var i = 0, len = this.timelineNames.length; i < len; ++i) { @@ -132,9 +152,13 @@ TimelineTemplate.initAfterAuthentication = function() { TimelineTemplate.getTemplate = function(templateId) { return this.timelineTemplates[templateId]; }; -TimelineTemplate.eachTimelineTemplate = function(callback) { +TimelineTemplate.eachTimelineTemplate = function(callback, includeHidden) { for(var i = 0, len = this.timelineNames.length; i < len; ++i) { - var ret = callback(this.timelineTemplates[this.timelineNames[i]]); + var template = this.timelineTemplates[this.timelineNames[i]]; + if(template.hiddenTemplate && !includeHidden) { + continue; + } + var ret = callback(template); if(ret === false) break; } }; diff --git a/lib/timelines/unified_dms_timeline.js b/lib/timelines/unified_dms_timeline.js new file mode 100644 index 00000000..f66e86ed --- /dev/null +++ b/lib/timelines/unified_dms_timeline.js @@ -0,0 +1,14 @@ +function UnifiedDMsTweetsTimeline(timelineId, manager, template, timelines) { + UnifiedTweetsTimeline.call(this, timelineId, manager, template, timelines); +} + +$.extend(UnifiedDMsTweetsTimeline.prototype, UnifiedTweetsTimeline.prototype, { + /* overridden */ + _shouldIncludeTemplate: function(template) { + return template.id == TimelineTemplate.RECEIVED_DMS || template.id == TimelineTemplate.SENT_DMS; + } +}); + + + + \ No newline at end of file diff --git a/lib/timelines/unified_timeline.js b/lib/timelines/unified_timeline.js index f4405074..4dc2d2d6 100644 --- a/lib/timelines/unified_timeline.js +++ b/lib/timelines/unified_timeline.js @@ -1,6 +1,6 @@ -function UnifiedTweetsTimeline(timelineId, manager, template) { +function UnifiedTweetsTimeline(timelineId, manager, template, timelines) { TweetsTimeline.call(this, timelineId, manager, template); - this.timelines = manager.timelines; + this.timelines = timelines; this.currentPage = 0; } @@ -8,14 +8,30 @@ $.extend(UnifiedTweetsTimeline.prototype, TweetsTimeline.prototype, { /* overridden */ init: function() { TimelineTemplate.reloadOptions(); + var _this = this; + TimelineTemplate.eachTimelineTemplate(function(template) { + if(_this._shouldIncludeTemplate(template)) { + TweetManager.instance.createTimelineTemplate(template, true); + } + }, true); }, /* overridden */ remove: function() { this.template.setVisible(false); - this.killTimeline(); - TimelineTemplate.reloadOptions(); - return true; + if(!this.template.includeInUnified) { + this.killTimeline(); + this._eachTimeline(function(timeline) { + if(!timeline.template.visible) { + var timelineId = timeline.timelineId; + timeline.killTimeline(); + delete this.timelines[timelineId]; + } + }); + TimelineTemplate.reloadOptions(); + return true; + } + return false; }, /* overridden */ @@ -89,6 +105,9 @@ $.extend(UnifiedTweetsTimeline.prototype, TweetsTimeline.prototype, { maxBeforeDate = date; maxBeforeTweet = tweet; maxBeforeTweet.timelineId = timelineId; + if(!maxBeforeTweet.originalTimelineId) { + maxBeforeTweet.originalTimelineId = timelineId; + } } } }; @@ -234,7 +253,7 @@ $.extend(UnifiedTweetsTimeline.prototype, TweetsTimeline.prototype, { _eachTimeline: function(callback) { for(var tId in this.timelines) { var timeline = this.timelines[tId]; - if(timeline.template.includeInUnified) { + if(this._shouldIncludeTemplate(timeline.template)) { if(callback.call(this, timeline) === false) break; } @@ -244,11 +263,15 @@ $.extend(UnifiedTweetsTimeline.prototype, TweetsTimeline.prototype, { _countTimelines: function() { var count = 0; this._eachTimeline(function(timeline) { - if(timeline.template.includeInUnified) { + if(this._shouldIncludeTemplate(timeline.template)) { ++count; } }); return count; + }, + + _shouldIncludeTemplate: function(template) { + return template.includeInUnified && !template.hiddenTemplate; } }); diff --git a/lib/tweets_assembler.js b/lib/tweets_assembler.js index 27b047f1..5f585468 100755 --- a/lib/tweets_assembler.js +++ b/lib/tweets_assembler.js @@ -261,7 +261,7 @@ var Renderer = { var tweetTimeline = 'home'; if(!this.isOnPage()) { - tweetTimeline = tweet.timelineId || tweetManager.currentTimelineId; + tweetTimeline = tweet.originalTimelineId || tweet.timelineId || tweetManager.currentTimelineId; } var templateId = tweetTimeline.replace(/_.*$/, ''); @@ -337,7 +337,7 @@ var Renderer = { var overlayStyle = ''; if(this.isComplete() && useColors) { - overlayStyle = 'background-color: ' + OptionsBackend.get(templateId + '_tweets_color') + ';'; + overlayStyle = 'background-color: ' + TimelineTemplate.getTemplate(templateId).overlayColor + ';'; } var overlay = Renderer.makeDiv({'class': "tweet_overlay", style: overlayStyle}); container.appendChild(overlay); @@ -417,6 +417,18 @@ var Renderer = { fromSpan.appendChild(from); footer.appendChild(fromSpan); } + + if(templateId == TimelineTemplate.SENT_DMS) { + var recipientUsername = Renderer.makeElem("a", {href: '#'}); + Renderer.createUserActionMenu(recipientUsername, tweet.recipient.screen_name); + recipientUsername.appendChild(Renderer.makeText(tweet.recipient.name)); + + var recipientSpan = Renderer.makeElem("span"); + recipientSpan.appendChild(Renderer.makeText(chrome.i18n.getMessage("sentTo") + ' ')); + recipientSpan.appendChild(recipientUsername); + footer.appendChild(recipientSpan); + } + if(geo) { var geoSpan = Renderer.makeElem("span", {'class':"geo_tag"}); geoSpan.appendChild(Renderer.makeText(" ")); @@ -442,7 +454,7 @@ var Renderer = { if(!this.isNotification()) { var actions = Renderer.makeDiv({'class':"new_actions"}); var str = ""; - if(templateId != TimelineTemplate.DMS) { + if(templateId != TimelineTemplate.RECEIVED_DMS && templateId != TimelineTemplate.SENT_DMS) { if(tweet.favorited) { str += '
'; diff --git a/popup.html b/popup.html index b15cd28d..b4ea49bf 100644 --- a/popup.html +++ b/popup.html @@ -457,7 +457,7 @@ var user = $(".user", node).attr('screen_name'); var timelineId = $(node).attr('timelineid'); - if(timelineId == "dms") { + if(timelineId == TimelineTemplate.RECEIVED_DMS || timelineId == TimelineTemplate.SENT_DMS) { textArea.val("d " + user + " "); Composer.textareaChanged(); return; From c29d05cf2683da8833ae6647d09ddee2d7c34257 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Mon, 8 Nov 2010 21:06:21 -0300 Subject: [PATCH 067/135] Correctly updating timeline after sending a DM --- lib/send_queue.js | 7 ++++--- popup.html | 12 ++++++++---- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/lib/send_queue.js b/lib/send_queue.js index f829c09b..5ae39c39 100644 --- a/lib/send_queue.js +++ b/lib/send_queue.js @@ -8,6 +8,7 @@ function SendQueue(twitterBackend) { this.onTweetSentCallback = null; this.onSendFailedCallback = null; this.abortedQueue = null; + this.lastSent = null; } SendQueue.prototype = { enqueueTweet: function(message, replyId, replyUser) { @@ -52,7 +53,7 @@ SendQueue.prototype = { if(callbackFunc) { try { var args = Array.prototype.slice.call(arguments); - callbackFunc.apply(this, args.slice(1, args.length - 1)); + callbackFunc.apply(this, args.slice(1, args.length)); } catch(e) { /* ignoring */ } @@ -70,13 +71,13 @@ SendQueue.prototype = { _unqueueTweet: function() { if(this.queue.length > 0) { - this.queue.splice(0, 1); + this.lastSent = this.queue.splice(0, 1)[0]; } }, _sender: function() { if(this.queue.length === 0) { - this._safeCallbackCall(this.onQueueEmptyCallback); + this._safeCallbackCall(this.onQueueEmptyCallback, this.lastSent); return; } if(this.waitingSendResponse) { diff --git a/popup.html b/popup.html index b4ea49bf..45466417 100644 --- a/popup.html +++ b/popup.html @@ -598,11 +598,11 @@ if(tweetManager.sendQueue.queueSize() !== 0) { $("#queue_loading").show(); } - tweetManager.sendQueue.onQueueEmpty(function() { + tweetManager.sendQueue.onQueueEmpty(function(lastSent) { if(!window) { return; } - WorkList.sendQueueEmpty(); + WorkList.sendQueueEmpty(lastSent); }); tweetManager.sendQueue.onTweetEnqueued(function() { if(!window) { @@ -684,9 +684,13 @@ $("#queue_loading").tipsy({refresh: true}); }, - sendQueueEmpty: function() { + sendQueueEmpty: function(lastSent) { $("#queue_loading").hide(); - loadTimeline(true, "home"); + var updateTimelineId = TimelineTemplate.HOME; + if(lastSent && lastSent.message.indexOf('d ') == 0) { + updateTimelineId = TimelineTemplate.SENT_DMS; + } + loadTimeline(true, updateTimelineId); }, tweetEnqueued: function() { From 2122efd3b5cc1d4159f40d40e5384c0297698029 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Tue, 9 Nov 2010 21:29:42 -0300 Subject: [PATCH 068/135] Correctly fetching all new tweets after a long sleep. --- lib/timelines/favorites_timeline.js | 14 ++++- lib/timelines/search_timeline.js | 6 +++ lib/timelines/timeline.js | 82 ++++++++++++++++++++++++----- 3 files changed, 87 insertions(+), 15 deletions(-) diff --git a/lib/timelines/favorites_timeline.js b/lib/timelines/favorites_timeline.js index 60b54566..b039e5f7 100644 --- a/lib/timelines/favorites_timeline.js +++ b/lib/timelines/favorites_timeline.js @@ -32,6 +32,12 @@ $.extend(FavoritesTweetsTimeline.prototype, TweetsTimeline.prototype, { return {}; }, + /* overridden */ + _stageNewTweets: function(tweets) { + this.stagedNewTweets = this.stagedNewTweets.concat(tweets); + return true; + }, + /* overridden */ _syncOldTweets: function(tweets, context) { for(var i = 0; i < tweets.length; ++i) { @@ -40,8 +46,10 @@ $.extend(FavoritesTweetsTimeline.prototype, TweetsTimeline.prototype, { }, /* overridden */ - _syncNewTweets: function(tweets, context) { - for(var i = 0; i < tweets.length; ++i) { + _syncNewTweets: function(context) { + var tweets = this.stagedNewTweets; + var tweetsLen = tweets.length; + for(var i = 0; i < tweetsLen; ++i) { var j = 0; for(; j < this.tweetsCache.length; ++j) { if(tweets[i].id == this.tweetsCache[j].id) { @@ -53,5 +61,7 @@ $.extend(FavoritesTweetsTimeline.prototype, TweetsTimeline.prototype, { } this.newTweetsCache.push(tweets[i]); } + this.stagedNewTweets.length = 0; + return tweetsLen; } }); \ No newline at end of file diff --git a/lib/timelines/search_timeline.js b/lib/timelines/search_timeline.js index c3ca725a..504e989c 100644 --- a/lib/timelines/search_timeline.js +++ b/lib/timelines/search_timeline.js @@ -43,5 +43,11 @@ $.extend(SearchTweetsTimeline.prototype, MultipleTweetsTimeline.prototype, { }); this.manager.twitterBackend.searchTimeline(callback, context, queryParams); } + }, + + /* overridden */ + _stageNewTweets: function(tweets) { + MultipleTweetsTimeline.prototype._stageNewTweets.call(this, tweets); // super call + return true; } }); \ No newline at end of file diff --git a/lib/timelines/timeline.js b/lib/timelines/timeline.js index 522eed28..89cda4e4 100644 --- a/lib/timelines/timeline.js +++ b/lib/timelines/timeline.js @@ -6,6 +6,7 @@ function TweetsTimeline(timelineId, manager, template) { this.tweetsCache = []; this.newTweetsCache = []; this.unreadNotified = []; + this.stagedNewTweets = []; this.timerId = null; this.currentError = null; @@ -211,14 +212,19 @@ TweetsTimeline.prototype = { } this._setError(null); - this._syncNewTweets(tweets, context); - - if(tweets.length > 0) { - this.manager.notifyNewTweets(); + var shouldSync = this._stageNewTweets(tweets); + if(shouldSync) { + var newTweetsLen = this._syncNewTweets(context); + if(newTweetsLen > 0) { + this.manager.notifyNewTweets(); + } + if(context.onFinish) { + context.onFinish(newTweetsLen); + } + this.timerId = setTimeout(function() { _this._fetchNewTweets(); }, this.template.refreshInterval); + } else { + this._fetchNewTweets(context.onFinish); } - if(context.onFinish) - context.onFinish(tweets.length); - this.timerId = setTimeout(function() { _this._fetchNewTweets(); }, this.template.refreshInterval); }, _doBackendRequest: function(path, callback, context, params) { @@ -303,15 +309,27 @@ TweetsTimeline.prototype = { _makeNewTweetsRequestParams: function() { var lastId = null; - if(this.newTweetsCache.length > 0) { - lastId = this.newTweetsCache[0].id; - } else if(this.tweetsCache.length > 0) { - lastId = this.tweetsCache[0].id; + if(this.newTweetsCache.length > 1) { + lastId = this.newTweetsCache[1].id; + } else { + var requiredLen = 1 - this.newTweetsCache.length; + if(this.tweetsCache.length > requiredLen) { + lastId = this.tweetsCache[requiredLen].id; + } } + + var maxId = null; + if(this.stagedNewTweets.length > 0) { + maxId = this.stagedNewTweets[this.stagedNewTweets.length - 1].id; + } + var params = {}; if(lastId) { params.since_id = lastId; } + if(maxId) { + params.max_id = maxId; + } return params; }, @@ -325,8 +343,44 @@ TweetsTimeline.prototype = { } }, - _syncNewTweets: function(tweets, context) { - for(var i = tweets.length - 1; i >= 0; --i) { + _stageNewTweets: function(tweets) { + if(tweets.length === 0) { + return true; + } + if(this.stagedNewTweets.length > 0 && + this.stagedNewTweets[this.stagedNewTweets.length - 1].id == tweets[0].id) { + tweets.shift(); + if(tweets.length === 0) { + return true; + } + } + if(this.stagedNewTweets.length > 0 && this.stagedNewTweets[0].id == tweets[0].id && + this.stagedNewTweets[this.stagedNewTweets.length - 1].id == tweets[tweets.length - 1].id) { + return true; + } + + this.stagedNewTweets = this.stagedNewTweets.concat(tweets); + + var lenCache = this.tweetsCache.length; + var lenNewCache = this.newTweetsCache.length; + if(lenCache === 0 && lenNewCache === 0) { + return true; + } + var mostRecentId = lenNewCache > 0 ? this.newTweetsCache[0].id : this.tweetsCache[0].id; + if(this.stagedNewTweets[this.stagedNewTweets.length - 1].id == mostRecentId) { + this.stagedNewTweets.pop(); + return true; + } + if(this.stagedNewTweets.length >= 250) { //TODO: Hardcoded limit for now, maybe an option? + return true; + } + return false; + }, + + _syncNewTweets: function(context) { + var tweets = this.stagedNewTweets; + var stagedLen = tweets.length; + for(var i = stagedLen - 1; i >= 0; --i) { this.newTweetsCache.unshift(tweets[i]); var tid = tweets[i].id; if(context.onFinish) { @@ -335,6 +389,8 @@ TweetsTimeline.prototype = { this.manager.unreadTweets[tid] = true; } } + this.stagedNewTweets.length = 0; + return stagedLen; }, /** From 6587d53c6844a15b4c1a5de0afe9821ee942d66c Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Tue, 9 Nov 2010 22:57:33 -0300 Subject: [PATCH 069/135] Saving upload state while popup is closed. --- lib/image_services.js | 47 ++++++++++++++++++++++++++ popup.html | 78 ++++++++++++++++++++++++++++--------------- 2 files changed, 98 insertions(+), 27 deletions(-) diff --git a/lib/image_services.js b/lib/image_services.js index 3e1b6f5b..45d1c75e 100644 --- a/lib/image_services.js +++ b/lib/image_services.js @@ -1,3 +1,50 @@ +var UploadManager = { + upload: function(file) { + this.running = true; + this.finishedResponse = null; + this.lastProgress = null; + var imageService = ImageService.getService(OptionsBackend.get('image_upload_service')); + var _this = this; + imageService.upload(file, function(success, urlOrError) { + _this.running = false; + if(!_this.onFinish || !_this.onFinish(success, urlOrError)) { + _this.finishedResponse = { + success: success, + urlOrError: urlOrError + }; + _this.onFinish = null; + } + }, + function(loaded, total) { + if(!_this.onProgress || !_this.onProgress(loaded, total)) { + _this.lastProgress = { + loaded: loaded, + total: total + }; + _this.onProgress = null; + } + }); + }, + + registerCallbacks: function(onFinish, onProgress) { + this.onFinish = onFinish; + this.onProgress = onProgress; + + if(this.finishedResponse) { + onFinish(this.finishedResponse.success, this.finishedResponse.urlOrError); + this.finishedResponse = null; + return false; + } + if(this.running) { + if(this.lastProgress) { + this.onProgress(this.lastProgress.loaded, this.lastProgress.total); + } + return true; + } + return false; + } +}; + function ImageService(domain, options) { this.domain = domain; if(typeof options.thumb == 'function') { diff --git a/popup.html b/popup.html index 45466417..7fd45a17 100644 --- a/popup.html +++ b/popup.html @@ -17,6 +17,7 @@ var OptionsBackend = chrome.extension.getBackgroundPage().OptionsBackend; var TimelineTemplate = chrome.extension.getBackgroundPage().TimelineTemplate; var ImageService = chrome.extension.getBackgroundPage().ImageService; +var UploadManager = chrome.extension.getBackgroundPage().UploadManager; var microbloggingService = OptionsBackend.get('microblogging_service'); var TwitterLib; @@ -1317,36 +1318,58 @@ }; var ImageUpload = { - upload: function() { - var inputEl = $('#image_input')[0]; - var progressEl = $('#upload_progress'); - progressEl.show(); - - var files = inputEl.files; - $('#loading').show(); - var imageService = ImageService.getService(OptionsBackend.get('image_upload_service')); - imageService.upload(files[0], - function onFinish(success, urlOrError) { - if(!window) { - return; - } - $('#loading').hide(); - progressEl.hide(); - if(success) { - inputEl.value = null; - Composer.addText(urlOrError); - } else { - Renderer.showError(urlOrError, 'ImageService.upload'); - } + init: function() { + var _this = this; + this.progressEl = $('#upload_progress'); + this.loadingEl = $('#loading'); + this.inputEl = $('#image_input')[0] + var running = UploadManager.registerCallbacks( + function (success, urlOrError) { + return _this.onFinish(success, urlOrError); }, - function onProgress(loaded, total) { - if(!window) { - return; - } - var progress = (loaded / total) * 100.0; - progressEl[0].value = progress; + function (loaded, total) { + return _this.onProgress(loaded, total); } ); + if(running) { + this.inputEl.disabled = true; + this.progressEl.show(); + this.loadingEl.show(); + } + }, + + upload: function() { + this.inputEl.disabled = true; + this.progressEl.show(); + this.loadingEl.show(); + + var files = this.inputEl.files; + UploadManager.upload(files[0]); + }, + + onFinish: function(success, urlOrError) { + if(!window) { + return false; + } + this.inputEl.disabled = false; + this.progressEl.hide(); + this.loadingEl.hide(); + if(success) { + this.inputEl.value = null; + Composer.addText(urlOrError); + } else { + Renderer.showError(urlOrError, 'ImageUpload.upload'); + } + return true; + }, + + onProgress: function(loaded, total) { + if(!window) { + return false; + } + var progress = (loaded / total) * 100.0; + this.progressEl[0].value = progress; + return true; } }; @@ -1551,6 +1574,7 @@ TimelineTab.select(tweetManager.currentTimelineId); Composer.init(); Shortener.init(); + ImageUpload.init(); prepareAndLoadTimeline(); var tabEl = $("#timeline-" + tweetManager.currentTimelineId + ' .inner_timeline'); From f4d1dc5e7fee3d933e6a33c17a431332c931781d Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Tue, 9 Nov 2010 23:32:54 -0300 Subject: [PATCH 070/135] Setting new default value for the maximum number of notifications shown at once. --- background.html | 10 ++++++++++ lib/options_backend.js | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/background.html b/background.html index f926e3f4..d9b8adb6 100644 --- a/background.html +++ b/background.html @@ -1036,6 +1036,16 @@ // users may switch back to onpage notifications latter if they wish. OptionsBackend.saveOption('tweets_notification_style', 'desktop'); } + if(compareVersions(storageVersion, [1, 9, 5, 1]) <= 0) { + var maxNotifications = OptionsBackend.get('notification_max_popups'); + if(maxNotifications == -1) { + // Set new default value if we're using unlimited notifications, + // otherwise there might have been thousands of notifications + // to be shown, mainly after we fixed the way we fetch new + // tweets. + OptionsBackend.saveOption('notification_max_popups', OptionsBackend.defaultOptions['notification_max_popups']); + } + } storageData.save(JSON.stringify(currentVersion)); } } catch(e) { diff --git a/lib/options_backend.js b/lib/options_backend.js index d70d289c..144b7e98 100644 --- a/lib/options_backend.js +++ b/lib/options_backend.js @@ -88,7 +88,7 @@ OptionsBackend = { show_hits_in_popup: false, show_user_autocomplete: true, - notification_max_popups: -1, + notification_max_popups: 20, open_searches_internally: true, image_upload_service: 'twitpic.com' }, From eb02a2f29f9afe50a083d4ecc8e8bd118a2759da Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Wed, 10 Nov 2010 21:37:47 -0300 Subject: [PATCH 071/135] Updating bit.ly api version and correctly handling pro accounts. --- lib/shortener_lib.js | 45 ++++++++++++++++---------------------------- 1 file changed, 16 insertions(+), 29 deletions(-) diff --git a/lib/shortener_lib.js b/lib/shortener_lib.js index 7ea66403..1a0e307d 100755 --- a/lib/shortener_lib.js +++ b/lib/shortener_lib.js @@ -18,7 +18,12 @@ Shortener.prototype = { var cbMsg = null; var success = true; if(errorCode === 0 && msg) { - cbMsg = _this.shortenerInfo.baseUrl + msg; + cbMsg = ''; + if(_this.shortenerInfo.baseUrl) { + cbMsg += _this.shortenerInfo.baseUrl; + msg = msg.replace(/^.*\//g, ''); + } + cbMsg += msg; } else if(errorCode !== 0 && msg) { cbMsg = 'Error ' + errorCode + ': ' + msg; success = false; @@ -33,19 +38,16 @@ Shortener.prototype = { BitLyShortener = { shorten: function(longUrl, useAcct, login, apiKey, serviceUrl, callback) { - var url = "http://api.bit.ly/shorten"; + var url = "http://api.bit.ly/v3/shorten"; var params = { - version: '2.0.1', format: 'json', - longUrl: longUrl + longUrl: longUrl, + login: 'chromedbird', + apiKey: 'R_aa77c64a8258cf704e7fa361555a4d81' }; if(useAcct) { - params['login'] = login; - params['apiKey'] = apiKey; - params['history'] = 1; - } else { - params['login'] = 'chromedbird'; - params['apiKey'] = 'R_aa77c64a8258cf704e7fa361555a4d81'; + params['x_login'] = login; + params['x_apiKey'] = apiKey; } $.ajax({ @@ -54,16 +56,11 @@ BitLyShortener = { data: params, dataType: 'json', success: function(data, status) { - var ecAPI = data.errorCode; - if(ecAPI === 0) { - var ecURL = data.results[longUrl].errorCode; - if(!ecURL || ecURL === 0) { - callback(0, data.results[longUrl].userHash); - } else { - callback(ecURL, data.results[longUrl].errorMessage); - } + var status = data.status_code; + if(status == 200) { + callback(0, data.data.url); } else { - callback(ecAPI, data.errorMessage); + callback(status, data.status_txt); } }, error: function (request, status, error) { @@ -408,7 +405,6 @@ MinifyShortener = { SHORTENERS_BACKEND = { bitly: { desc: 'bit.ly', - baseUrl: 'http://bit.ly/', backend: BitLyShortener }, jmp: { @@ -423,7 +419,6 @@ SHORTENERS_BACKEND = { }, isgd: { desc: 'is.gd', - baseUrl: '', backend: IsGdShortener }, migreme: { @@ -433,7 +428,6 @@ SHORTENERS_BACKEND = { }, miudin: { desc: 'miud.in', - baseUrl: '', backend: MiudinShortener }, udanax: { @@ -448,37 +442,30 @@ SHORTENERS_BACKEND = { }, urlcorta: { desc: 'URLcorta.es', - baseUrl: '', backend: URLcortaShortener }, googl: { desc: 'goo.gl', - baseUrl: '', backend: GooglShortener }, karmacracy: { desc: 'karmacracy.com', - baseUrl: '', backend: KCYShortener }, yourls: { desc: 'yourls', - baseUrl: '', backend: YourlsShortener }, mcafee: { desc: 'mcaf.ee', - baseUrl: '', backend: McafeeShortener }, rodgs: { desc: 'rod.gs', - baseUrl: '', backend: RodGsShortener }, minify: { desc: 'minify', - baseUrl: '', backend: MinifyShortener } }; From 3ee90e97ea042d271d00951ac5dad620899e1c54 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Wed, 10 Nov 2010 21:53:10 -0300 Subject: [PATCH 072/135] Fixing duplicated localized string. Thx usercard --- _locales/de/messages.json | 2 +- _locales/en/messages.json | 2 +- _locales/es/messages.json | 2 +- _locales/pt_BR/messages.json | 2 +- _locales/ru/messages.json | 2 +- _locales/tr/messages.json | 2 +- _locales/uk/messages.json | 2 +- options.html | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/_locales/de/messages.json b/_locales/de/messages.json index 1a4562ea..60510237 100644 --- a/_locales/de/messages.json +++ b/_locales/de/messages.json @@ -494,7 +494,7 @@ "l_change_icon": { "message": "Icon ändern" }, - "l_icon_color": { + "l_icon_color_column": { "message": "Icon-Farbe" }, "notif_home": { diff --git a/_locales/en/messages.json b/_locales/en/messages.json index a0a48edc..c83fbeca 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -503,7 +503,7 @@ "l_change_icon": { "message": "Change Icon" }, - "l_icon_color": { + "l_icon_color_column": { "message": "Icon Color" }, "notif_home": { diff --git a/_locales/es/messages.json b/_locales/es/messages.json index 42e9ca68..b6c0927c 100644 --- a/_locales/es/messages.json +++ b/_locales/es/messages.json @@ -494,7 +494,7 @@ "l_change_icon": { "message": "Cambiar icono" }, - "l_icon_color": { + "l_icon_color_column": { "message": "Color de Icono" }, "notif_home": { diff --git a/_locales/pt_BR/messages.json b/_locales/pt_BR/messages.json index eea1333c..e4f0e4ff 100644 --- a/_locales/pt_BR/messages.json +++ b/_locales/pt_BR/messages.json @@ -489,7 +489,7 @@ "l_change_icon": { "message": "Mudar Ícone" }, - "l_icon_color": { + "l_icon_color_column": { "message": "Cor do Ícone" }, "notif_home": { diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json index 42e13eee..aea8e1c0 100644 --- a/_locales/ru/messages.json +++ b/_locales/ru/messages.json @@ -494,7 +494,7 @@ "l_change_icon": { "message": "Изменить иконку" }, - "l_icon_color": { + "l_icon_color_column": { "message": "Цвет иконки" }, "notif_home": { diff --git a/_locales/tr/messages.json b/_locales/tr/messages.json index b62f087b..ec281cf6 100644 --- a/_locales/tr/messages.json +++ b/_locales/tr/messages.json @@ -494,7 +494,7 @@ "l_change_icon": { "message": "Simgeyi değiştir" }, - "l_icon_color": { + "l_icon_color_column": { "message": "Simge rengi" }, "notif_home": { diff --git a/_locales/uk/messages.json b/_locales/uk/messages.json index 22d1672a..d0bdfb2b 100644 --- a/_locales/uk/messages.json +++ b/_locales/uk/messages.json @@ -494,7 +494,7 @@ "l_change_icon": { "message": "Змінити іконку" }, - "l_icon_color": { + "l_icon_color_column": { "message": "Колір іконки" }, "notif_home": { diff --git a/options.html b/options.html index acf7554b..fdd6e46b 100755 --- a/options.html +++ b/options.html @@ -387,7 +387,7 @@

Chromed Bird Options

Tweet Notification Change Icon - Icon Color + Icon Color Home: From a0c2ab05d75b3b6908680052c5c45f16fb1351fb Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Wed, 10 Nov 2010 22:54:48 -0300 Subject: [PATCH 073/135] Allowing users to change the default locale. --- _locales/en/messages.json | 3 + background.html | 1 + lib/locales.js | 125 ++++++++++++++++++++++++++++++++++++++ lib/options_backend.js | 3 +- options.html | 11 ++++ popup.html | 2 + tweets_notifier.html | 2 + 7 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 lib/locales.js diff --git a/_locales/en/messages.json b/_locales/en/messages.json index c83fbeca..9a3d8ff1 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -661,5 +661,8 @@ }, "l_image_up_service": { "message": "Image Upload Service:" + }, + "l_default_locale": { + "message": "Default Locale:" } } diff --git a/background.html b/background.html index d9b8adb6..70a911b7 100644 --- a/background.html +++ b/background.html @@ -27,6 +27,7 @@ + + + @@ -83,10 +85,7 @@ TimelineTemplate.initTemplates(this); TimelineTemplate.eachTimelineTemplate(function(template) { - var createdTimelines = template.createTimelines(); - for(var i in createdTimelines) { - _this.timelines[createdTimelines[i].timelineId] = createdTimelines[i]; - } + _this.createTimelineTemplate(template, true); }); this.orderedEachTimeline(function(timeline) { @@ -119,6 +118,7 @@ timeline.init(); }, true); _this.retrieveFollowingUsers(); + StreamListener.start(this); }, function(remainingHits, nextHitsReset, hourlyLimit) { _this.onHitsUpdated.call(_this, remainingHits, nextHitsReset, hourlyLimit); @@ -770,6 +770,7 @@ timeline.killTimeline(); delete timeline; }, true); + StreamListener.disconnect(); }, signout: function() { diff --git a/lib/stream_listener.js b/lib/stream_listener.js new file mode 100644 index 00000000..f4983d34 --- /dev/null +++ b/lib/stream_listener.js @@ -0,0 +1,185 @@ +var StreamListener = (function() { + + var props = { + streamReconnectCount: 0, + streamReconnectBaseTime: 20000, + streamReconnectWaitTime: this.streamReconnectBaseTime, + streamMaxStaleTime: 90000, + streamMaxReconnectWait: 240000 + }; + + props.subscribers = []; + props.twitterLib = null; + + var curry = function(func) { + var slice = Array.prototype.slice, args = slice.call(arguments, 1); + return function() { + func.apply(this, args.concat(slice.call(arguments))); + }; + }; + + var publish = function(data) { + if(props.twitterLib) { + if(data.hasOwnProperty('text')) { + props.twitterLib.normalizeTweets(data); + } else if(data.hasOwnProperty('direct_message')) { + props.twitterLib.normalizeTweets(data.direct_message); + } + } + console.log(data); + for(var i = 0, len = props.subscribers.length; i < len; ++i) { + var sub = props.subscribers[i]; + sub.callback.call(sub.context, data); + } + }; + + var publishDisconnect = curry(publish, { + event: 'disconnected' + }); + + var xhr, onProgress; + + var stopStream = function() { + if(!xhr) { + return; + } + xhr.removeEventListener("progress", onProgress, false); + xhr.abort(); + }; + + var connectStream = function() { + if(!OptionsBackend.get('use_streaming_api')) { + return; + } + var MAX_BUFFER = 1024 * 500; + + var url = OptionsBackend.get('user_stream_url'); + var params = { + delimited: 'length' + }; + + props.streamReconnectCount += 1; + console.log('connecting to stream ', props.streamReconnectCount); + + xhr = new XMLHttpRequest(); + xhr.open('GET', url + '?' + $.param(params), true); + xhr.setRequestHeader('X-User-Agent', 'Chromed Bird ' + JSON.parse(Persistence.version().val()).join('.')); + if(props.twitterLib) { + props.twitterLib.signOauth(xhr, url, params, 'GET'); + } + + var lastLoaded = 0, lastChunkLen, lastProgressTime = new Date().getTime(); + onProgress = function(e) { + console.log('loaded', e.loaded, 'time', new Date().getTime() - lastProgressTime); + lastProgressTime = new Date().getTime(); + + var totalLen = e.loaded; + if(totalLen > MAX_BUFFER) { + console.log('stream disconnected, buffer too large'); + stopStream(); + } + var data = xhr.responseText; + + while(lastLoaded < totalLen) { + if(!lastChunkLen) { + lastChunkLen = ''; + var curChar = data.charAt(lastLoaded); + while(curChar != '\n' || lastChunkLen.length === 0) { + if(curChar.match(/\d/)) { + lastChunkLen += curChar; + } + lastLoaded += 1; + if(lastLoaded >= totalLen) { + return; + } + curChar = data.charAt(lastLoaded); + } + lastLoaded += 1; + lastChunkLen = parseInt(lastChunkLen, 10); + } + if(lastLoaded + lastChunkLen > totalLen) { + // Let's just wait for the rest of our data + return; + } + var jsonChunk = data.substring(lastLoaded, lastLoaded + lastChunkLen); + var parsedChunk = JSON.parse(jsonChunk); + publish(parsedChunk); + lastLoaded += lastChunkLen; + lastChunkLen = null; + } + }; + + xhr.addEventListener("progress", onProgress, false); + var intervalHandle; + xhr.onreadystatechange = function() { + if(xhr.readyState == 2 && xhr.status == 200) { + console.log('stream connected ok'); + + var checkStaleConnection = function() { + var time = new Date().getTime(); + if(time - lastProgressTime > props.streamMaxStaleTime) { + console.log('stream stale connection'); + stopStream(); + } + }; + intervalHandle = setInterval(checkStaleConnection, props.streamMaxStaleTime / 2); + + props.streamReconnectWaitTime = props.streamReconnectBaseTime; + } else if(xhr.readyState == 4) { + console.log('stream disconnected', xhr.status, xhr.statusText); + publishDisconnect(); + if(intervalHandle) { + clearInterval(intervalHandle); + intervalHandle = null; + } + if(props.twitterLib) { + setTimeout(function() { + connectStream(); + }, props.streamReconnectWaitTime); + if(props.streamReconnectWaitTime < props.streamMaxReconnectWait) { + props.streamReconnectWaitTime *= 2; + } + } + } + }; + + xhr.send(); + }; + + return { + events: { + DISCONNECTED: 'disconnected' + }, + + start: function(twitterLib) { + props.twitterLib = twitterLib; + connectStream(); + }, + + disconnect: function() { + props.twitterLib = null; + props.subscribers = []; + stopStream(); + }, + + unsubscribe: function(context) { + console.log('unsubscribe: ' + context.template.id); + var newSubscribers = []; + for(var i = 0, len = props.subscribers.length; i < len; ++i) { + var sub = props.subscribers[i]; + if(sub.context != context) { + newSubscribers.push(sub); + } + } + props.subscribers = newSubscribers; + }, + + subscribe: function(callbackOrOptions, context) { + var options = (typeof callbackOrOptions === 'function') ? { + callback: callbackOrOptions, + context: context + } : callbackOrOptions; + props.subscribers.push(options); + } + }; +}).call({}); \ No newline at end of file diff --git a/lib/timeline_template.js b/lib/timeline_template.js index c9cc57ae..ebbff2fb 100644 --- a/lib/timeline_template.js +++ b/lib/timeline_template.js @@ -96,6 +96,7 @@ function TimelineTemplate(timelineTemplateId, tweetManager) { break; default: // bug + throw 'unrecognized timeline template id'; break; } }; diff --git a/lib/timelines/timeline.js b/lib/timelines/timeline.js index 1ae6db7c..d16eb7f7 100644 --- a/lib/timelines/timeline.js +++ b/lib/timelines/timeline.js @@ -19,6 +19,8 @@ function TweetsTimeline(timelineId, manager, template) { this.unifiedRunning = false; this.currentRequestId = 0; this.canceledRequests = {}; + + StreamListener.subscribe(this.onStreamData, this); } TweetsTimeline.prototype = { @@ -40,6 +42,7 @@ TweetsTimeline.prototype = { }, killTimeline: function() { + StreamListener.unsubscribe(this); this.timelineStopped = true; this._stopTimer(); }, @@ -188,8 +191,64 @@ TweetsTimeline.prototype = { this._stopTimer(); }, + onStreamData: function(data) { + if(data.event && data.event == StreamListener.events.DISCONNECTED) { + this.shouldListenStream = false; + if(this.listeningStream) { + this.listeningStream = false; + this._fetchNewTweets(); + } + } + if(this.shouldListenStream) { + if(!this.listeningStream) { + return; + } + this._handleStreamData(data); + } else { + this.shouldListenStream = this._shouldListenStream(); + console.log(this.template.id + ' - shouldListen: ' + this.shouldListenStream); + } + }, + /* Private Methods */ + _shouldListenStream: function() { + return this.template.id == TimelineTemplate.HOME || + this.template.id == TimelineTemplate.MENTIONS || + this.template.id == TimelineTemplate.SENT_DMS || + this.template.id == TimelineTemplate.RECEIVED_DMS; + }, + + _handleStreamData: function(data) { + var tweets; + if(data.text) { + var mentionStr = '@' + this.manager.twitterBackend.username(); + if(data.text.match(mentionStr)) { + if(this.template.id == TimelineTemplate.MENTIONS) { + tweets = [data]; + } + } else if(this.template.id == TimelineTemplate.HOME) { + tweets = [data]; + } + } else if(data.direct_message) { + if(data.direct_message.user.screen_name == this.manager.twitterBackend.username()) { + if(this.template.id == TimelineTemplate.SENT_DMS) { + tweets = [data.direct_message]; + } + } else { + if(this.template.id == TimelineTemplate.RECEIVED_DMS) { + tweets = [data.direct_message]; + } + } + } + + if(tweets) { + console.log('notifying tweets: ' + this.template.id); + this._syncNewTweets(tweets, {}); + this.manager.notifyNewTweets(); + } + }, + _setError: function(status) { this.currentError = status; }, @@ -228,9 +287,16 @@ TweetsTimeline.prototype = { if(tweets.length > 0) { this.manager.notifyNewTweets(); } - if(context.onFinish) + if(context.onFinish) { context.onFinish(tweets.length); - this.timerId = setTimeout(function() { _this._fetchNewTweets(); }, this.template.refreshInterval); + } + if(this.shouldListenStream) { + console.log(this.template.id + ' listening true'); + this.timerId = null; + this.listeningStream = true; + } else { + this.timerId = setTimeout(function() { _this._fetchNewTweets(); }, this.template.refreshInterval); + } }, _doBackendRequest: function(path, callback, context, params) { diff --git a/lib/twitter_lib.js b/lib/twitter_lib.js index e04468bb..2adeddff 100755 --- a/lib/twitter_lib.js +++ b/lib/twitter_lib.js @@ -11,11 +11,9 @@ function TwitterLib(onAuthenticated, onHitsUpdated, microbloggingService, baseUr if(!_this.username()) { _this.verifyCredentials(function() { _this.onAuthenticated(); - _this.connectStream(); }); } else { _this.onAuthenticated(); - _this.connectStream(); } }); @@ -48,112 +46,6 @@ TwitterLib.prototype = { this.oauthLib.getRequestToken(); } }, - - streamReconnectCount: 0, - streamReconnectBaseTime: 20000, - streamReconnectWaitTime: this.streamReconnectBaseTime, - streamMaxStaleTime: 90000, - streamMaxReconnectWait: 240000, - - connectStream: function() { - if(!OptionsBackend.get('use_streaming_api')) { - return; - } - var MAX_BUFFER = 1024 * 500; - - var url = OptionsBackend.get('user_stream_url'); - var params = { - delimited: 'length' - }; - - this.streamReconnectCount += 1; - console.log('connecting to stream ', this.streamReconnectCount); - - var xhr = new XMLHttpRequest(); - xhr.open('GET', url + '?' + $.param(params), true); - xhr.setRequestHeader('X-User-Agent', 'Chromed Bird ' + JSON.parse(Persistence.version().val()).join('.')); - this.signOauth(xhr, url, params, 'GET'); - - var _this = this; - var lastLoaded = 0, lastChunkLen, lastProgressTime = new Date().getTime(); - var onProgress = function(e) { - console.log('loaded', e.loaded, 'time', new Date().getTime() - lastProgressTime); - lastProgressTime = new Date().getTime(); - - var totalLen = e.loaded; - if(totalLen > MAX_BUFFER) { - console.log('stream disconnected, buffer too large'); - xhr.removeEventListener("progress", onProgress, false); - xhr.abort(); - } - var data = xhr.responseText; - - while(lastLoaded < totalLen) { - if(!lastChunkLen) { - lastChunkLen = ''; - var curChar = data.charAt(lastLoaded); - while(curChar != '\n' || lastChunkLen.length === 0) { - if(curChar.match(/\d/)) { - lastChunkLen += curChar; - } - lastLoaded += 1; - if(lastLoaded >= totalLen) { - return; - } - curChar = data.charAt(lastLoaded); - } - lastLoaded += 1; - lastChunkLen = parseInt(lastChunkLen, 10); - } - if(lastLoaded + lastChunkLen > totalLen) { - // Let's just wait for the rest of our data - return; - } - var jsonChunk = data.substring(lastLoaded, lastLoaded + lastChunkLen); - var parsedChunk = JSON.parse(jsonChunk); - // TODO: Send parsed json message - console.log('streamed data', parsedChunk); - lastLoaded += lastChunkLen; - lastChunkLen = null; - } - }; - - xhr.addEventListener("progress", onProgress, false); - var intervalHandle; - xhr.onreadystatechange = function() { - if(xhr.readyState == 2 && xhr.status == 200) { - console.log('stream connected ok'); - - var checkStaleConnection = function() { - var time = new Date().getTime(); - if(time - lastProgressTime > _this.streamMaxStaleTime) { - console.log('stream stale connection'); - xhr.removeEventListener("progress", onProgress, false); - xhr.abort(); - } - }; - intervalHandle = setInterval(checkStaleConnection, _this.streamMaxStaleTime / 2); - - _this.streamReconnectWaitTime = _this.streamReconnectBaseTime; - } else if(xhr.readyState == 4) { - // TODO: Broadcast disconnection notice - console.log('stream disconnected', xhr.status, xhr.statusText); - if(intervalHandle) { - clearInterval(intervalHandle); - intervalHandle = null; - } - setTimeout(function() { - _this.connectStream(); - }, _this.streamReconnectWaitTime); - if(_this.streamReconnectWaitTime < _this.streamMaxReconnectWait) { - _this.streamReconnectWaitTime *= 2; - } - } - }; - - xhr.send(); - }, - generateOauthHeader: function(signedData, includeRealm) { var authorization = 'OAuth '; if(includeRealm) { From a182c7ee8f6044986cecac09adcaa0c4e7c6a0d4 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Sun, 20 Mar 2011 02:30:38 -0300 Subject: [PATCH 127/135] Fixed desktop notification acting weird when there were too many notifications. --- background.html | 16 ---------------- tweets_notifier.html | 4 ++-- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/background.html b/background.html index 173482ed..53a795ed 100644 --- a/background.html +++ b/background.html @@ -412,22 +412,7 @@ throw 'Desktop notifications not allowed'; } - // FIXME: This check is here because stable channel releases - // currently silently fail in showing html notifications - var notificationDisplayed = false; - var onDisplayFunc = function() { - notificationDisplayed = true; - }; var _this = this; - setTimeout(function() { - if(!notificationDisplayed) { - for(var i = 0; i < tweetsToNotify.length; ++i) { - _this.shouldNotReadMap[tweetsToNotify[i].id] = true; - } - _this.safeTweetsNotifications(tweetsToNotify, false); - } - }, 1000); - for(var i = 0; i < tweetsToNotify.length; ++i) { var notification = notificationCenter.createHTMLNotification( chrome.extension.getURL('tweets_notifier.html')); @@ -438,7 +423,6 @@ }, 200); }; })(tweetsToNotify[i]); - notification.ondisplay = onDisplayFunc; notification.show(); } } catch(e) { diff --git a/tweets_notifier.html b/tweets_notifier.html index b68741a2..6fb49b7b 100755 --- a/tweets_notifier.html +++ b/tweets_notifier.html @@ -26,9 +26,9 @@ $(function() { var fadeTimeout = OptionsBackend.get('notification_fade_timeout'); - var tweet = tweetManager.injectTweets.shift(); - Renderer.setContext('desktop'); try { + var tweet = tweetManager.injectTweets.shift(); + Renderer.setContext('desktop'); $(document.body).prepend(Renderer.renderTweet(tweet, false, OptionsBackend.get('name_attribute'))); } catch(e) { console.log(e); From 2897e4358bf1f0c25df82c79a975bfb6edba410f Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Sun, 20 Mar 2011 17:50:20 -0300 Subject: [PATCH 128/135] More fixes to desktop notifications. --- background.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/background.html b/background.html index 53a795ed..5818b67b 100644 --- a/background.html +++ b/background.html @@ -53,7 +53,7 @@ this.readTweets = {}; this.shouldNotReadMap = {}; this.retweets = {}; - this.injectTweets = null; + this.injectTweets = []; // Using an object instead of an array to take advantage of hash look-ups this.blockedUserIds = {}; @@ -398,7 +398,7 @@ if(maxTweetsNotifications != -1 && tweetsToNotify.length > maxTweetsNotifications) { tweetsToNotify.splice(maxTweetsNotifications, tweetsToNotify.length - maxTweetsNotifications); } - this.injectTweets = tweetsToNotify; + this.injectTweets = this.injectTweets.concat(tweetsToNotify); var notificationStyle = OptionsBackend.get('tweets_notification_style'); if(!forceOnPage && notificationStyle == 'desktop') { @@ -1141,7 +1141,7 @@ }); } waitingFirstRequest = true; - TweetManager.instance.injectTweets = null; + TweetManager.instance.injectTweets = []; biggestArea = -1; }, 200); } From 0592284172bcf804a7c836b5fc667b4b6eaf88a8 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Sun, 3 Apr 2011 13:17:05 -0300 Subject: [PATCH 129/135] Caching results from trend topics request. --- background.html | 13 ++++++++++++- popup.html | 29 ++++++++++++++++++++--------- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/background.html b/background.html index 5818b67b..05395fd8 100644 --- a/background.html +++ b/background.html @@ -915,10 +915,21 @@ }, retrieveTrendingTopics: function(callback, woeid) { + var _this = this; + + if(this.lastTrendsTime && this.cachedTrendingTopics && (new Date() - this.lastTrendsTime) < 90 * 1000) { + setTimeout(function() { + callback(_this.cachedTrendingTopics); + }, 0); + return; + } + this.lastTrendsTime = new Date(); + this.twitterBackend.trendingTopics(function(success, userData) { if(success) { - callback(userData[0]); + _this.cachedTrendingTopics = userData[0]; } + callback(_this.cachedTrendingTopics); }, woeid); }, diff --git a/popup.html b/popup.html index ab8f5d80..7fe5b22e 100644 --- a/popup.html +++ b/popup.html @@ -1559,16 +1559,27 @@ tweetManager.retrieveTrendingTopics(function(userData) { var actions = []; - for(var i = 0, len = userData.trends.length; i < len; ++i) { - (function(trendName) { - actions.push({ - name: trendName, - action: function(event) { - TimelineTab.addNewSearchTab(trendName, event.isAlternateClick); - } - }); - })(userData.trends[i].name); + + if(userData) { + for(var i = 0, len = userData.trends.length; i < len; ++i) { + (function(trendName) { + actions.push({ + name: trendName, + action: function(event) { + TimelineTab.addNewSearchTab(trendName, event.isAlternateClick); + } + }); + })(userData.trends[i].name); + } + } else { + actions.push({ + name: 'Error, try again.', + action: function(event) { + loadTrends(); + } + }) } + $("#trending_topics").actionMenu({ actions: actions }); From 3993082b14f996d14d6043d7b9424658ac3d784f Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Sun, 3 Apr 2011 13:46:30 -0300 Subject: [PATCH 130/135] Updating version and changelog --- Changelog | 13 +++++++++++++ manifest.json | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Changelog b/Changelog index 1532f279..cc40ba73 100644 --- a/Changelog +++ b/Changelog @@ -1,3 +1,16 @@ +1.9.7.0 (2010-04-03) + +* Added "Trends" link showing currently trending topics with the ability to + change the region on the options page (Thanks Rafael Vargas); +* Experimental support for Twitter's streaming API. Enable it on the options page + for near real time timeline updates; +* Improved compatibility with proxlet.com (Sending OAuth params on HTTP header); +* Lots of fixes for desktop notification misbehavior; +* Returning to previously selected tab after closing a tab; +* Azerbaijani localization (Thanks Berker Peksag); +* New url shortener va.mu (Thanks Arthur Furlan) and hurl.im; +* Improved support to img.ur (Thanks Shelby DeNike) + 1.9.6.6 (2010-12-11) * Fixing bug that caused timelines to stop updating after a timeout. diff --git a/manifest.json b/manifest.json index eb07f9d7..1f1cc1ff 100755 --- a/manifest.json +++ b/manifest.json @@ -1,6 +1,6 @@ { "name": "Chromed Bird", - "version": "1.9.6.7", + "version": "1.9.7.0", "description": "__MSG_extDescription__", "default_locale": "en", "browser_action": { From 13979e247107ac159ad5e6109d5e73ad7fb01c08 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Sun, 3 Apr 2011 16:48:47 -0300 Subject: [PATCH 131/135] Adjusting maximum popup height according to window size. Closes #253. --- popup.html | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/popup.html b/popup.html index 7fe5b22e..04f6db9a 100644 --- a/popup.html +++ b/popup.html @@ -216,10 +216,17 @@ if(!ThemeManager.isPopup) { return; } + + /* HACK: Magic numbers */ + var hackBordersWidth = 14; + var hackTabsAdditionalWidth = 40; + var hackHeaderHeight = 75; + var hackMinValidHeight = 400; + width = width || 490; height = height || 400; var minWidth = 450; - var maxWidth = 800 - 14; + var maxWidth = 800 - hackBordersWidth; if(width > maxWidth) { width = maxWidth; } @@ -232,7 +239,7 @@ $("li.timeline_tab").each(function() { tabsBarWidth += $(this).width(); }); - tabsBarWidth += 40; + tabsBarWidth += hackTabsAdditionalWidth; if(tabsBarWidth > width) { ThemeManager.setPopupSize(tabsBarWidth, height); } @@ -241,6 +248,14 @@ $(".timeline").width(width + 'px'); $(".inner_timeline,.timeline").height(height + 'px'); + + setTimeout(function() { + if(window.innerHeight < hackMinValidHeight) { return; } + if(window.innerHeight < ($(".timeline").height() + hackHeaderHeight)) { + var height = window.innerHeight - hackHeaderHeight; + ThemeManager.setPopupSize(width, height, autoFitWidth); + } + }, 100); }, popupSizeData: Persistence.popupSize(), @@ -1577,7 +1592,7 @@ action: function(event) { loadTrends(); } - }) + }); } $("#trending_topics").actionMenu({ From 29be16a3e7848af4e2e533996aa9d8c8ecd6f930 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Sun, 3 Apr 2011 23:14:49 -0300 Subject: [PATCH 132/135] Adding block and report span actions. Closes #115. --- _locales/en/messages.json | 6 ++++++ background.html | 38 +++++++++++++++++++++++++++++++------- lib/tweets_assembler.js | 37 +++++++++++++++++++++++++++++++------ lib/twitter_lib.js | 14 ++++++++++++++ 4 files changed, 82 insertions(+), 13 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index accf7c39..fb01d069 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -682,5 +682,11 @@ }, "l_user_stream_url": { "message": "User Stream URL:" + }, + "block_action": { + "message": "Block" + }, + "report_action": { + "message": "Report Spam" } } diff --git a/background.html b/background.html index 05395fd8..b970c9a2 100644 --- a/background.html +++ b/background.html @@ -898,17 +898,41 @@ }, username); }, + _removeUser: function(userData) { + delete this.followingUsersMap[userData.screen_name]; + var position = $.inArray(userData.screen_name); + if(position > -1) { + this.followingUsersNames.splice(position, 1); + } + this.resetTimeline(TimelineTemplate.HOME); + this.resetTimeline(TimelineTemplate.UNIFIED); + }, + unfollowUser: function(callback, username) { var _this = this; this.twitterBackend.unfollow(function(success, userData) { if(success) { - delete _this.followingUsersMap[userData.screen_name]; - var position = $.inArray(userData.screen_name); - if(position > -1) { - _this.followingUsersNames.splice(position, 1); - } - _this.resetTimeline(TimelineTemplate.HOME); - _this.resetTimeline(TimelineTemplate.UNIFIED); + _this._removeUser(userData); + } + callback(success, userData); + }, username); + }, + + blockUser: function(callback, username) { + var _this = this; + this.twitterBackend.block(function(success, userData) { + if(success) { + _this._removeUser(userData); + } + callback(success, userData); + }, username); + }, + + reportUser: function(callback, username) { + var _this = this; + this.twitterBackend.report(function(success, userData) { + if(success) { + _this._removeUser(userData); } callback(success, userData); }, username); diff --git a/lib/tweets_assembler.js b/lib/tweets_assembler.js index 5f585468..db9e8c6e 100755 --- a/lib/tweets_assembler.js +++ b/lib/tweets_assembler.js @@ -519,6 +519,11 @@ var Renderer = { }); return; } + var reloadTimeline = function() { + if(tweetManager.currentTimelineId == TimelineTemplate.UNIFIED || tweetManager.currentTimelineId == TimelineTemplate.HOME) { + prepareAndLoadTimeline(); + } + }; $(element).actionMenu({ showMenu: function(event) { if(event.isAlternateClick) { @@ -557,9 +562,7 @@ var Renderer = { tweetManager.followUser(function(success, user) { $("#loading").hide(); if(success) { - if(tweetManager.currentTimelineId == TimelineTemplate.UNIFIED || tweetManager.currentTimelineId == TimelineTemplate.HOME) { - prepareAndLoadTimeline(); - } + reloadTimeline(); } }, username); }, @@ -575,9 +578,7 @@ var Renderer = { tweetManager.unfollowUser(function(success, user) { $("#loading").hide(); if(success) { - if(tweetManager.currentTimelineId == TimelineTemplate.UNIFIED || tweetManager.currentTimelineId == TimelineTemplate.HOME) { - prepareAndLoadTimeline(); - } + reloadTimeline(); } }, username); }, @@ -585,6 +586,30 @@ var Renderer = { var followingUsers = tweetManager.getFollowingUsersMap(); return !$.isEmptyObject(followingUsers) && followingUsers.hasOwnProperty(username); } + }, + { + name: chrome.i18n.getMessage("block_action"), + action: function() { + $("#loading").show(); + tweetManager.blockUser(function(success, user) { + $("#loading").hide(); + if(success) { + reloadTimeline(); + } + }, username); + } + }, + { + name: chrome.i18n.getMessage("report_action"), + action: function() { + $("#loading").show(); + tweetManager.reportUser(function(success, user) { + $("#loading").hide(); + if(success) { + reloadTimeline(); + } + }, username); + } } ], parentContainer: '.inner_timeline' diff --git a/lib/twitter_lib.js b/lib/twitter_lib.js index 2adeddff..0b397502 100755 --- a/lib/twitter_lib.js +++ b/lib/twitter_lib.js @@ -329,6 +329,20 @@ TwitterLib.prototype = { screen_name: username }; this.ajaxRequest('friendships/destroy', callback, null, params, "POST"); + }, + + block: function(callback, username) { + var params = { + screen_name: username + }; + this.ajaxRequest('blocks/create', callback, null, params, "POST"); + }, + + report: function(callback, username) { + var params = { + screen_name: username + }; + this.ajaxRequest('report_spam', callback, null, params, "POST"); } }; From 0aed9430f325c93ce4cf2f717ae52c184523047b Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Mon, 4 Apr 2011 07:13:43 -0300 Subject: [PATCH 133/135] Updated Azerbaijani translation. (Thanks Tural) --- _locales/az/messages.json | 1324 +++++++++++++++++++------------------ 1 file changed, 674 insertions(+), 650 deletions(-) diff --git a/_locales/az/messages.json b/_locales/az/messages.json index 70f4f4d6..c3d6383a 100644 --- a/_locales/az/messages.json +++ b/_locales/az/messages.json @@ -1,668 +1,692 @@ { - "Delete": { - "message": "Sil" - }, - "No": { - "message": "Xeyr" - }, - "Reply": { - "message": "Cavabla" - }, - "Retweet": { - "message": "Yenidən tvitlə" - }, - "Yes": { - "message": "Bəli" - }, - "add": { - "message": "Əlavə et" - }, - "add_mention_action": { - "message": "Xatırlat" - }, - "ajaxFailed": { - "message": "AJAX istəyi uğursuzdur (pis bağlantı?)" - }, - "authorizing": { - "message": "Lütfən gözləyin..." - }, - "autoUpdatesSuspended": { - "message": "Avtomatik yenilənmələr ləğv edildi" - }, - "btnAuthorize": { - "message": "Səlahiyyət ver!" - }, - "btn_default": { - "message": "Fərz edilən nizamlara bərpa et" - }, - "btn_reset": { - "message": "Bərpa et" - }, - "btn_reset_popup_size": { - "message": "Pəncərə Ölçüsünü Bərpa et" - }, - "btn_save": { - "message": "Qeyd et" - }, - "cancelTweet": { - "message": "Ləğv et" - }, - "canceling": { - "message": "Ləğv edilir..." - }, - "cbAuthorized": { - "message": "Chromed Bird səlahiyyətli!" - }, - "cbNotAuthorized": { - "message": "Bir səhv yarandı. Lütfən Chromed Bird simvoluna təkrar basın." - }, - "changeNotificationSettings": { - "message": "Bildiriş variantlarını nizamlar səhifəsindən dəyişdirə bilərsiniz." - }, - "changes_restart": { - "message": "Bəzi nizamların aktiv olması üçün əlavənin yenidən başladılması gərək. Bunu indi etmək istərsinizmi?\u003Cbr\u003E (Oxunmamış tvit sayınız sıfırlanacaq)" - }, - "composeTweet": { - "description": "Text for composing new tweet", - "message": "Yeni tvit" - }, - "conf_saved": { - "message": "Nizamlarınız müvəffəqiyyətlə qeyd edildi." - }, - "day_plural": { - "message": "gün" - }, - "day_singular": { - "message": "gün" - }, - "deleteConfirm": { - "message": "Bu ismarışı sil: " - }, - "detach_window": { - "message": "Pəncərəni Ayır" - }, - "errorExpandingUrl": { - "message": "Bir səhv yarandı. Lütfən təkrar sınayın." - }, - "exceededAPIHits": { - "message": "Gündəlik API istifadə limitini keçdiniz. Lütfən \u003Ca href='javascript:chrome.tabs.create({url:\"$options_url$\"})'\u003Enizamlar səhifəsindən\u003C/a\u003E yeniləmə aralığını yoxlayın. Chromed Bird $nextResetDate $nextResetTime$ tarixinə qədər yenilənməyəcək.", - "placeholders": { - "nextResetDate": { - "content": "$2" - }, - "nextResetTime": { - "content": "$3" - }, - "options_url": { - "content": "$1" - } + "extDescription": { + "message": "Chromed Bird, Twitter hesabınızı Google Chrome üzərindən izləmənizi və idarə etmənizi təmin edən bir əlavədir.", + "description": "Extension description" + }, + "resetSize": { + "message": "Əvvəlki ölçüyə qayıtmaq üçün cüt basın" + }, + "composeTweet": { + "message": "Yeni tvit", + "description": "Text for composing new tweet" + }, + "tweetit": { + "message": "Göndər" + }, + "logout": { + "message": "Çıxış", + "description": "The text for the logout link" + }, + "options": { + "message": "Seçimlər", + "description": "Options link" + }, + "refresh": { + "message": "Yenilə", + "description": "Refresh link" + }, + "suspend": { + "message": "Ləğv et", + "description": "Suspend link" + }, + "autoUpdatesSuspended": { + "message": "Avtomatik yenilənmələr ləğv edildi" + }, + "resume": { + "message": "Davam" + }, + "remove": { + "message": "Sil" + }, + "hide": { + "message": "Gizlət" + }, + "show": { + "message": "Göstər" + }, + "add": { + "message": "Əlavə et" + }, + "selectList": { + "message": "- Bir siyahı seç -" + }, + "updateList": { + "message": "Siyahılar yenilənir..." + }, + "w_Unified": { + "message": "Hamısı" + }, + "w_Home": { + "message": "Əsas səhifə" + }, + "w_DM": { + "message": "İsmarışlar" + }, + "w_SentDM": { + "message": "Göndərilən İsmarışlar" + }, + "w_ReceivedDM": { + "message": "Alınan İsmarışlar" + }, + "w_Favorites": { + "message": "Favoritlər" + }, + "w_Lists": { + "message": "Siyahılar" + }, + "w_Search": { + "message": "Axtar" + }, + "fromApp": { + "message": "vasitəçi" + }, + "inReply": { + "message": "cavabında" + }, + "sentTo": { + "message": "göndərildi" + }, + "retweetedBy": { + "message": "təkrar tvitləyən" + }, + "retweetedByMe": { + "message": "sizin tərəfinizdən təkrar tvitləndi" + }, + "unmarkFavorite": { + "message": "Favoritlərdən sil" + }, + "markFavorite": { + "message": "Favoritlərə əlavə et" + }, + "Delete": { + "message": "Sil" + }, + "deleteConfirm": { + "message": "Bu ismarışı sil: " + }, + "Yes": { + "message": "Bəli" + }, + "No": { + "message": "Xeyr" + }, + "Reply": { + "message": "Cavabla" + }, + "Retweet": { + "message": "Yenidən tvitlə" + }, + "retweetConfirm": { + "message": "Bu ismarışı yenidən tvitlə: " + }, + "oldRT": { + "message": "Paylaş" + }, + "markAllRead": { + "message": "Hamısını oxundu olaraq işarələ" + }, + "newToken": { + "message": "Başqa simvolu xahiş edin" + }, + "shortenerIdleString": { + "message": "Bura qısaldılacaq ünvanı yazın. Açıq səhifəni sağdakı simvoldan qısaldın." + }, + "timelineHome": { + "message": "Əsas səhifə", + "description": "The home time line tab" + }, + "timelineDM": { + "message": "İsmarışlar", + "description": "The direct message time line tab" + }, + "timelineFavorites": { + "message": "Favoritlər", + "description": "The home time line tab" + }, + "tweet_singular": { + "message": "tvit" + }, + "tweet_plural": { + "message": "tvit" + }, + "newTweetsAvailable": { + "message": "Yeni $count$ tvit var. Oxumaq üçün basın.", + "placeholders": { + "count": { + "content": "$1" + }, + "tweets": { + "content": "$2" } - }, - "extDescription": { - "description": "Extension description", - "message": "Chromed Bird, Twitter hesabınızı Google Chrome üzərindən izləmənizi və idarə etmənizi təmin edən bir əlavədir." - }, - "follow_action": { - "message": "İzlə" - }, - "fromApp": { - "message": "nə ilə?:" - }, - "g_advanced": { - "message": "Təkminləşmiş" - }, - "g_image_service": { - "message": "Şəkil Xidməti" - }, - "g_microblogging_service": { - "message": "Mikrobloq xidməti" - }, - "g_notifications": { - "message": "Bildirişlər" - }, - "g_shortener": { - "message": "Qısaldıcı" - }, - "g_timelines": { - "message": "Axışlar" - }, - "g_ui": { - "message": "İnterfeys" - }, - "hide": { - "message": "Gizlət" - }, - "hour_plural": { - "message": "saat" - }, - "hour_singular": { - "message": "saat" - }, - "inReply": { - "message": "cavab olaraq:" - }, - "justNow": { - "message": "Az əvvəl" - }, - "l_base_oauth_signing_url": { - "message": "OAuth Giriş Ünvanı:" - }, - "l_base_oauth_url": { - "message": "OAuth Ünvanı:" - }, - "l_base_search_url": { - "message": "Axtarış API Ünvanı:" - }, - "l_base_signing_url": { - "message": "API Giriş Ünvanı:" - }, - "l_base_url": { - "message": "Twitter API Ünvanı:" - }, - "l_blocked_users": { - "message": "Qadağan edilən istifadəçilər:" - }, - "l_change_icon": { - "message": "Simvolu dəyişdir" - }, - "l_compose_position": { - "message": "Yeni tvit mövqesi:" - }, - "l_default_locale": { - "message": "Fərz edilən dil:" - }, - "l_font_family": { - "message": "Şrift:" - }, - "l_font_size": { - "message": "Şrift ölçüsü:" - }, - "l_hits_notice": { - "message": "Saatlıq API limiti: " - }, - "l_hover_timeout": { - "message": "Oxumaq üçün gözləmə müddəti (ms):" - }, - "l_icon_color": { - "message": "Simvol rəngi:" - }, - "l_icon_color_column": { - "message": "Simvol rəngi" - }, - "l_image_up_service": { - "message": "Şəkil Yükləmə Xidməti:" - }, - "l_include_in_unified": { - "message": "Birləşdirilən vaxt qrafikinə daxil et" - }, - "l_max_cached_tweets": { - "message": "Göstəriləcək maksimum tvit:" - }, - "l_name_attribute": { - "message": "Tvitlərdəki adlar necə görünsün?:" - }, - "l_noti_desktop": { - "message": "Stolüstü bildirişləri" - }, - "l_noti_on_page": { - "message": "Səhifə bildirişləri" - }, - "l_notification_fade_timeout": { - "message": "Bildiriş Fasiləsi(s):" - }, - "l_notification_max_popups": { - "message": "Maksimum bildiriş sayı (-1: hamısı):" - }, - "l_refresh_interval": { - "message": "Yeniləmə vaxtı(s)" - }, - "l_reply_all": { - "message": "Bütün bəhs edilənləri cavablandır:" - }, - "l_request_timeout": { - "message": "Sorğu Fasiləsi(ms):" - }, - "l_same_signing_urls": { - "message": "Eyni Giriş Ünvanları:" - }, - "l_share_include_title": { - "message": "Səhifə başlığını daxil et:" - }, - "l_shortener_acct": { - "message": "Şəxsi hesab istifadə et?" - }, - "l_shortener_key": { - "message": "API Açarı:" - }, - "l_shortener_login": { - "message": "API Giriş:" - }, - "l_show_expanded_urls": { - "message": "Qısaldılmış ünvanları genişlət:" - }, - "l_show_hits_in_popup": { - "message": "API istifadə sayını göstər:" - }, - "l_show_user_autocomplete": { - "message": "İstifadəçi adlarını avtomatik tamamla:" - }, - "l_tabs_count": { - "message": "Tir sayı" - }, - "l_theme": { - "message": "Mövzu:" - }, - "l_tweet_color": { - "message": "Tvit rəngi:" - }, - "l_tweet_notification": { - "message": "Tvit bildirişi" - }, - "l_tweets_color_only_unified": { - "message": "Rənglər yalnız birləşdiriləndə:" - }, - "l_tweets_notification_style": { - "message": "Bildiriş üslubu:" - }, - "l_tweets_per_page": { - "message": "Səhifə üçün göstəriləcək tvit sayı:" - }, - "l_unified_timeline": { - "message": "Birləşdirilən vaxt qrafiki:" - }, - "l_url_shortener": { - "message": "URL qısaldıcı:" - }, - "l_visible": { - "message": "Görünsün" - }, - "loadingImage": { - "message": "Təsvir yüklənir..." - }, - "loadingLongUrl": { - "message": "URL yüklənir..." - }, - "loadingMap": { - "message": "Xəritə yüklənir..." - }, - "logout": { - "description": "The text for the logout link", - "message": "Çıxış" - }, - "markAllRead": { - "message": "Hamısını oxundu olaraq işarələ" - }, - "markFavorite": { - "message": "Favoritlərə əlavə et" - }, - "minuteAgo": { - "message": "Saniyələr əvvəl" - }, - "minute_plural": { - "message": "dəqiqə" - }, - "minute_singular": { - "message": "dəqiqə" - }, - "minutes": { - "message": "$nr_of_minutes$ $minutes$ əvvəl", - "placeholders": { - "minutes": { - "content": "$2", - "example": "minute or minutes (singular / plural)" - }, - "nr_of_minutes": { - "content": "$1" - } + } + }, + "preventClosing": { + "message": "Bağlanmaması üçün basın." + }, + "changeNotificationSettings": { + "message": "Bildiriş nizamlarını seçimlər səhifəsindən dəyişdirə bilərsiniz." + }, + "loadingMap": { + "message": "Xəritə yüklənir..." + }, + "loadingImage": { + "message": "Təsvir yüklənir..." + }, + "loadingLongUrl": { + "message": "URL yüklənir..." + }, + "errorExpandingUrl": { + "message": "Bir səhv yarandı. Lütfən təkrar sınayın." + }, + "ajaxFailed": { + "message": "AJAX istəyi uğursuzdur (pis şəbəkə?)" + }, + "successAuth": { + "message": "Təbriklər, şəxsiyyətiniz təsdiqləndi. 'Chromed Bird'dən zövq alın!" + }, + "cbAuthorized": { + "message": "Chromed Bird səlahiyyətli!" + }, + "cbNotAuthorized": { + "message": "Bir səhv yarandı. Lütfən Chromed Bird ikonuna təkrar basın." + }, + "authorizing": { + "message": "Lütfən gözləyin..." + }, + "yourPIN": { + "message": "PIN nömrəniz: $pin$", + "placeholders": { + "pin":{ + "content": "$1" } - }, - "month_plural": { - "message": "ay" - }, - "month_singular": { - "message": "ay" - }, - "nerds_link": { - "message": "API istifadə statistikaları" - }, - "newToken": { - "message": "Başqa simvolu xahiş edt" - }, - "newTweets": { - "message": "$count$ $newtweets$", - "placeholders": { - "count": { - "content": "$1" - }, - "newtweets": { - "content": "$2" - } + } + }, + "tryAgain": { + "message": "Təkrar sınayın" + }, + "canceling": { + "message": "Ləğv edilir..." + }, + "cancelTweet": { + "message": "Ləğv et" + }, + "queued_messages": { + "message": "Sırada olan İsmarışlar:" + }, + "queue_trying": { + "message": "$timediff$ tarixindən bəri göndərilməyi gözləyir", + "placeholders": { + "timediff": { + "content": "$1" } - }, - "newTweetsAvailable": { - "message": "Yeni $count$ tvit var. Oxumaq üçün basın.", - "placeholders": { - "count": { - "content": "$1" - }, - "tweets": { - "content": "$2" - } + } + }, + "queue_retried": { + "message": "$timediff$ tarixindən bəri $retries$ dəfə göndərilməyə cəhd etdi [$laststatus$]", + "placeholders": { + "retries": { + "content": "$1" + }, + "timediff": { + "content": "$2" + }, + "laststatus": { + "content": "$3" } - }, - "newtweets_plural": { - "message": "yeni tvit" - }, - "newtweets_singular": { - "message": "yeni tvit" - }, - "notice_api_hits": { - "message": "Saatlıq API limiti ən çox \u003Cspan style=\"color: red;\"\u003E\u003Cspan class=\"__hourly_limit\"\u003E\u003C/span\u003E\u003C/span\u003E ola bilər!\u003Cbr\u003EƏgər birdən çox Twitter istəkçisi istifadə edirsinizsə aşağıdakı dəyərləri daha da azaltmalısınız." - }, - "notice_right_click_change": { - "message": "* Artıq pəncərədə sağı basaraq buradakı nizamların çoxunu pəncərə üzərindən dəyişdirə bilərsiniz." - }, - "notif_dms": { - "message": "Birbaşa ismarışlar:" - }, - "notif_home": { - "message": "Ana səhifə:" - }, - "notif_lists": { - "message": "Siyahılar:" - }, - "notif_mentions": { - "message": "Xatırlatmalar:" - }, - "notif_search": { - "message": "Axtar:" - }, - "oAuthError": { - "message": "Bir səhv yarandı: $errorMessage$. Lütfən \u003Ca href=\"javascript:OAuth.requestNewToken();\"\u003Esəlahiyyətləndirmə əməliyyatını təkrar başladın\u003C/a\u003E.", - "placeholders": { - "errorMessage": { - "content": "$1" - } + } + }, + "ue_fetchingLists": { + "message": "Siyahılar alınarkən $status$ səhvi yarandı.", + "placeholders": { + "status": { + "content": "$1" } - }, - "o_both": { - "message": "İkisi də" - }, - "o_bottom": { - "message": "Alt" - }, - "o_extra_large": { - "message": "Çok Böyük" - }, - "o_large": { - "message": "Böyük" - }, - "o_name": { - "message": "Əsl ad" - }, - "o_normal": { - "message": "Normal" - }, - "o_screen_name": { - "message": "İstifadəçi adı" - }, - "o_small": { - "message": "Kiçik" - }, - "o_top": { - "message": "Üst" - }, - "oldRT": { - "message": "Paylaş" - }, - "options": { - "description": "Options link", - "message": "Seçimlər" - }, - "options_title": { - "message": "Chromed Bird Seçimləri" - }, - "preventClosing": { - "message": "Bağlanmaması üçün basın." - }, - "profile_action": { - "message": "Profil" - }, - "queue_retried": { - "message": "$timediff$ tarixindən bəri $retries$ dəfə göndərilməyə cəhd edildi [$laststatus$]", - "placeholders": { - "laststatus": { - "content": "$3" - }, - "retries": { - "content": "$1" - }, - "timediff": { - "content": "$2" - } + } + }, + "ue_updatingTweets": { + "message": "Tvitlər yenilərkən $baseError$ səhvi yarandı.", + "placeholders": { + "baseError": { + "content": "$1" } - }, - "queue_trying": { - "message": "$timediff$ tarixindən bəri göndərilməyi gözləyir", - "placeholders": { - "timediff": { - "content": "$1" - } + } + }, + "ue_updatingTweets2": { + "message": "Əgər bu səhv ilə çox sıx qarşılaşırsınızsa çıxıb təkrar girməyi sınayın." + }, + "ue_deletingTweet": { + "message": "Tvit silinərkən $status$ səhvi yarandı.", + "placeholders": { + "status": { + "content": "$1" } - }, - "queued_messages": { - "message": "Sıradakı ismarışlar:" - }, - "rate_limit_reset": { - "message": "Bir sonrakı Twitter API sıfırlama tarixi: " - }, - "refresh": { - "description": "Refresh link", - "message": "Yenilə" - }, - "remaining_api_hits": { - "message": "Qalan Twitter API İstifadə Sayı: " - }, - "remove": { - "message": "Yığışdır" - }, - "resetSize": { - "message": "Fərz edilən ölçüyə qayıtmaq üçün cüt basın" - }, - "resume": { - "message": "Davam" - }, - "retweetConfirm": { - "message": "Bunu yenidən tvitlə: " - }, - "retweetedBy": { - "message": "təkrar tvitləyən:" - }, - "retweetedByMe": { - "message": "sizin tərəfinizdən təkrar tvitləndi" - }, - "selectList": { - "message": "- Siyahı seçin -" - }, - "sentTo": { - "message": "göndərildi" - }, - "shortenIt": { - "message": "Qısalt" - }, - "shorten_current": { - "message": "Cari səhifəni paylaş" - }, - "shortenerIdleString": { - "message": "Bura qısaldılacaq ünvanı yazın (Ctrl+V). Açıq səhifəni sağdakı simvoldan qısaldın." - }, - "show": { - "message": "Göstər" - }, - "successAuth": { - "message": "Təbriklər, şəxsiyyətiniz təsdiqləndi. Chromed Birddən zövq alın!" - }, - "suspend": { - "description": "Suspend link", - "message": "Ləğv et" - }, - "timeAgo": { - "message": "$time$ $time_string$ əvvəl", - "placeholders": { - "time": { - "content": "$1" - }, - "time_string": { - "content": "$2" - } + } + }, + "ue_retweeting": { + "message": "Təkrar tvitlərkən $status$ səhvi yarandı.", + "placeholders": { + "status": { + "content": "$1" } - }, - "timelineDM": { - "description": "The direct message time line tab", - "message": "İsmarışlar" - }, - "timelineFavorites": { - "description": "The home time line tab", - "message": "Favoritlər" - }, - "timelineHome": { - "description": "The home time line tab", - "message": "Ana səhifə" - }, - "tml_favorites": { - "message": "Favoritlər:" - }, - "tryAgain": { - "message": "Təkrar sınayın" - }, - "tweet_plural": { - "message": "tvit" - }, - "tweet_send_error": { - "message": "Tvitinizi göndərərkən səhv yarandı. Twitter qəribə davranır ola bilərmi? Təkrar sınaya bilərsiniz amma eyni ismarışı göndərmədiyinizdən əmin olun." - }, - "tweet_singular": { - "message": "tvit" - }, - "tweetit": { - "message": "Göndər" - }, - "tweets_action": { - "message": "Tvitlər" - }, - "ue_deletingTweet": { - "message": "Tvit silinərkən $status$ səhvi yarandı.", - "placeholders": { - "status": { - "content": "$1" - } + } + }, + "ue_markFavorite": { + "message": "Favoritlərə əlavə edərkən $status$ səhvi yarandı.", + "placeholders": { + "status": { + "content": "$1" } - }, - "ue_fetchingLists": { - "message": "Siyahılar alınarkən $status$ səhvi yarandı.", - "placeholders": { - "status": { - "content": "$1" - } + } + }, + "ue_unmarkFavorite": { + "message": "Favoritdən silərkən $status$ səhvi yarandı.", + "placeholders": { + "status": { + "content": "$1" } - }, - "ue_markFavorite": { - "message": "Favoritlərə əlavə edərkən $status$ səhvi yarandı.", - "placeholders": { - "status": { - "content": "$1" - } + } + }, + "newTweets": { + "message": "$count$ $newtweets$", + "placeholders": { + "count": { + "content": "$1" + }, + "newtweets": { + "content": "$2" } - }, - "ue_retweeting": { - "message": "Təkrar tvitlərkən $status$ səhvi yarandı.", - "placeholders": { - "status": { - "content": "$1" - } + } + }, + "newtweets_singular": { + "message": "yeni tvit" + }, + "newtweets_plural": { + "message": "yeni tvit" + }, + "btnAuthorize": { + "message": "Səlahiyyətləndir!" + }, + "exceededAPIHits": { + "message": "Gündəlik API istifadə limitini keçdiniz. Lütfən seçimlər səhifəsindən yeniləmə aralığını yoxlayın. Chromed Bird $nextResetDate $nextResetTime$ tarixinə qədər yenilənməyəcək.", + "placeholders": { + "options_url": { + "content": "$1" + }, + "nextResetDate": { + "content": "$2" + }, + "nextResetTime": { + "content": "$3" } - }, - "ue_unmarkFavorite": { - "message": "Favoritdən silərkən $status$ səhvi yarandı.", - "placeholders": { - "status": { - "content": "$1" - } + } + }, + "warningAPIHits": { + "message": "API limitinizi çox sürətli doldurursunuz.
Lütfən seçimlər səhifəsindən yeniləmə aralığını yoxlayın.
Qalan haq: $remainingHits$ - Bir sonrakı sıfırlama tarixi: $nextResetDate$ $nextResetTime$", + "placeholders": { + "options_url": { + "content": "$1" + }, + "remainingHits": { + "content": "$2" + }, + "nextResetDate": { + "content": "$3" + }, + "nextResetTime": { + "content": "$4" } - }, - "ue_updatingTweets": { - "message": "Tvitlər yenilərkən $baseError$ səhvi yarandı.", - "placeholders": { - "baseError": { - "content": "$1" - } + } + }, + "oAuthError": { + "message": "Bir səhv yarandı: $errorMessage$. Lütfən səlahiyyətləndirmə əməliyyatını təkrar başladın.", + "placeholders": { + "errorMessage": { + "content": "$1" } - }, - "ue_updatingTweets2": { - "message": "Əgər bu səhv ilə çox sıx qarşılaşırsınızsa çıxış edib təkrar girməyi sınayın." - }, - "unfollow_action": { - "message": "İzləməyi Burax" - }, - "unmarkFavorite": { - "message": "Favoritlərdən sil" - }, - "updateList": { - "message": "Siyahılar yenilənir..." - }, - "w_DM": { - "message": "İsmarışlar" - }, - "w_Favorites": { - "message": "Favoritlər" - }, - "w_Home": { - "message": "Ana səhifə" - }, - "w_Lists": { - "message": "Siyahılar" - }, - "w_Mentions": { - "message": "Xatırlatmalar" - }, - "w_ReceivedDM": { - "message": "Alınan İsmarışlar" - }, - "w_Search": { - "message": "Axtar" - }, - "w_SentDM": { - "message": "Göndərilən İsmarışlar" - }, - "w_Unified": { - "message": "Hamısı" - }, - "warningAPIHits": { - "message": "API limitinizi çox sürətli doldurursunuz.\u003Cbr\u003ELütfən \u003Ca href='javascript:chrome.tabs.create({url:\"$options_url$\"})'\u003Enizamlar səhifəsindən\u003C/a\u003E yeniləmə vaxtını yoxlayın.\u003Cbr\u003EQalan haqq: $remainingHits$ - Bir sonrakı sıfırlama tarixi: $nextResetDate$ $nextResetTime$", - "placeholders": { - "nextResetDate": { - "content": "$3" - }, - "nextResetTime": { - "content": "$4" - }, - "options_url": { - "content": "$1" - }, - "remainingHits": { - "content": "$2" - } + } + }, + "justNow": { + "message": "Az əvvəl" + }, + "minuteAgo": { + "message": "Saniyələr əvvəl" + }, + "minutes": { + "message": "$nr_of_minutes$ $minutes$ əvvəl", + "placeholders": { + "nr_of_minutes":{ + "content": "$1" + }, + "minutes": { + "content": "$2", + "example": "minute or minutes (singular / plural)" } - }, - "yearsAgo": { - "message": "il əvvəl" - }, - "yourPIN": { - "message": "PIN nömrəniz: $pin$", - "placeholders": { - "pin": { - "content": "$1" - } + } + }, + "minute_singular": { + "message": "dəqiqə" + }, + "minute_plural": { + "message": "dəqiqə" + }, + "timeAgo": { + "message": "$time$ $time_string$ əvvəl", + "placeholders": { + "time": { + "content": "$1" + }, + "time_string": { + "content": "$2" } - } + } + }, + "hour_singular": { + "message": "saat" + }, + "hour_plural": { + "message": "saat" + }, + "day_singular": { + "message": "gün" + }, + "day_plural": { + "message": "gün" + }, + "month_singular": { + "message": "ay" + }, + "month_plural": { + "message": "ay" + }, + "yearsAgo": { + "message": "il əvvəl" + }, + "options_title": { + "message": "Chromed Bird Seçimləri" + }, + "conf_saved": { + "message": "Nizamlarınız müvəffəqiyyətlə qeyd edildi." + }, + "changes_restart": { + "message": "Bəzi nizamların aktiv olması üçün əlavənin yenidən başladılması gərək. Bunu indi etmək istərsinizmi?
(Oxunmamış tvit sayınız sıfırlanacaq)" + }, + "remaining_api_hits": { + "message": "Qalan Twitter API İstifadə Sayı: " + }, + "rate_limit_reset": { + "message": "Bir sonrakı Twitter API sıfırlama tarixi: " + }, + "nerds_link": { + "message": "API istifadə statistikaları" + }, + "g_ui": { + "message": "İnterfeys" + }, + "l_name_attribute": { + "message": "Tvitlərdəki adlar necə görünsün?:" + }, + "o_screen_name": { + "message": "İstifadəçi adı" + }, + "o_name": { + "message": "Gerçək ad" + }, + "o_both": { + "message": "İkisi də" + }, + "l_compose_position": { + "message": "Yeni tvit mövqesi:" + }, + "o_top": { + "message": "Üst" + }, + "o_bottom": { + "message": "Alt" + }, + "l_theme": { + "message": "Mövzu:" + }, + "l_font_size": { + "message": "Şrift ölçüsü:" + }, + "o_small": { + "message": "Kiçik" + }, + "o_normal": { + "message": "Normal" + }, + "o_large": { + "message": "Böyük" + }, + "o_extra_large": { + "message": "Çox böyük" + }, + "l_font_family": { + "message": "Şrift:" + }, + "l_hover_timeout": { + "message": "Oxumaq üçün üzərində gözləmə müddəti (ms):" + }, + "l_show_expanded_urls": { + "message": "Qısaldılmış ünvanları genişlət:" + }, + "l_reply_all": { + "message": "Bütün xatırlatmaları cavablandır:" + }, + "l_show_hits_in_popup": { + "message": "API istifadə sayını göstər:" + }, + "l_show_user_autocomplete": { + "message": "İstifadəçi adlarını avtomatik tamamla:" + }, + "l_icon_color": { + "message": "Simvol rəngi:" + }, + "l_tweets_color_only_unified": { + "message": "Yalnız birləşmiş axışda rənglər:" + }, + "l_tweet_color": { + "message": "Tvit rəngi:" + }, + "w_Mentions": { + "message": "Xatırlatmalar" + }, + "btn_reset_popup_size": { + "message": "Pəncərə Ölçüsünü Bərpa et" + }, + "g_notifications": { + "message": "Bildirişlər" + }, + "l_tweet_notification": { + "message": "Tvit bildirişi" + }, + "l_change_icon": { + "message": "Simvolu dəyişdir" + }, + "l_icon_color_column": { + "message": "Simvol rəngi" + }, + "notif_home": { + "message": "Əsas səhifə:" + }, + "notif_mentions": { + "message": "Xatırlatmalar:" + }, + "notif_dms": { + "message": "Birbaşa ismarışlar:" + }, + "notif_lists": { + "message": "Siyahılar:" + }, + "notif_search": { + "message": "Axtar:" + }, + "l_tweets_notification_style": { + "message": "Bildiriş tərzi:" + }, + "l_noti_on_page": { + "message": "Skaner bildirişləri" + }, + "l_noti_desktop": { + "message": "Stolüstü bildirişləri" + }, + "l_notification_fade_timeout": { + "message": "Bildiriş fasiləsi(s):" + }, + "l_notification_max_popups": { + "message": "Maksimum bildiriş sayı (-1: hamısı):" + }, + "g_shortener": { + "message": "Qısaldıcı" + }, + "l_url_shortener": { + "message": "URL qısaldıcı:" + }, + "l_shortener_acct": { + "message": "Fərdi hesab istifadə et?" + }, + "l_shortener_login": { + "message": "API Giriş:" + }, + "l_shortener_key": { + "message": "API Açarı:" + }, + "l_share_include_title": { + "message": "Səhifə başlığını daxil et:" + }, + "g_timelines": { + "message": "Axışlar" + }, + "notice_api_hits": { + "message": "Saatlıq API limiti ən çox ola bilər!
Əgər birdən çox Twitter vasitəçisi istifadə edirsinizsə aşağıdakı dəyərləri daha da azaltmalısınız." + }, + "l_hits_notice": { + "message": "Saatlıq API limiti: " + }, + "l_visible": { + "message": "Görünsün" + }, + "l_refresh_interval": { + "message": "Yeniləmə aralığı(s)" + }, + "l_include_in_unified": { + "message": "Birləşmiş axışa daxil et" + }, + "l_tabs_count": { + "message": "Hesab sayı" + }, + "l_unified_timeline": { + "message": "Birləşmiş Axış:" + }, + "tml_favorites": { + "message": "Favoritlər:" + }, + "l_blocked_users": { + "message": "Qadağan edilən istifadəçilər:" + }, + "notice_right_click_change": { + "message": "* Artıq pəncərədə sağı basaraq buradakı nizamların çoxunu pəncərə üzərindən dəyişdirə bilərsiniz." + }, + "l_tweets_per_page": { + "message": "Səhifə başı göstəriləcək tvit sayı:" + }, + "l_max_cached_tweets": { + "message": "Göstəriləcək maksimum tvit:" + }, + "g_microblogging_service": { + "message": "Mikrobloq xidməti" + }, + "g_advanced": { + "message": "Təkminləşmiş" + }, + "l_request_timeout": { + "message": "İstək fasiləsi(ms):" + }, + "l_base_url": { + "message": "Twitter API Ünvanı:" + }, + "l_base_oauth_url": { + "message": "OAuth Ünvanı:" + }, + "l_same_signing_urls": { + "message": "Eyni Giriş Ünvanları:" + }, + "l_base_signing_url": { + "message": "API Giriş Ünvanı:" + }, + "l_base_oauth_signing_url": { + "message": "OAuth Giriş Ünvanı:" + }, + "l_base_search_url": { + "message": "Axtarış API Ünvanı:" + }, + "btn_save": { + "message": "Qeyd et" + }, + "btn_reset": { + "message": "Bərpa et" + }, + "btn_default": { + "message": "Fərz edilən nizamlara geri qayıt" + }, + "shortenIt": { + "message": "Qısalt" + }, + "shorten_current": { + "message": "Hazırkı səhifəni paylaş" + }, + "tweet_send_error": { + "message": "Tvitinizi göndərərkən bir səhv yarandı. Twitter qəribə davranır ola bilərmi? Təkrar sınaya bilərsiniz amma eyni ismarış göndərmədiyinizdən əmin olun." + }, + "detach_window": { + "message": "Pəncərəni Ayır" + }, + "follow_action": { + "message": "İzlə" + }, + "unfollow_action": { + "message": "İzləmə" + }, + "tweets_action": { + "message": "Tvitlər" + }, + "profile_action": { + "message": "Profil" + }, + "add_mention_action": { + "message": "Xatırlat" + }, + "g_image_service": { + "message": "Şəkil Xidməti" + }, + "l_image_up_service": { + "message": "Şəkil Yükləmə Xidməti:" + }, + "l_default_locale": { + "message": "Fərz edilən dil:" + }, + "automatic": { + "message": "Avtomatik" + }, + "trending_topics": { + "message": "Trendlər" + }, + "g_trending_topics": { + "message": "Trend mövzular" + }, + "l_trending_topics_woeid": { + "message": "Yerlər üzrə trend mövzular:" + }, + "l_use_streaming_api": { + "message": "Axın APİ-si istifadə edin (sınaqda!):" + }, + "l_user_stream_url": { + "message": "İstifadəçi axın URL-i:" + }, + "block_action": { + "message": "Qadağa" + }, + "report_action": { + "message": "Spam Şikayəti" + } } From 46e987ea92af9a00eb1adebe5f77ea63629163f8 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Mon, 4 Apr 2011 07:15:54 -0300 Subject: [PATCH 134/135] Fixing mistake in Changelog. --- Changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Changelog b/Changelog index cc40ba73..13bf184a 100644 --- a/Changelog +++ b/Changelog @@ -7,7 +7,7 @@ * Improved compatibility with proxlet.com (Sending OAuth params on HTTP header); * Lots of fixes for desktop notification misbehavior; * Returning to previously selected tab after closing a tab; -* Azerbaijani localization (Thanks Berker Peksag); +* Azerbaijani localization (Thanks Tural Əlisoy); * New url shortener va.mu (Thanks Arthur Furlan) and hurl.im; * Improved support to img.ur (Thanks Shelby DeNike) From 15b15fcef0300f4e6bd53d016e791082edcb7796 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cezar=20S=C3=A1=20Espinola?= Date: Mon, 4 Apr 2011 04:17:44 -0700 Subject: [PATCH 135/135] Edited README.md via GitHub --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c8552e20..951c8e4f 100644 --- a/README.md +++ b/README.md @@ -6,11 +6,11 @@ 2. Installing - Check the [download page](http://cezarsa.github.com/chromed_bird/) + Check the [download page](https://chrome.google.com/webstore/detail/encaiiljifbdbjlphpgpiimidegddhic) 3. Compatibility - Currently only Dev channel releases of Google Chrome support extensions. Check [http://dev.chromium.org/getting-involved/dev-channel](http://dev.chromium.org/getting-involved/dev-channel). + It works on all Chrome distribution channels: Stable, Beta and Dev. 4. Features