localizer_rails 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +191 -0
- data/Rakefile +34 -0
- data/app/assets/images/flags/ad.png +0 -0
- data/app/assets/images/flags/ae.png +0 -0
- data/app/assets/images/flags/af.png +0 -0
- data/app/assets/images/flags/ag.png +0 -0
- data/app/assets/images/flags/ai.png +0 -0
- data/app/assets/images/flags/al.png +0 -0
- data/app/assets/images/flags/am.png +0 -0
- data/app/assets/images/flags/an.png +0 -0
- data/app/assets/images/flags/ao.png +0 -0
- data/app/assets/images/flags/ar.png +0 -0
- data/app/assets/images/flags/as.png +0 -0
- data/app/assets/images/flags/at.png +0 -0
- data/app/assets/images/flags/au.png +0 -0
- data/app/assets/images/flags/aw.png +0 -0
- data/app/assets/images/flags/ax.png +0 -0
- data/app/assets/images/flags/az.png +0 -0
- data/app/assets/images/flags/ba.png +0 -0
- data/app/assets/images/flags/bb.png +0 -0
- data/app/assets/images/flags/bd.png +0 -0
- data/app/assets/images/flags/be.png +0 -0
- data/app/assets/images/flags/bf.png +0 -0
- data/app/assets/images/flags/bg.png +0 -0
- data/app/assets/images/flags/bh.png +0 -0
- data/app/assets/images/flags/bi.png +0 -0
- data/app/assets/images/flags/bj.png +0 -0
- data/app/assets/images/flags/bm.png +0 -0
- data/app/assets/images/flags/bn.png +0 -0
- data/app/assets/images/flags/bo.png +0 -0
- data/app/assets/images/flags/br.png +0 -0
- data/app/assets/images/flags/bs.png +0 -0
- data/app/assets/images/flags/bt.png +0 -0
- data/app/assets/images/flags/bv.png +0 -0
- data/app/assets/images/flags/bw.png +0 -0
- data/app/assets/images/flags/by.png +0 -0
- data/app/assets/images/flags/bz.png +0 -0
- data/app/assets/images/flags/ca.png +0 -0
- data/app/assets/images/flags/cc.png +0 -0
- data/app/assets/images/flags/cd.png +0 -0
- data/app/assets/images/flags/cf.png +0 -0
- data/app/assets/images/flags/cg.png +0 -0
- data/app/assets/images/flags/ch.png +0 -0
- data/app/assets/images/flags/ci.png +0 -0
- data/app/assets/images/flags/ck.png +0 -0
- data/app/assets/images/flags/cl.png +0 -0
- data/app/assets/images/flags/cm.png +0 -0
- data/app/assets/images/flags/cn.png +0 -0
- data/app/assets/images/flags/co.png +0 -0
- data/app/assets/images/flags/cr.png +0 -0
- data/app/assets/images/flags/cs.png +0 -0
- data/app/assets/images/flags/cu.png +0 -0
- data/app/assets/images/flags/cv.png +0 -0
- data/app/assets/images/flags/cx.png +0 -0
- data/app/assets/images/flags/cy.png +0 -0
- data/app/assets/images/flags/cz.png +0 -0
- data/app/assets/images/flags/de.png +0 -0
- data/app/assets/images/flags/dj.png +0 -0
- data/app/assets/images/flags/dk.png +0 -0
- data/app/assets/images/flags/dm.png +0 -0
- data/app/assets/images/flags/do.png +0 -0
- data/app/assets/images/flags/dz.png +0 -0
- data/app/assets/images/flags/ec.png +0 -0
- data/app/assets/images/flags/ee.png +0 -0
- data/app/assets/images/flags/eg.png +0 -0
- data/app/assets/images/flags/eh.png +0 -0
- data/app/assets/images/flags/en.png +0 -0
- data/app/assets/images/flags/er.png +0 -0
- data/app/assets/images/flags/es.png +0 -0
- data/app/assets/images/flags/et.png +0 -0
- data/app/assets/images/flags/fam.png +0 -0
- data/app/assets/images/flags/fi.png +0 -0
- data/app/assets/images/flags/fj.png +0 -0
- data/app/assets/images/flags/fk.png +0 -0
- data/app/assets/images/flags/fm.png +0 -0
- data/app/assets/images/flags/fo.png +0 -0
- data/app/assets/images/flags/fr.png +0 -0
- data/app/assets/images/flags/ga.png +0 -0
- data/app/assets/images/flags/gb.png +0 -0
- data/app/assets/images/flags/gd.png +0 -0
- data/app/assets/images/flags/ge.png +0 -0
- data/app/assets/images/flags/gh.png +0 -0
- data/app/assets/images/flags/gi.png +0 -0
- data/app/assets/images/flags/gl.png +0 -0
- data/app/assets/images/flags/gm.png +0 -0
- data/app/assets/images/flags/gn.png +0 -0
- data/app/assets/images/flags/gp.png +0 -0
- data/app/assets/images/flags/gq.png +0 -0
- data/app/assets/images/flags/gr.png +0 -0
- data/app/assets/images/flags/gs.png +0 -0
- data/app/assets/images/flags/gt.png +0 -0
- data/app/assets/images/flags/gu.png +0 -0
- data/app/assets/images/flags/gw.png +0 -0
- data/app/assets/images/flags/gy.png +0 -0
- data/app/assets/images/flags/hk.png +0 -0
- data/app/assets/images/flags/hn.png +0 -0
- data/app/assets/images/flags/hr.png +0 -0
- data/app/assets/images/flags/ht.png +0 -0
- data/app/assets/images/flags/hu.png +0 -0
- data/app/assets/images/flags/id.png +0 -0
- data/app/assets/images/flags/ie.png +0 -0
- data/app/assets/images/flags/il.png +0 -0
- data/app/assets/images/flags/in.png +0 -0
- data/app/assets/images/flags/io.png +0 -0
- data/app/assets/images/flags/iq.png +0 -0
- data/app/assets/images/flags/ir.png +0 -0
- data/app/assets/images/flags/is.png +0 -0
- data/app/assets/images/flags/it.png +0 -0
- data/app/assets/images/flags/jm.png +0 -0
- data/app/assets/images/flags/jo.png +0 -0
- data/app/assets/images/flags/jp.png +0 -0
- data/app/assets/images/flags/ke.png +0 -0
- data/app/assets/images/flags/kg.png +0 -0
- data/app/assets/images/flags/kh.png +0 -0
- data/app/assets/images/flags/ki.png +0 -0
- data/app/assets/images/flags/km.png +0 -0
- data/app/assets/images/flags/kn.png +0 -0
- data/app/assets/images/flags/kp.png +0 -0
- data/app/assets/images/flags/kr.png +0 -0
- data/app/assets/images/flags/kw.png +0 -0
- data/app/assets/images/flags/ky.png +0 -0
- data/app/assets/images/flags/kz.png +0 -0
- data/app/assets/images/flags/la.png +0 -0
- data/app/assets/images/flags/lb.png +0 -0
- data/app/assets/images/flags/lc.png +0 -0
- data/app/assets/images/flags/li.png +0 -0
- data/app/assets/images/flags/lk.png +0 -0
- data/app/assets/images/flags/lr.png +0 -0
- data/app/assets/images/flags/ls.png +0 -0
- data/app/assets/images/flags/lt.png +0 -0
- data/app/assets/images/flags/lu.png +0 -0
- data/app/assets/images/flags/lv.png +0 -0
- data/app/assets/images/flags/ly.png +0 -0
- data/app/assets/images/flags/ma.png +0 -0
- data/app/assets/images/flags/mc.png +0 -0
- data/app/assets/images/flags/md.png +0 -0
- data/app/assets/images/flags/mg.png +0 -0
- data/app/assets/images/flags/mh.png +0 -0
- data/app/assets/images/flags/mk.png +0 -0
- data/app/assets/images/flags/ml.png +0 -0
- data/app/assets/images/flags/mm.png +0 -0
- data/app/assets/images/flags/mn.png +0 -0
- data/app/assets/images/flags/mo.png +0 -0
- data/app/assets/images/flags/mp.png +0 -0
- data/app/assets/images/flags/mq.png +0 -0
- data/app/assets/images/flags/mr.png +0 -0
- data/app/assets/images/flags/ms.png +0 -0
- data/app/assets/images/flags/mt.png +0 -0
- data/app/assets/images/flags/mu.png +0 -0
- data/app/assets/images/flags/mv.png +0 -0
- data/app/assets/images/flags/mw.png +0 -0
- data/app/assets/images/flags/mx.png +0 -0
- data/app/assets/images/flags/my.png +0 -0
- data/app/assets/images/flags/mz.png +0 -0
- data/app/assets/images/flags/na.png +0 -0
- data/app/assets/images/flags/nc.png +0 -0
- data/app/assets/images/flags/ne.png +0 -0
- data/app/assets/images/flags/nf.png +0 -0
- data/app/assets/images/flags/ng.png +0 -0
- data/app/assets/images/flags/ni.png +0 -0
- data/app/assets/images/flags/nl.png +0 -0
- data/app/assets/images/flags/no.png +0 -0
- data/app/assets/images/flags/np.png +0 -0
- data/app/assets/images/flags/nr.png +0 -0
- data/app/assets/images/flags/nu.png +0 -0
- data/app/assets/images/flags/nz.png +0 -0
- data/app/assets/images/flags/om.png +0 -0
- data/app/assets/images/flags/pa.png +0 -0
- data/app/assets/images/flags/pe.png +0 -0
- data/app/assets/images/flags/pf.png +0 -0
- data/app/assets/images/flags/pg.png +0 -0
- data/app/assets/images/flags/ph.png +0 -0
- data/app/assets/images/flags/pk.png +0 -0
- data/app/assets/images/flags/pl.png +0 -0
- data/app/assets/images/flags/pm.png +0 -0
- data/app/assets/images/flags/pn.png +0 -0
- data/app/assets/images/flags/pr.png +0 -0
- data/app/assets/images/flags/ps.png +0 -0
- data/app/assets/images/flags/pt.png +0 -0
- data/app/assets/images/flags/pw.png +0 -0
- data/app/assets/images/flags/py.png +0 -0
- data/app/assets/images/flags/qa.png +0 -0
- data/app/assets/images/flags/ro.png +0 -0
- data/app/assets/images/flags/ru.png +0 -0
- data/app/assets/images/flags/rw.png +0 -0
- data/app/assets/images/flags/sa.png +0 -0
- data/app/assets/images/flags/sb.png +0 -0
- data/app/assets/images/flags/sc.png +0 -0
- data/app/assets/images/flags/sd.png +0 -0
- data/app/assets/images/flags/se.png +0 -0
- data/app/assets/images/flags/sg.png +0 -0
- data/app/assets/images/flags/sh.png +0 -0
- data/app/assets/images/flags/si.png +0 -0
- data/app/assets/images/flags/sk.png +0 -0
- data/app/assets/images/flags/sl.png +0 -0
- data/app/assets/images/flags/sm.png +0 -0
- data/app/assets/images/flags/sn.png +0 -0
- data/app/assets/images/flags/so.png +0 -0
- data/app/assets/images/flags/sr.png +0 -0
- data/app/assets/images/flags/st.png +0 -0
- data/app/assets/images/flags/sv.png +0 -0
- data/app/assets/images/flags/sy.png +0 -0
- data/app/assets/images/flags/sz.png +0 -0
- data/app/assets/images/flags/tc.png +0 -0
- data/app/assets/images/flags/td.png +0 -0
- data/app/assets/images/flags/tf.png +0 -0
- data/app/assets/images/flags/tg.png +0 -0
- data/app/assets/images/flags/th.png +0 -0
- data/app/assets/images/flags/tj.png +0 -0
- data/app/assets/images/flags/tk.png +0 -0
- data/app/assets/images/flags/tl.png +0 -0
- data/app/assets/images/flags/tm.png +0 -0
- data/app/assets/images/flags/tn.png +0 -0
- data/app/assets/images/flags/to.png +0 -0
- data/app/assets/images/flags/tr.png +0 -0
- data/app/assets/images/flags/tt.png +0 -0
- data/app/assets/images/flags/tv.png +0 -0
- data/app/assets/images/flags/tw.png +0 -0
- data/app/assets/images/flags/tz.png +0 -0
- data/app/assets/images/flags/ua.png +0 -0
- data/app/assets/images/flags/ug.png +0 -0
- data/app/assets/images/flags/um.png +0 -0
- data/app/assets/images/flags/us.png +0 -0
- data/app/assets/images/flags/uy.png +0 -0
- data/app/assets/images/flags/uz.png +0 -0
- data/app/assets/images/flags/va.png +0 -0
- data/app/assets/images/flags/vc.png +0 -0
- data/app/assets/images/flags/ve.png +0 -0
- data/app/assets/images/flags/vg.png +0 -0
- data/app/assets/images/flags/vi.png +0 -0
- data/app/assets/images/flags/vn.png +0 -0
- data/app/assets/images/flags/vu.png +0 -0
- data/app/assets/images/flags/wales.png +0 -0
- data/app/assets/images/flags/wf.png +0 -0
- data/app/assets/images/flags/ws.png +0 -0
- data/app/assets/images/flags/ye.png +0 -0
- data/app/assets/images/flags/yt.png +0 -0
- data/app/assets/images/flags/za.png +0 -0
- data/app/assets/images/flags/zm.png +0 -0
- data/app/assets/images/flags/zw.png +0 -0
- data/app/assets/stylesheets/localizer_rails/localizer_rails.css.scss +74 -0
- data/app/assets/stylesheets/localizer_rails.css +8 -0
- data/app/helpers/localizer_rails/localizer_rails_helper.rb +29 -0
- data/app/views/localizer_rails/_elements.html.erb +4 -0
- data/app/views/localizer_rails/_item.bootstrap.html.erb +18 -0
- data/app/views/localizer_rails/_item.html.erb +18 -0
- data/app/views/localizer_rails/_language_menu.html.erb +8 -0
- data/config/localizer_rails/lang_countries.yml +1018 -0
- data/lib/generators/localizer_rails/localizer_rails_generator.rb +119 -0
- data/lib/generators/localizer_rails/templates/_header.html.erb +33 -0
- data/lib/generators/localizer_rails/templates/kaminari_action_view_extension.rb +30 -0
- data/lib/generators/localizer_rails/templates/localizer_rails_prefs.rb +22 -0
- data/lib/localizer_rails/engine.rb +15 -0
- data/lib/localizer_rails/set_locale.rb +9 -0
- data/lib/localizer_rails/version.rb +3 -0
- data/lib/localizer_rails.rb +126 -0
- data/lib/tasks/localizer_tasks.rake +4 -0
- metadata +331 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
class LocalizerRails::LocalizerRailsGenerator < Rails::Generators::Base
|
|
2
|
+
|
|
3
|
+
def init
|
|
4
|
+
## INSTALL ALL IF NO OPTION SELECTED
|
|
5
|
+
@has_options = options.any? { |k, v|
|
|
6
|
+
!!v
|
|
7
|
+
}
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
source_root File.expand_path(LocalizerRails::Engine.root, __FILE__)
|
|
11
|
+
|
|
12
|
+
class_option :views, :type => :boolean, :default => false, :aliases => "-v", :desc => "[views] Install partials to override the default language dropdown-menu output."
|
|
13
|
+
class_option :routes, :type => :boolean, :default => false, :aliases => "-r", :desc => "[routes] Append (commented hint) code in your route.rb to match *paths without prepended locale."
|
|
14
|
+
class_option :config, :type => :boolean, :default => false, :aliases => "-c", :desc => "[config] Install preference file to change settings for LocalizerRails."
|
|
15
|
+
class_option :map, :type => :boolean, :default => false, :aliases => "-m", :desc => "[maps] Install the language-country map .yml to edit the translations."
|
|
16
|
+
class_option :nav, :type => :boolean, :default => false, :aliases => "-n", :desc => "[navigation] Install the bootstrap navbar partial (requires bootstrap gem)."
|
|
17
|
+
class_option :kam, :type => :boolean, :default => false, :aliases => "-k", :desc => "[pagination] Install Kaminari (v0.16.3) pluralization patch."
|
|
18
|
+
|
|
19
|
+
def self.banner
|
|
20
|
+
"rails generate localizer_rails"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def manifest
|
|
24
|
+
|
|
25
|
+
## == VIEWS
|
|
26
|
+
if options[:views] || !@has_options
|
|
27
|
+
copy_file File.join( *%w( app views localizer_rails _item.html.erb ) ), ( Rails.root.join( *%w( app views localizer_rails _item.html.erb ) ) )
|
|
28
|
+
copy_file File.join( *%w( app views localizer_rails _item.bootstrap.html.erb ) ), ( Rails.root.join( *%w( app views localizer_rails _item.bootstrap.html.erb ) ) )
|
|
29
|
+
copy_file File.join( *%w( app views localizer_rails _elements.html.erb ) ), ( Rails.root.join( *%w( app views localizer_rails _elements.html.erb ) ) )
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
## == PREFERENCES
|
|
33
|
+
if options[:config] || !@has_options
|
|
34
|
+
copy_file File.join(*%w( lib generators localizer_rails templates localizer_rails_prefs.rb )), (Rails.root.join(*%w( config initializers localizer_rails localizer_rails_prefs.rb )))
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
## == Language-Country map
|
|
38
|
+
if options[:map] || @all
|
|
39
|
+
copy_file File.join(*%w( config localizer_rails lang_countries.yml )), (Rails.root.join(*%w( config localizer_rails lang_countries.yml )))
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
## == [HANDY] Kaminari pluralization patch (as of v0.16.3)
|
|
43
|
+
if options[:kam] || !@has_options
|
|
44
|
+
copy_file File.join(*%w( lib generators localizer_rails templates kaminari_action_view_extension.rb )), (Rails.root.join(*%w( config initializers kaminari_action_view_extension.rb )))
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
## == [HANDY] Bootstrap 3+ NAVBAR partial
|
|
48
|
+
if options[:nav] || !@has_options
|
|
49
|
+
copy_file File.join(*%w( lib generators localizer_rails templates _header.html.erb )), (Rails.root.join(*%w( app views layouts _header.html.erb )))
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
## == ROUTES
|
|
53
|
+
if options[:routes] || !@has_options
|
|
54
|
+
append_to_file Rails.root.join(*%w( config routes.rb )) do |a|
|
|
55
|
+
%q{
|
|
56
|
+
__END__
|
|
57
|
+
## --- LocalizerRails routes and match-alls
|
|
58
|
+
|
|
59
|
+
## (1) move inside your 'locale' scope to create the routes to your custom error pages:
|
|
60
|
+
## NOTES:
|
|
61
|
+
# forget about the system error 500, your app might be too broken to handle it
|
|
62
|
+
|
|
63
|
+
# Rails.application.routes.draw do
|
|
64
|
+
scope ":locale", :locale => /#{LocalizerRails.active_locales.join("|")}/ do
|
|
65
|
+
# ...
|
|
66
|
+
%w( 404 ).each do |code|
|
|
67
|
+
get code, :to => "errors#show", :code => code, :as => "error_#{code}"
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
## (2) move after your 'locale' scope if you need match-all routes prepending missing locale
|
|
71
|
+
## NOTES:
|
|
72
|
+
# - for TESTING POURPOSES in development, REMEMBER to CHANGE this value in config/environments/development
|
|
73
|
+
# config.consider_all_requests_local = true
|
|
74
|
+
# to:
|
|
75
|
+
# config.consider_all_requests_local = false
|
|
76
|
+
# => full error reports are disabled, and Rails treats all requests as in production
|
|
77
|
+
|
|
78
|
+
match '*path', :to => redirect { |p, req|
|
|
79
|
+
LocalizerRails.set_locale(req)
|
|
80
|
+
|
|
81
|
+
case
|
|
82
|
+
when LocalizerRails.active_locales.none? { |word| req.path.starts_with?("/#{word}/") }
|
|
83
|
+
## TRY prepending the locale
|
|
84
|
+
"/#{I18n.locale}#{req.path}"
|
|
85
|
+
when Rails.env.production? || !Rails.application.config.consider_all_requests_local
|
|
86
|
+
## SHOW custom 404
|
|
87
|
+
Rails.application.routes.url_helpers.error_404_path(:locale => I18n.locale)
|
|
88
|
+
else
|
|
89
|
+
## let Rails handle this with default 404
|
|
90
|
+
raise ActionController::RoutingError.new('Not Found')
|
|
91
|
+
end
|
|
92
|
+
},
|
|
93
|
+
:via => [ :get, :post, :patch, :delete ],
|
|
94
|
+
:status => '301'
|
|
95
|
+
|
|
96
|
+
match '', :to => redirect { |p, req| LocalizerRails.set_locale(req) },
|
|
97
|
+
:via => [:get, :post, :patch, :delete],
|
|
98
|
+
:status => '301'
|
|
99
|
+
}
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def show_setup_message
|
|
105
|
+
puts %q{
|
|
106
|
+
Setup done!
|
|
107
|
+
|
|
108
|
+
REMEMBER: if you want to test the redirection to your custom pages CHANGE the value in config/environments/development to FALSE:
|
|
109
|
+
config.consider_all_requests_local = false
|
|
110
|
+
and then change it back when you're done testing.
|
|
111
|
+
|
|
112
|
+
REMEMBER to IMPORT/REQUIRE the engine's stylesheet
|
|
113
|
+
@import 'localizer_rails/localizer_rails';
|
|
114
|
+
OR
|
|
115
|
+
require localizer_rails
|
|
116
|
+
}
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<nav class="navbar navbar-inverse navbar-fixed-top">
|
|
2
|
+
<div class="container-fluid">
|
|
3
|
+
<div class="navbar-header">
|
|
4
|
+
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar_collapse">
|
|
5
|
+
<span class="sr-only">Toggle navigation</span>
|
|
6
|
+
<span class="icon-bar"></span>
|
|
7
|
+
<span class="icon-bar"></span>
|
|
8
|
+
<span class="icon-bar"></span>
|
|
9
|
+
</button>
|
|
10
|
+
<a class="navbar-brand" href="#">My Site</a>
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
<div class="collapse navbar-collapse" id="navbar_collapse">
|
|
14
|
+
<ul class="nav navbar-nav">
|
|
15
|
+
<li class="<%= current_page?(root_path) ? 'active' : nil %>"><%= link_to "Home", root_path %></li>
|
|
16
|
+
<li class="<%= current_page?(page_path) ? 'active' : nil %>"><%= link_to "Page", page_path %></li>
|
|
17
|
+
</ul>
|
|
18
|
+
<ul class="nav navbar-nav navbar-right">
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
<li class="dropdown">
|
|
22
|
+
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
|
|
23
|
+
Language <b class="caret"></b>
|
|
24
|
+
</a>
|
|
25
|
+
<ul class="dropdown-menu locale_menu scroll-menu" role="menu">
|
|
26
|
+
<%= render 'localizer_rails/language_menu' %>
|
|
27
|
+
</ul>
|
|
28
|
+
</li>
|
|
29
|
+
|
|
30
|
+
</ul>
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
</nav>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
## ADD to the Gemfile:
|
|
2
|
+
## add the kaminari pagination (https://github.com/amatsuda/kaminari)
|
|
3
|
+
# gem 'kaminari', '~> 0.16'
|
|
4
|
+
## add the kaminari translations (https://github.com/tigrish/kaminari-i18n)
|
|
5
|
+
# gem 'kaminari-i18n'
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
## OVERRIDE KAMINARI METHOD to use Rails CLDR (Common Locale Data Repository) pluralization translations
|
|
9
|
+
require 'kaminari/helpers/action_view_extension.rb'
|
|
10
|
+
module Kaminari
|
|
11
|
+
module ActionViewExtension
|
|
12
|
+
|
|
13
|
+
def page_entries_info(collection, options = {})
|
|
14
|
+
## from a post by https://github.com/Linuus in https://github.com/amatsuda/kaminari/pull/309
|
|
15
|
+
#- entry_name = options[:entry_name] || collection.entry_name
|
|
16
|
+
#- entry_name = entry_name.pluralize unless collection.total_count == 1
|
|
17
|
+
#+ entry_name = collection.model_name.human(:count => collection.total_count, :default => collection.model_name.human.pluralize).downcase
|
|
18
|
+
entry_name = collection.model_name.human(:count => collection.total_count, :default => collection.model_name.human.pluralize).downcase
|
|
19
|
+
|
|
20
|
+
if collection.total_pages < 2
|
|
21
|
+
t('helpers.page_entries_info.one_page.display_entries', :entry_name => entry_name, :count => collection.total_count)
|
|
22
|
+
else
|
|
23
|
+
first = collection.offset_value + 1
|
|
24
|
+
last = collection.last_page? ? collection.total_count : collection.offset_value + collection.limit_value
|
|
25
|
+
t('helpers.page_entries_info.more_pages.display_entries', :entry_name => entry_name, :first => first, :last => last, :total => collection.total_count)
|
|
26
|
+
end.html_safe
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
## CUSTOM CONFIGURATION:
|
|
2
|
+
## install/copy this file to
|
|
3
|
+
# config/initializers/localizer_rails/
|
|
4
|
+
# and uncomment/edit the values you want to customize.
|
|
5
|
+
|
|
6
|
+
LocalizerRails::Conf.configure do |conf|
|
|
7
|
+
# conf.merge_lang_countries_tables = true
|
|
8
|
+
# conf.all_available_locales = true
|
|
9
|
+
# conf.active_locales = [ :en,
|
|
10
|
+
# :'en-GB'
|
|
11
|
+
# ]
|
|
12
|
+
# conf.country_downcase = false
|
|
13
|
+
## DISPLAY LANGUAGE IN ITS OWN IDIOM?
|
|
14
|
+
# conf.display_local_language = false
|
|
15
|
+
## LOCALE_MENU STYLE
|
|
16
|
+
# conf.use_bootstrap = false
|
|
17
|
+
## COOKIES
|
|
18
|
+
# conf.cookie_expires = nil # ( = session )(default)
|
|
19
|
+
# conf.cookie_expires = 20.year.from_now.utc # ( = cookies.permanent )
|
|
20
|
+
## SESSION
|
|
21
|
+
# conf.store_in_session = false
|
|
22
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
require "localizer_rails/version"
|
|
2
|
+
|
|
3
|
+
module LocalizerRails
|
|
4
|
+
class Engine < ::Rails::Engine
|
|
5
|
+
isolate_namespace LocalizerRails
|
|
6
|
+
|
|
7
|
+
## LOAD HELPER
|
|
8
|
+
initializer 'localizer_rails.action_controller' do |app|
|
|
9
|
+
ActiveSupport.on_load :action_controller do
|
|
10
|
+
# helper LocalizerRails::LocalizerRailsHelper
|
|
11
|
+
helper LocalizerRails::Engine.helpers
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
require "localizer_rails/engine"
|
|
2
|
+
require "localizer_rails/set_locale"
|
|
3
|
+
|
|
4
|
+
module LocalizerRails
|
|
5
|
+
extend self
|
|
6
|
+
|
|
7
|
+
##================== CONFIGURATION DEFAULT SETTINGS & USER PREFS
|
|
8
|
+
|
|
9
|
+
Conf = OpenStruct.new :merge_lang_countries_tables => true,
|
|
10
|
+
:all_available_locales => true,
|
|
11
|
+
:active_locales => [ I18n.default_locale ],
|
|
12
|
+
:country_downcase => false,
|
|
13
|
+
:display_local_language => false,
|
|
14
|
+
:use_bootstrap => false,
|
|
15
|
+
:cookie_expires => nil,
|
|
16
|
+
:store_in_session => false
|
|
17
|
+
|
|
18
|
+
def Conf.configure(*, &block)
|
|
19
|
+
block.call self
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Allows LocalizerRails.method instead of LocalizerRails::Conf.method
|
|
23
|
+
def method_missing(meth, *args, &block)
|
|
24
|
+
Conf.respond_to?(meth) ? Conf.send(meth, *args, &block) : super
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
##==============================================================
|
|
28
|
+
|
|
29
|
+
## DEFINE WHICH LOCALES SHOULD BE AVAILABLE TO THE APPLICATION:
|
|
30
|
+
def active_locales
|
|
31
|
+
@active_locales_temp ||= begin
|
|
32
|
+
if Conf.all_available_locales.blank?
|
|
33
|
+
I18n.available_locales & Conf.active_locales
|
|
34
|
+
else
|
|
35
|
+
I18n.available_locales
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
## FIND BEST-MATCH LOCALE:
|
|
41
|
+
def set_locale(req)
|
|
42
|
+
I18n.locale = req.params[:locale] ||
|
|
43
|
+
req.send(:cookies)['locale'] ||
|
|
44
|
+
(req.current_user.locale if (!!(defined? req.current_user.locale))) ||
|
|
45
|
+
req.session[:locale] ||
|
|
46
|
+
accepted_locales(req.env['HTTP_ACCEPT_LANGUAGE']) ||
|
|
47
|
+
I18n.default_locale
|
|
48
|
+
## FALLBACK IF INVALID DATA IN COOKIES, ...
|
|
49
|
+
I18n.locale = I18n.default_locale unless active_locales.include?(I18n.locale)
|
|
50
|
+
## SET COOKIE:
|
|
51
|
+
req.send(:cookies)[:locale] = { :value => I18n.locale,
|
|
52
|
+
:expires => Conf.cookie_expires
|
|
53
|
+
}
|
|
54
|
+
## SET SESSION:
|
|
55
|
+
req.send(:session)[:locale] = I18n.locale unless Conf.store_in_session.blank?
|
|
56
|
+
## LOCALIZE LINKS
|
|
57
|
+
Rails.application.routes.default_url_options[:locale] = I18n.locale
|
|
58
|
+
|
|
59
|
+
## RETURN LOCALE:
|
|
60
|
+
I18n.locale
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
PATH_TO_LANG = %w[ config localizer_rails lang_countries.yml ]
|
|
64
|
+
|
|
65
|
+
## BUILD LOCALE MAP:
|
|
66
|
+
def active_locales_map
|
|
67
|
+
@my_locales_ok ||= begin
|
|
68
|
+
custom_file_path = Rails.root.join(*PATH_TO_LANG)
|
|
69
|
+
loc_map = if File.exist?(custom_file_path)
|
|
70
|
+
if Conf.merge_lang_countries_tables
|
|
71
|
+
lang_file(Engine).merge(lang_file(Rails))
|
|
72
|
+
else
|
|
73
|
+
lang_file(Rails)
|
|
74
|
+
end
|
|
75
|
+
else
|
|
76
|
+
lang_file(Engine)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
my_locales_temp = {}
|
|
80
|
+
|
|
81
|
+
if Conf.all_available_locales.blank?
|
|
82
|
+
active_locales.each do |k|
|
|
83
|
+
next unless I18n.available_locales.include?(k) && loc_map.key?(k)
|
|
84
|
+
my_locales_temp[k] = loc_map[k]
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
else
|
|
88
|
+
I18n.available_locales.each do |k|
|
|
89
|
+
next unless loc_map.key?(k)
|
|
90
|
+
my_locales_temp[k] = loc_map[k]
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
my_locales_temp
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
private
|
|
98
|
+
|
|
99
|
+
def lang_file(what)
|
|
100
|
+
YAML.load( File.read(what.root.join(*PATH_TO_LANG)) )
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
## FIND HTTP_ACCEPT_LANGUAGE best-match locale
|
|
104
|
+
def accepted_locales(http_accept_language)
|
|
105
|
+
return false if http_accept_language.blank?
|
|
106
|
+
|
|
107
|
+
langs = http_accept_language.scan(/([a-zA-Z]{2,4})(?:(-[a-zA-Z]{2}))?(?:;q=(1|0?\.[0-9]{1,3}))?/).map do |pair|
|
|
108
|
+
|
|
109
|
+
lang, country, q = pair
|
|
110
|
+
|
|
111
|
+
ccase = Conf.country_downcase.blank? ? :upcase : :downcase
|
|
112
|
+
# try to create lang-country pair
|
|
113
|
+
lang_test = lang + country.try(ccase).to_s
|
|
114
|
+
|
|
115
|
+
# match against active locales and use pair if exist
|
|
116
|
+
lang = lang_test if active_locales_map.include?(lang_test.to_sym)
|
|
117
|
+
# add preference q=1.0 if missing
|
|
118
|
+
[lang.to_sym, (q || '1').to_f]
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# sort by preference
|
|
122
|
+
langs.sort_by { |lang, q| q }.map { |lang, q| lang }.reverse
|
|
123
|
+
# return first choice
|
|
124
|
+
langs.first[0]
|
|
125
|
+
end
|
|
126
|
+
end
|