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.
Files changed (260) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +191 -0
  4. data/Rakefile +34 -0
  5. data/app/assets/images/flags/ad.png +0 -0
  6. data/app/assets/images/flags/ae.png +0 -0
  7. data/app/assets/images/flags/af.png +0 -0
  8. data/app/assets/images/flags/ag.png +0 -0
  9. data/app/assets/images/flags/ai.png +0 -0
  10. data/app/assets/images/flags/al.png +0 -0
  11. data/app/assets/images/flags/am.png +0 -0
  12. data/app/assets/images/flags/an.png +0 -0
  13. data/app/assets/images/flags/ao.png +0 -0
  14. data/app/assets/images/flags/ar.png +0 -0
  15. data/app/assets/images/flags/as.png +0 -0
  16. data/app/assets/images/flags/at.png +0 -0
  17. data/app/assets/images/flags/au.png +0 -0
  18. data/app/assets/images/flags/aw.png +0 -0
  19. data/app/assets/images/flags/ax.png +0 -0
  20. data/app/assets/images/flags/az.png +0 -0
  21. data/app/assets/images/flags/ba.png +0 -0
  22. data/app/assets/images/flags/bb.png +0 -0
  23. data/app/assets/images/flags/bd.png +0 -0
  24. data/app/assets/images/flags/be.png +0 -0
  25. data/app/assets/images/flags/bf.png +0 -0
  26. data/app/assets/images/flags/bg.png +0 -0
  27. data/app/assets/images/flags/bh.png +0 -0
  28. data/app/assets/images/flags/bi.png +0 -0
  29. data/app/assets/images/flags/bj.png +0 -0
  30. data/app/assets/images/flags/bm.png +0 -0
  31. data/app/assets/images/flags/bn.png +0 -0
  32. data/app/assets/images/flags/bo.png +0 -0
  33. data/app/assets/images/flags/br.png +0 -0
  34. data/app/assets/images/flags/bs.png +0 -0
  35. data/app/assets/images/flags/bt.png +0 -0
  36. data/app/assets/images/flags/bv.png +0 -0
  37. data/app/assets/images/flags/bw.png +0 -0
  38. data/app/assets/images/flags/by.png +0 -0
  39. data/app/assets/images/flags/bz.png +0 -0
  40. data/app/assets/images/flags/ca.png +0 -0
  41. data/app/assets/images/flags/cc.png +0 -0
  42. data/app/assets/images/flags/cd.png +0 -0
  43. data/app/assets/images/flags/cf.png +0 -0
  44. data/app/assets/images/flags/cg.png +0 -0
  45. data/app/assets/images/flags/ch.png +0 -0
  46. data/app/assets/images/flags/ci.png +0 -0
  47. data/app/assets/images/flags/ck.png +0 -0
  48. data/app/assets/images/flags/cl.png +0 -0
  49. data/app/assets/images/flags/cm.png +0 -0
  50. data/app/assets/images/flags/cn.png +0 -0
  51. data/app/assets/images/flags/co.png +0 -0
  52. data/app/assets/images/flags/cr.png +0 -0
  53. data/app/assets/images/flags/cs.png +0 -0
  54. data/app/assets/images/flags/cu.png +0 -0
  55. data/app/assets/images/flags/cv.png +0 -0
  56. data/app/assets/images/flags/cx.png +0 -0
  57. data/app/assets/images/flags/cy.png +0 -0
  58. data/app/assets/images/flags/cz.png +0 -0
  59. data/app/assets/images/flags/de.png +0 -0
  60. data/app/assets/images/flags/dj.png +0 -0
  61. data/app/assets/images/flags/dk.png +0 -0
  62. data/app/assets/images/flags/dm.png +0 -0
  63. data/app/assets/images/flags/do.png +0 -0
  64. data/app/assets/images/flags/dz.png +0 -0
  65. data/app/assets/images/flags/ec.png +0 -0
  66. data/app/assets/images/flags/ee.png +0 -0
  67. data/app/assets/images/flags/eg.png +0 -0
  68. data/app/assets/images/flags/eh.png +0 -0
  69. data/app/assets/images/flags/en.png +0 -0
  70. data/app/assets/images/flags/er.png +0 -0
  71. data/app/assets/images/flags/es.png +0 -0
  72. data/app/assets/images/flags/et.png +0 -0
  73. data/app/assets/images/flags/fam.png +0 -0
  74. data/app/assets/images/flags/fi.png +0 -0
  75. data/app/assets/images/flags/fj.png +0 -0
  76. data/app/assets/images/flags/fk.png +0 -0
  77. data/app/assets/images/flags/fm.png +0 -0
  78. data/app/assets/images/flags/fo.png +0 -0
  79. data/app/assets/images/flags/fr.png +0 -0
  80. data/app/assets/images/flags/ga.png +0 -0
  81. data/app/assets/images/flags/gb.png +0 -0
  82. data/app/assets/images/flags/gd.png +0 -0
  83. data/app/assets/images/flags/ge.png +0 -0
  84. data/app/assets/images/flags/gh.png +0 -0
  85. data/app/assets/images/flags/gi.png +0 -0
  86. data/app/assets/images/flags/gl.png +0 -0
  87. data/app/assets/images/flags/gm.png +0 -0
  88. data/app/assets/images/flags/gn.png +0 -0
  89. data/app/assets/images/flags/gp.png +0 -0
  90. data/app/assets/images/flags/gq.png +0 -0
  91. data/app/assets/images/flags/gr.png +0 -0
  92. data/app/assets/images/flags/gs.png +0 -0
  93. data/app/assets/images/flags/gt.png +0 -0
  94. data/app/assets/images/flags/gu.png +0 -0
  95. data/app/assets/images/flags/gw.png +0 -0
  96. data/app/assets/images/flags/gy.png +0 -0
  97. data/app/assets/images/flags/hk.png +0 -0
  98. data/app/assets/images/flags/hn.png +0 -0
  99. data/app/assets/images/flags/hr.png +0 -0
  100. data/app/assets/images/flags/ht.png +0 -0
  101. data/app/assets/images/flags/hu.png +0 -0
  102. data/app/assets/images/flags/id.png +0 -0
  103. data/app/assets/images/flags/ie.png +0 -0
  104. data/app/assets/images/flags/il.png +0 -0
  105. data/app/assets/images/flags/in.png +0 -0
  106. data/app/assets/images/flags/io.png +0 -0
  107. data/app/assets/images/flags/iq.png +0 -0
  108. data/app/assets/images/flags/ir.png +0 -0
  109. data/app/assets/images/flags/is.png +0 -0
  110. data/app/assets/images/flags/it.png +0 -0
  111. data/app/assets/images/flags/jm.png +0 -0
  112. data/app/assets/images/flags/jo.png +0 -0
  113. data/app/assets/images/flags/jp.png +0 -0
  114. data/app/assets/images/flags/ke.png +0 -0
  115. data/app/assets/images/flags/kg.png +0 -0
  116. data/app/assets/images/flags/kh.png +0 -0
  117. data/app/assets/images/flags/ki.png +0 -0
  118. data/app/assets/images/flags/km.png +0 -0
  119. data/app/assets/images/flags/kn.png +0 -0
  120. data/app/assets/images/flags/kp.png +0 -0
  121. data/app/assets/images/flags/kr.png +0 -0
  122. data/app/assets/images/flags/kw.png +0 -0
  123. data/app/assets/images/flags/ky.png +0 -0
  124. data/app/assets/images/flags/kz.png +0 -0
  125. data/app/assets/images/flags/la.png +0 -0
  126. data/app/assets/images/flags/lb.png +0 -0
  127. data/app/assets/images/flags/lc.png +0 -0
  128. data/app/assets/images/flags/li.png +0 -0
  129. data/app/assets/images/flags/lk.png +0 -0
  130. data/app/assets/images/flags/lr.png +0 -0
  131. data/app/assets/images/flags/ls.png +0 -0
  132. data/app/assets/images/flags/lt.png +0 -0
  133. data/app/assets/images/flags/lu.png +0 -0
  134. data/app/assets/images/flags/lv.png +0 -0
  135. data/app/assets/images/flags/ly.png +0 -0
  136. data/app/assets/images/flags/ma.png +0 -0
  137. data/app/assets/images/flags/mc.png +0 -0
  138. data/app/assets/images/flags/md.png +0 -0
  139. data/app/assets/images/flags/mg.png +0 -0
  140. data/app/assets/images/flags/mh.png +0 -0
  141. data/app/assets/images/flags/mk.png +0 -0
  142. data/app/assets/images/flags/ml.png +0 -0
  143. data/app/assets/images/flags/mm.png +0 -0
  144. data/app/assets/images/flags/mn.png +0 -0
  145. data/app/assets/images/flags/mo.png +0 -0
  146. data/app/assets/images/flags/mp.png +0 -0
  147. data/app/assets/images/flags/mq.png +0 -0
  148. data/app/assets/images/flags/mr.png +0 -0
  149. data/app/assets/images/flags/ms.png +0 -0
  150. data/app/assets/images/flags/mt.png +0 -0
  151. data/app/assets/images/flags/mu.png +0 -0
  152. data/app/assets/images/flags/mv.png +0 -0
  153. data/app/assets/images/flags/mw.png +0 -0
  154. data/app/assets/images/flags/mx.png +0 -0
  155. data/app/assets/images/flags/my.png +0 -0
  156. data/app/assets/images/flags/mz.png +0 -0
  157. data/app/assets/images/flags/na.png +0 -0
  158. data/app/assets/images/flags/nc.png +0 -0
  159. data/app/assets/images/flags/ne.png +0 -0
  160. data/app/assets/images/flags/nf.png +0 -0
  161. data/app/assets/images/flags/ng.png +0 -0
  162. data/app/assets/images/flags/ni.png +0 -0
  163. data/app/assets/images/flags/nl.png +0 -0
  164. data/app/assets/images/flags/no.png +0 -0
  165. data/app/assets/images/flags/np.png +0 -0
  166. data/app/assets/images/flags/nr.png +0 -0
  167. data/app/assets/images/flags/nu.png +0 -0
  168. data/app/assets/images/flags/nz.png +0 -0
  169. data/app/assets/images/flags/om.png +0 -0
  170. data/app/assets/images/flags/pa.png +0 -0
  171. data/app/assets/images/flags/pe.png +0 -0
  172. data/app/assets/images/flags/pf.png +0 -0
  173. data/app/assets/images/flags/pg.png +0 -0
  174. data/app/assets/images/flags/ph.png +0 -0
  175. data/app/assets/images/flags/pk.png +0 -0
  176. data/app/assets/images/flags/pl.png +0 -0
  177. data/app/assets/images/flags/pm.png +0 -0
  178. data/app/assets/images/flags/pn.png +0 -0
  179. data/app/assets/images/flags/pr.png +0 -0
  180. data/app/assets/images/flags/ps.png +0 -0
  181. data/app/assets/images/flags/pt.png +0 -0
  182. data/app/assets/images/flags/pw.png +0 -0
  183. data/app/assets/images/flags/py.png +0 -0
  184. data/app/assets/images/flags/qa.png +0 -0
  185. data/app/assets/images/flags/ro.png +0 -0
  186. data/app/assets/images/flags/ru.png +0 -0
  187. data/app/assets/images/flags/rw.png +0 -0
  188. data/app/assets/images/flags/sa.png +0 -0
  189. data/app/assets/images/flags/sb.png +0 -0
  190. data/app/assets/images/flags/sc.png +0 -0
  191. data/app/assets/images/flags/sd.png +0 -0
  192. data/app/assets/images/flags/se.png +0 -0
  193. data/app/assets/images/flags/sg.png +0 -0
  194. data/app/assets/images/flags/sh.png +0 -0
  195. data/app/assets/images/flags/si.png +0 -0
  196. data/app/assets/images/flags/sk.png +0 -0
  197. data/app/assets/images/flags/sl.png +0 -0
  198. data/app/assets/images/flags/sm.png +0 -0
  199. data/app/assets/images/flags/sn.png +0 -0
  200. data/app/assets/images/flags/so.png +0 -0
  201. data/app/assets/images/flags/sr.png +0 -0
  202. data/app/assets/images/flags/st.png +0 -0
  203. data/app/assets/images/flags/sv.png +0 -0
  204. data/app/assets/images/flags/sy.png +0 -0
  205. data/app/assets/images/flags/sz.png +0 -0
  206. data/app/assets/images/flags/tc.png +0 -0
  207. data/app/assets/images/flags/td.png +0 -0
  208. data/app/assets/images/flags/tf.png +0 -0
  209. data/app/assets/images/flags/tg.png +0 -0
  210. data/app/assets/images/flags/th.png +0 -0
  211. data/app/assets/images/flags/tj.png +0 -0
  212. data/app/assets/images/flags/tk.png +0 -0
  213. data/app/assets/images/flags/tl.png +0 -0
  214. data/app/assets/images/flags/tm.png +0 -0
  215. data/app/assets/images/flags/tn.png +0 -0
  216. data/app/assets/images/flags/to.png +0 -0
  217. data/app/assets/images/flags/tr.png +0 -0
  218. data/app/assets/images/flags/tt.png +0 -0
  219. data/app/assets/images/flags/tv.png +0 -0
  220. data/app/assets/images/flags/tw.png +0 -0
  221. data/app/assets/images/flags/tz.png +0 -0
  222. data/app/assets/images/flags/ua.png +0 -0
  223. data/app/assets/images/flags/ug.png +0 -0
  224. data/app/assets/images/flags/um.png +0 -0
  225. data/app/assets/images/flags/us.png +0 -0
  226. data/app/assets/images/flags/uy.png +0 -0
  227. data/app/assets/images/flags/uz.png +0 -0
  228. data/app/assets/images/flags/va.png +0 -0
  229. data/app/assets/images/flags/vc.png +0 -0
  230. data/app/assets/images/flags/ve.png +0 -0
  231. data/app/assets/images/flags/vg.png +0 -0
  232. data/app/assets/images/flags/vi.png +0 -0
  233. data/app/assets/images/flags/vn.png +0 -0
  234. data/app/assets/images/flags/vu.png +0 -0
  235. data/app/assets/images/flags/wales.png +0 -0
  236. data/app/assets/images/flags/wf.png +0 -0
  237. data/app/assets/images/flags/ws.png +0 -0
  238. data/app/assets/images/flags/ye.png +0 -0
  239. data/app/assets/images/flags/yt.png +0 -0
  240. data/app/assets/images/flags/za.png +0 -0
  241. data/app/assets/images/flags/zm.png +0 -0
  242. data/app/assets/images/flags/zw.png +0 -0
  243. data/app/assets/stylesheets/localizer_rails/localizer_rails.css.scss +74 -0
  244. data/app/assets/stylesheets/localizer_rails.css +8 -0
  245. data/app/helpers/localizer_rails/localizer_rails_helper.rb +29 -0
  246. data/app/views/localizer_rails/_elements.html.erb +4 -0
  247. data/app/views/localizer_rails/_item.bootstrap.html.erb +18 -0
  248. data/app/views/localizer_rails/_item.html.erb +18 -0
  249. data/app/views/localizer_rails/_language_menu.html.erb +8 -0
  250. data/config/localizer_rails/lang_countries.yml +1018 -0
  251. data/lib/generators/localizer_rails/localizer_rails_generator.rb +119 -0
  252. data/lib/generators/localizer_rails/templates/_header.html.erb +33 -0
  253. data/lib/generators/localizer_rails/templates/kaminari_action_view_extension.rb +30 -0
  254. data/lib/generators/localizer_rails/templates/localizer_rails_prefs.rb +22 -0
  255. data/lib/localizer_rails/engine.rb +15 -0
  256. data/lib/localizer_rails/set_locale.rb +9 -0
  257. data/lib/localizer_rails/version.rb +3 -0
  258. data/lib/localizer_rails.rb +126 -0
  259. data/lib/tasks/localizer_tasks.rake +4 -0
  260. 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,9 @@
1
+ module LocalizerRails
2
+ module SetLocale
3
+ extend self
4
+
5
+ def before(arg)
6
+ LocalizerRails.set_locale(arg)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ module LocalizerRails
2
+ VERSION = "0.1.0"
3
+ 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
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :localizer_rails do
3
+ # # Task goes here
4
+ # end