Bug 1370383 - Export Screenshots 9.0.0 to Firefox; r?Standard8 draft
authorIan Bicking <ianb@colorstudy.com>
Mon, 05 Jun 2017 17:11:19 -0500
changeset 589242 8205ff1e03bddd91b348a3b9af03f091c8560f23
parent 589150 cad53f061da634a16ea75887558301b77f65745d
child 631806 41e6bbb68d286369bf742db4875b864881cdb103
push id62293
push userbmo:ianb@mozilla.com
push dateMon, 05 Jun 2017 22:14:42 +0000
reviewersStandard8
bugs1370383
milestone55.0a1
Bug 1370383 - Export Screenshots 9.0.0 to Firefox; r?Standard8
browser/extensions/screenshots/install.rdf
browser/extensions/screenshots/moz.build
browser/extensions/screenshots/webextension/_locales/ar/messages.json
browser/extensions/screenshots/webextension/_locales/de/messages.json
browser/extensions/screenshots/webextension/_locales/dsb/messages.json
browser/extensions/screenshots/webextension/_locales/en_US/messages.json
browser/extensions/screenshots/webextension/_locales/es_MX/messages.json
browser/extensions/screenshots/webextension/_locales/fr/messages.json
browser/extensions/screenshots/webextension/_locales/hsb/messages.json
browser/extensions/screenshots/webextension/_locales/hu/messages.json
browser/extensions/screenshots/webextension/_locales/it/messages.json
browser/extensions/screenshots/webextension/_locales/ja/messages.json
browser/extensions/screenshots/webextension/_locales/pt_BR/messages.json
browser/extensions/screenshots/webextension/_locales/sk/messages.json
browser/extensions/screenshots/webextension/_locales/sl/messages.json
browser/extensions/screenshots/webextension/_locales/sr/messages.json
browser/extensions/screenshots/webextension/_locales/sv_SE/messages.json
browser/extensions/screenshots/webextension/_locales/te/messages.json
browser/extensions/screenshots/webextension/_locales/uk/messages.json
browser/extensions/screenshots/webextension/background/auth.js
browser/extensions/screenshots/webextension/background/senderror.js
browser/extensions/screenshots/webextension/build/buildSettings.js
browser/extensions/screenshots/webextension/build/inlineSelectionCss.js
browser/extensions/screenshots/webextension/build/shot.js
browser/extensions/screenshots/webextension/manifest.json
browser/extensions/screenshots/webextension/onboarding/slides.js
browser/extensions/screenshots/webextension/selector/shooter.js
browser/extensions/screenshots/webextension/selector/ui.js
browser/extensions/screenshots/webextension/selector/uicontrol.js
--- a/browser/extensions/screenshots/install.rdf
+++ b/browser/extensions/screenshots/install.rdf
@@ -7,14 +7,14 @@
     <em:targetApplication>
       <Description>
         <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id> <!--Firefox-->
         <em:minVersion>51.0a1</em:minVersion>
         <em:maxVersion>*</em:maxVersion>
       </Description>
     </em:targetApplication>
     <em:type>2</em:type>
-    <em:version>8.1.0</em:version>
+    <em:version>9.0.0</em:version>
     <em:bootstrap>true</em:bootstrap>
     <em:homepageURL>https://pageshot.net/</em:homepageURL>
     <em:multiprocessCompatible>true</em:multiprocessCompatible>
   </Description>
 </RDF>
--- a/browser/extensions/screenshots/moz.build
+++ b/browser/extensions/screenshots/moz.build
@@ -23,16 +23,20 @@ FINAL_TARGET_FILES.features['screenshots
   'webextension/randomString.js',
   'webextension/sitehelper.js'
 ]
 
 FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["ach"] += [
   'webextension/_locales/ach/messages.json'
 ]
 
+FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["ar"] += [
+  'webextension/_locales/ar/messages.json'
+]
+
 FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["az"] += [
   'webextension/_locales/az/messages.json'
 ]
 
 FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["be"] += [
   'webextension/_locales/be/messages.json'
 ]
 
new file mode 100644
--- /dev/null
+++ b/browser/extensions/screenshots/webextension/_locales/ar/messages.json
@@ -0,0 +1,123 @@
+{
+  "addonDescription": {
+    "message": "خذ مقاطع و لقطات من الوب و احفظهم مؤقتًا أو دائمًا."
+  },
+  "addonAuthorsList": {
+    "message": "موزيلا <screenshots-feedback@mozilla.com>"
+  },
+  "contextMenuLabel": {
+    "message": "خذ لقطة شاشة"
+  },
+  "myShotsLink": {
+    "message": "لقطاتي"
+  },
+  "screenshotInstructions": {
+    "message": "اسحب أو انقر في الصفحة لاختيار منطقة. اضغط ESC للإلغاء."
+  },
+  "saveScreenshotSelectedArea": {
+    "message": "احفظ"
+  },
+  "saveScreenshotVisibleArea": {
+    "message": "احفظ الجزء المرئي"
+  },
+  "saveScreenshotFullPage": {
+    "message": "احفظ كل الصفحة"
+  },
+  "cancelScreenshot": {
+    "message": "ألغِ"
+  },
+  "downloadScreenshot": {
+    "message": "نزّل"
+  },
+  "notificationLinkCopiedTitle": {
+    "message": "نُسخ الرابط"
+  },
+  "notificationLinkCopiedDetails": {
+    "message": "نُسِخَ رابط اللقطة إلى الحافظة. اضغط $META_KEY$-V للصقها.",
+    "placeholders": {
+      "meta_key": {
+        "content": "$1"
+      }
+    }
+  },
+  "requestErrorTitle": {
+    "message": "خارج الخدمة."
+  },
+  "requestErrorDetails": {
+    "message": "تعذّر حفظ لقطتك. رجاء أعد المحاولة فيما بعد."
+  },
+  "connectionErrorTitle": {
+    "message": "تعذّر الاتصال بلقطات شاشتك."
+  },
+  "connectionErrorDetails": {
+    "message": "رجاء فحص اتصال الإنترنت. إذا كان باستطاعتك الاتصال بالإنترنت، فربما هناك عطل مؤقت في خدمة «لقطات شاشة فَيَرفُكس»."
+  },
+  "loginErrorDetails": {
+    "message": "تعذّر حفظ لقطتك لعُطل في خدمة «لقطات شاشة فَيَرفُكس». رجاء إعادة المحاولة لاحقًا."
+  },
+  "unshootablePageErrorTitle": {
+    "message": "تعذّر أخذ لقطة شاشة لهذه الصفحة."
+  },
+  "unshootablePageErrorDetails": {
+    "message": "ليست هذه صفحة وِب قياسية، لذا لا يمكنك أخذ لقطة لها."
+  },
+  "selfScreenshotErrorTitle": {
+    "message": "لا يمكننا أخذ لقطة لصفحة من صفحات «لقطات شاشة فَيَرفُكس»!"
+  },
+  "genericErrorTitle": {
+    "message": "هناك عطل في «لقطات شاشة فَيَرفُكس»."
+  },
+  "genericErrorDetails": {
+    "message": "لسنا متأكدين ما المشكلة. أتمانع إعادة المحاولة أو أخذ لقطة لصفحة أخرى؟"
+  },
+  "tourBodyOne": {
+    "message": "خذ لقطات الشاشة و احفظها و شارطها دون مغادرة فَيَرفُكس."
+  },
+  "tourHeaderTwo": {
+    "message": "التقط ما تريده فقط"
+  },
+  "tourBodyTwo": {
+    "message": "انقر و اسحب لالتقاط جزء معين من الصفحة. يمكنك أيضًا التحويم لإبراز التحديد."
+  },
+  "tourHeaderThree": {
+    "message": "كما تريدها"
+  },
+  "tourBodyThree": {
+    "message": "احفظ اللقطات التي أخذتها على الوب لمشاركتها بسهولة، أو نزّلها على حاسوبك. يمكنك أيضًل النقر على زر ”لقطاتي“ للعثور على كل اللقطات التي أخذتها."
+  },
+  "tourHeaderFour": {
+    "message": "التقط النوافذ أو صفحات كاملة"
+  },
+  "tourBodyFour": {
+    "message": "اختر الأزرار في أعلى اليمين لالتقاط المنطقة المرئية في النافذة أو الصفحة كلها."
+  },
+  "tourSkip": {
+    "message": "تخطَّ"
+  },
+  "tourNext": {
+    "message": "الشريحة التالية"
+  },
+  "tourPrevious": {
+    "message": "الشريحة السابقة"
+  },
+  "tourDone": {
+    "message": "تمّ"
+  },
+  "termsAndPrivacyNoticeCloudServices": {
+    "message": "استخدامك لخدمات «لقطات شاشة فَيَرفُكس» يعني موافقتك على $TERMSANDPRIVACYNOTICETERMSLINK$ و $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
+    "placeholders": {
+      "termsandprivacynoticetermslink": {
+        "content": "$1"
+      },
+      "termsandprivacynoticeprivacylink": {
+        "content": "$2"
+      }
+    }
+  },
+  "termsAndPrivacyNoticeTermsLink": {
+    "message": "الشروط"
+  },
+  "termsAndPrivacyNoticyPrivacyLink": {
+    "message": "تنويه الخصوصية"
+  }
+}
\ No newline at end of file
--- a/browser/extensions/screenshots/webextension/_locales/de/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/de/messages.json
@@ -59,16 +59,19 @@
     "message": "Ein Bildschirmfoto dieser Seite ist nicht möglich."
   },
   "unshootablePageErrorDetails": {
     "message": "Dies ist keine Standard-Webseite, daher sind keine Bildschirmfotos von ihr möglich."
   },
   "selfScreenshotErrorTitle": {
     "message": "Sie können kein Bildschirmfoto einer Firefox-Screenshots-Seite machen!"
   },
+  "emptySelectionErrorTitle": {
+    "message": "Ihr Auswahlbereich ist zu klein"
+  },
   "genericErrorTitle": {
     "message": "Firefox Screenshots funktioniert nicht richtig."
   },
   "genericErrorDetails": {
     "message": "Wir wissen auch nicht, was gerade passiert ist. Könnten Sie das Bildschirmfoto erneut oder auf einer anderen Seite aufnehmen?"
   },
   "tourBodyOne": {
     "message": "Bildschirmfotos aufnehmen, speichern und teilen, ohne Firefox zu verlassen."
--- a/browser/extensions/screenshots/webextension/_locales/dsb/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/dsb/messages.json
@@ -59,16 +59,19 @@
     "message": "Foto wobrazowki toś togo boka njejo móžne."
   },
   "unshootablePageErrorDetails": {
     "message": "To njejo standardny webbok, togodla foto wobrazowki wót njeje njejo móžne."
   },
   "selfScreenshotErrorTitle": {
     "message": "Njamóžośo wobrazowku boka Firefox Screenshots fotografěrowaś!"
   },
+  "emptySelectionErrorTitle": {
+    "message": "Waš wuběrk jo pśemały"
+  },
   "genericErrorTitle": {
     "message": "Hopla! Firefox Screenshots njeźěła."
   },
   "genericErrorDetails": {
     "message": "Njejsmy se wěste, což jo se stało. Cośo hyšći raz wopytaś abo cośo drugi bok fotografěrowaś?"
   },
   "tourBodyOne": {
     "message": "Gótujśo, składujśo a źělśo fota wobrazowki mimo až Firefox spušćaśo."
--- a/browser/extensions/screenshots/webextension/_locales/en_US/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/en_US/messages.json
@@ -59,16 +59,19 @@
     "message": "We can’t screenshot this page."
   },
   "unshootablePageErrorDetails": {
     "message": "This isn’t a standard Web page, so you can’t take a screenshot of it."
   },
   "selfScreenshotErrorTitle": {
     "message": "You can’t take a shot of a Firefox Screenshots page!"
   },
+  "emptySelectionErrorTitle": {
+    "message": "Your selection is too small"
+  },
   "genericErrorTitle": {
     "message": "Whoa! Firefox Screenshots went haywire."
   },
   "genericErrorDetails": {
     "message": "We’re not sure what just happened. Care to try again or take a shot of a different page?"
   },
   "tourBodyOne": {
     "message": "Take, save, and share screenshots without leaving Firefox."
--- a/browser/extensions/screenshots/webextension/_locales/es_MX/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/es_MX/messages.json
@@ -59,16 +59,19 @@
     "message": "No podemos realizar una captura de pantalla a esta página."
   },
   "unshootablePageErrorDetails": {
     "message": "Esta no es una página web estándar, por lo tanto no podemos tomar una captura de pantalla de ella."
   },
   "selfScreenshotErrorTitle": {
     "message": "¡No puedes tomar una captura de la página de capturas de pantalla de Firefox!"
   },
+  "emptySelectionErrorTitle": {
+    "message": "Tu selección es demasiado pequeña"
+  },
   "genericErrorTitle": {
     "message": "¡Oye! Las capturas de pantalla de Firefox salieron mal."
   },
   "genericErrorDetails": {
     "message": "No estamos seguros qué pasó. ¿Te importaría intentarlo de nuevo o tomar una captura de una página diferente?"
   },
   "tourBodyOne": {
     "message": "Toma, guarda y comparte capturas de pantalla sin dejar Firefox."
--- a/browser/extensions/screenshots/webextension/_locales/fr/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/fr/messages.json
@@ -59,16 +59,19 @@
     "message": "Impossible d’effectuer une capture de cette page."
   },
   "unshootablePageErrorDetails": {
     "message": "Impossible d’effectuer une capture d’écran, car cette page web n’est pas standard."
   },
   "selfScreenshotErrorTitle": {
     "message": "Vous ne pouvez pas effectuer une capture d’écran d’une page Firefox Screenshots."
   },
+  "emptySelectionErrorTitle": {
+    "message": "La zone sélectionnée est trop petite"
+  },
   "genericErrorTitle": {
     "message": "Firefox Screenshots semble avoir un problème."
   },
   "genericErrorDetails": {
     "message": "Un problème non identifié est survenu. Vous pouvez réessayer ou effectuer une capture d’écran d’une autre page."
   },
   "tourBodyOne": {
     "message": "Effectuez des captures d’écran, enregistrez et partagez-les sans quitter Firefox."
--- a/browser/extensions/screenshots/webextension/_locales/hsb/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/hsb/messages.json
@@ -59,16 +59,19 @@
     "message": "Foto wobrazowki tuteje strony móžne njeje."
   },
   "unshootablePageErrorDetails": {
     "message": "To standardna webstrona njeje, tohodla foto wobrazowki wot njeje móžne njeje."
   },
   "selfScreenshotErrorTitle": {
     "message": "Njemóžeće wobrazowku strony Firefox Screenshots fotografować!"
   },
+  "emptySelectionErrorTitle": {
+    "message": "Waš wuběr je přemały"
+  },
   "genericErrorTitle": {
     "message": "Hopla! Firefox Screenshots njefunguje."
   },
   "genericErrorDetails": {
     "message": "Njejsmy sej wěsći, štož je so stało. Chceće hišće raz spytać abo chceće druhu stronu fotografować?"
   },
   "tourBodyOne": {
     "message": "Čińće, składujće a dźělće fota wobrazowki bjez toho, zo byšće Firefox wopušćił."
--- a/browser/extensions/screenshots/webextension/_locales/hu/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/hu/messages.json
@@ -59,16 +59,19 @@
     "message": "Nem lehet képet készíteni erről a lapról."
   },
   "unshootablePageErrorDetails": {
     "message": "Ez egy nem szabványos weblap, így nem készíthet róla képernyőképet."
   },
   "selfScreenshotErrorTitle": {
     "message": "Nem készíthet képet a Firefox képernyőképek oldalról!"
   },
+  "emptySelectionErrorTitle": {
+    "message": "A kijelölés túl kicsi"
+  },
   "genericErrorTitle": {
     "message": "Húha! A Firefox képernyőképek megkergült."
   },
   "genericErrorDetails": {
     "message": "Nem vagyunk benne biztosak, hogy mi történt. Próbálja újra, vagy készítsen képet egy másik oldalról."
   },
   "tourBodyOne": {
     "message": "Készítsen, mentsen és osszon meg képernyőképeket, anélkül, hogy elhagyná a Firefoxot."
--- a/browser/extensions/screenshots/webextension/_locales/it/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/it/messages.json
@@ -59,16 +59,19 @@
     "message": "Non è possibile salvare uno screenshot di questa pagina."
   },
   "unshootablePageErrorDetails": {
     "message": "Non è possibile salvare uno screenshot in quanto non si tratta di una normale pagina web."
   },
   "selfScreenshotErrorTitle": {
     "message": "Non è possibile salvare uno screenshot di una pagina di Firefox Screenshots"
   },
+  "emptySelectionErrorTitle": {
+    "message": "L’area selezionata è troppo piccola"
+  },
   "genericErrorTitle": {
     "message": "Wow! Firefox Screenshots è andato in tilt"
   },
   "genericErrorDetails": {
     "message": "Non sappiamo che cosa sia successo. Riprova, magari con una pagina diversa."
   },
   "tourBodyOne": {
     "message": "Cattura, salva e condividi screenshot senza mai uscire da Firefox."
--- a/browser/extensions/screenshots/webextension/_locales/ja/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/ja/messages.json
@@ -59,16 +59,19 @@
     "message": "このページはスクリーンショットを撮れません。"
   },
   "unshootablePageErrorDetails": {
     "message": "これは通常のウェブページでないため、スクリーンショットを撮ることができません。"
   },
   "selfScreenshotErrorTitle": {
     "message": "Firefox Screenshots ページのショットは撮れません。"
   },
+  "emptySelectionErrorTitle": {
+    "message": "選択範囲が小さすぎます"
+  },
   "genericErrorTitle": {
     "message": "Firefox Screenshots に問題が発生しました。"
   },
   "genericErrorDetails": {
     "message": "何か問題が発生したようです。再度試すか、別のページのショットを撮ってみてください。"
   },
   "tourBodyOne": {
     "message": "Firefox を離れることなく、スクリーンショットを撮影、保存、共有。"
--- a/browser/extensions/screenshots/webextension/_locales/pt_BR/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/pt_BR/messages.json
@@ -7,17 +7,17 @@
   },
   "contextMenuLabel": {
     "message": "Tirar uma captura de tela"
   },
   "myShotsLink": {
     "message": "Minhas capturas"
   },
   "screenshotInstructions": {
-    "message": "Arraste ou clique na página para selecionar uma área. Pressione ESC para cancelar."
+    "message": "Arraste ou clique na página para selecionar uma região. Pressione ESC para cancelar."
   },
   "saveScreenshotSelectedArea": {
     "message": "Salvar"
   },
   "saveScreenshotVisibleArea": {
     "message": "Salvar área visível"
   },
   "saveScreenshotFullPage": {
@@ -36,17 +36,17 @@
     "message": "O link da sua captura foi copiado para a área de transferência. Pressione $META_KEY$-V para colar.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
-    "message": "Fora de ordem."
+    "message": "Com defeito."
   },
   "requestErrorDetails": {
     "message": "Desculpa! Não pudemos salvar a sua captura de tela. Por favor, tente novamente mais tarde."
   },
   "connectionErrorTitle": {
     "message": "Não conseguimos conectar suas capturas de tela."
   },
   "connectionErrorDetails": {
--- a/browser/extensions/screenshots/webextension/_locales/sk/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/sk/messages.json
@@ -59,16 +59,19 @@
     "message": "Túto stránku nemôžeme zachytiť."
   },
   "unshootablePageErrorDetails": {
     "message": "Toto nie je štandardná webová stránka, takže z nej nemôžeme vytvoriť snímku obrazovky."
   },
   "selfScreenshotErrorTitle": {
     "message": "Nemôžete vytvoriť snímku obrazovky stránky Firefox Screenshots!"
   },
+  "emptySelectionErrorTitle": {
+    "message": "Váš výber je príliš malý"
+  },
   "genericErrorTitle": {
     "message": "Ups! Služba Firefox Screenshots prestala pracovať."
   },
   "genericErrorDetails": {
     "message": "Nie sme si istí, čo sa práve stalo. Chcete tú skúsiť znova alebo chcete vytvoriť snímku inej stránky?"
   },
   "tourBodyOne": {
     "message": "Tvorte, ukladajte a zdieľajte snímky obrazovky bez toho, aby ste museli opustiť Firefox."
--- a/browser/extensions/screenshots/webextension/_locales/sl/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/sl/messages.json
@@ -59,16 +59,19 @@
     "message": "Ne moremo zajeti posnetka te strani."
   },
   "unshootablePageErrorDetails": {
     "message": "To ni običajna spletna stran, zato ne morete zajeti njenega zaslonskega posnetka."
   },
   "selfScreenshotErrorTitle": {
     "message": "Posnetka strani Firefox Screenshots ni mogoče zajeti!"
   },
+  "emptySelectionErrorTitle": {
+    "message": "Vaš izbor je premajhen"
+  },
   "genericErrorTitle": {
     "message": "Uf! Firefox Screenshots se je pokvaril."
   },
   "genericErrorDetails": {
     "message": "Ne vemo točno, kaj se je pravkar zgodilo. Bi radi poskusili znova ali pa zajeli posnetek kakšne druge strani?"
   },
   "tourBodyOne": {
     "message": "Zajemite, shranite in delite zaslonske posnetke, ne da bi zapustili Firefox."
--- a/browser/extensions/screenshots/webextension/_locales/sr/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/sr/messages.json
@@ -1,17 +1,17 @@
 {
   "addonDescription": {
     "message": "Бележите снимке екрана са веба и сачувајте их привремено или трајно."
   },
   "addonAuthorsList": {
     "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
-    "message": "Усликајте екран"
+    "message": "Усликај екран"
   },
   "myShotsLink": {
     "message": "Моји снимци"
   },
   "screenshotInstructions": {
     "message": "Превуците или кликните на страницу да изаберете област. Притисните ESC да прекинете."
   },
   "saveScreenshotSelectedArea": {
@@ -59,16 +59,19 @@
     "message": "Не можемо забележити снимак ове странице."
   },
   "unshootablePageErrorDetails": {
     "message": "Ово није стандардна веб страница, тако да не можете забележити њен снимак."
   },
   "selfScreenshotErrorTitle": {
     "message": "Не можете усликати Firefox Screenshots страницу!"
   },
+  "emptySelectionErrorTitle": {
+    "message": "Ваша селекција је премала"
+  },
   "genericErrorTitle": {
     "message": "Ајој! Firefox Screenshots је пошашавио."
   },
   "genericErrorDetails": {
     "message": "Нисмо сигурни шта се управо догодило. Желите ли покушати поново или да усликате другачију страницу?"
   },
   "tourBodyOne": {
     "message": "Забележите, сачувајте и поделите снимке екрана без напуштања Firefox-а."
--- a/browser/extensions/screenshots/webextension/_locales/sv_SE/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/sv_SE/messages.json
@@ -59,16 +59,19 @@
     "message": "Vi kan inte ta en skärmbild av sidan."
   },
   "unshootablePageErrorDetails": {
     "message": "Detta är inte en vanlig webbsida, så du kan inte ta en skärmbild av den."
   },
   "selfScreenshotErrorTitle": {
     "message": "Du kan inte ta en skärmbild av sidan Firefox Screenshots!"
   },
+  "emptySelectionErrorTitle": {
+    "message": "Ditt val är för litet"
+  },
   "genericErrorTitle": {
     "message": "Oj! Firefox Screenshots verkar inte fungera korrekt."
   },
   "genericErrorDetails": {
     "message": "Vi är inte säkra på vad som just hände. Kan du försöka igen eller ta en bild på en annan sida?"
   },
   "tourBodyOne": {
     "message": "Ta, spara, och dela skärmbilder utan att lämna Firefox."
--- a/browser/extensions/screenshots/webextension/_locales/te/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/te/messages.json
@@ -6,31 +6,40 @@
     "message": "ఒక తెరపట్టు తీసుకోండి"
   },
   "myShotsLink": {
     "message": "నా షాట్లు"
   },
   "saveScreenshotSelectedArea": {
     "message": "భద్రపరచు"
   },
+  "saveScreenshotVisibleArea": {
+    "message": "కనిపించే దానిని బద్రపరచండి"
+  },
   "saveScreenshotFullPage": {
     "message": "పూర్తి పేజీని భద్రపరచు"
   },
   "cancelScreenshot": {
     "message": "రద్దుచేయి"
   },
   "downloadScreenshot": {
     "message": "దింపుకోండి"
   },
   "notificationLinkCopiedTitle": {
     "message": "లంకె కాపీ అయింది"
   },
+  "requestErrorTitle": {
+    "message": "పని చెయుట లేదు."
+  },
   "requestErrorDetails": {
     "message": "క్షమిచండి! మీ తెరను భద్రపరచలేకపోయాం. దయచేసి కాసేపాగి మళ్ళీ ప్రయత్నించండి."
   },
+  "tourHeaderTwo": {
+    "message": ""
+  },
   "tourHeaderThree": {
     "message": "మీకు నచ్చినట్టుగా"
   },
   "tourSkip": {
     "message": "దాటవేయి"
   },
   "tourNext": {
     "message": "తర్వాతి ఫలకం"
--- a/browser/extensions/screenshots/webextension/_locales/uk/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/uk/messages.json
@@ -59,16 +59,19 @@
     "message": "Ми не можемо зробити знімок цієї сторінки."
   },
   "unshootablePageErrorDetails": {
     "message": "Це не стандартна веб-сторінка, тому ви не можете зробити її знімок."
   },
   "selfScreenshotErrorTitle": {
     "message": "Ви не можете зробити знімок сторінки Firefox Screenshots!"
   },
+  "emptySelectionErrorTitle": {
+    "message": "Обрана область є замалою"
+  },
   "genericErrorTitle": {
     "message": "Оу! З Firefox Screenshots щось негаразд."
   },
   "genericErrorDetails": {
     "message": "Ми не впевнені, в чому проблема. Спробувати ще раз, або ж зробити знімок іншої сторінки?"
   },
   "tourBodyOne": {
     "message": "Робіть знімки екрану, зберігайте та діліться ними прямо в Firefox."
--- a/browser/extensions/screenshots/webextension/background/auth.js
+++ b/browser/extensions/screenshots/webextension/background/auth.js
@@ -7,17 +7,17 @@ this.auth = (function() {
   let exports = {};
 
   let registrationInfo;
   let initialized = false;
   let authHeader = null;
   let sentryPublicDSN = null;
   let abTests = {};
 
-  catcher.watchPromise(browser.storage.local.get(["registrationInfo", "abTests"]).then((result) => {
+  let registrationInfoFetched = catcher.watchPromise(browser.storage.local.get(["registrationInfo", "abTests"]).then((result) => {
     if (result.abTests) {
       abTests = result.abTests;
     }
     if (result.registrationInfo) {
       registrationInfo = result.registrationInfo;
     } else {
       registrationInfo = generateRegistrationInfo();
       log.info("Generating new device authentication ID", registrationInfo);
@@ -172,39 +172,43 @@ this.auth = (function() {
     return abTests;
   };
 
   exports.isRegistered = function() {
     return registrationInfo.registered;
   };
 
   exports.setDeviceInfoFromOldAddon = function(newDeviceInfo) {
-    if (!(newDeviceInfo.deviceId && newDeviceInfo.secret)) {
-      throw new Error("Bad deviceInfo");
-    }
-    if (registrationInfo.deviceId === newDeviceInfo.deviceId &&
-      registrationInfo.secret === newDeviceInfo.secret) {
-      // Probably we already imported the information
-      return Promise.resolve(false);
-    }
-    registrationInfo = {
-      deviceId: newDeviceInfo.deviceId,
-      secret: newDeviceInfo.secret,
-      registered: true
-    };
-    initialized = false;
-    return browser.storage.local.set({registrationInfo}).then(() => {
-      return true;
+    return registrationInfoFetched.then(() => {
+      if (!(newDeviceInfo.deviceId && newDeviceInfo.secret)) {
+        throw new Error("Bad deviceInfo");
+      }
+      if (registrationInfo.deviceId === newDeviceInfo.deviceId &&
+        registrationInfo.secret === newDeviceInfo.secret) {
+        // Probably we already imported the information
+        return Promise.resolve(false);
+      }
+      registrationInfo = {
+        deviceId: newDeviceInfo.deviceId,
+        secret: newDeviceInfo.secret,
+        registered: true
+      };
+      initialized = false;
+      return browser.storage.local.set({registrationInfo}).then(() => {
+        return true;
+      });
     });
   };
 
   communication.register("getAuthInfo", (sender, ownershipCheck) => {
-    let info = registrationInfo;
-    if (info.registered) {
-      return login({ownershipCheck}).then((result) => {
-        return {isOwner: result && result.isOwner, deviceId: registrationInfo.deviceId};
-      });
-    }
-    return Promise.resolve(info);
+    return registrationInfoFetched.then(() => {
+      let info = registrationInfo;
+      if (info.registered) {
+        return login({ownershipCheck}).then((result) => {
+          return {isOwner: result && result.isOwner, deviceId: registrationInfo.deviceId};
+        });
+      }
+      return info;
+    });
   });
 
   return exports;
 })();
--- a/browser/extensions/screenshots/webextension/background/senderror.js
+++ b/browser/extensions/screenshots/webextension/background/senderror.js
@@ -32,16 +32,19 @@ this.senderror = (function() {
       info: browser.i18n.getMessage("unshootablePageErrorDetails")
     },
     SHOT_PAGE: {
       title: browser.i18n.getMessage("selfScreenshotErrorTitle")
     },
     MY_SHOTS: {
       title: browser.i18n.getMessage("selfScreenshotErrorTitle")
     },
+    EMPTY_SELECTION: {
+      title: browser.i18n.getMessage("emptySelectionErrorTitle")
+    },
     generic: {
       title: browser.i18n.getMessage("genericErrorTitle"),
       info: browser.i18n.getMessage("genericErrorDetails"),
       showMessage: true
     }
   };
 
   communication.register("reportError", (sender, error) => {
@@ -84,17 +87,17 @@ this.senderror = (function() {
       return;
     }
     let dsn = auth.getSentryPublicDSN();
     if (!dsn) {
       log.warn("Error:", e);
       return;
     }
     if (!Raven.isSetup()) {
-      Raven.config(dsn).install();
+      Raven.config(dsn, {allowSecretKey: true}).install();
     }
     let exception = new Error(e.message);
     exception.stack = e.multilineStack || e.stack || undefined;
     let rest = {};
     for (let attr in e) {
       if (!["name", "message", "stack", "multilineStack", "popupMessage", "version", "sentryPublicDSN", "help"].includes(attr)) {
         rest[attr] = e[attr];
       }
@@ -107,13 +110,15 @@ this.senderror = (function() {
       extra: rest
     });
   };
 
   catcher.registerHandler((errorObj) => {
     if (!errorObj.noPopup) {
       exports.showError(errorObj);
     }
-    exports.reportError(errorObj);
+    if (!errorObj.noReport) {
+      exports.reportError(errorObj);
+    }
   });
 
   return exports;
 })();
--- a/browser/extensions/screenshots/webextension/build/buildSettings.js
+++ b/browser/extensions/screenshots/webextension/build/buildSettings.js
@@ -1,6 +1,7 @@
 window.buildSettings = {
-  defaultSentryDsn: "https://97d8afa496f94764ae255e739b147f4b@sentry.prod.mozaws.net/139",
-  logLevel: "" || "warn"
+  defaultSentryDsn: "https://904ccdd4866247c092ae8fc1a4764a63:940d44bdc71d4daea133c19080ccd38d@sentry.prod.mozaws.net/224",
+  logLevel: "" || "warn",
+  captureText: ("" === "true")
 };
 null;
 
--- a/browser/extensions/screenshots/webextension/build/inlineSelectionCss.js
+++ b/browser/extensions/screenshots/webextension/build/inlineSelectionCss.js
@@ -416,16 +416,19 @@ window.inlineSelectionCss = `
   background: #f5f5f5;
   border-radius: 1px;
   box-sizing: border-box;
   height: 80px;
   padding: 8px;
   position: absolute;
   right: 5px;
   top: 5px; }
+  html[dir="rtl"] .myshots-all-buttons-container {
+    left: 5px;
+    right: inherit; }
   .myshots-all-buttons-container .spacer {
     background-color: #c9c9c9;
     flex: 0 0 1px;
     height: 80px;
     margin: 0 10px;
     position: relative;
     top: -8px; }
   .myshots-all-buttons-container button {
--- a/browser/extensions/screenshots/webextension/build/shot.js
+++ b/browser/extensions/screenshots/webextension/build/shot.js
@@ -488,16 +488,19 @@ class AbstractShot {
     this._clips[name] = clip;
   }
   delClip(name) {
     if (!this._clips[name]) {
       throw new Error("No existing clip with id: " + name);
     }
     delete this._clips[name];
   }
+  delAllClips() {
+    this._clips = {};
+  }
   biggestClipSortOrder() {
     let biggest = 0;
     for (let clipId in this._clips) {
       biggest = Math.max(biggest, this._clips[clipId].sortOrder);
     }
     return biggest;
   }
   updateClipUrl(clipId, clipUrl) {
--- a/browser/extensions/screenshots/webextension/manifest.json
+++ b/browser/extensions/screenshots/webextension/manifest.json
@@ -1,27 +1,27 @@
 {
   "manifest_version": 2,
   "name": "Firefox Screenshots",
-  "version": "8.1.0",
+  "version": "9.0.0",
   "description": "__MSG_addonDescription__",
   "author": "__MSG_addonAuthorsList__",
   "homepage_url": "https://github.com/mozilla-services/screenshots",
   "applications": {
     "gecko": {
       "id": "screenshots@mozilla.org"
     }
   },
   "default_locale": "en_US",
   "browser_action": {
     "default_icon": {
       "16": "icons/icon-16.svg",
       "32": "icons/icon-32.svg"
     },
-    "default_title": "__MSG_contextMenuLabel__",
+    "default_title": "Firefox Screenshots",
     "browser_style": false
   },
   "background": {
     "scripts": [
       "build/buildSettings.js",
       "log.js",
       "makeUuid.js",
       "catcher.js",
--- a/browser/extensions/screenshots/webextension/onboarding/slides.js
+++ b/browser/extensions/screenshots/webextension/onboarding/slides.js
@@ -41,16 +41,18 @@ this.slides = (function() {
           "text/html"
         );
         doc = iframe.contentDocument;
         doc.replaceChild(
           doc.adoptNode(parsedDom.documentElement),
           doc.documentElement
         );
         doc.addEventListener("keyup", onKeyUp);
+        doc.documentElement.dir = browser.i18n.getMessage("@@bidi_dir");
+        doc.documentElement.lang = browser.i18n.getMessage("@@ui_locale");
         localizeText(doc);
         activateSlide(doc);
         resolve();
       });
       document.body.appendChild(iframe);
       iframe.focus();
       window.addEventListener("resize", onResize);
     });
--- a/browser/extensions/screenshots/webextension/selector/shooter.js
+++ b/browser/extensions/screenshots/webextension/selector/shooter.js
@@ -1,10 +1,10 @@
 /* globals global, documentMetadata, util, uicontrol, ui, catcher */
-/* globals domainFromUrl, randomString */
+/* globals buildSettings, domainFromUrl, randomString */
 
 "use strict";
 
 this.shooter = (function() { // eslint-disable-line no-unused-vars
   let exports = {};
   const { AbstractShot } = window.shot;
 
   const RANDOM_STRING_LENGTH = 16;
@@ -62,28 +62,41 @@ this.shooter = (function() { // eslint-d
   }
 
   let isSaving = null;
 
   exports.takeShot = function(captureType, selectedPos) {
     // isSaving indicates we're aleady in the middle of saving
     // we use a timeout so in the case of a failure the button will
     // still start working again
+    if (Math.floor(selectedPos.left) == Math.floor(selectedPos.right) ||
+        Math.floor(selectedPos.top) == Math.floor(selectedPos.bottom)) {
+        let exc = new Error("Empty selection");
+        exc.popupMessage = "EMPTY_SELECTION";
+        exc.noReport = true;
+        catcher.unhandled(exc);
+        return;
+    }
     const uicontrol = global.uicontrol;
     let deactivateAfterFinish = true;
     if (isSaving) {
       return;
     }
     isSaving = setTimeout(() => {
+      ui.Box.clearSaveDisabled();
       isSaving = null;
     }, 1000);
     selectedPos = selectedPos.asJson();
-    let captureText = util.captureEnclosedText(selectedPos);
+    let captureText = "";
+    if (buildSettings.captureText) {
+      captureText = util.captureEnclosedText(selectedPos);
+    }
     let dataUrl = screenshotPage(selectedPos);
     if (dataUrl) {
+      shot.delAllClips();
       shot.addClip({
         createdDate: Date.now(),
         image: {
           url: dataUrl,
           captureType,
           text: captureText,
           location: selectedPos,
           dimensions: {
--- a/browser/extensions/screenshots/webextension/selector/ui.js
+++ b/browser/extensions/screenshots/webextension/selector/ui.js
@@ -99,16 +99,18 @@ this.ui = (function() { // eslint-disabl
                 <style>${substitutedCss}</style>
                 <title></title>
                </head>
                <body></body>`;
             installHandlerOnDocument(this.document);
             if (this.addClassName) {
               this.document.body.className = this.addClassName;
             }
+            this.document.documentElement.dir = browser.i18n.getMessage("@@bidi_dir");
+            this.document.documentElement.lang = browser.i18n.getMessage("@@ui_locale");
             resolve();
           });
           document.body.appendChild(this.element);
         } else {
           resolve();
         }
       });
     },
@@ -241,16 +243,18 @@ this.ui = (function() { // eslint-disabl
                      </div>
                    </div>
                  </div>
                </body>`;
             installHandlerOnDocument(this.document);
             if (this.addClassName) {
               this.document.body.className = this.addClassName;
             }
+            this.document.documentElement.dir = browser.i18n.getMessage("@@bidi_dir");
+            this.document.documentElement.lang = browser.i18n.getMessage("@@ui_locale");
             const overlay = this.document.querySelector(".preview-overlay");
             overlay.querySelector(".preview-instructions").textContent = browser.i18n.getMessage("screenshotInstructions");
             overlay.querySelector(".myshots-link").textContent = browser.i18n.getMessage("myShotsLink");
             overlay.querySelector(".visible").textContent = browser.i18n.getMessage("saveScreenshotVisibleArea");
             overlay.querySelector(".full-page").textContent = browser.i18n.getMessage("saveScreenshotFullPage");
             overlay.querySelector(".myshots-button").addEventListener(
               "click", watchFunction(assertIsTrusted(standardOverlayCallbacks.onOpenMyShots)));
             overlay.querySelector(".visible").addEventListener(
@@ -532,16 +536,20 @@ this.ui = (function() { // eslint-disabl
         if (target.nodeType === document.ELEMENT_NODE && target.classList.contains("highlight-buttons")) {
           return true;
         }
         target = target.parentNode;
       }
       return false;
     },
 
+    clearSaveDisabled() {
+      this.save.removeAttribute("disabled");
+    },
+
     el: null,
     boxTopEl: null,
     boxLeftEl: null,
     boxRightEl: null,
     boxBottomEl: null
   };
 
   exports.HoverBox = {
--- a/browser/extensions/screenshots/webextension/selector/uicontrol.js
+++ b/browser/extensions/screenshots/webextension/selector/uicontrol.js
@@ -371,17 +371,17 @@ this.uicontrol = (function() {
     start() {
       selectedPos = mousedownPos = null;
       this.cachedEl = null;
       watchPromise(ui.iframe.display(installHandlersOnDocument, standardOverlayCallbacks).then(() => {
         ui.iframe.usePreSelection();
         ui.Box.remove();
         const handler = watchFunction(assertIsTrusted(keyupHandler));
         document.addEventListener("keyup", handler);
-        registeredDocumentHandlers.push({name: "keyup", doc: document, handler});
+        registeredDocumentHandlers.push({name: "keyup", doc: document, handler, useCapture: false});
       }));
     },
 
     mousemove(event) {
       ui.PixelDimensions.display(event.pageX, event.pageY, event.pageX, event.pageY);
       if (event.target.classList &&
           (!event.target.classList.contains("preview-overlay"))) {
         // User is hovering over a toolbar button or control
@@ -869,25 +869,31 @@ this.uicontrol = (function() {
         return undefined;
       }).bind(null, eventName));
       primedDocumentHandlers.set(eventName, fn);
     });
     primedDocumentHandlers.set("keyup", keyupHandler);
     window.addEventListener('beforeunload', beforeunloadHandler);
   }
 
+  let mousedownSetOnDocument = false;
+
   function installHandlersOnDocument(docObj) {
     for (let [eventName, handler] of primedDocumentHandlers) {
       let watchHandler = watchFunction(handler);
-      docObj.addEventListener(eventName, watchHandler, eventName !== "keyup");
-      registeredDocumentHandlers.push({name: eventName, doc: docObj, watchHandler});
+      let useCapture = eventName !== "keyup";
+      docObj.addEventListener(eventName, watchHandler, useCapture);
+      registeredDocumentHandlers.push({name: eventName, doc: docObj, handler: watchHandler, useCapture});
     }
-    let mousedownHandler = primedDocumentHandlers.get("mousedown");
-    document.addEventListener("mousedown", mousedownHandler, true);
-    registeredDocumentHandlers.push({name: "mousedown", doc: document, watchHandler: mousedownHandler, useCapture: true});
+    if (!mousedownSetOnDocument) {
+      let mousedownHandler = primedDocumentHandlers.get("mousedown");
+      document.addEventListener("mousedown", mousedownHandler, true);
+      registeredDocumentHandlers.push({name: "mousedown", doc: document, handler: mousedownHandler, useCapture: true});
+      mousedownSetOnDocument = true;
+    }
   }
 
   function beforeunloadHandler() {
     sendEvent("cancel-shot", "tab-load");
     exports.deactivate();
   }
 
   function keyupHandler(event) {