<?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>nanoANT &#187; Ruby</title>
	<atom:link href="http://www.nanoant.com/category/programming/ruby/feed" rel="self" type="application/rss+xml" />
	<link>http://www.nanoant.com</link>
	<description>Yet another self-employee site &#38; blog</description>
	<lastBuildDate>Mon, 24 Jan 2011 17:18:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Haml + Gettext = automagic translation</title>
		<link>http://www.nanoant.com/programming/haml-gettext-automagic-translation</link>
		<comments>http://www.nanoant.com/programming/haml-gettext-automagic-translation#comments</comments>
		<pubDate>Mon, 13 Apr 2009 21:39:41 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[haml templates ruby performance i18n l10n multilanguage]]></category>

		<guid isPermaLink="false">http://www.nanoant.com/?p=290</guid>
		<description><![CDATA[I was rather sceptic to Haml once I have first time read about it. But after recently playing a while with it I can frankly express that it is simply outstanding template engine for Ruby. What I miss about Haml is some seamless integration with some i18n framework (gem). So I decided to create Haml [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" src="http://www.nanoant.com/wp/wp-content/uploads/2009/04/haml.gif" alt="Haml logo" />I was rather sceptic to <a href="http://haml.hamptoncatlin.com/">Haml</a> once I have first time read about it. But after recently playing a while with it I can frankly express that it is simply outstanding template engine for <a href="http://www.ruby-lang.org/">Ruby</a>. What I miss about <em>Haml</em> is some seamless integration with some i18n framework (gem).</p>
<p>So I decided to create <em>Haml</em> &#8220;mod&#8221; that uses <a href="http://www.yotabanana.com/hiki/ruby-gettext.html">GetText</a> (<a href="http://github.com/grosser/fast_gettext/tree/master">FastGettext</a> alternatively) to automagically translate static texts from <em>Haml</em> templates during precompilation stage. So something that you don&#8217;t see and you don&#8217;t need to worry about.<span id="more-290"></span></p>
<p>Normally you would use <tt>_(text)</tt> calls to translate string in your templates as below:</p>
<pre class="textmate-source"><span class="text text_haml"><span class="meta meta_tag meta_tag_haml"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_haml">%</span><span class="entity entity_name entity_name_tag entity_name_tag_haml">h1</span></span><span class="meta meta_line meta_line_ruby meta_line_ruby_haml">=<span class="source source_ruby source_ruby_embedded source_ruby_embedded_haml"> _<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span><span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>Items<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span></span></span>
<span class="meta meta_line meta_line_ruby meta_line_ruby_haml">-<span class="source source_ruby source_ruby_embedded source_ruby_embedded_haml"> items<span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>each </span><span class="source source_ruby source_ruby_embedded source_ruby_embedded_html"><span class="keyword keyword_control keyword_control_ruby keyword_control_ruby_start-block">do</span> |item|</span></span>
  <span class="entity entity_name entity_name_tag entity_name_tag_class entity_name_tag_class_haml">.item</span>
    <span class="meta meta_tag meta_tag_haml"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_haml">%</span><span class="entity entity_name entity_name_tag entity_name_tag_haml">h1</span></span><span class="meta meta_line meta_line_ruby meta_line_ruby_haml">=<span class="source source_ruby source_ruby_embedded source_ruby_embedded_haml"> item<span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>title</span></span>
    <span class="meta meta_tag meta_tag_haml"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_haml">%</span><span class="entity entity_name entity_name_tag entity_name_tag_haml">a</span></span><span class="meta meta_section meta_section_attributes meta_section_attributes_haml">{<span class="meta meta_syntax meta_syntax_ruby meta_syntax_ruby_start-block"> </span>href<span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby">=</span><span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>/edit<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span> }</span><span class="meta meta_line meta_line_ruby meta_line_ruby_haml">=<span class="source source_ruby source_ruby_embedded source_ruby_embedded_haml"> _<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span><span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>Edit<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span></span></span>
    <span class="meta meta_tag meta_tag_haml"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_haml">%</span><span class="entity entity_name entity_name_tag entity_name_tag_haml">a</span></span><span class="meta meta_section meta_section_attributes meta_section_attributes_haml">{<span class="meta meta_syntax meta_syntax_ruby meta_syntax_ruby_start-block"> </span>href<span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby">=</span><span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>/delete<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span> }</span><span class="meta meta_line meta_line_ruby meta_line_ruby_haml">=<span class="source source_ruby source_ruby_embedded source_ruby_embedded_haml"> _<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span><span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>Delete<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span></span></span></span></pre>
<p>You can see this is pretty ugly and unreadable. If you gonna have multi-language site you want to translate all of the static texts there anyway, without doing anything extra. So you would prefer to type:</p>
<pre class="textmate-source"><span class="text text_haml"><span class="meta meta_tag meta_tag_haml"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_haml">%</span><span class="entity entity_name entity_name_tag entity_name_tag_haml">h1</span></span><span class="meta meta_line meta_line_ruby meta_line_ruby_haml">=<span class="source source_ruby source_ruby_embedded source_ruby_embedded_haml"> <span class="variable variable_other variable_other_constant variable_other_constant_ruby">Items</span></span></span>
<span class="meta meta_line meta_line_ruby meta_line_ruby_haml">-<span class="source source_ruby source_ruby_embedded source_ruby_embedded_haml"> items<span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>each </span><span class="source source_ruby source_ruby_embedded source_ruby_embedded_html"><span class="keyword keyword_control keyword_control_ruby keyword_control_ruby_start-block">do</span> |item|</span></span>
  <span class="entity entity_name entity_name_tag entity_name_tag_class entity_name_tag_class_haml">.item</span>
    <span class="meta meta_tag meta_tag_haml"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_haml">%</span><span class="entity entity_name entity_name_tag entity_name_tag_haml">h1</span></span><span class="meta meta_line meta_line_ruby meta_line_ruby_haml">=<span class="source source_ruby source_ruby_embedded source_ruby_embedded_haml"> item<span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>title</span></span>
    <span class="meta meta_tag meta_tag_haml"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_haml">%</span><span class="entity entity_name entity_name_tag entity_name_tag_haml">a</span></span><span class="meta meta_section meta_section_attributes meta_section_attributes_haml">{<span class="meta meta_syntax meta_syntax_ruby meta_syntax_ruby_start-block"> </span>href<span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby">=</span><span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>/edit<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span> }</span> Edit
    <span class="meta meta_tag meta_tag_haml"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_haml">%</span><span class="entity entity_name entity_name_tag entity_name_tag_haml">a</span></span><span class="meta meta_section meta_section_attributes meta_section_attributes_haml">{<span class="meta meta_syntax meta_syntax_ruby meta_syntax_ruby_start-block"> </span>href<span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby">=</span><span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>/delete<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span> }</span> Delete</span></pre>
<p>And have <em>&#8220;Items&#8221;</em>, <em>&#8220;Edit&#8221;</em>, <em>&#8220;Delete&#8221;</em> just translated, right? This is what my mod does. It translates all of those at precompilation stage which also is much better for your application performance, since <em>GetText</em> routines are called only once at precompilation stage. Here it goes.</p>
<h3>haml_gettext.rb</h3>
<pre class="textmate-source"><span class="source source_ruby"><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> Haml gettext module providing gettext translation for all Haml plain text calls
</span><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span>
</span><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> http://pastie.org/445295
</span>
<span class="meta meta_class meta_class_ruby"><span class="keyword keyword_control keyword_control_class keyword_control_class_ruby">class</span> <span class="entity entity_name entity_name_type entity_name_type_class entity_name_type_class_ruby">Haml::Engine</span></span>
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">  <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> Inject _ gettext into plain text and tag plain text calls
</span>  <span class="meta meta_function meta_function_method meta_function_method_with-arguments meta_function_method_with-arguments_ruby"><span class="keyword keyword_control keyword_control_def keyword_control_def_ruby">def</span> <span class="entity entity_name entity_name_function entity_name_function_ruby">push_plain</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby">(</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_ruby">text</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby">)</span></span>
    <span class="keyword keyword_control keyword_control_pseudo-method keyword_control_pseudo-method_ruby">super</span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span>_<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span>text<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">))</span>
  <span class="keyword keyword_control keyword_control_ruby">end</span>
  <span class="meta meta_function meta_function_method meta_function_method_with-arguments meta_function_method_with-arguments_ruby"><span class="keyword keyword_control keyword_control_def keyword_control_def_ruby">def</span> <span class="entity entity_name entity_name_function entity_name_function_ruby">parse_tag</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby">(</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_ruby">line</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby">)</span></span>
    tag_name<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> attributes<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> attributes_hash<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> object_ref<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> nuke_outer_whitespace<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span>
      nuke_inner_whitespace<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> action<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> value <span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby">=</span> <span class="keyword keyword_control keyword_control_pseudo-method keyword_control_pseudo-method_ruby">super</span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span>line<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span>
    value <span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby">=</span> _<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span>value<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span> <span class="keyword keyword_control keyword_control_ruby">unless</span> action <span class="keyword keyword_operator keyword_operator_logical keyword_operator_logical_ruby">||</span> value<span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>empty?
    <span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby">[</span>tag_name<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> attributes<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> attributes_hash<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> object_ref<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> nuke_outer_whitespace<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span>
        nuke_inner_whitespace<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> action<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> value<span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby">]</span>
  <span class="keyword keyword_control keyword_control_ruby">end</span>
<span class="keyword keyword_control keyword_control_ruby">end</span></span></pre>
<p>All you need is to choose <em>GetText</em> or <em>FastGettext</em> and load my mod later on.</p>
<pre class="textmate-source"><span class="source source_ruby"><span class="meta meta_require meta_require_ruby"><span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">require</span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>haml<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span></span>
<span class="meta meta_require meta_require_ruby"><span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">require</span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>fast_gettext<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span></span>
<span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">include</span> <span class="support support_class support_class_ruby">FastGettext</span><span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby">::</span><span class="variable variable_other variable_other_constant variable_other_constant_ruby">Translation</span>
<span class="meta meta_require meta_require_ruby"><span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">require</span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>haml_gettext<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span></span></span></pre>
<p>You probably want to know the way to your gettext pot/po files out of the tempaltes. I have prepared here Rake tasks for you as well (based on work I found somewhere over Ruby blogs) to parse Haml templates extended to include static texts in the translation.</p>
<h3>Rakefile</h3>
<pre class="textmate-source"><span class="source source_ruby">desc <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>Update pot/po files.<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>
task <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>updatepo</span> <span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby">do
</span>  <span class="meta meta_require meta_require_ruby"><span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">require</span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>gettext/tools<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span></span>
  <span class="meta meta_require meta_require_ruby"><span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">require</span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>haml_parser<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span></span>
  <span class="support support_class support_class_ruby">GetText</span><span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>update_pofiles<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span><span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>rbigg<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> <span class="support support_class support_class_ruby">Dir</span><span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>glob<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span><span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>{lib,views}/**/*.{rb,haml}<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span> <span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_augmented keyword_operator_assignment_augmented_ruby">&lt;&lt;</span> <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>rbigg.rb<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>rbigg 1.0.0<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>po_root</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=&gt;</span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>locale<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span>
<span class="keyword keyword_control keyword_control_ruby">end</span></span></pre>
<h3>haml_parser.rb</h3>
<pre class="textmate-source"><span class="source source_ruby"><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> Haml gettext parser module
</span><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span>
</span><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> http://pastie.org/445297
</span><span class="meta meta_require meta_require_ruby"><span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">require</span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>gettext/tools/rgettext<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span></span>
<span class="meta meta_require meta_require_ruby"><span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">require</span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>gettext/parser/ruby<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span></span>
<span class="meta meta_require meta_require_ruby"><span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">require</span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>haml<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span></span>

<span class="meta meta_class meta_class_ruby"><span class="keyword keyword_control keyword_control_class keyword_control_class_ruby">class</span> <span class="entity entity_name entity_name_type entity_name_type_class entity_name_type_class_ruby">Haml::Engine</span></span>
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">  <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> Overriden function that parses Haml tags
</span><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">  <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> Injects gettext call for plain text action.
</span>  <span class="meta meta_function meta_function_method meta_function_method_with-arguments meta_function_method_with-arguments_ruby"><span class="keyword keyword_control keyword_control_def keyword_control_def_ruby">def</span> <span class="entity entity_name entity_name_function entity_name_function_ruby">parse_tag</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby">(</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_ruby">line</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby">)</span></span>
    tag_name<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> attributes<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> attributes_hash<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> object_ref<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> nuke_outer_whitespace<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span>
      nuke_inner_whitespace<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> action<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> value <span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby">=</span> <span class="keyword keyword_control keyword_control_pseudo-method keyword_control_pseudo-method_ruby">super</span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span>line<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span>
    <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>precompiled</span> <span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_augmented keyword_operator_assignment_augmented_ruby">&lt;&lt;</span> <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>_(<span class="constant constant_character constant_character_escape constant_character_escape_ruby">\"</span><span class="source source_ruby source_ruby_embedded source_ruby_embedded_source"><span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">#{</span>value<span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">}</span></span><span class="constant constant_character constant_character_escape constant_character_escape_ruby">\"</span>)<span class="constant constant_character constant_character_escape constant_character_escape_ruby">\n</span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span> <span class="keyword keyword_control keyword_control_ruby">unless</span> action <span class="keyword keyword_operator keyword_operator_logical keyword_operator_logical_ruby">||</span> value<span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>empty?
    <span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby">[</span>tag_name<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> attributes<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> attributes_hash<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> object_ref<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> nuke_outer_whitespace<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span>
        nuke_inner_whitespace<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> action<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> value<span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby">]</span>
  <span class="keyword keyword_control keyword_control_ruby">end</span>
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">  <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> Overriden function that producted Haml plain text
</span><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">  <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> Injects gettext call for plain text action.
</span>  <span class="meta meta_function meta_function_method meta_function_method_with-arguments meta_function_method_with-arguments_ruby"><span class="keyword keyword_control keyword_control_def keyword_control_def_ruby">def</span> <span class="entity entity_name entity_name_function entity_name_function_ruby">push_plain</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby">(</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_ruby">text</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby">)</span></span>
    <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>precompiled</span> <span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_augmented keyword_operator_assignment_augmented_ruby">&lt;&lt;</span> <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>_(<span class="constant constant_character constant_character_escape constant_character_escape_ruby">\"</span><span class="source source_ruby source_ruby_embedded source_ruby_embedded_source"><span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">#{</span>text<span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">}</span></span><span class="constant constant_character constant_character_escape constant_character_escape_ruby">\"</span>)<span class="constant constant_character constant_character_escape constant_character_escape_ruby">\n</span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>
  <span class="keyword keyword_control keyword_control_ruby">end</span>
<span class="keyword keyword_control keyword_control_ruby">end</span>

<span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> Haml gettext parser
</span><span class="meta meta_module meta_module_ruby"><span class="keyword keyword_control keyword_control_module keyword_control_module_ruby">module</span> <span class="entity entity_name entity_name_type entity_name_type_module entity_name_type_module_ruby">HamlParser</span></span>
  <span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">module_function</span>

  <span class="meta meta_function meta_function_method meta_function_method_with-arguments meta_function_method_with-arguments_ruby"><span class="keyword keyword_control keyword_control_def keyword_control_def_ruby">def</span> <span class="entity entity_name entity_name_function entity_name_function_ruby">target?</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby">(</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_ruby">file</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby">)</span></span>
    <span class="support support_class support_class_ruby">File</span><span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>extname<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span>file<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span> <span class="keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_ruby">==</span> <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>.haml<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>
  <span class="keyword keyword_control keyword_control_ruby">end</span>

  <span class="meta meta_function meta_function_method meta_function_method_with-arguments meta_function_method_with-arguments_ruby"><span class="keyword keyword_control keyword_control_def keyword_control_def_ruby">def</span> <span class="entity entity_name entity_name_function entity_name_function_ruby">parse</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby">(</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_ruby">file<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> ary <span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby">=</span> <span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby">[]</span></span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby">)</span></span>
    haml <span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby">=</span> <span class="support support_class support_class_ruby">Haml</span><span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby">::</span><span class="support support_class support_class_ruby">Engine</span><span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span><span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">new</span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span><span class="support support_class support_class_ruby">IO</span><span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>readlines<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span>file<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span><span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>join<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span>
    code <span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby">=</span> haml<span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>precompiled<span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>split<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span><span class="string string_regexp string_regexp_classic string_regexp_classic_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_ruby">/</span>$<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_ruby">/</span></span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span>
    <span class="support support_class support_class_ruby">GetText</span><span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby">::</span><span class="support support_class support_class_ruby">RubyParser</span><span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>parse_lines<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span>file<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> code<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> ary<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span>
  <span class="keyword keyword_control keyword_control_ruby">end</span>
<span class="keyword keyword_control keyword_control_ruby">end</span>

<span class="support support_class support_class_ruby">GetText</span><span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby">::</span><span class="support support_class support_class_ruby">RGetText</span><span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>add_parser<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span><span class="variable variable_other variable_other_constant variable_other_constant_ruby">HamlParser</span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span></span></pre>
<p>So this is it. Have fun with nice and clean templates that are translated on the fly</p>
<h2>See &amp; get more&#8230;</h2>
<p>You can find more recent and complete code at my <a href="http://github.com/nanoant/sinatra-hat">Sinatra Hat</a> GitHub hosted Ruby gem project.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nanoant.com/programming/haml-gettext-automagic-translation/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

