Rails I18n SimpleBacked Italian translation files
I opened up a little github repository to store italian language files for Rails’ recently integrated I18n gem.
You can find the files at http://github.com/masterkain/rails-i18n-italian-language/tree/master
finder bangs in Rails Edge
Finally it’s here
#before @user = User.find_by_uuid(params[:uuid]) || raise(ActiveRecord::RecordNotFound) # after @user = User.find_by_uuid!(params[:uuid])
I’m happy again.
Some Rails / Ruby tricks you should know 1
Grab column names for a model with magic fields and primary key stripped out
>> Dictionary.content_columns.collect { |col| col.name }
=> ["it", "en"]
# or
>> Dictionary.content_columns.map(&:name)
=> ["it", "en"]
Get an ActiveRecord Model attributes
>> Dictionary.first.attributes
=> {"it"=>"ciao", "id"=>1, "en"=>"hello"}
Discover which column yields the data you’re looking for
>> Dictionary.first.attributes.index("hello")
=> "en"
Take out some given keys from an Hash easily
# I think rails should need a method similar to content_columns and attributes_names but for extracting content_values
>> Dictionary.first.attributes.except("id")
=> {"it"=>"ciao", "en"=>"hello"}
Remove all whitespace on both ends of a string, change multiple spaces into one
" foo bar \n \t boo".squish # => "foo bar boo"
Manage repetitive find conditions via a Hash
# Basic
>> Model.find(:all, :conditions => ['first_name LIKE :name OR last_name LIKE :name', {:name => "aname"}])
# Extended example
# available_languages is a method which returns an Array.
>> word = "hello"
>> conditions = [ Dictionary.available_languages.collect { |language_column| language_column + ' = :word' }.join(" OR "), { :word => word } ]
>> Dictionary.find(:first, :conditions => conditions)
Not really a rails feature but you can append methods to the "end" block
query_string_array.inject('') do |string_so_far, current_word|
string_so_far + ' ' + lookup_word_and_build_translation_string(current_word)
end.squish
Returns an array with the names of the subclasses of a class
# This works in production mode or development with config.cache_classes = true or when classes are loaded
>> Account.send(:subclasses).map { |o| o.to_s } # this is protected in AR
# or
>> Object.subclasses_of(Account).map { |o| o.to_s }
Build up a sentence from an array taking advantage of the new I18n rails adapter, without last comma
# This will also use the "connector" word you defined in your language, default for en-US is "and".
>> %w(a b c).to_sentence(:skip_last_comma => true)
=> "a, b and c"
# Add in your language file:
# Used in array.to_sentence.
support:
array:
sentence_connector: "e"
There’s a ton of other stuff, just browse Active Support files to find much more useful and time-saving extensions. Now go refactor your code and make it even more prettier :)
Again on Rails Edge i18n with SimpleBackend
one hour ago a changeset changed how i18n in rails edge behaves, the main feature, apart some bug fixes, are that the language files can be in yaml.
it-IT:
activerecord:
errors:
# The values :model, :attribute and :value are always available for interpolation
# The value :count is available when applicable. Can be used for pluralization.
messages:
inclusion: "non è incluso nella lista"
exclusion: "è riservato"
invalid: "è invalido"
confirmation: "non coincide con la conferma"
accepted: "deve essere accettata"
empty: "non può essere vuoto"
blank: "non può essere vuoto"
too_long: "è troppo lungo (il massimo è {{count}} lettere)"
too_short: "è troppo corto (il minimo è {{count}} lettere)"
wrong_length: "è della lunghezza sbagliata (deve essere di {{count}} lettere)"
taken: "è già in uso"
not_a_number: "non è un numero"
greater_than: "deve essere superiore a {{count}}"
greater_than_or_equal_to: "deve essere superiore o uguale a {{count}}"
equal_to: "deve essere uguale a {{count}}"
less_than: "deve essere meno di {{count}}"
less_than_or_equal_to: "deve essere meno o uguale a {{count}}"
odd: "deve essere dispari"
even: "deve essere pari"
# Append your own errors here or at the model/attributes scope.
can_only_contain_letters_and_numbers: "può contenere solo lettere e numeri"
can_t_be_blank_or_is_not_valid: "non può essere vuoto o non valido"
models:
# Overrides default messages
attributes:
# Overrides model and default messages.
class ApplicationController < ActionController::Base
before_filter :set_locale
private
# Sets the locale for the current request.
def set_locale
# I18n.default_locale returns the current default locale. Defaults to 'en-US'
locale = params[:locale] || session[:locale] || (this_user.site_language if is_logged_in?) || I18n.default_locale
# TODO: insert a conditional check there to make sure be choose a valid supported locale.
session[:locale] = locale
# Sets the current locale pseudo-globally, i.e. in the Thread.current hash.
I18n.locale = locale
# Allow client libraries to pass a block that populates the translation
# storage. Decoupled for backends like a db backend that persist their
# translations, so the backend can decide whether/when to yield or not.
I18n.populate do
# Allows client libraries to pass arguments that specify a source for
# translation data to be loaded by the backend. The backend defines
# acceptable sources.
# E.g. the provided SimpleBackend accepts a list of paths to translation
# files which are either named *.rb and contain plain Ruby Hashes or are
# named *.yml and contain YAML data.)
I18n.load_translations "lib/locale/#{locale}.yml"
end
end
my rails .gitignore 2
config/database.yml *~ *.cache *.log *.pid tmp/**/* .DS\_Store db/cstore/** doc/api doc/app doc/plugins coverage/* db/*.sqlite3 *.tmproj Capfile
usually I leave a config/database.yml.example, you can extend this list also to ignore the schema.rb.
edge rails should be able to recreate missing directory, because as you know git won’t follow empty directories, if that’s the case, just touch a .gitignore in tmp and log directories.
extra trick: to always ignore those files globally:
git config --global core.excludesfile /path/to/.gitignore
update:
suggested by schram:
doc/*.dot
to ignore railroad files
also for somebody is useful to have the sqlite production database versioned, so remove db/*.sqlite3.
another update:
ignored vim swap files
*.sw?
Why? And why not, try Thin!
Edge Rails
sudo gem install thin script/server thin
And you’re good to go.
Extra: a sample new config.gem
# Rubyforge gems. config.gem "thin" # new web server, mongrel based config.gem "uuidtools" # uuid generator config.gem "chronic", :version => '0.2.3' # natural language date/time, for ultrasphinx config.gem "hpricot", :version => '0.6' # scraping, see also mechanize config.gem "googletranslate", :lib => "rtranslate" # translator config.gem "bcrypt-ruby", :lib => "bcrypt" # password hashing config.gem "ar-extensions" # bulk data inserts config.gem "bj" # background jobs # Github gems. config.gem "mislav-will_paginate", :version => "~> 2.3.2", :lib => "will_paginate", :source => "http://gems.github.com" # ultrasphinx pagination
named_scope goodness on edge rails
named_scope :active, :conditions => { :is_active => true }
named_scope :inactive, :conditions => { :is_active => false } do
def activate
# Use with great care.
# User.inactive.activate
each { |user| user.update_attribute(:active, true) }
end
end
# Oh oh oh. Should work in production mode this way.
named_scope :called, lambda { |username| { :conditions => { :username => username } } }
def self.perform_login(username, password)
# New Rails goodness.
usr = active.called(username).first
...
And no, it doesn’t do select * from without limit and pick the first result, it writes in sql the LIMIT clause. Win.