Skip to content

Commit

Permalink
Added localization plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
madrobby committed Oct 29, 2005
0 parents commit 38143a1
Show file tree
Hide file tree
Showing 3 changed files with 128 additions and 0 deletions.
85 changes: 85 additions & 0 deletions README
@@ -0,0 +1,85 @@
= Localization Plugin for Rails

This plugin provides a simple, gettext-like method to
provide localizations.

== Features

* Any number of languages or locales
* Simple method to defines singluar/plural translations
* Can use lambdas to provide Ruby-code based dynamic translations
* Customizable for different instances of the application

== Usage

If the localization plugin is installed, it is used automatically.

You need to create a /lang dir in your RAILS_ROOT.

The recommended way to use it is to create files that are named
like the languages you define in them (but you can put everything in
one big file too.)

For instance-customizable strings, add overrides in files you
put in /lang/custom.

=== Simple example:

Create a file /lang/translations.rb:

Localization.define('de') do |l|
l.store 'yes', 'Ja'
l.store 'no', 'Nein'
end

Localization.define('fr') do |l|
l.store 'yes', 'oui'
l.store 'no', 'non'
end

In your controller or application.rb:

Localization.lang = 'de' # or 'fr'

In your view:

<%=_ 'yes' %>
<%=_ 'no' %>

Because the _ method is simply an extension to Object, you
can use it anywhere (models/controllers/views/libs).

=== Extended example:

Create a file /lang/default.rb with following contents:

Localization.define do |l|
l.store '(time)', lambda { |t| t.strftime('%I:%M%p') }
end

Create a file /lang/de_DE.rb with following contents:

Localization.define('de_DE') do |l|
l.store '%d entries', ['Ein Eintrag', '%d Einträge']
l.store '(time)', lambda { |t| t.strftime('%H:%M') }
end

In your controller or application.rb:

Localization.lang = 'de_DE'

In your view:

<%=_ '%d entries', 1 %> # singular variant is chosen
<%=_ '%d entries', 4 %> # plural variant is chosen
<%=_ '(time)', Time.now %> # call the block with a parameter

== Translation file guesstimation

You can generate a guesstimation of all strings needed to be
translated in your views by first adding the _('blah') syntax
everywhere and then calling:

puts Localization.generate_l10n_file

in the Rails console.
3 changes: 3 additions & 0 deletions init.rb
@@ -0,0 +1,3 @@
require "#{directory}/localization.rb"

Localization.load
40 changes: 40 additions & 0 deletions localization.rb
@@ -0,0 +1,40 @@
module Localization
mattr_accessor :lang

@@l10s = { :default => {} }
@@lang = :default

def self._(string_to_localize, *args)
translated = @@l10s[@@lang][string_to_localize] || string_to_localize
return translated.call(*args).to_s if translated.is_a? Proc
translated = translated[args[0]>1 ? 1 : 0] if translated.is_a? Array
sprintf translated, *args
end

def self.define(lang = :default)
@@l10s[lang] ||= {}
yield @@l10s[lang]
end

def self.load
Dir.glob("#{RAILS_ROOT}/lang/*.rb"){ |t| require t }
Dir.glob("#{RAILS_ROOT}/lang/custom/*.rb"){ |t| require t }
end

# Generates a best-estimate l10n file from all views by
# collecting calls to _() -- note: use the generated file only
# as a start (this method is only guesstimating)
def self.generate_l10n_file
"Localization.define('en_US') do |l|\n" <<
Dir.glob("#{RAILS_ROOT}/app/views/**/*.rhtml").collect do |f|
["# #{f}"] << File.read(f).scan(/<%.*[^\w]_\s*[\"\'](.*?)[\"\']/)
end.uniq.flatten.collect do |g|
g.starts_with?('#') ? "\n #{g}" : " l.store '#{g}', '#{g}'"
end.uniq.join("\n") << "\nend"
end

end

class Object
def _(*args); Localization._(*args); end
end

0 comments on commit 38143a1

Please sign in to comment.