##// END OF EJS Templates
Adds tasks for locales maintenance....
Jean-Philippe Lang -
r4817:f27637b07c4f
parent child
Show More
@@ -1,89 +1,116
1 desc 'Updates and checks locales against en.yml'
2 task :locales do
3 %w(locales:update locales:check_interpolation).collect do |task|
4 Rake::Task[task].invoke
5 end
6 end
7
1 namespace :locales do
8 namespace :locales do
2 desc 'Updates language files based on en.yml content (only works for new top level keys).'
9 desc 'Updates language files based on en.yml content (only works for new top level keys).'
3 task :update do
10 task :update do
4 dir = ENV['DIR'] || './config/locales'
11 dir = ENV['DIR'] || './config/locales'
5
12
6 en_strings = YAML.load(File.read(File.join(dir,'en.yml')))['en']
13 en_strings = YAML.load(File.read(File.join(dir,'en.yml')))['en']
7
14
8 files = Dir.glob(File.join(dir,'*.{yaml,yml}'))
15 files = Dir.glob(File.join(dir,'*.{yaml,yml}'))
9 files.each do |file|
16 files.each do |file|
10 puts "Updating file #{file}"
17 puts "Updating file #{file}"
11 file_strings = YAML.load(File.read(file))
18 file_strings = YAML.load(File.read(file))
12 file_strings = file_strings[file_strings.keys.first]
19 file_strings = file_strings[file_strings.keys.first]
13
20
14 missing_keys = en_strings.keys - file_strings.keys
21 missing_keys = en_strings.keys - file_strings.keys
15 next if missing_keys.empty?
22 next if missing_keys.empty?
16
23
17 puts "==> Missing #{missing_keys.size} keys (#{missing_keys.join(', ')})"
24 puts "==> Missing #{missing_keys.size} keys (#{missing_keys.join(', ')})"
18 lang = File.open(file, 'a')
25 lang = File.open(file, 'a')
19
26
20 missing_keys.each do |key|
27 missing_keys.each do |key|
21 {key => en_strings[key]}.to_yaml.each_line do |line|
28 {key => en_strings[key]}.to_yaml.each_line do |line|
22 next if line =~ /^---/ || line.empty?
29 next if line =~ /^---/ || line.empty?
23 puts " #{line}"
30 puts " #{line}"
24 lang << " #{line}"
31 lang << " #{line}"
25 end
32 end
26 end
33 end
27
34
28 lang.close
35 lang.close
29 end
36 end
30 end
37 end
38
39 desc 'Checks interpolation arguments in locals against en.yml'
40 task :check_interpolation do
41 dir = ENV['DIR'] || './config/locales'
42 en_strings = YAML.load(File.read(File.join(dir,'en.yml')))['en']
43 files = Dir.glob(File.join(dir,'*.{yaml,yml}'))
44 files.each do |file|
45 file_strings = YAML.load(File.read(file))
46 file_strings = file_strings[file_strings.keys.first]
47
48 file_strings.each do |key, string|
49 next unless string.is_a?(String)
50 string.scan /%\{\w+\}/ do |match|
51 unless en_strings[key].nil? || en_strings[key].include?(match)
52 puts "#{file}: #{key} uses #{match} not found in en.yml"
53 end
54 end
55 end
56 end
57 end
31
58
32 desc <<-END_DESC
59 desc <<-END_DESC
33 Removes a translation string from all locale file (only works for top-level childless non-multiline keys, probably doesn\'t work on windows).
60 Removes a translation string from all locale file (only works for top-level childless non-multiline keys, probably doesn\'t work on windows).
34
61
35 Options:
62 Options:
36 key=key_1,key_2 Comma-separated list of keys to delete
63 key=key_1,key_2 Comma-separated list of keys to delete
37 skip=en,de Comma-separated list of locale files to ignore (filename without extension)
64 skip=en,de Comma-separated list of locale files to ignore (filename without extension)
38 END_DESC
65 END_DESC
39
66
40 task :remove_key do
67 task :remove_key do
41 dir = ENV['DIR'] || './config/locales'
68 dir = ENV['DIR'] || './config/locales'
42 files = Dir.glob(File.join(dir,'*.yml'))
69 files = Dir.glob(File.join(dir,'*.yml'))
43 skips = ENV['skip'] ? Regexp.union(ENV['skip'].split(',')) : nil
70 skips = ENV['skip'] ? Regexp.union(ENV['skip'].split(',')) : nil
44 deletes = ENV['key'] ? Regexp.union(ENV['key'].split(',')) : nil
71 deletes = ENV['key'] ? Regexp.union(ENV['key'].split(',')) : nil
45 # Ignore multiline keys (begin with | or >) and keys with children (nothing meaningful after :)
72 # Ignore multiline keys (begin with | or >) and keys with children (nothing meaningful after :)
46 delete_regex = /\A #{deletes}: +[^\|>\s#].*\z/
73 delete_regex = /\A #{deletes}: +[^\|>\s#].*\z/
47
74
48 files.each do |path|
75 files.each do |path|
49 # Skip certain locales
76 # Skip certain locales
50 (puts "Skipping #{path}"; next) if File.basename(path, ".yml") =~ skips
77 (puts "Skipping #{path}"; next) if File.basename(path, ".yml") =~ skips
51 puts "Deleting selected keys from #{path}"
78 puts "Deleting selected keys from #{path}"
52 orig_content = File.open(path, 'r') {|file| file.read}
79 orig_content = File.open(path, 'r') {|file| file.read}
53 File.open(path, 'w') {|file| orig_content.each_line {|line| file.puts line unless line.chomp =~ delete_regex}}
80 File.open(path, 'w') {|file| orig_content.each_line {|line| file.puts line unless line.chomp =~ delete_regex}}
54 end
81 end
55 end
82 end
56
83
57 desc <<-END_DESC
84 desc <<-END_DESC
58 Adds a new top-level translation string to all locale file (only works for childless keys, probably doesn\'t work on windows, doesn't check for duplicates).
85 Adds a new top-level translation string to all locale file (only works for childless keys, probably doesn\'t work on windows, doesn't check for duplicates).
59
86
60 Options:
87 Options:
61 key="some_key=foo"
88 key="some_key=foo"
62 key1="another_key=bar"
89 key1="another_key=bar"
63 key_fb="foo=bar" Keys to add in the form key=value, every option of the form key[,\\d,_*] will be recognised
90 key_fb="foo=bar" Keys to add in the form key=value, every option of the form key[,\\d,_*] will be recognised
64 skip=en,de Comma-separated list of locale files to ignore (filename without extension)
91 skip=en,de Comma-separated list of locale files to ignore (filename without extension)
65 END_DESC
92 END_DESC
66
93
67 task :add_key do
94 task :add_key do
68 dir = ENV['DIR'] || './config/locales'
95 dir = ENV['DIR'] || './config/locales'
69 files = Dir.glob(File.join(dir,'*.yml'))
96 files = Dir.glob(File.join(dir,'*.yml'))
70 skips = ENV['skip'] ? Regexp.union(ENV['skip'].split(',')) : nil
97 skips = ENV['skip'] ? Regexp.union(ENV['skip'].split(',')) : nil
71 keys_regex = /\Akey(\d+|_.+)?\z/
98 keys_regex = /\Akey(\d+|_.+)?\z/
72 adds = ENV.reject {|k,v| !(k =~ keys_regex)}.values.collect {|v| Array.new v.split("=",2)}
99 adds = ENV.reject {|k,v| !(k =~ keys_regex)}.values.collect {|v| Array.new v.split("=",2)}
73 key_list = adds.collect {|v| v[0]}.join(", ")
100 key_list = adds.collect {|v| v[0]}.join(", ")
74
101
75 files.each do |path|
102 files.each do |path|
76 # Skip certain locales
103 # Skip certain locales
77 (puts "Skipping #{path}"; next) if File.basename(path, ".yml") =~ skips
104 (puts "Skipping #{path}"; next) if File.basename(path, ".yml") =~ skips
78 # TODO: Check for dupliate/existing keys
105 # TODO: Check for dupliate/existing keys
79 puts "Adding #{key_list} to #{path}"
106 puts "Adding #{key_list} to #{path}"
80 File.open(path, 'a') do |file|
107 File.open(path, 'a') do |file|
81 adds.each do |kv|
108 adds.each do |kv|
82 Hash[*kv].to_yaml.each_line do |line|
109 Hash[*kv].to_yaml.each_line do |line|
83 file.puts " #{line}" unless (line =~ /^---/ || line.empty?)
110 file.puts " #{line}" unless (line =~ /^---/ || line.empty?)
84 end
111 end
85 end
112 end
86 end
113 end
87 end
114 end
88 end
115 end
89 end
116 end
General Comments 0
You need to be logged in to leave comments. Login now