<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Less Talk, More Do &#187; Browser Add-ons</title>
	<atom:link href="http://www.chrisfinke.com/category/addons/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.chrisfinke.com</link>
	<description>Christopher Finke is a software engineer who builds high-traffic websites (like AOL Shopping and Mahalo.com) and develops browser add-ons (like ScribeFire, TwitterBar, FireFound, and Tapsure) to enhance the Web.</description>
	<lastBuildDate>Mon, 06 Feb 2012 21:34:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>FireFound Shutting Down</title>
		<link>http://www.chrisfinke.com/2011/08/08/firefound-shutting-down/</link>
		<comments>http://www.chrisfinke.com/2011/08/08/firefound-shutting-down/#comments</comments>
		<pubDate>Mon, 08 Aug 2011 14:00:37 +0000</pubDate>
		<dc:creator>Christopher Finke</dc:creator>
				<category><![CDATA[Browser Add-ons]]></category>
		<category><![CDATA[Extend Firefox]]></category>
		<category><![CDATA[FireFound]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Mozilla Firefox]]></category>

		<guid isPermaLink="false">http://www.chrisfinke.com/?p=2175</guid>
		<description><![CDATA[They say all good things must come to an end.]]></description>
			<content:encoded><![CDATA[<p><a href="https://www.firefound.com/">FireFound</a> is a Firefox add-on and companion Web service that I wrote for the <a href="http://blog.mozilla.com/extendfirefox/2009/11/30/extend-firefox-3-5-winners/">Extend Firefox 3.5 competition</a> in 2009. It allows users to track their device&#8217;s location via Firefox&#8217;s then-new <a href="http://www.mozilla.com/en-US/firefox/geolocation/">geolocation API</a>; additional features include the ability to view a device&#8217;s location history on the website and the ability to turn on a &#8220;killswitch&#8221; that would clear your browsing data (history, saved passwords, etc.) if someone opened your browser and could not provide your chosen password.  It was the first add-on of its kind, and it has been well-received.</p>
<p>That being said, FireFound will be shutting down on June 1, 2012.  I don&#8217;t have the time to keep it compatible with the newest Firefox and Firefox Mobile releases, nor can I keep up with the feature requests and bug reports.</p>
<p>FireFound users who would like to save a copy of their location data can, as always, export their data by logging in and clicking the &#8220;Download&#8221; button on the <a href="https://www.firefound.com/data">&#8220;My Data&#8221; page</a>. Any users who have pre-paid for a Premium account past June 1 will be given a prorated refund.</p>
<p>For those looking for a suitable replacement, I recommend <a href="http://preyproject.com/">Prey</a>. It&#8217;s an open-source implementation of a similar idea, but it runs at the operating system level rather than inside the browser, so it&#8217;s always on.</p>
<p style="font-style: oblique;">(If you&#8217;re interested in taking over FireFound, e-mail me at <a href="mailto:cfinke@gmail.com">cfinke@gmail.com</a>.  If you&#8217;d just like to run your own instance of FireFound, all of <a href="https://github.com/cfinke/FireFound">the code is open-source</a>.)</p>
 <img src="http://www.chrisfinke.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=2175" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.chrisfinke.com/2011/08/08/firefound-shutting-down/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Using Google Chrome locale files in Firefox extensions, updated</title>
		<link>http://www.chrisfinke.com/2011/05/06/using-google-chrome-locale-files-in-firefox-extensions-updated/</link>
		<comments>http://www.chrisfinke.com/2011/05/06/using-google-chrome-locale-files-in-firefox-extensions-updated/#comments</comments>
		<pubDate>Fri, 06 May 2011 22:15:31 +0000</pubDate>
		<dc:creator>Christopher Finke</dc:creator>
				<category><![CDATA[Browser Add-ons]]></category>
		<category><![CDATA[Google Chrome]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Mozilla Firefox]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.chrisfinke.com/?p=2068</guid>
		<description><![CDATA[A generalized method that works in recent all versions of Firefox.]]></description>
			<content:encoded><![CDATA[<p>After I posted my latest revision to <a href="http://www.chrisfinke.com/2011/05/05/how-to-use-google-chrome-extension-locales-in-firefox-4-extensions">some code for using Google Chrome locale files in Firefox extensions</a>, <a href="http://www.chrisfinke.com/2011/05/05/how-to-use-google-chrome-extension-locales-in-firefox-4-extensions/#comment-288359">Wladimir Palant pointed out some shortcomings</a> with the code; I&#8217;ve made some changes to address these issues, and the new code is shown below.</p>
<p><script src="https://gist.github.com/959868.js"></script></p>
<p><a href="https://gist.github.com/959868">View the code at GitHub.</a></p>
<h3>Usage</h3>
<p>The new usage rules are as follows:</p>
<ul>
<li>Replace <code>MY_EXTENSION_NAMESPACE</code> with the namespace of your extension&#8217;s files. e.g., if your files are at <code>chrome://abcdefg/content/</code>, then replace <code>MY_EXTENSION_NAMESPACE</code> with <code>abcdefg</code>.</li>
<li>Rename <code>MY_EXTENSION_STRINGS</code> to something that won&#8217;t interfere with another extension.</li>
<li>The <code>_locales</code> directory from your Chrome extension should be in the <code>chrome/content/</code> directory of your Firefox extension (or update my code to point to wherever you put it).</li>
</ul>
<h3>Advantages</h3>
<p>This code has four advantages over the previous versions:</p>
<ol>
<li>It&#8217;s a single code block that works with all recent versions of Firefox.</li>
<li>You don&#8217;t need to include an additional library for file I/O.</li>
<li>It fixes a bug in retrieving the proper locale code in Firefox on Linux.</li>
<li>You don&#8217;t have to specify <code>&lt;em:unpack>true&lt;/em:unpack></code> in your install.rdf in Firefox 4.</li>
</ol>
<p>Thanks Wladimir for your input; this version is undoubtedly better than both previous versions. I can&#8217;t ensure that it&#8217;s the best possible solution, but it&#8217;s the best one that I&#8217;ve found so far.</p>
 <img src="http://www.chrisfinke.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=2068" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.chrisfinke.com/2011/05/06/using-google-chrome-locale-files-in-firefox-extensions-updated/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>How to use Google Chrome extension locales in Firefox 4 extensions</title>
		<link>http://www.chrisfinke.com/2011/05/05/how-to-use-google-chrome-extension-locales-in-firefox-4-extensions/</link>
		<comments>http://www.chrisfinke.com/2011/05/05/how-to-use-google-chrome-extension-locales-in-firefox-4-extensions/#comments</comments>
		<pubDate>Thu, 05 May 2011 19:48:16 +0000</pubDate>
		<dc:creator>Christopher Finke</dc:creator>
				<category><![CDATA[Browser Add-ons]]></category>
		<category><![CDATA[Google Chrome]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Mozilla Firefox]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.chrisfinke.com/?p=2052</guid>
		<description><![CDATA[An updated implementation of my API for using JSON locale files in Firefox extensions.]]></description>
			<content:encoded><![CDATA[<p><b>Update: Don&#8217;t use this code. Use this <a href="http://www.chrisfinke.com/2011/05/06/using-google-chrome-locale-files-in-firefox-extensions-updated/">new version</a>.</b></p>
<p>A few months ago, <a href="http://www.chrisfinke.com/2010/12/10/using-google-chrome-style-locales-in-firefox-extensions/">I posted a snippet of code</a> that provides an API for using locale files from Google Chrome extensions in extensions for Firefox 3.6 and older.  I&#8217;ve now added support for Firefox 4, and the updated code is shown below:</p>
<p><script src="https://gist.github.com/736538.js"></script></p>
<p><a href="https://gist.github.com/736538">View the code at GitHub.</a></p>
<p>The same usage rules still apply:</p>
<ul>
<li>Replace &#8220;MY_EXTENSION_ID&#8221; with the ID of your extension.</li>
<li>Rename &#8220;MY_EXTENSION_STRINGS&#8221; to something that won&#8217;t interfere with another extension.</li>
<li>The _locales directory from your Chrome extension should be in the chrome/content/ directory of your Firefox extension (or update my code to point to wherever you put it).</li>
<li>Include the excellent <A href="http://kb.mozillazine.org/Io.js">io.js library</a> in your extension.</li>
<li><b>NEW:</b> For Firefox 4, you&#8217;ll need to specify &lt;em:unpack>true&lt;/em:unpack> in your install.rdf.</li>
</ul>
<p>I&#8217;ve been using this solution in ScribeFire in Firefox 3.5, 3.6, and 4.0 (and 5 and 6) for a while now with no complaints.  Let me know if you implement this in your extension, and I&#8217;d love any feedback you have on the code or its performance.</p>
 <img src="http://www.chrisfinke.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=2052" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.chrisfinke.com/2011/05/05/how-to-use-google-chrome-extension-locales-in-firefox-4-extensions/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Discontinuing Slashdotter</title>
		<link>http://www.chrisfinke.com/2011/04/19/discontinuing-slashdotter/</link>
		<comments>http://www.chrisfinke.com/2011/04/19/discontinuing-slashdotter/#comments</comments>
		<pubDate>Tue, 19 Apr 2011 16:35:12 +0000</pubDate>
		<dc:creator>Christopher Finke</dc:creator>
				<category><![CDATA[Browser Add-ons]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Mozilla Add-ons]]></category>
		<category><![CDATA[Mozilla Firefox]]></category>
		<category><![CDATA[Slashdot]]></category>
		<category><![CDATA[Slashdotter]]></category>

		<guid isPermaLink="false">http://www.chrisfinke.com/?p=2038</guid>
		<description><![CDATA[In which I discontinue Slashdotter.]]></description>
			<content:encoded><![CDATA[<p><a href="https://addons.mozilla.org/en-US/firefox/addon/slashdotter/">Slashdotter</a> is an extension I wrote in 2006 in order to customize the <a href="http://slashdot.org/">Slashdot</a> experience.  It was <a href="http://news.slashdot.org/story/06/03/28/1855252/Slashdot-Firefox-Extension">covered on Slashdot</a> and was received favorably by the Slashdot audience, but I don&#8217;t have the time anymore to update it every time Slashdot changes their UI or HTML.</p>
<p>If you&#8217;d like to take over development, <a href="mailto:cfinke@gmail.com">let me know</a>, and I&#8217;ll transfer the Slashdotter add-on to you on <a href="http://addons.mozilla.org/">AMO</a>; if nobody volunteers, I&#8217;ll be removing the add-on from AMO in a couple of weeks.  (Like all of my browser extensions, <a href="https://github.com/cfinke/Slashdotter">Slashdotter&#8217;s source code</a> is open source, so you could still develop your own version if you want.)</p>
 <img src="http://www.chrisfinke.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=2038" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.chrisfinke.com/2011/04/19/discontinuing-slashdotter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TwitterBar is now HootBar</title>
		<link>http://www.chrisfinke.com/2011/04/06/twitterbar-is-now-hootbar/</link>
		<comments>http://www.chrisfinke.com/2011/04/06/twitterbar-is-now-hootbar/#comments</comments>
		<pubDate>Wed, 06 Apr 2011 15:44:48 +0000</pubDate>
		<dc:creator>Christopher Finke</dc:creator>
				<category><![CDATA[Browser Add-ons]]></category>
		<category><![CDATA[HootBar]]></category>
		<category><![CDATA[HootSuite]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Mozilla Firefox]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[TwitterBar]]></category>

		<guid isPermaLink="false">http://www.chrisfinke.com/?p=1971</guid>
		<description><![CDATA[In which I sell out a little bit.]]></description>
			<content:encoded><![CDATA[<p><a href="http://hootsuite.com/twitterbar-becomes-hootbar" style="display: block; text-align: center; border: 0;"><img src="http://www.chrisfinke.com/files/2011/04/twitterbar-hootbar.jpg" alt="" title="" width="539" height="274" class="alignnone size-full wp-image-1988" /></a></p>
<p>My Firefox add-on <a href="https://addons.mozilla.org/en-US/firefox/addon/4664">TwitterBar</a>, the world&#8217;s most popular Twitter client for Firefox&#8217;s URL bar, has been acquired by <a href="http://hootsuite.com/">HootSuite</a> and has been renamed <a href="http://hootsuite.com/hootbar">&#8220;HootBar.&#8221;</a></p>
<p>HootBar users now have access to great HootSuite features like the Hootlet: instead of typing &#8220;&#8211;post&#8221; at the end of your tweet, if you type &#8220;&#8211;hoot&#8221;, you can schedule your tweet for later, send your message to networks besides Twitter (like Facebook or LinkedIn), and track stats for link clicks.</p>
<p>The rebranded version of TwitterBar is still awaiting approval by Mozilla, but you can <a href="https://addons.mozilla.org/en-US/firefox/addon/hootbar/versions/#version-4.0">install it manually here</a>. More information on the TwitterBar-to-HootBar change is available at <a href="http://hootsuite.com/twitterbar-becomes-hootbar">HootSuite&#8217;s &#8220;TwitterBar to HootBar&#8221; transition page.</a></p>
 <img src="http://www.chrisfinke.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1971" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.chrisfinke.com/2011/04/06/twitterbar-is-now-hootbar/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Announcing Typo.js: Client-side JavaScript Spellchecking</title>
		<link>http://www.chrisfinke.com/2011/03/31/announcing-typo-js-client-side-javascript-spellchecking/</link>
		<comments>http://www.chrisfinke.com/2011/03/31/announcing-typo-js-client-side-javascript-spellchecking/#comments</comments>
		<pubDate>Thu, 31 Mar 2011 13:00:52 +0000</pubDate>
		<dc:creator>Christopher Finke</dc:creator>
				<category><![CDATA[Browser Add-ons]]></category>
		<category><![CDATA[Comment Snob]]></category>
		<category><![CDATA[Google Chrome]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Mozilla Firefox]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[YouTube Comment Snob]]></category>

		<guid isPermaLink="false">http://www.chrisfinke.com/?p=1978</guid>
		<description><![CDATA[In which I spend lots of time on something that will eventually be made obsolete by a Chrome extension API.]]></description>
			<content:encoded><![CDATA[<p>When I first ported <a href="/addons/youtube-comment-snob">YouTube Comment Snob</a> to Chrome, Chrome&#8217;s lack of a spellchecking API for extensions meant that I would be unable to implement Comment Snob&#8217;s most popular and distinguishing feature: the ability to filter out comments based on spelling mistakes.  That, my friend, is about to change.</p>
<p>I&#8217;ve finished work on the first version of a client-side spellchecker written entirely in JavaScript, and I&#8217;m calling it <a href="https://github.com/cfinke/Typo.js">Typo.js</a>. Its express purpose is to allow Chrome extensions to perform spellchecking, although there&#8217;s no reason it wouldn&#8217;t work in other JavaScript environments. (Don&#8217;t use it for Firefox extensions though; use <a href="https://developer.mozilla.org/en/Using_spell_checking_in_XUL">Firefox&#8217;s native spellchecking API.</a>)</p>
<h2>How does it work?</h2>
<p>Typo.js uses <a href="http://hunspell.sourceforge.net/">Hunspell</a>-style dictionaries &#8211; the same ones used in the spellcheckers of OpenOffice.org and Firefox.  (Typo.js ships with the latest American English dictionary, but you could add any number of other dictionary files to it yourself.)  You initialize a Typo.js instance in one of two ways:</p>
<h3>Method #1</h3>
<pre>
var dictionary = new Typo("en_US");
</pre>
<p>This tells Typo.js to load the dictionary represented by two files in the <code>dictionaries/en_US/</code> directory: en_US.aff and en_US.dic.  The .aff file is an affix file: a list of rules for creating multiple forms of a word by adding prefixes and suffixes. The .dic file is the dictionary file: a list of root words and the affix rules that apply to them.  Typo parses these files and generates a complete dictionary by applying the applicable affix rules to the list of root words.</p>
<h3>Method #2</h3>
<pre>
var dictionary = new Typo("en_US", affData, dicData);
</pre>
<p>With this initialization method, you supply the data from the affix and dictionary files.  This method is preferable if you wish to change the location of the affix and dictionary files or if you are using Typo.js in an environment other than a Chrome extension, such as in a webpage or in a server-side JavaScript environment.</p>
<p>Once you&#8217;ve initialized a Typo instance, you can use it to check whether a word is misspelled:</p>
<pre>
var is_correct_spelling = dictionary.check("mispelled");
</pre>
<h2>Customization</h2>
<p>Depending on your needs, you can configure Typo.js to perform word lookups in one of two ways:</p>
<ol>
<li>hash: Stores the dictionary words as the keys of a hash and does a key existence check to determine whether a word is spelled correctly. Lookups are very fast, but this method uses more memory.</li>
<li>binary search: Concatenates dictionary words of identical length into sets of long strings and uses binary search in these strings to check whether a word exists in the dictionary. It uses less memory than the hash implementation, but lookups are slower.</li>
</ol>
<p>See <a href="http://ejohn.org/blog/revised-javascript-dictionary-search/">this blog post by John Resig</a> for a more detailed exploration of possible dictionary representations in JavaScript.</p>
<h2>Practice vs. Theory</h2>
<p>Typo.js is already in use in my <a href="https://chrome.google.com/webstore/detail/gfbnmebccmipejnnlcaenkhfhniaielg">Comment Snob</a> extension.  You can install it today to experience Typo.js in action, filtering comments on YouTube based on the number of spelling mistakes in each one.</p>
<h2>What&#8217;s next for Typo.js?</h2>
<p>The next step is adding support for returning spelling suggestions; right now, all Typo.js can do is tell you whether a word is spelled correctly or not. It also needs to support Hunspell&#8217;s compound word rules.  These are the rules that a spellchecker uses to determine whether words like &#8220;100th&#8221;, &#8220;101st&#8221;, &#8220;102th&#8221; are correct spellings (yes, yes, and no, for those of you keeping track) since it would be impossible to precompute a list of all possible words of these forms.</p>
<p>The Typo.js code is available on <a href="https://github.com/cfinke/Typo.js">GitHub</a>. I welcome any and all suggestions or code contributions.</p>
 <img src="http://www.chrisfinke.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1978" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.chrisfinke.com/2011/03/31/announcing-typo-js-client-side-javascript-spellchecking/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>YouTube Comment Snob is now Comment Snob</title>
		<link>http://www.chrisfinke.com/2011/03/18/youtube-comment-snob-is-now-comment-snob/</link>
		<comments>http://www.chrisfinke.com/2011/03/18/youtube-comment-snob-is-now-comment-snob/#comments</comments>
		<pubDate>Fri, 18 Mar 2011 13:00:05 +0000</pubDate>
		<dc:creator>Christopher Finke</dc:creator>
				<category><![CDATA[Browser Add-ons]]></category>
		<category><![CDATA[Comment Snob]]></category>
		<category><![CDATA[Google Chrome]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Yahoo!]]></category>
		<category><![CDATA[YouTube]]></category>
		<category><![CDATA[YouTube Comment Snob]]></category>

		<guid isPermaLink="false">http://www.chrisfinke.com/?p=1943</guid>
		<description><![CDATA[In which I write a Brita filter for the Web.]]></description>
			<content:encoded><![CDATA[<p>In 2007, I wrote a Firefox add-on called <a href="http://www.chrisfinke.com/2007/08/28/filter-youtube-comments-by-spelling-mistakes/">YouTube Comment Snob</a>.  Its main function was to filter out the inanity from YouTube comment threads, and it worked (and still works) very well, but the comment I heard most frequently from people who tried it out was &#8220;Can you make this for the entire Web?&#8221;  Until now, my answer has been, &#8220;No, not yet.&#8221; But now, my answer is &#8220;Very yes.&#8221;</p>
<h3>Announcing Comment Snob</h3>
<p>Comment Snob is an extension for Google Chrome that filters out undesirable comments from comment threads all over the Web.</p>
<table style="width: 100%;">
<tr>
<td style="width: 50%;">Before:</td>
<td>After:</td>
</tr>
<tr>
<td><img src="/comment-snob/youtube-before.png" /></td>
<td><img src="/comment-snob/youtube-after.png" /></td>
</tr>
</table>
<p>You can <a href="https://chrome.google.com/webstore/detail/gfbnmebccmipejnnlcaenkhfhniaielg">install it here</a>.  It still comes with support for YouTube built in, but you can add support for many other sites by installing Comment Snob rules. </p>
<h3>What are Comment Snob Rules?</h3>
<p>Comment Snob rules are JSON objects that dictate how Comment Snob finds and filters comments on different websites. Here&#8217;s the rule for YouTube that ships with Comment Snob:</p>
<pre>{
	"id": "youtube@chrisfinke.com",
	"label": "YouTube",
	"url": "^http://www\\.youtube\\.com/.*$",
	"allCommentsSelector": "#comments-view",
	"commentContainerSelector": "li.comment",
	"commentTextSelector": "div.comment-text",
	"commentHideSelector": "> div",
	"statusElementTag": "div",
	"statusElementAttributes": {
		"class": "content",
		"style": "color: #666;"
	},
	"ajaxInitiatorSelector": ".comments-pagination button, .comments-pagination a, .comments-pagination button > span",
	"updateURL": "http://www.chrisfinke.com/comment-snob/rules/youtube.snob"
}</pre>
<p>If you know HTML and understand how to use jQuery, you can write rules for Comment Snob.  (Full instructions for writing rules are available <a href="/comment-snob#howto">here</a>.)</p>
<p>For each rule that you install, you can choose a unique set of filtering rules:</p>
<p><img src="http://www.chrisfinke.com/files/2011/03/preferences.png" alt="" title="preferences" width="600" height="280" class="alignnone size-full wp-image-1959" /></p>
<h3>Where Can I Install Rules?</h3>
<p>I&#8217;ve written eight rules myself and made them available on <a href="/comment-snob">this page</a> (scroll down to &#8220;Featured Comment Snob Rules&#8221;); as other people write rules, I&#8217;ll link to them from that page as well. Eventually, I&#8217;ll have a proper site put together for showcasing the most popular rules.</p>
<h3>Where Can I Install It?</h3>
<p>Install it from the <a href="https://chrome.google.com/extensions/detail/gfbnmebccmipejnnlcaenkhfhniaielg">Google Chrome Extensions Gallery</a>. It&#8217;s not available for Firefox yet, but I&#8217;ll most likely be releasing the next version for Chrome and Firefox simultaneously.</p>
<h3>What&#8217;s Next?</h3>
<p>This version of Comment Snob is just a shell of what my final vision is for comment filtering on the Web; right now, it&#8217;s all very manual, and the chances of false positives are too high for my taste.  Adding a proper spellcheck filter will help that somewhat (Chrome doesn&#8217;t yet have a spellcheck API like Firefox does), but imagine a future where all comments on all websites could be filtered automatically based on their content, grammar, and keyword frequency, without having to account for personality differences between different websites. (e.g., The expected quality of a YouTube comment is much lower than the expected quality of a Hacker News comment, so Hacker News comments should be judged more stringently.) That starts to get close to what I want Comment Snob to be.</p>
 <img src="http://www.chrisfinke.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1943" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.chrisfinke.com/2011/03/18/youtube-comment-snob-is-now-comment-snob/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Improving the browser extension localization process</title>
		<link>http://www.chrisfinke.com/2011/01/03/improving-the-browser-extension-localization-process/</link>
		<comments>http://www.chrisfinke.com/2011/01/03/improving-the-browser-extension-localization-process/#comments</comments>
		<pubDate>Mon, 03 Jan 2011 14:00:17 +0000</pubDate>
		<dc:creator>Christopher Finke</dc:creator>
				<category><![CDATA[Browser Add-ons]]></category>
		<category><![CDATA[Google Chrome]]></category>
		<category><![CDATA[Interpr.it]]></category>
		<category><![CDATA[Launch Announcement]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Mozilla Firefox]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.chrisfinke.com/?p=1866</guid>
		<description><![CDATA[In which I launch Interpr.it, a new localization tool for developers and translators. ]]></description>
			<content:encoded><![CDATA[<p class="summary" style="padding: 10px; border: 1px dotted #333;">Executive summary: I&#8217;ve developed a new site to help extension authors and translators collaborate; it&#8217;s called <a href="http://interpr.it/">Interpr.it</a>.</p>
<p>My least favorite aspect of developing browser extensions is localization.  Writing the actual code to internationalize an extension isn&#8217;t so bad, but keeping the translation files up to date has always been a chore. (Localization is the process of translating software into different languages; internationalization is writing software that can be easily localized.)</p>
<p>The preeminent site in the extension localization space is <a href="http://babelzilla.org/">Babelzilla</a>. Babelzilla has been around since 2006, and it is the only site that I know of for pairing extension developers with translators. It works, but I&#8217;ve never felt that it works especially well, and when you can&#8217;t release an update to your extension because Babelzilla is down or buggy (preventing you from retrieving the latest locale files), it&#8217;s very frustrating.</p>
<h3>Localizing Google Chrome Extensions</h3>
<p>When I started developing browser extensions for Google Chrome, I was surprised to find that no Babelzilla equivalent exists, even though Chrome has very full-featured <a href="http://code.google.com/chrome/extensions/i18n.html">internationalization support for extensions</a> &#8211; apparently, extension developers in this ecosystem are expected to come up with their own ad hoc solutions for managing their extension translations. &#8220;Ad hoc&#8221; is not a term I enjoy applying to solutions, so I decided to see what I could do to improve upon the Babelzilla experience for Chrome extension developers.</p>
<h3>Centralizing Extension Internationalization</h3>
<p>In developing a translation site for Chrome extensions, I had two goals:</p>
<ol>
<li>A full-featured API that allows developers to interact with the site without visiting it.</li>
<li>A clean and simple interface for translators that reduces the barrier to entry as close to zero as possible.</li>
</ol>
<p>With these two goals in mind, I developed <a href="http://interpr.it/">Interpr.it</a>. On Interpr.it, developers upload their extensions, translators localize them into their native language, and then developers can download the new locale files to use in their next extension update.</p>
<h3>Interpr.it for Developers</h3>
<p>Developer interaction is limited to the upload and download of locale files. In fact, developers can interact with Interpr.it completely from the command line via the <a href="http://interpr.it/api#upload">/api/upload</a> and <a href="http://interpr.it/api#download">/api/download</a> API methods.  (There are also <a href="http://interpr.it/api">API methods</a> for translating messages and retrieving the translation history of a message.)</p>
<h3>Interpr.it for Translators</h3>
<p>Once an extension has been uploaded to Interpr.it, a status page is generated that shows the progress made on all of the locales supported by Chrome for extensions.  Here&#8217;s an example screenshot of that page:</p>
<p><img src="http://www.chrisfinke.com/files/2010/12/extension.png" alt="" title="Extension Overview" /></p>
<p>Each locale code links to a translation page, which is a listing of all of the messages (or &#8220;phrases&#8221; or &#8220;strings&#8221;) used in the extension.  Here&#8217;s what one of those messages looks like:</p>
<p><img src="http://www.chrisfinke.com/files/2010/12/message1.png" alt="" title="Message Translation" width="758" height="428" class="alignnone size-full wp-image-1878" /></p>
<p>There are 4 aspects to the UI for translating a single message:</p>
<ol>
<li>The original un-translated message.</li>
<li>A description of the message from the developer, which adds context to the message.</li>
<li>The placeholders in the message, used to insert information which can&#8217;t or shouldn&#8217;t be translated.</li>
<li>The history of the message&#8217;s translation, which shows previous revisions and allows a developer or translator to revert changes.</li>
</ol>
<p>(Not every message will have a description, placeholders, and a translation history.)  The translator types the translated phrase in the box, and as soon as they hit the tab key (or click outside of the box), the message is automatically saved without a page reload.</p>
<h3>Additional Interpr.it Features</h3>
<p>Sign in/out is tied to your Google account, so you don&#8217;t have to create another username and password; it seemed like a natural fit for a site focused on Google Chrome extensions.</p>
<p>The Interpr.it site itself is localized <a href="http://interpr.it/extension/1">using itself</a>. (Interpr.it obviously isn&#8217;t a browser extension, but it does use Google Chrome-style JSON locale files, so it&#8217;s compatible with Interpr.it&#8217;s translation system.) To access a localized version of Interpr.it, select a locale code from the menu in top-right corner of the website, or manually type a URL like <a href="http://es.interpr.it/">es.interpr.it</a>.</p>
<p>Interpr.it will also automatically fill in any translations that have been previously completed for other extensions. For example, if a translator has already translated &#8216;Thank you&#8217; into French for another extension, and a different developer&#8217;s extension uses the phrase &#8216;Thank you,&#8217; Interpr.it will automatically transfer that translation. (There&#8217;s been <a href="http://groups.google.com/a/chromium.org/group/chromium-extensions/tree/browse_frm/thread/9d50a0efb2650a8e/e429a1c874d5a36a?hl=en%E0%AC%B2b158a1c2c8e6&#038;rnum=1&#038;_done=%2Fa%2Fchromium.org%2Fgroup%2Fchromium-extensions%2Fbrowse_frm%2Fthread%2F9d50a0efb2650a8e%3Fhl%3Den%25E0%25AC%25B2b158a1c2c8e6%26tvc%3D1%26#doc_acd5dce44ecc2b55">some discussion</a> as to whether this will backfire, but I have been unable to come up with identical English phrases that would result in different translated phrases.  If you can come up with some, I&#8217;d love to hear them.)</p>
<h3>Open for Business</h3>
<p>If you&#8217;re a Chrome extension developer, you can upload your extension to Interpr.it right now. I&#8217;m already using it to manage localization for the Interpr.it website and two of my Chrome extensions, and so far, thirteen different translators have translated a total of 1087 messages.</p>
<p>After I have some more time to collect feedback from developers and translators, I plan on either adding support for Mozilla browser extensions or possibly donating code to the Babelzilla project to improve their experience for developers (if they&#8217;re interested).</p>
<h3>Feedback</h3>
<p>If you&#8217;ve read this far, I want your feedback.  Even if you&#8217;re not involved in the development or translation of browser extensions, I want to know what you think &#8211; were you not aware of the process at all? Does it sound like a problem worth solving?  If you are familiar with the problems faced by developers and translators, do you think that Interpr.it is an improvement upon the Babelzilla experience?  Or am I wasting my time reimplementing something that already (kind of) exists?  What features would you like to see? What localization/internationalization issues do you find irritating? Leave your thoughts in the <a href="http://www.chrisfinke.com/2011/01/03/improving-the-browser-extension-localization-process/#comments">comments</a>.</p>
 <img src="http://www.chrisfinke.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1866" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.chrisfinke.com/2011/01/03/improving-the-browser-extension-localization-process/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

