Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 38143a1
Showing
3 changed files
with
128 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
require "#{directory}/localization.rb" | ||
|
||
Localization.load |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |