gettext_i18n_rails_js 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ require 'gettext_i18n_rails'
2
+ require 'gettext_i18n_rails_js/engine'
3
+
4
+ module GettextI18nRailsJs
5
+ end
@@ -0,0 +1,9 @@
1
+ # We need a rails engine so that the asset pipeline knows there are assets
2
+ # provided by this gem
3
+ require 'rails'
4
+ module GettextI18nRailsJs
5
+ module Rails
6
+ class Engine < ::Rails::Engine
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,72 @@
1
+ require 'gettext/utils'
2
+ begin
3
+ require 'gettext/tools/rgettext'
4
+ rescue LoadError #version prior to 2.0
5
+ require 'gettext/rgettext'
6
+ end
7
+
8
+ module GettextI18nRailsJs
9
+ class JsAndCoffeeParser
10
+
11
+ class << self
12
+ # The gettext function name can be configured at the module level as js_gettext_function
13
+ # This is to provide a way to avoid conflicts with other javascript libraries.
14
+ # You only need to define the base function name to replace '_' and all the
15
+ # other variants (s_, n_, N_) will be deduced automatically.
16
+ attr_accessor :js_gettext_function
17
+ end
18
+ self.js_gettext_function = '__'
19
+
20
+ def self.target?(file)
21
+ ['.js', '.coffee'].include?(File.extname(file))
22
+ end
23
+
24
+ # We're lazy and klumsy, so this is a regex based parser that looks for
25
+ # invocations of the various gettext functions. Once captured, we
26
+ # scan them once again to fetch all the function arguments.
27
+ # Invoke regex captures like this:
28
+ # source: "#{ __('hello') } #{ __("wor)ld") }"
29
+ # matches:
30
+ # [0]: __('hello')
31
+ # [1]: __
32
+ # [2]: 'hello'
33
+ #
34
+ # source: __('item', 'items', 33)
35
+ # matches:
36
+ # [0]: __('item', 'items', 33)
37
+ # [1]: __
38
+ # [2]: 'item', 'items', 33
39
+ def self.parse(file, msgids = [])
40
+ _ = self.js_gettext_function
41
+
42
+ # We first parse full invocations
43
+ invoke_regex = /
44
+ (\b[snN]?#{_}) # Matches the function call grouping the method used (__, n__, N__, etc)
45
+ \( # and a parenthesis to start the arguments to the function.
46
+ (('.*?'| # Then a token inside the argument list, like a single quoted string
47
+ ".*?"| # ...Double quote string
48
+ [a-zA-Z0-9_\.()]*| # ...a number, variable name, or called function lik: 33, foo, Foo.bar()
49
+ [ ]| # ...a white space
50
+ ,) # ...or a comma, which separates all of the above.
51
+ *) # There may be many arguments to the same function call.
52
+ \) # function call closing parenthesis
53
+ /x
54
+
55
+ File.read(file).scan(invoke_regex).collect do |function, arguments|
56
+ separator = function == "n#{_}" ? "\000" : "\004"
57
+ key = arguments.scan(/('(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*")/)
58
+ .collect{|match| match.first[1..-2]}
59
+ .join(separator)
60
+ next if key == ''
61
+ key.gsub!("\n", '\n')
62
+ key.gsub!("\t", '\t')
63
+ key.gsub!("\0", '\0')
64
+
65
+ [key, "#{file}:1"]
66
+ end.compact
67
+ end
68
+
69
+ end
70
+ end
71
+
72
+ GetText::RGetText.add_parser(GettextI18nRailsJs::JsAndCoffeeParser)
@@ -0,0 +1,50 @@
1
+ namespace :gettext do
2
+ desc "Convert PO files to js files in app/assets/locales"
3
+ task :po_to_json => :environment do
4
+ require 'po_to_json'
5
+
6
+ GettextI18nRails::JsAndCoffeeParser.js_gettext_function = js_gettext_function
7
+
8
+ po_files = Dir["#{locale_path}/**/*.po"]
9
+ if po_files.empty?
10
+ puts "Could not find any PO files in #{locale_path}. Run 'rake gettext:find' first."
11
+ end
12
+
13
+ js_locales = File.join(Rails.root, 'app', 'assets', 'javascripts', 'locale')
14
+ FileUtils.makedirs(js_locales)
15
+
16
+ po_files.each do |po_file|
17
+ # Language is used for filenames, while language code is used
18
+ # as the in-app language code. So for instance, simplified chinese will
19
+ # live in app/assets/locale/zh_CN/app.js but inside the file the language
20
+ # will be referred to as locales['zh-CN']
21
+ # This is to adapt to the existing gettext_rails convention.
22
+ language = File.basename( File.dirname(po_file) )
23
+ language_code = language.gsub('_','-')
24
+
25
+ destination = File.join(js_locales, language)
26
+ json_string = PoToJson.new(po_file).generate_for_jed(language_code)
27
+
28
+ FileUtils.makedirs(destination)
29
+ File.open(File.join(destination, 'app.js'), 'w'){ |file| file.write(json_string) }
30
+
31
+ puts "Created app.js in #{destination}"
32
+ end
33
+ puts
34
+ puts "All files created, make sure they are being added to your assets file."
35
+ puts "If they are not, you can add them with this line:"
36
+ puts "//= require_tree ./locale"
37
+ puts
38
+ end
39
+
40
+ def files_to_translate
41
+ puts 'translate these files'
42
+ Dir.glob("{app,lib,config,#{locale_path}}/**/*.{rb,erb,haml,slim,js,coffee}")
43
+ end
44
+
45
+ # The parser will use this as the function basename when parsing translations.
46
+ def js_gettext_function
47
+ '__'
48
+ end
49
+ end
50
+
@@ -0,0 +1,3 @@
1
+ module GettextI18nRailsJs
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,4 @@
1
+ require_relative '../gettext_i18n_rails_js/js_and_coffee_parser'
2
+ require 'gettext_i18n_rails/tasks'
3
+ require_relative '../gettext_i18n_rails_js/tasks'
4
+
metadata ADDED
@@ -0,0 +1,114 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gettext_i18n_rails_js
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Nubis
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-08-20 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rails
16
+ requirement: &70361670650100 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 3.2.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70361670650100
25
+ - !ruby/object:Gem::Dependency
26
+ name: gettext
27
+ requirement: &70361670649680 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70361670649680
36
+ - !ruby/object:Gem::Dependency
37
+ name: gettext_i18n_rails
38
+ requirement: &70361670649220 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *70361670649220
47
+ - !ruby/object:Gem::Dependency
48
+ name: sqlite3
49
+ requirement: &70361670648800 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70361670648800
58
+ - !ruby/object:Gem::Dependency
59
+ name: rspec
60
+ requirement: &70361670648300 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ~>
64
+ - !ruby/object:Gem::Version
65
+ version: '2'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70361670648300
69
+ description: gettext_i18n_rails will find translations inside your .js and .coffee
70
+ files, then it will create JSON versions of your .PO files and will let you serve
71
+ them with the rest of your assets, thus letting you access all your translations
72
+ offline from client side javascript.
73
+ email: nubis@woobiz.com.ar
74
+ executables: []
75
+ extensions: []
76
+ extra_rdoc_files: []
77
+ files:
78
+ - lib/assets/javascripts/gettext/all.js
79
+ - lib/assets/javascripts/gettext/jed.js
80
+ - lib/gettext_i18n_rails_js/engine.rb
81
+ - lib/gettext_i18n_rails_js/js_and_coffee_parser.rb
82
+ - lib/gettext_i18n_rails_js/tasks.rb
83
+ - lib/gettext_i18n_rails_js/version.rb
84
+ - lib/gettext_i18n_rails_js.rb
85
+ - lib/tasks/gettext_i18n_rails_js_tasks.rake
86
+ - MIT-LICENSE
87
+ - Rakefile
88
+ - Readme.md
89
+ homepage: http://github.com/nubis/gettext_i18n_rails_js
90
+ licenses: []
91
+ post_install_message:
92
+ rdoc_options: []
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ none: false
97
+ requirements:
98
+ - - ! '>='
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ required_rubygems_version: !ruby/object:Gem::Requirement
102
+ none: false
103
+ requirements:
104
+ - - ! '>='
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ requirements: []
108
+ rubyforge_project:
109
+ rubygems_version: 1.8.15
110
+ signing_key:
111
+ specification_version: 3
112
+ summary: Extends gettext_i18n_rails making your .po files available to client side
113
+ javascript as JSON
114
+ test_files: []