Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Added localization plugin

  • Loading branch information...
commit 38143a10f8a3b832764d0f6d096084e2c6868608 0 parents
@madrobby madrobby authored
Showing with 128 additions and 0 deletions.
  1. +85 −0 README
  2. +3 −0  init.rb
  3. +40 −0 localization.rb
85 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  init.rb
@@ -0,0 +1,3 @@
+require "#{directory}/localization.rb"
+
+Localization.load
40 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
Please sign in to comment.
Something went wrong with that request. Please try again.