<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>I18n on Marcello Barnaba</title>
    <link>https://sindro.me/it/tags/i18n/</link>
    <description>Recent content in I18n on Marcello Barnaba</description>
    <generator>Hugo</generator>
    <language>it</language>
    <lastBuildDate>Wed, 14 Feb 2018 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://sindro.me/it/tags/i18n/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Un importatore senza vergogna di Translation Memory in Pontoon</title>
      <link>https://sindro.me/it/posts/2018-02-14-translation-memory-pontoon/</link>
      <pubDate>Wed, 14 Feb 2018 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2018-02-14-translation-memory-pontoon/</guid>
      <description>&lt;div class=&#34;retrospective&#34;&gt;&#xA;  &lt;span class=&#34;retrospective-icon&#34;&gt;&amp;#x1f50d;&lt;/span&gt;&#xA;  &lt;div class=&#34;retrospective-body&#34;&gt;&#xA;    &lt;em&gt;Retrospettiva 2026&lt;/em&gt;&lt;br&gt;&#xA;    Il repo a &lt;a href=&#34;https://github.com/ifad/translation-memory&#34; target=&#34;_blank&#34;&gt;github.com/ifad/translation-memory&lt;/a&gt; è ancora pubblico, ancora senza README, e il fork di Pontoon a cui parla resta privato. &lt;a href=&#34;https://github.com/mozilla/pontoon&#34; target=&#34;_blank&#34;&gt;L&amp;rsquo;upstream di Mozilla&lt;/a&gt; è aperto e molto vivo. Se qualcuno all&amp;rsquo;IFAD usi ancora Pontoon otto anni dopo, sinceramente non lo so — l&amp;rsquo;ho costruito per un progetto sulla mia scrivania, non come cambio di workflow aziendale. La regex che strippa i caratteri non-word ha fatto il suo lavoro per i mesi in cui mi serviva. Poi, presumibilmente, la successiva migration dello schema di Pontoon ha rotto qualcosa. È quello che succede alle integrazioni che parlano direttamente con un database.&#xA;  &lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;L&amp;rsquo;&lt;a href=&#34;http://www.ifad.org/&#34; target=&#34;_blank&#34;&gt;IFAD&lt;/a&gt; è un&amp;rsquo;agenzia ONU che opera in &lt;a href=&#34;https://www.ifad.org/en/web/operations/languages&#34; target=&#34;_blank&#34;&gt;inglese, francese, spagnolo e arabo&lt;/a&gt;. Ogni stringa visibile delle nostre app Rails deve esistere in quattro lingue, il che significa che abbiamo un team di traduzione, il che significa che abbiamo un workflow di traduzione, che sulla maggior parte dei progetti prevede un &lt;a href=&#34;https://it.wikipedia.org/wiki/Computer_assisted_translation&#34; target=&#34;_blank&#34;&gt;CAT desktop&lt;/a&gt;, file allegati alle email, e translation memory che girano in formato XML.&lt;/p&gt;&#xA;&lt;p&gt;Quel workflow non sopravvive a un progetto su cui sto lavorando in questo momento. È un&amp;rsquo;app web Rails con una scadenza stretta, le stringhe sorgente cambiano ogni settimana, e nel tempo che un traduttore impiega per finire un file TM e rimandarlo via email le stringhe si sono già spostate. Mi servono traduttori e sviluppatori che guardano lo stesso database in tempo reale. Scelgo &lt;a href=&#34;https://pontoon.mozilla.org/&#34; target=&#34;_blank&#34;&gt;Mozilla Pontoon&lt;/a&gt; — open-source, gratis, adattabile, scritto in Django, basato su Postgres — e lo tiro su per il mio progetto. La fregatura: c&amp;rsquo;è un corpus di traduzioni dal tool precedente che voglio usare per fare il seed di Pontoon dal primo giorno, così i traduttori non partono dal nulla.&lt;/p&gt;&#xA;&lt;p&gt;Oggi inizio un repo &lt;a href=&#34;https://github.com/ifad/translation-memory&#34; target=&#34;_blank&#34;&gt;translation-memory&lt;/a&gt; e scrivo il primo parser. Il progetto è descritto, con tutta la dovuta umiltà ingegneristica, come &lt;a href=&#34;https://github.com/ifad/translation-memory&#34; target=&#34;_blank&#34;&gt;&amp;ldquo;Parser per file TMX, SDL/XLIFF e TXML e importatore senza vergogna in Mozilla Pontoon&amp;rdquo;&lt;/a&gt;. Quel &amp;ldquo;senza vergogna&amp;rdquo; sta facendo molto lavoro in quella frase.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Active Gibberish</title>
      <link>https://sindro.me/it/posts/2008-01-22-active-gibberish/</link>
      <pubDate>Tue, 22 Jan 2008 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2008-01-22-active-gibberish/</guid>
      <description>&lt;div class=&#34;retrospective&#34;&gt;&#xA;  &lt;span class=&#34;retrospective-icon&#34;&gt;&amp;#x1f50d;&lt;/span&gt;&#xA;  &lt;div class=&#34;retrospective-body&#34;&gt;&#xA;    &lt;em&gt;Retrospettiva 2026&lt;/em&gt;&lt;br&gt;&#xA;    Il plugin Gibberish e tutto questo approccio sono morti e sepolti. Rails 2.2 (2008) ha aggiunto il supporto I18n integrato, e da Rails 3 in poi il modo standard è &lt;code&gt;config/locales/*.yml&lt;/code&gt; con la gem &lt;code&gt;i18n&lt;/code&gt;. I messaggi di errore di ActiveRecord, i nomi dei campi e tutte le stringhe dell&amp;rsquo;interfaccia sono gestiti nativamente — niente plugin, niente monkey-patching.&#xA;  &lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;AGGIORNAMENTO: non ti serve questo codice, perché a partire dalla versione 2.2 di Rails il supporto alla localizzazione è integrato.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;localizzazione-dei-messaggi-di-errore-di-active-record&#34; id=&#34;localizzazione-dei-messaggi-di-errore-di-active-record&#34;&gt;Localizzazione dei messaggi di errore di Active Record&lt;a class=&#34;heading-anchor&#34; href=&#34;#localizzazione-dei-messaggi-di-errore-di-active-record&#34; aria-label=&#34;Link a questa sezione&#34;&gt;¶&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Oggi ho dovuto rispondere a una delle domande su cui ogni sviluppatore Rails&#xA;non anglofono prima o poi inciampa&amp;hellip; come localizzare i messaggi di errore di&#xA;AR per mostrarli in modo decente a un cliente che non parla inglese ;).&lt;/p&gt;&#xA;&lt;p&gt;Prima di tutto, grazie all&amp;rsquo;eccellente plugin gibberish di&#xA;&lt;a href=&#34;http://errtheblog.com&#34; target=&#34;_blank&#34;&gt;defunkt&lt;/a&gt; e al modo in cui gli errori di validazione di&#xA;AR sono esposti, il compito è stato portato a termine in modo semplice e&#xA;pulito, senza mettere troppo le mani negli internals di AR.&lt;/p&gt;&#xA;&lt;p&gt;Ho cominciato traducendo ogni messaggio di errore predefinito di AR, con questo&#xA;file di traduzione in &lt;code&gt;lang/it.yml&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Active Record errors&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ss&#34;&gt;ar_accepted&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;     &lt;span class=&#34;s2&#34;&gt;&amp;#34;deve essere accettato&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ss&#34;&gt;ar_not_a_number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;non è un numero&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ss&#34;&gt;ar_blank&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;è un campo obbligatorio&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ss&#34;&gt;ar_empty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;è un campo obbligatorio&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ss&#34;&gt;ar_inclusion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;non è nella lista dei valori validi&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ss&#34;&gt;ar_too_long&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;     &lt;span class=&#34;s2&#34;&gt;&amp;#34;è troppo lungo (massimo %d caratteri)&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ss&#34;&gt;ar_exclusion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;è riservato&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ss&#34;&gt;ar_too_short&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;è troppo corto (minimo %d caratteri)&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ss&#34;&gt;ar_invalid&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;non è valido&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ss&#34;&gt;ar_wrong_length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;è errato, dovrebbe essere di %d caratteri&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ss&#34;&gt;ar_confirmation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;non corrisponde&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ss&#34;&gt;ar_taken&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;esiste già&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# This one is not a default key, but I use it in my validations&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ss&#34;&gt;ar_greater_zero&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;deve essere maggiore di zero&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;e quattro righe in &lt;code&gt;config/environment.rb&lt;/code&gt;:&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
