dutchify plugin

Gepubliceerd op: 28.VIII.2006 09:28 CEST
Categorieën: dutchify, plugin, rails

Een nederlandstalige website bouwen met rails is als rijden in een stoptrein. Scaffolding gebruikt; de volgende halte is “het aanpassen van de knoppen en labels”, validaties toegevoegd; de volgende halte is “het vertalen van de foutmeldingen” etc. etc. Alle snelheids verhogende features zijn doordrenkt van engelse drempels. Ik wil met de intercity!

Met de dutchify plugin doe ik een poging om alle amerikanismes aan de presentatie kant aan te pakken. Ik heb me bewust alleen op nederlands gericht omdat ik me niet alle i18n en l10n problemen op de hals wil halen, deze zijn veel te gemakkelijk te onderschatten. Ook hou ik me verre van het vertalen van classes en methodes, voor je het weet zit je een source-filter te schrijven als perligata.

Het gebruiken van een nederlandstalig datamodel valt buiten deze plugin. Hier valt veel voor te zeggen en is vaak zelfs belangrijk voor het beheersbaar houden van een project.

wat zit er wel in?

data
Alle maanden en weekdagen zijn vertaald en er worden automatisch nederlandse formaten getoond. Geen onnodig geklooi met strftime meer. Update 1 distance_of_time_in_words geeft een nederlandse versie terug.
rangtelwoorden
De Integer#ordinalize methode geeft een nederlandse variant terug;
1.ordinalize # => "1ste"
pluralize, camelize, underscore en titleize
Nou ja, niet echt. Nederlandse meervoudsregels zijn veel te ingewikkeld maar met een elegante ruby oplossing kom ik op: "ding".with_plural("dingen"), deze expressie levert een string "ding" welke op de pluralize methode "dingen" antwoordt. Update 3 De methoden camelize, underscore en titleize zijn IJ-bewust.
validatie berichten
De standaard validatie berichten zijn vertaald.
model- en kolomnamen
ActiveRecord is uitgebreid met een class methode dutch_names waarmee de nederlandse naam van het model en z’n kolommen gegeven kan worden. Voor model Bicycle zou je het volgende kunnen gebruiken:
dutch_names(“fiets”.with_plural(“fietsen”), :brand => ‘merk’, :color => ‘kleur’)
scaffolding
Dynamische scaffold is helemaal vernederlandst.
number helper
Update 2 De methodes number_to_currency, human_size, number_to_percentage en number_with_delimiter geven nu nederlandse varianten terug.

nog te doen

distance_of_time_in_words, select_date en select_datetime
“3 dagen en 4 uur geleden”. De volgorde van dropdown velden is niet logisch in een nederlandstalige context.
titelize
IJ is een enkele letter in het nederlands.
punten en komma’s
In het nederlands staan punten en komma’s precies anders om; €4.999.999,95
routing
Misschien een dutch_names methode voor controllers?
scaffold generator
Eigenlijk ben ik hier al helemaal op uitgekeken en gebruik ik deze niet meer. Kans is dus erg klein dat ik deze aanpak.

installatie

./script/plugin install http://svn.remvee.net/plugins/dutchify

ben ik iets vergeten?

Anoniempje @ ongeveer 2 uur

Erg goed! Ik ben zelf aan het proberen met rails wat aan de praat te krijgen. Mis alleen nog een goede Nederlandse host. Tips?

Jonas @ ongeveer 5 uur

Netjes … Helaas heb ik geen nederlands project … Ik zou graag iets willen maken, liefst niet alleen.

Rudie @ ongeveer 23 uur

Klinkt goed. Ik ga het zeker eens proberen.
Geldt voor de validatie berichten dat ook de dutch_names voor de veldnamen worden gebruikt?
Mooi trouwens, die voorvertoning!

Remco @ 1 dag

Uiteraard worden dutch_names in de validatie berichten meegenomen.

Anoniempje @ 3 dagen

Ziet er goed uit, maar ik mis een handleiding.

Waar moet dutch_names, in het model of in in het migrate-bestand? Wat zet ik dan in het view? kortom, een heleboel vragen die ik graag in een handleiding beantwoord zou zien.

Bertus @ 3 dagen

Ik heb een probleempje met je plugin.

View:


<%= select_year(Date.today)%>
<%= select_month(Date.today)%>

Controller:


today = Date.new(params[:date][:year].to_i, 
                 params[:date][:month].to_i, 
                 '01'.to_i)

Dit levert het volgende op:


p today.to_s => "do 01 sep 2006"

mySql vindt dit niet fijn:

"Mysql::Error: #22007Incorrect date value: ‘do 01 sep 2005’ for column ‘startdate’ … " 

Is dit eenvoudig te fixen?

Remco @ 3 dagen

Bertus,

Vreemd genoeg kan ik deze foutmelding niet reproduceren. Stukkie script/console:

>> ActiveRecord::Migration.add_column :items, :test_date, :date
-- add_column(:items, :test_date, :date)
   -> 0.2773s
=> nil
>> reload!
Reloading...
=> [ApplicationController, Item]
>> d = Date.new(2006,1,1)
=> #<Date: 4907473/2,0,2299161>
>> d.to_s
=> "zo 01 jan 2006"
>> Item.create(:test_date => d)
=> #<Item:0x2699de8 @attributes={"id"=>13, "name"=>nil,
   "test_date"=>#<Date: 4907473/2,0,2299161>,
   @errors=#<ActiveRecord::Errors:0x2697228 @base=#<Item:0x2699de8 ...>,
   @errors={}>, @new_record=false>

In deze test applicatie had ik al een model Item met kolom name. Hierboven voeg ik test_date kolom toe en zet er 1-1-2006 in. Het record is aangemaakt echter:

>> Item.find(13)
=> #<Item:0x267b924 @attributes={"name"=>nil, "id"=>"13",
   "test_date"=>"0000-00-00"}>

De datum staat op 0-0-0000.. Zelf gebruik ik de Date class nooit maar gebruik ik Time. In plaats van Date.new(2006,1,1) kan je Time.mktime(2006,1,1) gebruiken;

>> Item.create(:test_date => Time.mktime(2005,1,1))
=> #<Item:0x26e73f4 @attributes={"name"=>nil, "id"=>13,
   "test_date"=>Sat Jan 01 00:00:00 CET 2005},
   @errors=#<ActiveRecord::Errors:0x26e4f78 @base=#<Item:0x26e73f4 ...>,
   @errors={}>, @new_record=false>
>> Item.find(13)
=> #<Item:0x26d9a60 @attributes={"name"=>nil, "id"=>"13",
   "test_date"=>"2005-01-01"}>

Ha! Dat werkt! Is dus eenvoudig te fixen door geen Date maar Time te gebruiken. Waarom Date niet werkt weet ik niet en waarom er bij jouw een foutmelding verschijnt weet ik ook niet. Succes!

Remco @ 3 dagen

Anoniempje, voor een handleiding zie README in de plugin directory (zojuist geupdate).

Bertus @ 6 dagen

Remco,

het probleem met de opmaak van de datum is opgelost. In date_time.rb zet je een default opmaak. Deze heb ik aangepast, en ziedaar, mySql is tevreden.


ActiveSupport::CoreExtensions::Date::Conversions::DATE_FORMATS.update(
    :default => '%Y-%m-%d') #:default => '%a %d %b %Y')

Misschien handig om dit in README te beschrijven?

Bertus

Remco @ 13 dagen

Bertus, je hebt helemaal gelijk. Dat :default datum formaat werkt gewoon niet. Vreemd genoeg moet ik foutmeldingen ontberen. Ik heb jouw formaat als default genomen en het, door mij vergeten, :long formaat vernederlands. Dank!

Het is een beetje vreemd dat rails klakkeloos het :default formaat gebruikt bij het opbouwen van SQL statements. Voor Time objecten is er een :db formaat welke ook niet voor SQL statements wordt gebruikt..

Remco @ 14 dagen

Nog wat onderzoek gedaan naar het Date formaat probleem. Het is toch echt een bug in het verwerken van Date objecten bij het opbouwen van SQL . Gelukkig gemakkelijk op te lossen.

Toen ik op dev.rubyonrails.org een patch wilde uploaden om het probleem te verhelpen kwam ik het volgende ticket tegen: #6019 Changing default date format affects date objects written to MySQL. M’n patch hieraan toegevoegd nu maar afwachten.

Voorlopig heb ik aan dutchify een hack toegevoegd om om dit gat heen te dansen en het “mooiere” datum formaat weer terug gezet als default. Het werkt goed onder 1.1.6 en edge.

Juice10 @ ongeveer 1 maand

Bedankt Remco, dit is precies wat ik nodig had!

Anoniempje @ ongeveer 1 maand

Check ook eens de atkMetaGrammar voor pluralize functie! (achievo atk project, ala rails alleen dan in PHP ).

Die gebruiken:


class atkDutchMetaGrammar extends atkMetaGrammar 
{
  /**
   * Returns the list of singular rules.
   *
   * @return list of singular rules
   */
  function getSingularRules()
  {
    return array(
      '/ven$/i' => 'f',    
      '/ia$/i' => 'ium',
      '/onen$/i' => 'oon',
      '/([aoeiu])s$/i' => '\1',
      '/([^aoeiu])en$/i' => '\1'
    );
  }
  
  /**
   * Returns the list of plural rules.
   *
   * @return list of plural rules
   */
  function getPluralRules()
  {
    return array(
      '/f$/i' => 'ven',
      '/ium$/i' => 'ia',
      '/oon$/i' => 'onen',
      '/([aoeiu])$/i' => '\1s',
      '/([^aoeiu])$/i' => '\1en'
    );
  }  
}
Remco @ 2 maanden

Het probleem lijkt triviaal maar het is veel ingewikkelder dan dat. Bijvoorbeeld:

  • bos => bossen
  • boom => bomen
  • raaf => raven
  • mees => mezen
  • museum => musea
  • toetje => toetjes

is allemaal nog wel te doen maar met:

  • stad => steden
  • hoen => hoenderen
  • been => benen of beenderen
  • bad => baden

wordt het allemaal toch een beetje ingewikkeld..

Wel heb ik eindelijk een site gevonden waar dit soort dingen goed worden uitgelegt; De Elektronische ANS . Iets voor een regenachtige zondag middag..

Bertus @ 7 maanden

Remco,

Na upgrade Ruby 186-25 en Rails 1.2.3 werkt je plugin niet meer, getuige onderstaande melding:

E:/Programmeren/ruby/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:477:in `const_missing': uninitialized constant Date::MONTHS (NameError)
	from ./script/../config/../vendor/plugins/dutchify/lib/date_time.rb:2
	from ./script/../config/../vendor/plugins/dutchify/lib/date_time.rb:28:in `each_with_index'
	from ./script/../config/../vendor/plugins/dutchify/lib/date_time.rb:2:in `each'
	from ./script/../config/../vendor/plugins/dutchify/lib/date_time.rb:2:in `each_with_index'
	from ./script/../config/../vendor/plugins/dutchify/lib/date_time.rb:2
	from E:/Programmeren/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require'
	from E:/Programmeren/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'
	from E:/Programmeren/ruby/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:495:in `require'
	 ... 34 levels...
	from E:/Programmeren/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'
	from ./script/server:3
	from -e:4:in `load'
	from -e:

Kun je hier eens naar kijken? Alvast bedankt!

Bertus @ 7 maanden

Remco,

ik heb het gefikst door in date_time.rb het volgende toe te voegen:


Date::MONTHS = []
Date::ABBR_MONTHS = []
Date::DAYS = []
Date::ABBR_DAYS = []

Weet niet zeker of hierdoor alles weer correct werkt, maar webrick start weer op.

Bertus

Remco @ 7 maanden

Ik heb zojuist een fix ingechecked. Deze array’s zijn in 1.8.6 verhuist van Date naar Date::Format.

Stephan Kaag @ 7 maanden

Toch lijkt het vertalen in 1.8.6 niet 100% te werken. Zie: http://blog.remvee.net:80/2007/04/09/dutchify_update_voor_Ruby_1_8_6#comments

Bertus @ 8 maanden

Remco,

Er gaat nog iets mis met Ruby 1.8.6 en Rails 1.2.3. In date_select wordt de maand niet vertaalt.

Bertus

Remco @ 8 maanden

Bertus, probleem is opgelost. Dank voor je input!