Bug 1370383 - Export Screenshots 9.0.0 to Firefox; r=standard8
authorIan Bicking <ianb@colorstudy.com>
Mon, 05 Jun 2017 17:11:19 -0500
changeset 413008 02fb002e96bf32429d571ab854596269add0195e
parent 413007 1a313acd411064962b235f0ef48d018f9b16f06b
child 413009 7df33990054eb90ee719d62fe125e01bd336bb84
push id1490
push usermtabara@mozilla.com
push dateMon, 31 Jul 2017 14:08:16 +0000
treeherdermozilla-release@70e32e6bf15e [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersstandard8
bugs1370383
milestone55.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
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) {