<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Robert James Gabriel</title>
    <description>The latest articles on DEV Community by Robert James Gabriel (@robertjgabriel).</description>
    <link>https://dev.to/robertjgabriel</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F23364%2Fb8a06e8d-2710-486d-b06a-16777ef9684c.jpg</url>
      <title>DEV Community: Robert James Gabriel</title>
      <link>https://dev.to/robertjgabriel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/robertjgabriel"/>
    <language>en</language>
    <item>
      <title>Translate your browser extension in seconds</title>
      <dc:creator>Robert James Gabriel</dc:creator>
      <pubDate>Wed, 26 Jun 2019 22:19:06 +0000</pubDate>
      <link>https://dev.to/robertjgabriel/translate-your-browser-extension-in-seconds-60a</link>
      <guid>https://dev.to/robertjgabriel/translate-your-browser-extension-in-seconds-60a</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fauj1bos16fpfau4z9q6g.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fauj1bos16fpfau4z9q6g.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hey 👋,&lt;/p&gt;

&lt;p&gt;If your reading this you probably came for the same reason, I did in the past. How do I easily translate my browser extension to other languages?&lt;/p&gt;

&lt;p&gt;Well as part of my startup &lt;a href="https://www.helperbird.com" rel="noopener noreferrer"&gt;Helperbird&lt;/a&gt; I needed to translate the browser extension to other languages to increase the reach. So I looked at different solutions and found one promising GitHub repo but it wasn't perfect.&lt;/p&gt;

&lt;p&gt;With Chrome or Browser extensions, you have a folder layout like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;_locales/&lt;span class="o"&gt;{{&lt;/span&gt;languageCode&lt;span class="o"&gt;}}&lt;/span&gt;/messages.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where the original one by &lt;a href="https://www.npmjs.com/package/translate-extension-json" rel="noopener noreferrer"&gt;Thomas Brüggemann&lt;/a&gt; while great doesn't fit in into the browser extension development flow.&lt;/p&gt;

&lt;p&gt;So I forked the extension and rewrote it, to make it for browser development (Also dont worry, I will be adding feature to the original master) . So if you're a browser extension developer. You can do the following now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; translate-extension-json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;p&gt;You need a &lt;a href="https://cloud.google.com/translate/" rel="noopener noreferrer"&gt;Google Translate API Key&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;translate-extension &lt;span class="o"&gt;{{&lt;/span&gt;apiKey&lt;span class="o"&gt;}}&lt;/span&gt; &lt;span class="o"&gt;{{&lt;/span&gt;location of json file&lt;span class="o"&gt;}}&lt;/span&gt; &lt;span class="o"&gt;{{&lt;/span&gt;Translate from&lt;span class="o"&gt;}&lt;/span&gt;  &lt;span class="o"&gt;{{&lt;/span&gt;Tanslate too,Tanslate too,Tanslate too,&lt;span class="o"&gt;}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e.g.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;translate-extension-json iuOHAEbo9H788d34h93h4dioue2I locales en es,fr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This would translate all strings in &lt;code&gt;_locales/en/messages.json&lt;/code&gt; (relative to current folder in the shell) from English to Spanish and French, based on the Google Translate API language codes.&lt;/p&gt;

&lt;p&gt;The target languages list is optional. When not present, it will be translated to all languages supported by Google Translate.&lt;/p&gt;

&lt;h1&gt;
  
  
  See it in action.
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FHelperbird%2Fi18n-translate-json%2Fraw%2Fmaster%2Fdemo%2Fkap.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FHelperbird%2Fi18n-translate-json%2Fraw%2Fmaster%2Fdemo%2Fkap.gif" title="Demo" alt="alt text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you liked this project and guide, you can follow me here.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.twitter.com/robertjgabriel" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.github.com/robertjgabriel" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The node module code is &lt;a href="https://www.npmjs.com/package/translate-extension-json" rel="noopener noreferrer"&gt;here&lt;/a&gt; and the Github source is &lt;a href="https://github.com/Helperbird/i18n-translate-json" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>javascript</category>
      <category>showweb</category>
      <category>chrome</category>
    </item>
    <item>
      <title>A puppeteer script to discover and download all Netflix categories in a JSON file.</title>
      <dc:creator>Robert James Gabriel</dc:creator>
      <pubDate>Thu, 10 Jan 2019 05:14:19 +0000</pubDate>
      <link>https://dev.to/robertjgabriel/a-puppeteer-script-to-discover-and-download-all-netflix-categories-in-a-json-file-2md6</link>
      <guid>https://dev.to/robertjgabriel/a-puppeteer-script-to-discover-and-download-all-netflix-categories-in-a-json-file-2md6</guid>
      <description>&lt;p&gt;Netflix has hundreds of hidden categories. How do go about discovering them and finding new ones?&lt;/p&gt;

&lt;p&gt;Well, I wrote a puppeteer script. That runs headless chrome, logs into Netflix and goes through each URL, extracts the category title and saves it in a JSON file for you to use.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * @format
 * @name Netflix
 * @desc Logs into Netflix. Provide your username and password in the config file when running the script, i.e:
 */&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;puppeteer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;puppeteer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./config.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SHOW_LOADING&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;showLoading&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puppeteer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;launch&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;headless&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headless&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;newPage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// Open login page and login&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://www.netflix.com/ie/login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#id_userLoginId&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#id_password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Enter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;waitForNavigation&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// Click the user account&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.profile-icon:nth-child(1)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Start going though the urls&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;categoryID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Count&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// If four errors in a row, end the loop.&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ERROR_LIMIT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;errorLimit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://www.netflix.com/browse/genre/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;categoryID&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.genreTitle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// If the element exisits&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;categorieTitle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;textContent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;jsonValue&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;SHOW_LOADING&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`.&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;categoryID&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;categorieTitle&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="c1"&gt;// Create json object&lt;/span&gt;
            &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;jsonObject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;categorieTitle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;categoryID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;};&lt;/span&gt;
            &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;jsonObject&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// If the element isnt there.&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nx"&gt;categoryID&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;ERROR_LIMIT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;writeFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;results.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;complete&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Categories:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;categoryID&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;})();&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check out the repo &lt;a href="https://github.com/RobertJGabriel/puppeteer-get-netflix-categories"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also follow me on &lt;a href="https://github.com/RobertJGabriel/"&gt;Github&lt;/a&gt; and &lt;a href="https://twitter.com/RobertJGabriel"&gt;Twitter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Localization support in your Vue.js based Chrome extension</title>
      <dc:creator>Robert James Gabriel</dc:creator>
      <pubDate>Thu, 03 Jan 2019 12:03:49 +0000</pubDate>
      <link>https://dev.to/robertjgabriel/localization-support-in-your-vuejs-based-chrome-extension-436d</link>
      <guid>https://dev.to/robertjgabriel/localization-support-in-your-vuejs-based-chrome-extension-436d</guid>
      <description>&lt;p&gt;Localization is important when you’re looking to grow your app or website in other markets. Recently I added localization support to my startups’ product Helperbird. If you’re building a cross-platform Chrome app it is super straightforward.&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting started
&lt;/h3&gt;

&lt;p&gt;To get started, your going to make sure you have a folder called &lt;strong&gt;“_locales”&lt;/strong&gt; in your projects directory. In this folder, you will have a folder en for English. To add more languages, you will create more folders with the languages shorthand, &lt;strong&gt;ES&lt;/strong&gt; for &lt;strong&gt;Spanish&lt;/strong&gt; and so on. In each of the language folders you will need to create a JSON file called “&lt;strong&gt;messages.json”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---9nZzsp0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1600/1%2AkqYYDL9TQSRggojq5xBDRQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---9nZzsp0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1600/1%2AkqYYDL9TQSRggojq5xBDRQ.png" alt="" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
The contents of the messages.json file.&lt;/p&gt;

&lt;p&gt;As you can see in the above screenshot, we have JSON objects with different message values. These are the English strings we will telling the Browser to inject into the app on render. So if the users browser and computer is set to English it will use these strings. The keys will have to unique.&lt;/p&gt;
&lt;h3&gt;
  
  
  Setting up your App
&lt;/h3&gt;

&lt;p&gt;In &lt;a href="https://www.helperbird.com"&gt;Helperbird&lt;/a&gt; I am using Vue.js. We will be using this fantastic i18n Vue.js plugin called “&lt;a href="https://www.npmjs.com/package/vue-plugin-webextension-i18n"&gt;&lt;strong&gt;vue-plugin-webextension-i18n&lt;/strong&gt;&lt;/a&gt;” by ~&lt;a href="https://www.npmjs.com/~straybugs"&gt;straybugs&lt;/a&gt;. This will allow us to have full support across all browsers, as it uses the Chrome native i18n functions and the webExtension functions which are used by Firefox, IE and Safari.&lt;/p&gt;
&lt;h4&gt;
  
  
  Install it
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;vue-plugin-webextension-i18n — save_
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Include it in your app
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;import i18n from ‘vue-plugin-webextension-i18n’&lt;span class="p"&gt;;&lt;/span&gt;  
Vue.use&lt;span class="o"&gt;(&lt;/span&gt;i18n&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;_
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Use in app
&lt;/h4&gt;

&lt;p&gt;In your &lt;strong&gt;messages.json&lt;/strong&gt; file. You have all the strings you want to inject into app.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;appName&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Mobile Dyslexic Tool - Helperbird for Chrome&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;appTitle&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Helperbird&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;appDescription&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;OpenDyslexic font for Chrome. Google Docs Support. Text to speech. Background colors and more.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To access and inject &lt;strong&gt;“appTitle”&lt;/strong&gt; into your app. For in the javascript functions or logic, will will use &lt;strong&gt;this.$i18n()&lt;/strong&gt; from the plugin we installed, which will the add the cross platform support to the native function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="nx"&gt;enableDyslexica&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;showSnackbar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;popupMessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;i18n&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;appTitle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;enabled&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;enable&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reload&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In your template section, you will have to do the following.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;h3&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"md-title"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"flex: 1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{{ $i18n('appTitle') }}&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now thats it, you just need to do this for all the strings in your app. Now just build your project and it will work without anything else.&lt;/p&gt;

&lt;h3&gt;
  
  
  Finishing up
&lt;/h3&gt;

&lt;p&gt;Once an extension or app is internationalized, translating it is simple. You copy &lt;strong&gt;messages.json&lt;/strong&gt;, translate it, and put the copy into a new directory under &lt;strong&gt;_locales&lt;/strong&gt;. For example, to support Spanish, just put a translated copy of &lt;strong&gt;messages.json&lt;/strong&gt; under &lt;strong&gt;_locales/es&lt;/strong&gt;. The following figure shows the previous extension with a new Spanish translation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--n_aRpdQG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn-images-1.medium.com/max/1600/1%2A1HTNimPBoRbVNIui8nE55w.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--n_aRpdQG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn-images-1.medium.com/max/1600/1%2A1HTNimPBoRbVNIui8nE55w.gif" alt="" width="385" height="77"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also important to note, you can use any of the &lt;a href="https://developer.chrome.com/extensions/i18n#overview-locales"&gt;&lt;strong&gt;supported locales&lt;/strong&gt;&lt;/a&gt;. If you use an unsupported locale, the browser will ignore it.&lt;/p&gt;

&lt;p&gt;I would love feedback on this. You can follow me on &lt;a href="https://github.com/RobertJGabriel/"&gt;Github&lt;/a&gt; and &lt;a href="https://www.twitter.com/RobertJGabriel"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>vue</category>
    </item>
    <item>
      <title>Importance of `.indexOn` in Firebase</title>
      <dc:creator>Robert James Gabriel</dc:creator>
      <pubDate>Tue, 01 Jan 2019 22:18:15 +0000</pubDate>
      <link>https://dev.to/robertjgabriel/importance-of-indexon-on-in-firebase-18fh</link>
      <guid>https://dev.to/robertjgabriel/importance-of-indexon-on-in-firebase-18fh</guid>
      <description>&lt;p&gt;Firebase allows you to do ad-hoc queries on a collection of nodes in your database using any common child key. If you know in advance what your indexes will be, you can use the Firebase Real-time Database Rules to define the indexes for your data using the “.indexOn” rule to improve performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why should I care?
&lt;/h2&gt;

&lt;p&gt;As your web app or website grows in size, the performance of its query degrades. If you define your indexes on the keys you will be querying, this will help both in performance and in the amount of data used.&lt;/p&gt;

&lt;p&gt;Firebase will index using those keys on their servers, improving your queries and amount of data sent. Otherwise without the index defined the sorting will be done on the client side.&lt;/p&gt;

&lt;p&gt;Look at this snippet as an example. I will use it to explain how “.indexOn” works with the built in function orderByChild().&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DTDVQ34b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/5ivgvvwi1nycgryleqij.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DTDVQ34b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/5ivgvvwi1nycgryleqij.png" alt="alt text" title="Logo Title Text 1" width="800" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So with this data, I will be querying by the engineSize and/or the year key. Imagine is node is one thousand nodes in length and no index set. It will return all the data to the client.&lt;/p&gt;

&lt;p&gt;The names of the cars are already an index so Firebase already optimizes for queries by car names. You can use “.indexOn” to tell Firebase to optimize queries for engineSize and year as well. This will be done on Firebases` servers before it is returned.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RUW9QdlU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/i1os0srcb2zbxt6rk8fm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RUW9QdlU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/i1os0srcb2zbxt6rk8fm.png" alt="alt text" title="Logo Title Text 1" width="633" height="165"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The importance of the indexon function is for better performance and querying. So next time you’re designing your Firebase real-time database, take time even if it’s a small hobble app, to define your indexes. As you will see better performance and less bottlenecks on the client side as your database grows.&lt;/p&gt;

&lt;p&gt;If you would like to be alerted when I publish new blog posts or coding project. You can follow me on &lt;a href="https://www.github.com/robertjgabriel"&gt;Github&lt;/a&gt; and &lt;a href="https://www.twitter.com/robertjgabriel"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Footnotes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://firebase.google.com/docs/database/security/indexing-data"&gt;https://firebase.google.com/docs/database/security/indexing-data&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/33206932/how-to-write-indexon-for-dynamic-keys-in-firebase"&gt;https://stackoverflow.com/questions/33206932/how-to-write-indexon-for-dynamic-keys-in-firebase&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/40837952/consider-adding-indexon-for-firebase"&gt;https://stackoverflow.com/questions/40837952/consider-adding-indexon-for-firebase&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/43260689/adding-and-indexon-value-into-firebase-rules"&gt;https://stackoverflow.com/questions/43260689/adding-and-indexon-value-into-firebase-rules&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>firebase</category>
    </item>
    <item>
      <title>How was your experience with the technical phone interview</title>
      <dc:creator>Robert James Gabriel</dc:creator>
      <pubDate>Thu, 25 Oct 2018 15:27:31 +0000</pubDate>
      <link>https://dev.to/robertjgabriel/your-experience-with-the-technical-phone-interview-4nna</link>
      <guid>https://dev.to/robertjgabriel/your-experience-with-the-technical-phone-interview-4nna</guid>
      <description></description>
      <category>discuss</category>
    </item>
    <item>
      <title>A website that allows you to search, browse and download all past iOS wallpapers</title>
      <dc:creator>Robert James Gabriel</dc:creator>
      <pubDate>Sat, 20 Oct 2018 01:22:08 +0000</pubDate>
      <link>https://dev.to/robertjgabriel/a-website-that-allows-you-to-search-browse-and-download-all-past-ios-wallpapers-4a94</link>
      <guid>https://dev.to/robertjgabriel/a-website-that-allows-you-to-search-browse-and-download-all-past-ios-wallpapers-4a94</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QFNOqwcq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/anuzokiyobjbgz9jfu9b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QFNOqwcq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/anuzokiyobjbgz9jfu9b.png" alt="alt text" title="Logo Title Text 1" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Anyone who follows me on &lt;a href="https://www.twitch.tv/robertjamesgabriel"&gt;Twitter&lt;/a&gt; or &lt;a href="https://github.com/RobertJGabriel/"&gt;Github&lt;/a&gt; knows I work on my own startup Idea and a few pet projects. One of these includes this.  A website that allows you to search, browse and download all past iOS wallpapers. All built with vue.js but built as a PWA as well.&lt;/p&gt;

&lt;p&gt;You can try out the app &lt;a href="https://www.robertgabriel.ninja/apps/ios-wallpapers/index.html"&gt;here&lt;/a&gt; and the source code is &lt;a href="https://github.com/RobertJGabriel/apple-ios-wallpapers"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Any feedback or questions I would love to answer. Also my whole website is 100% in light house.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>apple</category>
      <category>javascript</category>
      <category>vue</category>
    </item>
    <item>
      <title>A node module that returns an array of Bad Words and Top Swear Words Banned by Google.</title>
      <dc:creator>Robert James Gabriel</dc:creator>
      <pubDate>Thu, 27 Sep 2018 04:22:35 +0000</pubDate>
      <link>https://dev.to/robertjgabriel/a-node-module-that-returns-an-array-of-bad-words-and-top-swear-words-banned-by-google-2jc5</link>
      <guid>https://dev.to/robertjgabriel/a-node-module-that-returns-an-array-of-bad-words-and-top-swear-words-banned-by-google-2jc5</guid>
      <description>&lt;p&gt;Google has inadvertently created an API that third-party developers can use to check whether a word entered by a user is likely to be offensive or not. This is now closed and was part of the  Googles What Do You Love? site. So I scrapped this before it was closed and its now in a node module for people to use in projects. Hope you enjoy!!&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save&lt;/span&gt; google-profanity-words
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;googleProfanityWords&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google-profanity-words&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;googleProfanityWords&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;//  [ '5h1t','5hit','a55','anal','anus',etc.....]  Returns a array of Profanity. 350&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can follow me on here and on the following for more code and projects.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://twitter.com/RobertJGabriel"&gt;Twitter&lt;/a&gt;&lt;/strong&gt; or&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/RobertJGabriel"&gt;Github&lt;/a&gt;.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>showdev</category>
      <category>javascript</category>
      <category>node</category>
      <category>npm</category>
    </item>
    <item>
      <title>I made a dyslexic app with over 50,000 users</title>
      <dc:creator>Robert James Gabriel</dc:creator>
      <pubDate>Fri, 10 Aug 2018 02:19:07 +0000</pubDate>
      <link>https://dev.to/robertjgabriel/i-made-a-dyslexic-app-with-over-50000-users-k36</link>
      <guid>https://dev.to/robertjgabriel/i-made-a-dyslexic-app-with-over-50000-users-k36</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ffz1xvexhur04iq2htc9d.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ffz1xvexhur04iq2htc9d.jpg" title="Logo Title Text 1" alt="alt text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  I made a dyslexic app with over 50,000 users
&lt;/h1&gt;

&lt;p&gt;My name is Robert James Gabriel. You can follow me on &lt;a href="https://www.twitch.tv/robertjamesgabriel" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; or &lt;a href="https://github.com/RobertJGabriel/" rel="noopener noreferrer"&gt;Github&lt;/a&gt;. A 25-year-old software developer and I thought I would write here in kinda of a shameless plug but also a post for people to discover these apps and to spread the word that tools like these existed for people with Dyslexia. I have dyslexia myself and work on these semi-full time.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what is OpenDyslexic Font?
&lt;/h2&gt;

&lt;p&gt;"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia. The typeface was created by Abelardo Gonzalez, who released it through an open-source license.[3][4] The design is based on that of DejaVu Sans, also an open-source font."&lt;/p&gt;

&lt;h2&gt;
  
  
  Helperbird
&lt;/h2&gt;

&lt;p&gt;So I made helper bird &lt;a href="https://chrome.google.com/webstore/detail/opendyslexic-font-helperb/ahmapmilbkfamljbpgphfndeemhnajme" rel="noopener noreferrer"&gt;https://chrome.google.com/webstore/detail/opendyslexic-font-helperb/ahmapmilbkfamljbpgphfndeemhnajme&lt;/a&gt; as a simple chrome extension that switches the font on any page to the OpenDyslexic Font. It currently has over 3,000 users.&lt;/p&gt;

&lt;h2&gt;
  
  
  OpenDyslexic
&lt;/h2&gt;

&lt;p&gt;After a few months, I revamped the OpenDyslexic Font Chrome extension, to have the same much-requested features. &lt;a href="https://chrome.google.com/webstore/detail/opendyslexic-font-for-chr/cdnapgfjopgaggbmfgbiinmmbdcglnam?hl=en" rel="noopener noreferrer"&gt;https://chrome.google.com/webstore/detail/opendyslexic-font-for-chr/cdnapgfjopgaggbmfgbiinmmbdcglnam?hl=en&lt;/a&gt;. Currently has 45,000 users and peaks to 100,000 daily users during the school months.&lt;/p&gt;

&lt;p&gt;So If you have time, try them out give feedback and let people know that these exist and could help a fellow dyslexic person out. Leaving reviews and feedback will help out a lot.&lt;/p&gt;

&lt;p&gt;If you have any questions or feature request I would love to hear and answer them. If you want help support the costs of running these apps you can support me here &lt;a href="https://www.paypal.me/robertjgabriel" rel="noopener noreferrer"&gt;https://www.paypal.me/robertjgabriel&lt;/a&gt;&lt;br&gt;
. My personal site is here too if needed as proof &lt;a href="https://robertgabriel.ninja/" rel="noopener noreferrer"&gt;https://robertgabriel.ninja/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y&lt;/p&gt;

&lt;p&gt;:) All love and hope you enjoy.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>javascript</category>
      <category>audit</category>
      <category>opendyslexia</category>
    </item>
    <item>
      <title>I made and Can I use __ audit tool</title>
      <dc:creator>Robert James Gabriel</dc:creator>
      <pubDate>Mon, 23 Jul 2018 16:43:47 +0000</pubDate>
      <link>https://dev.to/robertjgabriel/i-made-and-can-i-use--audit-tool-4dii</link>
      <guid>https://dev.to/robertjgabriel/i-made-and-can-i-use--audit-tool-4dii</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FwQO74jF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/y8mgd5knfdnq5fdh3zte.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FwQO74jF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/y8mgd5knfdnq5fdh3zte.jpg" alt="alt text" title="Logo Title Text 1" width="640" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Anyone who follows me on &lt;a href="https://www.twitch.tv/robertjamesgabriel"&gt;Twitter&lt;/a&gt; or &lt;a href="https://github.com/RobertJGabriel/"&gt;Github&lt;/a&gt; knows I work on my own startup Idea and a few pet projects. One of these includes this.  A chrome extension that what runs audits on the current site your viewing against can I use. It was built with Vue, Bem and Mocha.&lt;/p&gt;

&lt;p&gt;How it works&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the Chrome extension on any page&lt;/li&gt;
&lt;li&gt;Check the URL and click enter&lt;/li&gt;
&lt;li&gt;See the HTML, JS and CSS feature that is not supported on the site and affect SEO rankings.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;About&lt;/p&gt;

&lt;p&gt;Can I use" provides up-to-date browser support tables for support of front-end web technologies on desktop and mobile web browsers? So you can run this on any page and get a response of all the features that are used on the page and not supported.&lt;/p&gt;

&lt;p&gt;What does this tool do?&lt;/p&gt;

&lt;p&gt;This tool displays and non-exhaustive list of HTML, Javascript and CSS features a page is using which are not supported by the Google Search bot or popular browsers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=AkXtjIFgUFU"&gt;You can see a video demo here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chrome.google.com/webstore/detail/can-i-use/jgcglckingjkalbnbmfjjfiboabfmlbl"&gt;You can download it here free for a week on Google Chrome. (1.50 after that)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Any feedback or questions I would love to answer. The money on this covers the costs :)&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>javascript</category>
      <category>audit</category>
    </item>
    <item>
      <title>I made an app that gives you access too 20,000 plus hidden Netflix categories</title>
      <dc:creator>Robert James Gabriel</dc:creator>
      <pubDate>Sun, 22 Jul 2018 14:58:44 +0000</pubDate>
      <link>https://dev.to/robertjgabriel/i-made-an-app-that-gives-you-access-too-20000-plus-hidden-netflix-categories-1i7k</link>
      <guid>https://dev.to/robertjgabriel/i-made-an-app-that-gives-you-access-too-20000-plus-hidden-netflix-categories-1i7k</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fWcGq_1A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/6cln46t2nk6runeb25m2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fWcGq_1A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/6cln46t2nk6runeb25m2.png" alt="alt text" title="Logo Title Text 1" width="800" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Anyone who follows me on &lt;a href="https://www.twitch.tv/robertjamesgabriel"&gt;Twitter&lt;/a&gt; or &lt;a href="https://github.com/RobertJGabriel/"&gt;Github&lt;/a&gt; knows I work on my own startup Idea and a few pet projects. One of these includes this.  A chrome extension that searchs and finds Netflix's Hidden Categories and grows with them. It was built with Vue, Bem and Mocha.&lt;/p&gt;

&lt;p&gt;Netflix has thousands of hidden categories. This extension I made helps you unlock many of those secret categories.&lt;/p&gt;

&lt;p&gt;Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Search verified hidden categories&lt;/li&gt;
&lt;li&gt;Small size ~ 0.02 MB&lt;/li&gt;
&lt;li&gt;Favourite categories&lt;/li&gt;
&lt;li&gt;Syncing across browsers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Privacy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No  permissions required to install&lt;/li&gt;
&lt;li&gt;No data is sent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=V_L-SO4IDoI"&gt;You can see a video demo here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chrome.google.com/webstore/detail/netflix-hidden-categories/pajmfnmlmcknmehpcklomlblpdcpdmgg/related"&gt;You can download it here free for a week on Google Chrome. (1.99 after that)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Any feedback or questions I would love to answer. Like how do I get the new catorgories? The money on this covers the costs :)&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>netflix</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How do you promote your apps or projects?</title>
      <dc:creator>Robert James Gabriel</dc:creator>
      <pubDate>Thu, 19 Jul 2018 17:08:25 +0000</pubDate>
      <link>https://dev.to/robertjgabriel/how-do-you-promote-your-apps-or-projects-4fjp</link>
      <guid>https://dev.to/robertjgabriel/how-do-you-promote-your-apps-or-projects-4fjp</guid>
      <description></description>
      <category>discuss</category>
      <category>javascript</category>
      <category>apps</category>
      <category>startup</category>
    </item>
    <item>
      <title>My Google Chrome Developer Dashboard Wishlist</title>
      <dc:creator>Robert James Gabriel</dc:creator>
      <pubDate>Wed, 30 May 2018 04:32:16 +0000</pubDate>
      <link>https://dev.to/robertjgabriel/my-google-chrome-developer-dashboard-wishlist-3lp1</link>
      <guid>https://dev.to/robertjgabriel/my-google-chrome-developer-dashboard-wishlist-3lp1</guid>
      <description>&lt;h1&gt;
  
  
  My Google Chrome Developer Dashboard Wishlist
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AFCLJwNB7IiVnwTqr4YGxjQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AFCLJwNB7IiVnwTqr4YGxjQ.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the new Google Chrome developer dashboard being slowly released with&lt;br&gt;
missing features. I thought I would write my top wishes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Emails when someone buys one of my apps.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This seems like a huge oversight. I would love even a setting. That when someone&lt;br&gt;
buys one of my apps (Paid) I get an email or push notification. Instead of the&lt;br&gt;
current setup where I have to check through Google Payments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real time analytics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Again this is a huge oversight. With Google Analytics being the number one in&lt;br&gt;
web tracking you would think it would be here too. It takes 24 hours for states&lt;br&gt;
and amount of users to update and even then it’s awful. Would be nice to have it&lt;br&gt;
per hour updates or every 3 hours. Even things like a break down of the number&lt;br&gt;
of users per country or device.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HD support for screenshots&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;Look how blurred this is.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Just have a look here, they do a horrible job of compressing the images. If&lt;br&gt;
anything they should allow or convert the image to webp. Isn’t the idea here to&lt;br&gt;
showcase your apps? Apple and Mozilla do a great way to showcase things like&lt;br&gt;
this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security checks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mozilla check though your code for outdated scripts and if your code is&lt;br&gt;
venerable to xss attacks or more. Wish Chrome would do this here too&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bi weekly payouts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Being able to get paid bi weekly instead of monthly. Simple as.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trial mode for apps&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This would be game-changing!!!! Being able to allow people to download a paid&lt;br&gt;
Chrome extension and give them a 7 day try before asking them to pay. This would&lt;br&gt;
hugely increase conversations. Seems like a no brainer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better review process&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This links to the above Security checks feature. I would personally like the&lt;br&gt;
review process to give more feedback and a correct check on the quality of the&lt;br&gt;
app. With some chrome extensions, they can dramatically affect the page speed of&lt;br&gt;
a website. Seems like this might happen and I hope it does. Given that Google is&lt;br&gt;
focusing on PWAs it would be amazing to see them use this as a standard for&lt;br&gt;
chrome extensions.&lt;/p&gt;

&lt;h4&gt;
  
  
  Miscellaneous
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;The ability to remove old or discontinued items from the item overview page.&lt;/li&gt;
&lt;li&gt;Email and in-product notifications about important events, such as when a user
leaves a review for your extension in the Chrome Web Store.&lt;/li&gt;
&lt;li&gt;Revert to an older version.&lt;/li&gt;
&lt;li&gt;Redesigned website/store.&lt;/li&gt;
&lt;li&gt;Less spammy items and awful clones.&lt;/li&gt;
&lt;li&gt;Trial mode in apps. So you can try out an app for a week before paying for it.&lt;/li&gt;
&lt;li&gt;Referral analytics.&lt;/li&gt;
&lt;li&gt;PWA support&lt;/li&gt;
&lt;li&gt;Version Reviews&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;span&gt;New Chrome Developer Dashboard&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;What’s your wishlist? Let me know on&lt;br&gt;
&lt;strong&gt;&lt;a href="https://twitter.com/RobertJGabriel" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/strong&gt; or&lt;br&gt;
**&lt;a href="https://github.com/RobertJGabriel" rel="noopener noreferrer"&gt;Github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you feel like supporting me, as I just started working on open source full&lt;br&gt;
time. You can see more about me &lt;strong&gt;&lt;a href="https://www.robertgabriel.ninja/" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/strong&gt;. My&lt;br&gt;
donate page &lt;a href="https://www.robertgabriel.ninja/donate" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>chrome</category>
      <category>wishlist</category>
      <category>apps</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
