translation 0.7 → 0.8
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 +4 -4
- data/README.md +5 -5
- data/lib/translation.rb +4 -8
- data/lib/translation_io/client/base_operation.rb +4 -2
- data/lib/translation_io/client/base_operation/dump_haml_gettext_keys_step.rb +6 -13
- data/lib/translation_io/client/base_operation/dump_slim_gettext_keys_step.rb +7 -12
- data/lib/translation_io/client/init_operation.rb +13 -9
- data/lib/translation_io/client/init_operation/cleanup_yaml_files_step.rb +11 -9
- data/lib/translation_io/client/sync_operation.rb +13 -9
- data/lib/translation_io/config.rb +36 -0
- data/lib/translation_io/extractor.rb +22 -0
- data/lib/translation_io/yaml_conversion.rb +0 -41
- metadata +7 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fca22384fded316e68e7e9066f3c253846815ef1
|
4
|
+
data.tar.gz: eb4a3c2aea1cf607d8371fe0e0a3c41678be7803
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3787c5f789f6b09f368d987b4359ba1c1cf1e6eee7b15dc2497d5f3ef4488d8bbcff8e5a9d172184b88d2c9f021fbcc506519699bb582826f85fef16e58f5fef
|
7
|
+
data.tar.gz: fb65686fe5d214d89914b9f77fdf22712a8cdcfa8577b4ef9c4d79c32e3dfcebb582b442941cba979cb7306ad61ad893957811a295d2020f4dd288318e7c12d6
|
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
# gem for [
|
1
|
+
# Ruby/Rails gem for [Translation.io](http://translation.io).
|
2
2
|
|
3
3
|
## Description
|
4
4
|
|
5
|
-
Add this gem to your [Rails](http://rubyonrails.org) app to translate it with [
|
5
|
+
Add this gem to your [Rails](http://rubyonrails.org) app to translate it with [Translation.io](http://translation.io).
|
6
6
|
|
7
7
|
## Installation
|
8
8
|
|
@@ -21,7 +21,7 @@ And finish by inititalizing your translation project with :
|
|
21
21
|
|
22
22
|
## Synchronization
|
23
23
|
|
24
|
-
To get new translations from
|
24
|
+
To get new translations from Translation.io and to send new translatable strings, simply run :
|
25
25
|
|
26
26
|
bundle exec rake translation:sync
|
27
27
|
|
@@ -33,7 +33,7 @@ If you need to remove unused keys taking the current branch as reference :
|
|
33
33
|
|
34
34
|
Note that this operation will also perform a sync at the same time.
|
35
35
|
|
36
|
-
Warning : all keys that are not present in the current branch will be **permanently deleted both on
|
36
|
+
Warning : all keys that are not present in the current branch will be **permanently deleted both on Translation.io and in your app**.
|
37
37
|
|
38
38
|
## Tests
|
39
39
|
|
@@ -47,4 +47,4 @@ To run the specs :
|
|
47
47
|
The [translation gem](https://rubygems.org/gems/translation) in released under MIT license by [Aurélien Malisart](http://aurelien.malisart.be) and [Michaël Hoste](http://80limit.com) (see MIT-LICENSE
|
48
48
|
file).
|
49
49
|
|
50
|
-
(c) http://
|
50
|
+
(c) http://translation.io
|
data/lib/translation.rb
CHANGED
@@ -8,12 +8,11 @@ require 'gettext/text_domain_manager'
|
|
8
8
|
|
9
9
|
module TranslationIO
|
10
10
|
GETTEXT_METHODS = [
|
11
|
-
:
|
12
|
-
:
|
11
|
+
:nsgettext, :pgettext, :npgettext, :sgettext, :ngettext, :gettext,
|
12
|
+
:np_, :ns_, :Nn_, :n_, :p_, :s_, :N_, :_
|
13
13
|
]
|
14
14
|
|
15
|
-
TEXT_DOMAIN
|
16
|
-
SOURCE_FILES_PATTERN = '**/*.{rb,erb,html.erb,xml.erb}'
|
15
|
+
TEXT_DOMAIN = 'app'
|
17
16
|
end
|
18
17
|
|
19
18
|
require 'translation_io/config'
|
@@ -23,6 +22,7 @@ require 'translation_io/flat_hash'
|
|
23
22
|
require 'translation_io/yaml_conversion'
|
24
23
|
|
25
24
|
require 'translation_io/controller'
|
25
|
+
require 'translation_io/extractor'
|
26
26
|
|
27
27
|
module TranslationIO
|
28
28
|
module Proxy
|
@@ -54,10 +54,6 @@ module TranslationIO
|
|
54
54
|
return true
|
55
55
|
end
|
56
56
|
|
57
|
-
def pot_path
|
58
|
-
File.join(TranslationIO.config.locales_path, "#{TEXT_DOMAIN}.pot")
|
59
|
-
end
|
60
|
-
|
61
57
|
def info(message, level = 0, verbose_level = 0)
|
62
58
|
verbose = @config.try(:verbose) || 0
|
63
59
|
if verbose >= verbose_level
|
@@ -10,8 +10,6 @@ module TranslationIO
|
|
10
10
|
class BaseOperation
|
11
11
|
attr_accessor :client, :params
|
12
12
|
|
13
|
-
GETTEXT_ENTRY_RE = Regexp.new('(?:' + TranslationIO::GETTEXT_METHODS.join('|') + ')\(\[?(?:".+?"(?:\s*,\s*)?)+\]?(?:[^)]*)?\)')
|
14
|
-
|
15
13
|
def initialize(client, perform_real_requests = true)
|
16
14
|
@client = client
|
17
15
|
@params = {
|
@@ -45,6 +43,10 @@ module TranslationIO
|
|
45
43
|
$stderr.puts "[Error] Server not responding."
|
46
44
|
end
|
47
45
|
end
|
46
|
+
|
47
|
+
def cleanup
|
48
|
+
FileUtils.rm_rf(File.join('tmp', 'translation'))
|
49
|
+
end
|
48
50
|
end
|
49
51
|
end
|
50
52
|
end
|
@@ -7,11 +7,13 @@ module TranslationIO
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def run
|
10
|
-
if @haml_source_files.any?
|
10
|
+
if @haml_source_files.any?
|
11
11
|
TranslationIO.info "Extracting Gettext entries from HAML files."
|
12
12
|
|
13
|
-
|
14
|
-
|
13
|
+
FileUtils.mkdir_p(File.join('tmp', 'translation'))
|
14
|
+
|
15
|
+
extracted_gettext_entries.each_with_index do |entry, index|
|
16
|
+
File.open(File.join('tmp', 'translation', "haml-gettext-#{index.to_s.rjust(8,'0')}.rb"), 'w') do |file|
|
15
17
|
file.puts "#{entry}"
|
16
18
|
end
|
17
19
|
end
|
@@ -27,16 +29,7 @@ module TranslationIO
|
|
27
29
|
TranslationIO.info haml_file_path, 2, 2
|
28
30
|
|
29
31
|
haml_data = File.read(haml_file_path)
|
30
|
-
|
31
|
-
begin
|
32
|
-
ruby_data = Haml::Engine.new(haml_data).precompiled
|
33
|
-
|
34
|
-
ruby_data.scan(GETTEXT_ENTRY_RE).each do |entry|
|
35
|
-
entries << entry
|
36
|
-
end
|
37
|
-
rescue Haml::SyntaxError
|
38
|
-
TranslationIO.info "File cannot be parsed (SyntaxError): #{haml_file_path}", 1, 0
|
39
|
-
end
|
32
|
+
entries += TranslationIO::Extractor.extract(haml_data)
|
40
33
|
end
|
41
34
|
|
42
35
|
TranslationIO.info "#{entries.size} entries found", 2, 2
|
@@ -7,11 +7,13 @@ module TranslationIO
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def run
|
10
|
-
if @slim_source_files.any?
|
10
|
+
if @slim_source_files.any?
|
11
11
|
TranslationIO.info "Extracting Gettext entries from SLIM files."
|
12
12
|
|
13
|
-
|
14
|
-
|
13
|
+
FileUtils.mkdir_p(File.join('tmp', 'translation'))
|
14
|
+
|
15
|
+
extracted_gettext_entries.each_with_index do |entry, index|
|
16
|
+
File.open(File.join('tmp', 'translation', "slim-gettext-#{index.to_s.rjust(8,'0')}.rb"), 'w') do |file|
|
15
17
|
file.puts "#{entry}"
|
16
18
|
end
|
17
19
|
end
|
@@ -26,15 +28,8 @@ module TranslationIO
|
|
26
28
|
@slim_source_files.each do |slim_file_path|
|
27
29
|
TranslationIO.info slim_file_path, 2, 2
|
28
30
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
ruby_data.scan(GETTEXT_ENTRY_RE).each do |entry|
|
33
|
-
entries << entry
|
34
|
-
end
|
35
|
-
rescue Slim::Parser::SyntaxError
|
36
|
-
TranslationIO.info "File cannot be parsed (SyntaxError): #{slim_file_path}", 1, 0
|
37
|
-
end
|
31
|
+
slim_data = File.read(slim_file_path)
|
32
|
+
entries += TranslationIO::Extractor.extract(slim_data)
|
38
33
|
end
|
39
34
|
|
40
35
|
TranslationIO.info "#{entries.size} entries found", 2, 2
|
@@ -7,19 +7,21 @@ module TranslationIO
|
|
7
7
|
class Client
|
8
8
|
class InitOperation < BaseOperation
|
9
9
|
def run
|
10
|
-
|
11
|
-
|
10
|
+
config = TranslationIO.config
|
11
|
+
|
12
|
+
haml_source_files = config.haml_source_files
|
13
|
+
slim_source_files = config.slim_source_files
|
12
14
|
|
13
15
|
BaseOperation::DumpHamlGettextKeysStep.new(haml_source_files).run
|
14
16
|
BaseOperation::DumpSlimGettextKeysStep.new(slim_source_files).run
|
15
17
|
|
16
|
-
source_files =
|
17
|
-
pot_path =
|
18
|
-
source_locale =
|
19
|
-
target_locales =
|
20
|
-
locales_path =
|
21
|
-
yaml_locales_path =
|
22
|
-
yaml_file_paths =
|
18
|
+
source_files = config.source_files
|
19
|
+
pot_path = config.pot_path
|
20
|
+
source_locale = config.source_locale
|
21
|
+
target_locales = config.target_locales
|
22
|
+
locales_path = config.locales_path
|
23
|
+
yaml_locales_path = config.yaml_locales_path
|
24
|
+
yaml_file_paths = config.yaml_file_paths
|
23
25
|
|
24
26
|
UpdatePotFileStep.new(pot_path, source_files).run
|
25
27
|
UpdateAndCollectPoFilesStep.new(target_locales, pot_path, locales_path).run(params)
|
@@ -36,6 +38,8 @@ module TranslationIO
|
|
36
38
|
CleanupYamlFilesStep.new(source_locale, target_locales, yaml_file_paths, yaml_locales_path).run
|
37
39
|
BaseOperation::CreateNewMoFilesStep.new(locales_path).run
|
38
40
|
end
|
41
|
+
|
42
|
+
cleanup
|
39
43
|
end
|
40
44
|
end
|
41
45
|
end
|
@@ -23,17 +23,19 @@ module TranslationIO
|
|
23
23
|
end
|
24
24
|
|
25
25
|
if in_project && !protected_file
|
26
|
-
|
27
|
-
|
26
|
+
if File.exist?(locale_file_path)
|
27
|
+
content_hash = YAML::load(File.read(locale_file_path))
|
28
|
+
new_content_hash = content_hash.keep_if { |k| k.to_s == @source_locale.to_s }
|
28
29
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
30
|
+
if new_content_hash.keys.any?
|
31
|
+
TranslationIO.info "Rewriting #{locale_file_path}", 2, 2
|
32
|
+
File.open(locale_file_path, 'wb') do |file|
|
33
|
+
file.write(new_content_hash.to_yaml)
|
34
|
+
end
|
35
|
+
else
|
36
|
+
TranslationIO.info "Removing #{locale_file_path}", 2, 2
|
37
|
+
FileUtils.rm(locale_file_path)
|
33
38
|
end
|
34
|
-
else
|
35
|
-
TranslationIO.info "Removing #{locale_file_path}", 2, 2
|
36
|
-
FileUtils.rm(locale_file_path)
|
37
39
|
end
|
38
40
|
end
|
39
41
|
end
|
@@ -5,19 +5,21 @@ module TranslationIO
|
|
5
5
|
class Client
|
6
6
|
class SyncOperation < BaseOperation
|
7
7
|
def run(purge = false)
|
8
|
-
|
9
|
-
|
8
|
+
config = TranslationIO.config
|
9
|
+
|
10
|
+
haml_source_files = config.haml_source_files
|
11
|
+
slim_source_files = config.slim_source_files
|
10
12
|
|
11
13
|
BaseOperation::DumpHamlGettextKeysStep.new(haml_source_files).run
|
12
14
|
BaseOperation::DumpSlimGettextKeysStep.new(slim_source_files).run
|
13
15
|
|
14
|
-
source_files =
|
15
|
-
pot_path =
|
16
|
-
source_locale =
|
17
|
-
target_locales =
|
18
|
-
locales_path =
|
19
|
-
yaml_locales_path =
|
20
|
-
yaml_file_paths =
|
16
|
+
source_files = config.source_files
|
17
|
+
pot_path = config.pot_path
|
18
|
+
source_locale = config.source_locale
|
19
|
+
target_locales = config.target_locales
|
20
|
+
locales_path = config.locales_path
|
21
|
+
yaml_locales_path = config.yaml_locales_path
|
22
|
+
yaml_file_paths = config.yaml_file_paths
|
21
23
|
|
22
24
|
UpdateAndCollectPotFileStep.new(pot_path, source_files).run(params)
|
23
25
|
CreateYamlPotFileStep.new(source_locale, yaml_file_paths).run(params)
|
@@ -35,6 +37,8 @@ module TranslationIO
|
|
35
37
|
BaseOperation::SaveNewYamlFilesStep.new(target_locales, yaml_locales_path, parsed_response).run
|
36
38
|
BaseOperation::SaveSpecialYamlFilesStep.new(source_locale, target_locales, yaml_locales_path, yaml_file_paths).run
|
37
39
|
end
|
40
|
+
|
41
|
+
cleanup
|
38
42
|
end
|
39
43
|
end
|
40
44
|
end
|
@@ -13,6 +13,42 @@ module TranslationIO
|
|
13
13
|
self.verbose = 1
|
14
14
|
end
|
15
15
|
|
16
|
+
def pot_path
|
17
|
+
File.join(locales_path, "#{TEXT_DOMAIN}.pot")
|
18
|
+
end
|
19
|
+
|
20
|
+
def yaml_file_paths
|
21
|
+
I18n.load_path.select do |p|
|
22
|
+
File.exist?(p)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def source_files
|
27
|
+
paths = Dir['**/*.{rb,erb,html.erb,xml.erb}'].select do |p|
|
28
|
+
!p.start_with?('vendor/') && !p.start_with?('tmp/')
|
29
|
+
end
|
30
|
+
|
31
|
+
paths += Dir['tmp/translation/*.rb']
|
32
|
+
|
33
|
+
paths
|
34
|
+
end
|
35
|
+
|
36
|
+
def yaml_locales_path
|
37
|
+
'config/locales'
|
38
|
+
end
|
39
|
+
|
40
|
+
def haml_source_files
|
41
|
+
Dir['**/*.{haml}'].select do |p|
|
42
|
+
!p.start_with?('vendor/') && !p.start_with?('tmp/')
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def slim_source_files
|
47
|
+
Dir['**/*.{slim}'].select do |p|
|
48
|
+
!p.start_with?('vendor/') && !p.start_with?('tmp/')
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
16
52
|
def to_s
|
17
53
|
"#{api_key} - #{source_locale} => #{target_locales.join(' + ')}"
|
18
54
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module TranslationIO
|
2
|
+
module Extractor
|
3
|
+
# visual: https://www.debuggex.com/r/fYSQ-jwQfTjhhE6T
|
4
|
+
# .*? is non-greedy (lazy) match : http://stackoverflow.com/a/1919995/1243212
|
5
|
+
REGEXP_INSIDE_1 = '\s*(?:\[?(?:(?:(?:".*?")|(?:\'.*?\'))\s*?,?\s*?){1}\]?)\s*?'
|
6
|
+
REGEXP_INSIDE_2 = '\s*(?:\[?(?:(?:(?:".*?")|(?:\'.*?\'))\s*?,?\s*?){2}\]?),?\s*?.*?\s*'
|
7
|
+
REGEXP_INSIDE_2B = '\s*(?:\[?(?:(?:(?:".*?")|(?:\'.*?\'))\s*?,?\s*?){2}\]?)\s*?'
|
8
|
+
REGEXP_INSIDE_3 = '\s*(?:\[?(?:(?:(?:".*?")|(?:\'.*?\'))\s*?,?\s*?){3}\]?),?\s*?.*?\s*'
|
9
|
+
|
10
|
+
REGEXP_1 = '(?:sgettext|gettext|N_|s_|_)\s*(?:\(' + REGEXP_INSIDE_1 + '\)|' + REGEXP_INSIDE_1 + ')'
|
11
|
+
REGEXP_2 = '(?:nsgettext|ngettext|ns_|Nn_|n_)\s*(?:\(' + REGEXP_INSIDE_2 + '\)|' + REGEXP_INSIDE_2 + ')'
|
12
|
+
REGEXP_2B = '(?:pgettext|p_)\s*(?:\(' + REGEXP_INSIDE_2B + '\)|' + REGEXP_INSIDE_2B + ')'
|
13
|
+
REGEXP_3 = '(?:npgettext|np_)\s*(?:\(' + REGEXP_INSIDE_3 + '\)|' + REGEXP_INSIDE_3 + ')'
|
14
|
+
|
15
|
+
GETTEXT_REGEXP = Regexp.new('(?:' + REGEXP_3 + '|' + REGEXP_2B + '|' + REGEXP_2 + '|' + REGEXP_1 + ')')
|
16
|
+
|
17
|
+
def self.extract(code_to_parse)
|
18
|
+
code_to_parse.scan(GETTEXT_REGEXP)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
@@ -2,29 +2,6 @@ module TranslationIO
|
|
2
2
|
module YAMLConversion
|
3
3
|
class << self
|
4
4
|
|
5
|
-
def get_pot_data_from_yaml(source_locale = nil, yaml_file_paths = nil)
|
6
|
-
source_locale = TranslationIO.config.source_locale if source_locale.blank?
|
7
|
-
yaml_file_paths = I18n.load_path if yaml_file_paths.nil?
|
8
|
-
|
9
|
-
source_translations = YAMLConversion.get_flat_translations_for_locale(source_locale, yaml_file_paths)
|
10
|
-
pot_representation = GetText::PO.new
|
11
|
-
|
12
|
-
source_translations.each_pair do |key, value|
|
13
|
-
msgid = value
|
14
|
-
|
15
|
-
unless msgid.blank?
|
16
|
-
pot_entry = GetText::POEntry.new(:msgctxt)
|
17
|
-
pot_entry.msgid = msgid
|
18
|
-
pot_entry.msgctxt = key.split('.', 2).last
|
19
|
-
#pot_entry.references = [ value[:locale_file_path] ]
|
20
|
-
|
21
|
-
pot_representation[ pot_entry.msgctxt, pot_entry.msgid ] = pot_entry
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
pot_representation.to_s
|
26
|
-
end
|
27
|
-
|
28
5
|
def get_yaml_data_from_po_data(po_data, target_locale)
|
29
6
|
parser = GetText::POParser.new
|
30
7
|
po_representation = GetText::PO.new
|
@@ -43,24 +20,6 @@ module TranslationIO
|
|
43
20
|
|
44
21
|
# Shortcut methods
|
45
22
|
|
46
|
-
def get_flat_translations_for_locale(locale, yaml_file_paths = nil)
|
47
|
-
yaml_file_paths = I18n.load_path if yaml_file_paths.blank?
|
48
|
-
|
49
|
-
all_flat_translations = {}
|
50
|
-
|
51
|
-
yaml_file_paths.each do |yaml_file_path|
|
52
|
-
content = File.read(yaml_file_path)
|
53
|
-
translations = YAML::load(content)
|
54
|
-
|
55
|
-
if translations.has_key?(locale.to_s)
|
56
|
-
flat_translations = FlatHash.to_flat_hash(translations)
|
57
|
-
all_flat_translations.merge!(flat_translations)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
return all_flat_translations
|
62
|
-
end
|
63
|
-
|
64
23
|
def get_flat_translations_for_yaml_file(file_path)
|
65
24
|
yaml_data = File.read(file_path)
|
66
25
|
return get_flat_translations_for_yaml_data(yaml_data)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: translation
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.8'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aurelien Malisart
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-08-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: gettext
|
@@ -67,35 +67,9 @@ dependencies:
|
|
67
67
|
- - ">="
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '0'
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
requirements:
|
74
|
-
- - ">="
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
version: '0'
|
77
|
-
type: :development
|
78
|
-
prerelease: false
|
79
|
-
version_requirements: !ruby/object:Gem::Requirement
|
80
|
-
requirements:
|
81
|
-
- - ">="
|
82
|
-
- !ruby/object:Gem::Version
|
83
|
-
version: '0'
|
84
|
-
- !ruby/object:Gem::Dependency
|
85
|
-
name: slim
|
86
|
-
requirement: !ruby/object:Gem::Requirement
|
87
|
-
requirements:
|
88
|
-
- - ">="
|
89
|
-
- !ruby/object:Gem::Version
|
90
|
-
version: '0'
|
91
|
-
type: :development
|
92
|
-
prerelease: false
|
93
|
-
version_requirements: !ruby/object:Gem::Requirement
|
94
|
-
requirements:
|
95
|
-
- - ">="
|
96
|
-
- !ruby/object:Gem::Version
|
97
|
-
version: '0'
|
98
|
-
description: translation.io connector
|
70
|
+
description: Rails translation made _("simple"). Use "gem 'translation'" to translate
|
71
|
+
with _("plain text") or with t("lots.of.keys"). Type "rake translation:sync" to
|
72
|
+
synchronize with your translators on Translation.io
|
99
73
|
email: contact@translation.io
|
100
74
|
executables: []
|
101
75
|
extensions: []
|
@@ -121,6 +95,7 @@ files:
|
|
121
95
|
- lib/translation_io/client/sync_operation/update_and_collect_pot_file_step.rb
|
122
96
|
- lib/translation_io/config.rb
|
123
97
|
- lib/translation_io/controller.rb
|
98
|
+
- lib/translation_io/extractor.rb
|
124
99
|
- lib/translation_io/flat_hash.rb
|
125
100
|
- lib/translation_io/railtie.rb
|
126
101
|
- lib/translation_io/tasks.rb
|
@@ -148,6 +123,5 @@ rubyforge_project:
|
|
148
123
|
rubygems_version: 2.2.0
|
149
124
|
signing_key:
|
150
125
|
specification_version: 4
|
151
|
-
summary: translation.
|
126
|
+
summary: Rails translation made _("simple") with YAML and GetText.
|
152
127
|
test_files: []
|
153
|
-
has_rdoc: false
|