i18n-verify 0.0.3 → 0.0.4
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.
- data/.gitignore +1 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +13 -0
- data/{LICENSE.txt → LICENSE} +0 -0
- data/{README.markdown → README.md} +7 -5
- data/Rakefile +31 -0
- data/i18n-verify.gemspec +31 -0
- data/lib/i18n-verify/railtie.rb +7 -0
- data/lib/i18n-verify/support.rb +109 -0
- data/lib/i18n-verify.rb +2 -0
- data/lib/tasks/verify.rake +6 -8
- metadata +16 -10
- data/lib/verify/railtie.rb +0 -9
- data/lib/verify.rb +0 -2
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
pkg
|
data/Gemfile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
gemspec
|
data/Gemfile.lock
ADDED
data/{LICENSE.txt → LICENSE}
RENAMED
File without changes
|
@@ -6,13 +6,15 @@ This is a set of tools that make your life easier if you have lots of translatio
|
|
6
6
|
Installation
|
7
7
|
============
|
8
8
|
|
9
|
-
|
9
|
+
To use the utils in Rails 2.x, add to your `environment.rb`:
|
10
10
|
|
11
|
-
|
11
|
+
config.gem "i18n-verify"
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
If using Rails 3.x, add to your Gemfile (perhaps in the :development group)
|
14
|
+
|
15
|
+
gem "i18n-verify"
|
16
|
+
|
17
|
+
and run 'bundle install'.
|
16
18
|
|
17
19
|
Usage
|
18
20
|
=====
|
data/Rakefile
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
begin
|
2
|
+
require "bundler"
|
3
|
+
Bundler.setup
|
4
|
+
rescue LoadError
|
5
|
+
$stderr.puts "You need to have Bundler installed to be able build this gem."
|
6
|
+
end
|
7
|
+
|
8
|
+
gemspec = eval(File.read(Dir["*.gemspec"].first))
|
9
|
+
|
10
|
+
|
11
|
+
desc "Validate the gemspec"
|
12
|
+
task :gemspec do
|
13
|
+
gemspec.validate
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "Build gem locally"
|
17
|
+
task :build => :gemspec do
|
18
|
+
system "gem build #{gemspec.name}.gemspec"
|
19
|
+
FileUtils.mkdir_p "pkg"
|
20
|
+
FileUtils.mv "#{gemspec.name}-#{gemspec.version}.gem", "pkg"
|
21
|
+
end
|
22
|
+
|
23
|
+
desc "Install gem locally"
|
24
|
+
task :install => :build do
|
25
|
+
system "gem install pkg/#{gemspec.name}-#{gemspec.version}"
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "Clean automatically generated files"
|
29
|
+
task :clean do
|
30
|
+
FileUtils.rm_rf "pkg"
|
31
|
+
end
|
data/i18n-verify.gemspec
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# coding: UTF-8
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = "i18n-verify"
|
5
|
+
s.homepage = "http://github.com/fastcatch/i18n-verify"
|
6
|
+
s.version = "0.0.4"
|
7
|
+
s.platform = Gem::Platform::RUBY
|
8
|
+
s.summary = %Q{Tools to verify your Ruby on Rails localizations}
|
9
|
+
s.description = %Q{It helps you find keys, undefined translations, duplicate keys, and more}
|
10
|
+
s.email = "axz10@cwru.edu"
|
11
|
+
s.authors = ["fastcatch"]
|
12
|
+
# s.rubyforge_project = s.name
|
13
|
+
|
14
|
+
# s.required_rubygems_version = ">= 1.3.6"
|
15
|
+
|
16
|
+
# If you have runtime dependencies, add them here
|
17
|
+
# s.add_runtime_dependency "other", "~> 1.2"
|
18
|
+
|
19
|
+
# If you have development dependencies, add them here
|
20
|
+
# s.add_development_dependency "another", "= 0.9"
|
21
|
+
|
22
|
+
# The list of files to be contained in the gem
|
23
|
+
s.files = `git ls-files`.split("\n")
|
24
|
+
# s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
|
25
|
+
# s.extensions = `git ls-files ext/extconf.rb`.split("\n")
|
26
|
+
|
27
|
+
s.require_path = 'lib'
|
28
|
+
|
29
|
+
# For C extensions
|
30
|
+
# s.extensions = "ext/extconf.rb"
|
31
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
module I18nVerify
|
2
|
+
class Checker
|
3
|
+
def initialize(filenames)
|
4
|
+
@translations = load_files(filenames)
|
5
|
+
end
|
6
|
+
|
7
|
+
def find_key(regexp=Regexp.new(''), group_by_filename=false)
|
8
|
+
# select translations with matching keys
|
9
|
+
matching_translations = @translations.select {|t| [t[:locale],t[:key]].join('.') =~ regexp}
|
10
|
+
|
11
|
+
# print matching translations
|
12
|
+
if group_by_filename
|
13
|
+
matching_translations.group_by {|t| t[:filename]}.each_pair do |filename, translations|
|
14
|
+
puts "#{filename}:"
|
15
|
+
translations.each do |t|
|
16
|
+
puts " #{[t[:locale],t[:key]].join('.')}: #{t[:translation]}\n"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
else
|
20
|
+
matching_translations.each do |t|
|
21
|
+
puts "#{t[:filename]} # #{[t[:locale],t[:key]].join('.')}: #{t[:translation]}\n"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def is_complete?(locales_requested = [])
|
27
|
+
# check each pair of locales
|
28
|
+
# if the first one has keys the second one doesn't => these are the incomplete translations
|
29
|
+
locales = @translations.collect{|tr| tr[:locale]}.uniq
|
30
|
+
locales_to_check = locales_requested.empty? ? locales : (locales & locales_requested)
|
31
|
+
|
32
|
+
if locales_to_check.size <= 1
|
33
|
+
puts "Need at least two locales; found #{locales_to_check.size}: #{locales_to_check.join(',')}"
|
34
|
+
else
|
35
|
+
puts "Checking locales #{locales_to_check.inspect} out of #{locales.inspect} for completeness"
|
36
|
+
locales_to_check.permutation.each do |first, second|
|
37
|
+
first_translations = @translations.select {|translation| translation[:locale] == first}
|
38
|
+
second_translations = @translations.select {|translation| translation[:locale] == second}
|
39
|
+
|
40
|
+
differences = first_translations.select {|f| f if second_translations.none? {|s| f[:key]==s[:key]} }.compact
|
41
|
+
if differences.empty?
|
42
|
+
puts "#{first} => #{second}: complete\n"
|
43
|
+
else
|
44
|
+
puts "Missing from #{second} vs. #{first}:\n"
|
45
|
+
differences.each do |difference|
|
46
|
+
puts " " + [difference[:locale], difference[:key]].join('.') + " defined for #{first} in #{difference[:filename]}\n"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def duplicates(locales_requested = [])
|
54
|
+
locales = @translations.collect{|tr| tr[:locale]}.uniq
|
55
|
+
locales_to_check = locales_requested.empty? ? locales : (locales & locales_requested)
|
56
|
+
|
57
|
+
puts "Checking locales #{locales_to_check.inspect} out of #{locales.inspect} for redundancy"
|
58
|
+
|
59
|
+
# collect and print duplicate translations
|
60
|
+
locales_to_check.each do |locale|
|
61
|
+
puts "#{locale}:"
|
62
|
+
translations_by_key = @translations.select {|t| t[:locale] == locale}.uniq.group_by {|t| t[:key]}
|
63
|
+
translations_by_key.reject {|t| t[1].count == 1}.each_pair do |key, translations|
|
64
|
+
puts " #{key}: #{translations.collect{|t| t[:filename]}.join(", ")}"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
protected
|
70
|
+
# convert translations hash to flat keys
|
71
|
+
# i.e. from { :de => {:new => neue, :old => alt} } to [ ['de.new', 'neue'], ['de.old', 'alte'] ]
|
72
|
+
# and yields a flat key and the value to the block
|
73
|
+
def flatten_keys(hash, prev_key=nil, &block)
|
74
|
+
hash.each_pair do |key, value|
|
75
|
+
curr_key = [prev_key, key].compact.join('.')
|
76
|
+
if value.is_a?(Hash)
|
77
|
+
flatten_keys(value, curr_key, &block)
|
78
|
+
else
|
79
|
+
yield curr_key, value
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# read files and store translations (similar to i18n's internals but include filenames)
|
85
|
+
def load_files(filenames)
|
86
|
+
translations = []
|
87
|
+
filenames.each do |filename|
|
88
|
+
# puts "Loading: #{filename}"
|
89
|
+
type = File.extname(filename).tr('.', '').downcase.to_sym
|
90
|
+
case type
|
91
|
+
when :rb
|
92
|
+
data = eval IO.read(filename) # , binding, filename)
|
93
|
+
when :yml
|
94
|
+
data = YAML.load_file(filename)
|
95
|
+
else
|
96
|
+
raise I18n::UnknownFileType.new(type, filename)
|
97
|
+
end
|
98
|
+
raise I18n::InvalidLocaleData.new(filename) unless data.is_a?(Hash)
|
99
|
+
data.each_pair do |locale, d|
|
100
|
+
flatten_keys(d || {}) do |flat_key, translation|
|
101
|
+
translations.push({ :filename => filename, :locale => locale.to_s, :key => flat_key, :translation => translation })
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
translations
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
end
|
data/lib/i18n-verify.rb
ADDED
data/lib/tasks/verify.rake
CHANGED
@@ -16,7 +16,7 @@ namespace :i18n do
|
|
16
16
|
require "#{::Rails.root.to_s}/config/environment.rb"
|
17
17
|
regexp = Regexp.new(args[:regexp] || "")
|
18
18
|
group_by_filename = args[:group_by_filename]
|
19
|
-
checker = I18nVerify
|
19
|
+
checker = I18nVerify::Checker.new(I18n.config.load_path)
|
20
20
|
checker.find_key(regexp,group_by_filename)
|
21
21
|
end
|
22
22
|
|
@@ -34,9 +34,8 @@ namespace :i18n do
|
|
34
34
|
desc "Checks if translations are complete or there are missing ones"
|
35
35
|
task :is_complete do |t, args|
|
36
36
|
require "#{::Rails.root.to_s}/config/environment.rb"
|
37
|
-
|
38
|
-
|
39
|
-
checker = I18nVerify:Checker.new(I18n.config.load_path)
|
37
|
+
locales_requested = (ENV['locales'] || "").downcase.split(',')
|
38
|
+
checker = I18nVerify::Checker.new(I18n.config.load_path)
|
40
39
|
checker.is_complete?(locales_requested)
|
41
40
|
end
|
42
41
|
|
@@ -53,10 +52,9 @@ namespace :i18n do
|
|
53
52
|
desc "Checks if any keys are translated multiple times"
|
54
53
|
task :duplicates do |t, args|
|
55
54
|
require "#{::Rails.root.to_s}/config/environment.rb"
|
56
|
-
|
57
|
-
|
58
|
-
checker
|
59
|
-
checker.duplicates?(locales_requested)
|
55
|
+
locales_requested = (ENV['locales'] || "").downcase.split(',')
|
56
|
+
checker = I18nVerify::Checker.new(I18n.config.load_path)
|
57
|
+
checker.duplicates(locales_requested)
|
60
58
|
end
|
61
59
|
|
62
60
|
=begin
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: i18n-verify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 4
|
10
|
+
version: 0.0.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- fastcatch
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-07-
|
18
|
+
date: 2011-07-19 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -28,15 +28,21 @@ extensions: []
|
|
28
28
|
extra_rdoc_files: []
|
29
29
|
|
30
30
|
files:
|
31
|
+
- .gitignore
|
32
|
+
- Gemfile
|
33
|
+
- Gemfile.lock
|
34
|
+
- LICENSE
|
35
|
+
- README.md
|
36
|
+
- Rakefile
|
37
|
+
- i18n-verify.gemspec
|
38
|
+
- lib/i18n-verify.rb
|
39
|
+
- lib/i18n-verify/railtie.rb
|
40
|
+
- lib/i18n-verify/support.rb
|
31
41
|
- lib/tasks/verify.rake
|
32
|
-
- lib/verify/railtie.rb
|
33
|
-
- lib/verify.rb
|
34
|
-
- LICENSE.txt
|
35
|
-
- README.markdown
|
36
42
|
has_rdoc: true
|
37
43
|
homepage: http://github.com/fastcatch/i18n-verify
|
38
|
-
licenses:
|
39
|
-
|
44
|
+
licenses: []
|
45
|
+
|
40
46
|
post_install_message:
|
41
47
|
rdoc_options: []
|
42
48
|
|
data/lib/verify/railtie.rb
DELETED
data/lib/verify.rb
DELETED