zlocalize 4.2.2 → 6.0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/zlocalize.rb +0 -3
- data/lib/zlocalize/backend.rb +1 -3
- data/lib/zlocalize/config.rb +11 -14
- data/lib/zlocalize/harvester.rb +89 -110
- data/lib/zlocalize/rails/active_record.rb +0 -7
- data/lib/zlocalize/rails/attached_translations.rb +4 -16
- data/lib/zlocalize/rails/decimal_attributes.rb +0 -2
- data/lib/zlocalize/rails/generators/initializer.rb +0 -2
- data/lib/zlocalize/rails/generators/templates/initializer_template.rb +16 -20
- data/lib/zlocalize/rails/generators/templates/translations_migration_template.rb +4 -8
- data/lib/zlocalize/rails/generators/translations_migration.rb +0 -2
- data/lib/zlocalize/rails/railtie.rb +0 -2
- data/lib/zlocalize/rails/tasks/harvest.rake +5 -7
- data/lib/zlocalize/rails/translated_columns.rb +5 -15
- data/lib/zlocalize/rails/translation.rb +2 -4
- data/lib/zlocalize/rails/translation_validator.rb +13 -5
- data/lib/zlocalize/{source_parser.rb → rdoc_source_parser.rb} +4 -0
- data/lib/zlocalize/source_processor.rb +120 -0
- data/lib/zlocalize/translation_file.rb +0 -2
- metadata +48 -28
- data/lib/zlocalize/rails/default_locale_evaluator.rb +0 -44
- data/lib/zlocalize/rails/translated_attributes_serializer.rb +0 -73
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5651dc41c98a14458f171ab2aff8a696edb9d256
|
4
|
+
data.tar.gz: 5f04f8f4e09450c28c45665c1c6103f0d69e38ef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6ea3f6afbc8b4b6361a12f9fe4796ed3c9768296ff0eb1e2c22dcfab328722708ebd3e4c2146a208974455690dbd463b08f3af34eb1a849236bc3cfdcee18de7
|
7
|
+
data.tar.gz: ec98c7d8a1b5ad8a6e94eae0eb4497cb09a6f9ca26e6143e8747ac872e84c627209749e63dd620293ae6e676cb8539765f2363d633ae6c35040a7dcb42bf74bb
|
data/lib/zlocalize.rb
CHANGED
@@ -1,9 +1,6 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
|
3
1
|
zlocalize_path = File.expand_path(File.dirname(__FILE__))
|
4
2
|
$:.unshift(zlocalize_path) if File.directory?(zlocalize_path) && !$:.include?(zlocalize_path)
|
5
3
|
|
6
4
|
require 'active_support/core_ext/string/output_safety'
|
7
5
|
require 'zlocalize/rails/railtie' # hook into Rails framework
|
8
6
|
require 'zlocalize/backend'
|
9
|
-
|
data/lib/zlocalize/backend.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
|
3
1
|
require 'yaml'
|
4
2
|
require 'zlocalize/translation_file'
|
5
3
|
require 'zlocalize/config'
|
@@ -151,7 +149,7 @@ module ZLocalize
|
|
151
149
|
end
|
152
150
|
|
153
151
|
def reload!(force = false)
|
154
|
-
if force || !@initialized
|
152
|
+
if force || !@initialized
|
155
153
|
@initialized = false
|
156
154
|
@translations = nil
|
157
155
|
@translation_procs = nil
|
data/lib/zlocalize/config.rb
CHANGED
@@ -1,31 +1,28 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
1
|
module ZLocalize
|
3
2
|
|
4
3
|
class Config
|
5
4
|
|
6
|
-
attr_reader :reload_per_request
|
7
5
|
attr_reader :return_source_on_missing
|
8
|
-
attr_reader :reload_per_request
|
9
6
|
attr_reader :locales
|
10
7
|
attr_reader :define_gettext_methods
|
8
|
+
attr_reader :harvest_paths
|
11
9
|
|
12
10
|
def initialize
|
13
|
-
@reload_per_request = { :development => true, :test => false, :production => false, :staging => false }
|
14
11
|
@return_source_on_missing = { :development => true, :test => false, :production => false, :staging => false }
|
12
|
+
@harvest_paths = [
|
13
|
+
"app/channels/**/*.rb",
|
14
|
+
"app/controllers/**/*.rb",
|
15
|
+
"app/helpers/**/*.rb",
|
16
|
+
"app/models/**/*.rb",
|
17
|
+
"app/views/**/*.erb",
|
18
|
+
"app/mailers/**/*.rb",
|
19
|
+
"app/jobs/**/*.rb",
|
20
|
+
"lib/**/*.rb"
|
21
|
+
]
|
15
22
|
@locales = {}
|
16
23
|
@use_global_gettext_methods = true
|
17
24
|
end
|
18
25
|
|
19
|
-
def reload_per_request=(value)
|
20
|
-
if value === true || value === false
|
21
|
-
[:development,:test,:production,:staging].each do |env|
|
22
|
-
@reload_per_request[env] = value
|
23
|
-
end
|
24
|
-
elsif value.is_a?(Hash)
|
25
|
-
@reload_per_request.merge!(value)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
26
|
def return_source_on_missing=(value)
|
30
27
|
if value === true || value === false
|
31
28
|
[:development,:test,:production,:staging].each do |env|
|
data/lib/zlocalize/harvester.rb
CHANGED
@@ -1,122 +1,101 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
|
3
1
|
require 'rubygems'
|
4
|
-
require '
|
5
|
-
require File.join(File.dirname(__FILE__),'source_parser')
|
2
|
+
require File.join(File.dirname(__FILE__),'source_processor')
|
6
3
|
require File.join(File.dirname(__FILE__),'translation_file')
|
7
4
|
|
8
5
|
module ZLocalize
|
9
6
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
@new_entries = TranslationEntryCollection.new
|
63
|
-
HARVEST_SECTIONS.each_pair do |section,paths|
|
64
|
-
harvest_section(section,paths)
|
65
|
-
progress("\n")
|
66
|
-
end
|
67
|
-
if @options[:add_paths].is_a?(Array) && @options.size > 0
|
68
|
-
harvest_section("additional paths",@options[:add_paths])
|
69
|
-
progress("\n")
|
70
|
-
end
|
71
|
-
|
72
|
-
@translation_file = ZLocalize::TranslationFile.new
|
73
|
-
unless @options[:overwrite_existing]
|
74
|
-
progress("Merging existing translations from #{@options[:output]}...\n")
|
75
|
-
begin
|
76
|
-
@translation_file.load(File.join(@rails_root,@options[:output]))
|
77
|
-
rescue
|
78
|
-
end
|
7
|
+
INDENT_STEP = 3
|
8
|
+
|
9
|
+
class HarvesterError < StandardError
|
10
|
+
end
|
11
|
+
|
12
|
+
# Harvester will parse and extract all calls to translation methods in "app/models/",
|
13
|
+
# "app/controllers/" and "app/views/"
|
14
|
+
class Harvester
|
15
|
+
|
16
|
+
attr_accessor :rails_root
|
17
|
+
|
18
|
+
DEFAULT_HARVEST_OPTIONS = { :output => 'config/locales/app-strings.yml',
|
19
|
+
:overwrite_existing => false,
|
20
|
+
:add_paths => [],
|
21
|
+
:silent => false,
|
22
|
+
:purge => false }
|
23
|
+
|
24
|
+
def initialize(rails_root, options = {})
|
25
|
+
@rails_root = rails_root
|
26
|
+
@options = { paths: ZLocalize.config.harvest_paths }.merge(DEFAULT_HARVEST_OPTIONS).merge(options).with_indifferent_access
|
27
|
+
end
|
28
|
+
|
29
|
+
def progress(msg)
|
30
|
+
print msg unless @options[:silent]
|
31
|
+
end
|
32
|
+
|
33
|
+
def harvest_path(filespec)
|
34
|
+
progress("Harvesting localizable strings from #{filespec}:\n")
|
35
|
+
Dir.glob(File.join(@rails_root,filespec)) do |f|
|
36
|
+
progress('.')
|
37
|
+
collect_entries(f,@rails_root,is_erb?(f))
|
38
|
+
end
|
39
|
+
progress("\n")
|
40
|
+
end
|
41
|
+
|
42
|
+
def is_erb?(filename)
|
43
|
+
['.erb','.rhtml'].include?(File.extname(filename))
|
44
|
+
end
|
45
|
+
|
46
|
+
def harvest
|
47
|
+
@new_entries = TranslationEntryCollection.new
|
48
|
+
@options[:paths].each do |path|
|
49
|
+
harvest_path(path)
|
50
|
+
progress("\n")
|
51
|
+
end
|
52
|
+
|
53
|
+
@translation_file = ZLocalize::TranslationFile.new
|
54
|
+
unless @options[:overwrite_existing]
|
55
|
+
progress("Merging existing translations from #{@options[:output]}...\n")
|
56
|
+
begin
|
57
|
+
@translation_file.load(File.join(@rails_root,@options[:output]))
|
58
|
+
rescue
|
79
59
|
end
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
@new_entries[key].add_reference(ref)
|
112
|
-
end
|
113
|
-
else
|
114
|
-
@new_entries[key] = te.dup
|
60
|
+
end
|
61
|
+
|
62
|
+
@translation_file.entries.synchronize_with(@new_entries,@options[:purge])
|
63
|
+
|
64
|
+
progress("Writing new translation file...\n")
|
65
|
+
File.open(File.join(@rails_root,@options[:output]),"w") do |f|
|
66
|
+
f.write(@translation_file.to_yaml)
|
67
|
+
end
|
68
|
+
progress("Done!\n\n")
|
69
|
+
end
|
70
|
+
|
71
|
+
def harvest_file(filename)
|
72
|
+
@new_entries = TranslationEntryCollection.new
|
73
|
+
collect_entries(filename,@rails_root,false)
|
74
|
+
|
75
|
+
@translation_file = ZLocalize::TranslationFile.new
|
76
|
+
# merge
|
77
|
+
@translation_file.load(File.join(@rails_root,@options[:output]))
|
78
|
+
@translation_file.entries.synchronize_with(@new_entries,@options[:purge])
|
79
|
+
File.open(File.join(@rails_root,@options[:output]),"w") do |f|
|
80
|
+
f.write(@translation_file.to_yaml)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# collect entries in a source file
|
85
|
+
def collect_entries(filename,root,is_erb = false)
|
86
|
+
sp = ZLocalize::SourceProcessor.new(filename,root,is_erb)
|
87
|
+
sp.translation_entries.each do |key,te|
|
88
|
+
if @new_entries[key]
|
89
|
+
te.references.each do |ref|
|
90
|
+
@new_entries[key].add_reference(ref)
|
115
91
|
end
|
92
|
+
else
|
93
|
+
@new_entries[key] = te.dup
|
116
94
|
end
|
117
|
-
|
95
|
+
end
|
96
|
+
end
|
118
97
|
|
119
|
-
|
98
|
+
end
|
120
99
|
|
121
100
|
end # module Harvester
|
122
101
|
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
1
|
|
3
2
|
require 'zlocalize/rails/attached_translations'
|
4
3
|
ActiveRecord::Base.send(:include, ZLocalize::Translatable::AttachedTranslations)
|
@@ -8,9 +7,3 @@ ActiveRecord::Base.send(:include, ZLocalize::Translatable::TranslatedColumns)
|
|
8
7
|
|
9
8
|
require 'zlocalize/rails/decimal_attributes'
|
10
9
|
ActiveRecord::Base.send(:include, ZLocalize::Translatable::LocalizedDecimalAttributes)
|
11
|
-
|
12
|
-
require 'zlocalize/rails/translated_attributes_serializer'
|
13
|
-
ActiveRecord::Base.send(:include, ZLocalize::Translatable::TranslatedAttributesSerializer)
|
14
|
-
|
15
|
-
require 'zlocalize/rails/default_locale_evaluator'
|
16
|
-
ActiveRecord::Base.send(:include, ZLocalize::Translatable::DefaultLocaleEvaluator)
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
|
3
1
|
#
|
4
2
|
# === Translation of attributes values for ActiveRecord ===
|
5
3
|
#
|
@@ -41,18 +39,14 @@ module ZLocalize
|
|
41
39
|
end
|
42
40
|
|
43
41
|
module AttachedTranslations #:nodoc:
|
44
|
-
|
45
42
|
def self.included(base)
|
46
43
|
base.extend(ClassMethods)
|
47
44
|
end
|
48
45
|
|
49
46
|
module ClassMethods
|
50
47
|
|
51
|
-
def has_translations
|
48
|
+
def has_translations
|
52
49
|
has_many :translations, :as => :translated, :dependent => :destroy
|
53
|
-
|
54
|
-
set_default_locale_for_translations(options[:default_locale])
|
55
|
-
|
56
50
|
include ZLocalize::Translatable::AttachedTranslations::InstanceMethods
|
57
51
|
end
|
58
52
|
|
@@ -60,18 +54,12 @@ module ZLocalize
|
|
60
54
|
|
61
55
|
module InstanceMethods
|
62
56
|
|
63
|
-
def translate(attr_name,locale = nil
|
57
|
+
def translate(attr_name,locale = nil)
|
64
58
|
locale ||= ZLocalize.locale
|
65
59
|
if tr = find_translation(attr_name,locale)
|
66
|
-
|
60
|
+
tr.value
|
67
61
|
else
|
68
|
-
|
69
|
-
if default_locale.to_s != locale.to_s
|
70
|
-
if tr = find_translation(attr_name,default_locale)
|
71
|
-
return tr.value
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
62
|
+
''
|
75
63
|
end
|
76
64
|
end
|
77
65
|
|
@@ -1,24 +1,20 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
|
3
1
|
# ZLocalize configuration.
|
4
2
|
|
5
3
|
# ZLocalize is bound to use I18n.locale, I18n.default_locale, as to remain consistent
|
6
4
|
# with the locale used by the Rails framework itself
|
7
|
-
I18n.default_locale = :
|
5
|
+
I18n.default_locale = :en
|
8
6
|
|
9
7
|
# define_gettext_methods will add _ and n_ methods to the Object class (so that they are globally accessible)
|
10
8
|
# if you do not define the gettext methods, you will need to use ZLocalize.translate and ZLocalize.pluralize
|
11
9
|
ZLocalize.config.define_gettext_methods = true
|
12
10
|
|
13
|
-
# specify which Rails environments will
|
14
|
-
|
15
|
-
|
11
|
+
# specify which Rails environments will return the source (untranslated) string when no translation is found.
|
12
|
+
# Defaults to false for all environments, meaning a missing translation will raise a ZLocalize::TranslationMissing error
|
13
|
+
ZLocalize.config.return_source_on_missing = { development: false, test: false,
|
14
|
+
production: false, staging: false }
|
16
15
|
|
17
|
-
#
|
18
|
-
#
|
19
|
-
# a ZLocalize::TranslationMissing error
|
20
|
-
ZLocalize.config.return_source_on_missing = { :development => true, :test => true,
|
21
|
-
:production => true, :staging => true }
|
16
|
+
# If you have additional paths to scan for translation calls, add them here.
|
17
|
+
# ZLocalize.config.harvest_paths << 'app/pdf_producers/**/*.rb'
|
22
18
|
|
23
19
|
# +ZLocalize.config.locales+ is the configuration of locales supported by your application.
|
24
20
|
# each locale must be a Hash with the configuration values for that locale.
|
@@ -37,16 +33,16 @@ ZLocalize.config.return_source_on_missing = { :development => true, :test => tru
|
|
37
33
|
# simply return the string itself.
|
38
34
|
|
39
35
|
ZLocalize.config.locales = {
|
40
|
-
:
|
41
|
-
:
|
42
|
-
:
|
43
|
-
:
|
36
|
+
en: {
|
37
|
+
plural_select: -> (n) { n <= 0 ? 0 : (n > 1 ? 2 : 1) },
|
38
|
+
translations: File.join(Rails.root,'config/locales/en.strings.yml'),
|
39
|
+
convert_float: -> (s) { s.to_s.gsub(',','') }
|
44
40
|
},
|
45
|
-
# :
|
46
|
-
# :
|
47
|
-
# :
|
48
|
-
# :
|
49
|
-
# :
|
41
|
+
# fr: {
|
42
|
+
# plural_select: -> (n) { n <= 0 ? 0 : (n > 1 ? 2 : 1) },
|
43
|
+
# translations: File.join(Rails.root,'config/locales/fr.strings.yml'),
|
44
|
+
# titleize: -> (s) { s.capitalize.to_s },
|
45
|
+
# convert_float: -> (s) { s.to_s.gsub(' ','').gsub(',','.') }
|
50
46
|
# }
|
51
47
|
}
|
52
48
|
|
@@ -1,7 +1,6 @@
|
|
1
|
-
|
1
|
+
class CreateTranslationsTable < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>]
|
2
2
|
|
3
|
-
|
4
|
-
def self.up
|
3
|
+
def change
|
5
4
|
create_table :translations do |t|
|
6
5
|
t.string :translated_type
|
7
6
|
t.integer :translated_id
|
@@ -11,11 +10,8 @@ class CreateZLocalizeTranslationsTable < ActiveRecord::Migration
|
|
11
10
|
|
12
11
|
t.timestamps
|
13
12
|
end
|
14
|
-
add_index 'translations', ['translated_type','translated_id'], :
|
15
|
-
add_index 'translations', ['name','locale'], :
|
13
|
+
add_index 'translations', ['translated_type','translated_id'], name: 'index_on_translated'
|
14
|
+
add_index 'translations', ['name','locale'], name: 'index_for_lookup'
|
16
15
|
end
|
17
16
|
|
18
|
-
def self.down
|
19
|
-
drop_table :translations
|
20
|
-
end
|
21
17
|
end
|
@@ -1,6 +1,4 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'zlocalize/harvester'
|
1
|
+
require 'zlocalize/harvester'
|
4
2
|
|
5
3
|
namespace :zlocalize do
|
6
4
|
|
@@ -12,18 +10,18 @@ namespace :zlocalize do
|
|
12
10
|
" clear=true|false Clearing the existing translations in output file (if it exists). (default: false)\n" +
|
13
11
|
" silent=true|false If true, do not report progress. (default: false)\n" +
|
14
12
|
" add_paths Comma-separated list of path specs (relative to Rails.root) to harvest in addition to default paths"
|
15
|
-
|
13
|
+
|
16
14
|
task :harvest => :environment do
|
17
15
|
options = { :clear => ['1','true'].include?(ENV['clear']),
|
18
16
|
:purge => ['1','true'].include?(ENV['purge']),
|
19
17
|
:output => ENV['output'].to_s.empty? ? 'config/locales/app-strings.yml' : ENV['output'],
|
20
|
-
:add_paths => ENV['add_paths'].to_s.empty? ? [] : ENV['add_paths'].split(','),
|
18
|
+
:add_paths => ENV['add_paths'].to_s.empty? ? [] : ENV['add_paths'].split(','),
|
21
19
|
:silent => ['1','true'].include?(ENV['silent']) }
|
22
|
-
|
20
|
+
|
23
21
|
h = ZLocalize::Harvester.new(File.expand_path(Rails.root), options)
|
24
22
|
h.harvest
|
25
23
|
end
|
26
|
-
|
24
|
+
|
27
25
|
desc "Display which entries are not translated in given file\n\n" +
|
28
26
|
"Usage: rake zlocalize:check_untranslated file=FILE_PATH\n\n" +
|
29
27
|
"where FILE_PATH is the path to the YAML translation file relative to Rails.Root\n"
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
|
3
1
|
#
|
4
2
|
# === Translated columns ====
|
5
3
|
#
|
@@ -38,9 +36,7 @@ module ZLocalize
|
|
38
36
|
|
39
37
|
module ClassMethods
|
40
38
|
|
41
|
-
def translates_columns(column_names
|
42
|
-
|
43
|
-
set_default_locale_for_translations(options[:default_locale])
|
39
|
+
def translates_columns(*column_names)
|
44
40
|
|
45
41
|
[column_names].flatten.each do |col_name|
|
46
42
|
class_eval "def #{col_name}(options = {})
|
@@ -56,18 +52,12 @@ module ZLocalize
|
|
56
52
|
|
57
53
|
def read_translated_column(col_name,locale,fetch_default = true)
|
58
54
|
s = self.read_attribute("#{col_name}_#{locale}")
|
59
|
-
if s.
|
60
|
-
unless (default_locale = evaluate_default_locale_for_translations).blank?
|
61
|
-
if default_locale.to_s != locale.to_s
|
62
|
-
attr_name = "#{col_name}_#{default_locale}"
|
63
|
-
if self.respond_to?(attr_name)
|
64
|
-
return self.read_attribute(attr_name)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
else
|
55
|
+
if !s.nil?
|
69
56
|
return s
|
57
|
+
elsif fetch_default == true
|
58
|
+
return self.read_attribute("#{col_name}_#{ZLocalize.default_locale}")
|
70
59
|
end
|
60
|
+
nil
|
71
61
|
end
|
72
62
|
|
73
63
|
end # module InstanceMethods
|
@@ -1,7 +1,13 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
|
3
1
|
class TranslationValidator < ActiveModel::EachValidator
|
4
2
|
|
3
|
+
def initialize(options = {})
|
4
|
+
# create a virtual attribute accessor for the expected translations
|
5
|
+
options[:attributes].each do |attr_name|
|
6
|
+
options[:class].attr_accessor attr_name
|
7
|
+
end
|
8
|
+
super
|
9
|
+
end
|
10
|
+
|
5
11
|
def evaluate_required_locales(locales,record,attr_name,value)
|
6
12
|
case locales
|
7
13
|
when Symbol then record.send(locales)
|
@@ -9,7 +15,8 @@ class TranslationValidator < ActiveModel::EachValidator
|
|
9
15
|
when String then [locales]
|
10
16
|
else
|
11
17
|
if locales.respond_to?("call")
|
12
|
-
|
18
|
+
args = [record,attr_name,value].slice(0,locales.arity)
|
19
|
+
locales.call(*args)
|
13
20
|
else
|
14
21
|
raise(
|
15
22
|
ActiveRecord::ActiveRecordError,
|
@@ -21,7 +28,7 @@ class TranslationValidator < ActiveModel::EachValidator
|
|
21
28
|
end
|
22
29
|
|
23
30
|
def validate_each(record,attr_name,value)
|
24
|
-
configuration = { :message =>
|
31
|
+
configuration = { :message => :missing_translations,
|
25
32
|
:required_locales => record.respond_to?(:get_required_locales) ? :get_required_locales : [] }
|
26
33
|
configuration.update(options)
|
27
34
|
locales = evaluate_required_locales(configuration[:required_locales],record,attr_name,value)
|
@@ -29,7 +36,7 @@ class TranslationValidator < ActiveModel::EachValidator
|
|
29
36
|
if locales.is_a?(Array)
|
30
37
|
locales.each do |loc|
|
31
38
|
begin
|
32
|
-
s = record.translate(attr_name,loc)
|
39
|
+
s = record.translate(attr_name.to_sym,loc)
|
33
40
|
rescue ZLocalize::Translatable::TranslationError
|
34
41
|
s = nil
|
35
42
|
end
|
@@ -37,6 +44,7 @@ class TranslationValidator < ActiveModel::EachValidator
|
|
37
44
|
end
|
38
45
|
end
|
39
46
|
if missing_locales.size > 0
|
47
|
+
# m = configuration[:message].to_s.gsub()
|
40
48
|
record.errors.add(attr_name, configuration[:message], { :locales => missing_locales.to_sentence })
|
41
49
|
end
|
42
50
|
end
|
@@ -1,5 +1,9 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
|
3
|
+
# This file is no longer used starting from Ruby 2.5, since rdoc does not use ruby_lex anymore.
|
4
|
+
# see ./source_processor.rb which replaces this parser with the `parser` gem.
|
5
|
+
#
|
6
|
+
|
3
7
|
require 'rdoc'
|
4
8
|
require 'rdoc/options'
|
5
9
|
require 'rdoc/ruby_lex'
|
@@ -0,0 +1,120 @@
|
|
1
|
+
require 'parser/all'
|
2
|
+
require 'action_view/template/handlers/erb'
|
3
|
+
require File.join(File.dirname(__FILE__),'translation_file')
|
4
|
+
require File.join(File.dirname(__FILE__),'harvester')
|
5
|
+
|
6
|
+
module ZLocalize
|
7
|
+
|
8
|
+
class SourceProcessor
|
9
|
+
|
10
|
+
def initialize(filename, root, is_erb = false)
|
11
|
+
@in_hash = 0
|
12
|
+
@translate_calls = []
|
13
|
+
@root = File.join(File.expand_path(root).downcase,'/') # add a trailing /
|
14
|
+
@filename = File.expand_path(filename).downcase
|
15
|
+
@relative_filename = @filename.gsub(@root,'')
|
16
|
+
content = File.open(filename, "r") { |f| f.read }
|
17
|
+
if is_erb
|
18
|
+
content = ActionView::Template::Handlers::ERB::Erubi.new(content, escape: true, trim: true).src
|
19
|
+
end
|
20
|
+
@parser = create_parser_for_ruby_version
|
21
|
+
@stree = @parser.parse(content)
|
22
|
+
process(@stree)
|
23
|
+
end
|
24
|
+
|
25
|
+
def create_parser_for_ruby_version
|
26
|
+
md = RUBY_VERSION.match(/^(\d)\.(\d)/)
|
27
|
+
begin
|
28
|
+
kls = Object.const_get('Parser').const_get("Ruby#{md[1]}#{md[2]}")
|
29
|
+
rescue
|
30
|
+
raise "Unsupported Ruby version #{RUBY_VERSION}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def process(node)
|
35
|
+
return unless node.is_a?(AST::Node)
|
36
|
+
if node.type == :send
|
37
|
+
if node.children[0] == nil
|
38
|
+
if node.children[1] == :_
|
39
|
+
process_translate_call(node) and return
|
40
|
+
elsif node.children[1] == :n_
|
41
|
+
process_pluralize_call(node) and return
|
42
|
+
end
|
43
|
+
elsif is_zlocalize_const?(node)
|
44
|
+
if node.children[1] == :translate
|
45
|
+
process_translate_call(node) and return
|
46
|
+
elsif node.children[1] == :pluralize
|
47
|
+
process_pluralize_call(node) and return
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
node.children.each do |n|
|
52
|
+
process(n)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def is_zlocalize_const?(node)
|
57
|
+
return node.is_a?(AST::Node) && node.type == :const && node.children[1] == :ZLocalize
|
58
|
+
end
|
59
|
+
|
60
|
+
def get_string_node_value(node)
|
61
|
+
unless node.is_a?(AST::Node) && node.type == :str
|
62
|
+
raise ArgumentError.new("String Expected but got: #{node.inspect}")
|
63
|
+
end
|
64
|
+
return node.children[0]
|
65
|
+
end
|
66
|
+
|
67
|
+
def get_string_array_node_value(node)
|
68
|
+
unless node.is_a?(AST::Node) || node.type != :array
|
69
|
+
raise ArgumentError.new("Array expected but got: #{node.inspect}")
|
70
|
+
end
|
71
|
+
a = []
|
72
|
+
for i in 0..node.children.size - 1
|
73
|
+
a << get_string_node_value(node.children[i])
|
74
|
+
end
|
75
|
+
a
|
76
|
+
end
|
77
|
+
|
78
|
+
def process_translate_call(node)
|
79
|
+
@translate_calls << { name: node.children[1].to_s,
|
80
|
+
line_no: node.loc.selector.line,
|
81
|
+
char_no: node.loc.selector.column+1,
|
82
|
+
parameter: get_string_node_value(node.children[2]) }
|
83
|
+
for i in 3..node.children.size-1
|
84
|
+
process(node.children[i])
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def process_pluralize_call(node)
|
89
|
+
@translate_calls << { name: node.children[1].to_s,
|
90
|
+
line_no: node.loc.selector.line,
|
91
|
+
char_no: node.loc.selector.column+1,
|
92
|
+
parameter: get_string_array_node_value(node.children[2]) }
|
93
|
+
for i in 3..node.children.size-1
|
94
|
+
process(node.children[i])
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def make_translation_entry(h)
|
99
|
+
TranslationEntry.new('plural' => h[:name] == 'n_' || h[:name] == 'pluralize',
|
100
|
+
'source' => h[:parameter],
|
101
|
+
'references' => [ "#{@relative_filename}:#{h[:line_no]}" ])
|
102
|
+
end
|
103
|
+
|
104
|
+
# return a Hash of all translation entries we collected
|
105
|
+
def translation_entries
|
106
|
+
entries = {}
|
107
|
+
@translate_calls.each do |c|
|
108
|
+
e = make_translation_entry(c)
|
109
|
+
if entries[e.source]
|
110
|
+
entries[e.source].references += e.references
|
111
|
+
else
|
112
|
+
entries[e.source] = e
|
113
|
+
end
|
114
|
+
end
|
115
|
+
entries
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zlocalize
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 6.0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Charles Bedard
|
@@ -9,64 +9,84 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2020-07-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- -
|
18
|
+
- - "~>"
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version:
|
20
|
+
version: '6.0'
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- -
|
25
|
+
- - "~>"
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version:
|
27
|
+
version: '6.0'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: activesupport
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- -
|
32
|
+
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version:
|
34
|
+
version: '6.0'
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- -
|
39
|
+
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version:
|
41
|
+
version: '6.0'
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: actionpack
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- -
|
46
|
+
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version:
|
48
|
+
version: '6.0'
|
49
49
|
type: :runtime
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
|
-
- -
|
53
|
+
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version:
|
55
|
+
version: '6.0'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: i18n
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
|
-
- -
|
60
|
+
- - ">="
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: 0.
|
62
|
+
version: '0.7'
|
63
|
+
- - "<"
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '2'
|
63
66
|
type: :runtime
|
64
67
|
prerelease: false
|
65
68
|
version_requirements: !ruby/object:Gem::Requirement
|
66
69
|
requirements:
|
67
|
-
- -
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '0.7'
|
73
|
+
- - "<"
|
68
74
|
- !ruby/object:Gem::Version
|
69
|
-
version:
|
75
|
+
version: '2'
|
76
|
+
- !ruby/object:Gem::Dependency
|
77
|
+
name: parser
|
78
|
+
requirement: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '2.7'
|
83
|
+
type: :runtime
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '2.7'
|
70
90
|
description:
|
71
91
|
email:
|
72
92
|
- zzeligg@gmail.com
|
@@ -75,28 +95,28 @@ executables: []
|
|
75
95
|
extensions: []
|
76
96
|
extra_rdoc_files: []
|
77
97
|
files:
|
98
|
+
- lib/zlocalize.rb
|
78
99
|
- lib/zlocalize/backend.rb
|
79
100
|
- lib/zlocalize/config.rb
|
80
101
|
- lib/zlocalize/harvester.rb
|
81
102
|
- lib/zlocalize/rails/active_record.rb
|
82
103
|
- lib/zlocalize/rails/attached_translations.rb
|
83
104
|
- lib/zlocalize/rails/decimal_attributes.rb
|
84
|
-
- lib/zlocalize/rails/default_locale_evaluator.rb
|
85
105
|
- lib/zlocalize/rails/generators/initializer.rb
|
86
106
|
- lib/zlocalize/rails/generators/templates/initializer_template.rb
|
87
107
|
- lib/zlocalize/rails/generators/templates/translations_migration_template.rb
|
88
108
|
- lib/zlocalize/rails/generators/translations_migration.rb
|
89
109
|
- lib/zlocalize/rails/railtie.rb
|
90
110
|
- lib/zlocalize/rails/tasks/harvest.rake
|
91
|
-
- lib/zlocalize/rails/translated_attributes_serializer.rb
|
92
111
|
- lib/zlocalize/rails/translated_columns.rb
|
93
112
|
- lib/zlocalize/rails/translation.rb
|
94
113
|
- lib/zlocalize/rails/translation_validator.rb
|
95
|
-
- lib/zlocalize/
|
114
|
+
- lib/zlocalize/rdoc_source_parser.rb
|
115
|
+
- lib/zlocalize/source_processor.rb
|
96
116
|
- lib/zlocalize/translation_file.rb
|
97
|
-
|
98
|
-
|
99
|
-
|
117
|
+
homepage: https://github.com/zzeligg/zlocalize
|
118
|
+
licenses:
|
119
|
+
- MIT
|
100
120
|
metadata: {}
|
101
121
|
post_install_message:
|
102
122
|
rdoc_options: []
|
@@ -104,17 +124,17 @@ require_paths:
|
|
104
124
|
- lib
|
105
125
|
required_ruby_version: !ruby/object:Gem::Requirement
|
106
126
|
requirements:
|
107
|
-
- -
|
127
|
+
- - ">="
|
108
128
|
- !ruby/object:Gem::Version
|
109
|
-
version:
|
129
|
+
version: 2.5.0
|
110
130
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
131
|
requirements:
|
112
|
-
- -
|
132
|
+
- - ">="
|
113
133
|
- !ruby/object:Gem::Version
|
114
134
|
version: '0'
|
115
135
|
requirements: []
|
116
136
|
rubyforge_project:
|
117
|
-
rubygems_version: 2.
|
137
|
+
rubygems_version: 2.5.2.3
|
118
138
|
signing_key:
|
119
139
|
specification_version: 4
|
120
140
|
summary: Translation engine for Rails applications
|
@@ -1,44 +0,0 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
module ZLocalize
|
3
|
-
module Translatable
|
4
|
-
module DefaultLocaleEvaluator
|
5
|
-
|
6
|
-
def self.included(base)
|
7
|
-
base.extend ClassMethods
|
8
|
-
end
|
9
|
-
|
10
|
-
module ClassMethods
|
11
|
-
|
12
|
-
cattr_reader :default_locale_for_translations
|
13
|
-
|
14
|
-
def set_default_locale_for_translations(value)
|
15
|
-
@@default_locale_for_translations =
|
16
|
-
case value
|
17
|
-
when nil then nil
|
18
|
-
when Symbol, String then value.to_sym
|
19
|
-
else
|
20
|
-
raise(
|
21
|
-
Zigotos::Translatable::TranslationError,
|
22
|
-
"default_locale option must be either a String or a Symbol representing a method on this class (trying to set it to a #{value.class.name})"
|
23
|
-
)
|
24
|
-
end
|
25
|
-
|
26
|
-
include ZLocalize::Translatable::DefaultLocaleEvaluator::InstanceMethods
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
module InstanceMethods
|
31
|
-
|
32
|
-
def evaluate_default_locale_for_translations
|
33
|
-
unless self.class.default_locale_for_translations.blank?
|
34
|
-
self.send(self.class.default_locale_for_translations)
|
35
|
-
else
|
36
|
-
nil
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
end # module InstanceMethods
|
41
|
-
|
42
|
-
end # module DefaultLocaleEvaluator
|
43
|
-
end # module Translatable
|
44
|
-
end # module ZLocalize
|
@@ -1,73 +0,0 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
|
3
|
-
module ZLocalize
|
4
|
-
module Translatable #:nodoc:
|
5
|
-
|
6
|
-
module TranslatedAttributesSerializer #:nodoc:
|
7
|
-
|
8
|
-
def self.included(base)
|
9
|
-
base.extend(ClassMethods)
|
10
|
-
end
|
11
|
-
|
12
|
-
module ClassMethods
|
13
|
-
|
14
|
-
def serialize_translations(attribute_names,options = {})
|
15
|
-
|
16
|
-
serialize :translated_attributes, HashWithIndifferentAccess
|
17
|
-
|
18
|
-
set_default_locale_for_translations(options[:default_locale])
|
19
|
-
|
20
|
-
[attribute_names].flatten.each do |attr_name|
|
21
|
-
class_eval "def #{attr_name}(options = {})
|
22
|
-
read_translated_attribute('#{attr_name}',(options[:locale] || ZLocalize.locale).to_s, options[:fetch_default] == true)
|
23
|
-
end"
|
24
|
-
end
|
25
|
-
|
26
|
-
class_eval "after_initialize do
|
27
|
-
self.translated_attributes ||= HashWithIndifferentAccess.new
|
28
|
-
end
|
29
|
-
|
30
|
-
def translated_attributes=(value)
|
31
|
-
self.translations = value
|
32
|
-
end"
|
33
|
-
|
34
|
-
include ZLocalize::Translatable::TranslatedAttributesSerializer::InstanceMethods
|
35
|
-
end
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
module InstanceMethods
|
40
|
-
|
41
|
-
def read_translated_attribute(attr_name,locale,fetch_default = true)
|
42
|
-
s = self.translated_attributes[locale].try(:'[]',attr_name)
|
43
|
-
if s.blank? && fetch_default
|
44
|
-
unless (default_locale = evaluate_default_locale_for_translations).blank?
|
45
|
-
if default_locale.to_s != locale.to_s
|
46
|
-
return self.translated_attributes[default_locale].try(:'[]',attr_name)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
else
|
50
|
-
return s
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
alias :translate :read_translated_attribute
|
55
|
-
|
56
|
-
def translations
|
57
|
-
translated_attributes
|
58
|
-
end
|
59
|
-
|
60
|
-
def translations=(locales)
|
61
|
-
locales.each do |locale,terms|
|
62
|
-
self.translated_attributes[locale] ||= HashWithIndifferentAccess.new
|
63
|
-
terms.each do |name,value|
|
64
|
-
self.translated_attributes[locale][name] = value
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
end # module InstanceMethods
|
70
|
-
|
71
|
-
end # module TranslatedAttributesSerializer
|
72
|
-
end # module Translatable
|
73
|
-
end # module ZLocalize
|