<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Ruby on Rails в России</title>
    <link>http://planet.rubyonrails.ru/</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <item>
      <title>Anton Ageev: SFTP: Chroot в домашнюю папку</title>
      <description>В новых версиях openssh (хотя не таких уж и новых, &gt;= 4.9 если не ошибаюсь) есть возможность ограничить доступ пользователя в подсистеме sftp. Т.е. задать ему ChrootDirectory, как в proftpd. Например в домашнюю папку (ибо нефиг лазить за её пределами). Рассмотрим, как это можно реализовать.

	Для начала, создадим группу sftpusers. Ограничения будут действовать только на пользователей [...]</description>
      <pubDate>Mon,  8 Mar 2010 09:47:08 MSK</pubDate>
      <guid>http://feeds.antage.name/~r/antage_blog/~3/m5BFWCrPbO8/sftp-chroot-в-домашнюю-папку.html</guid>
      <link>http://feeds.antage.name/~r/antage_blog/~3/m5BFWCrPbO8/sftp-chroot-в-домашнюю-папку.html</link>
    </item>
    <item>
      <title>Anton Dyachuk: Ссылки за неделю # 10/03/05</title>
      <description>&lt;p&gt;
	&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-size: medium;"&gt;Ruby/Rails&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://github.com/candlerb/string19/raw/47b0cba0a2047eca0612b4e24a540f011cf2cac3/soapbox.rb"&gt;String encoding in ruby 1.9&lt;/a&gt; &amp;ndash; Что не так со строками в Ruby 1.9.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.engineyard.com/blog/2010/memoization-and-id2ref"&gt;Memoization and id2ref&lt;/a&gt; &amp;ndash; Почему нельзя использовать id2ref для реализации memoization.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jgn.heroku.com/2010/02/28/rapid-prototyping-with-haml-sass-and-ruby/"&gt;Rapid prototyping with HAML, SASS and Ruby&lt;/a&gt; &amp;ndash; Почему HAML, SASS и Ruby подходят для быстрого прототипирования.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/mocra/custom_google_forms"&gt;custom_google_forms&lt;/a&gt; &amp;ndash; Публикация и изменение вида Google форм при помощи Rails приложения.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/arya/bluepill"&gt;Bluepill&lt;/a&gt; &amp;ndash; Еще одно средство мониторинга процессов, написанное на Ruby.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/bebanjo/delorean"&gt;Delorean&lt;/a&gt; &amp;ndash; Полезный в тестировании gem, позволяющий изменять поведение Time.now.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-size: medium;"&gt;JavaScript&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://weblog.jamisbuck.org/2010/3/2/unobtrusive-yet-explicit"&gt;Unobtrusive, yet explicit&lt;/a&gt; &amp;ndash; Несколько мыслей по поводу эффективного использования unobtrusive подхода.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-size: medium;"&gt;NoSQL&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.igvita.com/2010/03/01/schema-free-mysql-vs-nosql"&gt;Schema-Free MySQL vs NoSQL&lt;/a&gt; &amp;ndash; Про отличия документ-ориентированных от schema-free СУБД и реализации schema-free базы данных на MySQL.&lt;/li&gt;
&lt;li&gt;Какие причины сподвигли ребят из &lt;a href="http://www.boxedice.com/"&gt;BoxedIce&lt;/a&gt;&amp;nbsp;&lt;a href="http://blog.boxedice.com/2009/07/25/choosing-a-non-relational-database-why-we-migrated-from-mysql-to-mongodb/"&gt;мигрировать на MongoDB&lt;/a&gt; и о &lt;a href="http://blog.boxedice.com/2010/02/28/notes-from-a-production-mongodb-deployment/"&gt;результатах&lt;/a&gt; этого поступка спустя полгода.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-size: medium;"&gt;Разное&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.viget.com/inspire/practical-uses-of-css3/"&gt;Practical Uses of CSS3&lt;/a&gt; &amp;ndash; Несколько фич CSS3, которые уже можно использовать прямо сейчас.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thegeektalk.com/"&gt;The Geek Talk | Exclusive Interviews with Geeks&lt;/a&gt; &amp;ndash; Интервью с гиками из мира разработки ПО.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/web/ajaxcrawling/index.html"&gt;Making AJAX Applications Crawlable&lt;/a&gt; &amp;ndash; Как сделать AJAX приложение доступных для поисковиков.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ну и немного юмора: &lt;a href="http://bishop-it.ru/2010/03/10commandments/"&gt;10 заповедей для программистов&lt;/a&gt;.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://web-dev.posterous.com/-100305"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://web-dev.posterous.com/-100305#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</description>
      <pubDate>Fri,  5 Mar 2010 20:15:01 MSK</pubDate>
      <guid>http://web-dev.posterous.com/-100305</guid>
      <link>http://web-dev.posterous.com/-100305</link>
    </item>
    <item>
      <title>Anton Dyachuk: почти KISS</title>
      <description>&lt;p&gt;
	Q: Как можно утащить с сервака проект базу на мускуле и скопировать её &lt;br /&gt;на локальную машину с рестором базы? Может гем какой-нить есть (чтобы не &lt;br /&gt;только бэкапил но и ресторил)? п.с. сейчас myqsldup   cp :) &lt;br /&gt;A: Конечно, надо лишь взять плагин с гитхаба, в котором вызывается &lt;br /&gt;mysqldump   scp. &lt;p /&gt; © ror2ru
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://web-dev.posterous.com/-kiss"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://web-dev.posterous.com/-kiss#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</description>
      <pubDate>Thu,  4 Mar 2010 11:57:59 MSK</pubDate>
      <guid>http://web-dev.posterous.com/-kiss</guid>
      <link>http://web-dev.posterous.com/-kiss</link>
    </item>
    <item>
      <title>Anton Dyachuk: How to detect installed passenger and add load hook</title>
      <description>&lt;p&gt;
	&lt;p&gt;&lt;div class="data syntax type-rb"&gt;
    
      &lt;table cellspacing="0" cellpadding="0"&gt;
        &lt;tr&gt;
          &lt;td&gt;
            
            &lt;pre class="line_numbers"&gt;
&lt;span rel="#L1" id="LID1"&gt;1&lt;/span&gt;
&lt;span rel="#L2" id="LID2"&gt;2&lt;/span&gt;
&lt;span rel="#L3" id="LID3"&gt;3&lt;/span&gt;
&lt;span rel="#L4" id="LID4"&gt;4&lt;/span&gt;
&lt;span rel="#L5" id="LID5"&gt;5&lt;/span&gt;
&lt;span rel="#L6" id="LID6"&gt;6&lt;/span&gt;
&lt;span rel="#L7" id="LID7"&gt;7&lt;/span&gt;
&lt;span rel="#L8" id="LID8"&gt;8&lt;/span&gt;
&lt;span rel="#L9" id="LID9"&gt;9&lt;/span&gt;
&lt;/pre&gt;
          &lt;/td&gt;
          &lt;td width="100%"&gt;
            
              &lt;div class="highlight"&gt;&lt;pre /&gt;&lt;div class="line" id="LC1"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;defined?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;PhusionPassenger&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC2"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="no"&gt;PhusionPassenger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;on_event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:starting_worker_process&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;forked&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;forked&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="c1"&gt;# We&amp;#39;re in smart spawning mode.&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;else&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC6"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="c1"&gt;# We&amp;#39;re in conservative spawning mode. We don&amp;#39;t need to do anything.&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC7"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC8"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC9"&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
            
          &lt;/td&gt;
        &lt;/tr&gt;
      &lt;/table&gt;
    
  &lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&amp;copy;&amp;nbsp;Yury Korolev @ &lt;a href="http://groups.google.com/group/ror2ru?hl=ru"&gt;ror2ru&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Добавить в config/initializers/passenger_hook.rb или в config/environment.rb по вкусу.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://web-dev.posterous.com/how-to-detect-installed-passenger-and-add-loa"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://web-dev.posterous.com/how-to-detect-installed-passenger-and-add-loa#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</description>
      <pubDate>Wed,  3 Mar 2010 14:07:00 MSK</pubDate>
      <guid>http://web-dev.posterous.com/how-to-detect-installed-passenger-and-add-loa</guid>
      <link>http://web-dev.posterous.com/how-to-detect-installed-passenger-and-add-loa</link>
    </item>
    <item>
      <title>Anton Dyachuk: Ссылки за неделю # 10/02/26</title>
      <description>&lt;p&gt;
	&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-size: medium;"&gt;Ruby/Rails&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.scribd.com/doc/27168812/Oh-Shit-How-to-Break-a-Large-Website-and-how-not-to-PDF-version"&gt;Oh Shit: How to Break a Large Website (and how not to)&lt;/a&gt; &amp;ndash; Несколько примеров ошибок, способных сломать большое приложение уровня &lt;a href="http://www.scribd.com/"&gt;Scribd&lt;/a&gt;, и способы их исправления.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/wbzyl/rack-codehighlighter"&gt;rack-codehighlighter&lt;/a&gt; &amp;ndash; Один из примеров правильного использования Rack Middleware &amp;ndash; подсветка кода.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.scribd.com/doc/27174770/Garbage-Collection-and-the-Ruby-Heap"&gt;Garbage Collection and the Ruby Heap&lt;/a&gt; &amp;ndash; Слайды про обустройство сборщика мусора и heap в Ruby.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-size: medium;"&gt;JavaScript&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.jspatterns.com/"&gt;JSPatterns.com&lt;/a&gt; &amp;ndash; Паттерны и анти-паттерны JavaScript&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-size: medium;"&gt;Разработка&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://levgem.livejournal.com/"&gt;Макс Лапшин&lt;/a&gt; написал про&amp;nbsp;&lt;a href="http://levgem.livejournal.com/274899.html"&gt;кеширование и оптимизацию&lt;/a&gt;. Если есть, что сказать, то обсудить можно так же и &lt;a href="http://groups.google.com/group/ror2ru/browse_thread/thread/ba9baf51f3db9782?hl=ru#"&gt;в гуглогруппе ror2ru&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://victorronin.com/2010/02/22/korporativnoe-govno-dux-vremeni/"&gt;Корпоративное говно: дух времени&lt;/a&gt; &amp;ndash; О трудных буднях корпоративных разработчиков.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://perevodik.net/ru/posts/28/"&gt;Новый способ организации рабочего процесса&lt;/a&gt; &amp;ndash; &lt;a href="http://37signals.com/"&gt;37signals&lt;/a&gt; пробует работать по-новому.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bishop-it.ru/2010/02/25errors/"&gt;25 самых опасных программистских ошибок&lt;/a&gt; &amp;ndash; Некоммерческая организация MITRE и институт SANS опубликовали список из 25 наиболее распространенных ошибок в программировании, которые могут сыграть на руку хакерам.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-size: medium;"&gt;Разное&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.cuberick.com/2010/02/vim-vs-rubymine.html"&gt;Vim vs. RubyMine&lt;/a&gt; &amp;ndash; Сравнение Vim и RubyMine.&lt;/li&gt;
&lt;li&gt;О миграции с Vim на Emacs. В &lt;a href="http://upsilon.cc/~zack/blog/posts/2008/10/from_Vim_to_Emacs_-_part_1/"&gt;1й&lt;/a&gt; части описывается несколько недостатков Emacs, мешавших автору мигрировать ранее, во &lt;a href="http://upsilon.cc/~zack/blog/posts/2008/11/from_Vim_to_Emacs_-_part_2/"&gt;2й&lt;/a&gt; &amp;ndash; недостатки Vim, заставившие мигрировать.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sexybuttons.googlecode.com/svn/trunk/index.html"&gt;Sexy Buttons Quick Start Guide and Demo&lt;/a&gt; &amp;ndash; Легкий способ сделать удобные и приятно выглядящие кнопки.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ayetea.rpod.ru/"&gt;Айти подкаст, который не сосет.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://web-dev.posterous.com/-100226"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://web-dev.posterous.com/-100226#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</description>
      <pubDate>Fri, 26 Feb 2010 13:52:42 MSK</pubDate>
      <guid>http://web-dev.posterous.com/-100226</guid>
      <link>http://web-dev.posterous.com/-100226</link>
    </item>
    <item>
      <title>Maxim Dobriakov: &amp;#1048;&amp;#1079;&amp;#1084;&amp;#1077;&amp;#1085;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1087;&amp;#1086;&amp;#1083;&amp;#1086;&amp;#1078;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1103; &amp;#1095;&amp;#1077;&amp;#1082;&amp;#1073;&amp;#1086;&amp;#1082;&amp;#1089;&amp;#1086;&amp;#1074; &amp;#1074; formtastic</title>
      <description></description>
      <pubDate>Sat, 20 Feb 2010 21:53:26 MSK</pubDate>
      <guid>http://maksd.info/message/73</guid>
      <link>http://maksd.info/message/73</link>
    </item>
    <item>
      <title>Anton Dyachuk: Ссылки за неделю # 10/02/19</title>
      <description>&lt;p&gt;
	&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-size: medium;"&gt;Ruby/Rails&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://github.com/mynyml/harmony"&gt;Harmony&lt;/a&gt; &amp;ndash; DSL для исполнения JavaScript и DOM напрямую из Ruby кода.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/pivotal/refraction"&gt;Refraction&lt;/a&gt; &amp;ndash; Rack middleware для замены mod_rewrite.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://yehudakatz.com/2010/02/15/abstractqueryfactoryfactories-and-alias_method_chain-the-ruby-way/"&gt;AbstractQueryFactoryFactories and alias_method_chain: The Ruby Way&lt;/a&gt; &amp;ndash; alias_method_chain выходит из моды (не без помощи Yehuda Katz), в статье описывается один из вариантов избавления от алиасов, используя стандартные возможности Ruby.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.engineyard.com/blog/2010/a-hint-of-hubris/"&gt;A Hint of Hubris&lt;/a&gt; &amp;ndash; Зачем и как можно использовать Haskell код из Ruby при помощи &lt;a href="http://github.com/mwotton/Hubris"&gt;Hubris&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-size: medium;"&gt;JavaScript&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://wtfjs.com/"&gt;wtfjs&lt;/a&gt; &amp;ndash; Постоянно пополняемая коллекция из серии WTF.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-size: medium;"&gt;Разное&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://usesthis.com/"&gt;the setup&lt;/a&gt; &amp;ndash; Интервью с гиками (Richard Stallman, Aaron Swartz, Amy Hoy и т.д.) об используемом железе, софте и чего не хватает для счастья.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://marklodato.github.com/visual-git-guide/"&gt;A Visual Git Reference&lt;/a&gt; &amp;ndash; Визуальное представление наиболее используемых команд git'а.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-size: medium;"&gt;Юмор&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://gist.github.com/295352"&gt;Evolution of a Ruby Programmer.rb&lt;/a&gt; &amp;ndash; Эволюция руби-программиста в виде кода.&lt;/li&gt;
&lt;/ul&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://web-dev.posterous.com/-100219"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://web-dev.posterous.com/-100219#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</description>
      <pubDate>Fri, 19 Feb 2010 12:54:00 MSK</pubDate>
      <guid>http://web-dev.posterous.com/-100219</guid>
      <link>http://web-dev.posterous.com/-100219</link>
    </item>
    <item>
      <title>Maxim Dobriakov: Rails   Application Template = ext-rails-template</title>
      <description></description>
      <pubDate>Fri, 19 Feb 2010 12:29:27 MSK</pubDate>
      <guid>http://maksd.info/message/71</guid>
      <link>http://maksd.info/message/71</link>
    </item>
    <item>
      <title>Gregory Man, Dimitri Krassovski: Ruby NoName Podcast #24</title>
      <description>&amp;lt;p&amp;gt;&amp;lt;font size=4&amp;gt;Тви: &amp;lt;a href=&amp;quot;http://twitter.com/rubynoname&amp;quot;&amp;gt;rubynoname&amp;lt;/a&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;a href=&amp;quot;http://ruby.rpod.ru/rss.xml&amp;quot;&amp;gt;RSS&amp;lt;/a&amp;gt; и &amp;lt;a href=&amp;quot;http://ruby.rpod.ru/&amp;quot;&amp;gt;сайт подкаста на RPod.ru&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;font size=4&amp;gt;Безымянный подкаст о руби, при подержке &amp;lt;a href=&amp;quot;http://github.com/&amp;quot;&amp;gt;github.com&amp;lt;/a&amp;gt;, представляет &amp;lt;a href=&amp;quot;http://rnp.startika.com/&amp;quot;&amp;gt;конкурс имени безымянного подкаста&amp;lt;/a&amp;gt;!&amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;img src=&amp;quot;http://rpod.ru/personal/pictures/00/00/02/12/31/0000000001.jpg&amp;quot; border=&amp;quot;0&amp;quot; width=&amp;quot;347&amp;quot; height=&amp;quot;527&amp;quot; alt=&amp;quot;Tron Game&amp;quot;&amp;gt;

&amp;lt;h3&amp;gt;Сегодня в программе, разговоры о:&amp;lt;/h3&amp;gt;
&amp;lt;ul&amp;gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;http://www.rubyinside.com/rails-3-0-beta-links-2966.html&amp;quot;&amp;gt;36 ссылок на ресурсы про Rails3&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;www.macruby.org/blog/2010/01/31/macruby05.html&amp;quot;&amp;gt;MacRuby 0.5&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;http://rnp.startika.com/&amp;quot;&amp;gt;Наш конкурс&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;Всякое-разное&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&amp;lt;p&amp;gt;Для следующего выпуска подкаста мы ищем гостей, участвующих в разработке или активно использующих альтернативные интерпретаторы руби (JRuby, IronRuby, MagLev, etc.). Если вы хотите поучаствовать в дискуссии, пишите нам!&amp;lt;/p&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;p&amp;gt;В подкасте использована композиция &amp;lt;a href=&amp;quot;http://podsafeaudio.com/jamroom/bands/1454/music.php&amp;quot;&amp;gt;8 BIT Junkie by George Wood&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;</description>
      <pubDate>Thu, 18 Feb 2010 02:14:00 MSK</pubDate>
      <guid>http://ruby.rpod.ru/141853.html</guid>
      <link>http://ruby.rpod.ru/141853.html</link>
    </item>
    <item>
      <title>Maxim Dobriakov: &amp;#1054;&amp;#1073;&amp;#1086;&amp;#1078;&amp;#1072;&amp;#1102; git!!!!</title>
      <description></description>
      <pubDate>Wed, 17 Feb 2010 01:11:18 MSK</pubDate>
      <guid>http://maksd.info/message/72</guid>
      <link>http://maksd.info/message/72</link>
    </item>
    <item>
    </item>
    <item>
      <title>Anton Dyachuk: Ссылки за неделю # 10/02/12</title>
      <description>&lt;p&gt;
	&lt;p&gt;В свете недавнего выхода беты Rails 3 большинство ссылок естественно посвящено этому, не побоюсь этого слова, великому событию.&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration: underline; font-size: medium;"&gt;Ruby/Rails&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.engineyard.com/blog/2010/rails-3-beta-is-out-a-retrospective/"&gt;Rails 3 Beta is Out &amp;mdash; A Retrospective&lt;/a&gt; &amp;ndash; Yehuda Katz рассказывает об архитектуре Rails 3 и изменениях относительно текущей версии.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://edgerails.info/articles/what-s-new-in-edge-rails/2010/02/10/rails-3-resources/"&gt;Rails 3 Resources&lt;/a&gt; &amp;ndash; Подборка ссылок по Rails 3.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.rubyinside.com/rails-3-0-beta-links-2966.html"&gt;Rails 3.0 Beta: 36 Links and Resources To Get You Going&lt;/a&gt; &amp;ndash; Еще одна подборка ссылок по Rails 3.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://weblog.rubyonrails.org/2010/2/9/plugin-authors-toward-a-better-future"&gt;Plugin Authors: Toward a Better Future&lt;/a&gt; &amp;ndash; Советы по разработке/портированию плагинов на Rails 3.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://caffeinedd.com/guides/331-making-generators-for-rails-3-with-thor"&gt;MAKING GENERATORS FOR RAILS 3 WITH THOR&lt;/a&gt; &amp;ndash; В Rails 3 вместо стандартного механизма создания генераторов теперь используется &lt;a href="http://github.com/wycats/thor"&gt;Thor&lt;/a&gt;. В статье&amp;nbsp;по шагам&amp;nbsp;описывается создание gem'а с простым генератором.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://m.onkey.org/2010/2/5/signed-and-permanent-cookies-in-rails-3"&gt;Signed and Permanent cookies in Rails 3&lt;/a&gt; &amp;ndash; Изменения в Rails, упрощающие работу с подписанными и долговременными cookies.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://railsplugins.org/"&gt;Is Your Plugin Ready For Rails 3?&lt;/a&gt; &amp;ndash; Каталог плагинов, портированных на Rails 3.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mrtweet.com/community/ruby/experts?nav=prr"&gt;Ruby Members&lt;/a&gt; &amp;ndash; Ищете кого бы почитать из англоязычных Ruby/Rails разработчиков в твиттере? Тогда этот список для вас.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="text-decoration: underline; font-size: medium;"&gt;Разное&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://net.tutsplus.com/articles/general/why-web-developers-should-switch-to-google-chrome/"&gt;Why Web Developers Should Switch to Google Chrome&lt;/a&gt; &amp;ndash; Описание достоинств и некоторых расширений Chrome, полезных для веб-разработчиков.&lt;/li&gt;
&lt;/ul&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://web-dev.posterous.com/-100212"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://web-dev.posterous.com/-100212#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</description>
      <pubDate>Fri, 12 Feb 2010 12:30:00 MSK</pubDate>
      <guid>http://web-dev.posterous.com/-100212</guid>
      <link>http://web-dev.posterous.com/-100212</link>
    </item>
    <item>
    </item>
    <item>
    </item>
    <item>
      <title>Anton Dyachuk: Ссылки за неделю # 10/02/05</title>
      <description>&lt;p&gt;
	&lt;p&gt;&lt;span style="text-decoration: underline; font-size: medium;"&gt;Ruby/Rails&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://guides.rails.info/3_0_release_notes.html"&gt;Rails 3.0: Release Notes&lt;/a&gt; &amp;ndash; Заголовок ссылки говорит сам за себя, буквально сегодня Rails 3 перевели в статус беты.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.digimonkey.com/2010/02/why-use-haml-and-sass-i-already-know-html/"&gt;Why use HAML (and SASS)? I already know HTML.&lt;/a&gt; &amp;ndash; Список причин почему стоит использовать &lt;a href="http://haml-lang.com/"&gt;HAML&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://litanyagainstfear.com/blog/2010/02/03/the-rails-module/"&gt;The Rails Module (in Rails 3)&lt;/a&gt; &amp;ndash; описание методов, доступных в модуле Rails. Некоторые из них доступны уже сейчас.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/jcoglan/faye"&gt;faye&lt;/a&gt; &amp;ndash; Comet сервер и клиент, построенные на основе &lt;a href="http://nodejs.org/"&gt;Node.js&lt;/a&gt; и &lt;a href="http://rack.rubyforge.org/"&gt;Rack&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/AtelierConvivialite/webtranslateit"&gt;webtranslateit&lt;/a&gt; &amp;ndash; Rails плагин, позволяющий синхронизировать переводы между приложением и сервисом &lt;a href="https://webtranslateit.com/"&gt;Web Translate It&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;span style="text-decoration: underline;"&gt;Разное&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://diveintomark.org/archives/2010/01/29/tinkerers-sunset"&gt;Tinkerer&amp;rsquo;s Sunset&lt;/a&gt; &amp;ndash; Эссе об Apple, закрытых системах и будущем программирования.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developers.facebook.com/news.php?blog=1&amp;amp;story=358"&gt;HipHop for PHP: Move Fast&lt;/a&gt; &amp;ndash; Facebook разработал и открыл собственный инструмент для оптимизации PHP (не к ночи будет помянут), если в двух словах, то это компилятор PHP в C  .&lt;/li&gt;
&lt;li&gt;&lt;a href="http://spyced.blogspot.com/2010/01/linux-performance-basics.html"&gt;Linux performance basics&lt;/a&gt; &amp;ndash; Основы исследования производительности Linux при помощи vmstat, iostat и top.&lt;/li&gt;
&lt;/ul&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://web-dev.posterous.com/-100205"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://web-dev.posterous.com/-100205#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</description>
      <pubDate>Fri,  5 Feb 2010 12:17:00 MSK</pubDate>
      <guid>http://web-dev.posterous.com/-100205</guid>
      <link>http://web-dev.posterous.com/-100205</link>
    </item>
    <item>
      <title>Maxim Kulkin: Do you use LiveJournal ?</title>
      <description>Every time I visit someone's page on LiveJournal, I see something like &amp;lt;a href="http://ooprizrakoo.livejournal.com/"&amp;gt;this&amp;lt;/a&amp;gt;.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;It reminds me a &amp;lt;a href="http://www.youtube.com/watch?v=uMyEGgbrJBw"&amp;gt;Homer Simpson's web page&amp;lt;/a&amp;gt;. How people can use that crap ? Duh.&amp;lt;div class="blogger-post-footer"&amp;gt;&amp;lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25445709-5647995947316032662?l=maximkulkin.blogspot.com' alt='' /&amp;gt;&amp;lt;/div&amp;gt;</description>
      <pubDate>Tue,  2 Feb 2010 11:18:00 MSK</pubDate>
      <guid>http://maximkulkin.blogspot.com/2010/02/do-you-use-livejournal.html</guid>
      <link>http://maximkulkin.blogspot.com/2010/02/do-you-use-livejournal.html</link>
    </item>
    <item>
      <title>Anton Dyachuk: Ссылки за неделю # 10/01/29</title>
      <description>&lt;p&gt;
	&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-size: medium;"&gt;Ruby/Rails&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.engineyard.com/blog/2010/rails-and-merb-merge-rails-core-part-4-of-6/"&gt;Rails and Merb Merge: Rails Core (Part 4 of 6)&lt;/a&gt;&amp;nbsp;&amp;ndash; очередные вести с полей от Yehuda Katz о текущем статусе Rails 3.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://m.onkey.org/2010/1/22/active-record-query-interface"&gt;Active Record Query Interface 3.0&lt;/a&gt;&amp;nbsp;&amp;ndash; перечень изменений в ActiveRecord, которые появятся в Rails 3.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://omgbloglol.com/post/359147788/rails-upgrade-automating-a-portion-of-the-rails-3"&gt;Automating a portion of the Rails 3 upgrade process&lt;/a&gt;&amp;nbsp;&amp;ndash; gem, содержащий набор скриптов для автоматического апгрейда rails приложений на Rails 3.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.fngtps.com/2009/12/ordering-and-comparing-text-in-rails-and-mysql"&gt;Ordering and comparing text in Rails and MySQL&lt;/a&gt; &amp;ndash; статья о том как работает сравнение интернациональных текстов в MySQL и как это можно использовать в Rails. Если вы не знаете про collation, то настоятельно рекомендую прочитать, независимо от того используете вы Rails или нет.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.fepus.net/ruby1line.txt"&gt;HANDY ONE-LINERS FOR RUBY&lt;/a&gt; &amp;ndash; набор однострочных ruby скриптов "на все случаи жизни". Очень напоминает подобные рецепты на перле, видимо корни дают о себе знать.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.logankoester.com/bayesian-classification-on-rails"&gt;Bayesian Classification on Rails&lt;/a&gt; &amp;ndash; небольшой туториал, описывающий использование классификации Байеса в рельсовом приложении для поиска интересующих твитов.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-size: medium;"&gt;JavaScript&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://dailyjs.com/2010/01/27/pro-practices-1"&gt;Park your Horse, Code Cowboy: Professional JavaScript Workflows, Part 1&lt;/a&gt; &amp;ndash; статья об организации JavaScript кода и управлении зависимостями при помощи клиентских и серверных компонентов.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-size: medium;"&gt;Разработка&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://bishop-it.ru/2009/07/kanban-development/"&gt;Канбан в IT (Kanban Development)&lt;/a&gt; &amp;ndash; основы методологии Канбан, применительно к IT, что это такое и зачем нужно.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-size: medium;"&gt;Разное&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://sikuli.csail.mit.edu/"&gt;Project SIKULI&lt;/a&gt; &amp;ndash; интересный проект по скриптованию GUI интерфейсов при помощи обычных скриншотов.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://webplanet.ru/knowhow/life/admin/2010/01/25/andreessen.html"&gt;Марк Андрессен: Как делать дела&lt;/a&gt; &amp;ndash; вебпланета перевела статью Марка Андрессена "Как делать дела". По сути очередная вариация на тему GTD, но не лишенная интересных идей.&lt;/li&gt;
&lt;/ul&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://web-dev.posterous.com/-100129"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://web-dev.posterous.com/-100129#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</description>
      <pubDate>Fri, 29 Jan 2010 12:36:00 MSK</pubDate>
      <guid>http://web-dev.posterous.com/-100129</guid>
      <link>http://web-dev.posterous.com/-100129</link>
    </item>
    <item>
      <title>Anton Dyachuk: Javascript I18n for Rails applications</title>
      <description>&lt;p&gt;
	&lt;p&gt;Довольно часто в javascript приходится хранить текстовые данные, используемые, например, для отображения уведомлений, календаря и т.п. Естественно, что в многоязыковом приложении хотелось бы видеть эти данные локализованными. Именно для этого и предназначен rails плагин &lt;a href="http://github.com/ptzn/js_i18n"&gt;js_i18n&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Весь javascript код написан без использования каких бы то ни было фреймворков, так что прекрасно работает и с prototype.js, и с jQuery, и с любой другой библиотекой.&lt;/p&gt;
&lt;p&gt;После установки плагина стандартным образом, нужно вызвать генератор, передав ему в качестве параметра список локалей:&lt;br /&gt;&lt;em&gt;&lt;strong&gt;$script/generate js_locales en ru&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;После завершения ком

анды в приложении появятся файлы &lt;em&gt;public/javascripts/i18n.js&lt;/em&gt; и два файла локалей (&lt;em&gt;en.js&lt;/em&gt; и &lt;em&gt;ru.js&lt;/em&gt;) в каталоге &lt;em&gt;public/javascripts/locales&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Подключить эти скрипты можно при помощи хелпера javascript_i18n_include, просто добавьте следующую строку во вью:&lt;br /&gt;&lt;em&gt;&lt;strong&gt;&amp;lt;%= javascript_i18n_include %&amp;gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Этот хелпер всего лишь вызывает &lt;em&gt;javascript_include_tag&lt;/em&gt; для &lt;em&gt;i18n.js&lt;/em&gt; и одного из файлов локали. Какой файл локали подключать определяется исходя из значения &lt;em&gt;I18n.locale&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Файл локали содержит всего одну переменную &lt;em&gt;Translations&lt;/em&gt;, которая представляет собой обычный хэш, с обязательным ключом &lt;em&gt;locale&lt;/em&gt;. Если ключ &lt;em&gt;locale&lt;/em&gt; не существует, то по умолчанию считается, что локаль английская, т.е. &lt;em&gt;locale = "en"&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Пример содержимого файла &lt;em&gt;public/javascripts/locales/ru.js&lt;/em&gt;:&lt;br /&gt;&lt;div class="data syntax type-js"&gt;
    
      &lt;table cellspacing="0" cellpadding="0"&gt;
        &lt;tr&gt;
          &lt;td&gt;
            
            &lt;pre class="line_numbers"&gt;
&lt;span rel="#L1" id="LID1"&gt;1&lt;/span&gt;
&lt;span rel="#L2" id="LID2"&gt;2&lt;/span&gt;
&lt;span rel="#L3" id="LID3"&gt;3&lt;/span&gt;
&lt;/pre&gt;
          &lt;/td&gt;
          &lt;td width="100%"&gt;
            
              &lt;div class="highlight"&gt;&lt;pre /&gt;&lt;div class="line" id="LC1"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;Translations&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC2"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="nx"&gt;locale&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ru&amp;#39;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC3"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
            
          &lt;/td&gt;
        &lt;/tr&gt;
      &lt;/table&gt;
    
  &lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Ключ сообщения может быть задан в виде строки или вложенного хеша:&lt;br /&gt;&lt;div class="data syntax type-js"&gt;
    
      &lt;table cellspacing="0" cellpadding="0"&gt;
        &lt;tr&gt;
          &lt;td&gt;
            
            &lt;pre class="line_numbers"&gt;
&lt;span rel="#L1" id="LID1"&gt;1&lt;/span&gt;
&lt;span rel="#L2" id="LID2"&gt;2&lt;/span&gt;
&lt;span rel="#L3" id="LID3"&gt;3&lt;/span&gt;
&lt;span rel="#L4" id="LID4"&gt;4&lt;/span&gt;
&lt;span rel="#L5" id="LID5"&gt;5&lt;/span&gt;
&lt;span rel="#L6" id="LID6"&gt;6&lt;/span&gt;
&lt;span rel="#L7" id="LID7"&gt;7&lt;/span&gt;
&lt;span rel="#L8" id="LID8"&gt;8&lt;/span&gt;
&lt;span rel="#L9" id="LID9"&gt;9&lt;/span&gt;
&lt;span rel="#L10" id="LID10"&gt;10&lt;/span&gt;
&lt;span rel="#L11" id="LID11"&gt;11&lt;/span&gt;
&lt;span rel="#L12" id="LID12"&gt;12&lt;/span&gt;
&lt;/pre&gt;
          &lt;/td&gt;
          &lt;td width="100%"&gt;
            
              &lt;div class="highlight"&gt;&lt;pre /&gt;&lt;div class="line" id="LC1"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;Translations&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC2"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="nx"&gt;locale&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ru&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC3"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="s2"&gt;&amp;quot;foo.bar&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;baz&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC4"&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="line" id="LC5"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="nx"&gt;nested&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC6"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="nx"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;value&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC7"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="p"&gt;},&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC8"&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="line" id="LC9"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC10"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="nx"&gt;times&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;{{count}} times&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC11"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC12"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
            
          &lt;/td&gt;
        &lt;/tr&gt;
      &lt;/table&gt;
    
  &lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Получить значение ключа можно аналогично вызову в руби:&lt;br /&gt;&lt;div class="data syntax type-js"&gt;
    
      &lt;table cellspacing="0" cellpadding="0"&gt;
        &lt;tr&gt;
          &lt;td&gt;
            
            &lt;pre class="line_numbers"&gt;
&lt;span rel="#L1" id="LID1"&gt;1&lt;/span&gt;
&lt;span rel="#L2" id="LID2"&gt;2&lt;/span&gt;
&lt;span rel="#L3" id="LID3"&gt;3&lt;/span&gt;
&lt;/pre&gt;
          &lt;/td&gt;
          &lt;td width="100%"&gt;
            
              &lt;div class="highlight"&gt;&lt;pre /&gt;&lt;div class="line" id="LC1"&gt;&lt;span class="nx"&gt;I18n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;foo.bar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// -&amp;gt; &amp;quot;baz&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC2"&gt;&lt;span class="nx"&gt;I18n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;nested.hash&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// -&amp;gt; &amp;quot;value&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC3"&gt;&lt;span class="nx"&gt;I18n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;message.times&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt; &lt;span class="c1"&gt;// -&amp;gt; &amp;quot;3 times&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
            
          &lt;/td&gt;
        &lt;/tr&gt;
      &lt;/table&gt;
    
  &lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Текущую локаль можно получить используя &lt;em&gt;I18n.locale()&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;PS. Так называемый "pluralization" я реализовывать не стал, так как, во-первых, на данный момент оно мне не нужно; во-вторых, с русским языком все равно придется извращаться.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://web-dev.posterous.com/javascript-i18n-for-rails-applications"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://web-dev.posterous.com/javascript-i18n-for-rails-applications#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</description>
      <pubDate>Thu, 28 Jan 2010 19:59:00 MSK</pubDate>
      <guid>http://web-dev.posterous.com/javascript-i18n-for-rails-applications</guid>
      <link>http://web-dev.posterous.com/javascript-i18n-for-rails-applications</link>
    </item>
    <item>
      <title>Gregory Man, Dimitri Krassovski: Ruby NoName Podcast #23</title>
      <description>&amp;lt;p&amp;gt;Тви: &amp;lt;a href=&amp;quot;http://twitter.com/rubynoname&amp;quot;&amp;gt;rubynoname&amp;lt;/a&amp;gt;.
&amp;lt;p&amp;gt;&amp;lt;a href=&amp;quot;http://ruby.rpod.ru/rss.xml&amp;quot;&amp;gt;RSS&amp;lt;/a&amp;gt; и &amp;lt;a href=&amp;quot;http://ruby.rpod.ru/&amp;quot;&amp;gt;сайт подкаста на RPod.ru&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;br /&amp;gt;

&amp;lt;img src=&amp;quot;https://gregory.s3.amazonaws.com/cover.jpg&amp;quot; border=&amp;quot;0&amp;quot;&amp;gt;

&amp;lt;h2&amp;gt;&amp;lt;font size=4&amp;gt;Сегодня в программе, разговоры о:&amp;lt;/font&amp;gt;&amp;lt;/h2&amp;gt;
&amp;lt;ul&amp;gt;
  &amp;lt;li&amp;gt;Восставшие из ада.&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;Rails 3.0&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;http://aws.amazon.com/ec2/&amp;quot;&amp;gt;Amazon&amp;lt;/a&amp;gt; vs &amp;lt;a href=&amp;quot;http://www.linode.com/&amp;quot;&amp;gt;Linode&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;p&amp;gt;В подкасте использованы композиции &amp;lt;a href=&amp;quot;http://podsafeaudio.com/jamroom/bands/1454/music.php&amp;quot;&amp;gt;8 BIT Junkie by George Wood&amp;lt;/a&amp;gt; и &amp;lt;a href=&amp;quot;http://www.ru-bl.ru/&amp;quot;&amp;gt;Мы круче группы Рубль&amp;lt;/a&amp;gt;</description>
      <pubDate>Sun, 24 Jan 2010 18:05:00 MSK</pubDate>
      <guid>http://ruby.rpod.ru/138653.html</guid>
      <link>http://ruby.rpod.ru/138653.html</link>
    </item>
    <item>
      <title>Anton Dyachuk: Rake task for checking missed locale keys</title>
      <description>&lt;p&gt;
	&lt;p&gt;Задача локализации приложения превращается в геморрой, если это приложение чуть более сложное чем "hello world" (ну или "блог за 15 минут" если хотите).&lt;br /&gt;Сразу возникают вопросы "какие ключи, относительно актуальной локали, отсутствуют в остальных?", "какие переводы устарели?", "есть ли в переводах лишние ключи?" и т.п.&amp;nbsp;На данный момент времени я столкнулся только с первым вопросом, который был решен созданием rake задачи:&lt;/p&gt;
&lt;p&gt;&lt;div class="data syntax type-ruby"&gt;
    
      &lt;table cellspacing="0" cellpadding="0"&gt;
        &lt;tr&gt;
          &lt;td&gt;
            
            &lt;pre class="line_numbers"&gt;
&lt;span rel="#L1" id="LID1"&gt;1&lt;/span&gt;
&lt;span rel="#L2" id="LID2"&gt;2&lt;/span&gt;
&lt;span rel="#L3" id="LID3"&gt;3&lt;/span&gt;
&lt;span rel="#L4" id="LID4"&gt;4&lt;/span&gt;
&lt;span rel="#L5" id="LID5"&gt;5&lt;/span&gt;
&lt;span rel="#L6" id="LID6"&gt;6&lt;/span&gt;
&lt;span rel="#L7" id="LID7"&gt;7&lt;/span&gt;
&lt;span rel="#L8" id="LID8"&gt;8&lt;/span&gt;
&lt;span rel="#L9" id="LID9"&gt;9&lt;/span&gt;
&lt;span rel="#L10" id="LID10"&gt;10&lt;/span&gt;
&lt;span rel="#L11" id="LID11"&gt;11&lt;/span&gt;
&lt;span rel="#L12" id="LID12"&gt;12&lt;/span&gt;
&lt;span rel="#L13" id="LID13"&gt;13&lt;/span&gt;
&lt;span rel="#L14" id="LID14"&gt;14&lt;/span&gt;
&lt;span rel="#L15" id="LID15"&gt;15&lt;/span&gt;
&lt;span rel="#L16" id="LID16"&gt;16&lt;/span&gt;
&lt;span rel="#L17" id="LID17"&gt;17&lt;/span&gt;
&lt;span rel="#L18" id="LID18"&gt;18&lt;/span&gt;
&lt;span rel="#L19" id="LID19"&gt;19&lt;/span&gt;
&lt;span rel="#L20" id="LID20"&gt;20&lt;/span&gt;
&lt;span rel="#L21" id="LID21"&gt;21&lt;/span&gt;
&lt;span rel="#L22" id="LID22"&gt;22&lt;/span&gt;
&lt;span rel="#L23" id="LID23"&gt;23&lt;/span&gt;
&lt;span rel="#L24" id="LID24"&gt;24&lt;/span&gt;
&lt;span rel="#L25" id="LID25"&gt;25&lt;/span&gt;
&lt;span rel="#L26" id="LID26"&gt;26&lt;/span&gt;
&lt;span rel="#L27" id="LID27"&gt;27&lt;/span&gt;
&lt;span rel="#L28" id="LID28"&gt;28&lt;/span&gt;
&lt;span rel="#L29" id="LID29"&gt;29&lt;/span&gt;
&lt;span rel="#L30" id="LID30"&gt;30&lt;/span&gt;
&lt;span rel="#L31" id="LID31"&gt;31&lt;/span&gt;
&lt;span rel="#L32" id="LID32"&gt;32&lt;/span&gt;
&lt;span rel="#L33" id="LID33"&gt;33&lt;/span&gt;
&lt;span rel="#L34" id="LID34"&gt;34&lt;/span&gt;
&lt;span rel="#L35" id="LID35"&gt;35&lt;/span&gt;
&lt;span rel="#L36" id="LID36"&gt;36&lt;/span&gt;
&lt;span rel="#L37" id="LID37"&gt;37&lt;/span&gt;
&lt;span rel="#L38" id="LID38"&gt;38&lt;/span&gt;
&lt;span rel="#L39" id="LID39"&gt;39&lt;/span&gt;
&lt;span rel="#L40" id="LID40"&gt;40&lt;/span&gt;
&lt;span rel="#L41" id="LID41"&gt;41&lt;/span&gt;
&lt;span rel="#L42" id="LID42"&gt;42&lt;/span&gt;
&lt;span rel="#L43" id="LID43"&gt;43&lt;/span&gt;
&lt;span rel="#L44" id="LID44"&gt;44&lt;/span&gt;
&lt;span rel="#L45" id="LID45"&gt;45&lt;/span&gt;
&lt;span rel="#L46" id="LID46"&gt;46&lt;/span&gt;
&lt;span rel="#L47" id="LID47"&gt;47&lt;/span&gt;
&lt;span rel="#L48" id="LID48"&gt;48&lt;/span&gt;
&lt;span rel="#L49" id="LID49"&gt;49&lt;/span&gt;
&lt;span rel="#L50" id="LID50"&gt;50&lt;/span&gt;
&lt;span rel="#L51" id="LID51"&gt;51&lt;/span&gt;
&lt;span rel="#L52" id="LID52"&gt;52&lt;/span&gt;
&lt;span rel="#L53" id="LID53"&gt;53&lt;/span&gt;
&lt;span rel="#L54" id="LID54"&gt;54&lt;/span&gt;
&lt;span rel="#L55" id="LID55"&gt;55&lt;/span&gt;
&lt;span rel="#L56" id="LID56"&gt;56&lt;/span&gt;
&lt;/pre&gt;
          &lt;/td&gt;
          &lt;td width="100%"&gt;
            
              &lt;div class="highlight"&gt;&lt;pre /&gt;&lt;div class="line" id="LC1"&gt;&lt;span class="n"&gt;namespace&lt;/span&gt; &lt;span class="ss"&gt;:translations&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC2"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Show available locales&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC3"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;:available&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:environment&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Available locales: &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="no"&gt;I18n&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;available_locales&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;, &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC5"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC6"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line" id="LC7"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Show missed translations depending on default language environment (:&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="no"&gt;I18n&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;default_locale&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; by default). You can change it providing LOCALE argument&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC8"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;:missed&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:environment&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC9"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;locale&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;LOCALE&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="no"&gt;I18n&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;default_locale&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC10"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Using :&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; as default locale&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC11"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="line" id="LC12"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;i18n_backend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;I18n&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;backend&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC13"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;i18n_backend&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:init_translations&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="n"&gt;i18n_backend&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;initialized?&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC14"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;translations&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i18n_backend&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:translations&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC15"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line" id="LC16"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;main_translation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;translations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_sym&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC17"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="line" id="LC18"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;translations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC19"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Checking :&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; translations:&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC20"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;find_keys_diff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main_translation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC21"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;diff&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty?&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC22"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot; is up to date&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC23"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;else&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC24"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot; here is list of missed translation keys&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC25"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt; &lt;/span&gt; &lt;span class="n"&gt;merge_diff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\n\t&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC26"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC27"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC28"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC29"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line" id="LC30"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="kp"&gt;private&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC31"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;find_keys_diff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;master&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;in_hash&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC32"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;master&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC33"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC34"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;in_hash&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;has_key?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC35"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_s&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC36"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;elsif&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_a?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Hash&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC37"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;find_keys_diff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;master&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;in_hash&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC38"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_s&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="n"&gt;diff&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty?&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC39"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC40"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;result&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC41"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC42"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC43"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line" id="LC44"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;merge_diff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC45"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;prefix&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;blank?&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC46"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;diff&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC47"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_a?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Hash&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC48"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt; =&lt;/span&gt; &lt;span class="n"&gt;merge_diff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt; &lt;span class="o"&gt; &lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC49"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;else&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC50"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="si"&gt;}#{&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC51"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC52"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;result&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC53"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC54"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC55"&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC56"&gt;&amp;nbsp;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
            
          &lt;/td&gt;
        &lt;/tr&gt;
      &lt;/table&gt;
    
  &lt;/div&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;rake translations:available&lt;/em&gt; - покажет используемые локали&lt;/li&gt;
&lt;li&gt;&lt;em&gt;rake translations:missed&lt;/em&gt; - покажет отсутствующие ключи по всем локалям относительно актуальной, которую можно изменить указав параметр LOCALE, т.е.&amp;nbsp;&lt;em&gt;rake translations:missed LOCALE=ru&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="font-style: normal;"&gt;В гуглогруппе &lt;a href="http://groups.google.com/group/ror2ru"&gt;ror2ru&lt;/a&gt; упоминался инструмент &lt;a href="http://github.com/newsdesk/translate"&gt;Translate&lt;/a&gt; (веб интерфейс для перевода локалей в виде rails плагина), кроме собственно веб интерфейса он предоставляет несколько полезных rake задач (в том числе и поиск не переведенных кусков текста). Мне он не подошел, так как слишком тяжел и перегружен для моих текущих требований.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="display: inline !important;"&gt;&lt;span style="font-style: normal;"&gt;Быстро глянув в код, я обнаружил более страшный недостаток: translate считает, что переводы должны лежать в одном файле (то есть &lt;/span&gt;config/locales/en.yml&lt;span style="font-style: normal;"&gt; и т.д.), я же предпочитаю раскладывать их по каталогам внутри &lt;/span&gt;config/locales&lt;span style="font-style: normal;"&gt;, поэтому в своей rake задаче привязался к &lt;/span&gt;i18n.load_path&lt;span style="font-style: normal;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-size: medium;"&gt;Ссылки по теме:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p style="display: inline !important;"&gt;&lt;a href="http://guides.rubyonrails.org/i18n.html"&gt;Rails Internationalization (I18n) API&lt;/a&gt; &amp;ndash; мануал по использованию I18n&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style="display: inline !important;"&gt;&lt;a href="http://rails-i18n.org/wiki"&gt;Rails I18n : Internationalization for Ruby on Rails&lt;/a&gt; &amp;ndash; большой список ссылок на хауту, документацию и тулзы.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://web-dev.posterous.com/rake-task-for-checking-missed-locale-keys"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://web-dev.posterous.com/rake-task-for-checking-missed-locale-keys#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</description>
      <pubDate>Sun, 24 Jan 2010 06:01:00 MSK</pubDate>
      <guid>http://web-dev.posterous.com/rake-task-for-checking-missed-locale-keys</guid>
      <link>http://web-dev.posterous.com/rake-task-for-checking-missed-locale-keys</link>
    </item>
  </channel>
</rss>
